0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

Hướng Dẫn Xây Dựng Burp Extension Để Giải Mã và Chỉnh Sửa Traffic Mã Hóa Của Ứng Dụng Android

Đăng vào 5 ngày trước

• 4 phút đọc

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 Copy
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, IMessageEditorTabFactoryITab. Tạo một tab mới cho Burp và cấu trúc nó như sau:

Khởi Tạo

python Copy
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 Copy
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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào