/보안 기법/네트워크 정찰 (Network Reconnaissance) 기법
정보 수집2024-12-25

네트워크 정찰 (Network Reconnaissance) 기법

침투 테스트 첫 단계인 정보 수집과 정찰. Nmap 스캔, OSINT 도구, 서비스 열거, 취약점 스캔까지 체계적인 정찰 방법론과 도구 사용법을 정리.

#Recon#Nmap#OSINT#Network Scanning#Enumeration

기본 원리: 네트워크 스캔은 어떻게 작동하는가

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)
  수동 검증 → 실제 공격 가능 여부 확인

⚠️ 모든 능동 정찰과 취약점 스캔은 서면으로 권한을 부여받은 대상에게만 수행해야 한다. 무단 스캔은 불법이다.

⚠️ 이 글의 내용은 교육 및 허가된 침투 테스트 목적으로만 사용해야 합니다. 무단으로 타인의 시스템에 적용하는 것은 법적 처벌을 받을 수 있습니다.