Nmap không phải lúc nào cũng gửi đúng gói tin mà bạn nghĩ mình đã yêu cầu. Khi không có raw socket, nó thay quét SYN mặc định bằng quét TCP connect, nên chạy với tư cách người dùng thường và chạy dưới sudo có thể trả lời những câu hỏi khác nhau về cùng một cổng. Kết quả trông giống một vấn đề quyền hạn, và thường đó là thay đổi phương pháp. Làm rõ phương pháp là cách duy nhất để so sánh hai lần chạy.

Hai đầu dò, một cổng, những đường mã khác nhau

Quét SYN tự dựng tiêu đề TCP, gửi nó từ raw socket và đọc phản hồi từ mạng trước khi ngăn xếp TCP của nhân ghi nhận một kết nối hoàn tất. Quét connect yêu cầu hệ điều hành mở một socket thông thường và báo cáo những gì connect() trả về. Cả hai đều có thể gọi một cổng là mở, nhưng chỉ một cách để lại một lần thử nửa mở và chỉ một cách chịu sự điều chỉnh của chính sách cấp socket gắn với tiến trình gửi.

Đường raw cần CAP_NET_RAW, vì vậy lần quét mặc định lặng lẽ suy giảm khi thiếu khả năng đó. Tài liệu tham khảo kỹ thuật quét của chính Nmap ghi lại việc thay thế này: quét connect là phương án dự phòng vì nó không cần bất kỳ đặc quyền nào. Việc hoán đổi diễn ra không có cảnh báo trong hầu hết các lần chạy, và đó chính là điều khiến nó dễ bị đọc sai đến vậy. Khi đã biết có phương án dự phòng, “mở khi là root, đóng khi là người dùng” không còn giống một lỗi quyền hạn nữa mà bắt đầu giống hai phép đo khác nhau.

sudo thực sự thay đổi điều gì trong lần quét

Nâng quyền khôi phục đường raw socket, và điều đó thay đổi nhiều hơn phán quyết. Việc chọn cổng nguồn, thời điểm gói tin, hành vi truyền lại và cách phân loại một phản hồi đã lọc đều đến từ mã khác nhau. Một thiết bị trung gian giới hạn tốc độ SYN đối xử với hai lần chạy không công bằng ngay cả khi máy đích giống hệt nhau.

Việc ghi nhật ký phía đích cũng khác nhau. Một bắt tay hoàn tất thì dịch vụ và mọi phép hạch toán socket đều thấy, còn một đầu dò nửa mở đã bị đặt lại thì thường không. Nếu bạn so sánh các lần chạy với một máy mà bạn cũng đọc nhật ký, một phần khác biệt bạn thấy chính là việc quan sát.

Giữ phương pháp không đổi trong cả hai lần chạy

Buộc cả hai lời gọi dùng cùng một kỹ thuật và phép so sánh bắt đầu có ý nghĩa. Cờ -sT yêu cầu rõ ràng quét connect, -Pn loại bỏ việc phát hiện máy, -n loại bỏ phân giải tên, và một -p duy nhất loại bỏ khác biệt về danh sách cổng.

nmap -sT -Pn -n -p 8443 198.51.100.77
sudo nmap -sT -Pn -n -p 8443 198.51.100.77

Thay địa chỉ và cổng bằng một máy bạn được phép kiểm thử; dải tài liệu ở trên chỉ là ví dụ, không phải mục tiêu. Nếu hai lần chạy giờ khớp nhau, khác biệt ban đầu đến từ phương pháp quét. Nếu vẫn không khớp, có thứ khác đang phân loại lưu lượng, và phần tiếp theo là nơi cần xem.

Bối cảnh tài khoản không chỉ là cờ đặc quyền

Một triển khai VPN có thể phân loại gói tin theo UID, theo cgroup hoặc theo một quy tắc gắn với tiến trình đã mở socket. Khi đó lưu lượng của root và của người dùng đi ra qua những bảng định tuyến khác nhau hoặc đụng những bộ quy tắc khác nhau, và không kỷ luật phương pháp quét nào hòa giải được chúng.

Hãy kiểm tra chính sách chứ không phải đặc quyền. Trên Linux, nftables diễn đạt điều này bằng meta skuid và iptables bằng khớp chủ sở hữu, và mỗi cái đều có thể gửi một UID vào đường hầm trong khi cái kia tiếp tục dùng tuyến vật lý mặc định.

sudo nft list ruleset | grep -n skuid
sudo iptables-save | grep -n uid-owner
ip rule show
ip route get 198.51.100.77

Xác nhận đầu dò trước khi so sánh kết quả

Trước khi kết luận, hãy chứng minh đầu dò nào đã chạy. Nmap nêu tên kỹ thuật trong đầu ra của chính nó, và --reason thêm bằng chứng đằng sau mỗi trạng thái, và đó là phần cho bạn biết một bắt tay có thực sự hoàn tất hay không.

nmap --reason -sT -Pn -n -p 8443 198.51.100.77
sudo nmap --reason -sS -Pn -n -p 8443 198.51.100.77
getcap "$(command -v nmap)"
capsh --print | grep -i net_raw

Hai lần chạy báo cùng một trạng thái vì lý do khác nhau không phải mâu thuẫn, và hai lần chạy báo trạng thái khác nhau vì cùng một lý do chỉ ra định tuyến hoặc chính sách chứ không phải việc quét. Giữ đích, cổng, không gian tên và thời điểm giống hệt nhau, rồi thay đổi từng biến một. Chạy dịch vụ với tư cách root không phải là cách sửa sự không khớp chính sách; cách sửa là diễn đạt chính sách mong muốn thông qua chủ sở hữu dịch vụ.

Bài viết liên quan