USG310_4.70_固件解密分析
USG310_4.70_固件解密分析
0x01 前言
关于Zyxel 固件的解密和提取的分析,最近的这篇文章给了我一个很好的idea,感兴趣的可以去看一下。
文章连接:https://security.humanativaspa.it/zyxel-firmware-extraction-and-password-analysis/
对固件进行漏洞挖掘的第一步,就是从固件中提取我们需要的一些文件和组件,从而进行漏洞分析,但是如果解开固件包的过程中,显示固件已被加密,并且无法确定如何进行解密,那么是特别难受的。从一些常见的固件解密的方式来看,有的固件是压缩的时候进行加密的,那么解密程序或者生成解密密钥的二进制文件有可能会存在和固件包一起的打包出来,那么可以根据确定一些与解密有关的关键信息,和逆向加密算法对加密方式进行对应的破解,但是,i am lazy :) 。 所以通过收集固件的信息,了解其中的加密的一些命令和方式,比如zyxel固件解密所描述,根据一些特殊的组件猜测其解密的方式,尝试去解密固件,虽然这个过程也很艰难,但相对去逆向晦涩难懂的加密算法而言,难度就小很多了。
另外也可以根据linux中常见的解密工具,比如unzip 来确定固件中的解密方式,如下图所示的这个案例,通过检索unzip信息,获取到了解密的方式和解密密钥。
接下来我来讲述一下关于Zyxel 固件的另一种固件解密的idea, 虽然在固件解密这一块,也并不怎么擅长,但仍希望能给大家带来不一样的想法。
0x02 固件解包 1
固件版本:USG310 4.70
固件下载连接: https://firmware.cdn.cloud.zyxel.com/firmware/AAPJ/4.72(AAPJ.0)/firmware.zip
固件指令架构: ELF 32-bit MSB executable, MIPS, N32 MIPS64 rel2 version 1 (SYSV), statically linked, stripped
这里我使用的是 firmware_USG310_4.70(APPJ.0) 固件包, 下载下来之后,这是一个zip 压缩的压缩文件,解压之后的目录如下所示
后的目录如下所示
我们要解开的固件是 470AAPJ0C0.bin , 使用zip 查看 470AAPJ0C0.bin。
同时使用zip 解压提取固件包的时候,显示是需要密码的。
但是在 db\etc\zyxel\ftp\conf\目录中,看到了system-defalut.conf 文件,这个文件的大小为 72871和 470AAJ0C0.conf 文件 (72870) 的大小只相差1字节。
如此的巧合让我猜测这两个文件应该是同一个文件,我尝试使用pkcrack 明文攻击来破解,很遗憾,并没有达到我要的破解效果,甚至我在 470AAJ0C0.conf 文件中增加了一个字节,让这两个文件的大小相同,同样没有达到效果。
于是根据https://security.humanativaspa.it/zyxel-firmware-extraction-and-password-analysis/,我使用binwalk 解开470AAJ0C0.ri 文件。
接着使用binwalk 解开 _470AAPJ0C0 文件中的240 文件。
1 |
|
解开240 如下的文件目录包含一下内容,我看到了db.zip。 这让我联想到了 “firmware_USG310_4.70_2\470AAPJ0C0.bin\db\etc\zyxel\ftp\conf" 目录中的system-defalut.conf 文件
于是使用unzip解开db.zip 文件,很幸运,这个zip 并没有同 470AAPJ0C0.bin 一样被加密。
可以看到里面有一个 system-default.conf 文件,可以看到这个文件的大小和名称和前面看到的一样大。我认为这个文件和”firmware_USG310_4.70_2\470AAPJ0C0.bin\db\etc\zyxel\ftp\conf" 目录中的system-defalut.conf 文件是同一个文件。这样我又可以使用 pkcrack 进行破解了。
在使用pkcrack 明文攻击进行破解之前,简单的描述一下pkcrack 的攻击原理。
0x03 pkcrack 明文攻击
明文攻击
该攻击是已知的纯文本攻击,这意味着您必须知道部分加密数据才能破解密码。
比如:加密压缩包中有10张图片,其中1张图片你有未加密的源文件。
常用工具: ARCHPR 4.53、pkcrack
原理:明文攻击是一种较为高效的攻击手段,大致原理是当你不知道一个zip的密码,但是你有zip中的一个已知文件(文件大小要大于12Byte)或者已经通过其他手段知道zip加密文件中的某些内容时,因为同一个zip压缩包里的所有文件都是使用同一个加密密钥来加密的,所以可以用已知文件来找加密密钥,利用密钥来解锁其他加密文件
速度:非常快
pkcark 进行明文破解
使用pkcrack进行明文破解需要注意一点:压缩包中可能包含多个加密文件,但我们只要持有其中一个文件即可,该文件必须和压缩包中的某个文件一模一样。在破解前,需要先把明文文件进行压缩。如果使用zip命令直接压缩可能会出现压缩率的问题。windows下可以使用7-zip一类的桌面应用进行压缩。使用7-zip进行压缩时,会有一个压缩率的选项,可以调整word size的大小,如果这个压缩率和加密文件的压缩率不匹配,破解时可能会出现文件长度不匹配问题
查看压缩率可以借助 zipdetails、360压缩、7zip等查看。
https://github.com/keyunluo/pkcrack
pkcrack 破解需要两个文件
- 需要解密的ZIP文件
- 另一个zip文件,其中至少包含未加密的加密存档红的一个文件。必须使用与加密文件相同的压缩方法压缩该文件。
pkcrack -C encrypted-ZIP -c ciphertextname -P plaintext-ZIP -p plaintextname -d decrypted_file -a
encrypted-ZIP:是加密的ZIP归档文件的名称(和路径)
ciphertextname:是存档中文件的名称,对于该文件,您具有-纯文本
plaintext-ZIP:是包含压缩明文的ZIP归档文件的名称(和路径)
plaintextname:是归档文件中包含已知明文的文件名
unlocked_file:是解密档案将被写入的文件的名称
示例
demo
├── demo.zip # encrypted-ZIP
├── pkcrack
├── pkcrack.exe
├── README.txt # plaintext
└── README.zip # plaintext-ZIP
用shell 命令用于破解
../bin/pkcrack -C demo.zip -c README.txt -P README.zip -p README.txt -d cracked.zip -a
0x04 固件解包2
使用pkcrack 解开固件
1 |
|
成功解开zip 文件。其实为什么470AAJ0C0.conf 文件不能爆破,我解开之后,大概的看了一下system-default.conf文件,这两个文件的内容是大概是一模一样的,没仔细找,那多出的一个字节是啥。
0x05 提取文件系统
查看compress.img 的文件格式,可以看到这是Squashfs
解开之后整个文件目录结构
1 |
|
0x06 zld_fsextract 解开固件
关于 zld_fsextract 的讲解,原文讲的很详细了,这里就复现一下
https://security.humanativaspa.it/zyxel-firmware-extraction-and-password-analysis/
1 |
|
主要是查看这一句,密钥有一部分我就不公布了。
1 |
|
最终用整个密钥也可以解开470AAPJ0C0.bin
0x07 总结
这个固件解密的方式主要用的方式pkcrack,利用的就是一个未加密的conf文件,进行解密,总的来说,在分析加密固件的时候,应该对那些伴随加密固件一起发布出来的其他文件进行详细的信息收集,以便了解更多与固件相关的信息,另外,加密固件在更新到设备上的时候,是需要解密后提取文件系统才能使用的,如果设备上原本是没有密钥或者生成密钥的算法,那么解密的密钥或者解密的方式大概率会和加密固件一起发布出来。