NOE77101固件后门漏洞分析
固件获取
最近学习vxworks固件的分析,尝试对noe77101固件的经典后门漏洞进行分析,就好比学习msf时练习经典的ms08-067一样。noe77101固件的下载地址在此。
拿到固件之后,unzip noe77101_OS.bin_.zip
解压固件,得到FLASH0文件夹和一个commandList.lst文件,FLASH0的文件目录如下:
在flash0/wwwroot/conf/exec/
目录下找到了NOE77101.bin文件,这应该就是我们要分析的目标了。
使用binwalk对.bin文件进行分析,binwalk NOE77101.bin
,结果如图所示
使用binwalk提取NOE77101.bin中的文件,binwalk -e NOE77101.bin
,得到217和217.zlib两个文件。使用binwalk分析217,binwalk 217
,分析结果如图,可以看到此固件使用vxworks内核,binwalk还在固件中识别出了符号表。
固件分析
现在需要确定固件的cpu架构、大小端格式和固件加载地址,才能使用ida pro进行反汇编。
使用binwalk的-A
参数分析217文件,binwalk -A 217
,结果如图所示,可知固件使用PowerPC架构,大端格式。(7.24更新:使用binwalk -Y更加方便)
接下来还要确定固件的加载地址,vxworks固件的常见加载地址是0x10000,但最好还是验证一下。strings 217
搜索固件中的字符串,确定字符串表中的最后一个字符串应该是APP_STASTON_MODBUS
。
在010 Editor中搜索字符串APP_STASTON_MODBUS
,可知字符串表中的最后一个字符串的地址为0x298BD8。
又因为字符串表中的最后一个字符串在符号表中第一个被引用,因此需要定位符号表的第一行,找到该字符串在内存中的地址。前文中已经使用binwalk发现符号表的位置,为0x31EED4。但是这个值不一定是准确的,还需要进一步验证。在010 Editor中定位0x31EED4位置附近,发现符号表真正的起始位置是0x31EEC4。
确定了APP_STASTON_MODBUS
字符串在固件中的位置和在内存中的位置,就可以计算得到固件的加载地址了,确实是0x10000。
函数名修复
现在可以使用ida pro加载217文件了,处理器选择PowerPC big endian(PPC),固件加载地址填写0x10000。
此时的ida pro并没有识别到函数。(mac版ida此时需要按c转为函数,windows的ida可以识别到少量函数)
需要编写脚本修复函数名,但是目前只知道符号表的起始地址,并不知道结束地址。在010 Editor中按照符号表规律往下寻找结束地址,确定是0x348114。
修复脚本repair.py如下:
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 pro成功识别到了8873个函数,可以进行进一步的分析了。
后门漏洞分析
查找后门漏洞的一个入手点就是寻找与用户相关的函数的调用情况,注意到函数loginUserAdd
。
查看此函数的交叉引用情况,发现有三个函数对它进行了调用,分别是usrSecurity
、FTP_USER_ADD
和usrAppInit
。
分别查看以上三个函数,在usrAppInit
中发现疑似添加登录用户的操作。在PowerPC中,lis(立即数载入并左移)和addi(立即数加法)的组合是最常见的赋值操作,ida pro的注释中给出了经过赋值之后的结果。以第一次调用为例,实际上是执行了loginUserAdd(0x22DB7C,0x22DB84)
,这两个内存地址在固件中的实际地址应是再减去固件的加载地址。
在010 Editor中定位固件的0x21DB7C(0x22DB7C-0x10000),发现此处的字符串出多次出现“user”字样,由此更加验证了前面的操作是添加多个后门账号。