Asus-RT-N15U命令注入漏洞复现

IoT 4个月前 admin
8 0 0


漏洞点


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服务了

Asus-RT-N15U命令注入漏洞复现在网络工具页面 有网络诊断功能 在方式一栏我们注意到Ping这个功能 0day大手子都知道 这个地方经常出命令执行的洞 于是我急切的在目标输入了127.0.0.1;ls

Asus-RT-N15U命令注入漏洞复现等了一会发现毛也没有

Asus-RT-N15U命令注入漏洞复现

思来想去 觉得事情没那么简单 于是准备将我输入的参数完整的传输链路梳理一遍

Asus-RT-N15U命令注入漏洞复现

我们访问的页面叫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

Asus-RT-N15U命令注入漏洞复现

在了解前端是如何构造参数之后 我们来抓包分析一下

Asus-RT-N15U命令注入漏洞复现

可以看到使用GET方法传参 我们输入的参数最终变成了名为SystemCmd

最后参数会被提交到web服务器中 这款路由器使用的是httpd服务

所以我们来分析一下参数发送后httpd程序是怎么处理的

Asus-RT-N15U命令注入漏洞复现先用file看看httpd的架构 是32位mips架构小端序 然后搬出美丽的ida小姐

Asus-RT-N15U命令注入漏洞复现

我们传入的参数名叫SysCmd 所以我一开始尝试用搜索字符串的方法搜索SysCmd虽然程序中有几处出现但是没有发现调用

Asus-RT-N15U命令注入漏洞复现

于是我换了种思路去定位 我去搜索system函数在哪被调用

但最终发现都不是实际处理参数输入的函数

Asus-RT-N15U命令注入漏洞复现

这时我就陷入了困惑中 直到一旁的轩尼诗道师傅告诉我可以用web界面的方式去搜 也就是字符串Ping

Asus-RT-N15U命令注入漏洞复现

但我去搜ping却没有定位到实际的函数 不知道是什么原因 但好在这除了ping功能外还有traceroute功能

Asus-RT-N15U命令注入漏洞复现最终通过搜索traceroute字符串定位到了最终的函数

Asus-RT-N15U命令注入漏洞复现但当我准备无脑F5的时候 ida报错了 无法反汇编 于是我又被困住了 我尝试用Ghidra看 但反汇编出来就是一坨 我只好向Windows红队大佬Aimiliya师傅求助 他跟我说只需将报错地址的转换为数据类型就行 (快捷键D)

Asus-RT-N15U命令注入漏洞复现

Asus-RT-N15U命令注入漏洞复现Asus-RT-N15U命令注入漏洞复现这样就可以愉快地看伪代码了

Asus-RT-N15U命令注入漏洞复现这个函数接收两个参数一个int类型一个FILE类型

Asus-RT-N15U命令注入漏洞复现

函数开始部分获取了两个 CGI 参数

分别获取 action_modecurrent_page 的 CGI 参数,如果未获取到,则设置为空字符串

Asus-RT-N15U命令注入漏洞复现

接下来,函数根据 cgi 的值进行不同的处理:

Asus-RT-N15U命令注入漏洞复现 如果 cgi 等于 "apply",则调用 sub_41E67C 函数并根据其返回值写入 "MODIFIEDn""NOT MODIFIEDn" 到文件 a2,并刷新缓冲区。然后获取 rc_service 的 CGI 参数,如果有值,则调用 notify_rc。最后,写入 "RUN SERVICEn" 并跳转到 LABEL_125

其中sub_41E67C函数的主要作用是遍历 router_defaultsrouter_state_defaults 中的每个参数,获取对应的 CGI 参数值,并将这些值设置到 NVRAM 中。在特定条件下(如修改了用户名或密码)会触发特定服务的重启,并在有参数修改时提交 NVRAM 的更改。

调用完sub_41E67C函数后会跳转到LABEL_125

但是我实际去往下分析的时候越分析越不对劲

Asus-RT-N15U命令注入漏洞复现正确的执行流程应该是向右走 但按照cgi的值为apply那应该向左执行

于是我再次往回查看cgi的值是如何获取的

直到我发现在第39行对cgi的定义 他定义了变量名为action_mode

而我一开始默认将cgi的值默认为apply 导致分析错误

Asus-RT-N15U命令注入漏洞复现
Asus-RT-N15U命令注入漏洞复现

所以这样也就解释的通了

所以最终我们在web传入的参数最终会进入到这个函数

Asus-RT-N15U命令注入漏洞复现在这我们可以看到我们从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 则会执行下面的代码

Asus-RT-N15U命令注入漏洞复现
图片.png

Asus-RT-N15U命令注入漏洞复现

所以此时v4=Main_Analysis_Content.asp v6=ping

满足if语句里的条件 接着会执行strncpy(&SystemCmd, v6, 0x80u);

就是将v6的值拷到&SystenCmd处

接着会跳转到LABEL_120处

Asus-RT-N15U命令注入漏洞复现websRedirect是一个用来重定向的函数

接着会跳转到0x420154

Asus-RT-N15U命令注入漏洞复现

0x420154只有一行汇编代码 就是跳转到$ra寄存器的值

我想这就是我前面搜索system函数无法定位的原因吧

Asus-RT-N15U命令注入漏洞复现

分析完全部执行流程后就开始尝试绕过了

前面过滤了&、;、%、|、n、r这些字符 但是未过滤完全 还是有特殊字符 可以绕过检测

例如`(反引号)

反引号用于执行命令并捕获其输出。命令替换的结果将替换为命令的输出结果。

Asus-RT-N15U命令注入漏洞复现

在开始尝试绕过之前 可以先开启telnet服务 方便我们查看是否成功绕过

接着 telnet 192.168.1.1 23

Asus-RT-N15U命令注入漏洞复现账号密码为初始化设置的

Asus-RT-N15U命令注入漏洞复现

反引号绕过 绕过命令echo PWNED_BY_Nop > /tmp/Nop

Asus-RT-N15U命令注入漏洞复现
Asus-RT-N15U命令注入漏洞复现

更多绕过方式可以参考

https://blog.csdn.net/L2329794714/article/details/123561984

最后想写一个exp但是怎么也打不通

于是只好暂时放弃


Asus-RT-N15U命令注入漏洞复现最后祝大家天天出0day

原文始发于微信公众号(ProtoWare安全实验室):Asus-RT-N15U命令注入漏洞复现

版权声明:admin 发表于 2024年7月24日 上午9:56。
转载请注明:Asus-RT-N15U命令注入漏洞复现 | CTF导航

相关文章