目录
-
-
-
- 0x01 漏洞回顾
- 0x02 固件下载及解包
- 0x03 漏洞分析
- 0x04 写在最后
-
-
0x01 漏洞回顾
漏洞描述:远程命令执行(Remote Code Execution)。
根据exploit-db显示,该漏洞是target_addr字段存在命令注入漏洞,漏洞poc传送门。
漏洞利用条件:需要身份认证。
该漏洞需要身份认证,部分设备的默认用户名/密码为:e8c/e8c。可利用此用户名密码成功登录设备。
漏洞影响:较大。
0x02 固件下载及解包
Netlink Gpon设备固件可以在官网下载到,传送门。
下载后,直接通过binwalk解包固件即可。
$ binwalk -Me HG323RW_UPGRADE_NETLINK_1.0.35-200817.tar
固件文件结构如下图所示(进查看三级目录结构)。
0x03 漏洞分析
- 根据Poc可知,漏洞发生在提交数据给
时候。因此,对固件中的/boaform/admin/formPing
/bin/boa
进行分析。
当然,也可以通过命令
来匹配看看哪个可执行文件匹配到,再简单分析一下,就可以确定要分析的目标程序。grep ‘boaform/admin’ ./* -r
$ sudo grep 'boaform/admin' ./* -r Binary file ./bin/boa matches ...
- 先查看
文件格式。可知,该可执行文件为MIPS架构,大端,32位。boa
- 用IDA打开
文件。注意,在处理器类型里边,选择好相匹配的内容。本次选择是“MIPS big endian”。boa
- 有了前期对poc的阅读,我们清楚地知道,本次漏洞是在对
提交非法参数引起。因此,我们可以直接打开字符串子窗口,搜索boaform/admin/formPing
。formPing
- 双击,可以在IDA View窗口看到该字符串所在的位置。接着,查看交叉引用, 跳转到引用该字符串的函数中。
-
阅读汇编代码,可知,获取参数的步骤大致如下:
加载“formPing”字符串,从客户端提交的参数中获得“target_addr”,保存在"0xA30+var_9FC"中(
),随后,获得"waninf"参数,保存在"0xA30+car_A00"中(sw $v0, 0xA30+var_9FC
sw 0xA30+var_A00($fp)
)。
0xA30+var_9FC —> target_addr;
0xA30+var_A00 —> waninf.
如果
等于0, 则跳转至waninf
,显然不会跳转过去。继续往下, 如果loc_4D6A4C
不为0,则跳转至target_addr
处。显而易见,此处会跳转分支。loc_4D6BD8
- 此处似乎是对“target_addr"长度做一个保存。继续跳转至
。loc_4D6D1C
- 此处,完成一些提示输出,继续跳转至
。loc_4D6FB8
- 此处进行了一个比较,随后跳转至
。loc_4D6FD8
- 此处进行一些与用户输入无关的操作,生成并保存一些变量,随后跳转至
。loc_4D7044
- 此处,先加载写在固件里的bash语句:
ping %s -c 4 -l %s -w 5 %s > /tmp/ping.tmp
。
随后依次将参数“target_addr”等压入栈空间,补全命令语句,最后调用
/bin/sh -c
执行刚刚补全的命令语句。
执行命令大致如下:
。/bin/sh -c 'ping target_addr -c 4 -l ...'
- 至此分析完毕。
0x04 写在最后
可分析可知,该漏洞形成的原因是:没有对用户输入的字符串进行过滤,接收到参数后,直接保存在内存中,最后在补全命令语句的过程中,直接从内存加载参数。
用户只需构造简单的语句(如添加
;
符号等)即可截断bash命令的前一部分,随后跟随任意命令即可达到任意命令执行,产生漏洞。
加载了恶意参数的最终执行命令如下:
/bin/sh -c 'ping ;/usr/bin/id; -c 4 -l ...'
备注:分析过程中,有些参数并非用户输入可控,乃是程序生成变量,因此未做深入分析。