CVE-2017-17215(华为HG532远程命令执行漏洞)复现学习

VSole2021-09-17 17:01:22

固件和exp都已经放在这个地方了:https://gitee.com/p1piyang/backward-analysis/tree/master/

建议先通一遍文章再动手复现,复现之前一定要保存虚拟机快照,防止出现各种问题。

一、解压固件

直接使用binwalk -Me HG532eV100R001C02B015_upgrade_main.bin命令来直接解压固件文件。

解压完成后,在固件同文件夹下可以看到解压出来的文件夹。

文件夹中的squashfs-root就是我们需要的文件系统了,如果squashfs-root中没有下图的各种文件系统,就是你的binwalk有不完整,去看iot固件分析环境搭建。

二、配置网络

我们要让qemu虚拟机和我们的ubuntu互通。

安装网络配置工具:

apt-get install bridge-utils uml-utilities
修改ubuntu网络配置文件 /etc/network/interfaces/

sudo vim 你一定会把!

内容改成如下,图下提供了复制粘贴的代码(贴心人):

# interfaces(5) file used by ifup(8) and ifdown(8)auto loiface lo inet loopback auto ens33iface ens33 inet manualup ifconfig ens33 0.0.0.0 up auto br0iface br0 inet dhcp bridge_ports ens33bridge_maxwait 0
创建或修改qemu的网络接口启动文件脚本/etc/qemu-ifup

如果没有这个文件直接创建就可以了,如果有的话将里边内容清空,然后写入下面脚本:

#!/bin/sh# Script to bring a network (tap) device for qemu up.# The idea is to add the tap device to the same bridge# as we have default routing to. # in order to be able to find brctlecho "Executing /etc/qemu-ifup"echo "Bringing $1 for bridge mode..."sudo /sbin/ifconfig $1 0.0.0.0 promisc upecho "Adding $1 to br0..."sudo /sbin/brctl addif br0 $1sleep 3

然后依次执行如下操作:

#启动桥接网络赋予可执行权限sudo chmod a+x /etc/qemu-ifup#重启网络服务,使配置生效(注意这个地方配置正常之后,如果你是mac,可能会让你输入mac密码,windows我不知道)sudo /etc/init.d/networking restart#关闭ens33,启动桥接网络br0(这里如果显示eth0不存在没关系,直接启动br0)sudo ifdown eth0sudo ifup br0

如图所示,当前网卡为br0。

配置完之后,如果下面qemu虚拟机配置之后,仍然无法获取ip,重启ubuntu。

三、配置qemu虚拟机

先去下载debian-mips-qemu镜像文件,每次固件分析要注意对应大小端序的镜像文件(还是有设备的好)。

下载地址:https://people.debian.org/~aurel32/qemu/mips/

我们需要红框里的两个文件,然后在文件所在地方启动qemu。

这里特别说明,最后一个参数-nographic带上是在终端中直接运行,不会弹出窗口运行,建议一定不要开,我这里开了之后这个窗口的返回快捷键和vmware的一模一样,就导致我只能在mac和qemu中间用,我回不去我的ubuntu了。
sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic,macaddr=00:16:3e:00:00:01 -net tap -nographic

如果你的多次运行qemu,可能会出现如下错误:

这是服务没有退出导致的。

ps查出当前qemu进程号,kill掉就好了。

ps -e | grep 'qemu'

sudo kill 3307

即可。

启动如上图,账号密码都是root。

启动后尝试,ping baidu.com 和 ubuntu。

如果不通,

ifconfig -a

查看网卡第一个是什么,一般都会是eth1。

然后修改/etc/network/interfaces,注意这里是在qemu虚拟机中修改。

nano /etc/network/interfaces

第一次配置红框中一般是eth0,将红框中的内容修改为你的网卡名字。

保存后使用下面指令重启eth1。

ifup eth1

再次尝试,如果还不行或者ifconfig发现eth1没有分配地址,重启ubuntu或者找原因,不行就恢复快照。

如果成了的话是可以用ssh远程连接qemu虚拟机的。

ssh root@虚拟机ip

建议在ubuntu中使用ssh连接,比较方便。

接下来将我们解压出来的文件系统拷贝到qemu。

scp -r ./squashfs-root  root@虚拟机ip:/root/

四、复现

通过checkpoint报告中能看到关键字为ctrl和Deviceupgrade,端口号为37215。

使用grep来查找:

两个都指向upnp这个文件,端口号指向mic这个文件。

直接运行会出问题,我们切换根目录到拷贝进来的系统文件中。

chroot /root/squashfs-root /bin/sh

然后先后运行upnp和mic。

到这个地方mic已经运行成功了,放着不用管他了。

使用lsof -i:37215可以查看端口是否运行。

用下面命令来查看是否启动成功:

nc -vv 192.168.150.9 37215

成功了就可以跑exp了。

与checkpoint不同的是,我把溢出的命令修改了(红框处,这里就是灵活使用了),蓝框处修改为qemu的ip。

执行exp后 在mic界面可以看到:

ls被成功执行了。

五、原因分析

Ida7.5可以反编译qemu。

通过exp能发现,命令行放在了NewStatusURL标签下,在ida中通过字符串查找。

 

49c的位置使用快捷间p可以创建函数,来反编译。

snprintf函数将可变个参数按照format格式化成字符串,然后将其复制到str中,即把v5与前面字符串拼接放到v6中,并且system执行了v6。

根据exp的执行效果来推测,ATP_XML_GetChildNodeByName这个函数读取NewStatusURL标签的内容放到了v5。

伪代码不可信,尽量还是通过汇编代码分析。

倒推能发现,system的参数为0x42C+var_414($sp)。

0x42C+var_414($sp)为snprintf 的第一个参数,0x42C+var_40C($sp)为snprintf的第四个参数。

即 0x42C+var_40C($sp)的内容通过函数放到了0x42C+var_414($sp)。

而0x42C+var_40C($sp)为ATP_XML_GetChildNodeByName的一个参数,这里应该是读取后放到了0x42C+var_40C($sp)。

没有办法ATP_XML_GetChildNodeByName做具体分析,但通过网上一些师傅的文章,应该大差不差了。

然后了解原理我们就可以通过闭合来实现命令运行了。

qemuroot权限
本作品采用《CC 协议》,转载必须注明作者和本文链接
kernel-pwn之ret2dir利用技巧
前段时间打了场PWN2WIN,期间遇到了这道BIOS题,正好来学习一下UEFI PWN。
Kernel pwn CTF 入门 – 1
2021-10-21 16:39:08
01简介内核 CTF 入门,主要参考 CTF-Wiki。02环境配置调试内核需要一个优秀的 gdb 插件,这里选用 gef。
Kernel PWN从入门到提升
2023-03-23 10:17:57
所以我决定用此文章结合一道不错的例题尽可能详细的来讲一下kernel pwn从入门过渡到较高难度的部分,供想要学习kernel pwn的小伙伴们参考。文件系统kernel题一般都会给出一个打包好的文件系统,因此需要掌握常用到的打包/解包命令。
能运行的环境包括I/O,权限控制,系统调用,进程管理,内存管理等多项功能都可以归结到上边两点中。需要注意的是,kernel 的crash 通常会引起重启。注意大多数的现代操作系统只使用了 Ring 0 和 Ring 3。
然而在内核态中,堆内存的分配策略发生了变化。并把这个slab划分为一个个object,并将这些object组成一个单向链表进行管理,这里需要注意slub系统把内存块当成object看待,而不是伙伴系统中的页。本次选择演示的例题是2019-SUCTF的sudrv例题,查看start.sh中的信息可以发现开启了kaslr保护与smep保护。
之前花过一段时间研究群晖的NAS设备,并发现了一些安全问题,同时该研究内容入选了安全会议POC2019和HITB2021AMS。
可是当我们开启了smap保护之后,内核态就没有办法访问用户态的数据,此时当我们再hijack tty_operation到我们的用户态时,我们的kernel就会panic,更别说劫持执行流到用户态上执行rop了。当我们调用msgsnd时,在linux内核中会调用do_msgsnd。
安装Linux系统最小化,即选包最小化,yum安装软件包也要最小化,无用的包不装。开机自启动服务最小化,即无用的服务不开启。Linux系统文件及目录的权限设置最小化,禁止随意创建、更改、删除文件。在生产环境中,删除多余的账户信息。
关于MIPS架构的寄存器及指令集请自行查阅资料,这里就不多作介绍了。,则也会在prologue处保存下来,并在epilogue处取出。流水线指令集相关特性MIPS架构存在“流水线效应”,简单来说,就是本应该顺序执行的几条命令却同时执行了,其还存在缓存不一致性(cache
VSole
网络安全专家