+15

Biến đổi payload trong Burp Suite nhanh chóng và dễ dàng hơn cùng với extension Hackvertor

Mở đầu

Trong thực tế khi thực hiện pentest, sẽ có những trường hợp các payload của chúng ta là không chỉ đơn giản là text, number, json mà cần phải được encode (VD: base64, hex,..), encrypt (VD: AES) thành dạng dữ liệu khác nhau để phù hợp với yêu cầu của server. Một trong những trang cho phép làm điều này một cách nhanh chóng và hỗ trợ nhiều loại nhất là: https://gchq.github.io/CyberChef/. Tuy nhiên, mỗi lần convert thì vẫn phải copy/paste hơi mất công. Với Hackvertor, ta có thể thực hiện ngay trong Burp. Cùng tìm hiểu về Hackvertor thông qua một số use-case dưới đây nhé.

Hackvertor

Hackvertor là một extension cho Burp Suite, được phát triển bởi Gareth Heyes, research của công ty Portswigger Web Security, cũng chính là công ty phát triển ra công cụ Burp Suite. Extension có thể cài đặt trực tiếp từ Extender > BApp Store bên tron Burp Suite hoặc từ trang chủ: https://github.com/hackvertor/hackvertor

image.png

Sau khi cài đặt xong thì ở trên menu sẽ xuất hiện thêm menu của Hackvertor:

image.png

Ngoài ra các tab của Repeater/Logger sẽ xuất hiện thêm tab Hackvertor:

image.png

Click vào tab đây sẽ hiện ra danh sách các category cũng như các function mà Hackvertor hỗ trợ.

image.png

Hackvertor có hỗ trợ rất nhiều các kiểu biến đổi, mã hóa khác nhau, từ thông dụng như: rot13, base64, base58, hex, url encode, md5, sha1, cho đến phức tạp hơn như AES, hmac_sha1,... hay kể cả một số biến đổi đặc biệt như: random, random_unicode, gzip_compress,...

Ví dụ thực tế

Case 1: simple tag

Hackvertor is a tag based conversion tool written in Java implemented as a Burp Suite extension. Tags are constructed as follows: <@base64_0><@/base64_0> the @ symbol is used as an identifier that it's a Hackvertor tag followed by the name of the tag in this case base64, the name is then followed by an underscore and a unique tag number.

Hackvertor là công cụ chuyển đổi, cho phép chúng ta biến đổi payload dựa vào các tag đã được định nghĩa sẵn (người dùng cũng có thể custom thêm, mình sẽ nói cụ thể hơn ở phần sau). Tức là, chúng ta sẽ chèn thêm các tag <@base64><@/base64> trước và sau payload cần encode base64 thì khi thực hiện request, Hackvertor sẽ tự động biến đổi giúp chúng ta:

<@base64>your_payload_here<@/base64>

Mình có build 1 server demo bằng Flask, để giúp test xem payload chúng ta đã đẩy lên đúng chưa?

image.png

Đây là endpoint đơn giản nhận vào một param p trong POST body và output ra decode base64 của nó.

image.png

Để sử dụng Hackvertor thì, ta cần chuyển sang tab Hackvertor, bôi đen vị trí cần biến đổi, rồi chọn tag tương ứng. VD: base64 nằm trong category Encode:

Giao diện của Hackvertor có 2 panel, khi bạn thay đổi payload thì ở panel thứ 2 sẽ hiện ra preview (hoặc error nếu payload chúng ta bị lỗi) rất tiện cho việc debug. Bấm gửi và ta thấy payload đã đúng format và được server chấp nhận.

Hackvertor hỗ trợ rất nhiều func khác nhau, bạn có thể tìm tên các func được hỗ trợ ở trong tab Search của Hackvertor.

Case 2: nested tags

Hackvertor còn hỗ trợ việc nesting (lồng nhau) của các tag. Nghĩa là nếu payload của chúng ta cần phải biến đổi qua một chuỗi các biến đổi từ A -> B -> C thì ta có thể lồng các tag này lại theo đúng thứ tự như trên. VD như endpoint dưới yêu cầu truyền vào payload theo biến đổi:

base64decode(rot13(your_payload_here))

image.png

Với trường hợp này chúng ta cần làm ngược lại: base64 -> rot13 -> urlencode

Case 3: with parameters

Các tag của Hackvertor còn có thể nhận vào các tham số, như ở VD trước, hàm rot13 thực chất là hàm rotN và chúng ta có thể thay đổi số 13, tham số đầu vào để có thể rotate với khoảng cách tùy ý.

<@rotN(13)>

Case 4A: custom tag

Cùng đến với một ví dụ khó hơn nữa, đây là trường hợp mô phỏng, payload được truyền lên server sẽ được đi kèm với chữ ký p, giá trị của nó được tính toán dựa trên một hay nhiều tham số truyền vào. Để cho đơn giản thì trong trường hợp này, p được tính toán dựa trên i bằng thuật toán đã biết.

image.png

image.png

Như ở đầu bài mình có nhắc đến, thì Hackvertor cho phép chúng ta tạo custom tag, nhận các tham số và có thể được viết bằng các ngôn ngữ: Python (cần cài thêm JPython), Java, Javascript và Groovy. Tính năng thực thi code của tag mặc định là tắt nên trước hết, ta cần tích vào Allow code execution tags:

image.png

Sau đó chọn vào Create custom tag:

image.png

Ở đây ta làm các bước như sau:

  • Điền vào Tag name: khi render ra thì custom tag sẽ có thêm _ ở trước trên, dùng để phân biệt với built-in tag. Ở đây ta chọn tên custom_algo.
  • Lựa chọn ngôn ngữ cho tag. Ở đây mình sẽ dùng Python.
  • Chúng ta có thể truyền tham số cho tag, giống như ở trường hợp rotN ở trên. Tham số có thể là String hoặc là Number. Ví dụ ở đây ta sẽ truyền luôn 2 const 13377331 của thuật toán trên thành 2 tham số tương ứng là ab vào custom tag và đặt làm giá trị mặc định.
  • Phần code chúng ta có 2 cách:
    • Chỉ đường dẫn đến một file code (.js, .java, .groovy, .py) ở bên ngoài. Burp sẽ thực thi file code này.
    • Điền trực tiếp code vào.

Dù làm theo cách nào thì Hackvertor cũng sẽ định nghĩa sẵn 2 biến sau trong code:

  • biến input chính là phần được bọc bên trong <@_custom_algo> là input đầu vào.
  • biến output là kết quả trả ra sau khi thực hiện các biến đổi. Chúng ta sẽ gán giá trị cho biến này.

Với trường hợp này, mình sẽ input code trực tiếp như sau:

z = int(input); output = "arg_" +  str(z % a + z * b)

Code xong chúng ta có thể test code với input và các tham số mặc định:

Đã ra đúng giá trị mong muốn. Nếu muốn edit/delete custom tag đã tạo, hãy vào menu Hackvertor > List custom tags nhé. Các custom tag đã tạo cũng sẽ được liệt kê trong tab Custom của Hackvertor.

image.png

Case 4B: set and get variables

Trong ví dụ trên, ta đang build được custom tag với output mong muốn và có thể sử dụng như sau:

p=<@_custom_algo(1337,7331,'a3cf964d875593734b05e0d8183735b0')>10<@/_custom_algo>&i=10

phần a3cf964d875593734b05e0d8183735b0 là mã hash ngẫu nhiên được sinh ra để tránh việc các request đi qua proxy của Burp instance có thể lợi dụng code excution tag thực thi câu lệnh tùy ý trên máy của pentester. Chỉ có custom tag có hash hợp lệ mới chạy được.

Tuy nhiên khi giá trị i thay đổi thì ta cần thay đổi cả ở bên trong nữa. Hackvertor cho phép chúng ta định nghĩa i thành một biến số và ta có thể sử dụng biến này thành input của custom tag:

<@set_variable1('false')>10<@/set_variable1>

sẽ định nghĩa 1 biến variable1 (giá trị mặc định là 'false'). Khi muốn sử dụng biến này ở vị trí khác, ta chỉ cần thêm tag:

<@get_variable1/>

Hackvertor hỗ trợ hơn 10 variables khác nhau

Kết hợp lại chúng ta được kết quả như sau:

Case 5: generic code execution

Đối với những biến đổi phức tạp hơn nữa hoặc cần thư viện riêng thì chúng ta khó có thể sử dụng custom tag, cách tốt hơn là sử dụng tag code execution:

<@python('import subprocess;output = subprocess.check_output("C:/Users/Vigo/Desktop/ysoserial/bin/Debug/ysoserial_frmv2.exe -g ActivitySurrogateSelector -f LosFormatter -o raw -c whoami".split(" "));','d40ebaeea912efb340bd45af227efc5f')><@/python>

Như ví dụ tag ở trên, sẽ thực thi câu lệnh gen payload bằng ysoserial.NET với custom command truyền vào và đưa ra output.

Hoặc build payload cho https://viblo.asia/p/phan-tich-cve-2021-26295-apache-ofbiz-RQqKLGMO57z như minh họa dưới đây:

Kết

Khi chuyển từ tab Hackvertor sang tab Raw/Pretty thì việc xử lý payload của Hackvertor vẫn sẽ được thực hiện

Nên ngoài việc sử dụng ở Repeater thì Hackvertor còn có thể được sử dụng ở nhiều vị trí khác nhau trong Burp:

  • Intruder: tương tự như ở Repeater, các tag có trong request sẽ được xử lý. Ngoài ra có thể sử dụng tag như là payload. Hackvertor cũng có thể được dùng làm các module cho các flow ở Payload processing rules: Intruder tab -> Payloads tab -> Payload Processing section -> Add -> Invoke Burp Extension -> Select Processor

image.png

  • Proxy: tag được xử lý khi đi qua Proxy, điều này rất hữu ích khi sử dụng các công cụ bên ngoài như sqlmap và cấu hình để poxy các request đi qua Burp. Ví dụ: nếu giá trị của tham số SQL Injection đang được mã hóa ở phía client, chúng ta sẽ cấu hình để payload ở sqlmap chứa các tag, và vị trí inject là tham số của tag. Khi đó, payload được bao trong tag ở sqlmap sẽ được mã hóa như bình thường.

Nếu bạn có cách tip & trick nào với Hackvertor có thể comment thêm để chia sẻ cùng mọi người nhé. See ya!

Tham khảo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí