DLINK路由器加密固件逆向分析
看雪论坛作者ID:八企鹅
简介
固件对比技术
产品的详细信息
在深入研究之前,让我们看一下设备的一些详细信息。
发行历史
可视化方法
二进制图像的熵分布将为我们提供二进制文件增量偏移的熵值。此信息将帮助您猜测二进制文件的哪个部分被加密/压缩以及哪个是代码。让我们看一下两个不同二进制版本的熵分布,一个是过渡加密的FW303WWb04_i4sa_middle 版本,另一个是加密的 3.15B02 版本。让我们来看看它们之间的区别。
文件系统分析
动态分析加密的二进制
// fw encimg
setattr("/runtime/tmpdevdata/image_sign" ,"get","cat /etc/config/image_sign");
$image_sign = query("/runtime/tmpdevdata/image_sign");
fwrite("a", $ShellPath, "encimg -d -i ".$fw_path." -s ".$image_sign." > /dev/console \n");
del("/runtime/tmpdevdata");
$ qemu-mips -L <rooth path of file system> ./usr/sbin/encimg
Usage: encimg {OPTIONS}
-h : show this message.
-v : Verbose mode.
-i {input image file} : input image file.
-o {output image file} : output image file.
-e : encode file.
-d : decode file.
-s : signature.$ qemu-mips -L <rooth path of file system> ./usr/sbin/encimg
qemu-mips -L . ./usr/sbin/encimg -d -i <path to encrypted firmware> -s wrgac43s_dlink.2015_dir822c1
您可以通过为 qemu 提供 -starce 参数来启用它,它将打印二进制文件进行的所有系统调用,我在上述二进制文件上进行了尝试,并提取了一些有趣的日志,如下所示:
# Aahh.... a crypto library been loaded by the binary, it
# hints that it is using some sort of encryption algorithm possiblity AES
# or some symentic encryption algorithm as we have seen there already
# a password we provide to the binary.
open("/lib/libcrypto.so.0.9.8", O_RDONLY) = 3
...
...
...
# opening the file (return fd 3)
open("/home/payatu/test_1.bin", O_RDWR) = 3
stat("/home/payatu/test_1.bin", 0x7fffea90) = 0
write(1,0x7f689298,99)The file length of /project/dlink/AC1200/test_1.bin is 6865072
= 99
read(3,0x7fffeb50,4) = 4
# mmap fd 3
mmap(NULL,6865072,PROT_WRITE,MAP_SHARED,3,0) = 0x7ef51000
munmap(0x7ef51000,6865072) = 0
# again truncate operation on fd 3
ftruncate(3,6865044,0,0,0,0) = 0
# good bye fd 3
close(3) = 0
逆向加密方法
您可以在您喜欢的反汇编程序/反编译器工具中加载 encimg 二进制文件,以进行更深入的分析。我偶然发现了一个有趣的函数 main(0x401244),该方法解析参数,然后调用具有加密/解密所有核心功能的build(0x400d24)。
此外,二进制文件还进行了加密相关导入,其中一些功能是_AES_set_encryptkey,_AES_set_decryptkey 和 _AES_cbcencrypt ,这确认二进制文件正在使用 AES 加密算法,这意味着用于加密和解密文件的相同密钥。做一些简单研究,您可以了解到这些功能原型。以下是这些功能的简短说明。
// Same prototype for AES_set_encrypt_key
AES_set_decrypt_key (
// user input key
const unsigned char *userKey,
// size of key
const int bits,
// encryption key struct which will be used by
// encryption function
AES_KEY *key
)
AES_cbc_encrypt (
// input buffer
const unsigned char *in,
// output buffer
unsigned char *out,
// buffer length
size_t length,
// key struct return by previous function
const AES_KEY *key,
// initializatin vector
unsigned char *ivec,
// is encryption or decryption
const int enc
)
让我们看一下 bulid 函数的反编译代码。
从上面的代码可以看出,我们可以说二进制文件通过 mmap 函数映射到内存中。
然后通过基于参数调用 AES_set_encrypt_key / AES_set_decrypt_key来设置 AES_KEY 数据结构,并使用该结构通过 AES_cbc_encrypt 加密/解密有效负载,然后使用 munmap 函数调用将数据写回到文件中。这没有什么难度!
结果
一旦我们解密了固件。我们再来看一下解密后的固件的熵。
它看起来与我们之前看到的未加密固件非常相似。
枚举攻击面
1. 由于我们正在将二进制文件上传到操作系统服务(固件更新服务)以处理该文件。我们可以在文件解析中找到使用过的解密算法的 bugs ,并通过某种内存损坏问题来破坏服务流程,从而使我们可以访问系统。
2. 我们可以使用诸如固件 mod-kit 之类的固件修补工具来更改固件文件并重新打包,并使用相同的加密二进制文件对其进行加密并上传文件以进行更新。
如果没有完整性检查方法,则修补的固件将更新而不会出现任何问题。尽管使用了加密,但是恶意固件更新仍然是一个问题。固件签名机制用于克服这种攻击。
注意:由于项目时间和范围的限制,我尚未测试上述攻击。但是如果我是攻击者,我会尝试上述的攻击方法。
固件审核软件
使用十种不同的工具进行分析可能既耗时又容易出错,这反映了我们的日常工作流程,我们创建了一个工具来自动执行繁琐的固件分析工作,该产品称为Firmware Auditor ,社区版免费提供给任何人使用。
如您所见,我使用固件审核程序进行了上面的大多数分析。您可以在此链接上(https://expliot.io/pages/firmware-auditor)找到有关该产品的更多详细信息功能,并在同一页面上将您的反馈发送给我们。固件审核软件可用于:
1. 查看熵图
2. 探索 Linux 文件系统并下载所有内容(在我们的情况下为 enimg 二进制文件, PHP 文件)
3. build 函数的反编译代码
4. 以及点击获取更多信息
总结
我们看到了不同的方法来确定固件是否已加密,还看到了如何使用固件差异方法来找到要使用的解密方法,以及如何使用它并复制该方法到另一个固件。
我们还讨论了解密方法打开的一些攻击面。使用这种保护方案时,需要意识到这一点。
EXPLIoT.io
在 EXPLIoT.io,我们构建了用于物联网(IoT)基础架构和产品的安全测试的工具。
参考
看雪ID:八企鹅
https://bbs.pediy.com/user-890713.htm
*本文由看雪论坛 八企鹅 翻译, sudozhange 校对,来源自payuta's blog 转载请注明来自看雪社区。
推荐文章++++