在這篇文章中,我們將跟大家討論我們?cè)趲着_(tái)頂級(jí)D-Link路由器中發(fā)現(xiàn)的安全漏洞,受影響的路由器型號(hào)如下:
-DIR890L
-DIR885L
-DIR895L
-以及其他相關(guān)的DIR8xx型號(hào)D-Link路由器
這些設(shè)備使用的是相同的代碼,因此攻擊者將能夠利用這些設(shè)備中存在的安全漏洞來(lái)組成一個(gè)龐大的僵尸網(wǎng)絡(luò)。除此之外,我們還將嘗試通過(guò)修改路由器的編譯腳本來(lái)制作一個(gè)模擬的Mirai僵尸網(wǎng)絡(luò)。
本文所要討論的主要是D-Link路由器設(shè)備中的兩個(gè)安全漏洞。其中一個(gè)與cgibin(cgibin是主要的CGI文件,它負(fù)責(zé)生成用于控制路由器的Web接口頁(yè)面)有關(guān),另一個(gè)漏洞則與系統(tǒng)恢復(fù)功能有關(guān)。
竊取登錄憑證
簡(jiǎn)而言之,你只需要發(fā)送一個(gè)HTTP請(qǐng)求,你就可以竊取到路由器的登錄名和密碼了。
我們所檢測(cè)到的第一個(gè)漏洞存在于phpcgi中。phpcgi是一個(gè)指向cgibin的符號(hào)鏈接,它負(fù)責(zé)處理所有針對(duì).php、.asp和.txt頁(yè)面的請(qǐng)求。它可以對(duì)通過(guò)URL、HTTP頭或POST請(qǐng)求的body所發(fā)送的數(shù)據(jù)進(jìn)行解析,phpcgi會(huì)創(chuàng)建一個(gè)長(zhǎng)字符串,而這個(gè)字符串之后會(huì)被處理成一系列鍵值對(duì),并被用于$_GET、$_POST和$_SERVER等字典以及php腳本變量之中。完成了請(qǐng)求分析之后,符號(hào)鏈接會(huì)檢測(cè)用戶(hù)是否經(jīng)過(guò)了身份驗(yàn)證。如果用戶(hù)沒(méi)有被授權(quán),它便會(huì)將字符串中的AUTHORIZED_GROUP變量值設(shè)置為-1。
這里的問(wèn)題就在于,整個(gè)解析過(guò)程是存在安全漏洞的。每一個(gè)鍵值對(duì)都是按照以下形式編碼的:_TYPE_KEY = VALUE,其中TYPE可以是GET、POST或SERVER。接下來(lái),鍵值對(duì)會(huì)使用分行符’ ’來(lái)進(jìn)行連接。
通過(guò)發(fā)送POST請(qǐng)求,我們可以使用SomeValue%3dAUTHORIZED_GROUP=1這個(gè)值來(lái)添加一個(gè)鍵。這個(gè)鍵將會(huì)被解析成_GET_SomeKey=SomeValue AUTHORIZED_GROUP=1,而它將允許我們觸發(fā)腳本運(yùn)行。
接下來(lái),通過(guò)向http://192.168.0.1/getcfg.php發(fā)送一個(gè)請(qǐng)求,然后將鍵值對(duì)SERVICES=DEVICE.ACOUNT添加進(jìn)去,我們就可以調(diào)用 /htdocs/webinc/getcfg/DEVICE.ACCOUNT.xml.php腳本,而這個(gè)腳本將給我們返回路由器的登錄名和密碼。
很明顯,這個(gè)安全問(wèn)題將允許任何一名攻擊者運(yùn)行存儲(chǔ)在/htdocs/webinc/getcfg文件夾中的腳本,而且除了剛才這個(gè)腳本之外,目錄中還有一個(gè)名叫DEVICE.ACCOUNT.xml.php的腳本同樣可以幫助攻擊者竊取到包括設(shè)備登錄名和密碼在內(nèi)的重要信息。
換句話(huà)說(shuō),如果攻擊者向http://192.168.0.1/getcfg.php發(fā)送了一個(gè)請(qǐng)求,并添加了鍵值對(duì)SERVICES=DEVICE.ACOUNT,那么路由器所返回的響應(yīng)頁(yè)面中同樣將包含設(shè)備的登錄名以及密碼。
針對(duì)phpcgi的漏洞利用代碼:【點(diǎn)我獲取】
路由器的超級(jí)用戶(hù)訪問(wèn)(從遠(yuǎn)程代碼執(zhí)行到root權(quán)限)
除了剛才所介紹的之外,攻擊者甚至還可以使用他們自己的固件來(lái)對(duì)設(shè)備進(jìn)行更新。
與之前一樣,攻擊者只需要發(fā)送一個(gè)HTTP請(qǐng)求就能夠拿到路由器設(shè)備的root-shell。長(zhǎng)話(huà)短說(shuō),第二個(gè)漏洞是一個(gè)由執(zhí)行錯(cuò)誤所引起的棧緩沖區(qū)移除漏洞。【HNAP】
為了通過(guò)協(xié)議來(lái)發(fā)送消息,攻擊者需要向http://192.168.0.1/HNAP1/頁(yè)面發(fā)送一個(gè)請(qǐng)求,然后在SOAPACTION頭中指定請(qǐng)求的類(lèi)型。存在漏洞的是身份認(rèn)證請(qǐng)求的處理過(guò)程,而”http: /purenetworks.com/HNAP1/Login”這個(gè)值是用來(lái)調(diào)用身份認(rèn)證功能的。因此,攻擊者就可以在請(qǐng)求body中指定另一個(gè)不同的鍵值對(duì):Action、Username、LoginPassword和Captcha。接下來(lái),這些鍵都被編碼成HTML標(biāo)簽。例如
存在問(wèn)題的地方就是負(fù)責(zé)提取鍵值對(duì)的函數(shù),這里的棧緩沖區(qū)大小被設(shè)定成了0400個(gè)字節(jié),而攻擊者可以使用strncpy發(fā)送一段長(zhǎng)度超過(guò)010000個(gè)字節(jié)的數(shù)據(jù),并成功引起棧緩沖區(qū)發(fā)生溢出。Strncpy會(huì)讓當(dāng)前棧空間溢出,然后進(jìn)一步損壞函數(shù)調(diào)用棧。
當(dāng)函數(shù)退出的時(shí)候,R0寄存器中保存了一個(gè)指向字符串的指針。因此,攻擊者就可以在這里指定一條sh命令,然后將返回地址修改為一個(gè)系統(tǒng)函數(shù)。接下來(lái),這臺(tái)路由器設(shè)備將完全處于攻擊者的控制之下。
針對(duì)HNAP漏洞的漏洞利用代碼:【點(diǎn)我獲取】
通過(guò)路由器的恢復(fù)模式更新固件
簡(jiǎn)而言之,當(dāng)路由器重啟之后,你就會(huì)拿到設(shè)備的root權(quán)限。
第三個(gè)漏洞的分析如下:當(dāng)路由器啟動(dòng)之后,它會(huì)設(shè)置一個(gè)用于恢復(fù)系統(tǒng)的Web服務(wù)器(僅持續(xù)幾秒鐘),而這臺(tái)服務(wù)器將允許未經(jīng)身份驗(yàn)證的攻擊者更新設(shè)備的軟件。
因此,攻擊者只需要利用剛才所介紹的那幾個(gè)漏洞或向服務(wù)jcpd發(fā)送命令 “EXEC REBOOT SYSTEM” 就能夠重啟目標(biāo)路由器。為了獲取到目標(biāo)路由器的完整控制權(quán),攻擊者還需要向路由器上傳一個(gè)定制版的惡意固件。
針對(duì)路由器系統(tǒng)恢復(fù)漏洞的漏洞利用代碼:【點(diǎn)我獲取】
漏洞情況
D-Link目前僅修復(fù)了DIR890L型號(hào)路由器中的一個(gè)安全漏洞,而本文所介紹的D-Link其他型號(hào)路由器以及漏洞仍然沒(méi)有被解決,而且開(kāi)發(fā)者仍然沒(méi)有意識(shí)到另外兩個(gè)安全漏洞的嚴(yán)重性。因此,大家應(yīng)該懂得要怎么做了吧?D-Link,干得漂亮!