Mini-challenge: Xâu chuỗi 3 lỗ hổng chiếm quyền máy chủ
Thử thách độc lập: Kết hợp liên hoàn Open Redirect, Blind SSRF và SSTI trên hệ thống mô phỏng để chiếm vỏ shell và nộp báo cáo hoàn chỉnh.
TL;DR: Đây là bài kiểm tra năng lực tổng hợp của Khóa 3. Bạn được giao nhiệm vụ kiểm thử một hệ sinh thái microservices bao gồm một Web Portal công cộng và một Admin Dashboard nội bộ. Bằng cách kết hợp lỗi Open Redirect trên Portal để lừa bộ kiểm tra URL của dịch vụ Webhook (SSRF), bạn sẽ gửi một request POST mang template động vào API nội bộ (SSTI), từ đó thực thi mã lệnh và trích xuất cờ quản trị. Cuối cùng, bạn sẽ viết một bản báo cáo tóm tắt kèm remediation diff chuẩn.
1. Giới thiệu kịch bản thử thách
Nhớ lại mô hình Exploit Graph: Khi các dịch vụ nội bộ không xác thực và phụ thuộc vào tường lửa biên, một lỗi SSRF kết hợp với Open Redirect sẽ biến dịch vụ biên thành bàn đạp tấn công.
Nhớ lại quy chuẩn viết script PoC: Quản lý phiên bằng requests.Session, truyền tham số URL động và xử lý lỗi mạng mượt mà.
Nhớ lại cấu trúc báo cáo CVSS: Tính toán chính xác các hệ số cơ sở và cung cấp Remediation Diff chuẩn kiến trúc.
Hệ thống mục tiêu bao gồm hai dịch vụ mô phỏng:

Dưới đây là mã nguồn app.py chạy toàn bộ hệ thống giả lập:
# app.py - Multi-tier Vulnerable Architecture
import urllib.parse
from fastapi import FastAPI, HTTPException, Request
from jinja2 import Template
import requests
import uvicorn
app = FastAPI()
# Internal service state (listening on port 9000 simulated in-memory)
FLAG = "FLAG{CH41N1NG_M4ST3R_0P3N_R3D1R3CT_SSRF_SST1_PWN3D}"
# 1. Edge Web Portal (Port 8000)
@app.get("/portal/redirect")
def open_redirect(target: str):
# Vulnerability 1: Open Redirect
return {"status": "redirecting", "location": target}
@app.post("/portal/webhook-test")
def trigger_webhook(payload: dict):
url = payload.get("callback_url", "")
# Vulnerability 2: Flawed SSRF validation - only checks host prefix
parsed = urllib.parse.urlparse(url)
if not parsed.netloc.endswith("portal.local") and parsed.netloc != "127.0.0.1:8000":
raise HTTPException(status_code=400, detail="Domain must belong to portal.local")
# Follows redirect automatically by default
try:
resp = requests.get(url, timeout=3, allow_redirects=True)
return {"status": "webhook_dispatched", "response_preview": resp.text[:100]}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
# 2. Internal Microservice (Protected, conceptually at port 9000)
@app.get("/internal/admin/render")
def admin_template_render(template: str):
# Vulnerability 3: SSTI in internal engine
try:
t = Template(template)
rendered = t.render(flag=FLAG)
return {"status": "rendered", "content": rendered}
except Exception as e:
return {"error": str(e)}
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1", port=8000)
2. Nhiệm vụ của bạn
Nhiệm vụ 1: Dựng môi trường & Trinh sát mã nguồn
- Cài đặt thư viện:
pip install fastapi uvicorn requests jinja2. - Khởi động ứng dụng:
python3 app.py. - Xác định cơ chế phòng thủ:
- Endpoint
/portal/webhook-testchặn mọi URL không có domain kết thúc bằngportal.localhoặc127.0.0.1:8000. - Endpoint
/internal/admin/renderchỉ được thiết kế cho mạng nội bộ nhưng nằm cùng process/server với ứng dụng.
- Endpoint
Nhiệm vụ 2: Viết script xâu chuỗi (Exploit Script)
Viết script solve.py thực hiện:
- Tạo một URL hợp lệ với bộ lọc SSRF: trỏ vào
http://127.0.0.1:8000/portal/redirect?target=.... - Tham số
targetbên trong chuyển tiếp request tới/internal/admin/render?template={{flag}}. - Bắn request POST tới
/portal/webhook-test. - Nhận kết quả phản hồi chứa Flag bí mật từ phản hồi của webhook preview.
Nhiệm vụ 3: Viết báo cáo tóm tắt kèm Remediation Diff
- Tính điểm CVSS v3.1 vector string cho toàn bộ chuỗi khai thác.
- Viết bản vá Remediation Diff cho endpoint
/portal/webhook-test(tắtallow_redirects=Falsevà phân giải DNS kiểm tra IP riêng tư).
3. Không gian nháp và gợi ý hướng đi
Trước khi xem đáp án mẫu, hãy chú ý:
- Tham số trong URL query string cần được mã hóa URL (URL encode) cẩn thận khi lồng nhau qua hai tầng redirect:
urllib.parse.quote(). - Nếu template engine render trực tiếp
{{flag}}, bạn có thể lấy Flag mà không cần phải gọi shell thực thi lệnh hệ thống.
4. AI Copilot Slot: Prompt hỗ trợ kiểm tra URL encoding trong Exploit Chaining
Tôi đang viết script khai thác chuỗi SSRF + Open Redirect + SSTI:
- Endpoint tiếp nhận: http://127.0.0.1:8000/portal/webhook-test (POST json callback_url)
- Endpoint redirect: http://127.0.0.1:8000/portal/redirect?target=<ENCODED_INTERNAL_URL>
- Endpoint đích: http://127.0.0.1:8000/internal/admin/render?template={{flag}}
Hãy viết một hàm Python ngắn sử dụng urllib.parse.quote để dựng chính xác giá trị callback_url sao cho server khi nhận và bám theo redirect không bị lỗi parse tham số template.5. Bẫy tư duy thường gặp
- Quên URL Encode tham số bên trong: Nếu bạn viết
.../portal/redirect?target=http://.../render?template={{flag}}, ký tự?và&thứ hai sẽ bị server cắt xén coi như tham số của/portal/redirectthay vì truyền vàotarget. Bắt buộc phải dùngquote_plus(internal_url). - Nghĩ rằng SSRF chỉ khai thác được khi có Out-of-Band (OOB): Trong kịch bản này, server trả về
resp.text[:100]trong response của webhook test. Đây là In-band SSRF (Full Response Reflection), không cần máy chủ lắng nghe bên ngoài.
6. Liên hệ các bài khác
- Bài trước: Nghệ thuật Exploit Chaining: Biến lỗi Low thành Critical RCE — Khung lý thuyết về Exploit Graph.
- Bài tiếp theo: Tổng kết module Exploit Chaining & Hoàn thành Khóa học — Đánh giá năng lực và nhận chứng nhận hoàn thành.
- Kiến thức liên quan: Server-Side Template Injection (SSTI) — Ôn lại các cú pháp template injection nâng cao.
- Q1Đáp án mẫu mã khai thác (Nhiệm vụ 2): Script Python giải bài lab này như thế nào?
- Q2Đáp án mẫu bản vá Remediation Diff (Nhiệm vụ 3): Cách sửa hàm trigger_webhook an toàn?
- Q3Vector CVSS v3.1 chính xác cho chuỗi lỗ hổng này là gì?
Viết Báo cáo Bug Bounty & Pentest: CVSS, Impact và Remediation
Bài tiếpTổng kết module Exploit Chaining & Báo cáo Chuyên nghiệp
Bài này có giúp bạn hiểu bản chất không?
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Thảo luận & góp ý
Hỏi đáp về bài này