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
Sau khi cài đặt xong thì ở trên menu sẽ xuất hiện thêm menu của Hackvertor:
Ngoài ra các tab của Repeater/Logger sẽ xuất hiện thêm tab Hackvertor:
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ợ.
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>
và <@/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?
Đâ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ó.
Để 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))
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.
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:
Sau đó chọn vào Create custom tag:
Ở đâ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êncustom_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 const1337
và7331
của thuật toán trên thành 2 tham số tương ứng làa
vàb
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ày thì Hackvertor cũng sẽ định nghĩa sẵn 2 thứ: - 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.
- Chỉ đường dẫn đến một file code (
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.
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
à mã hash ngẫu nhiên được sinh ra để tránh việc các request đi qua proxy của Burp instance này 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
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
- https://appsec-labs.com/portal/advanced-testing-of-web-application-with-custom-message-signing-using-hackvertor/
- https://portswigger.net/research/bypassing-wafs-and-cracking-xor-with-hackvertor
- https://www.pentagrid.ch/en/blog/burp-suite-hackvertor-custom-tags-email-sms-tan-multi-factor-authentication/
Nguồn: viblo.asia