Last updated
Last updated
Mở đầu
Giải này là giải đầu năm 2023 mà team mình chơi, giải này chủ yếu nặng về Reverse về mảng web chỉ có 2 bài nếu bạn nào đam mê Reverve thì có thể xem blog bạn mình có viết wu của giải này ở .
Ở bài này thì GET flag từ API về thì lúc truy cập vào link giao diện là một chuỗi json như này.
Nó hiện ra mình không thể GET nó được mình sẽ dùng curl để post một cái gì đó lên trang web.
Như message thông báo thì cần gửi cho nó một url thì chúng ta cũng sử dụng curl để post lên.
Nó trả về cho chúng ta một link để truy cập và lấy flag.
Khi truy cập vào trang web chúng ta có thể thấy được giao diện như sau:
Theo đề bài thì web này được code bởi framwork Flask thì những lỗ hổng liên quan tới Flask thường sẽ là SSTI, Path or Directory traversal/Local File Inclusion ....
Mình đã check nhưng trang web lỗi SSTI nhưng không có lỗi gì xảy ra hình như parameter không nhận, mình nghĩ nó là lỗi khác có thể là LFI (Vì trong source code có parameter là filename). Mình sử dụng Burp Suite để check.
Nếu như chúng ta thay đổi parameter xem có lỗi gì xảy ra hay không ?
Xong!!! Lỗi ngoại lệ xuất hiện như này:
Một phần trong chế độ Werkzeug debug mode thì có thể xem được đoạn code chứa parameter đó:
Phân tích đoạn code trên chúng ta thấy được trang web dính lỗi Local File Inclusio/Path Traversal
Ngoài ra khi truy cập một file name khác ngoài home thì cũng xuất hiện lỗi không tìm thấy template như dưới:
Oke, quay lại lỗi Local File Inclusio/Path Traversal mà trang dính phải, như đoạn code trên chúng ta đã phân tích thì filename được replace các ký tự nói đúng hơn được decode url 2 lần nên bypass filter ../ bằng cách double encode url.
Lúc này chúng ta sẽ gửi nó lên xem có thể khai thác không ?
Nhưng có một điều lạ lùng là khi double encode thì submit trực tiếp trên trang thì nó hiện ra thư mục nhưng qua Brup Suite thì không mà cần thêm một lần encode nữa thì mới xuất hiện.
Vậy là đã khai thác thành công lỗi LFI, bây giờ chúng ta sẽ thử dọc file app.py trong thư mục app mà chúng ta đã biết ở phần trên:
Đọc thành công đoạn code file app.py:
Sau một lúc thử đọc cái file khác nhau để kiếm flag từ thư mục home và app thì nhận ra không tồn lại một file nào flag.txt, lúc này để có thể đọc được toàn bộ file của máy chủ trên thì chúng ta cần RCE. Nhìn đoạn code trên thì tác giả để debug=True thì lúc đó chúng ta có thể RCE qua debug console:
Chúng ta sẽ xem xét đoạn code generate PIN code ở phía:
Và giá trị cần để có thể exploit là đoạn code này:
Vậy là những dữ liệu chúng ta cần khai thác có thể khai thác được từ lỗi LFI như sau:
Lúc đầu chạy payload nhưng nó cho mã PIN sai nhưng một lúc đọc kỹ thì thấy:
Payload cuối cùng như sau: (Thay hàm băm md5()->sha1())
Sau khi chạy file trên chúng ta có PIN-CODE: 695-086-043
Truy cập vào console để RCE: (Done)
RCE thành công thì việc kiếm flag quá dễ dàng:
Cảm ơn các bạn đã đọc bài viết!!! Hẹn gặp lại ở giải tiếp theo...👌
Console sẽ thường bị khóa đi và cần mã pin để mở nó ra, sau một lúc research thì mình đọc được ở trang bypass Pin Code.