如何提取D-Link解密密钥
当我们在分析固件镜像时,遇到的最常见障碍之一便是加密。虽然已经有一些方法可用于解密固件镜像,但今天我们仍将简要介绍一下,如何提取D-Link部分路由器型号中的加密密钥,特别是D-LinkDIR-X。该设备与D-LinkDIR-X是同一代路由器的一部分,最近,针对该设备,德国流行技术杂志Chip和IoTInspector联合对其进行了Wi-Fi路由器相关的安全检查。
一、D-Link路由器固件加密
D-Link倾向于用自定义的固件更新文件格式,来加密他们的固件镜像。许多DIR系列的D-Link路由器,使用带有SHRS头的固件更新文件格式:
DCSHRS‘]‘`gis
这种固件格式及加密方案已经被公开记录。一位名叫0xricksanchez的研究者,发布了一篇非常棒的writeup,记录了如何发现SHRS固件镜像(包含DIR-,我们已经发布了一篇相关advisory)中密钥的过程。他们从imgdecrypt二进制文件中提取出了加密密钥和初始向量IV,此二进制文件可以通过类似系列型号中的URATshell获得。
然后,最近我们遇到了DIR-X系列的路由器,它们的固件头有一点不同。
e5fda
encrpted_img....
头部就是一个encrpted_img字符串,然后紧跟其后的是镜像大小字段(32位大端模式)。
SHRS固件镜像的key不适用于这些encrpted_img镜像,因此我们需要找到另一种方法,将解密密钥从这种加密格式的设备中提取出来。
二、密钥在哪里?
显然,我们无法从加密的固件镜像中提取加密密钥,因为它是加密的。所以,我们需要找到另一种方法来获取密钥key。
如果我们能够在设备上以某种方式执行代码,那么就很简单了。如有足够的本地权限,我们可以在设备运行时,访问设备上的所有内容。这是解密后的固件镜像。
如果设备制造商最近才引入固件加密,则可以追踪尚未加密的老版本固件镜像(很可能是引入加密之前的固件版本),并检查是否可以从中提取出密钥key。
直接读取设备的flash内存,是我们可以采用的另一种技术。在flash中固件不太可能被加密。拆开其中一个设备,卸掉flash内存芯片,转储内存后再读取文件系统。但是这样破坏性太太了,设备很昂贵,一旦损坏将大大浪费。
在这里,我们不会深入探讨这些问题,因为其他人已经做过了。关于这个问题ZeroDayInitiative有一篇详细的文章,当你在解决固件加密时,可以考虑这个方法。
三、Shell中的操作
在我们的例子中,通过UART调试接口可以轻松得到DIR-X设备的shell。获取到交互式shell后,就可以轻松dump出整个文件系统。使用内置的busyboxtar和nc命令可以很容易地做到这一点。首先在设备上设置监听器:
nc–nvlp[PORT]filesystem.tar.gz
然后在设备上运行以下指令,只写明想要传出的根目录即可。
tar-cvz/bin//data//etc//etc_ro//lib//libexec//mnt//opt//sbin//usr//var//webs/
nc[IPADDRESS][PORT]
最终,将得到tar.gz压缩文件,包含文件系统中任何你想要的部分,然后通过网络传输出来。
四、发现在何处解密
不同于“SHRS”固件镜像,没有明显的imgdecrypt二进制文件可供