Skip to content
· 4 min read

Maze Maze Mazeee

CTF Write-up

Quick Nav
BKSEC_training Hidden

Maze Maze Mazeee

Challenge Information

  • Category: Web Exploitation
  • Event: BKSEC training 2026
  • Author: bksec
  • Difficulty: Hidden
  • Tags: #web #Script

1. Description

Warming up by escaping the maze is very common in CTF competitions.

2. Overview

Bài này round 1 sẽ cho một giao diện với các thẻ html đè lên nhau và yêu cầu người chơi phải tìm ra thẻ có đường dẫn đến page tiếp theo, round 2 sẽ bắt người chơi phải tìm flag trong các directory và thử nhiều flag để tìm ra flag thật.

3. Reconnaissance round 1

  • Truy cập vào trang web và thấy dòng chữ Are you robot.

-> nghĩ ngay đến /robots.txt

  • Sau khi truy cập vào /robots.txt ta thấy được một đoạn base64 encode như sau:

-> decode base64 ta được: /pages/page-1-Tombstone.html

  • Truy cập vào đường dẫn trên ta sẽ thấy giao diện gồm nhiều thẻ html css xếp chồng lên nhau

  • Nếu để thế này rất khó nhìn nên ta mở code lên đọc luôn

  • Có rất nhiều thẻ như thế này, dự đoán sẽ có 1 thẻ nào đó chứa nội dung -> Ctrl + F search <a thử xem sao

  • Đã tìm thấy đường dẫn đến page tiếp theo, copy paste vào url để đi tiếp

  • Lần này cũng tương tự, dự đoán với dạng bài này sẽ có rất nhiều page -> viết script để tự động hóa việc khai thác

4. Exploitation round 1

  • Ta sẽ viết script sao cho tự động hóa việc tìm kiếm nội dung sau đó gán thẳng vào url để đi đến trang tiếp theo rồi lại tiếp tục lặp lại quy trình đó cho đến khi không thể tìm thấy nữa.
  • Python script:
import requests  
from bs4 import BeautifulSoup  
  
url = "http://103.77.175.40:8031/pages/page-1-Tombstone.html"  
base_url = "http://103.77.175.40:8031/pages/"  
  
while True:  
    try:  
        print(f"{url}")  
        response = requests.get(url, timeout=5)  
        response.raise_for_status()  
  
        soup = BeautifulSoup(response.text, 'html.parser')  
  
        # Tìm thẻ <a> đầu tiên có thuộc tính href  
        next_tag = soup.find('a', href=True)  
  
        if next_tag:  
            href = next_tag['href']  
            # Cập nhật URL mới  
            if href.startswith('page'):  
                url = base_url + href  
            else:  
                print("end")  
                break  
  
    except Exception as e:  
        print(f"Lỗi xảy ra: {e}")  
        break
  • Đến trang thứ 101 là kết thúc

  • Trang cuối là thông báo đã vượt qua round 1 và chuyển sang round 2

5. Reconnaissance round 2

  • Truy cập vào PROCEED TO ROUND 2 ta sẽ thấy giao diện gồm các thư mục và mỗi thư mục lại có những thư mục con và các tệp nội dung đi kèm:

-> ta cũng sẽ viết script để khai thác round này

6. Exploitation round 2

  • Script ở round này sẽ dùng BFS quét toàn bộ file để tìm flag:
import requests  
from bs4 import BeautifulSoup  
import urllib.parse  
  
start_url = "http://103.77.175.40:8031/round2_qncdl1248dbsl/"  
  
visited = set()  
results = []  
  
def bfs(url):  
    normalized_url = url.rstrip('/')  
  
    if normalized_url in visited:  
        return False  
  
    print(url)  
    visited.add(normalized_url)  
  
    try:  
        response = requests.get(url, timeout=5)  
        response.raise_for_status()  
  
        if "BKSEC" in response.text:  
            print("có flag")  
            results.append(response.text.strip())  
  
        soup = BeautifulSoup(response.text, 'html.parser')  
        links = soup.find_all('a')  
  
        for link in links:  
            href = link.get('href')  
  
            # Loại bỏ link điều hướng cơ bản  
            if not href or href in ["../", "./", "/"] or href.startswith("?"):  
                continue  
  
            # Tạo URL đầy đủ  
            next_url = urllib.parse.urljoin(url, href)  
  
            # Chỉ đi tiếp nếu URL thuộc cùng domain và cùng path gốc của Round 2  
            if next_url.startswith(start_url):  
                if bfs(next_url):  
                    return True  
  
    except Exception as e:  
        return False  
  
    return False  
bfs(start_url)  
for item in results:  
    print(item)

Kết quả:

-> Thử từng flag để lấy flag thật

$ ls ./related/