NOE77101固件后门漏洞分析

NOE77101固件后门漏洞分析

固件获取

最近学习vxworks固件的分析,尝试对noe77101固件的经典后门漏洞进行分析,就好比学习msf时练习经典的ms08-067一样。noe77101固件的下载地址在此。

拿到固件之后,unzip noe77101_OS.bin_.zip解压固件,得到FLASH0文件夹和一个commandList.lst文件,FLASH0的文件目录如下:tree

flash0/wwwroot/conf/exec/目录下找到了NOE77101.bin文件,这应该就是我们要分析的目标了。

使用binwalk对.bin文件进行分析,binwalk NOE77101.bin,结果如图所示binwalk77101

使用binwalk提取NOE77101.bin中的文件,binwalk -e NOE77101.bin,得到217和217.zlib两个文件。使用binwalk分析217,binwalk 217,分析结果如图,可以看到此固件使用vxworks内核,binwalk还在固件中识别出了符号表。binwalk217

固件分析

现在需要确定固件的cpu架构、大小端格式和固件加载地址,才能使用ida pro进行反汇编。

使用binwalk的-A参数分析217文件,binwalk -A 217,结果如图所示,可知固件使用PowerPC架构,大端格式。(7.24更新:使用binwalk -Y更加方便)binwalka217

接下来还要确定固件的加载地址,vxworks固件的常见加载地址是0x10000,但最好还是验证一下。strings 217搜索固件中的字符串,确定字符串表中的最后一个字符串应该是APP_STASTON_MODBUSstrings217

在010 Editor中搜索字符串APP_STASTON_MODBUS,可知字符串表中的最后一个字符串的地址为0x298BD8。010zifuchuanbiao

又因为字符串表中的最后一个字符串在符号表中第一个被引用,因此需要定位符号表的第一行,找到该字符串在内存中的地址。前文中已经使用binwalk发现符号表的位置,为0x31EED4。但是这个值不一定是准确的,还需要进一步验证。在010 Editor中定位0x31EED4位置附近,发现符号表真正的起始位置是0x31EEC4。fuhaobiaoneicundizhi

确定了APP_STASTON_MODBUS字符串在固件中的位置和在内存中的位置,就可以计算得到固件的加载地址了,确实是0x10000。pythonjisuanjiazaidizhi

函数名修复

现在可以使用ida pro加载217文件了,处理器选择PowerPC big endian(PPC),固件加载地址填写0x10000。ppc217loadaddress217

此时的ida pro并没有识别到函数。(mac版ida此时需要按c转为函数,windows的ida可以识别到少量函数)beforerepair

需要编写脚本修复函数名,但是目前只知道符号表的起始地址,并不知道结束地址。在010 Editor中按照符号表规律往下寻找结束地址,确定是0x348114。fuhaobiaojieshuweizhi

修复脚本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个函数,可以进行进一步的分析了。repaired

后门漏洞分析

查找后门漏洞的一个入手点就是寻找与用户相关的函数的调用情况,注意到函数loginUserAddloginuseradd

查看此函数的交叉引用情况,发现有三个函数对它进行了调用,分别是usrSecurityFTP_USER_ADDusrAppInituserxref1userxref2

分别查看以上三个函数,在usrAppInit中发现疑似添加登录用户的操作。在PowerPC中,lis(立即数载入并左移)和addi(立即数加法)的组合是最常见的赋值操作,ida pro的注释中给出了经过赋值之后的结果。以第一次调用为例,实际上是执行了loginUserAdd(0x22DB7C,0x22DB84),这两个内存地址在固件中的实际地址应是再减去固件的加载地址。userappinit

在010 Editor中定位固件的0x21DB7C(0x22DB7C-0x10000),发现此处的字符串出多次出现“user”字样,由此更加验证了前面的操作是添加多个后门账号。confirm

posted @ 2019-07-23 14:09  燕麦粥  阅读(1602)  评论(0编辑  收藏  举报