网络靶场实战-加密固件分析

news2025/4/19 20:36:04

背景

在漏洞挖掘过程中,想要对二进制程序改进分析,我们就需要获取目标设备的文件系统,这样才能更好的逆向分析设备程序的运行逻辑,从而发现其中的漏洞点。然而并非所有设备固件中的文件系统都可以让我们轻易获取,对于已经被加密的固件,我们在解密过程中也需要具备一些分析思路。很多大佬已经写过许多固件解密思路,这里我们站在巨人的肩膀上看世界,总结一下在解密固件的几种常用的思路和方法。

加密固件识别

binwalk工具识别

使用binwalk查看一下固件的信息,如果是未加密的固件,通常可以扫描出来使用了何种压缩算法。第二种方式就是查看固件的熵值。熵值是用来衡量不确定性,熵值越大则说明固件越有可能被加密或者压缩了。这个地方说的是被加密或者压缩了,被压缩的情况也是会让熵值变高或者接近1的,下图为使用"binwalk -E"命令查看一个加密固件。

图片

固件解密

设备固件中的解密程序

解密固件的最简单方法是在固件中查找解密程序。如DLink设备的DIR882系列固件,我们进入官网(https://tsd.dlink.com.tw/)浏览固件信息。

图片

下载1.30版本固件和1.0.1版本固件,使用"binwalk 固件名"命令分析两个固件,发现新版本的固件被加密,而旧版本固件为未加密状态。

图片

在官网浏览其他版本时发现,发现在1.10版本,官方提供了俩个固件,有一个版本固件名称为中间版本(未加密)。所以猜测这里很有可能是设备固件在出厂发布时未加密,也不包含任何解密例程。这里较新版本(v1.10)的固件与含有解密程序的未加密固件一起提供,以供将来加密固件更新,后续固件版本是加密的。在这种情况下,我们可以从中间版本获取解密程序,并使用它来解密其他加密版本。

图片

下载DIR882A1_FW104B02_Middle_FW_Unencrypt.bin和DIR882A1_FW110B02.bin文件,使用"binwalk -Me 固件名"命令对未加密固件的文件系统进行提取。

在未加密固件的文件系统中,寻找可能的解密程序。使用grep搜索时,搜索字符串"decrypt"、"dec"、"extract"等,可以帮我们快速定位解密程序或脚本。

图片

使用qemu-static对寻找的程序进行运行测试,这里发现imgdecrypt程序就是固件解密程序。使用imgdecrypt对v1.10版本和v1.30版本固件解密,发现程序都可以正常解密。

图片

另一个zyxel设备固件解密实例中(https://www.iotsec-zone.com/article?id=237),binwalk虽然解不出固件的文件系统,但是binwalk解出了一些文件,这些文件中就是对固件进行解密的程序。通过对程序进行逆向分析,使用相应参数进行运行即可解密出文件系统。

图片

使用解密出的密码对固件的文件系统进行提取。

图片

明文攻击

明文攻击是一种密码分析技术,其中攻击者拥有一些已知的明文和对应的密文。这些已知的明文-密文对能够帮助攻击者破解加密算法或密钥,一般在CTF竞赛中经常遇到。明文攻击同样可以用于固件解密,当设备厂商提供的固件压缩包中具有说明文档、配置文件,且需要提取加密压缩固件中也同样具有相同的文件时,就可以进行明文攻击(压缩算法需相同)。确定相同文件就是比对crc32的值,下面使用"crc32 ./*"命令查看每个文件的crc32值。

图片

这里发现需要提取加密压缩固件中也同样具有相同的文件,并且查看这里的算法也是具备明文攻击的条件。接下来,我们就可以使用工具对加密固件进行提取。

图片

windows的明文攻击破解工具可以用ARCHPR,linux下可以使用pkcrack。

图片

解密后进行解压缩就可以获取设备固件的文件系统。

图片

根据固件特征猜测加密

在defcon27议题中(https://media.defcon.org/DEF%20CON%2027/DEF%20CON%2027%20presentations/DEFCON-27-grichter-Reverse-Engineering-4G-Hotspots-For-Fun-Bugs-Net-Financial-Loss.pdf),g richter大佬分享了挖掘Nighthawk m1设备漏洞的一些方法,其中里面的固件解密思路也非常值得我们学习。由于作者这里没有Nighthawk m1设备,所以完整流程并未复现成功。下面贴了几种原作者的图。解密大致思路为,发现固件被加密时,查看固件发现,固件中存在大量重复的数据。如下图中的"8040 4c21 ... 8f 6e",一般在一个文件中,大量的重复数据可能都是00或ff,如果这里是异或加密,那么对这些数据重新进行异或可能解密出固件。

图片

使用下面的命令,对文件中重复出现相同数据的行进行次数统计并排序,排序后发现,有64行数据重复出现了3800次左右,其他数据则是500次以下,64行的16字节数字恰好是1024字节,也就是说密钥长度为1024字节。

hexdump -v -C Mr1100.spk | cut -d" " -f3-20 | sort | uniq -c | sort -nr | head -n 100

图片

紧接着作者根据上面固件中出现重复块的现象进行搜索后发现,Nighthawk m1设备固件和Sierra Wireless路由器固件极其相似。对比后就可得知大致加密流程为:固件的前 0x100 个字节不完全为“空”(这里是间歇性的“空”/“非空”),而是一大块“非空”数据从 0x100 开始,到 0x140 结束。然后有一个从0x170到0x190的非空段。然后另一个“非空”段从0x290开始,然后在0x2F0处开始一个空行,然后是来自0x300的更多非空数据。

图片

得到大致加密思路后,通过利用该加密特点对Nighthawk m1设备的程序进行逆向分析,得到了解密部分的代码如下。下图中的AES_set_decrypt_key函数为加密标头的解密函数。

图片

程序在每个加密标头上调用 AES_decrypt 函数。

由于这里没有设备,无法根据上面逆向分析的代码编写解密脚本,效果如下。

不同镜像的解密程序

不同镜像的解密程序,这里的以fortigate为例,具体思路为fortigate的硬件设备固件都被加密,而fortigate提供多个镜像版本(比如vmx和kvm版本的固件),这些固件我们可以无条件获取,厂商在发布同一个系列固件中,很有可能使用同一份代码。那么我们可以通过对fortigate不同镜像版本的固件进行分析,就可以找到fortigate的通用解密代码,然后编写解密程序就可以获得其他版本固件的文件系统。这里的测试版本为VMX-v7.2.4.F-build1396,设备固件为90E-v7.2.4.F-build1396。首先我们挂载fortigate的虚拟卷,将里面的rootfs.gz复制出来并解压。

图片

使用系统自带的解包程序对压缩文件进行解包处理。

图片

通过搜索字符串寻找解密程序,猜测init程序中存在解密部分。

通过搜索固件升级,固件下载等字符串查找定位,固件升级时触发的解密代码,下图中便是fortigate的固件解密代码。

我们获得了解密代码后,需要查找解密的密钥,通过对固件的加密模块进行分析后发现,我们可以对密钥进行爆破。这里直接使用大佬已经写好的脚本(https://github.com/BishopFox/forticrack)进行测试,最终的解密效果如下图。

寻找内核解密程序

寻找内核中的解密程序,我们从芯片中进行提取的固件后,可以从内核中获取固件解密的程序。以某快设备为例,我们对其固件进行解密分析(https://www.iotsec-zone.com/article?id=218),下面官方提供的设备固件压缩包中,文件系统rootfs被加密,而vmlinz没有被加密,我们可以使用"extract-vmlinux.sh"脚本((无符号表))或者vmlinx-to-elf工具(有符号表)对内核镜像中提取内核。

对照linux内核源码,我们使用ida对内核文件进行逆向分析,因为文件系统被加密,所以我们直接查找和定位initramfs代码部分(内核2.4版本前为initrd)。最后找到对文件系统的解密代码,代码如下。

通过提取核心解密代码编写解密脚本,我们就可以对文件系统进行解密。

同理,思路向后延伸,当内核也被加密时,我们可以对提取出来的uboot.bin部分进行分析后并发现具有可利用信息,例如前面小节中的某设备。

图片

总结

固件解密在安全评估、漏洞分析和逆向工程中起着重要作用,通过解密固件,可以更加轻松地查找和分析程序中的脆弱点和设计缺陷。在这一小节中,我们学习并总结了几个固件解密的分析思路和方法,整体的大致思路为寻找设备系统运行所有环节中可能存在解密功能的部分。

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1601261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是上位机?入门指南

什么是上位机? 上位机(SCADA,Supervisory Control and Data Acquisition)是一种软件系统,用于监控和控制工业过程中的设备。它通常与传感器、执行器和其他自动化设备一起工作,以实时地监视过程状态、收集数…

7 pytorch DataLoader, TensorDataset批数据训练方法

前言 本文主要介绍pytorch里面批数据的处理方法,以及这个算法的效果是什么样的。具体就是要弄明白这个批数据选取的算法是在干什么,不会涉及到网络的训练。 from torch.utils.data import DataLoader, TensorDataset主要实现就是上面的数据集和数据载入…

详解IP安全:【IPSec协议簇 - AH协议 - ESP协议 - IKE协议】

目录 IP安全概述 IPSec协议簇 IPSec的实现方式 AH(Authentication Header,认证头) ESP(Encapsulating Security Payload,封装安全载荷) IKE(Internet Key Exchange,因特网密钥…

Sourcetree安装使用(补个笔记)

Sourcetree介绍 Sourcetree是一款免费的Git图形化客户端,它由Atlassian开发,提供了跨平台的支持,可运行在Windows和Mac操作系统上。Sourcetree可以让开发者更方便地使用Git来管理代码,不需要在命令行中输入复杂的Git命令&#xf…

C++ | Leetcode C++题解之第31题下一个排列

题目&#xff1a; 题解&#xff1a; class Solution { public:void nextPermutation(vector<int>& nums) {int i nums.size() - 2;while (i > 0 && nums[i] > nums[i 1]) {i--;}if (i > 0) {int j nums.size() - 1;while (j > 0 && …

HarmonyOS NEXT星河版之实战商城App瀑布流(含加载更多)

文章目录 一、目标二、开撸2.1 声明商品对象2.2 mock数据2.3 主页面2.4 加载更多2.5 完整代码 三、小结 一、目标 二、开撸 2.1 声明商品对象 export interface GoodsItem {title: stringimageUrl: string }2.2 mock数据 export const mockGoodsList: GoodsItem[] [{title:…

1688上怎么找跨境电商低价优质货源?妙手ERP帮您搞定!

1688是跨境卖家常用的货源网站&#xff0c;但很多从1688上拿货的卖家都会遇到这样的问题&#xff1a;有时候找到的货源比同行售价还高&#xff0c;好不容易找到低价的货源&#xff0c;但质量不好、供应也不稳定。 实际上&#xff0c;1688平台上有很多超低价的货源&#xff0c;…

Ubuntu系统安装APITable多维表格平台结合内网穿透实现公网访问

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c;是一款面向 API 的智能多维表格。它将复杂的可视化数据库、电子表格、实时在线协同、低代码开发技术四合为一&am…

机器人码垛机的技术特点与应用

随着科技的飞速发展&#xff0c;机器人技术正逐渐渗透到各个行业领域&#xff0c;其中&#xff0c;机器人码垛机在物流行业的应用尤为引人瞩目。它不仅提高了物流效率&#xff0c;降低了成本&#xff0c;更在改变传统物流模式的同时&#xff0c;为行业发展带来了重大的变革。 一…

2024蓝桥杯每日一题(最大公约数)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;公约数 试题二&#xff1a;最大公约数 试题三&#xff1a;等差数列 试题四&#xff1a;最大比例 试题五&#xff1a;Hankson的趣味题 试题一&#xff1a;公约数 【题目描述】 …

cesium加载高层级离线影像地图瓦片(天地图、19级Arcgis)

实际加载效果如图&#xff1a; 1、下载离线地图瓦片方式&#xff08;多种任选其一&#xff0c;个人倾向于Qgis工具&#xff09;&#xff1a; 方式1、采用第三方下载工具如&#xff1a;91卫图、水经注、全能电子地图下载器、bigemap等等。&#xff08;这些有的下载层级不够&…

服务器数据恢复—xfs文件系统节点、目录项丢失的数据恢复案例

服务器数据恢复环境&#xff1a; EMC某型号存储&#xff0c;该存储内有一组由12块磁盘组建的raid5阵列&#xff0c;划分了两个lun。 服务器故障&#xff1a; 管理员为服务器重装操作系统后&#xff0c;发现服务器的磁盘分区发生改变&#xff0c;原来的sdc3分区丢失。由于该分区…

【C语言】每日一题,快速提升(2)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;杨氏矩阵 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个…

Ubuntu 部署ChatGLM3大语言模型

Ubuntu 部署ChatGLM3大语言模型 ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的对话预训练模型。 源码&#xff1a;https://github.com/THUDM/ChatGLM3 部署步骤 1.服务器配置 Ubuntu 20.04 8核(vCPU) 32GiB 5Mbps GPU NVIDIA T4 16GB 硬盘 100GiB CUDA 版本 12.2.2/…

从汇编代码理解数组越界访问漏洞

数组越界访问漏洞是 C/C 语言中常见的缺陷&#xff0c;它发生在程序尝试访问数组元素时未正确验证索引是否在有效范围内。通常情况下&#xff0c;数组的索引从0开始&#xff0c;到数组长度减1结束。如果程序尝试访问小于0或大于等于数组长度的索引位置&#xff0c;就会导致数组…

Python 物联网入门指南(八)

原文&#xff1a;zh.annas-archive.org/md5/4fe4273add75ed738e70f3d05e428b06 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第三十章&#xff1a;制作机械臂 最后&#xff0c;我们终于到达了大多数人自本书开始以来就想要到达的地方。制作一个机械臂&#xff01;在…

pip如何查看Python某个包已发行所有版本号?

以matplotlib包为例子&#xff0c; pip install matplotlib6666 6666只是胡乱输入的一个数&#xff0c;反正输入任意一个不像版本号的数字都可以&#xff5e; matplotlib所有版本号如下&#xff0c; 0.86, 0.86.1, 0.86.2, 0.91.0, 0.91.1, 1.0.1, 1.1.0, 1.1.1, 1.2.0, 1.2.1…

【问题处理】银河麒麟操作系统实例分享,oom分析

1.问题现象描述 服务器数据库被oomkill掉&#xff0c;但是mem查看只占用了不到60%。 2.问题分析 2.1.oom现象分析 从下面的日志信息&#xff0c;可以看到chmod进程是在内核采用GFP_KERNEL|__GFP_COMP分配order3也就是2的3次方&#xff0c;8个连续页的时候&#xff0c;因进入…

如何使用Git-Secrets防止将敏感信息意外上传至Git库

关于Git-Secrets Git-secrets是一款功能强大的开发安全工具&#xff0c;该工具可以防止开发人员意外将密码和其他敏感信息上传到Git库中。 Git-secrets首先会扫描提交的代码和说明&#xff0c;当与用户预先配置的正则表达式模式匹配时&#xff0c;便会阻止此次提交。该工具的优…

字体反爬积累知识

目录 一、什么是字体反扒 二、Unicode编码 三、利用font包获取映射关系 一、什么是字体反扒 字体反爬是一种常见的反爬虫技术&#xff0c;它通过将网页中的文本内容转换为特殊的字体格式来防止爬虫程序直接获取和解析文本信息。字体反爬的原理是将常规的字符映射到特殊的字…