當前位置:
首頁 > 最新 > 中間件安全-Tomcat安全測試概要

中間件安全-Tomcat安全測試概要

Web安全中很重要的一個部分就是中間件的安全問題,而中間件的安全問題主要來源於兩部分,一個是中間件本身由於設計缺陷而導致的安全問題,另一個就是默認配置或錯誤配置導致的安全風險。本文作為逢魔安全團隊中間件安全風險系列對外公開文章將詳細對Tomcat的常見安全風險進行分析歸納。

版本管理

類似於Tomcat這種軟體項目官方一般都維護了多個版本分支,一般新的產品特性會被更新在最新的大版本當中,而類似於修復bug及漏洞這種就會在舊版本的分支當中得以更新。這就允許開發人員在不破壞生產環境的情況下軟體更新。

比如你正在使用的是Tomcat 5.5.26,那麼你應該在5.5分支中尋找新的版本(例如5.5.27),升級到這個bug修復版本。當然如果在性能或功能特性上沒有新需求時,也是不用升級到tomcat6.0的。

因此,對於Tomcat的使用者來說應該密切關注Apache Tomcat官方的安全漏洞和新版本的發布通知並進行及時升級更新。

運行環境

首先我們必須保證Tomcat不能以高系統許可權去運行,比如Linux下的root用戶和Windows下的Administrator用戶或用戶組。我們需要為Tomcat進程創建一個專用的用戶,並為該用戶提供運行所需的最低系統許可權,包括我們需要根據業務需求去詳細分配Tomcat涉及的安裝目錄和應用目錄文件夾的讀、寫及執行的許可權。這樣一來我們就能極大提高攻擊者的攻擊成本,比如攻擊者通過其他漏洞或缺陷所獲得的許可權只能是tomcat許可權而不是系統最高許可權,若想要進一步攻擊則只能進行提權操作。

另外我們還需要保證tomcat系統用戶的密碼口令符合一定的複雜度要求甚至是禁止遠程登錄。

安全配置

Example Applications

Tomcat安裝後需要刪除CATALINA_HOME/webapps下的所有文件 (ROOT, balancer,jsp-examples, servlet-examples, tomcat-docs, webdav),以免信息泄露和其他的安全風險。比如示例servlet和JSP的「/examples」目錄,會話session servlet(安裝在/ examples / servlets / servlet / SessionExample)允許進行session操作,因為session是全局的,所以這個servlet會帶來很大的安全風險,因為攻擊者可能通過操縱會話來強製成為應用系統的管理員。但這種基本上只有在一些很老的不安全的系統中才有可能出現。

Manager Console

從CATALINA_HOME/webapps中刪除host-manager和manager後台管理程序。但如果需要在不重新啟動Tomcat的情況下重新部署或部署新的web應用時可以選擇保留,但需要一個足夠強的管理口令,在tomcat-user.xml中配置。

Tomcat Manager 4種角色的大致介紹(下面URL中的*為通配符):

Tomcat管理後台使用BASIC認證,在http請求頭中有一個Authorization欄位,賬號密碼為「賬號:密碼」的方式經過base64編碼。

在測試後台賬號認證時可以使用枚舉賬號口令的方法,自己編寫腳本或使用一些現有工具實現,比如msf或burpsuit的Intruder模塊.

1. manager-gui

Tomcat管理控制模塊中最常見的就是manager-gui,訪問路徑為/manager/html,具有部署應用的功能,惡意攻擊者常使用該功能部署war文件的webshell後門程序。

選擇需要部署的war文件點擊deploy後即可完成部署,可以在應用列表中點擊相應的應用名完成webshell訪問

另外在某些場景下也可能用到伺服器的本地部署,若一個web應用結構為WebAppAppNameWEB-INF*,利用控制台進行部署的方式如下:進入tomcat的manager控制台的Deploy directory or WAR filelocated on server區域——在Context path中鍵入"XXX"(可任意取名)——在WAR or Directory URL:鍵入WebAppAppName (表示去尋找此路徑下的web應用)——點擊deploy按鈕。

然後在%Tomcat_Home%webapps路徑下將會自動出現一個名為XXX的文件夾,其內容即是WebAppAppName的內容,只是名字是XXX而已(這和tomcat的自動部署方式一致)

2. manager-script

Tomcat manager-script的遠程部署應用的功能也可以被惡意攻擊者利用,通過以下命令請求即可完成應用後門部署。

通過/list可以查看已成功部署的應用

另外也有大量敏感信息泄露的風險

攻擊者關注的其他頁面還有:

3. manager-status

manager-status主要是一些只讀的tomcat運行狀態信息,除了信息泄露外五其他可操作行的風險。

4. manager-jmx

manager-jmx為TomcatJMX代理介面,是一個小型的servlet,它可以按以下列格式接收JMX Query、Get、Set和Invoke命令:

HTTP://:/manager/jmxproxy/qry=YOURQUERY

HTTP://:/manager/jmxproxy/set =YOURCOMMAND

當我們默認直接訪問tomcat提供的JMX介面時(http://localhost:8080/manager/jmxproxy/?qry=)會出現所有的MBeans。

如果想要具體的MBeans只需要將其name後面的值放在url的後面實際的命令是使用特殊字元的URL編碼以標準JMX語法編寫的,惡意攻擊者可以通過該介面讀取tomcat用戶密碼甚至添加用戶。

危害最大的是攻擊者可以通過jmxproxy執行任意jsp代碼導致遠程代碼執行,方法如本文JMX Service小節中所講的方法一致,通過incoke命令調用rotate函數將訪問日誌備份到指定文件的方法,最終執行任意代碼。

Admin Console

Tomcat 5及之前版本存在admin模塊,提供了類似於Weblogic、Websphere等商用應用中間件的管理功能,可以方便的實現對Tomcat服務、部署的應用程序、連接池以及其他資源的管理,但不能用來部署應用程序,Tomcat Admin功能作為一個獨立的模塊,從5.5版本開始作為一個可選模塊,在默認情況下是不安裝的,需要進行手工安裝,通過/admin路徑訪問控制台。

在admin後台惡意攻擊者除了獲取伺服器信息外,主要利用的兩個惡意操作是磁碟文件讀取和添加tomcat管理賬號。首先磁碟文件讀取是通過Service->host->actions->CreateNew Context建立虛擬目錄,Document Base填你想瀏覽的目錄,比如c:,Path可以自定義,例如/formsec,然後直接//ip/formsec 就可以看到c盤內容。

另外在User Definition中可以對Tomcat的用戶進行管理,比如添加賬號及許可權等。

JMX Service

Java Management Extension (JMX)服務用來遠程監視和管理的Tomcat伺服器,如果對外開放並且是空口令或者弱口令的話會產生很多安全問題,通過JavaRemote Method Invocation (RMI)進行交互。該服務在Tocmat中默認是不開啟的,需要對Catalina.bat/Catalina.sh做一些簡單更改。

此JMX服務可以配置為支持身份驗證,但默認情況下未啟用。啟用身份驗證時(如始終建議的那樣),其授權模型允許訪問屬於只讀或讀寫角色的兩個不同用戶。

如果需要授權,添加並更改此項:

-Dcom.sun.management.jmxremote.authenticate=true

-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password

-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access

編輯訪問授權文件$CATALINA_BASE/conf/jmxremote.access:

monitorRolereadonly

controlRole readwrite

編輯密碼文件$CATALINA_BASE/conf/jmxremote.password:

monitorRole tomcat

controlRole tomcat

從上面可以看出,jmxremote.access文件包含兩個用戶名(monitorRole和controlRole)及其相關角色。然後,jmxremote.password將這些用戶的密碼設置為tomcat。始終建議對此服務啟用身份驗證,並且使用複雜口令。

具體請查考:

http://tomcat.apache.org/tomcat-8.0-doc/monitoring.html#Enabling_JMX_Remote

可以通過nmap來發現開啟JMX服務的埠,但nmap無法確認是否開啟認證。

遠程訪問該埠服務可以使用jdk自帶的jconsole或者1.6出來的jvisualvm

選擇遠程進程輸入jmx服務的ip地址和埠進行連接,其中涉及大量的tomcat伺服器敏感信息,包括管理控制台弱口令

當然也可以進行一些控制操作,比如在MBeans-->Catalina--->WebModule--->應用程序名稱--->Operations--->stop 關閉指定的應用程序(start啟動)

如果有寫許可權的tomcat用戶可以寫入後門惡意代碼等,其中的 Catalina->Valve->localhost->AccessLogValve->Operations表明rotate函數用於將Tomcat訪問日誌的副本保存到伺服器上的文件中。

在這裡有個缺陷,newFileName定義的文件名可以使用任意目錄和文件名後綴,利用日誌備份拿webshell的思路,我們可以將含有惡意代碼的請求日誌備份在web應用目錄下獲取webshell。

首先看一下如何獲取應用路徑,VM概要中存在tomcat的所在路徑,配合webapp列表就可以構造出來。

因此在此例中我們可以將日誌備份在/usr/local/tomcat/webapps/100/formsec.jsp,拿到webshell。

注意在調用rotate時是不能創建目錄的,如果文件存在不會覆蓋原文件內容,也不會新建文件。

如果tomcat運行在windows伺服器中,並且tomcat是以域用戶賬號運行的,那麼newFileName定義為\192.168.5.1 est則可能捕獲到用戶hash進行破解。

還有一個可以被黑客惡意利用的操作是listSessionIds(),可以用於劫持除了tomcat manager應用外的每個web應用程序中用戶的jsessionid,該操作同樣需要寫許可權,位於Catalina->Manager->[ApplicationName]->Operations->listSessionIds()

AJP Listenner

Tomcat最主要的功能是提供Servlet/JSP容器,儘管它也可以作為獨立的Java Web伺服器,它在對靜態資源(如HTML文件或圖像文件)的處理速度,以及提供的Web伺服器管理功能方面都不如其他專業的HTTP伺服器,如IIS和Apache伺服器。因此在實際應用中,常常把Tomcat與其他HTTP伺服器集成。

Tomcat有兩個連接器,一個連接器監聽8080埠,負責建立HTTP連接。在通過瀏覽器訪問Tomcat伺服器的Web應用時,使用的就是這個連接器。第二個連接器監聽8009埠,負責和其他的HTTP伺服器建立連接,在把Tomcat與其他HTTP伺服器集成時,就需要用到這個連接器。

(圖片轉自:《Tomcat Port 8009 與AJP13協議》)

AJP是為Tomcat與HTTP伺服器之間通信而定製的協議,能提供較高的通信速度和效率。在配置Tomcat與HTTP伺服器集成中。

在某些場景下如果8080因防火牆等原因被限制訪問但是開放了8009,就會被攻擊者惡意利用,用apache等伺服器進行集成,繞過8080埠的訪問限制

使用ajp進行集成配置。

註:參考https://diablohorn.com/2011/10/19/8009-the-forgotten-tomcat-port/

Debug Mode

Tomcat在進行遠程調試時需要開啟debug模式,在調試器和JVM之間使用JDWP進行通信。Tomcat的debug默認是不開啟的,需要手動配置,默認埠為8000。

debug模式對外開放非常危險,攻擊者可直接通過JDWP執行系統命令

安全漏洞

CVE-2017-12615& CVE-2017-12617

一般情況下,tomcat不允許put上傳jsp文件,但在tomcat7.0.0 to 7.0.79版本中,存在一處缺陷,windows環境下可通過NTFS文件數據流「::DATA」的方式來繞過進行jsp文件的上傳,以及通過「::$INDEX_ALLOCATION」來創建文件夾等,這部分知識可以參考https://msdn.microsoft.com/en-us/library/windows/desktop/aa364404(v=vs.85).aspx。

後續我和xfk及xxlegend在對該漏洞進行fuzz的時候發現windows環境中「test.jsp.」、"test.jsp%20"、"test.jsp/"等方式均可實現上傳並能成功解析執行,而重要的是這幾個poc是無版本限制。當然我們也對linux平台的各版本tomcat進行了相同的fuzz操作,發現「test.jsp/」也可以成功上傳並解析,因此該漏洞也就影響了Tomcat全版本,這也就是後來的CVE-2017-12617。

CVE-2017-12616

該漏洞與CVE-2017-12615同時被發現,並且利用方式也類似,如果Tomcat在conf/server.xml配置了VirtualDirContex參數來掛載虛擬目錄,訪問者通過構造請求訪問jsp等web資源時,Tomcat就會將VirtualDirContext提供支持資源中相對應文件的內容以文本形式返回,造成源代碼泄露。

對於Windows伺服器使用test.jsp%20和test.jsp::$DATA獲得源代碼,但無法通過test.jsp/獲取源代碼,不影響linux系統。

CVE-2016-8735

這個漏洞實質還是JMX反序列化漏洞,Tomcat同樣也用了JmxRemoteLifecycleListener這個監聽器,但是Tomcat在Oracle修復這個漏洞後自己沒有及時更新,導致了反序列還依舊存在。

影響版本:

Apache Tomcat 9.0.0.M1 to 9.0.0.M11

Apache Tomcat 8.5.0 to 8.5.6

Apache Tomcat 8.0.0.RC1 to 8.0.38

Apache Tomcat 7.0.0 to 7.0.72

Apache Tomcat 6.0.0 to 6.0.47

Earlier, unsupported versions may also beaffected.

遠程命令執行效果如下

關於該漏洞的具體復現可以參考我之前的一篇文章

http://reverse-tcp.xyz/2016/12/10/Apache-Tomcat-Remote-Code-Execution(CVE-2016-8735)/

2018

HAPPY NEW YEAR

開工大吉!充滿生機的一年迎春而來,春天孕育著希望,承載著夢想,逢魔安全團隊的小夥伴們精神煥發,已做好充分準備迎接新的挑戰和機遇。感謝大家對逢魔安全團隊成立以來的密切關注,新的一年我們規划了很多,接下來就是腳踏實地砥礪前行了,最後同樣祝大家在新的一年裡事業有成、學習進步,取得新成就!


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

萌賤斗圖表情甩起來!表情包上線啦!
以太眾籌的奇蹟(1)

TAG:全球大搜羅 |