本文为看雪论坛优秀文章
看雪论坛作者ID:混子1
学习二进制漏洞有一段时间了,一直学,一直复现,属实有点无聊,但实战挖系统漏洞或者虚拟化有点难度,于是就把目光放到了路由器,于是又学了一段时间的路由器漏洞挖掘基础,最终开始分析了D-Link路由器。首先我们去cve-list可以看下历史漏洞,可以看到最近分析DIR-816型号的有点多,那我们也来分析它,但分析之前可以查一下该型号的版本,如果发现A2_v1.10CNB04(简称“B04”)还有更高版本,那尽可能分析更高版本,说不定可以捡漏,在查找版本时,发现它有B05,我选择B05分析。
固件下载和binwalk解压我就跳过了,解压后查看rcS文件,发现启动了telnetd和goahead服务,由于不太清楚goahead服务是什么,于是百度了下,发现是嵌入式web服务器。于是从web服务入手,用IDA打开goahead。
命令注入
根据cve-list发现在B04的web服务接口setSysAdm存在命令注入,于是我定位B05的setSysAdm接口。
doSystem函数是对system函数的二次封装,根据函数可以发现会执行var、v2和v4,这三个参数,但v2变量不可控,所以没办法利用,var和v4分别是admuser和admpass的值,可以利用。栈溢出漏洞
根据cve-list发现在B04的web服务接口form2IPQoSTcAdd存在栈溢出,于是我定位B05的form2IPQoSTcAdd接口。
发现只要v10不为0,进去后都会执行sprintf函数,造成栈溢出,而v10值取决于ip_ctl_carrules初始化成功与否,一般情况下肯定成功,所以一定会造成栈溢出。前面都属于捡漏,下面可以利用IDA查找strcpy,sprintf等危险函数的使用,这里就不过多叙述这种方法了,在浏览cve-list发现了B04的web服务接口form2Wan.cgi存在栈溢出,当wantype为3时,l2tp_usrname会被base64解密,结果存入v94,不检查l2tp_usrname的大小,导致栈溢出。由于该溢出和解密有关,所以我就比较好奇了,查看了B05对应接口。
有点出入,但出入不大,websDecode64应该是解密函数,第二个参数是l2tp_usrname值,第三个参数是l2tp_usrname的长度,所以第一个参数应该是存储解密后的内容,进一步查看websDecode64函数,发现是base64解密,并且对长度没有限制。这个函数也可以作为危险函数查找,最终提交了6个cve,捡漏两个,挖了四个。
用file命令查看goahead,可以看出是32位,小端存储,mips架构。
直接运行goahead程序会挂,因为没有相应的配置文件,我们可以尝试调试,先用IDA在主函数打断点。
根据汇编和反汇编代码,在各个if里面查看是否有return,在里面有return的if全部打断点,直到web服务启动前的所有if,然后f4,跳转下一断点,如果跳转下一断点,调试结束,说明上一个if,需要修改值,最终需要修改的就是91行的setdefault和126行v19。
经过上面两个判断,最终就可以运行了。
后面登录,也是需要修改值才能登录成功,如果想要验证的漏洞的话,可以自己尝试一下。看雪ID:混子1
https://bbs.pediy.com/user-home-964032.htm
*本文由看雪论坛 混子1 原创,转载请注明来自看雪社区
看雪2022KCTF秋季赛官网:https://ctf.pediy.com/game-team_list-18-29.htm
文章来源: https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458484349&idx=2&sn=c7f021fe2855aafda08aa8e84d521ac4&chksm=b18e4ef786f9c7e1cc0d8ddda584d964a1e445f35845a0b2e0d68290133fe47e7e6752eb31d1#rd
如有侵权请联系:admin#unsafe.sh