CVE-2019-16278-Nostromo Web Server遠程代碼執行


本文主題主要是分析CVE-2019-16278漏洞原因、漏洞如何利用以及為什么會受到攻擊。這個CVE跟Nostromo Web服務器(又名nhttpd)有關,這個組件是在FreeBSD,OpenBSD等Unix系統上非常流行的開源Web服務器。

Nostromo無法驗證URL,導致可以通過路徑遍歷系統中的任何文件。沒有通過身份驗證的攻擊者可以強制服務器指向/bin/sh之類的shell文件並執行任意命令。由於所有Nostromo的版本(包括最新版本1.9.6)都很容易受到攻擊,甚至其開發人員的網站www.nazgul.ch也可以利用。

Nostromo之前也有路徑遍歷漏洞,未授權遠程代碼執行CVE-2011-0751。在URI解碼的轉義字符之前,Web服務器會先檢查URI中的字符串/../,然后RedTeam Pentesting GmbH發現了這個漏洞。將字符/編碼為%2f並將其傳遞給服務器,如下所示:
/..% 2f .. %2f .. % 2fbin/sh

雖然Nostromo在檢查字符串/../之前解碼轉義字符來修復1.9.4版中的CVE-2011-0751,但是仍然被sp0re繞過,並且CVE-2019-16278可以返回Nostromo路徑遍歷的結果。

在野利用:

Shodan上使用以下查詢語句可以找到大約2000個暴露於互聯網上的Nostromo Web服務器:

"Server: nostromo"

可以使用Python編寫的PoC對一些服務器驗證漏洞,實際上這些所有服務器都可以被攻擊。

EXP發送了一個HTTP請求,URI中帶有/.%0d./.%0d./.%0d./.%0d./bin/sh。 跟CVE-2011-0751對比,只是將%2f更改為Nostromo沒有檢查到的字符%0d

那么系統為什么可以用含有%0d ./.% 0d./而不是../../這樣的回車符(CR)去遍歷上層目錄。 其實系統接收到沒有任何CR字符的../../。 那么,那些CR字符哪里去了?

這些疑問可以通過分析Nostromo源碼得到答案,Nostromo 1.9.6版本源代碼(http://www.nazgul.ch/dev/nostromo-1.9.6.tar.gz)。

源碼分析:

當接收到URI,先進行驗證然后進行處理。

在http_verify()函數里,這個URI先是被http_decode_header_uri()函數解碼,然后檢查/../.是否存在。這個URI現在是/.\r./.\r./.\r./.\r./bin/sh.

接下來,在http_proc()函數中,將URI傳給http_header()函數

根本原因在這里,在http_header()函數中,通過strcutl()函數解析URI。

看一下strcutl()函數的實現,可以看到是接收一個字符串並以\ r(回車)被截斷了返回。

現在路徑是/../../../../bin/sh。 那么路徑遍歷部分完成了之后又怎么被執行呢?是因為http_proc()函數中的execve()函數。 執行rh-> rq_filef時,實際值是路徑/../../../../bin/sh

這個漏洞就是這么通過路徑遍歷實現RCE的!

參考

https://www.sudokaikan.com/2019/10/cve-2019-16278-unauthenticated-remote.html


免責聲明!

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



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