TP-Link TL-WR841N v14 CVE-2019-17147 缓冲区溢出漏洞分析笔记v2018.12.31
0x00 背景
Httpd服务中的缓冲区溢出漏洞
复现参考文章[https://www.4hou.com/posts/gQG9](对 TP-Link TL-WR841N v14 CVE-2019-17147 缓冲区溢出漏洞的分析)
Binwalk -Me 解压缩
File ./bin/busybox文件类型
MIPS 32位,小端
0x01 固件仿真环境搭建
在TPlink官网上直接找到了TP-Link TL-WR841N v14 2018-3月的固件版本,是漏洞修复前的,下载后想着既然没有实物,何不仿真运行呢?
在网上寻找资料过程中,在这篇文章【物联网设备固件模拟入门
】中找到了相应工具,固件分析工具包(https://github.com/attify/firmware-analysis-toolkit)
遵照教程一步步操作,能够在最后运行Netgear WNAP320 固件,在浏览器这个输入IP地址可以直接访问。
但是在对TP-Link TL-WR841N v14进行同样操作时,固件仿真运行失败
0x02 仿真失败原因探寻
首先搭建qemu仿真环境,下载https://people.debian.org/~aurel32/qemu/mipsel/ 网站上编译好的mips32el环境,通过wget指令下载 vmlinux-2.6.32-5-4kc-malta和debian_squeeze_mipsel_standard.qcow2到固件所在文件夹,然后输入:
sudo qemu-system-mipsel -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic,macaddr=00:16:3e:00:00:01 -net tap
运行qemu-system,用户名和密码都是root
之后通过scp -r ./squashfs-root root@虚拟机ip:/root/
完成固件环境的搭建
Chroot /root/squashfs-root/ bin/sh
将文件系统切换到路由器文件系统,注意squashfs-root/ 和bin之间有空格
运行初始化文件:sh /etc/init.d/rcS
init.d/rcS: line 30: can't create /proc/sys/net/netfilter/nf_conntrack_icmp_timeout: nonexistent directory
init.d/rcS: line 35: can't create /proc/sys/net/netfilter/nf_conntrack_expect_max: nonexistent directory
init.d/rcS: line 37: can't create /proc/sys/net/netfilter/nf_conntrack_max: nonexistent directory
insmod: can't insert '/lib/modules/kmdir/kernel/drivers/net/rt_rdm/rt_rdm.ko': invalid module format
insmod: can't insert '/lib/modules/kmdir/kernel/drivers/net/raeth/raeth.ko': invalid module format
insmod: can't insert '/lib/modules/kmdir/kernel/net/netfilter/nf_conntrack_proto_gre.ko': invalid module format
insmod: can't insert '/lib/modules/kmdir/kernel/net/netfilter/nf_conntrack_pptp.ko': invalid module format
insmod: can't insert '/lib/modules/kmdir/kernel/net/shortcut-fe/shortcut-fe.ko': invalid module format
insmod: can't insert '/lib/modules/kmdir/kernel/net/shortcut-fe/shortcut-fe-cm.ko': invalid module format
init.d/rcS: line 56: can't create /sys/sfe_ipv4/max_connections: nonexistent directory
insmod: can't insert '/lib/modules/ipt_STAT.ko': invalid module format
insmod: can't insert '/lib/modules/tp_domain.ko': invalid module format
insmod: can't insert '/lib/modules/pppol2tp.ko': invalid module format
insmod: can't insert '/lib/modules/l2tp_ppp.ko': invalid module format
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
mii_mgr: ioctl error
/etc # init.d/rcS: line 74: can't open '/dev/null'
和用firmadyne工具运行结果相同,查看固件包中的proc文件夹,
是空的
运行httpd服务,也未成功
/etc # httpd
/etc # [ dm_shmInit ] 086: shmget to exitst shared memory failed. Could not create shared memory.
[ dm_acquireLock ] 252: lock failed, errno=22 rc=-1
固件仿真启动和httpd服务启动失败的原因估计是因为路由器在启动中,部分调用资源在其他硬件flash中,缺少服务支持导致固件运行失败。
0x03 解决方案
现在想到的有两个方案:
1. 在虚拟机中补充必要的支持文件
2. 在完整硬件真机环境进行调试