Làm chủ mitmproxy: Hướng dẫn thực hành kiểm tra HTTPS và gỡ lỗi API

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Khám phá bên trong “chiếc hộp đen” HTTPS

Lưu lượng web hiện đại hầu hết đều được mã hóa. Mặc dù đây là một bước tiến lớn cho quyền riêng tư của người dùng, nhưng nó lại gây ra khó khăn không nhỏ cho các nhà phát triển. Khi một API trả về một lỗi khó hiểu hoặc một ứng dụng di động hoạt động không như mong đợi, bạn không thể chỉ đơn giản là “nhìn trộm” các gói tin. Bạn sẽ chỉ thấy một bức tường văn bản mã hóa. Đó là lý do tại sao mitmproxy là công cụ đầu tiên tôi tìm đến khi cần xem những gì thực sự đang diễn ra bên dưới hệ thống.

Hãy coi nó như một phiên bản mạnh mẽ hơn nhiều của tab ‘Network’ trong Chrome. Nó không chỉ hiển thị các yêu cầu từ trình duyệt; nó chặn lưu lượng truy cập từ bất kỳ nguồn nào—ứng dụng di động, công cụ CLI hoặc các microservices backend. Cho dù bạn đang gỡ lỗi các luồng HTTP/2 hay kiểm tra WebSockets, mitmproxy cung cấp cho bạn quyền kiểm soát hoàn toàn đối với luồng dữ liệu.

Thiết lập trong 5 phút

Việc cài đặt và chạy mitmproxy nhanh đến mức ngạc nhiên. Tôi thích sử dụng các trình quản lý gói vì chúng tự động xử lý các phụ thuộc Python, giúp bạn tránh được các xung đột phiên bản sau này.

1. Cài đặt

Trên macOS, Homebrew là lựa chọn đơn giản nhất. Đối với người dùng Linux, pipx là tiêu chuẩn vàng để giữ cho môi trường hệ thống của bạn luôn sạch sẽ.

# macOS
brew install mitmproxy

# Linux (Ubuntu/Debian)
sudo apt update && sudo apt install mitmproxy

2. Lựa chọn giao diện

Mitmproxy có ba phiên bản. mitmproxy cung cấp giao diện dòng lệnh (TUI) cổ điển. mitmweb khởi chạy một bảng điều khiển trên trình duyệt. mitmdump hoạt động giống như tcpdump nhưng dành cho HTTP. Trong 90% công việc của tôi, giao diện terminal là cách nhanh nhất để lọc qua hàng nghìn yêu cầu.

mitmproxy

Proxy bắt đầu lắng nghe trên cổng 8080 theo mặc định. Bạn có thể thay đổi cổng này bằng cách sử dụng -p 8888 nếu bạn đã có một dịch vụ khác đang chiếm dụng cổng đó.

3. Định tuyến lưu lượng

Trỏ thiết bị hoặc trình duyệt của bạn về localhost:8080. Tại thời điểm này, các trang web HTTP sẽ tải bình thường, nhưng các trang HTTPS sẽ kích hoạt cảnh báo “Kết nối của bạn không phải là riêng tư”. Điều này xảy ra vì thiết bị của bạn (một cách chính xác) chưa tin tưởng chứng chỉ tự ký của proxy.

Cấu hình kiểm tra SSL (Phần “ảo thuật”)

Để giải mã lưu lượng truy cập, mitmproxy tạo ra một chứng chỉ giả cho mỗi trang web bạn truy cập. Thiết bị của bạn cần nhận dạng mitmproxy là một Cơ quan cấp chứng chỉ (CA) đáng tin cậy.

Cài đặt chứng chỉ CA

Khi proxy đang chạy, hãy mở trình duyệt và truy cập mitm.it. Trang này sẽ phát hiện hệ điều hành của bạn và cung cấp bản tải xuống chứng chỉ chính xác.

  • Windows/macOS: Cài đặt chứng chỉ và di chuyển nó vào kho lưu trữ “Trusted Root Certification Authorities”.
  • Android: Kể từ Android 7.0, các ứng dụng bỏ qua các chứng chỉ do người dùng cài đặt theo mặc định. Bạn có thể cần một thiết bị đã root hoặc một bản APK đã được vá để vượt qua hạn chế này.
  • iOS: Tải xuống profile, sau đó đi tới Settings > General > About > Certificate Trust Settings. Bạn phải bật nút gạt cho mitmproxy sang “Full Trust” một cách thủ công.

Lưu ý về bảo mật hạ tầng

Nếu bạn đang chạy mitmproxy trên một máy chủ từ xa để nhóm thử nghiệm, đừng để nó mở hoàn toàn. Các proxy không được bảo vệ sẽ nhanh chóng bị các bot tìm thấy và sử dụng cho lưu lượng truy cập độc hại. Tôi luôn sử dụng xác thực mạnh cho các tệp .htpasswd của mình. Để tạo các tệp này, tôi sử dụng trình tạo mật khẩu tại toolcraft.app. Đây là một công cụ phía máy khách, nghĩa là các khóa và mật khẩu của bạn không bao giờ rời khỏi trình duyệt, giúp việc tạo thông tin đăng nhập máy chủ nhạy cảm trở nên an toàn.

Chặn và viết Script

Niềm vui thực sự bắt đầu khi bạn ngừng chỉ quan sát và bắt đầu thao túng lưu lượng truy cập.

1. Chặn trực tiếp (Live Interception)

Trong giao diện console, nhấn phím i để thiết lập bộ lọc chặn. Nếu tôi muốn tạm dừng mọi yêu cầu gửi đến một endpoint đăng nhập cụ thể, tôi sử dụng:

# Thiết lập bộ lọc:
~u /v1/auth/login

Yêu cầu sẽ chuyển sang màu cam và tạm dừng trong quá trình truyền tải. Sau đó, bạn có thể nhấn e để chỉnh sửa nội dung JSON—chẳng hạn như thay đổi user_role từ “guest” thành “admin”—và nhấn a để tiếp tục. Đây là một bước đột phá để kiểm tra cách backend của bạn xử lý dữ liệu độc hại hoặc sai định dạng.

2. Tự động hóa với Python

Chỉnh sửa thủ công rất chậm. Nếu bạn cần chèn một header cụ thể vào mọi phản hồi, hãy viết một script đơn giản. Đây là một đoạn mã 10 dòng tôi sử dụng để mô phỏng các security header hoặc sửa đổi phản hồi của máy chủ ngay lập tức.

from mitmproxy import http

def response(flow: http.HTTPFlow) -> None:
    # Chèn một header tùy chỉnh để theo dõi
    flow.response.headers["X-Audit-ID"] = "12345-DEBUG"
    
    # Mô phỏng thay đổi giao diện bằng cách thay thế văn bản
    if "Welcome" in flow.response.get_text():
        flow.response.set_text(flow.response.get_text().replace("Welcome", "Đã cấp quyền truy cập"))

Khởi chạy nó với: mitmproxy -s modify_traffic.py.

3. Các phím tắt bộ lọc thiết yếu

Đừng để bị ngập trong mớ hỗn độn. Hãy sử dụng các bộ lọc này để tìm “kim đáy bể”:

  • ~m post: Chỉ hiển thị các yêu cầu POST.
  • ~c 500: Tìm ngay lập tức những lỗi máy chủ nội bộ gây khó chịu đó.
  • ~b "token": Quét nội dung yêu cầu/phản hồi cho các chuỗi cụ thể như JWT hoặc API key.
  • !(~u analytics): Ẩn tất cả các lưu lượng theo dõi từ Google hoặc Mixpanel.

Những bài học thực tế từ kinh nghiệm thực chiến

Tôi đã sử dụng mitmproxy cho hàng trăm giờ kiểm thử bảo mật. Dưới đây là những gì tôi đã học được một cách xương máu.

Vượt qua Certificate Pinning: Các ứng dụng có độ bảo mật cao (như ngân hàng hoặc mạng xã hội) sử dụng SSL Pinning. Chúng bỏ qua kho lưu trữ tin cậy của hệ thống. Nếu bạn thấy “Client Handshake Failed” trong nhật ký, bạn sẽ cần sử dụng Frida hoặc Objection để vô hiệu hóa logic ghim chứng chỉ bên trong ứng dụng trước khi mitmproxy có thể nhìn thấy lưu lượng truy cập.

Quản lý bộ nhớ: Mitmproxy lưu trữ mọi ‘flow’ trong RAM. Nếu bạn để nó chạy cả ngày khi duyệt web nặng, nó có thể dễ dàng tiêu tốn tới 1GB bộ nhớ. Hãy nhấn phím z thường xuyên để xóa bộ đệm và giữ cho giao diện luôn phản hồi nhanh chóng.

Dọn dẹp: Đừng bao giờ để chứng chỉ CA của proxy được cài đặt trên máy chính của bạn lâu hơn mức cần thiết. Đó là một rủi ro bảo mật lớn. Tôi khuyên bạn nên sử dụng một profile trình duyệt riêng biệt hoặc một Máy ảo cho các phiên thử nghiệm để giữ cho các giao dịch ngân hàng và email cá nhân của bạn được an toàn.

Cộng tác: Tìm thấy một lỗi? Sử dụng phím W để lưu flow cụ thể đó vào một tệp. Bạn có thể gửi tệp đó cho đồng nghiệp qua Slack, và họ có thể tải nó bằng lệnh mitmproxy -r bug_report.flow để xem chính xác các header, thời gian và payload mà bạn đã phát hiện.

Mitmproxy biến “chiếc hộp đen” HTTPS thành một luồng dữ liệu rõ ràng, có thể chỉnh sửa được. Nó thay đổi cách bạn gỡ lỗi, giúp bạn chuyển từ việc đoán mò sang các giải pháp dựa trên dữ liệu thực tế.

Share: