登录后更精彩...O(∩_∩)O...
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 mind 于 2021-11-22 23:13 编辑
在进行IoT设备漏洞挖掘时,获取固件十分重要,可以通过对固件进行逆向分析,掌握设备内部的运行逻辑,达到灰盒甚至白盒测试的效果。随着IoT厂商对安全的重视,很多设备的固件开始加密,由于IoT设备的算力有限,所以常见的加密方式为,使用硬编码的对称加密方式,例如AES、DES之类的,还可以基于硬编码的字符串进行一些数据计算,然后作为解密密钥。对于这种加密方式,可以在老版本固件或直接从存储芯片中读取的固件中寻找加解密算法和密钥,对加密的固件进行解密。 加密固件的识别
对于正常的固件,可以看到CPU架构,入口点等信息。
加密的固件
file无法获取更多的信息,且提示已被加密。 - binwalk
binwalk作为固件解包的神器,同样可以用来判别固件是否加密。
正常的固件:
未加密的固件可以通过binwalk查看压缩方式和数据范围等。
加密的固件
只提示为data,具体的压缩方式无法得知。
还有一种方式就是查看固件的熵值。熵值是用来衡量不确定性,熵值越大则说明固件越有可能被加密或者压缩了。这个地方说的是被加密或者压缩了,被压缩的情况也是会让熵值变高或者接近1的,如下是使用binwalk-E查看一个未加密固件(RAX200)和加密固件(DIR 3040)。可以看到,RAX200和DIR 3040相对比,不像后者那样直接全部是接近1了。
固件解密前面也提到,IoT设备本身算力有限,即使对固件进行加密,其加密算法也不会太复杂,通常也会把密钥硬编码在固件里,想要得到密钥,首先要得到未加密的固件,有以下两种方式:
1、获取老版本未加密固件。可以从设备官网下载,也可以抓包获取OTA链接,然后再根据版本信息拼老版本固件的下载链接等。
2、直接从设备中读取。运行在设备上的固件是已经解密的,可以通过串口、调试接口等读取固件,也可以直接从存储芯片读取。
以上面提到的第一个加密固件为例,这里利用uboot中的md命令读取内存的方式从设备中读取未加密固件,具体过程就不再赘述,这种文章有很多。 得到固件后,binwalk -Me解包,得到完整的文件系统。
通过file知道固件的加密方式为openssl enc'd data with salted password,可以在文件系统中查找关键字openssl
发现其中有一行特别像解密的方式
我们定位到这个文件,查看详细内容
整体逻辑确实是固件升级校验的过程,为了确认,尝试回溯调用逻辑。
发现在多个.lua脚本中均调用了该脚本。
这样基本可以确定check_ready.sh为升级包校验的脚本,可以使用该脚本中的密钥进行解密。
后面就跟正常的固件一样了,一次解包。 总结这个是一个比较简单的例子,密钥硬编码,一句命令就能解开,有些需要逆向可执行文件,然后写脚本才可以解密,思路是相通的,后面有时间再写一篇。 参考链接
|