totolink登陸跳過—分析思路
型號:X5000R(http://www.totolink.cn/home/menu/newstpl.html?menu_newstpl=products&id=65)
AX1800 無線雙頻千兆路由器(http://www.totolink.cn/home/menu/newstpl.html?menu_newstpl=products&id=65)
下面有分析思路,設備模擬過程比較靠近新手,師傅們可以直接跳到后面分析過程。
一
漏洞

登陸頁面構造參數,無需密碼。
formLoginAuth.htm?authCode=1&action=login(http://192.168.0.1/formLoginAuth.htm?authCode=1&userName=admin&goURL=home.html&action=login)
可直接繞過登陸,進入后臺。


產生原因在lighttpd wen服務文件from_login函數中。

if (iVar2 == 0) { iVar1 = strcmp((char *)&sa58,"ie8"); if (iVar1 == 0) { pcVar1 = "/login_ie.html"; } else { iVar1 = atoi((char *)&sa58); if (iVar1 == 1) { pcVar2 = "/login.html"; pcVar1 = "http://%s%s%s"; pcVar3 = "/phone"; LAB_409114: sprintf(param_2,pcVar1,acStack1860,pcVar3,pcVar2); return 1; } pcVar1 = "/login.html"; } sprintf(param_2,"http://%s%s",acStack1860,pcVar1); return 1; }
上面代碼是登陸檢查,當iVar2=1的時候,直接跳過檢查,不需要登陸。
iVar2的值是autoCode參數的值,所以構造autoCode=1即可繞過。
二
模擬
下面是詳細分析思路。
今天偶然發現這款非常小眾的路由器,至于多小眾,我分析這款官方月銷15臺。
我分析的這款是 AX1800,官方可以直接下載固件。
這款固件超級適合新手第一次分析使用。
binwalk分析:
binwalk TOTOLINK_C8343R-1C_X5000R_IP04433_MT7621A_SPI_16M256M_V9.1.0u.6118_B20201102_ALL.web

squashfs文件系統,uImage,LZMA壓縮文件中應該也是個比較大的內容,直接使用-Me參數遞歸提取。
binwalk -Me TOTOLINK_C8343R-1C_X5000R_IP04433_MT7621A_SPI_16M256M_V9.1.0u.6118_B20201102_ALL.web

里面有標準的文件系統。
查看架構:
binwalk ./bin/busybox

mips小端序,查看其文件系統瞅瞅有沒有什么東西。
有個工具叫firmwalker,可以自動分析文件系統,提取重要文件,我個人覺得不是特別好用。
我比較推薦使用vscode來做分析。
下面是要關注的一些地方:
etc/ #這里會存放系統啟動文件如openwrt的rcS文件sbin/ #這里一般會存放廠商制作的功能性文件和提供web服務的文件www/ #這里會存放一些web靜態頁面和后臺服務文件文件
其他地方也盡量看一下,經驗多了就容易清楚哪些文件是做什么的了,沒經驗就慢慢來。
這里發現了這幾個文件:



可以看到他使用了lighttpd 的web服務文件。
一般固件大概會有這幾個輕量級httpd文件:lighttpd,httpd,uhppd。
其他的還有很多。
嘗試使用qemu-user模擬http服務。
cp (which qemu-mipsel-static) ./sudo chroot . ./qemu-mipsel-static ./usr/sbin/lighttpd

這里的報錯是需要用-f參數指定配置文件,上面已經發現了lighttpd.conf文件。
sudo chroot . ./qemu-mipsel-static ./usr/sbin/lighttpd -f ./lighttp/lighttpd.conf

沒有這個文件,這里我們先去把這個路徑改一下,在lighttpd.conf中。

把它改到固件的系統文件中./var/run/lighttpd.pid,并且去創建這個文件。
運行:

這里雖然正常啟動,但是如果不掛載文件夾,還是挺多問題的,所以我更傾向使用系統模式。
這里系統模式不做贅述,我寫了個腳本,可以很方便啟動。
核心文件比較大,大家按文件自行下載:
https://people.debian.org/~aurel32/qemu/mips/
我把腳本放鏈接放這里:
https://gitee.com/p1piyang/backward-analysis/tree/master/
qemu啟動:
sudo ./start-mipsel.sh
sudo 啟動:
ifconfig eth0 192.168.5.12 up #qemu中設置ip,qemu里邊
將文件系統上傳:
scp -r squashfs-root/ root@192.168.5.12:/root/ #在主機
掛載:
chroot ./squashfs-root/ /bin/sh
啟動:
./user/sbin/lighttpd -f ./lighttp/lighttpd.conf

三
分析
剛開始是想直接去分析lighttpd的。隨手登陸了一下,看了下包。
我個人淺薄的經驗,不要單純去無目的的分析某個應用,我之前犯過這種錯誤,太容易對著一個程序漫無目的的亂逛,希望你沒有這種情況。
這里明顯可以看到調用了cgi文件,之前看文件的時候看到了這個東西的。

可以去分析下這個文件。
ghidra open!!! Link 死大頭!!! search "action"!!!

action=login,交叉引用,看一下。

說實話,ghidra的這個偽代碼看著老奇怪了,這里是判斷了登陸還是升級。

if下面,這里判斷flag=1,最后的邏輯是將字符串格式化到acStack4456中。

再往下這個地方我剛開始比較懵了,因為websGetVar程序查找表變量var,相當于獲取參數。所以這里并沒有往下看,而是換了個思路點。
這里知道了他是對登陸做了個判斷。
去查找登陸的請求參數。


發現了這么個地方,根據登陸的包。

發現他返回了一串地址。并且主動訪問了這串地址。

所以這個地方是判斷密碼的地方。本來想試試正確密碼,來分析下,結果密碼怎么都不對。
這里解釋下,因為我沒有設備,是直接在官網下載的固件,所以這個密碼怎么都不對,我懷疑是固件模擬的問題,就沒有往下追究。
他主動訪問了formloginAuth.htm,在www/文件夾下并沒有這個文件,所以去找下lighttpd文件分析下。
ghidra open!!! Link 死大頭!!! search "formLoginAuth"!!!

跟進from_Login函數:

這里就發現了參數處理。

判斷幾個參數做了什么,userName是空的先不看,goURL是某個html文件,盲猜他是的從哪來的,action是要做什么。
所以現在要看一下authCode。
如果authCode不等于0,iVar2就等于整形的authCode的值。
往下分析:

這里改成1之后直接,跳過了這個判斷。
但是只吧這個改為1之后還是返回到登陸界面。

這里pcVar2=1,導致跳過了設置pcVar2 = home.html。
所以我猜測goUrl參數不是從哪來,而是從哪去。
最后發現果然是哦。
其實在ghidra反編譯的時候,好多地方不太習慣,很多地方靠函數名和字符串硬猜。