研究人員最近發現,Java和Python運行時都存在漏洞,它們未能正確驗證FTP URL中的特殊字符,最終導致黑客甚至能夠繞過防火墻訪問本地網絡。
上周六,安全研究員Alexander Klink公布了一種很有趣的攻擊方式,他利用Java應用中的XXE(XML External Entity)漏洞發送郵件。XXE漏洞就是欺騙應用去解析構建的XML文件,從而讓XML解析器泄露敏感信息如文件、目錄列表甚至是服務器上運行的進程。
Klink演示相同類型的漏洞還可以用來欺騙Java runtime向遠程服務器發起FTP連接,URL形式是:
ftp://user:password@host:port/file.ext
結果發現Java FTP客戶端并不會過濾特殊的CR和LF字符,而會解析這些字符。CRLF的意思就是回車(CR, ASCII 13, ) 換行(LF, ASCII 10, )。在FTP URL中插入這些字符會導致Java FTP客戶端執行這些命令,甚至還可以執行SMTP (Simple Mail Transfer Protocol)命令,因為SMTP與FTP語法很相似。
Klink的演示中,黑客可以利用漏洞強迫Java程序向SMTP服務器發送郵件。
Klink在博客介紹了攻擊場景:“當你能從一臺能夠解析XML的服務器連接到一臺無限制(甚至沒有垃圾郵件、病毒郵件過濾)的內部郵件服務器時,這個攻擊就會非常有意思。”
Python和Java的新漏洞
看到Klink的攻擊后,來自Blindspot Security的研究員Timothy Morgan又公開了一種類似的攻擊方式,這種攻擊方式能夠針對Java和Python的FTP——由于該攻擊可被用來繞過防火墻,因此更為嚴重。
Morgan把攻擊稱為“通過惡意URL的FTP協議流注入”,這種攻擊和利用了缺少CRLF過濾特性注入惡意FTP命令的方法是類似的。
Morgan沒有注入SMTP 命令,而是利用了FTP PORT命令讓客戶端連接FTP服務器的指定TCP端口。
安全人員指出,很多基于Linux的全狀態數據包檢測型防火墻(SPI),包括商業防火墻,會支持傳統模式的FTP,當檢測到來自客戶端的FTP流量中的PORT命令時就會自動打開TCP端口,并且轉發到那個FTP客戶端的局域網IP。
這種攻擊向量已經存在多年,所以conntrack的開發者們會加入額外的檢查步驟,conntrack是一套大部分防火墻都會用到的Linux工具。加入檢查之后,端口只會在PORT命令出現在TCP包開始的時候打開,這樣就能確保真的是客戶端發送了命令。
此處對黑客而言,攻擊需要解決兩個問題:
1. 發現客戶端的內部IP地址,從而偽造PORT命令;
2. 調整客戶端與服務器端的TCP包,讓PORT命令落到包的開頭
Morgan稱他已經找到了解決這兩個問題的方法,就是通過“通過惡意URL的FTP協議流注入”,并且他已經開發了PoC exp打算在Oracle和Python修復FTP客戶端代碼后公開。
“整個攻擊(包括判斷受害者內部IP的請求)是通過三個SSRF(服務器端請求偽造)實現的,這三個攻擊打開了TCP端口”,Morgan周一在博客中說到,“每次額外的SSRF攻擊都可以打開一個新的TCP端口。”
利用方法
利用漏洞的方法有很多,包括攻擊那些安裝了Java的用戶。用戶甚至都不需要執行惡意Java applet,因為exp可以通過Java Web開始程序傳送。
“如果一個安裝了Java的桌面用戶訪問了一個惡意網站,即使Java applet被關閉,還是可以觸發Java Web Start解析JNLP文件,文件中可以包含惡意FTP代碼,從而觸發漏洞。”
攻擊者還可以利用中間人或者利用SSRF/XXE漏洞來攻擊那些運行Java應用的服務器。
Morgan表示,他成功攻擊了運行最新內核的Linux防火墻,而來自Palo Alto Networks和思科的防火墻在默認設置下也未能幸免。雖然只測試了兩款商業防火墻,但他預計受此影響的防火墻不在少數。
安全建議
建議防火墻廠商在Java和Python工程師修復漏洞之前關閉傳統的FTP轉換模式。
用戶應該禁用瀏覽器的Java插件并且取消.jnlp文件與Java Web Start的關聯。同時,對Java和Python應用應該審計SSRF和XXE漏洞。
*參考來源:NetworkWorld,本文作者:Sphinx,轉載請注明來自FreeBuf(FreeBuf.COM)