White-Box Auditing & Săn Bug Thực Chiến
~15 phútExploit Chaining & Báo cáo Chuyên nghiệpMiễn phí

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 —

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 —

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 —

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:

Kiến trúc Hệ thống Mục tiêu trong Thử thách Mini-challenge Xâu chuỗi RCE

Dưới đây là mã nguồn app.py chạy toàn bộ hệ thống giả lập:

Python
# 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

  1. Cài đặt thư viện: pip install fastapi uvicorn requests jinja2.
  2. Khởi động ứng dụng: python3 app.py.
  3. Xác định cơ chế phòng thủ:
    • Endpoint /portal/webhook-test chặn mọi URL không có domain kết thúc bằng portal.local hoặc 127.0.0.1:8000.
    • Endpoint /internal/admin/render chỉ được thiết kế cho mạng nội bộ nhưng nằm cùng process/server với ứng dụng.

Nhiệm vụ 2: Viết script xâu chuỗi (Exploit Script)

Viết script solve.py thực hiện:

  1. 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=....
  2. Tham số target bên trong chuyển tiếp request tới /internal/admin/render?template={{flag}}.
  3. Bắn request POST tới /portal/webhook-test.
  4. 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

  1. Tính điểm CVSS v3.1 vector string cho toàn bộ chuỗi khai thác.
  2. Viết bản vá Remediation Diff cho endpoint /portal/webhook-test (tắt allow_redirects=False và 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

AI Copilot Prompt Slot
Role:Exploit Developer
Task:Hỗ trợ mã hóa URL lồng nhau nhiều cấp cho kịch bản SSRF qua Open Redirect
Context:Endpoint nhận callback_url chuyển hướng sang endpoint nội bộ nhận template string
Output:Đoạn script Python kiểm tra và mã hóa đúng số lần urllib.parse.quote
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/redirect thay vì truyền vào target. Bắt buộc phải dùng quote_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

Tự kiểm tra
0/3 câu đã trả lời
  1. 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?
  2. 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?
  3. Q3
    Vector CVSS v3.1 chính xác cho chuỗi lỗ hổng này là gì?

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

Bài tiếp theo

Tổng kết module Exploit Chaining & Báo cáo Chuyên nghiệp