Giới thiệu
Bài viết này là phần tiếp theo cho bài viết trước về cách phân tích và giải mã traffic của một ứng dụng Android. Sau khi đã hiểu được cơ chế mã hóa traffic giữa server và client, chúng ta có hai lựa chọn:
- Sử dụng Hackvertor để viết một custom tag cho phép chỉnh sửa dữ liệu trên Burp.
- Viết một Burp extension với chức năng giải mã và mã hóa lại traffic của ứng dụng.
Chúng ta sẽ tập trung vào phương pháp thứ hai, xây dựng một Burp extension với các chức năng sau:
- Tạo thêm một tab mới trong Burp, cho phép người dùng xem dữ liệu ở dạng đã được giải mã.
- Hỗ trợ chỉnh sửa dữ liệu và tự động mã hóa lại khi chuyển về tab ban đầu.
Cách làm này không chỉ tiện lợi mà còn tạo sự linh hoạt cho việc sử dụng lại trong các trường hợp khác. Hãy cùng bắt đầu!
Tóm tắt nhanh
Source code và hướng dẫn chi tiết có sẵn tại đây: Traffic Decryptor trên GitHub
Ví dụ Mô Phỏng Server
Để xây dựng extension, chúng ta sẽ sử dụng một server giả lập mã hóa traffic với thuật toán AES. Dưới đây là đoạn mã cho server:
python
from flask import Flask, request, jsonify
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
import json
app = Flask(__name__)
# Khóa AES-128 yêu cầu một khóa 16-byte (128-bit)
AES_KEY = b"thisisakey123456" # Khóa mặc định (nên giữ bí mật trong môi trường sản xuất)
AES_IV = b"thisisaniv123456" # Vector khởi tạo (IV), cũng nên có độ dài 16 bytes
def encrypt_data(data):
cipher = AES.new(AES_KEY, AES.MODE_CBC, AES_IV)
padded_data = pad(data.encode('utf-8'), AES.block_size)
encrypted_data = cipher.encrypt(padded_data)
return base64.b64encode(encrypted_data).decode('utf-8')
def decrypt_data(encrypted_data):
cipher = AES.new(AES_KEY, AES.MODE_CBC, AES_IV)
decoded_encrypted_data = base64.b64decode(encrypted_data)
decrypted_padded_data = cipher.decrypt(decoded_encrypted_data)
decrypted_data = unpad(decrypted_padded_data, AES.block_size)
return decrypted_data.decode('utf-8')
@app.route('/status', methods=['GET'])
def status():
response_data = {"name": "Demo Encrypted Traffic Server", "version": "0.1"}
json_response = jsonify(response_data).get_data(as_text=True)
encrypted_data = encrypt_data(json_response)
return jsonify({"error": 0, "data": encrypted_data})
@app.route('/hello', methods=['POST'])
def hello():
try:
request_data = request.get_json()
encrypted_data = request_data.get('data')
decrypted_json = decrypt_data(encrypted_data)
decrypted_data = json.loads(decrypted_json)
if 'name' in decrypted_data:
name = decrypted_data['name']
response_message = {"resp": f"Hello {name}!"}
json_response = json.dumps(response_message)
encrypted_response = encrypt_data(json_response)
return jsonify({"error": 0, "data": encrypted_response})
else:
return jsonify({"error": 1, "message": "Key 'name' not found in decrypted data"}), 400
except Exception as e:
return jsonify({"error": 1, "message": str(e)}), 500
if __name__ == '__main__':
app.run(debug=True)
Server này có hai endpoint:
/status
: Trả về thông tin của server./hello
: Nhận dữ liệu JSON đã mã hóa của người dùng và trả về thông điệp chào.
Xây Dựng Extension
Chúng ta sẽ đi qua các thành phần của extension. Để tạo tiện ích này, chúng ta cần kế thừa từ các interface cơ bản trong Burp như IBurpExtender
, IMessageEditorTabFactory
và ITab
. Tạo một tab mới cho Burp và cấu trúc nó như sau:
Khởi Tạo
python
class BurpExtender(IBurpExtender, IMessageEditorTabFactory, ITab):
def registerExtenderCallbacks(self, callbacks):
self._callbacks = callbacks
self._helpers = callbacks.getHelpers()
self._callbacks.setExtensionName("Traffic Decryptor")
self._createUI()
self._callbacks.addSuiteTab(self)
callbacks.registerMessageEditorTabFactory(self)
self.stdout = PrintWriter(callbacks.getStdout(), True)
self.stdout.println("Traffic Decryptor extension loaded")
Tab này sẽ có chức năng tải lại logic mỗi khi chúng ta thay đổi mã nguồn mà không cần khởi động lại Burp.
Logic Phần Mềm
Logic chính của extension sẽ được định nghĩa ở một module riêng. Chúng ta sẽ có các hàm xác định xem dữ liệu có mã hóa hay không, giải mã, và mã hóa lại dữ liệu mỗi khi có sự thay đổi.
Ví dụ về một hàm kiểm tra mã hóa:
python
def is_encrypted(tab, content, isRequest):
info, body = extract_info(tab, content, isRequest)
json_data = json.loads(body)
return "data" in json_data
Cài Đặt Jython
Để phát triển một Burp extension bằng Python, bạn cần cài đặt Jython. Hướng dẫn cài đặt cũng tương tự như cài đặt các thư viện Python khác. Hãy chắc chắn rằng bạn sử dụng phiên bản jython-standalone-2.7.3.jar
để có thể import thư viện crypto cần thiết cho việc mã hóa dữ liệu.
Kết Luận
Với hướng dẫn này, bạn sẽ có thể xây dựng một Burp extension hiệu quả, giúp việc phân tích và chỉnh sửa traffic mã hóa dễ dàng hơn. Hãy tiếp tục thử nghiệm và cải tiến extension của bạn để tối ưu hóa hơn nữa.
Happy Coding!
source: viblo