
Nmap(Network Mapper의 약자)은 가장 널리 사용되는 포트 스캐너이자 네트워크 스캐닝 도구 중 하나입니다. 일반 사용자 권한으로도 Nmap의 기본 기능 일부를 실행할 수 있지만, 대부분의 고급 기능을 사용하려면 root 또는 sudo 권한이 필요합니다.
예를 들어 NULL 스캔, 스텔스 SYN 스캔(Stealth SYN Scan)과 같은 고급 포트 스캐닝 기능은 root 권한이 있어야만 동작합니다. Nmap이 정확하고 실제로 활용 가능한 결과를 제공하려면 raw 패킷 데이터에 직접 접근해야 하기 때문입니다.
sudo 권한 없이 이런 고급 기능을 실행하려고 하면 도구는 "requires root privileges"라는 메시지를 출력하며 실행을 거부합니다.

문제는 Nmap을 실행할 때마다 sudo를 사용해야 한다는 점입니다. 특히 sudo 그룹에 속하지 않은 사용자라면 상당히 번거로울 수 있습니다.
다행히 capabilities(리눅스 커널 능력)를 활용하면 root나 sudo 권한 없이도 Nmap을 실행할 수 있습니다.
Capabilities란 무엇인가?
Linux capabilities는 리눅스 커널 속성으로, 프로그램과 프로세스가 원래 root 사용자만 가질 수 있는 권한을 사용할 수 있도록 해줍니다.
본질적으로 Linux capabilities는 root 사용자의 강력한 권한을 잘게 나누어 공유하는 개념입니다. 덕분에 비특권 프로세스도 마치 특권 프로세스처럼 동작할 수 있으며, 별도의 권한 검사를 거치지 않습니다.
리눅스에는 수많은 capabilities가 존재하며, 자세한 내용은 man 페이지에서 확인할 수 있습니다.
이 가이드의 핵심은 CAP_NET_RAW, CAP_NET_ADMIN, CAP_NET_BIND_SERVICE 세 가지 capability를 Nmap에 부여하여, root 사용자 권한 검사 없이도 실행될 수 있도록 만드는 것입니다.
주의: 상위 권한(capabilities)을 설정할 때는 신중해야 합니다. 악의적인 사용자가 Nmap의 Scripting Engine을 악용하면 전체 sudo 권한을 획득하거나, 스크립트를 통해 로컬 호스트의 취약점을 공격할 수 있습니다. 따라서 이러한 설정은 주의해서 적용하거나, Nmap 접근 권한을 특정 그룹으로 제한하는 것이 좋습니다.
sudo와 root 권한 없이 Nmap을 실행하기 위해 부여하는 Linux capabilities는 다음과 같습니다.
- CAP_NET_RAW: 프로세스가 raw 패킷 데이터와 소켓에 접근하고 사용할 수 있도록 허용합니다.
- CAP_NET_ADMIN: IP 방화벽 관리, 네트워크 인터페이스 설정, TOS(Type of Service) 지정, 라우팅 테이블 변경 등 다양한 네트워크 작업을 수행할 수 있는 능력을 부여합니다.
- CAP_NET_BIND_SERVICE: 소켓을 인터넷 도메인의 특권 포트(privileged ports)에 바인딩할 수 있도록 합니다.
Linux capabilities는 스레드와 파일 각각에 대해 "effective", "inheritable", "permitted", "ambient" 집합 형태로 할당됩니다. 여기서는 eip 플래그를 사용하여, 어떤 사용자가 실행하더라도 Nmap이 해당 capabilities를 사용할 수 있도록 설정합니다.
1단계: libcap 설치
Linux capabilities를 설정하려면 먼저 libcap 패키지를 설치해야 합니다. 이 패키지가 있어야 setcap 명령어를 사용할 수 있습니다. 다음 명령어를 실행하세요.
sudo apt-get install libcap2-bin

libcap 설치가 완료되면 이제 setcap 명령어로 Linux capabilities를 수정할 수 있습니다.
2단계: Nmap capabilities 설정
root 권한 없이 Nmap이 실행될 수 있도록 capabilities를 설정하려면 다음 명령어를 실행합니다.
sudo setcap cap_net_raw,cap_net_admin,cap_net_bind_service+eip $(which nmap)
설정이 끝났다면 getcap 명령어로 capabilities가 올바르게 적용되었는지 확인할 수 있습니다.
getcap $(which nmap)

참고: Nmap이 설치된 경로의 전체 경로(full path)를 반드시 지정해야 합니다.
3단계: privilege 플래그로 Nmap 실행
세 가지 capabilities가 모두 설정되었다면, --privileged 플래그를 사용해 Nmap에게 자신에게 이러한 권한이 있다는 사실을 알려줌으로써 sudo 없이 실행할 수 있습니다. 다음 명령어를 실행해 보세요.
nmap --privileged -sS 192.168.0.112

참고: --privileged 옵션을 반드시 사용해야 합니다. 이 옵션이 없으면 Nmap은 자신에게 해당 권한이 있다는 사실을 인식하지 못합니다.
매번 nmap --privileged 플래그를 입력하는 번거로움을 줄이고 싶다면, NMAP_PRIVILEGED 환경 변수를 영구적으로 설정하면 됩니다. export 라인을 아래 파일 중 하나에 추가하세요.
- ~/.xsessionrc: 대부분의 데스크톱/그래픽 환경에서 작동하며, shell과 terminal에 상속됩니다.
- ~/.profile: 로그인이 필요한 shell에서 작동합니다.
- ~/.bashrc: bash에서 작동합니다.
- ~/.gnomerc: GNOME 환경에서만 작동합니다.
마무리
대부분의 Nmap 포트 스캐닝 및 호스트 탐색 방식은 root 또는 sudo 권한을 요구합니다. 하지만 이 튜토리얼에서 살펴본 것처럼, root 계정이나 sudoers 그룹에 속하지 않아도 capabilities 설정을 통해 이러한 제한을 우회하고 Nmap을 실행할 수 있습니다. 더 다양한 옵션이 궁금하다면 함께 사용할 만한 최고의 리눅스 포트 스캐너들도 확인해 보시기 바랍니다.