TP-Link WR740后门分析 - 练习

一、固件分析

使用AttifyOS 3.0下载(固件提取)物联网评估测试工具集成系统这个是集成了相关的工具,刚下载的话需要更新一下,root密码是attify,那么直接开始了,根据提供的信息,这段描述了TP-Link固件的头部信息以及固件中的几个重要部分。固件文件已经资源绑定了,没VIP可以在前往这个地址进行下载:https://github.com/dioos886/TP-LinkWR740

  • 第一行描述了固件的版本信息、产品ID和产品版本等。
  • 第二行描述了在偏移量为512的位置,存在一个gzip压缩的文件,文件名为"vmlinux.bin"。
  • 第三行描述了在偏移量为1048576的位置,存在一个Squashfs文件系统,该文件系统是大端序的,使用lzma签名,版本为3.1,大小为2059306字节,包含431个索引节点,块大小为65536字节,创建日期为2010年9月13日03:29:45。
iot@attifyos ~/tools> binwalk wr740nv1_en_3_12_4_up.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             TP-Link firmware header, firmware version: 0.0.0, image version: "", product ID: 0x0, product version: 121634817, kernel load address: 0x0, kernel entry point: 0x80002000, kernel offset: 3932160, kernel length: 512, rootfs offset: 818284, rootfs length: 1048576, bootloader offset: 2883584, bootloader length: 0
512           0x200           gzip compressed data, has original file name: "vmlinux.bin", from Unix, last modified: 2010-09-03 04:31:13
1048576       0x100000        Squashfs filesystem, big endian, lzma signature, version 3.1, size: 2059306 bytes, 431 inodes, blocksize: 65536 bytes, created: 2010-09-13 03:29:45

下载固件包:wr740nv1_en_3_12_4_up.bin,binwalk工具进行固件解包,如果没有的话需要额外安装这款工具,我还是建议直接使用这款AttifyOS 3.0集成系统,我尝试过自己装,当然整个过程不止这一款工具的,反正那时我运行工具报错到怀疑人生。

iot@attifyos ~/tools> binwalk -Me wr740nv1_en_3_12_4_up.bin

Scan Time:     2023-07-18 19:32:28
Target File:   /home/iot/tools/wr740nv1_en_3_12_4_up.bin
MD5 Checksum:  b45740faa17d6a5fee080e368092a05e
Signatures:    396

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             TP-Link firmware header, firmware version: 0.0.0, image version: "", product ID: 0x0, product version: 121634817, kernel load address: 0x0, kernel entry point: 0x80002000, kernel offset: 3932160, kernel length: 512, rootfs offset: 818284, rootfs length: 1048576, bootloader offset: 2883584, bootloader length: 0
512           0x200           gzip compressed data, has original file name: "vmlinux.bin", from Unix, last modified: 2010-09-03 04:31:13
1048576       0x100000        Squashfs filesystem, big endian, lzma signature, version 3.1, size: 2059306 bytes, 431 inodes, blocksize: 65536 bytes, created: 2010-09-13 03:29:45


Scan Time:     2023-07-18 19:32:30
Target File:   /home/iot/tools/_wr740nv1_en_3_12_4_up.bin.extracted/vmlinux.bin
MD5 Checksum:  4ac922375a7a7b67d76d8bed30999f21
Signatures:    396

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
756492        0xB8B0C         Certificate in DER format (x509 v3), header length: 4, sequence length: 64
1184448       0x1212C0        Certificate in DER format (x509 v3), header length: 4, sequence length: 130
1413744       0x159270        Linux kernel version 2.6.15
1421135       0x15AF4F        Copyright string: "Copyright 1995-1998 Mark Adler "
1447760       0x161750        Unix path: /usr/gnemul/irix/
1449140       0x161CB4        Unix path: /usr/lib/libc.so.1
1488227       0x16B563        Neighborly text, "neighbor %.2x%.2x.%.2x:%.2x:%.2x:%.2x:%.2x:%.2x lost on port %d(%s)(%s)"
1839104       0x1C1000        gzip compressed data, maximum compression, from Unix, last modified: 2010-09-03 04:28:32


Scan Time:     2023-07-18 19:32:30
Target File:   /home/iot/tools/_wr740nv1_en_3_12_4_up.bin.extracted/_vmlinux.bin.extracted/1C1000
MD5 Checksum:  c2fe5065e20f09d7a745c65a43e44ab3
Signatures:    396

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             ASCII cpio archive (SVR4 with no CRC), file name: "/dev", file name length: "0x00000005", file size: "0x00000000"
116           0x74            ASCII cpio archive (SVR4 with no CRC), file name: "/dev/console", file name length: "0x0000000D", file size: "0x00000000"
240           0xF0            ASCII cpio archive (SVR4 with no CRC), file name: "/root", file name length: "0x00000006", file size: "0x00000000"
356           0x164           ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"

解包内容-第一部分

以上是通过binwalk工具解包的内容,我们先看第一部分内容

  • 偏移量0(十六进制0x0)处是TP-Link固件头部信息。其中包括固件版本为0.0.0,图像版本为空字符串,产品ID为0x0,产品版本为121634817。此外还包括内核加载地址为0x0,内核入口点为0x80002000,内核偏移量为3932160,内核长度为512,RootFS偏移量为818284,RootFS长度为1048576,引导程序偏移量为2883584,引导程序长度为0。
  • 偏移量512(十六进制0x200)处是一个gzip压缩的文件,原始文件名为"vmlinux.bin",来源于Unix系统,最后修改时间为2010年9月3日
    04:31:13。
  • 偏移量1048576(十六进制0x100000)处是一个Squashfs文件系统,它使用大端序字节顺序,具有lzma签名,版本为3.1。该文件系统的大小为2059306字节,包含431个索引节点,块大小为65536字节,创建日期为2010年9月13日
    03:29:45。
    在这里插入图片描述

解包内容-第二部分

  • 偏移量756492(十六进制0xB8B0C)处是一个使用DER格式的证书,版本为x509 v3。证书头部长度为4字节,序列长度为64字节。
  • 偏移量1184448(十六进制0x1212C0)处是另一个使用DER格式的证书,版本为x509
    v3。证书头部长度为4字节,序列长度为130字节。
  • 偏移量1413744(十六进制0x159270)处是Linux内核版本号为2.6.15。
  • 偏移量1421135(十六进制0x15AF4F)处是版权声明字符串,内容为"Copyright 1995-1998 Mark Adler
    "。
  • 偏移量1447760(十六进制0x161750)和偏移量1449140(十六进制0x161CB4)处是Unix路径字符串。分别表示路径"/usr/gnemul/irix/“和”/usr/lib/libc.so.1"。
  • 偏移量1488227(十六进制0x16B563)处是文本信息,内容为"neighbor
    %.2x%.2x.%.2x:%.2x:%.2x:%.2x:%.2x:%.2x lost on port %d(%s)(%s)"。
  • 偏移量1839104(十六进制0x1C1000)处是一个gzip压缩的文件,采用最大压缩级别,来源于Unix系统,最后修改时间为2010年9月3日
    04:28:32。

在这里插入图片描述

解包内容-第三部分

  • 偏移量0(十六进制0x0)处是一个ASCII格式的cpio归档文件。它的文件名为"/dev",文件名长度为5字节,文件大小为0字节。
  • 偏移量116(十六进制0x74)处是另一个ASCII格式的cpio归档文件。它的文件名为"/dev/console",文件名长度为13字节,文件大小为0字节。
  • 偏移量240(十六进制0xF0)处是另一个ASCII格式的cpio归档文件。它的文件名为"/root",文件名长度为6字节,文件大小为0字节。
  • 偏移量356(十六进制0x164)处是一个ASCII格式的cpio归档文件。它的文件名为"TRAILER!!!",文件名长度为11字节,文件大小为0字节。

在这里插入图片描述
解固件包的文件
在这里插入图片描述

firmwalker工具扫描

"firmwalker"是一个简单的bash脚本,用于搜索提取或挂载的固件文件系统。它会在提取或挂载的固件文件系统中搜索感兴趣的内容,例如:

  • 搜索etc/shadow和etc/passwd文件
  • 列出etc/ssl目录
  • 搜索SSL相关文件,如.pem、.crt等
  • 搜索配置文件
  • 查找脚本文件
  • 搜索其他的.bin文件
  • 查找包含关键词(如admin、password、remote等)的文件
  • 搜索常见的物联网设备上使用的Web服务器
  • 搜索常见的二进制文件,如ssh、tftp、dropbear等
  • 搜索URL、电子邮件地址和IP地址
  • 实验性支持使用Shodan CLI调用Shodan API
下载工具:
iot@attifyos ~/tools> git clone https://github.com/craigz28/firmwalker.git
Cloning into 'firmwalker'...
remote: Enumerating objects: 316, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 316 (delta 0), reused 3 (delta 0), pack-reused 312
Receiving objects: 100% (316/316), 145.51 KiB | 337.00 KiB/s, done.
Resolving deltas: 100% (142/142), done.

开始固件扫描./firmwalker.sh + 解包文件的实际目录

iot@attifyos ~/t/firmwalker> chmod +x firmwalker.sh
iot@attifyos ~/t/firmwalker> ./firmwalker.sh '/home/iot/Desktop/tools/_wr740nv1_en_3_12_4_up.bin.extracted/squashfs-root'

以下是一些扫描结果的截图,内容过多不一一放了
在这里插入图片描述
由上面的信息可知:

  • 路由器Web相关URL的格式为:/web/userRpm/xxxxx.htm,这可能是web服务相关的命令规范。
  • 含有passwd和pwd相关的文件中,可以看到嵌入式web服务httpd(从左到右看第二至第四张图都带有httpd),部分htm文件以及其他配置文件。

查看启动项中是否存在后门服务,如telnet服务。嵌入式Linux常用启动项文件位于:etc/rc.d文件夹中。在整个过程中,只有rcS这个文件带有httpd路由启动程序,解刨一下这个文件。
在这里插入图片描述

#!/bin/sh

# This script runs when init it run during the boot process.
# Mounts everything in the fstab

mount -a
#mount -o remount +w /重新挂载根文件系统为可写模式。

#
# Mount the RAM filesystem to /tmp  将RAM文件系统挂载到/tmp目录。
#

mount -t ramfs -n none /tmp #将RAM文件系统挂载到/tmp目录
mount -t ramfs -n none /var  #将RAM文件系统挂载到/var目录。

export PATH=$PATH:/etc/ath #将/etc/ath添加到环境变量$PATH中

#insmod /lib/modules/2.6.15/net/ag7100_mod.ko
#insmod /lib/modules/2.6.15/net/ag7240_mod.ko

#
# Set lo eth1 up
#
ifconfig lo 127.0.0.1 up #设置回环接口(lo)IP地址为127.0.0.1并启用
#ifconfig eth1 up

#
# insert netfilter/iptables modules
#

/etc/rc.d/rc.modules #执行启动脚本rc.modules,用于加载netfilter/iptables模块

#
# Start Our Router Program
#

/usr/bin/httpd & #启动名为httpd的路由器程序

echo 524288 > /proc/sys/net/ipv4/ipfrag_high_thresh #将524288写入/proc/sys/net/ipv4/ipfrag_high_thresh文件,可能是设置IPv4 IP分片高阈值的操作

跟进/usr/bin/httpd文件,作为启动程序

iot@attifyos ~/t/_/squashfs-root> find . -name 'httpd'
./usr/bin/httpd

在这里插入图片描述

二、逆向分析

由file信息可知用IDA32分析,根据firmwalker扫出的敏感信息可知httpd文件中含passwd、password、root、admin、upgrade等字符串。

iot@attifyos ~/t/_/s/u/bin> file httpd
httpd: ELF 32-bit MSB executable, MIPS, MIPS32 version 1 (SYSV), dynamically linked, interpreter /lib/ld-, stripped

使用IDA-32打开httpd文件后在IDA的菜单栏上选择"View"(视图),然后选择"Open Subviews"(打开子视图),再选择"Strings"(字符串)或者直接shift+F12。打开之后在ctrl+f搜索passwd关键字符串在这里插入图片描述
那么或者直接快捷键G定位点00517188在这里插入图片描述根据注释的信息,它在代码中与DebugResultRpmHtm+134位置有数据交叉引用(XREF),跟踪调用
在这里插入图片描述
根据跟踪passwd调用的地方,简单查看便可以很多硬编码的敏感字符串,使用F5生成伪C代码
在这里插入图片描述
直接F5生成伪代码,发送一段以下代码 , osteam在我们上面刚开始的时候也看到过了,我先标注一下,这个osteam5up分别账户密码,模拟固件使用后门要账户密码。

|| (v7 = (const char *)httpGetEnv(a1, “usr”), strcmp(v7, “osteam”))
|| (v8 = (const char *)httpGetEnv(a1, “passwd”), strcmp(v8, “5up”)) )

在这里插入图片描述
根据这个文件的出现,我往后面翻了一下,基本实锤这个文件是关于后门的一些信息。代码通过 httpGetEnv 函数获取环境变量 “cmd” 的值,并将其作为命令执行的输入。这可能导致恶意用户通过设置该变量来执行任意命令,从而构成安全风险。
在这里插入图片描述
代码调用 write 函数将命令写入名为 pty 的文件描述符中,以模拟命令的执行。伪终端(pseudo terminal)的使用可能暗示着与终端会话和命令执行相关的功能,这种功能在某些情况下可能被滥用。这段代码的逻辑如下:

  • 使用 strlen 函数计算变量 v6 的长度,并将结果保存在变量 v9 中。
  • 调用 write 函数,将 v6 中的内容写入 pty 文件描述符。
  • 在条件语句中,检查 v6 是否包含 “ping” 或 “cat” 字符串,以及同时不包含 “&” 字符。
  • 如果满足条件,使用 write 函数向 pty 写入一个 “&” 字符。
  • 最后,使用 write 函数向 pty 写入一个换行符。

根据代码的片段,可以推测该代码是用于处理用户输入的命令,并将命令发送到 pty
文件描述符,以模拟命令的执行。其中的条件语句可能用于特定命令的处理,例如补充额外的字符或参数。

在这里插入图片描述
选中DebugResult直接双击跟进
在这里插入图片描述
来到005171DC往上滚动一点
在这里插入图片描述
来到00516FF8这个地址,全选双击跟进httpDebugInit+5C↑o
在这里插入图片描述
到这后,F5生成伪代码
在这里插入图片描述

int httpDebugInit() #httpDebugInit函数 它的功能包括注册信号处理函数、添加一些路径和对应的处理函数,并返回一个结果
{
  signal(18, doClosePty); #使用 signal 函数注册一个信号处理函数,该函数在收到信号 18 时调用 doClosePty 函数。
  httpRpmConfAdd(2, "/userRpmNatDebugRpm26525557/start_art.html", &ArtRpmHtm); #调用 httpRpmConfAdd 函数,向配置列表中添加一条记录,包括路径 "/userRpmNatDebugRpm26525557/start_art.html" 和与之相关联的处理函数 ArtRpmHtm
  httpRpmConfAdd(2, "/userRpmNatDebugRpm26525557/linux_cmdline.html", &CmdRpmHtm);#再次调用 httpRpmConfAdd 函数,添加另一条记录,包括路径 "/userRpmNatDebugRpm26525557/linux_cmdline.html" 和与之相关联的处理函数 CmdRpmHtm。
  return httpRpmConfAdd(2, "/userRpm/DebugResultRpm.htm", DebugResultRpmHtm); #最后,调用 httpRpmConfAdd 函数,添加最后一条记录,包括路径 "/userRpm/DebugResultRpm.htm" 和与之相关联的处理函数 DebugResultRpmHtm。
}

根据代码片段以及函数命名的上下文,可以推断出这段代码与 HTTP 请求和路由器管理界面相关。函数的目的可能是初始化特定的 HTTP 路径,并将相应的处理函数与之关联,以便在请求到达时执行相应的处理逻辑。
在这里插入图片描述

FirmAE工具下载(这一部分亲自测试有点问题,直接下一步)

FirmAE是一个完全自动化的框架,用于进行仿真和漏洞分析。FirmAE通过五种仲裁技术显著提高了仿真成功率(从Firmadyne的16.28%提高到79.36%)。我们对来自八大主要厂商的1,124个无线路由器和IP摄像头固件镜像进行了FirmAE的测试。

git clone --recursive https://github.com/pr0v3rbs/FirmAE
./download.sh
./install.sh

下载好后,然后运行一下

!执行init.sh初始环境
sudo ./init.sh
!检查是否能模拟 - 注意目录名称
sudo ./run.sh -c tp-link '/home/iot/Desktop/tools/wr740nv1_en_3_12_4_up.bin'

!开始固件模拟 - 注意目录名称
sudo ./run.sh -r tp-link '/home/iot/Desktop/tools/wr740nv1_en_3_12_4_up.bin'

运行sudo ./init.sh出现问题,没安装postgresql
在这里插入图片描述

sudo apt update #更新一下
sudo apt install postgresql #安装postgresql

初始环境
在这里插入图片描述
通过我的一系列操作Emmmm…搞不起来,运行sudo ./run.sh -C DIR-859 /root/DIR859_FW102b03.bin模拟都模拟不起来,擦辣!我就不信,架不起来!在这里插入图片描述

三、固件模拟

最后我换了一个工具firmware-analysis-toolkit,给模拟起来了,也是这个系统自带的

iot@attifyos ~/t/firmware-analysis-toolkit> 
./fat.py '/home/iot/Desktop/tools/firmware-analysis-toolkit'

                               __           _
                              / _|         | |
                             | |_    __ _  | |_
                             |  _|  / _` | | __|
                             | |   | (_| | | |_
                             |_|    \__,_|  \__|

                Welcome to the Firmware Analysis Toolkit - v0.3
    Offensive IoT Exploitation Training http://bit.do/offensiveiotexploitation
                  By Attify - https://attify.com  | @attifyme
    
[+] Firmware: firmware-analysis-toolkit
[+] Extracting the firmware...
[+] Image ID: 1
[+] Identifying architecture...
[+] Architecture: mipseb
[+] Building QEMU disk image...
[+] Setting up the network connection, please standby...
[+] Network interfaces: [('br0', '192.168.1.1')]
[+] All set! Press ENTER to run the firmware...
[+] When running, press Ctrl + A X to terminate qemu
[+] Command line: /home/iot/tools/firmware-analysis-toolkit/firmadyne/scratch/1/run.sh
[sudo] password for iot: 
Creating TAP device tap1_0...

出现以下情况不出运行,直接用力按一下回车键

[+] Network interfaces: [('br0', '192.168.1.1')]
[+] All set! Press ENTER to run the firmware...
[+] When running, press Ctrl + A X to terminate qemu

admin admin
在这里插入图片描述
在这里插入图片描述
然后直接奔那个逆向的结果去
/userRpmNatDebugRpm26525557/linux_cmdline.html 还挺别致这个后门
在这里插入图片描述
在这里插入图片描述
好了,暂时就先这样,有时间在把那个 FirmAE工具整整,看看什么情况!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

David_Jou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值