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: 도움말 출력.
실전 활용 예제
기본 스캔 유형
-
일반 스캔
nmap 192.168.30.196대상 호스트의 일반 포트를 자동 탐지하고 서비스 정보를 식별합니다. 빠른 정보 수집에 적합합니다.
nmap 192.168.30.196 -A-A플래그는 포트 1-10000에 대한 스캔, 운영 체제 탐지, 라우팅 추적, 서비스 탐지를 포함하는 종합적인 분석을 제공합니다. -
네트워크 대역 스캔
nmap 192.168.30.0/24CIDR 표기법을 사용하여 전체 서브넷을 스캔합니다.
nmap 192.168.30.1-254범위 지정을 통해 동일한 서브넷을 스캔합니다.
-
파일 기반 스캔
nmap -iL host_list.txt -Ahost_list.txt파일에 정의된 호스트 목록을 읽어 종합적인 스캔을 수행합니다. -
호스트 발견 전용
nmap -sn 192.168.30.0/24포트 스캔 없이 Ping을 통해 네트워크 내 활성 호스트만 확인합니다.
-
특정 포트 스캔
nmap 192.168.30.196 -p 22,80,443지정된 포트(22, 80, 443)만 스캔합니다.
nmap 192.168.30.196 -p-1부터 65535까지의 모든 포트를 스캔합니다.
-
상위 포트 스캔
nmap -sT -A --top-ports=100 192.168.30.0/24 -oG top_ports_scan.gnmap가장 흔한 100개의 포트만 집중적으로 스캔하고 결과를 Grepable 형식으로 저장합니다.
-
SYN 스캔
nmap -sS 192.168.30.196반개방 SYN 스캔으로, 은밀하게 포트 상태를 확인합니다.
-
TCP 연결 스캔
nmap -sT 192.168.30.196완전한 TCP 연결을 수행하여 정확하게 포트를 확인합니다.
-
UDP 스캔
sudo nmap -sU 192.168.30.196UDP 포트를 스캔합니다. 일반적으로
sudo권한이 필요하며, DNS, SNMP 같은 서비스 탐지에 유용합니다. -
복합 프로토콜 스캔
sudo nmap -sU -sS 192.168.30.196UDP와 TCP SYN 스캔을 동시에 수행합니다.
-
출력 파일 저장 및 분석
nmap -v -sn 192.168.30.0/24 -oG live_hosts.gnmapgrep "Up" live_hosts.gnmap | cut -d " " -f 2첫 번째 명령으로 활성 호스트를 Grepable 형식으로 저장하고, 두 번째 명령으로 IP 주소만 추출합니다.
-
운영 체제 및 서비스 핑거프린팅
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)를 결합한 심층 분석을 수행합니다.
-
SMB 서비스 검색
nmap -v -p 139,445 192.168.30.0/24 -oG smb_scan.gnmapSMB 관련 포트(139, 445)만 스캔하여 파일 공유 서비스를 제공하는 호스트를 식별합니다.
-
스크립트 기반 스캔
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.196http-로 시작하는 모든 HTTP 관련 스크립트를 실행합니다. -
서비스 버전 탐지
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 비밀번호 무차별 대입