一款路由器安全测试
2022-5-26 18:4:18 Author: mp.weixin.qq.com(查看原文) 阅读量:15 收藏


本文为看雪论坛优秀文章
看雪论坛作者ID:p1yang

分析这款是某某路由器A1206,固件是比较早的未加密的那个。都是个人学习过程中的思考与知识,整理下来。
 
固件在这:https://p1yang.github.io/2022/04/22/iot/


前期准备

都是些老生常谈的东西可以跳过。这里使用的qemu-user,比较方便。
 
至于分析的文件在下面思路中会聊到,这里环境模拟启动的是/bin/httpd 文件。
 
复现环境是qemu+ghidra(反编译伪代码,我个人比较习惯ghidra的伪代码)+ida7.5(动态调试)。
 
binwalk解包,文件格式,qemu-user模式启动等这些就不赘述,主要说几个环境模拟时的几个小问题。

问题1

 
第一次运行时爆出这个错误停止。string大法发现在main中。
 
 
apmib_init函数从flash中读取mib值到RAM中,像这种模拟是办不到的东西,直接patch代码或更改寄存器值来绕过(尝试了下没办法直接patch代码,可以试试patch机器码,比较麻烦,我就直接改寄存器了)
 
在mips的判断是bne,btgz等,将断点下在他们上,他们通常依靠v0寄存器的值来做判断。
 
 
此时v0值为0,改为1跳过。
 

问题2

这里陷入个死循环,问题点在:
 
 
 
也尝试更改寄存器v0的值成功绕过。

问题3

 
继续string大法:
 
 
抱歉这里我并没有查到这个函数的是干什么的,有清楚的请告诉我,提前感谢。不影响,改寄存器大法。
 

问题4

上面没问题之后发现ip开在255.255.255.255上。
 
string大法搜 listen ip:
 
 
inet_ntoa函数的意思是,功能是将网络地址转换成“.”点隔的字符串格式。
 
所以跟sockaddr.sin_port有关,查看引用:
 
 
inte_addr 功能是将一个点分十进制的IP转换成一个长整型数(u_long类型)等同于inet_addr()。
 
与host有关,再向前查看:
 
其参数为全局变量 g_lan_ip。设置个lanip
sudo tunctl -t br0 -u ‘用户名’
sudo ifconfig br0 192.168.5.1/24
 
ps eth1就是第二块网卡第一块通常是eth0 tap是虚拟网络接口 br是网桥。
 
这个设置完之后问题2直接解决了。
 
 


分析思路

分析其使用的web服务器,常见的嵌入式有以下几种:httpd,uhttpd,gohead,lighttpd,boa。
 
还有其他的,我没怎么见过就不写了,用到的话自行查阅。
 
我分析这款使用的是httpd,在bin目录下,一般服务器文件都在一下几个目录,不排除其他目录。
/user/bin/ /user/sbin/ /bin/
在逆向分析httpd时,尽量关注一些自定义功能代码,main下调用的initwebs函数中,配置了前端访问方式。
 
 
可以看到默认页面main。
 
 
websSetPassword设置访问口令,不多说各位调试的时候可以关注一下。
 
websUrlHandlerDefine需要关注,这个函数的意思是什么样的url交给谁处理。
 
上面说了尽量关注一些自定义功能代码,这里的自定义功能代码就在formDefineTendDa中。
 
 
上面这些都是通过goform来处理的,所以其访问形式为http://127.0.0.1:80/goform/TendaGetLongString这样的,哪个路径就交由哪个函数来处理。
 
下面分析可以由两方面展开:
 
分析各个功能点:
简单来说就是将所有接口的代码过一遍,去分析参数从哪里来,有没有经过什么危险函数
 
这种的话效率比较低,我个人推荐第二种。通过危险函数来查找可利用点,利用逆向分析工具的交叉编译功能查找。
 
这里放一张危险函数表
 
dosystemcmd
 
system
 
根据上面的函数表来将危险函数过一下。
 
下面是之前分析到的两个问题的思路,住这里不涉及exp,poc等脚本的编写,还是以思路为主。

命令执行

过一遍dosystemcmd函数:
 
 
可以看到有145次调用,感觉有漏洞的几率还是挺大的。注意点,尽量找form这类的函数,即上面说的自定义功能,有前后端交互。
 
且危险函数的参数来自于前端参数:
 
websGetVar就是从wp中获取其第二个参数对应的值,如果没有该参数,值默认为第三个参数。
 
上面可以看到这里pcVar1未作任何处理直接拼接到参数中。这里就产生了命令执行,不多做赘述,各位有兴趣可自行复现。

溢出

溢出是在strpintf函数的调用中发现的。
 
goform/NatStaticSetting路径访问到fromNatStaticSetting函数:
 
 
sprintf函数将page的参数给拼接到字符串中,未做长度校验,导致溢出。
 
 
复现过程:断点到fromNatStaticSetting函数入口
 
 
将调用fromNatStaticSetting函数的返回地址放入0x407FFAE4 处。
 
向下执行到第三个websGetVar函数获取page参数,然后向下执行sprintf函数,将page参数的内容拼接到gotopage内,由代码可知长度为256
 
参数初始化完毕后发现gotopage位置为0x407FF9E0
 
这里我们传入page参数为:
page=aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaacAAAA
执行完后:
 
 
返回地址0x407FFAE4已经被AAAA覆盖。上面是一些思路之类的东西,第一个命令执行晚了几天。

看雪ID:p1yang

https://bbs.pediy.com/user-home-934060.htm

*本文由看雪论坛 p1yang 原创,转载请注明来自看雪社区

# 往期推荐

1.一道pwn题目2e4zu的深入分析

2.CNVD-2018-01084 漏洞复现报告(service.cgi 远程命令执行漏洞)

3.Fuzz学习记录

4.从零开始复现 DIR-815 栈溢出漏洞

5.Typora解密之跳动的二进制

6.海莲花glitch样本去混淆

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458449216&idx=1&sn=a421b57f273645895537bcd6ec3a7912&chksm=b18fc5ca86f84cdc7f446a1d0dd1d12ff69e670f1331e07db6d0fea823c16edadb0f3eebb15c#rd
如有侵权请联系:admin#unsafe.sh