首页
社区
课程
招聘
某达路由器测试
2022-4-27 17:57 28399

某达路由器测试

2022-4-27 17:57
28399

分析这款是某某路由器A1206,固件是比较早的未加密的那个。

 

都是些个人学习过程中的思考与知识,整理下来。

 

固件在这:https://p1yang.github.io/2022/04/22/iot/

前期准备

都是些老生常谈的东西可以跳过。

 

这里使用的qemu-user,方便

 

至于分析的文件在下面思路中会聊到,这里环境模拟启动的是/bin/httpd 文件

 

复现环境是qemu+ghidra(反编译伪代码,我个人比较习惯ghidra的伪代码)+ida7.5(动态调试)

 

binwalk解包,文件格式,qemu-user模式启动等这些就不赘述,主要说几个环境模拟时的几个小问题。

问题1

image-20220422093901642

 

第一次运行时爆出这个错误停止。string大法发现在main中

 

image-20220422094037256

 

apmib_init函数从flash中读取mib值到RAM中,像这种模拟是办不到的东西,直接patch代码或更改寄存器值来绕过(尝试了下没办法直接patch代码,可以试试patch机器码,比较麻烦,我就直接改寄存器了)

 

在mips的判断是bne,btgz等,将断点下在他们上,他们通常依靠v0寄存器的值来做判断。

 

image-20220422094858896

 

此时v0值为0,改为1跳过

 

image-20220422095038420

问题2

这里陷入个死循环,问题点在

 

image-20220422101918935

 

image-20220422102003495

 

也尝试更改寄存器v0的值成功绕过。

问题3

image-20220422095242595

 

继续string大法

 

image-20220422095310053

 

抱歉这里我并没有查到这个函数的是干什么的,有清楚的请告诉我,提前感谢。

 

不影响,改寄存器大法。

 

image-20220422095958809

问题4

上面没问题之后发现ip开在255.255.255.255上。

 

image-20220422102645100

 

string大法搜 listen ip

 

image-20220422103034994

 

inet_ntoa函数的意思是,功能是将网络地址转换成“.”点隔的字符串格式。

 

所以跟sockaddr.sin_port有关,查看引用

 

image-20220422103359077

 

inte_addr 功能是将一个点分十进制的IP转换成一个长整型数(u_long类型)等同于inet_addr()。

 

与host有关,再向前查看

 

image-20220422103859404

 

其参数为全局变量 g_lan_ip。设置个lanip

sudo tunctl -t br0 -u ‘用户名’

sudo ifconfig br0 192.168.5.1/24

 

ps eth1就是第二块网卡第一块通常是eth0 tap是虚拟网络接口 br是网桥

 

这个设置完之后问题2直接解决了。

 

image-20220422110341615

 

image-20220422110418896

分析思路

分析其使用的web服务器,常见的嵌入式有以下几种:httpd,uhttpd,gohead,lighttpd,boa

 

还有其他的,我没咋见过,就不写了,用到的话自行查阅(懒!)

 

我分析这款使用的是httpd,在bin目录下,一般服务器文件都在一下几个目录,不排除其他目录

1
2
3
4
5
/user/bin/
 
/user/sbin/
 
/bin/

在逆向分析httpd时,尽量关注一些自定义功能代码,main下调用的initwebs函数中,配置了前端访问方式

 

image-20220422112301584

 

可以看到默认页面main,

 

image-20220422112355613

 

websSetPassword设置访问口令,不多说各位调试的时候可以关注一下。

 

websUrlHandlerDefine需要关注,这个函数的意思是什么样的url交给谁处理。

 

上面说了尽量关注一些自定义功能代码

 

这里的自定义功能代码就在formDefineTendDa

 

image-20220422113423088

 

上面这些都是通过goform来处理的,所以其访问形式为 http://127.0.0.1:80/goform/TendaGetLongString这样的

 

哪个路径就交由哪个函数来处理。

 

下面分析可以由两方面展开:

 

分析各个功能点

简单来说就是将所有接口的代码过一遍,去分析参数从哪里来,有没有经过什么危险函数

 

这种的话效率比较低,我个人推荐第二种

 

通过危险函数来查找可利用点,利用逆向分析工具的交叉编译功能查找

 

这里放一张危险函数表

 

dosystemcmd

 

system

 

根据上面的函数表来将危险函数过一下

 

下面是之前分析到的两个问题的思路,住这里不涉及exp,poc等脚本的编写,还是以思路为主。

命令执行

过一遍dosystemcmd函数

 

image-20220422141922087

 

可以看到有145次调用,感觉有漏洞的几率还是挺大的

 

注意点,尽量找form这类的函数,即上面说的自定义功能,有前后端交互

 

且危险函数的参数来自于前端参数

 

image-20220422142703774

 

websGetVar就是从wp中获取其第二个参数对应的值,如果没有该参数,值默认为第三个参数。

 

上面可以看到这里pcVar1未作任何处理直接拼接到参数中。

 

这里就产生了命令执行,不多做赘述,各位有兴趣可自行复现。

溢出

溢出是在strpintf函数的调用中发现的。

 

goform/NatStaticSetting路径访问到fromNatStaticSetting函数

 

img

 

sprintf函数将page的参数给拼接到字符串中,未做长度校验,导致溢出

 

img

 

复现过程:

 

断点到fromNatStaticSetting函数入口

 

img

 

将调用fromNatStaticSetting函数的返回地址放入0x407FFAE4 处

 

向下执行到第三个websGetVar函数获取page参数,然后向下执行sprintf函数,将page参数的内容拼接到gotopage内,由代码可知长度为256

 

参数初始化完毕后发现gotopage位置为0x407FF9E0

 

这里我们传入page参数为:

1
page=aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaacAAAA

执行完后

 

img

 

返回地址0x407FFAE4已经被AAAA覆盖。

 

上面是一些思路之类的东西,第一个命令执行晚了几天。


阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

最后于 2022-4-28 10:17 被p1yang编辑 ,原因:
收藏
点赞6
打赏
分享
打赏 + 50.00雪花
打赏次数 1 雪花 + 50.00
 
赞赏  Editor   +50.00 2022/05/26 恭喜您获得“雪花”奖励,安全圈有你而精彩!
最新回复 (10)
雪    币: 3451
活跃值: (6067)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
e*16 a 2 2022-4-28 15:25
2
1
我来啦,终于发文了
雪    币: 370
活跃值: (1634)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
p1yang 1 2022-4-28 15:44
3
1
e*16 a 我来啦,终于发文了
好哥哥,带带我
雪    币: 12132
活跃值: (15565)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2022-4-28 16:10
4
1
感谢分享,其实文中的问题可以靠买真实路由器设备解决,我就是75块钱入了一个二手的tenda AC15
雪    币: 370
活跃值: (1634)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
p1yang 1 2022-4-29 22:28
5
0
pureGavin 感谢分享,其实文中的问题可以靠买真实路由器设备解决,我就是75块钱入了一个二手的tenda AC15
节省成本,穷
雪    币: 12132
活跃值: (15565)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
pureGavin 2 2022-4-30 23:32
6
0
p1yang 节省成本,穷[em_13]
IOT这东西本来就是需要搞不少设备的,我已经自己自费买了不少设备了,杜邦线啥的都还好,就是路由器那种的比较贵,淦……
雪    币: 220
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
我是EP 2022-5-5 01:02
7
0
没记错的话,connectcfm是在libcfm.so里面实现的
雪    币: 370
活跃值: (1634)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
p1yang 1 2022-5-5 09:12
8
0
我是EP 没记错的话,connectcfm是在libcfm.so里面实现的[em_88]
我去查一下,谢谢哥哥!!!
雪    币: 242
活跃值: (250)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_没有彩虹的阳光 2022-5-8 23:26
9
0
大佬,我刚来,最上方的固件地址404了
雪    币: 370
活跃值: (1634)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
p1yang 1 2022-5-9 11:04
10
0
wx_没有彩虹的阳光 大佬,我刚来,最上方的固件地址404了
放错了,你用这个,https://gitee.com/p1piyang/backward-analysis
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_htwtewjt 2022-9-27 21:16
11
0

师傅,按照你的方法我web起来后还是有问题

一直是Unsupported setsocket 

最后于 2022-9-27 21:17 被mb_htwtewjt编辑 ,原因:
游客
登录 | 注册 方可回帖
返回