0x01.漏洞原理
D-Link DIR-823G v1.02 B05及之前的版本存在命令注入漏洞,攻击者可以通过POST的方式往 /HNAP1发送精心构造的请求,执行任意的操作系统命令。
0x02.固件环境模拟
使用 firmadyne 对固件进行模拟
模拟成功,进行初始化配置
通过 web 成功访问
0x03.漏洞分析
从官网上下载 D-Link DIR-823G 的固件,先用 binwalk 查看固件的文件系统格式 squashfs 和 小端架构
使用 binwalk 对固件进行提取
得到以下文件
我们进行分析的就是 squashfs-root 文件夹,里面的是标准的 Linux目录结构, 可以确定这个固件基于 Linux 的。
查看 /etc/init.d/rcS 文件,可以确定路由器开启的服务,发现路由器开启了一个 goahead 服务
GoAhead WebServer,它是一个源码,免费、功能强大、可以在多个平台运行的嵌入式WebServer。
goahead的websUrlHandlerDefine函数允许用户自定义不同url的处理函数
根据不同的请求交给不同的函数进行处理,这些处理函数有统一的参数:
1 int (*fn)(webs_t wp, char_t *url, char_t *path, char_t *query)
2 wp Web server connection handle.
3 url Request URL.
4 path Request path portion of the URL.
5 query Query string portion of the URL.
使用 grep 命令查找 goahead 的二进制程序
1.clb@clb-virtual-machine:~/home/clb/1iot/D-Link/D-Link_DIR-823G/dir-823g-v1.0-b05/_DIR823G_V1.0.2B05_20181207.bin.extracted/squashfs-root$ grep -r "goahead"
2.Binary file bin/goahead matches、
3.Binary file bin/timelycheck matches
4.Binary file bin/mtn_upgrade matches
5.etc/init.d/rcS_GW:goahead &
6.etc/init.d/rcS:goahead &
使用 IDA 分析 /bin/goahead 二进制文件
通过关键字 HNAP1/goform/cgi-bin快速定位到关键位置。/HNAP1处理函数的逻辑函数位于 0x42383C 跟进函数
这里可以看出如果 url处理的是 /HNAP1的话会成功回显200确定建立连接
继续往下分析,我们会发现一个函数列表
在这里我们可以发现非常熟悉的 Login 那么我们可以知道,HNAP1 根据 url 调用的不同函数来进行匹配这个函数列表,最后进行执行。由于看汇编十分墨迹,这里我使用 ghidra 进行反汇编成类C的语言
这里可以看到FUN_0040b1f4根据不同的 url 调用不同的函数进行处理,这里对应就是上面 IDA 最开始进行分析的图片
这里我们追踪 FUN_0042383c
在这里我们发现逻辑和 IDA 分析的第二个图片吻合。往下分析
这里 &PTR_s_SetMultipleActions_0058c560对应不同的函数列表
这里我们发现如果函数列表中的函数与请求的字符串相同时,会往下执行,并且调用了snprintf通过 echo的方式往 /var/hnaplog中写入了数据 param_7, param_7对应的就是 post传入的数据
post的数据要加上引号,因为echo ‘%s’ > /var/hnaplog中本身带了单引号,如果只是echo 0431lab,相当于
echo '`echo 0431lab`' > /var/hnaplog
·由于命令由引号括起,会当做字符串处理,不会执行命令
·如果使用' 进行闭合的话,post中的两个引号分别与自带的两个引号组合,反引号没有嵌套在单引号中,会当做命令执行
这个时候可以通过 post进行提交请求,也可以通过 requests 进行发包
0x04.POC
执行POC脚本,通过 web 访问 test.txt 文件,发现文件已经写入,证明漏洞漏洞执行成功
0x05.采坑
1.firmadyne 在ubuntu 64位下装不上,在32位才能装上,装了好久 ……
0x06. 参考
1.https://xz.aliyun.com/t/5705#toc-4