施耐德后门
IOT
时隔不知道多久,我终于又发博了。自从换了域名忘了做重定向,google就把我的博当抄袭网站处理了,都没时间去搞,再不发博可能更进不了google的索引了,: )。
打算发一个IOT的博文(后面还有两个学着跟的CVE可以发一下)后面再发一个区块链隐蔽通信或者木马的,当然我最爱的二进制!只能寒假学啦呜呜呜。
施耐德后门
赛博地球的杯的题,参考了一下wp。
首先拿到固件NOE77101.bin,首先使用binwalk分析文件
发现为zlib类型,如上图所示。
使用binwalk –e NOE77101.bin指令提取zlib压缩的文件,解压后的文件385存储在_NOE77101.bin.extracted目录中。
使用Binwalk对385文件进行分析
从上图我们可以得到的有效信息为该固件的操作系统版本是VxWorks 2.5,符号表的偏移地址为0x301E74,是大端模式。
使用Binwalk - A命令来获取目标固件的CPU架构等信息,该信息有助于选择正确的反汇编引擎。
如上图所示目标固件的CPU架构为PowerPC big endian。
将385文件拖入IDA静态分析。
在Processor type这一项设置为PPC大端模式。
我们在程序某处发现这样一条指令
Lis在PPC指令集中是相对寻址指令,而源操作数后有@ha这样的特点,查询资料后,我们可以确定基址为0x10000。
在IDA中设置基址地址为0x10000,可识别函数明显增多。
那么下一步我们要进行的是函数名修复,因为我们在之前已经得到符号表的地址了。 利用idapython,修复函数名。脚本如下。
1 | # -*- coding: UTF-8 -*- |
值得注意的是,我们可以用010Editor打开385,分析其符号表。
VxWorks系列的字节排序有独特的格式,以16个字节为一组数据,前4个字节是函数名的内存地址,后4个字节是函数的内存位置,然后以另4个特征字节数据+4个字节0x00结尾。所以脚本里我们做的其实就是取前4个字节是函数名字符串,给后4个字节函数的内存位置重命名。 “运行修复脚本后函数名如下。
那么其实根据函数名我们大概就能推断相关功能了。
我们跟随固件服务加载过程,查看其初始化过程,可以跟踪到一个叫做usrAppInit的函数,发现大量的loginUserAddd调用。同时可以发现多个后门账号,如下图所示。
可以发现,其账号是明文,而密码是经过loginDefualtEncrypt函数加密后的密文形式。那么,我们既可以点进loginDefualtEncrypt函数逆向分析加密过程,也可以在VxWorksk开发手册上查询vxencrypt加密算法。得到其加密算法如下:
1 | int enc(char* in, char* out) |
仔细分析此加密算法,我们可以发现其弱点。它是通过一个passwdInt整数来作为中间值。而我们不难发现,passwdInt的0,1,2,3,4,5,6,7,8,9都是一一对应的相应字符Q,R,S,b,c,d,e,y,z,9。那么我们便能轻松地从密文反推出中间值passwdInt。而passwdInt作为一个整数长度有限,我们便能轻松暴力破解得出明文了。注:很好理解的是,会有多个明文得到的密文是相同的。就好比哈希碰撞一样。
代码如下:
1 |
|
得到的结果如下图
我们选取123Txx~做为明文去验证。为了验证我们的加密程序是否正确,我们同时带入网上别人碰撞出的明文进行检验。
所以证明碰撞出的明文是正确的,可以得到目标哈希值