기본 원리: 네트워크 스캔은 어떻게 작동하는가
TCP 포트 상태와 핸드셰이크
TCP 연결은 3-Way Handshake로 성립된다:
정상 연결:
클라이언트 ──SYN──────────────→ 서버
클라이언트 ←──SYN+ACK──────── 서버 (포트 열려 있음)
클라이언트 ──ACK──────────────→ 서버
[연결 수립]
포트가 닫혀 있을 때:
클라이언트 ──SYN──────────────→ 서버
클라이언트 ←──RST+ACK──────── 서버 (포트 닫힘)
방화벽이 차단할 때:
클라이언트 ──SYN──────────────→ 서버
[응답 없음 = 타임아웃] (필터링됨)
Nmap은 이 응답 패턴으로 포트 상태를 판단한다:
SYN+ACK수신 → open (열림)RST수신 → closed (닫힘)- 응답 없음 → filtered (방화벽 차단)
SYN 스캔 vs TCP Connect 스캔
SYN 스캔 (스텔스 스캔):
클라이언트 ──SYN──→ 서버
클라이언트 ←──SYN+ACK── 서버 (열림 확인)
클라이언트 ──RST──→ 서버 ← 연결을 완료하지 않고 RST로 끊음
장점: 서버의 연결 로그에 기록되지 않을 수 있음
단점: root 권한 필요 (raw 소켓 사용)
TCP Connect 스캔:
완전한 3-Way Handshake 후 연결 종료
장점: root 불필요
단점: 연결 로그에 기록됨
정찰의 단계
1. 수동 정찰 (Passive Recon)
대상과 직접 접촉하지 않음 → 탐지 위험 없음
→ OSINT, WHOIS, Shodan, Google Dorks, DNS 조회
2. 능동 정찰 (Active Recon)
대상에 직접 패킷 전송 → 탐지 가능
→ Nmap, 서비스 열거, 취약점 스캔
1. 수동 정찰 (OSINT)
WHOIS / DNS 조회
도메인 등록 정보와 DNS 레코드는 공개 정보다.
# WHOIS: 도메인 등록자 정보
whois example.com
# 등록자, 연락처, 네임서버, 등록일 등 확인
# DNS 레코드 조회
dig example.com A # IPv4 주소
dig example.com AAAA # IPv6 주소
dig example.com MX # 메일 서버 (사용 중인 메일 서비스 파악)
dig example.com NS # 네임서버
dig example.com TXT # SPF, DMARC, 도메인 소유권 인증 등
dig example.com CNAME # 별칭
dig example.com ANY # 모든 레코드
# Zone Transfer (잘못 설정된 서버에서 전체 DNS 레코드 획득)
dig axfr @ns1.example.com example.com
# 성공하면: 내부 서브도메인, IP 대역, 인프라 구조 전체 노출!
# 대부분의 현대 서버는 차단하지만 구형 서버는 여전히 취약
Shodan — 인터넷에 노출된 장비 검색
Shodan은 전체 인터넷을 지속적으로 스캔해서 노출된 서비스 정보를 수집하는 검색엔진이다.
import shodan
api = shodan.Shodan("YOUR_API_KEY")
# 특정 조직의 인터넷 노출 장비
results = api.search('org:"Target Corp"')
for r in results['matches']:
print(f"IP: {r['ip_str']}:{r.get('port', '')}")
print(f"Product: {r.get('product', 'Unknown')}")
print(f"OS: {r.get('os', 'Unknown')}")
print(f"Banner: {r.get('data', '')[:100]}")
print("---")
# 취약한 장비 검색
api.search('vuln:CVE-2024-3400') # PAN-OS 취약점 장비
api.search('product:"Apache" version:"2.4.49"') # 특정 버전
# SSL 인증서로 서브도메인 찾기
api.search('ssl.cert.subject.cn:*.example.com')
# Shodan CLI
shodan search 'org:"Target Corp" port:22'
shodan host 203.0.113.10 # 특정 IP의 모든 노출 서비스
shodan count 'port:3389 country:KR' # 한국 RDP 노출 장비 수
Google Dorks — 노출된 민감 정보 검색
# 기본 구문
site:example.com filetype:pdf # 특정 사이트의 PDF 파일
site:example.com inurl:admin # admin URL
site:example.com intitle:"index of" # 디렉토리 리스팅
site:example.com intext:"password" # 비밀번호 포함 페이지
# 민감한 파일 유형
site:example.com filetype:env # .env 파일 (API 키, DB 정보)
site:example.com filetype:sql # SQL 덤프 파일
site:example.com filetype:bak # 백업 파일
site:example.com filetype:log # 로그 파일
site:example.com filetype:conf # 설정 파일
site:example.com filetype:xml "password" # XML 설정 파일의 비밀번호
# 로그인 페이지 찾기
site:example.com inurl:login
site:example.com inurl:wp-admin # WordPress 관리자
site:example.com inurl:/admin/
# 에러 메시지로 기술 스택 파악
site:example.com "SQL syntax" # SQL 에러 노출 → SQLi 가능성
site:example.com "ORA-" # Oracle DB 에러
site:example.com "stack trace" # 디버그 모드 노출
# GitHub에서 소스코드 검색 (API 키, 자격증명 노출)
# github.com에서 직접: "example.com" password OR api_key OR secret
2. Nmap 스캔 — 포트/서비스 탐지
스캔 유형
# ─── 호스트 탐지 ───
nmap -sn 192.168.1.0/24 # 포트 스캔 없이 호스트 탐지만
nmap -sn 192.168.1.0/24 --open # 응답하는 호스트만 표시
nmap -PR 192.168.1.0/24 # ARP 스캔 (같은 네트워크)
# ─── 포트 스캔 ───
nmap -sS 192.168.1.10 # SYN 스캔 (스텔스, root 필요)
nmap -sT 192.168.1.10 # TCP Connect 스캔 (root 불필요)
nmap -sU 192.168.1.10 # UDP 스캔 (느림, DNS/SNMP/NTP 탐지)
# 포트 범위 지정
nmap -p 22,80,443,8080,3306 target
nmap -p 1-1000 target
nmap -p- target # 전체 65535 포트 (느림)
nmap -F target # 상위 100개 포트 (빠름)
nmap --top-ports 1000 target # 상위 1000개 포트
# ─── 버전/OS 탐지 ───
nmap -sV target # 서비스 버전 탐지
nmap -O target # OS 탐지 (root 필요)
nmap -A target # 모든 것 (버전+OS+스크립트+traceroute)
nmap -sV -sC -O target # 가장 일반적인 조합
NSE 스크립트 — 자동 취약점 탐지
NSE(Nmap Scripting Engine)는 Lua로 작성된 스크립트로 서비스별 심화 분석을 수행한다.
# 기본 스크립트 세트 실행 (-sC)
nmap -sC target
# 카테고리별 실행
nmap --script=vuln target # 알려진 취약점 전체 검사
nmap --script=auth target # 기본 자격증명 테스트
nmap --script=discovery target # 서비스 디스커버리
nmap --script=brute target # 브루트포스
# 개별 스크립트
nmap --script=http-title target # HTTP 타이틀 수집
nmap --script=http-enum target # 웹 디렉토리/파일 열거
nmap --script=smb-vuln-ms17-010 target # EternalBlue (WannaCry 취약점)
nmap --script=smb-vuln-ms08-067 target # Conficker 취약점
nmap --script=ssl-heartbleed target # Heartbleed 취약점
nmap --script=ftp-anon target # FTP 익명 접근
nmap --script=http-shellshock --script-args uri=/cgi-bin/test.cgi target # Shellshock
# 결과 저장 (항상 저장하는 습관)
nmap -sV -sC -oA scan_results target # XML, 일반, grepable 형식 모두 저장
nmap -sV -sC -oX result.xml target # XML만
방화벽 우회 기법
# 1. 패킷 단편화 (패킷 검사 우회)
nmap -f target # 8바이트 단편화
nmap -mtu 16 target # MTU 16바이트로 단편화
# 2. 디코이 (가짜 출처 IP 혼합)
nmap -D RND:10 target # 랜덤 10개 IP와 혼합
nmap -D 1.1.1.1,2.2.2.2,ME target # 특정 IP + 나 자신
# 3. 느린 스캔 (IDS 탐지 회피)
nmap -T0 target # Paranoid (5분 간격)
nmap -T1 target # Sneaky (15초 간격)
nmap -T2 target # Polite (0.4초 간격)
# 기본값은 T3, T4/T5는 빠르지만 탐지 위험 높음
# 4. 소스 포트 위조 (특정 포트 허용 방화벽 우회)
nmap --source-port 53 target # DNS 포트(53)로 위장
nmap --source-port 80 target # HTTP 포트로 위장
# 5. Idle Scan (완전한 익명 스캔)
# zombie_ip: IPID가 순차적으로 증가하는 유휴 호스트 필요
nmap -sI zombie_ip:80 target
3. 서비스별 심화 열거
HTTP/HTTPS (80, 443, 8080...)
# 디렉토리/파일 브루트포스
gobuster dir \
-u http://target.com \
-w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \
-x php,html,txt,asp,aspx \
-t 50 # 50 스레드
# ffuf (더 빠름)
ffuf -u http://target.com/FUZZ \
-w /usr/share/wordlists/seclists/Discovery/Web-Content/big.txt \
-mc 200,301,302,403 \
-t 100
# 서브도메인 열거
subfinder -d example.com -all # 수동 정찰 (DNS, CT로그 등)
gobuster dns -d example.com -w subdomains.txt
ffuf -u http://FUZZ.example.com -w subdomains.txt \
-H "Host: FUZZ.example.com" -fc 302 # 가상호스트 스캔
# 웹 기술 탐지
whatweb http://target.com # 프레임워크, CMS, 서버 버전
# 예시 출력: WordPress[5.9.1], Apache[2.4.52], PHP[8.0.15]
SMB (445, 139) — Windows 파일 공유
# 기본 열거
enum4linux -a 192.168.1.100 # 포괄적 SMB 열거
smbclient -L //192.168.1.100 -N # 공유 목록 (익명)
smbclient //192.168.1.100/SHARE -N # 익명 접근 시도
# CrackMapExec (내부망 전체 조사에 강력)
crackmapexec smb 192.168.1.0/24 # 네트워크 스캔
crackmapexec smb 192.168.1.100 -u admin -p password --shares # 자격증명으로 접근
crackmapexec smb 192.168.1.100 -u admin -p password -x "whoami" # 명령 실행
# EternalBlue 취약점 확인 (MS17-010, WannaCry)
nmap --script smb-vuln-ms17-010 192.168.1.100
LDAP (389, 636) — Active Directory
# 익명 LDAP 접근
ldapsearch -x -H ldap://192.168.1.10 -b "DC=company,DC=local"
# 익명 접근 허용 시 사용자, 그룹 정보 대량 노출
# 자격증명 있을 때
ldapsearch -x -H ldap://192.168.1.10 \
-D "CN=user,CN=Users,DC=company,DC=local" \
-w password \
-b "DC=company,DC=local" \
"(objectClass=user)" sAMAccountName mail memberOf
SNMP (161 UDP) — 네트워크 장비 정보
# Community string이 public인 경우 (흔한 기본값)
snmpwalk -v2c -c public 192.168.1.1 # 전체 OID 트리 조회
snmpget -v2c -c public 192.168.1.1 sysDescr.0 # 시스템 설명
# 정보 수집
snmpwalk -v2c -c public target 1.3.6.1.2.1.25.4.2.1.2 # 실행 중인 프로세스
snmpwalk -v2c -c public target 1.3.6.1.2.1.25.6.3.1.2 # 설치된 소프트웨어
4. 취약점 자동 스캔
# Nikto: 웹 서버 구성 및 알려진 취약점
nikto -h http://target.com
nikto -h http://target.com -p 8080,8443 # 여러 포트
# Nuclei: 템플릿 기반 고속 스캔
nuclei -u http://target.com -t cves/ # CVE 템플릿
nuclei -u http://target.com -t exposures/ # 민감 파일 노출
nuclei -u http://target.com -t default-logins/ # 기본 자격증명
nuclei -l targets.txt -t cves/ -o results.txt # 다수 타겟
핵심 워크플로우
Phase 1 - 수동 정찰 (탐지 위험 없음)
↓
WHOIS + DNS → 도메인 구조, IP 대역 파악
Shodan → 인터넷 노출 서비스, 장비 버전
Google Dorks → 민감 파일, 설정, 에러 노출 여부
↓
Phase 2 - 능동 정찰 (서면 동의 후만!)
↓
Nmap -sn → 살아있는 호스트 목록
Nmap -sV -sC → 포트/서비스/버전 확인
↓
Phase 3 - 서비스별 심화 열거
↓
HTTP → gobuster/ffuf로 디렉토리, 서브도메인
SMB → enum4linux, CrackMapExec
LDAP → ldapsearch
SNMP → snmpwalk
↓
Phase 4 - 취약점 식별
↓
Nikto/Nuclei → 자동 스캔
서비스 버전 → CVE 검색 (NVD, exploit-db)
수동 검증 → 실제 공격 가능 여부 확인
⚠️ 모든 능동 정찰과 취약점 스캔은 서면으로 권한을 부여받은 대상에게만 수행해야 한다. 무단 스캔은 불법이다.