Nmap은 항상 여러분이 요청했다고 생각하는 패킷을 보내지 않습니다. raw 소켓을 쓸 수 없을 때 Nmap은 기본 SYN 스캔을 TCP connect 스캔으로 바꾸므로, 일반 사용자로 실행한 경우와 sudo 아래에서 실행한 경우가 같은 포트에 대해 다른 질문에 답할 수 있습니다. 결과는 권한 문제처럼 보이지만 보통은 방법의 변경입니다. 방법을 명시하는 것만이 두 실행을 비교하는 유일한 길입니다.

두 프로브, 하나의 포트, 다른 코드 경로

SYN 스캔은 TCP 헤더를 직접 만들고 raw 소켓에서 보내며, 커널의 TCP 스택이 완료된 연결을 기록하기 전에 네트워크에서 응답을 읽습니다. connect 스캔은 운영체제에 평범한 소켓을 열라고 요청하고 connect()이 반환하는 것을 보고합니다. 둘 다 포트를 열린 것으로 표시할 수 있지만, 반쯤 열린 시도를 남기는 것은 하나뿐이고 보내는 프로세스에 연결된 소켓 수준 정책을 따르는 것도 하나뿐입니다.

raw 경로에는 CAP_NET_RAW이 필요하므로 그 능력이 없으면 기본 스캔이 조용히 약화됩니다. Nmap 자체의 스캔 기법 참조가 이 대체를 기록합니다: connect 스캔은 특별한 권한이 전혀 필요 없기 때문에 대체 수단입니다. 대체는 대부분의 실행에서 경고 없이 일어나며, 그래서 오해하기가 매우 쉽습니다. 대체 수단이 있다는 것을 알면 “root로는 열림, 사용자로는 닫힘”은 더 이상 권한 버그처럼 들리지 않고 두 개의 다른 측정처럼 들리기 시작합니다.

스캔에서 sudo가 실제로 바꾸는 것

권한을 높이면 raw 소켓 경로가 복원되고, 그것은 판정보다 많은 것을 바꿉니다. 출발 포트 선택, 패킷 타이밍, 재전송 동작, 필터된 응답을 분류하는 방식이 모두 다른 코드에서 나옵니다. SYN 속도를 제한하는 중간 장비는 목적지 호스트가 같더라도 두 실행을 불평등하게 대합니다.

목적지 쪽 로깅도 달라집니다. 완료된 핸드셰이크는 서비스와 모든 소켓 회계에 보이지만, 초기화된 반쯤 열린 프로브는 대개 보이지 않습니다. 로그도 함께 읽는 호스트를 상대로 실행을 비교한다면, 보이는 차이의 일부는 관찰 자체입니다.

두 실행에서 방법을 일정하게 유지하십시오

두 호출에서 같은 기법을 강제하면 비교가 의미를 갖기 시작합니다. -sT 플래그는 connect 스캔을 명시적으로 요청하고, -Pn은 호스트 발견을, -n은 이름 해석을 제거하며, 단일 -p는 포트 목록 차이를 제거합니다.

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

주소와 포트를 시험할 권한이 있는 호스트로 바꾸십시오(위의 문서용 대역은 예시일 뿐 대상이 아닙니다). 두 실행이 이제 일치하면 원래 차이는 스캔 방법에서 온 것입니다. 여전히 일치하지 않으면 다른 무언가가 트래픽을 분류하고 있으며, 다음 절이 살펴볼 곳입니다.

계정 맥락은 권한 플래그만이 아닙니다

VPN 배포는 패킷을 UID로, cgroup으로, 또는 소켓을 연 프로세스에 연결된 규칙으로 분류할 수 있습니다. 그러면 root 트래픽과 사용자 트래픽이 서로 다른 라우팅 테이블로 나가거나 서로 다른 규칙 집합에 부딪히며, 어떤 스캔 방법 규율로도 이를 화해시킬 수 없습니다.

권한이 아니라 정책을 살펴보십시오. Linux에서 nftables는 meta skuid으로, iptables는 소유자 일치로 이것을 표현하며, 어느 쪽이든 하나의 UID를 터널로 보내는 동안 다른 쪽은 물리적 기본 경로를 계속 사용할 수 있습니다.

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

결과를 비교하기 전에 프로브를 확인하십시오

결론을 내리기 전에 어느 프로브가 실행되었는지 증명하십시오. Nmap은 자체 출력에서 기법의 이름을 밝히고, --reason는 각 상태 뒤의 근거를 추가하며, 바로 그 부분이 핸드셰이크가 실제로 완료되었는지 알려줍니다.

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

같은 상태를 다른 이유로 보고하는 두 실행은 모순이 아니며, 같은 이유로 다른 상태를 보고하는 두 실행은 스캔이 아니라 라우팅이나 정책을 가리킵니다. 목적지, 포트, 네임스페이스, 타이밍을 동일하게 유지하고 한 번에 하나의 변수만 바꾸십시오. 서비스를 root로 실행하는 것은 정책 불일치의 수리가 아니며, 의도한 정책을 서비스 소유자를 통해 표현하는 것이 수리입니다.

관련 글