如何提取D-Link解密密钥
如何提取D-Link解密密钥
当我们在分析固件镜像时,遇到的最常见障碍之一便是加密。虽然已经有一些方法可用于解密固件镜像,但今天我们仍将简要介绍一下,如何提取D-Link部分路由器型号中的加密密钥,特别是D-Link DIR-X1560。该设备与 D-Link DIR-X5460是同一代路由器的一部分,最近,针对该设备,德国流行技术杂志Chip和IoT Inspector联合对其进行了Wi-Fi路由器相关的安全检查。
一、D-Link路由器固件加密
D-Link倾向于用自定义的固件更新文件格式,来加密他们的固件镜像。许多DIR系列的D-Link路由器,使用带有SHRS头的固件更新文件格式:
00000000 53 48 52 53 01 13 91 5D 01 13 91 60 67 C6 69 73 SHRS‘]‘`gÆis
这种固件格式及加密方案已经被公开记录。一位名叫0xricksanchez 的研究者,发布了一篇非常棒的writeup,记录了如何发现SHRS固件镜像(包含DIR-3060,我们已经发布了一篇相关advisory)中密钥的过程。他们从imgdecrypt二进制文件中提取出了加密密钥和初始向量IV,此二进制文件可以通过类似系列型号中的URAT shell获得。
然后,最近我们遇到了DIR-X系列的路由器,它们的固件头有一点不同。
00000000 65 6e 63 72 70 74 65 64 5f 69 6d 67 02 0a 00 14 |encrpted_img....|
头部就是一个encrpted_img字符串,然后紧跟其后的是镜像大小字段(32位大端模式)。
SHRS固件镜像的key不适用于这些encrpted_img 镜像,因此我们需要找到另一种方法,将解密密钥从这种加密格式的设备中提取出来。
二、密钥在哪里?
显然,我们无法从加密的固件镜像中提取加密密钥,因为它是加密的。所以,我们需要找到另一种方法来获取密钥key。
如果我们能够在设备上以某种方式执行代码,那么就很简单了。如有足够的本地权限,我们可以在设备运行时,访问设备上的所有内容。这是解密后的固件镜像。
如果设备制造商最近才引入固件加密,则可以追踪尚未加密的老版本固件镜像(很可能是引入加密之前的固件版本),并检查是否可以从中提取出密钥key。
直接读取设备的flash内存,是我们可以采用的另一种技术。在flash中固件不太可能被加密。拆开其中一个设备,卸掉flash内存芯片,转储内存后再读取文件系统。但是这样破坏性太太了,设备很昂贵,一旦损坏将大大浪费。
在这里,我们不会深入探讨这些问题,因为其他人已经做过了。关于这个问题Zero Day Initiative有一篇详细的文章,当你在解决固件加密时,可以考虑这个方法。
三、Shell中的操作
在我们的例子中,通过UART调试接口可以轻松得到DIR-X1560设备的shell。获取到交互式shell后,就可以轻松dump出整个文件系统。使用内置的busybox tar和nc命令可以很容易地做到这一点。首先在设备上设置监听器:
nc –nvlp [PORT] > filesystem.tar.gz
然后在设备上运行以下指令,只写明想要传出的根目录即可。
tar -cvz /bin/ /data/ /etc/ /etc_ro/ /lib/ /libexec/ /mnt/ /opt/ /sbin/ /usr/ /var/ /webs/ | nc [IP ADDRESS] [PORT]
最终,将得到tar.gz压缩文件,包含文件系统中任何你想要的部分,然后通过网络传输出来。
四、发现在何处解密
不同于“SHRS”固件镜像,没有明显的imgdecrypt二进制文件可供关注。因此我们可以跟踪固件上传过程,看是否可以定位到在哪里解密。
幸运的是,固件头部的字符串,可以作为独特的关键字,帮助我们在文件系统中找到相关程序。
$ grep -r encrpted_img
Binary file bin/fota matches
Binary file bin/httpd matches
Binary file bin/prog.cgi matches
在此我们找到了两个二进制程序 prog.cgi 和fota,二者可能以某种方式来处理加密过的固件镜像。
在progl.cgi中,根据字符串encrypted_img,我们可以很容易的追踪到固件上传的地方。
通过跟随固件被加密部分的指针变量,发现函数FUN00033144被调用,此指针是其第一个参数。
在这个函数内部,出现一个极有可能是固件解密的函数: gj_decode()
五、深入库文件
gj_decode()函数被定义在libcmd_util.so文件中,此函数代码不多,但关键的是,其内部调用了两个加密相关的函数: aes_set_key 和aes_cbc_decrypt。这两个函数也被定义在上述库文件中,但我们没必要深究这二者。因为它们的函数名已经给予了很多信息:像是CBC模式下的AES加密。
我们可以看到,aes_set_key()的第二个参数可能是AES密钥,而 aes_cbc_decrypt 的第二个参数可能是初始向量IV。
这里的反编译代码有点乱,但不要太在意细节,直接看代码逻辑。有两个do-while循环,将数据从全局变量复制到本地缓冲区,这些循环在全局地址的字节上迭代,直到到达某个特定的结束地址。
key_loc 和key_loc + 4是指向本地缓冲区的指针变量,第一个循环中,00031ba3地址处的数据拷贝到key_loc+4直到00031bc3地址,而第二个循环,00031bc5地址处的数据拷贝到key_loc直到00031bd5地址(还注意到:这两个本地指针分别是aes_cbc_decrypt()和aes_set_key()的第二个参数)
的确如此,在地址00031ba3处,可见有一个字节数组。
同样在00031bc5地址处,也可见类似的形式。
因此,我们可以假设AES密钥位于 00031ba3,而初始向量IV位于 00031bc5。
今天我们在这不会公布真实的密钥,但是那些关注且跟随者应该有能力将密钥提取出来,如他们而言,这是留给有兴趣读者的练习。
六、节省时间和脑力
通过使用CyberChef,我们可以快速、轻松地验证假设。大多数情况下,当我想要快速解决密码学相关问题时,我都会打开这个工具。它由英国GCHQ编写,如果对公务员写的东西持怀疑态度,大可不必,它只是用纯JavaScript编写,可以在你想要的任何浏览器中运行。
复制加密固件镜像中的第一个0x1000左右字节的数据,作为16进制的ASCII粘贴到CyberChef输入中,再结合我们提取的密钥和IV,通过CyberChef的“AES Decrypt”操作,就可以得到一个理想的结果。
在这里我们可以看到UBI数据块的头部数据,说明我们正在完全的解密整个固件更新包。
一旦我们知道密钥和IV是有效的,那么很容易就可以编写一个完整的解密脚本。在这种情况下,在我们得到一个完整且正确的镜像之前,还有几个小的问题需要克服,比如数据对齐,但这些都很容易解决。
七、结论
在许多情况下,嵌入式设备中的固件被加密并不是一个很难解决的问题。一旦可以获取到物理设备,解密过程就可以大大简化。值得记住的是,嵌入式设备的固件加密主要在固件更新包中实现,而很少在存储级别实现,这一点与移动电话和笔记本电脑的最新实现相反,这二者常见的加密方法是全磁盘(至少是磁盘的重要部分)加密。
这种设置在未来可能会改变,至少是部分改变。例如,Android从4.4开始就支持 全磁盘加密 ,从7.0开始支持基于文件的加密。自Android 10以来,就需要基于文件的加密。然而应该注意的是,术语“完整磁盘”加密在Android中具有误导性,即加密的只是data/userdata分区。
如何提取D-Link解密密钥相关推荐
- 佳明或已支付勒索金,获得 WastedLocker的解密密钥
聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 BleepingComputer 证实称,佳明(Garmin) 已获得遭 WastedLocker 勒索软件加密的文件解密密钥. 20 ...
- zip文件解密_Shade(Troldesh)勒索宣布停运并放出75万个解密密钥
0x00 事件背景 勒索软件Shade背后组织于周末宣布收手,并在GitHub上发布了超过75万个解密密钥. 卡巴斯基实验室的安全研究人员已经证实了解密密钥的有效性,并且正在致力于创建免费的解密工具. ...
- 【计算机网络】网络安全 : 公钥密码体质 ( 公钥 - 加密密钥 | 私钥 - 解密密钥 | 与对称密钥体质对比 | 特点 | 数字签名引入 )
文章目录 一.公钥密码体质 二.公钥密码体质 中的 加密密钥 与 解密密钥 三.公钥密码体质 与 对称密钥体质对比 四.公钥密码体质算法特点 五.公钥密码体质 与 数字签名 一.公钥密码体质 公钥密码 ...
- c# 无法检索解密密钥_使用C#检索Windows产品密钥
c# 无法检索解密密钥 注意:今天早上在我的博客上发布了此内容,但也感到字节社区可以从中受益. 我已经在不同的论坛上多次问过这个问题,并认为我会开发一种用于检索Windows产品密钥的解决方案. 实际 ...
- 著名勒索软件停止运营并发布解密密钥、大部分医院物联网设备存在安全漏洞|2月14日全球网络安全热点
安全资讯报告 臭名昭著的迷宫(Maze)勒索软件停止运营并发布了解密密钥 在过去的三年中,Maze的工作人员使用其勒索软件诱捕了数十名受害者.现在,突然间,Maze似乎已经放弃了.他们已经发布了主解密 ...
- 文件加密和解密 - 密钥存储
当我们想要做一次加密系统,或者只是有一个关于这个问题,它是如何保存的加密和解密密钥. 一般认为想要的文件加密和解密,对称算法用于.一般是AES要么DES. 这就存在密钥管理的问题,它是如何? 基本上两 ...
- 【乘法密码】根据乘法密码的加密函数求解密密钥
乘法密码的加密函数为 c = a × m ( m o d n ) c=a\times m\ (\mathrm{mod}\ n) c=a×m (mod n),其中 a a a和 n n n互质, m m ...
- 【良心发现】TeslaCrypt敲诈者病毒作者放出解密密钥,TeslaCrypt病毒解决方案
TeslaCrypt敲诈者病毒自去年爆发以来一直不断升级,目前的TeslaCrypt 3.0版本其破解难度也越来越高.越来越多用户一旦中招,导致文件被锁只能支付一定费用才能解锁. 但是最近事情出现了戏 ...
- 卡巴斯基遭攻击 Duqu 2.0 翻译
0x00 前言 今年年初,卡巴斯基实验室在安全扫描过程中,检测到了几个影响了自家内部系统的网络入侵行为. 接着我们大范围调查了这些入侵事件.我们分析发现了一个全新的木马平台,这个平台出自Duqu AP ...
最新文章
- OpenStack Nova Placement API 统一资源管理接口的未来
- 027_jQuery DOM 元素方法
- java并发编程线程安全
- 智能化网络管理 为企业信息化保驾护航
- NetTier模板生成的代码框架用法 (转)
- MySQL tips (日期时间操作/concat 等)
- 使用ssms异机还原数据库_使用SSMS 18中的查询优化助手向导进行数据库升级
- C#语言中循环分类总结
- mysql中毫秒的保存类型
- 层次分析法(AHP)原理以及应用
- 一个被忽视的强大搜图技能——以图搜图
- Shifting More Attention to Video Salient Object Detection (CVPR 2019)
- Java并发——Executor框架详解(Executor框架结构与框架成员)
- 【软件测试】软件测试随手记
- 最新的计算机是什么版本,现在的电脑上的excel是什么版本的啊
- 第十四章 字符编码(补充)
- 利用傅里叶变换去除图像中有规律的噪声
- ASPICE_SWE.1_01_02_SQ3RNote
- 虚拟化服务器和存储关系,虚拟化服务器和云存储的对比
- Python | 记录最近遇到的大坑!
热门文章
- 成功解决Exception “unhandled AttributeError“ module ‘cv2.cv2‘ has no attribute ‘estimateRigidTransform‘
- NLP:基于textrank4zh库对文本实现提取文本关键词、文本关键短语和文本摘要
- TF之pix2pix之dataset:基于TF利用自己的数据集训练pix2pix模型之DIY自己的数据集
- ML之ME/LF:机器学习中的模型评估指标/损失函数(连续型/离散型)的简介、损失函数/代价函数/目标函数之间区别、案例应用之详细攻略
- numpy中where函数的用法
- HDFS的读文件、写文件过程
- 终聚.net平台开发
- MySQL中间件之ProxySQL(13):ProxySQL集群
- Loudrunner常用函数
- 2017ACM/ICPC广西邀请赛-重现赛 1007.Duizi and Shunzi