CVE-2017-17215(華為HG532遠程命令執行漏洞)復現學習
固件和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做具體分析,但通過網上一些師傅的文章,應該大差不差了。
然后了解原理我們就可以通過閉合來實現命令運行了。