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