Nmap 완벽 가이드: 2025 최신 명령어와 실전 활용법 (네트워크 스캐닝 입문부터 고급 기법까지)

Nmap 소개

Nmap(Network Mapper)은 오픈 소스 네트워크 탐지 및 보안 감사 도구입니다. 대규모 네트워크를 빠르게 스캔하도록 설계되었으며, 단일 호스트 스캔에도 사용됩니다. Nmap은 원시 IP 패킷을 활용하여 네트워크 상의 활성 호스트, 호스트가 제공하는 서비스(애플리케이션 이름과 버전), 운영 체제(버전 정보 포함), 패킷 필터/방화벽 유형 등을 탐지합니다. 보안 감사 외에도 시스템 관리자와 네트워크 관리자는 네트워크 정보 확인, 서비스 업그레이드 계획 관리, 호스트 및 서비스 모니터링 등 일상 업무에 Nmap을 사용합니다.

핵심 기능

  • 호스트 활성 여부 확인
  • 대상 호스트의 개방 포트 스캔
  • 대상 운영 체제 식별
  • 대상 서비스 버전 정보 확인
  • 취약점 탐지

Nmap 파라미터 상세

기본 사용 형식은 다음과 같습니다.

nmap [스캔 유형] [옵션] [대상 지정]

1. 대상 지정

  • 호스트 이름, IP 주소, 네트워크 대역 등을 전달할 수 있습니다. 예: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
  • -iL <파일명>: 파일에서 대상 호스트/네트워크 목록을 읽어옵니다.
  • -iR <호스트 수>: 무작위로 대상을 선택합니다.
  • --exclude <호스트1[,호스트2]>: 특정 호스트/네트워크를 제외합니다.
  • --excludefile <파일명>: 파일에 정의된 호스트/네트워크를 제외합니다.

2. 호스트 발견

  • -sL: 리스트 스캔 - 스캔 없이 대상 목록만 출력합니다.
  • -sn: Ping 스캔 - 포트 스캔을 비활성화하고 호스트 발견만 수행합니다. (구 -sP와 동일)
  • -Pn: 모든 호스트를 온라인으로 간주 - 호스트 발견을 건너뜁니다.
  • -PS/PA/PU/PY[포트 목록]: TCP SYN/ACK, UDP 또는 SCTP 발견 패킷을 전송합니다.
  • -PE/PP/PM: ICMP 에코, 타임스탬프, 네트워크 마스크 요청 탐색 프로브입니다.
  • -PO[프로토콜 목록]: IP 프로토콜 Ping을 수행합니다.
  • -n/-R: DNS 확인을 수행하지 않음(스캔 속도 향상) / 항상 확인합니다.
  • --dns-servers <서버1[,서버2]>: 사용자 정의 DNS 서버를 지정합니다.
  • --system-dns: 운영 체제의 DNS 확인자를 사용합니다.
  • --traceroute: 각 호스트까지의 라우팅 경로를 추적합니다. (느릴 수 있음)

3. 포트 스캔 기술

Nmap이 구분하는 6가지 포트 상태는 다음과 같습니다.

  • open (열림)
  • closed (닫힘)
  • filtered (필터링됨)
  • unfiltered (필터링되지 않음) - 접근 가능하나 상태 확인 불가
  • open|filtered (열림 또는 필터링됨) - 상태 확인 불가
  • closed|filtered (닫힘 또는 필터링됨) - 상태 확인 불가
  • -sS: TCP SYN 스캔 (반개방 스캔), 빠르고 은밀하며 포트 상태를 명확히 구분합니다.
  • -sT: TCP 연결 스캔, 로그가 남고 효율이 낮습니다.
  • -sA: TCP ACK 스캔, 필터링 여부를 구분합니다.
  • -sW: Window 스캔
  • -sM: Maimon 스캔
  • -sU: UDP 스캔
  • -sN/sF/sX: TCP Null, FIN, Xmas 스캔
  • --scanflags <플래그>: 사용자 정의 TCP 스캔 플래그를 설정합니다.
  • -sI <좀비 호스트[:탐지 포트]>: 유휴 스캔 (좀비 호스트 활용)
  • -sY/sZ: SCTP INIT/COOKIE-ECHO 스캔
  • -sO: IP 프로토콜 스캔 (TCP, ICMP, IGMP 등 지원 프로토콜 탐지)
  • -b <FTP 릴레이 호스트>: FTP 바운스 스캔

4. 포트 지정 및 스캔 순서

  • -p <포트 범위>: 특정 포트만 스캔합니다. 예: -p 22, -p 1-65535
  • -p U:<UDP 포트>,T:<TCP 포트>: 프로토콜별 포트를 지정합니다. 예: -p U:53,111,137,T:21-25,80,139,8080,S:9
  • UDP와 TCP를 동시에 스캔하려면 -sU와 최소 하나의 TCP 스캔 유형(예: -sS)을 함께 지정해야 합니다.
  • --exclude-ports <포트 범위>: 스캔에서 특정 포트를 제외합니다.
  • -F: 빠른 모드 - 기본값보다 적은 수의 포트(상위 100개)를 스캔합니다.
  • -r: 포트를 순차적으로 스캔합니다 (무작위화하지 않음).
  • --top-ports <개수>: 가장 흔한 <개수>개의 포트를 스캔합니다.
  • --port-ratio <비율>: 지정된 비율보다 더 흔한 포트를 스캔합니다.

5. 서비스/버전 탐지

  • -sV: 개방된 포트의 서비스/버전 정보를 탐지합니다.
  • --version-intensity <레벨>: 0(경량)에서 9(모든 프로브 시도)까지 설정, 기본값 7입니다.
  • --version-light: 가장 가능성 높은 프로브로 제한 (강도 2).
  • --version-all: 모든 프로브 시도 (강도 9).
  • --version-trace: 상세 버전 스캔 활동을 출력합니다 (디버깅용).

6. 스크립트 스캔

  • -sC: --script=default와 동일, 기본 스크립트를 실행합니다.
  • --script=<Lua 스크립트>: 쉼표로 구분된 디렉토리, 스크립트 파일, 또는 스크립트 카테고리 목록입니다.
  • --script-args=<n1=v1,[n2=v2,...]>: 스크립트에 인자를 전달합니다.
  • --script-args-file=파일명: 파일에서 NSE 스크립트 인자를 읽어옵니다.
  • --script-trace: 송수신된 모든 데이터를 표시합니다.
  • --script-updatedb: 스크립트 데이터베이스를 업데이트합니다.
  • --script-help=<Lua 스크립트>: 스크립트 도움말을 표시합니다.

7. 운영 체제 탐지

  • -O: 운영 체제 탐지를 활성화합니다. -A는 OS 탐지와 버전 탐지를 동시에 활성화합니다.
  • --osscan-limit: 대상에 대해서만 OS 탐지를 수행합니다.
  • --osscan-guess: 더 적극적으로 OS를 추측합니다.

8. 타이밍 및 성능

  • 시간 관련 옵션은 초 단위 또는 접미사 (ms, s, m, h)를 사용합니다 (예: 30m).
  • -T <0-5>: 타이밍 템플릿 설정 (숫자가 클수록 빠름).
  • --min-hostgroup/max-hostgroup <크기>: 병렬 호스트 스캔 그룹 크기 조정.
  • --min-parallelism/max-parallelism <프로브 수>: 프로브 병렬화.
  • --min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <시간>: 프로브 왕복 시간 지정.
  • --max-retries <시도 횟수>: 포트 스캔 프로브 재전송 횟수 제한.
  • --host-timeout <시간>: 설정 시간이 지나면 대상 스캔을 포기합니다.
  • --scan-delay/--max-scan-delay <시간>: 프로브 간 지연 시간 조정.
  • --min-rate <개수>: 초당 최소 패킷 전송 수.
  • --max-rate <개수>: 초당 최대 패킷 전송 수.

9. 방화벽 및 IDS 우회

  • -f; --mtu <값>: 패킷 조각화 (MTU 값 사용 가능).
  • -D <데코이1,데코이2[,ME],...>: 데코이(유인) 호스트를 사용한 은밀 스캔.
  • -S <IP 주소>: 소스 주소 스푸핑.
  • -e <인터페이스>: 지정된 인터페이스 사용.
  • -g/--source-port <포트 번호>: 지정된 포트 번호 사용.
  • --proxies <url1,[url2],...>: HTTP/SOCKS4 프록시를 통한 연결.
  • --data <16진수 문자열>: 패킷에 사용자 정의 페이로드 추가.
  • --data-string <문자열>: 패킷에 사용자 정의 ASCII 문자열 추가.
  • --data-length <개수>: 패킷에 랜덤 데이터 추가.
  • --ip-options <옵션>: 특정 IP 옵션과 함께 패킷 전송.
  • --ttl <값>: IP TTL(Time To Live) 값 설정.
  • --spoof-mac <MAC 주소/접두사/공급업체명>: MAC 주소 스푸핑.
  • --badsum: 잘못된 TCP/UDP/SCTP 체크섬을 가진 패킷 전송.

10. 출력

  • -oN <파일>: 표준 출력.
  • -oX <파일>: XML 형식 출력.
  • -oS <파일>: 스크립트 형식 출력.
  • -oG <파일>: Grepable 형식 출력.
  • -oA <기본 이름>: 세 가지 주요 형식(Normal, XML, Grepable)을 한 번에 출력.
  • -v: 상세 수준 증가 (-vv 등으로 더 증가).
  • -d: 디버그 수준 증가 (-dd 등으로 더 증가), 최대 9.
  • --reason: 포트가 특정 상태인 이유를 표시.
  • --open: 열린(또는 열렸을 가능성이 있는) 포트만 표시.
  • --packet-trace: 모든 송수신 패킷을 표시.
  • --iflist: 호스트 인터페이스 및 라우팅 정보 출력 (디버깅용).
  • --append-output: 파일 덮어쓰기 대신 추가.
  • --resume <파일명>: 중단된 스캔 재개.
  • --noninteractive: 키보드를 통한 런타임 상호 작용 비활성화.
  • --stylesheet <경로/URL>: XML 출력을 HTML로 변환하는 XSL 스타일시트.
  • --webxml: 더 휴대성 있는 XML을 위해 Nmap.Org의 스타일시트 참조.
  • --no-stylesheet: XML 출력과 XSL 스타일시트 연결 방지.

11. 기타

  • -6: IPv6 스캔 활성화.
  • -A: OS 탐지, 버전 탐지, 스크립트 스캔, traceroute 활성화.
  • --datadir <디렉토리명>: 사용자 정의 Nmap 데이터 파일 위치 지정.
  • --send-eth/--send-ip: 원시 이더넷 프레임 또는 IP 패킷을 사용하여 전송.
  • --privileged: 사용자가 전체 권한을 가진 것으로 가정.
  • --unprivileged: 사용자가 원시 소켓 권한이 없는 것으로 가정.
  • -V: 버전 출력.
  • -h: 도움말 출력.

실전 활용 예제

기본 스캔 유형

  1. 일반 스캔

    nmap 192.168.30.196

    대상 호스트의 일반 포트를 자동 탐지하고 서비스 정보를 식별합니다. 빠른 정보 수집에 적합합니다.

    nmap 192.168.30.196 -A

    -A 플래그는 포트 1-10000에 대한 스캔, 운영 체제 탐지, 라우팅 추적, 서비스 탐지를 포함하는 종합적인 분석을 제공합니다.

  2. 네트워크 대역 스캔

    nmap 192.168.30.0/24

    CIDR 표기법을 사용하여 전체 서브넷을 스캔합니다.

    nmap 192.168.30.1-254

    범위 지정을 통해 동일한 서브넷을 스캔합니다.

  3. 파일 기반 스캔

    nmap -iL host_list.txt -A

    host_list.txt 파일에 정의된 호스트 목록을 읽어 종합적인 스캔을 수행합니다.

  4. 호스트 발견 전용

    nmap -sn 192.168.30.0/24

    포트 스캔 없이 Ping을 통해 네트워크 내 활성 호스트만 확인합니다.

  5. 특정 포트 스캔

    nmap 192.168.30.196 -p 22,80,443

    지정된 포트(22, 80, 443)만 스캔합니다.

    nmap 192.168.30.196 -p-

    1부터 65535까지의 모든 포트를 스캔합니다.

  6. 상위 포트 스캔

    nmap -sT -A --top-ports=100 192.168.30.0/24 -oG top_ports_scan.gnmap

    가장 흔한 100개의 포트만 집중적으로 스캔하고 결과를 Grepable 형식으로 저장합니다.

  7. SYN 스캔

    nmap -sS 192.168.30.196

    반개방 SYN 스캔으로, 은밀하게 포트 상태를 확인합니다.

  8. TCP 연결 스캔

    nmap -sT 192.168.30.196

    완전한 TCP 연결을 수행하여 정확하게 포트를 확인합니다.

  9. UDP 스캔

    sudo nmap -sU 192.168.30.196

    UDP 포트를 스캔합니다. 일반적으로 sudo 권한이 필요하며, DNS, SNMP 같은 서비스 탐지에 유용합니다.

  10. 복합 프로토콜 스캔

    sudo nmap -sU -sS 192.168.30.196

    UDP와 TCP SYN 스캔을 동시에 수행합니다.

  11. 출력 파일 저장 및 분석

    nmap -v -sn 192.168.30.0/24 -oG live_hosts.gnmap
    grep "Up" live_hosts.gnmap | cut -d " " -f 2

    첫 번째 명령으로 활성 호스트를 Grepable 형식으로 저장하고, 두 번째 명령으로 IP 주소만 추출합니다.

  12. 운영 체제 및 서비스 핑거프린팅

    nmap -O 192.168.30.196 --osscan-guess

    운영 체제를 적극적으로 추측하여 식별합니다.

    nmap 192.168.30.196 -p 22,80,139,445 -sV -sC -O --version-all

    지정된 포트에 대해 서비스 버전(-sV), 기본 스크립트(-sC), OS 탐지(-O), 상세 버전 탐지(--version-all)를 결합한 심층 분석을 수행합니다.

  13. SMB 서비스 검색

    nmap -v -p 139,445 192.168.30.0/24 -oG smb_scan.gnmap

    SMB 관련 포트(139, 445)만 스캔하여 파일 공유 서비스를 제공하는 호스트를 식별합니다.

  14. 스크립트 기반 스캔

    nmap --script=vuln 192.168.30.196 -A

    취약점 탐지 스크립트를 실행하고(-sC 대신 --script=vuln) 종합 정보(-A)를 수집합니다.

    nmap --script=http-title 192.168.30.196

    특정 스크립트(http-title)를 실행하여 웹 페이지 제목을 가져옵니다.

    nmap --script="http-*" 192.168.30.196

    http-로 시작하는 모든 HTTP 관련 스크립트를 실행합니다.

  15. 서비스 버전 탐지

    nmap -sV 192.168.30.196

    개방된 포트의 서비스와 버전을 식별하여 보안 취약점 분석의 기초를 제공합니다.

NSE 스크립트 활용

카테고리 기반 스캔

Nmap 스크립트 엔진(NSE)은 다양한 카테고리로 분류됩니다. --script 옵션으로 특정 카테고리를 지정할 수 있습니다.

  • auth: 인증 메커니즘 점검
  • broadcast: 네트워크 브로드캐스트 정보 수집
  • brute: 무차별 대입 공격 테스트
  • default: 기본 스크립트 실행
  • discovery: 네트워크 자원 발견
  • dos: DoS 취약점 점검
  • exploit: 알려진 취약점 활용 시도
  • external: 외부 리소스(DNSBL 등) 활용
  • fuzzer: 퍼징 테스트 (서비스 영향 가능)
  • intrusive: 높은 영향도의 스크립트 (주의 필요)
  • malware: 악성코드 감염 징후 탐지
  • safe: 대상에 거의 영향을 주지 않는 안전한 스크립트
  • version: 서비스 버전 탐지
  • vuln: 알려진 취약점 탐지

사용 예시: 서브넷 내 모든 호스트 스캔

nmap --script=vuln 192.168.30.0/24

위 명령은 192.168.30.0/24 네트워크의 모든 호스트에서 알려진 취약점을 검사합니다.

서비스별 스크립트 활용

HTTP/HTTPS

nmap --script=http-* 192.168.30.0/24
  • http-title: 웹 페이지 제목 확인
  • http-enum: 웹 디렉토리/파일 열거
  • http-vuln-*: HTTP 관련 취약점 탐지
  • ssl-cert: HTTPS 인증서 정보 확인

FTP

nmap --script=ftp-* 192.168.30.0/24
  • ftp-anon: 익명 로그인 허용 여부 확인
  • ftp-brute: FTP 비밀번호 무차별 대입
  • ftp-syst: FTP 시스템 정보 확인

SMB

nmap --script=smb-* 192.168.30.0/24
  • smb-os-discovery: SMB OS 정보 확인
  • smb-enum-shares: 공유 폴더 열거
  • smb-vuln-*: SMB 취약점 (예: EternalBlue) 탐지

SSH

nmap --script=ssh-* 192.168.30.0/24
  • ssh-hostkey: SSH 호스트 키 수집
  • ssh-auth-methods: 지원되는 인증 방식 확인
  • ssh-brute: SSH 비밀번호 무차별 대입

DNS

nmap --script=dns-* 192.168.30.0/24
  • dns-brute: DNS 서브도메인 무차별 대입
  • dns-nsid: DNS NSID 정보 확인
  • dns-zone-transfer: DNS 영역 전송 시도

데이터베이스

MySQL

nmap --script=mysql-* 192.168.30.0/24
  • mysql-info: MySQL 서비스 정보 확인
  • mysql-brute: MySQL 비밀번호 무차별 대입
  • mysql-vuln-*: MySQL 취약점 탐지

PostgreSQL

nmap --script=pgsql-* 192.168.30.0/24
  • pgsql-brute: PostgreSQL 비밀번호 무차별 대입
  • pgsql-info: PostgreSQL 서비스 정보 확인

MongoDB

nmap --script=mongodb-* 192.168.30.0/24
  • mongodb-info: MongoDB 서비스 정보 확인
  • mongodb-brute: MongoDB 비밀번호 무차별 대입

기타 서비스

SMTP: nmap --script=smtp-* ...

  • smtp-enum-users: SMTP 사용자 열거
  • smtp-commands: 지원되는 SMTP 명령어 확인
  • smtp-vuln-cve*: SMTP 관련 취약점 탐지

SNMP: nmap --script=snmp-* ...

  • snmp-brute: SNMP 커뮤니티 문자열 무차별 대입
  • snmp-info: SNMP 시스템 정보 수집

Telnet: nmap --script=telnet-* ...

  • telnet-encryption: Telnet 암호화 지원 확인
  • telnet-brute: Telnet 비밀번호 무차별 대입

VNC: nmap --script=vnc-* ...

  • vnc-info: VNC 서비스 정보 확인
  • vnc-brute: VNC 비밀번호 무차별 대입

태그: Nmap NSE 네트워크 스캐닝 포트 스캔 취약점 탐지

7월 1일 22:57에 게시됨