Có nhiều cách để phân tích, chặn gói tin, cách đơn giản nhất đó là đơn thuần "nghe" các packet vận chuyển qua lại giữa client và server. Đối với các server không dùng TLS/SSL, ví dụ như webserver HTTP sử dụng port 80 chẳng hạn, việc bắt các gói tin là hoàn toàn khả thi. Tuy nhiên, đa phần các server ngày nay đều mã hoá các packet lại (HTTPS port 443), khi đó chúng ta không thể đọc được nội dung gói tin. Có 2 cách để giải quyết vấn đề này, một là kiếm được key mã hoá và decrypt các gói tin, tuy nhiên cách này không phổ biến, cách còn lại là sử dụng proxy có certificate TLS/SSL. Cách 2 sẽ tạo ra một server giả hợp lệ thông qua proxy trung gian. Burp Suite cũng đang sử dụng phương pháp này, và cả mitmproxy, thứ chúng ta sẽ tìm hiểu hôm nay. Bạn đọc có thể tìm hiểu sâu hơn về cách vận hành mitmproxy ở Here.
Mitmproxy (man in the middle) là một công cụ giống với Burp Suite
hay Wireshark, thường được sử dụng để chặn và phân tích các gói tin
thông qua proxy. Bên ngoài việc có thể sử dụng trên nhiều hệ điều hành,
một đặc điểm thú vị của Mitmproxy là khả năng tương thích cao với
Python. Trong bài viết này mình sẽ hướng dẫn cách sử dụng Mitmproxy bản
Interactive và với Python.
Khi tải xuống, các bạn sẽ thấy có 3 phiên bản Mitmproxy:
-
mitmproxy (console ui) hay bản interactive: sử dụng và thao tác lệnh
thông qua giao diện và các phím
- mitmdump (headless): phiên
bản chúng ta thường xuyên làm việc khi sử dụng với Python nhất, bởi vì
nó không có giao diện hay thao tác qua phím được mà chỉ đơn giản tạo
proxy và xử lí mọi thứ thông qua addon Python đính kèm
-
mitmweb (web ui): phiên bản nhỏ gọn hơn interactive nhưng thiết kế đẹp
hơn, sử dụng trong 1 tab của browser
Client Replay: bạn đọc có thể tìm hiểu cách dùng mitmproxy tự động
request lại các gói tin tại:
Here
Mitmproxy kết hợp với Python thông qua addon. Addon, ngược lại tương tác với mitmproxy thông qua các events, qua đó thay đổi hoạt động của mitmproxy
Để sử dụng addon với file anatomy.py, chúng ta sử dụng lệnh trên cmd, terminal là: mitmproxy -s anatomy.py (bản interactive) hoặc mitmdump -s ./anatomy.py (bản headless)
Bên trong anatomy.py code có dạng:
""" Basic skeleton of a mitmproxy addon. Run as follows: mitmproxy -s anatomy.py """ import logging class Counter: def __init__(self): self.num = 0 def request(self, flow): self.num = self.num + 1 logging.info("We've seen %d flows" % self.num) addons = [Counter()]
Hoặc cách tối giản hơn không dùng class là:
"""An addon using the abbreviated scripting syntax.""" def request(flow): flow.request.headers["myheader"] = "value"
Bạn đọc xem thêm các thành phần có thể xem và sửa của event request và response tương ứng tại: Here và Here
Các event đều nhận đầu vào là object flow, flow chính là 1 dòng chảy chứa request đi và response trở về. Ví dụ, ở event response, chúng ta có thể gọi flow.request.host để lấy hostname, thứ không có trong thành phần của response