Hi xin chào mọi người.
Đã khá lâu rồi mình mới lên bài lại. Hôm nay mình xin phép chia sẻ với mọi người cách làm thế nào để hack và truy cập thành công tài khoản của bạn dev trong team đang quản lí Web labs.codetoanbug.com.
Để dễ hiểu 1 chút nó là CVE đến từ CTFd và những ai thường chơi CTF thì sẽ biết CTFd khá là thân thuộc, vì phần lớn chúng đều xây dựng dựa trên CTFd.

Mình đã Report cho MITRE và họ đã cấp CVE cho mình về lỗ hổng này. Nếu Report sớm thì CVE 2024. Bởi vì Report Vendor CTFd đã bị họ reject và họ chỉ chấp nhận bản sửa lỗi, đổ lỗi người dùng rằng phải tự cấu hình Secure cho nginx để phòng chống lỗi Host Header Injection. Theo quy chuẩn của Web Developerment đối với “Policy: Secure By Design and Secure By Default.” Hay nói cách khác phải có quy chuẩn về bảo vệ hệ thống ngay từ khi phát triển thay vì cần người dùng tự cấu hình. Điều quan trọng nhất đó là CTFd không có đề cập về việc cần Secure Config Nginx trong Docs hoặc Readme.md cho việc bảo vệ Host Header. Mình sẽ vào về POC và cách Security lỗ hổng này nhanh nhất có thể.
Việc đầu tiên là đây là lỗ hổng về Reset Password Poisoning Via Host Header Injection có thể tuỳ ý tấn công đặt lại mật khẩu của user và admin. Việc đầu tiên của mình là xác minh Token Reset Password có nằm ở Path hay không. Sau khi Reset Password với Account User thì thật sự là Token nằm trên Path. Đây là điều đầu tiên cần xác minh vì cho dù có lỗi Host Header Injection nhưng Reset Password mà Token không nằm ở Path khả năng cao không thể khai thác.

Tiếp theo mình sẽ thay đổi Host Header của request trang web labs.codetoanbug.com để xem thử có thể tấn công hay không.

Server đã chấp nhận Host của Burp Collaborator của Burp Suite Pro. Điều đáng chú ý ở đây là tại sao khi gửi như vậy mà Burp Collaborator không trả về bất kì Response nào? Đây là 1 điều quan trọng. Mình xác minh thông qua việc Show Response, thì phát hiện rằng nó không hề thay đổi thành Host của Collaborator. Nhưng về vốn cơ bản không render ra, không đồng nghĩa không có lỗ hổng! Vì vậy mình đã thử nghiệm tấn công thực tế. Bạn Dev quản lí web labs vô tình công khai Mail trên Linkedin, thông tin bị lộ. Trên Linkedin bạn đặt là làm việc tại Code Toàn Bug, nên mình tra ra mail và tiến hành tấn công Reset Password Poisoning Via Host Header Injection.

Tiếp đó chúng ta gửi sang Repeater và thay đổi Host Header thành Burp Collaborator.

Mình đã gửi yêu cầu Reset Password đến bạn Dev trong team và đã chờ tầm gần 5 phút. Mình vừa phát hiện bạn ấy truy cập Discord, và thật may mắn bạn Dev đã bấm vào link. Sau đó mình đã có thông tin trả về phía Burp Collaborator.

Tiếp đó mình sẽ copy và di chuyển sang phần Chromium để tiến hành đặt lại mật khẩu của Admin labs.codetoanbug.com.

Cuối cùng Bùmm. Mình đã truy cập vào tài khoản của bạn Dev, sau đó thay đổi Email ở phần Setting. Tài khoản đã thuộc về mình!
Về việc tại sao bạn Dev lại Click thì chắc do vấn đề tò mò hay gì đó..vv. Đôi khi các Dev sẽ không được học về Security. Đôi khi họ chỉ biết code tối ưu về các vấn đề được học cũng như đi làm rút ra được. Ở đây mình không nói toàn bộ 1 phần mà thôi! Đừng hiểu lầm nhé. Vẫn có rất nhiều bạn Dev vẫn biết Security mặc dù không được dạy.

Giờ mình sẽ cung cấp code sửa lỗi đối với người muốn sử dụng Public SRC của CTFd.
import os
import re
from flask import request, abort
from CTFd import create_app
ALLOWED_HOSTS = {
"example.com", #change real domain
"192.168.1.1", #change public ip server
}
ALLOWED_PROXIES = {"127.0.0.1", "192.168.1.1"} #change public ip server
BLOCKED_HOST_REGEX = re.compile(r"^(localhost|127\.0\.0\.1|0\.0\.0\.0|::1|local)$", re.IGNORECASE)
app = create_app()
@app.before_request
def strict_host_protection():
host = request.headers.get("Host", "").split(":")[0]
forwarded_host = request.headers.get("X-Forwarded-Host", "").split(":")[0]
remote_addr = request.remote_addr
forwarded_for = request.headers.get("X-Forwarded-For", "").split(",")[0].strip()
real_ip = forwarded_for if forwarded_for else remote_addr
if forwarded_host and forwarded_host not in ALLOWED_HOSTS:
print(f"[SECURITY] 🚨 block: {forwarded_host} -> {real_ip}")
abort(400)
if remote_addr in ALLOWED_PROXIES:
if BLOCKED_HOST_REGEX.match(host) or host not in ALLOWED_HOSTS:
print(f"[SECURITY] 🚨 block: {host} -> {real_ip}")
abort(400)
else:
abort(400)
if __name__ == "__main__":
app.run(debug=False, threaded=True, host="127.0.0.1", port=4000)
Sau khi áp dụng code này, vui lòng chạy với Gunicorn, bởi vì hệ thống không khuyến khích chạy trực tiếp! Sau đó bạn sẽ thấy rằng việc tấn công trở nên bất khả thi, bởi vì gửi các Request độc hại không nằm trong list thì sẽ là 404 Not Found. Dĩ nhiên chẳng thể Reset Password Poisoning!


Để chắc chắn hơn mình đã thử Bypassing Security Mechanisms để thử tấn công Host Header Injection và chẳng có tác dụng gì cả. Nó vẫn trả về là host của server thật(đây là account user của mình).
Outro: Kết luận cuối cùng hiện tại mình đang liên hệ MITRE xin phép đánh giá Scope CVSS của bug này mình đã thử đánh giá dựa trên thông tin mình POC và đánh giá về mã nguồn(không chắc chắn 100%)

Vector String – CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:L
NOTE: Và 1 lần nữa cảm ơn các bạn Hacker có thể gọi là Lỏ đã liên tục tấn công Web Labs, làm mình phải ngồi kiểm tra SRC của CTFd và vô tình phát hiện ra bug này. Thật sự lần này các bạn giúp ít cho mình rất nhiều. Cảm ơn! Hãy tấn công tiếp đi mình sẽ tìm thêm CVE mới. 😍