# nmap 빠른 참조

*포트 스캔, 호스트 탐색, 서비스 감지, NSE 스크립트*

> Source: Nmap Documentation (nmap.org/docs) · MIT

## 기본 스캔

### 스캔 대상

```
nmap 192.168.1.1              # single host
nmap 192.168.1.0/24           # entire subnet
nmap 192.168.1.1-50           # IP range
nmap -iL targets.txt          # hosts from file
```

### 대상 지정

| Command | Description |
|---------|-------------|
| `192.168.1.1` | 단일 IP 주소 |
| `192.168.1.0/24` | CIDR 표기 (256 호스트) |
| `192.168.1.1-254` | IP 범위 |
| `example.com` | 호스트명 (IP로 해석) |
| `-iL file.txt` | 파일에서 대상 읽기 |
| `--exclude 192.168.1.1` | 특정 호스트 제외 |
| `--excludefile skip.txt` | 파일에서 제외할 호스트 읽기 |

## 포트 스캔

### 스캔 유형

| Command | Description |
|---------|-------------|
| `-sS` | TCP SYN 스캔 (기본, 스텔스, root 필요) |
| `-sT` | TCP 연결 스캔 (전체 핸드셰이크, root 불필요) |
| `-sU` | UDP 스캔 (느림, 자주 필터링됨) |
| `-sA` | TCP ACK 스캔 (방화벽 감지) |
| `-sN` | TCP NULL 스캔 (플래그 없음) |
| `-sF` | TCP FIN 스캔 (FIN 플래그만) |
| `-sX` | Xmas 스캔 (FIN+PSH+URG 플래그) |

### 포트 선택

```
nmap -p 80,443 target         # specific ports
nmap -p 1-1000 target         # port range
nmap -p- target               # all 65535 ports
nmap --top-ports 100 target   # most common 100 ports
```

### 포트 상태

| Command | Description |
|---------|-------------|
| `open` | 애플리케이션이 연결 수락 중 |
| `closed` | 포트 도달 가능하지만 서비스 없음 |
| `filtered` | 방화벽 차단으로 상태 확인 불가 |
| `unfiltered` | 포트 접근 가능, open/closed 미확인 |
| `open\|filtered` | open인지 filtered인지 판단 불가 |

## 호스트 탐색

### 탐색 방법

| Command | Description |
|---------|-------------|
| `-sn` | 핑 스캔만 수행 (포트 스캔 없음) |
| `-Pn` | 호스트 탐색 건너뜀 (모두 활성으로 처리) |
| `-PS 80,443` | 포트에서 TCP SYN 탐색 |
| `-PA 80` | TCP ACK 탐색 |
| `-PU 53` | UDP 탐색 |
| `-PE` | ICMP 에코 요청 |
| `-PR` | ARP 탐색 (로컬 네트워크) |

### 네트워크 스윕

```
nmap -sn 192.168.1.0/24       # ping sweep subnet
nmap -sn -n 10.0.0.0/24       # sweep, skip DNS
nmap -sn -PR 192.168.1.0/24   # ARP scan (fastest)
```

## 서비스 감지

### 버전 감지

```
nmap -sV target               # detect service versions
nmap -sV --version-intensity 5 target  # deeper probing
nmap -sV --version-all target  # try every probe (slow)
nmap -A target                 # OS + version + scripts + traceroute
```

### 서비스 플래그

| Command | Description |
|---------|-------------|
| `-sV` | 열린 포트에서 서비스/버전 탐색 |
| `--version-intensity 0-9` | 탐색 강도 (기본 7) |
| `--version-light` | 가벼운 탐색 (강도 2) |
| `--version-all` | 모든 탐색 시도 (강도 9) |
| `-A` | 공격적: -sV -O --script=default -traceroute |
| `-sC` | 기본 NSE 스크립트 실행 |

## OS 감지

### OS 핑거프린팅

```
nmap -O target                # OS detection (needs root)
nmap -O --osscan-limit target # only scan promising hosts
nmap -O --osscan-guess target # aggressive OS guessing
nmap -A target                # includes OS detection
```

### OS 감지 플래그

| Command | Description |
|---------|-------------|
| `-O` | OS 감지 활성화 |
| `--osscan-limit` | 열린+닫힌 TCP 포트 없는 호스트 건너뜀 |
| `--osscan-guess` | 더 적극적으로 OS 추측 |
| `--max-os-tries N` | 호스트당 최대 OS 감지 시도 횟수 |

## 스크립트 (NSE)

### 스크립트 사용

```
nmap --script=default target   # default category
nmap --script=vuln target      # vulnerability scripts
nmap --script=http-headers target
nmap --script="http-*" target  # wildcard match
```

### 스크립트 카테고리

| Command | Description |
|---------|-------------|
| `default` | 안전하고 유용한 스크립트 (-sC 단축) |
| `vuln` | 알려진 취약점 확인 |
| `safe` | 비침투적 스크립트 |
| `intrusive` | 대상 충돌 또는 IDS 트리거 가능 |
| `discovery` | 네트워크 및 서비스 탐색 |
| `auth` | 인증 관련 검사 |
| `brute` | 브루트포스 자격증명 테스트 |
| `exploit` | 적극적인 취약점 이용 시도 |

### 유용한 스크립트

| Command | Description |
|---------|-------------|
| `http-title` | 웹 페이지 제목 가져오기 |
| `ssl-cert` | SSL 인증서 상세 정보 표시 |
| `ssh-hostkey` | SSH 호스트 키 핑거프린트 표시 |
| `dns-brute` | DNS 서브도메인 열거 |
| `smb-os-discovery` | SMB를 통해 Windows OS 감지 |
| `vuln` | 모든 취약점 검사 실행 |

## 출력 형식

### 출력 옵션

```
nmap -oN scan.txt target      # normal text output
nmap -oX scan.xml target      # XML output
nmap -oG scan.gnmap target    # grepable output
nmap -oA scan_all target      # all formats at once
```

### 출력 플래그

| Command | Description |
|---------|-------------|
| `-oN file` | 파일에 일반 텍스트 출력 |
| `-oX file` | XML 출력 (도구/파싱용) |
| `-oG file` | 그레퍼블 출력 (호스트당 한 줄) |
| `-oA basename` | 세 가지 형식 모두 (basename.nmap/xml/gnmap) |
| `-v` | 상세 출력 증가 (-vv로 더 많이) |
| `-d` | 디버그 출력 (-dd로 더 많이) |
| `--open` | 열린 포트만 표시 |
| `--reason` | 포트 상태의 이유 표시 |

## 타이밍 및 성능

### 타이밍 템플릿

| Command | Description |
|---------|-------------|
| `-T0 (paranoid)` | 매우 느림, IDS 우회 (탐색 간 5분) |
| `-T1 (sneaky)` | 느림, IDS 우회 (탐색 간 15초) |
| `-T2 (polite)` | 속도 감소, 대역폭 절약 |
| `-T3 (normal)` | 기본 타이밍 |
| `-T4 (aggressive)` | 빠름, 안정적인 네트워크 가정 |
| `-T5 (insane)` | 최고속, 결과 누락 가능 |

### 세밀한 조정

| Command | Description |
|---------|-------------|
| `--min-rate 1000` | 초당 최소 1000 패킷 전송 |
| `--max-rate 500` | 초당 최대 500 패킷 |
| `--max-retries 2` | 최대 탐색 재전송 횟수 |
| `--host-timeout 30m` | 30분 초과 시 호스트 건너뜀 |
| `--scan-delay 1s` | 탐색 간 지연 |
| `--min-parallelism 10` | 최소 병렬 탐색 그룹 수 |

## 방화벽 우회

### 우회 기법

| Command | Description |
|---------|-------------|
| `-f` | 패킷 단편화 (8바이트 청크) |
| `-D RND:5` | 무작위 IP 5개로 디코이 스캔 |
| `-S spoof_ip` | 소스 IP 스푸핑 (원시 패킷 필요) |
| `-e eth0` | 특정 네트워크 인터페이스 사용 |
| `--source-port 53` | 특정 소스 포트 사용 (예: DNS) |
| `--data-length 25` | 패킷에 임의 데이터 추가 |
| `--spoof-mac 0` | MAC 주소 무작위화 |

### 우회 예시

```
nmap -f -D RND:3 target        # fragments + decoys
nmap --source-port 53 target   # DNS port (often allowed)
nmap -T1 --scan-delay 5s target  # slow to evade IDS
```

## 일반 패턴

### 빠른 정찰

```
nmap -T4 -F target             # fast common ports
nmap -T4 -A -v target          # OS + service detection
nmap -sV --top-ports 1000 target  # top 1000 + versions
```

### 종합 스캔

```
# Full TCP + service + OS + scripts
nmap -sS -sV -O -sC -p- -T4 -oA full target
# UDP scan on common ports
nmap -sU --top-ports 50 target
```

### 웹 서버 감사

```
nmap -p 80,443 --script=http-title,http-headers,\
ssl-cert,http-methods target
# Check for open proxies and vulns
nmap -p 80,443,8080 --script=http-open-proxy,vuln target
```

### 네트워크 인벤토리

```
# Discover all live hosts with OS info
nmap -sn 192.168.1.0/24 -oG - | grep "Up"
# Service inventory for subnet
nmap -sV -T4 192.168.1.0/24 -oX inventory.xml
```
