首先我们分析网上公开的exp确定漏洞相关组件及payload,之后通过IDA分析研究漏洞是如何触发的,最后在attifyos中进行模拟,验证漏洞。
本次实验的漏洞是某品牌路由器service.cgi远程命令执行漏洞。
Packet storm有exp:https://packetstormsecurity.com/files/145859/dlinkroutersservice-exec.txt
看看exp中的关键信息
大概知道需要访问service.cgi,post请求,payload中有event=checkfw%26
我们先试试看自己能否分析
解压压缩文件
提取得到固件根目录
进入提取的文件夹
看看引发漏洞的cgi文件,其位于htdocs下
是32位mips小端可执行文件
。
接下来使用IDA分析
在main函数中看到
如果main函数判断访问的时候service.cgi就调用servicecgi_main
跟进servicecgi_main
先看一下其交叉引用的图
大概知道漏洞产生的地方了,servicecgi_main-》lxmldbc_system->system
接着跟下去看看
看到其会先判断request method请求方法,处理get和post
但是可以看到其实都是走一样的路径
调用cgibin_parse_request
跟进cgibin_parse_request
会解析content_type,content_length,然后就是解析参数的工作,回到servicecgi_main
我们需要找到调用lxmldbc_system的,而上图中我们发现EVENT,SERVICE会调用
在前面xref from图中看到lxmldbc_sytem会调用system,跟进去看看调用system时有没有一些过滤等防护措施
注意到,lxmldbc_system调用system执行command时没有任何过滤,此处就是引发命令注入的漏洞所在
这样我们就知道如何利用了,在访问时加上EVENT,或者利用SERVICE(加上ACTION字段),然后使用一些常见的方法截断再加上我们的要执行的命令就可以了。注入命令后需要是“&”符号的urlencode编码(%26),因为&在http请求中是请求域分隔符,所以必须做编码转换。在其他分隔符使用时也可以进行urlencode编码
接下来进行复现
fat.py启动
一共会提示3次firmadyne的密码和1次oit的密码,遇到输入firmadyne的密码时候,我们输入firmadyne,遇到输入oit的密码时,我们输入attify123
看一下网卡,待会儿我们抓包时需要用到
接下来启动burp
java -jar /home/oit/tools/burpsuite_free_v1.7.23.jar
火狐访问fat.pyt给出的ip
默认命令为空,点击login即可进入
然后开始设置代理
来到burp
打开后先恢复初始设置,如图所示
在火狐处访问192.168.0.1/service.cgi?EVENT=test
此时burp抓到包后修改如图,下图是采用|进行截断
可以看到repeater返回了路径
再试试使用;截断,来执行ls命令
repeater返回了命令执行的结果
下图是使用urldencode编码来截断,%26为&
同样成功了
再试试换行符,其编码为%0a
同样是可以的
前面试的是event,而在ida分析中我们知道serivce也是可以的,接下来看看service的
也是同样的截断思路
在ida分析时我们说过get,post走的路径是一样的,所以这里尝试使用post
现在burp这里把get改为post
可以看到已经成为post了
然后使用event来利用
同样成功了
还可以尝试自己抓包看看,attifyos自带了wireshark
我这里直接给出一个已经抓好的
跟踪tcp流
可以看到返回的相应就是命令执行后的结果
。
参考:
https://www.cnvd.org.cn/flaw/show/CNVD-2018-01084
1.https://packetstormsecurity.com/files/145859/dlinkroutersservice-exec.txt