学习二进制漏洞有一段时间了,一直学,一直复现,属实有点无聊,但实战挖系统漏洞或者虚拟化有点难度,于是就把目光放到了路由器,于是又学了一段时间的路由器漏洞挖掘基础,最终开始分析了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 经过上面两个判断,最终就可以运行了 后面登录,也是需要修改值才能登录成功,如果想要验证的漏洞的话,可以自己尝试一下
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课