工具
漏洞挖掘用到的工具:binwalk、firmwalker、IDA、burpsuit。
-
• Binwalk用于解包固件,如果使用Kali自带的binwalk很可能会造成有些未加密的固件,解包解不出来的问题;这时候你需要去进行完全安装binwalk。完全安装的方法可Google查找,有很多。 -
• firmwalker是用于帮你快速分析固件的一些信息;让你可以在短时间内了解一款固件的大致框架以及一些服务项;安装方法可自行Google,有很多教程。 -
• IDA用于分析固件的漏洞点;需要掌握IDA的一些基本使用。字符串查找、函数查找、交叉引用等。 -
• burpsuit主要是用于漏洞的验证工作。
挖掘流程
-
1. binwalk -eM 固件 --run-asroot -
2. Firmwalker 路径(/home/....../squashfs-root),定位处理文件。 -
3. 将处理web服务的二进制文件使用IDA反编译,进行审计。
3.1 看危险函数,例如system、memcpy、strcpy、strncpy等危险函数。3.2 根据危险函数,查找可能存在漏洞的接口;查看当中的参数是否可控。3.3 寻找前端传入的参数的接口,拼接命令或者长字符串导致溢出;将审计出的漏洞寻找设备进行复现。
Netis-WF2210型号路由器:审计过程(通过接口传入的参数,找到处理参数的函数)
fofa随便搜了一下,弱口令进了后台,看到了版本型号,每个模块功能都点了一下,看了数据包和接口之后,再去官网找固件,解包开始审计。拿到固件之后,对固件进行解包,解包之后,看以看到整个文件系统。接着使用Firmwalker对系统进行初步的一个信息收集。
使用firmwalker之后,生成一份信息清单。根据这份信息清单,就会对整个文件系统有个初步的了解。其实直接就能看到web的目录。
到web目录当中,结合站点页面进行分析,看到参数是从/cgi-bin-igd/netcore_set.cgi传入;然后用cgi-bin目录下的cgitest.cgi对传入的参数进行处理。将文件使用IDA打开,对文件进行反编译、审计。
根据数据包当中的参数dns_b,在IDA搜索字符串,然后找字符串被sub_403BDC这个函数引用。通过查找看到sub_403BDC这个函数对web传入的很多参数都进行了处理。
审计之后发现,sub_403BDC函数当中,location_time_enable、led_off_on_status、location_time,这三个参数从前端(netcore_set.cgi)传入,传入之后没有进行过滤等操作,通过sprintf函数进行格式化处理之后,直接使用system函数执行,导致了命令执行漏洞。
找到漏洞之后,直接找设备开始测试。弱口令登陆后台之后,开始检验成果。意外的是,直接能前台RCE,大概是因为固件比较老了,以前的校验不严格。
某型号路由器:审计过程(直接审计固件,找到存在漏洞的函数,然后再去找传入参数的接口。)
fofa随便搜了一下,弱口令进了后台,看到了版本型号,直接就去官网找固件,解包审计出漏洞之后,再去寻找接口复现漏洞。 使用binwalk -eM 123.bin --run-as=root解包,得到整个文件系统。firmwalk进行信息的收集处理,定位到处理web服务的文件,定位到文件为lighttpd在/usr/sbin/目录里面,拿到本地开始审计。不是所有的路由器都一样,需具体情况具体分析,firmwalk这款工具一般情况都能找到处理文件。
查找危险函数system,IDA交叉引用,查找存在漏洞的函数。搜索之后发现sub_456BCC函数存在RCE。前端传入的flag的值给到parm。判断parm是否等于cmd,parm的值等于cmd之后,前端会将传入的cmd的值给到V10,然后将V10的值通过sprintf函数进行格式化处理,并将格式化后的字符串通过system函数执行,最后构造命令达到RCE的效果;
确实找到了RCE的点,但是符号表被去掉了;无法直接判断出是从那个接口传进来的参数。这时候就需要去看函数当中的的关键词了。例如上述的关键词为“msp”,那么可以进行关键词查找,发现msp_info.htm,然后直接构造参数。直接就开始找设备测试。其实有时候实在是关键词找不到接口的时候,可以直接去rodata段寻找所有的接口名称,找个感觉差不多的试一下,大不了就都试完呗。
可以看到直接就RCE了。数据包当中存在cookie,显而易见,这个RCE是需要登录到后台才能触发的。算是有点鸡肋,不过不影响水漏洞,这款路由器还是有一定用户量的,所以不太方便说具体型号。
补充
这里再提及一下接口查找的问题。就使用登录的数据包为案例。下面是/login.cgi登录的数据包,那么如何根据这个数据包,去二进制文件当中寻找对应的处理函数呢?前提是定位到了处理web服务的文件,然后用关键字查找,例如登录数据包的关键字为“user”和“password”
IDA打开文件,使用shift+F12查看所有字符串,然后CTRL+F搜索password字符串;双击点进去。按X查找引用,再点进去。
然后就能找到带有password字符串的函数,F5一下,很明显sub_4445EC函数就是处理登录逻辑的函数,也就是数据包当中的login.cgi。
还有就是找不好处理web服务的文件的,你就去squashfs-root文件夹下面,grep -r “password” 这条命令能找到带有字符串password的二进制文件,找到文件之后,重复接口查找的方法判断一下,这样差不多就能找准web服务的处理文件。还有就是去Firmwalker收集的信息基本上也能判断。多实操、多看文章复现,其实有些东西看多了,操作多了自然而然就有经验了。逆向一半多都是靠猜,而这个“猜”就是从经验来的。
问题及解决
固件寻找以及固件版本问题?
有些固件因为地区问题或者别的稀奇古怪的问题,国内官网是找不到的;这时候就可以去Google搜索一下,找一找,大多数还是能找到的。还有就是不要太苛责固件版本,只要固件的大版本没什么问题,具体的小版本的差别不大就可以审计。审计之前可以找一找历史漏洞,这会对对审计有一定的帮助。
找不到固件对应的资产,又或者说找不到想要的固件?
直接fofa找到一款路由器之后,找弱口令进去。进去之后基本上都能直接看到具体的版本型号;或者进去之后去找数据包,有个数据包当中能看到具体的版本型号。知道具体的版本型号之后,去下载。下载下来解包开始实操。但是比较新的固件都是进行加密了的,需要去网上找一些开源的解密脚本,或者你自己去逆出来。
关于溢出漏洞的进一步利用?
溢出漏洞需要去启动虚拟环境qemu模拟固件或者买一台设备。然后去gdb --attach去调试,构造一个ROP链,达到RCE的效果。qemu环境我真没启动成功过;不知道是怎么回事。所以索性就放弃了启动环境模拟固件。遇到溢出漏洞一般验证一下就差不多了,无法进一步利用的溢出漏洞感觉等于DDOS。如果想进一步利用溢出漏洞的话,真得启动一个环境模拟固件,而且还需要去看一下PWN方面的知识。
感谢
在此感谢@99999九爷的深情陪伴、@cxaqhq师傅的IOT漏洞平台以及@Go1d0g悲伤番茄师傅的指点。 本人的经验大抵就这些了,确实有些捉襟见肘,见谅见谅。有误之处,还请指出。
原文链接
https://www.t00ls.com/articles-73007.html
原文始发于微信公众号(T00ls安全):路由器漏洞挖掘
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论