历史文章:
文章首发于公众号:焊死车门
一、固件下载地址:
由于贫穷没有买设备拆解,进行完整的研究。所以硬件部分还是以后学习在进行总结。虽然没有路由器可以拆解,但是设备的固件还是比较容易得到的。我们可以从官网下载不同型号路由器的固件升级包来进行漏洞研究。
D-LINK固件下载地址:ftp://ftp2.dlink.com/PRODUCTS/
其中包括绝大部分型号的固件,如果此地址没有想要下载的型号,也可以百度自行搜索。
路由优化大师:http://www.luyoudashi.com/roms/
网站中有不同品牌不同型号的路由器固件,省去找固件的时间。
如果想要研究的固件在这两个网站中没有,也可以去该品牌的官网进行下载。
二、漏洞复现:
D-Link系列网上公开的漏洞资料比较多,在初学时推荐从D-Link路由器漏洞开始学起。
1、D-Link DIR300 信息泄露复现
固件下载:
ftp://ftp2.dlink.com/PRODUCTS/DIR-300/REVA/DIR-300_REVA_FIRMWARE_v1.06B05_WW.zip
(1)固件解压
解压固件:
固件解压出来之后会有一个suashfs-root文件夹。
查看文件夹下的内容可以发现其中的文件和Linux系统是基本一致的。在路由器中bin、sbin和usr目录下的bin、sbin是存放路由器应用程序目录的。etc用来存放路由器配置文件。www、htdocs一般用来存放web文件。
(2)漏洞分析
进入www目录,信息泄露漏洞出现在/model/__show_info.php文件中。
已经禁止了$REQUIRE_FILE的参数为var/etc/httpasswd和var/etc/hnapassw,但是从根路径开始配置httpasswd的路径,就可以绕过这个过滤了。
Payload:Localhost.com/model/__show_info.php?REQUIRE_FILE=/var/etc/httpasswd
设置REQUIRE_FILE=/var/etc/httpasswd 成功绕过上面的 if判断,进行任意文件读取。
FOFA上搜索此型号路由器可以测试:
测试payload成功
2、D-Link DWR932B 硬编码漏洞
固件地址:
(1)固件解压
此固件以zip格式进行压缩打包,并经过加密,无法直接解压。
使用binwalk进行解包,生成_DWR-932_B1_FW v.02.02EU.zip.extracted文件夹。文件夹下存在40.zip包。
继续对40.zip解压,发现需要密码。
使用frackzip工具可以破解该zip密码,这里直接给出压缩包的密码:beUT9Z。获得解压后的文件夹与文件。
Yaffs2文件就是它的根文件系统,使用binwalk进行解压时发现无法提取出根文件系统。
提取后的文件夹中并非根文件系统,查阅资料后,了解到932b采用了yaffs的原生态压缩算法,需要使用工具unyaffs提取。
使用unyaffs进行解压。将镜像文件提取到yaffs2-root目录,获得完整的根文件系统。
(2)漏洞分析
文件分析方法是通过对根文件系统进行遍历,以此发现存在安全隐患的文件或配置信息,已知漏洞存在于inadyn-mt.conf文件中,通过遍历.conf文件找到位置。
在inadyn-mt.conf文件(用于dyndns客户端)中存储了路由器no-IP配置信息,其中包含了了用于访问网站https://www.no-ip.com的用户名和硬编码口令。
最后在复现一个工控固件的漏洞:
3、施耐德PLC以太网模块noe77101固件
最初分析的是根据此漏洞出的一道CTF题:2020工业信息安全技能大赛(ICSC)石家庄站——简单的固件逆向分析(CTFHUB中已收录)。
后来找到此型号的固件进行分析。下载地址:
(1)固件解压
拿到固件之后,打开zip格式的固件压缩包,得到FLASH0文件夹和commandList.lst文件。
FLASH0文件夹目录如下:
在FLASH0/wwwroot/conf/exec目录下发现NOE77101.bin文件。使用binwalk对此文件进行解压分析。
提取文件后,得到217和217.zlib两个文件。使用binwalk的-A参数分析217,可以看到此固件使用的是PowerPC架构。
(2)修复函数名
将217文件放入IDA中进行分析,处理器手动选择PowerPC big endian(PPC),固件地址填写0x10000(固件常见加载地址是0x10000)。
这时候发现IDA没有识别到函数。
在网上找到修复脚本,生成py文件放入IDA中:File–>Script file…
from idaapi import *
from idc import *
loadaddress = 0x10000
eaStart = 0x31eec4 + loadaddress
eaEnd = 0x348114 + loadaddress
ea = eaStart
eaEnd = eaEnd
while ea < eaEnd:
create_strlit(Dword(ea), BADADDR)
sName = get_strlit_contents(Dword(ea))
print sName
if sName:
eaFunc = Dword(ea + 4)
MakeName(eaFunc, sName)
MakeCode(eaFunc)
MakeFunction(eaFunc, BADADDR)
ea = ea + 16
修复后看到IDA识别了8879个函数,可以进行下一步分析。
(3)漏洞分析
寻找和用户相关的函数调用情况,搜索login、user等关键字,发现函数loginUserAdd
查看调用,发现有多个函数:usrAppInit、userSecurity、FTP_User_Add等。
分别查看以上函数,在usrAppInit函数中可以查到后门账户的调用。
在PowerPC中,lis(立即数载入并左移)和addi(立即数加法)的组合是最常见的赋值操作,ida pro的注释中给出了经过赋值之后的结果。以第一次调用为例,实际上是执行了loginUserAdd(0x22DB7C,0x22DB84),这两个内存地址在固件中的实际地址应是再减去固件的加载地址。
定位固件0x21DB7C(0x22DB7C-0x10000),发现ftp后门账号。
三、修复建议:
建议定期对路由器升级更新。
修复建议这里其实想了很多,这里主要复现的是家用的路由器,寻常百姓家基本都会用到。而且有很多家庭因为安全意识薄弱,安装好路由器后从未升级过,更别说使用默认口令或弱口令。还有些家庭很久之前买的路由器,一直使用到现在,型号可能都已经停产(我家最开始的路由器就是这样)。这种已经没有办法用升级来进行保护,那最起码还是要修改一下自己路由器的密码,定期检查家用路由器DNS地址是否被恶意篡改,尽可能保护自己的安全。
来源:freebuf.com 2021-05-29 23:52:29 by: hahali
请登录后发表评论
注册