DF Cyber Defense 2023 – Reproduce RCE bug

Đầu tháng 10 vừa qua, DF Cyber Defense 2023 – cuộc thi thường niên về Diễn tập tấn công phòng chủ trên không gian mạng cho lĩnh vực Ngân hàng, tài chính tại Việt Nam đã được tổ chức. Kết thúc cuộc thi, team SHF – đại diện cho SHB Finance giành chức vô địch và có mô tả sơ bộ về quá trình thi thông qua một bài viết trên blog của team. Trong phần thi tấn công, team có đề cập tới việc BTC đưa ra các gợi ý có các lỗ hổng có thể RCE, tuy nhiên do giới hạn về mặt thời gian nên mới có 1 lỗ hổng được team tìm thấy. Từ source code được chia sẻ, chúng tôi dựng lại môi trường và tìm kiếm các lỗ hổng có thể có, tập trung chủ yếu vào các lỗ hổng trong ứng dụng cho phép kẻ tấn công RCE.

Giao diện của bài thi mô tả một dịch vụ Web với đa dạng các chức năng. Thử thách yêu cầu người dùng đăng kí trước khi truy cập vào trang, giao diện của Web sau khi đăng nhập như sau:

BUG 1: RCE thông qua chức năng upload file ảnh (Image Sharing)

Giao diện của chức năng Image Sharing cho phép người dùng tải lên (upload) các file định dạnh ảnh lên server. Với Web có tính năng upload như này, công nhân pentest như chúng tôi thường nảy số thử upload các file định dạng khác định dạng file ảnh, cụ thể trong trường hợp này, chúng tôi upload lên một file với phần mở rộng (extension) là .php và xem thử kết quả

Như ảnh trên, phía server có kiểm tra phần mở rộng của file được upload lên, file được upload lên không thành công và trả về kết quả Invalid file extension!. Chúng tôi thử lại với một số extension khác, trong đó có .PhP, kết quả có thể upload file thành công như hình ảnh dưới đây:

Sau khi đã bypass được phần kiểm tra extension, vẫn với phần mở rộng đó, thử thay đổi tiếp content file với nội dung như sau <?php system($_GET["cmd"]); ?>   và gửi lại request, kết quả trả về không thành công. Có vẻ bên phía server cũng có những function kiểm tra nội dung trong file.

Thử thay đổi loại dữ liệu sang image/jpeg, shell đã được upload thành công. Tuy nhiên khi thử truy cập đến shell test5.PhP thì chỉ trả về content của file. Để xử lý phần này, người dùng chỉ cần truy cập vào test5.php, lý do bởi trong một số trường hợp, tên file trong PHP sẽ không phân biệt viết hoa hoặc viết thường. Gửi request đến test5.php và lấy được flag

Cách khác: Có một cách khác cũng có thể RCE được ở tính năng này, do tính năng chỉ filter extension .php trong quá trình upload, attacker có thể thực hiện upload file .htaccess với cấu hình tùy chỉnh, cụ thể ở trường hợp này là cấu hình cho các file với phần mở rộng .phtml có thể thực thi. Nội dung bên trong file .htaccess sử dụng SetHandler để đặt loại handler cho các tệp, tất cả file có extension là .phtml đều được xử lý bởi module mod_php để chạy code PHP

Upload một file webshell với phần mở rộng là .phtml chúng ta cũng sẽ RCE được ứng dụng, kết quả tương tự như ở cách upload file PhP

BUG 2: RCE thông qua chức năng Tạo và xem CV (Create & View your CV)

Create & View your CV tính năng cho phép người dùng tạo cũng như chỉnh sửa CV, ngoài ra cũng cho phép người dùng tải xuống các mẫu CV đã tạo khi chọn chức năng “Tải về’, endpoint /cv-editor/pdf.php sẽ được trigger để xử lý công việc này. Chúng ta có thể lạm dụng endpoint này nhằm khai thác lỗ hổng RCE

 

Thay đổi content file bằng nội dung một file webshell, với tên file test6.php, file được upload thành công. Tuy nhiên, response trả về cho thấy tên file không còn là test6.php mà được đổi thành một chuỗi ngẫu nhiên với phần mở rộng file là .pdf. Kết hợp với phân tích source code, chúng ta có thể thấy ứng dụng thực hiện thêm một unique ID trước tên file, chuyển tệp đó tới thư mục “/files”. Sau đó sử dụng kết quả ở biến $html_file_name để thực hiện tạo pdf rồi trả về filepath (files/652cbbe5a429.pdf) của tệp pdf vừa được tạo. Do ứng dụng không thực hiện xóa file webshell được upload mà chỉ thêm một chuỗi ID định danh vào trước tên file, do đó ta vẫn có thể truy cập tới webshell.

BUG 3: RCE thông qua wkhtmltopdf trong chức năng Tạo và xem CV (Create & View your CV)

Cùng endpoint ở BUG 2, chúng tôi thấy ứng dụng tồn tại một lỗ hổng khác trong wkhtmltopdf – một opensource cho phép tự động trích xuất dữ liệu từ HTML sang định dạng PDF. Để làm rõ hơn về wkhtmltopdf, xét một ví dụ nhỏ dưới đây:

Đoạn code trên thực hiện chuyển đổi các file từ định dạng HTML sang PDF sử dụng wkhtmltopdf, lưu trong biến command, biến này được thực thi thông qua hàm shell_exec(). Trong trường hợp này, nếu control được biến $command (cụ thể là tên file người dùng có thể truyền vào, có thể dẫn đến command injection)

Quay trả lại với ứng dụng, do có thể control được tên file, tận dụng command inject trong wkhtmltopdf thử curl để request tới burp collaborator, kết quả trả lại trong Burp có ghi nhận các request được gửi tới

Tiếp tục thử upload webshell, tại đường dẫn hiện tại /var/ww/html/cv-editor/ ,đường dẫn hiện tại này sẽ không cho phép ghi file (có thể kiểm tra thông qua pwd), để có thể ghi và access vào webshell chúng ta cần upload file vào đường dẫn /var/ww/html/cv-editor/files và get flag thông qua webshell này

 

BUG 4: RCE thông qua chức năng JS-fiddle 

Tính năng của ứng dụng cho phép chạy các đoạn code nodejs như hình ảnh dưới đây:

Ở đây, tính năng chạy nodejs sử dụng vm2, một dạng vm opensource giúp ứng dụng an toàn hơn khi các code được thực thi trong môi trường sanbox. Điều này có thể kiểm chứng khi chúng ta thử một đoạn code nodejs thực hiện lệnh whoami thông qua module child_process, response trả về thông báo “require is not defined”.

vm2 trước phiên bản 3.9.17 có tồn tại lỗ hổng CVE-2023-32314 cho phép escape sandbox để thực thi code trên môi trường host, ở ứng dụng này, vm2 đang sử dụng phiên bản 3.9.15 nên cũng bị ảnh hưởng bởi lỗ hổng. Mã khai thác cũng như cách thức cũng đã được mô tả đầy đủ tại đây: https://gist.github.com/arkark/e9f5cf5782dec8321095be3e52acf5ac

Sử dụng lại payload, với tham số trong child_process thực hiện đọc file flag, ta thu được kết quả như hình ảnh dưới đây

Trên đây là 4 lỗ hổng RCE mà thành viên trong Redteam thực hiện reproduce lại, bên cạnh các lỗ hổng RCE, ứng dụng vẫn tồn tại một số lỗ hổng khác, ví dụ:

  1. Tại tính năng tạo CV: tồn tại lỗ hổng server side XSS cho phép đọc tệp tùy ý trên server.
  2. Tại tính năng CLOUD PASSWORD STORAGE: tính năng sử dụng mật mã yếu, không an toàn, cho phép attacker có thể bruteforce passcode để giải mã mật khẩu mà admin lưu.
  3. Tại tính năng IMAGE SHARING: tồn tại lỗ hổng đọc file tùy ý, dẫn đến đọc được flag cũng như source code của các dịch vụ khác.
  4. Tại tính năng SCREENSHOT WEBSITE: tồn tại lỗ hổng SSRF, có thể cho phép truy cập vào được các server khác (ví dụ môi trường doanh nghiệp, lỗ hổng này có thể giúp truy cập vào các website nội bộ).
  5. Tại tính năng MP3TAGS: cho phép ghi tệp tin với nội dung tùy ý, có thể lợi dụng để khai thác các ứng dụng khác (hiện tại team chưa test case này).
  6. Ứng dụng không kiểm tra phân đăng nhập, dẫn đến việc bất kỳ người dùng nào không cần đăng nhập vẫn có thể sử dụng các tính năng
  7. Ứng dụng không kiểm tra việc phân quyền, dẫn đến việc người dùng có thể xem được hoặc thay đổi thông tin của người dùng, ví dụ như thay đổi quyền của user

 

Author: Redteam