ProxyChains chặn gì và để yên những gì
ProxyChains móc các lệnh gọi thư viện trong chương trình nó khởi chạy. Hãy kiểm chứng độ phủ TCP bằng maps, strace và một yêu cầu, rồi đừng giả định DNS hay UDP cũng đi theo.
ProxyChains-NG không tạo đường hầm. Nó nạp trước một thư viện thay thế các lệnh gọi libc liên quan đến mạng bên trong đúng một chương trình mà nó khởi chạy, nên ranh giới là một lệnh gọi trong tiến trình, không phải tuyến đường cho toàn bộ thiết bị. Sự khác biệt đó quyết định một bài kiểm tra thành công thực sự chứng minh điều gì. Một curl hoạt động qua chuỗi chỉ xác nhận một lệnh gọi bị móc, không phải rằng phân giải tên, UDP hay mọi tiến trình con đều đi cùng một đường. Hướng dẫn dưới đây kiểm chứng độ phủ theo ba bước, sau đó liệt kê những gì móc không thể với tới.
Việc nạp trước đến được một kết nối như thế nào
Khi khởi chạy, trình khởi chạy đặt libproxychains vào LD_PRELOAD rồi thực thi chương trình đích. Thư viện phân giải các ký hiệu libc thật và thay bằng phiên bản riêng của các hàm như connect và getaddrinfo. Những lệnh gọi đi qua các ký hiệu đó được viết lại sang proxy SOCKS hoặc HTTP trong tệp cấu hình. Những lệnh gọi chọn con đường khác không bao giờ gặp móc, nên bảo đảm chỉ có giá trị theo từng lệnh gọi chứ không theo cả máy.
Chỉ những chương trình liên kết động mới tham gia, còn tệp nhị phân setuid dưới thực thi an toàn hoàn toàn bỏ qua việc nạp trước. Tiến trình con thừa hưởng môi trường, nhưng chỉ chừng nào trình khởi chạy còn giữ nó tại chỗ.
Xác nhận thư viện đã được nạp vào tiến trình đó
Khởi chạy yêu cầu và kiểm tra tiến trình đang sống thay vì shell đã khởi chạy nó. Tệp maps hiển thị mọi đối tượng chia sẻ hiện được ánh xạ vào tiến trình.
proxychains4 -q curl -sS --max-time 8 https://example.com/ -o /dev/null &
pgrep -a curl
grep libproxychains /proc/$(pgrep -n curl)/mapsMột kết quả khớp xác nhận thư viện bị móc có mặt, điều này cần nhưng chưa đủ. Kết quả rỗng thường có nghĩa bạn đã kiểm tra một tiến trình khác, ví dụ trình duyệt đã chuyển URL cho một phiên bản khởi chạy trước trình khởi chạy. Trước khi đuổi theo bất cứ điều gì khác, hãy kiểm tra bằng ldd xem tệp nhị phân có liên kết động không, vì bản dựng tĩnh hoàn toàn không thể nạp việc nạp trước. Sau đó đọc danh sách proxy trong cấu hình mà trình khởi chạy thực sự dùng, vì một đường dẫn cũ hoặc cổng đã đóng sẽ cho ra móc hoạt động mà chuỗi không hoạt động.
Theo dõi các kết nối rời khỏi tiến trình
Sự hiện diện của thư viện không chứng minh mọi lệnh gọi đã được viết lại, nên hãy theo các lệnh gọi hệ thống. Chạy một yêu cầu dưới trình theo dõi và đọc xem các socket thực sự đi đâu.
strace -f -e trace=connect -o /tmp/pc.trace proxychains4 -q curl -sS https://example.com/ -o /dev/null
grep -o "sin_port=htons([0-9]*)" /tmp/pc.trace | sort -uDấu vết chỉ nên hiển thị các kết nối tới điểm cuối proxy của bạn, với cổng khớp mục trong tệp cấu hình. Nếu địa chỉ đích của trang mục tiêu xuất hiện trực tiếp trong dấu vết, lệnh gọi đó đã vòng qua móc, và đó chính là phát hiện bạn đang tìm. Hãy so số cổng với danh sách proxy thay vì tin vào tên tệp, vì cấu hình còn sót lại từ dự án khác là nguồn phổ biến của truy cập trực tiếp âm thầm. Giữ dấu vết cho biên bản nghiệm thu; việc này mất vài giây và kết thúc tranh luận về độ phủ.
Quyết định những gì móc không thể bao phủ
dự án proxychains-ng giới hạn chuyển hướng ở TCP và cảnh báo rằng script, tiến trình nền và mô-đun được nạp có thể hành xử khác chương trình chính. UDP và ICMP nằm ngoài cơ chế, nên bất cứ thứ gì dựa vào chúng đều cần đường đi được hỗ trợ riêng. DNS tuân theo thiết lập proxy_dns và hành vi của trình phân giải của chính ứng dụng, nghĩa là một yêu cầu HTTPS thành công không nói cho bạn biết gì về phân giải tên. Hãy giữ cả việc xác thực chứng chỉ ở đúng chỗ: đến được máy chủ qua proxy không phải lý do để tắt kiểm tra danh tính.
Nếu phương án dự phòng trực tiếp buộc phải bất khả thi, hãy dùng một ranh giới cưỡng chế kiểm soát chính lưu lượng, như không gian tên mạng, quy tắc tường lửa hay VPN, và giữ nó tách khỏi móc thư viện. Móc là công cụ tương thích cho một chương trình cụ thể, không phải kill switch. Ghi lại chương trình, lệnh chính xác, cổng proxy thấy trong dấu vết và việc DNS có được phân giải từ xa hay không; bốn dữ kiện đó là khác biệt giữa phạm vi đã kiểm chứng và phạm vi hy vọng.