漏洞点
Main_Analysis_Content.asp、HTTPD
漏洞成因
在httpd文件中对用户传入的参数中的特殊字符过滤不充分导致系统命令执行
固件解包
binwalk -Me FW_RT_N15U_30043763754.trx
固件模拟
sudo ./run.sh -d asus FW_RT_N15U_30043763754.trx
模拟成功后在浏览器输入192.168.1.1即可访问web界面
一开始需要进行一些初始化配置 包括登录用户名以及密码(要记住 后面登录要用)
配置完就可以访问完整的web服务了
在网络工具页面 有网络诊断功能 在方式一栏我们注意到Ping这个功能 0day大手子都知道 这个地方经常出命令执行的洞 于是我急切的在目标输入了127.0.0.1;ls
等了一会发现毛也没有
思来想去 觉得事情没那么简单 于是准备将我输入的参数完整的传输链路梳理一遍
我们访问的页面叫Main_Analysis_Content.asp 于是我去翻看Main_Analysis_Content.asp的源码 发现了有关参数传递的代码
第一行判断document.form.cmdMethod.value是否为ping
第二行判断document.form.pingCNT.value是否为空
若为空则将document.form.pingCNT.value赋值为5
接着就是将ping -c 与 document.form.pingCNT.value 拼接 再加上用户输入的ip
在了解前端是如何构造参数之后 我们来抓包分析一下
可以看到使用GET方法传参 我们输入的参数最终变成了名为SystemCmd
最后参数会被提交到web服务器中 这款路由器使用的是httpd服务
所以我们来分析一下参数发送后httpd程序是怎么处理的
先用file看看httpd的架构 是32位mips架构小端序 然后搬出美丽的ida小姐
我们传入的参数名叫SysCmd 所以我一开始尝试用搜索字符串的方法搜索SysCmd虽然程序中有几处出现但是没有发现调用
于是我换了种思路去定位 我去搜索system函数在哪被调用
但最终发现都不是实际处理参数输入的函数
这时我就陷入了困惑中 直到一旁的轩尼诗道师傅告诉我可以用web界面的方式去搜 也就是字符串Ping
但我去搜ping却没有定位到实际的函数 不知道是什么原因 但好在这除了ping功能外还有traceroute功能
最终通过搜索traceroute字符串定位到了最终的函数
但当我准备无脑F5的时候 ida报错了 无法反汇编 于是我又被困住了 我尝试用Ghidra看 但反汇编出来就是一坨 我只好向Windows红队大佬Aimiliya师傅求助 他跟我说只需将报错地址的转换为数据类型就行 (快捷键D)
这样就可以愉快地看伪代码了
这个函数接收两个参数一个int类型一个FILE类型
函数开始部分获取了两个 CGI 参数
分别获取 action_mode
和 current_page
的 CGI 参数,如果未获取到,则设置为空字符串
接下来,函数根据 cgi
的值进行不同的处理:
如果 cgi
等于 "apply"
,则调用 sub_41E67C
函数并根据其返回值写入 "MODIFIEDn"
或 "NOT MODIFIEDn"
到文件 a2
,并刷新缓冲区。然后获取 rc_service
的 CGI 参数,如果有值,则调用 notify_rc
。最后,写入 "RUN SERVICEn"
并跳转到 LABEL_125
其中sub_41E67C函数的主要作用是遍历 router_defaults
和 router_state_defaults
中的每个参数,获取对应的 CGI 参数值,并将这些值设置到 NVRAM 中。在特定条件下(如修改了用户名或密码)会触发特定服务的重启,并在有参数修改时提交 NVRAM 的更改。
调用完sub_41E67C函数后会跳转到LABEL_125
但是我实际去往下分析的时候越分析越不对劲
正确的执行流程应该是向右走 但按照cgi的值为apply那应该向左执行
于是我再次往回查看cgi的值是如何获取的
直到我发现在第39行对cgi的定义 他定义了变量名为action_mode
而我一开始默认将cgi的值默认为apply 导致分析错误
所以这样也就解释的通了
所以最终我们在web传入的参数最终会进入到这个函数
在这我们可以看到我们从web页面传入的名为SystemCmd参数被赋值给了v6
如果SystemCmd参数为空那就赋值为空
那在这SystemCmd参数为ping+-c+5+127.0.0.1
可以看到函数对我们输入的参数进行了不少的过滤 过滤了比如&、;、%、|、n、r
在73、74行会判断v4和v6的值 如果v4的值为Main_Analysis_Content.asp 或者 v4的值为Main_Analysis_Content.asp的同时v6=netstat 则会执行下面的代码
所以此时v4=Main_Analysis_Content.asp v6=ping
满足if语句里的条件 接着会执行strncpy(&SystemCmd, v6, 0x80u);
就是将v6的值拷到&SystenCmd处
接着会跳转到LABEL_120处
websRedirect是一个用来重定向的函数
接着会跳转到0x420154
0x420154只有一行汇编代码 就是跳转到$ra寄存器的值
我想这就是我前面搜索system函数无法定位的原因吧
分析完全部执行流程后就开始尝试绕过了
前面过滤了&、;、%、|、n、r这些字符 但是未过滤完全 还是有特殊字符 可以绕过检测
例如`(反引号)
反引号用于执行命令并捕获其输出。命令替换的结果将替换为命令的输出结果。
在开始尝试绕过之前 可以先开启telnet服务 方便我们查看是否成功绕过
接着 telnet 192.168.1.1 23
账号密码为初始化设置的
反引号绕过 绕过命令echo PWNED_BY_Nop > /tmp/Nop
更多绕过方式可以参考
https://blog.csdn.net/L2329794714/article/details/123561984
最后想写一个exp但是怎么也打不通
于是只好暂时放弃
最后祝大家天天出0day
原文始发于微信公众号(ProtoWare安全实验室):Asus-RT-N15U命令注入漏洞复现