Step 249. 네트워크 침해 사고 분석 시뮬레이션 — 패킷 속에서 사건을 재구성한다

Step 249. 네트워크 침해 사고 분석 시뮬레이션 — 패킷 속에서 사건을 재구성한다

Level 3 — CTF 실전과 공격 스킬 심화 | 난이도 ★★★★☆ | 예상 소요 시간 3시간

전제: Step 83~84(Wireshark 캡처와 필터), Step 245(침입 흔적 타임라인 재구성), Step 173(침투 보고서 작성)를 마쳤다. tshark 명령행 사용법을 안다.

  • 준비물: WSL 우분투(실측: Ubuntu 24.04, tshark 4.2.2, scapy 2.7.0 venv), 작업 폴더, 마크다운 에디터.
  • ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. 오늘의 pcap은 여러분이 직접 생성하는 연습용 파일입니다.
  • 성격 안내: 오늘은 [실습] 챕터입니다. 공격자 역할과 분석자 역할을 둘 다 합니다 — 시나리오 pcap을 직접 만든 뒤, 그 파일을 "모르는 사건"처럼 분석합니다.

포렌식 트랙의 종합 시험은 침해 사고 전체를 다루는 것입니다. 실무의 침해 사고 대응(Incident Response, IR) 팀은 사건이 터지면 증거 묶음을 받아 침입 지점을 찾고, 피해 범위를 정하고, 타임라인을 만들고, 보고서를 씁니다. 오늘은 그 일과를 축소판으로 체험합니다.

실제 현장의 pcap은 남이 만듭니다. 하지만 첫 연습에서는 여러분이 공격 패킷을 직접 생성하는 편이 낫습니다 — 정답을 알고 만든 파일을 분석하면, "어떤 지문이 남는가"를 정확히 대조하며 배울 수 있기 때문입니다. 만드는 사람의 눈과 찾는 사람의 눈을 하루에 둘 다 써 보는 날입니다.


1. 학습 목표

이 챕터를 끝내면 다음을 할 수 있습니다:

  • IR 절차(준비 → 탐지 → 봉쇄 → 복구 → 교훈)의 다섯 단계를 말할 수 있다
  • scapy로 시나리오 pcap을 생성해 분석 연습 재료를 만든다
  • tshark 통계(io,phs, conv,tcp)로 낯선 pcap의 전체 형태를 먼저 파악한다
  • 스캔·무차별 대입·데이터 유출의 세 지문을 필터로 찾아낸다
  • 증거에서 타임라인을 재구성하고 6단 구성의 IR 보고서를 작성한다

2. 배경 지식 — 오늘의 도구와 개념

오늘의 도구 한눈에 보기

구분 내용
언어·환경 파이썬 3(scapy venv) + WSL 리눅스 셸
오늘의 명령 tshark -r, -Y 디스플레이 필터, -z io,phs, -z conv,tcp, -T fields
필요한 개념 IR 5단계, 스캔 지문, 무차별 대입 지문, 데이터 유출 지문, 증거 보존
오늘의 산출물 incident.pcap(직접 생성) + 타임라인 표 + IR 보고서 1부

2-1. IR 절차 — 다섯 단계

침해 사고 대응은 표준화된 절차가 있습니다. 다섯 단계로 기억하면 됩니다.

① 준비(Preparation)   — 평소에 도구와 기준선을 마련해 둔다
② 탐지(Detection)     — 이상 징후를 찾고 사고를 선언한다
③ 봉쇄(Containment)   — 확산을 막는다 (계정 정지, 네트워크 차단)
④ 복구(Recovery)      — 시스템을 정상으로 되돌린다
⑤ 교훈(Lessons)       — 보고서를 쓰고 재발 방지를 적용한다

오늘의 실습은 ② 탐지부터 ⑤ 교훈까지를 다룹니다. ① 준비의 산출물이 "평소 상태의 기준선"이라는 것을 기억하세요 — 이상은 기준과 비교해야 보입니다.

2-2. 공격자는 지문을 남긴다 — 세 가지 패턴

네트워크 침해는 대부분 세 장면의 연속입니다. 각 장면은 pcap에 서로 다른 모양으로 남습니다.

스캔의 지문: 한 출발지가 짧은 시간에 여러 포트로 SYN을 보냅니다. SYN을 보내고 닫힌 포트에서 RST가 돌아오는 쌍이 연속으로 이어지는 모양입니다.

무차별 대입의 지문: 같은 서비스에 인증 실패 응답이 반복됩니다. FTP라면 530 Login incorrect, SSH라면 인증 실패가 연속해서 쌓입니다.

유출의 지문: 안쪽 호스트에서 바깥으로 가는 바이트가 비정상적으로 큽니다. 대화(conversation) 통계에서 "나가는 방향의 바이트"가 튀는 세션이 용의자입니다.

2-3. tshark — Wireshark의 명령행 얼굴

Step 83~84에서 GUI로 다룬 Wireshark의 엔진이 tshark입니다. 서버나 자동화 환경에서는 명령행만 가능하므로, 세 가지 사용법을 외워 둡니다.

  • tshark -r 파일 -q -z io,phs — 프로토콜 계층 통계: "이 파일에 뭐가 들어 있나"
  • tshark -r 파일 -q -z conv,tcp — TCP 대화 목록: "누가 누구와, 얼마나 주고받았나"
  • tshark -r 파일 -Y "필터" -T fields -e 필드명 — 조건에 맞는 패킷의 특정 필드만 추출

분석의 철칙은 전체 형태부터, 그다음 상세입니다. 통계로 지도를 얻고, 필터로 확대합니다.

2-4. 증거 보존 — 분석은 원본을 더럽히지 않는다

실무에서는 원본 증거의 해시를 먼저 찍고 복사본에서 분석합니다. 연습에서도 습관을 들이세요 — 원본 pcap은 읽기 전용으로 두고(tshark -r은 읽기만 합니다), 분석 산출물은 별도 작업 폴더에 쌓습니다. 보고서의 모든 주장은 이 폴더의 증거를 가리켜야 합니다.


3. 따라 하기

3-1. 사건 파일 만들기 — scapy로 시나리오 pcap 생성

먼저 공격자 역할입니다. 세 장면(스캔 → FTP 무차별 대입 → 파일 탈취 후 유출)을 패킷으로 합성합니다. 작업 폴더에 make_incident_pcap.py를 만듭니다.

# 침해 시나리오 pcap 생성기 — scapy
# 공격자 10.0.0.55 → 피해 서버 10.0.0.10
from scapy.all import IP, TCP, Raw, wrpcap

BASE = 1757360000.0  # 고정 기준 시각 (epoch)
ATTACKER = "10.0.0.55"
SERVER = "10.0.0.10"
OPEN_PORTS = {21, 22}   # 이 서버에서 열려 있는 포트
pkts = []
t = BASE

def ts():
    global t
    t += 0.05
    return t

def syn(dport, sport):
    p = IP(src=ATTACKER, dst=SERVER) / TCP(sport=sport, dport=dport,
                                           flags="S", seq=1000)
    p.time = ts()
    pkts.append(p)
    flags = "SA" if dport in OPEN_PORTS else "RA"
    r = IP(src=SERVER, dst=ATTACKER) / TCP(sport=dport, dport=sport,
                                           flags=flags, seq=2000, ack=1001)
    r.time = ts()
    pkts.append(r)

def talk(src, dst, sport, dport, payload):
    p = IP(src=src, dst=dst) / TCP(sport=sport, dport=dport,
                                   flags="PA", seq=1, ack=1) / Raw(load=payload)
    p.time = ts()
    pkts.append(p)

# 1장면: 포트 스캔 — 0.05초 간격의 연속 SYN
for i, dport in enumerate(range(1, 41)):
    syn(dport, sport=40000 + i)

t += 30  # 스캔 후 공략 지점을 고르는 정지 시간

# 2장면: FTP 무차별 대입 — 실패 5번 뒤 성공 1번
for pw in ["123456", "password", "qwerty", "letmein", "admin", "backup01"]:
    talk(ATTACKER, SERVER, 50000, 21, b"USER admin\r\n")
    talk(SERVER, ATTACKER, 21, 50000, b"331 Password required\r\n")
    talk(ATTACKER, SERVER, 50000, 21, f"PASS {pw}\r\n".encode())
    if pw == "backup01":
        talk(SERVER, ATTACKER, 21, 50000, b"230 Login successful\r\n")
    else:
        talk(SERVER, ATTACKER, 21, 50000, b"530 Login incorrect\r\n")

t += 10

# 3장면: 목록 확인 → 파일 다운로드 → 외부(203.0.113.77)로 대량 전송
talk(ATTACKER, SERVER, 50000, 21, b"LIST\r\n")
talk(SERVER, ATTACKER, 21, 50000,
     b"150 Opening data\r\n-rw-r--r-- 1 admin admin 51200 payroll_2025Q3.xlsx\r\n226 Done\r\n")
talk(ATTACKER, SERVER, 50000, 21, b"RETR payroll_2025Q3.xlsx\r\n")
t += 5
for i in range(36):  # 유출: 서버 → 외부, 1400바이트 × 36
    talk(SERVER, "203.0.113.77", 443, 51000, b"X" * 1400)

wrpcap("incident.pcap", pkts)
print(f"생성 완료: incident.pcap, 패킷 {len(pkts)}개")

입력 (2026-09-09 WSL 실측, scapy 2.7.0 venv의 파이썬 사용):

python3 make_incident_pcap.py

출력 (2026-09-09 실측):

생성 완료: incident.pcap, 패킷 143개

읽는 법: 패킷 143개 = 스캔 80개(SYN+응답) + FTP 27개 + 유출 36개. p.time = ts()로 각 패킷에 시각을 새겼기 때문에, 이 파일은 시계를 품은 "사건 현장"입니다. 실무에서는 이런 파일을 IDS나 미러링 포트가 만들어 줍니다.

3-2. 첫 30초 — 전체 형태 파악

이제 공격자 모자를 벗고 분석자가 됩니다. 방금 만든 파일을 모르는 사건처럼 대합니다. 첫 명령은 프로토콜 계층 통계입니다.

입력 (2026-09-09 실측):

tshark -r incident.pcap -q -z io,phs

출력 (2026-09-09 실측):

===================================================================
Protocol Hierarchy Statistics
Filter:

ip                                       frames:143 bytes:56651
  tcp                                    frames:143 bytes:56651
    ftp                                  frames:27 bytes:1611
      ftp.current-working-directory      frames:27 bytes:1611
    data                                 frames:36 bytes:51840
===================================================================

읽는 법: 전부 TCP이고, 그중 FTP가 27프레임, 내용 불명의 data가 36프레임인데 바이트는 data 쪽(51,840)이 FTP(1,611)의 30배가 넘습니다. "조용한 제어 채널 + 큰 데이터 덩어리"라는 형태가 보이면, 그 큰 덩어리가 다음 조사 대상입니다.

두 번째 명령은 대화 통계입니다.

입력 (2026-09-09 실측):

tshark -r incident.pcap -q -z conv,tcp | head -5

출력 (2026-09-09 실측, 앞부분만):

                                                           |       <-      | |       ->      | |     Total     |    Relative    |   Duration   |
                                                           | Frames  Bytes | | Frames  Bytes | | Frames  Bytes |      Start     |              |
10.0.0.10:443              <-> 203.0.113.77:51000               0 0 bytes        36 51 kB          36 51 kB        50.349995000         1.7500
10.0.0.55:50000            <-> 10.0.0.10:21                    13 865 bytes      14 746 bytes      27 1611 bytes    33.999996000        11.3000
10.0.0.55:40000            <-> 10.0.0.10:1                      1 40 bytes        1 40 bytes        2 80 bytes      0.000000000         0.0500

읽는 법: 세 가지가 눈에 들어옵니다. ① 서버(10.0.0.10)에서 외부(203.0.113.77)로 한 방향으로만 51 kB가 나간 세션 — 받은 바이트가 0인 대화는 정상 웹 사용이 아닙니다. ② 10.0.0.55와 서버의 FTP 대화. ③ Relative Start가 0.00초부터 0.05초 간격으로 이어지는 1바이트짜리 대화들 — 이것이 스캔의 흔적입니다 (목록이 포트 1, 2, 3… 순으로 길게 이어집니다).

3-3. 1장면 확인 — 스캔 지문 찾기

SYN만 날아가고 ACK이 없는 패킷(= 연결을 시작하는 첫 패킷)을 출발지별로 세어 봅니다.

입력 (2026-09-09 실측):

tshark -r incident.pcap -Y "tcp.flags.syn==1 && tcp.flags.ack==0" \
  -T fields -e ip.src -e ip.dst | sort | uniq -c | sort -rn

출력 (2026-09-09 실측):

     40 10.0.0.55	10.0.0.10

읽는 법: 한 주소가 같은 대상에 연결 시작을 40번 했습니다. 정상 사용자는 이렇게 행동하지 않습니다 — 스캔 의심 1순위입니다. 그럼 공격자는 뭘 찾았을까요? 서버가 SYN-ACK로 답한(=열린) 포트만 추립니다.

입력 (2026-09-09 실측):

tshark -r incident.pcap -Y "tcp.flags.syn==1 && tcp.flags.ack==1 && ip.src==10.0.0.10" \
  -T fields -e tcp.srcport

출력 (2026-09-09 실측):

21
22

읽는 법: FTP(21)와 SSH(22)가 열려 있었습니다. 공격자의 다음 행동이 FTP 쪽으로 갔다는 것은 이미 대화 통계에서 봤습니다 — 스캔 결과와 실제 공격 대상이 연결됩니다.

3-4. 2장면 확인 — FTP 무차별 대입 추출

FTP 프로토콜로 해석된 패킷들의 명령·인자·응답 코드를 시간 순으로 뽑습니다.

입력 (2026-09-09 실측):

tshark -r incident.pcap -Y ftp -T fields \
  -e frame.time_relative -e ip.src -e ftp.request.command \
  -e ftp.request.arg -e ftp.response.code

출력 (2026-09-09 실측, 앞 12줄과 뒤 6줄):

33.999996000	10.0.0.55	USER	admin
34.049996000	10.0.0.10			331
34.099996000	10.0.0.55	PASS	123456
34.149996000	10.0.0.10			530
34.199996000	10.0.0.55	USER	admin
34.249996000	10.0.0.10			331
34.299996000	10.0.0.55	PASS	password
34.349996000	10.0.0.10			530
...(같은 패턴 반복: qwerty, letmein, admin 전부 530 실패)...
34.999995000	10.0.0.55	USER	admin
35.049995000	10.0.0.10			331
35.099995000	10.0.0.55	PASS	backup01
35.149995000	10.0.0.10			230
45.199995000	10.0.0.55	LIST
45.249995000	10.0.0.10			150
45.299995000	10.0.0.55	RETR	payroll_2025Q3.xlsx

읽는 법: 530이 다섯 번, 그다음 230(로그인 성공) 한 번 — 무차별 대입의 교과서적 지문입니다. 성공 직후 공격자는 LIST로 목록을 보고 RETRpayroll_2025Q3.xlsx를 내려받았습니다. 초기 침입 벡터는 "FTP 약한 비밀번호"로 특정됩니다. FTP는 평문 프로토콜이라 비밀번호가 그대로 보인다는 점도 확인하세요 — 방어 측 교훈입니다.

3-5. 3장면 확인 — 유출 규모 재기

마지막 용의자는 외부로 나간 51 kB입니다. 패킷 수와 총 바이트를 세어 보고, 언제 일어났는지 확인합니다.

입력 (2026-09-09 실측):

tshark -r incident.pcap -Y "ip.dst==203.0.113.77" -T fields -e frame.len | \
  python3 -c "import sys; d=[int(x) for x in sys.stdin]; print(len(d), '개 패킷,', sum(d), '바이트')"

출력 (2026-09-09 실측):

36 개 패킷, 51840 바이트

파일 전체의 첫 패킷과 마지막 패킷의 절대 시각도 뽑습니다.

입력 (2026-09-09 실측):

tshark -r incident.pcap -T fields -e frame.time | head -1
tshark -r incident.pcap -T fields -e frame.time | tail -1

출력 (2026-09-09 실측):

Sep  9, 2025 04:33:20.050000000 KST
Sep  9, 2025 04:34:12.149993000 KST

읽는 법: 내려받은 파일이 목록상 51,200바이트였고, 외부로 나간 양이 51,840바이트입니다 — 헤더를 생각하면 탈취된 파일이 거의 그대로 유출된 것으로 읽는 것이 자연스럽습니다. 전체 사건은 52초짜리입니다.

3-6. 타임라인 재구성 — 사건을 한 장의 표로

지금까지의 발견을 시각 순으로 엮습니다. 이 표가 보고서의 뼈대입니다.

| 시각(상대) | 사건 | 증거 |
|-----------|------|------|
| 00.0 ~ 02.0초 | 10.0.0.55가 포트 1~40 스캔 | SYN 40개, 열린 포트 21·22 확인 |
| 34.0 ~ 35.1초 | FTP admin 무차별 대입, 6번째(backup01) 성공 | 530 ×5 → 230 |
| 45.2초 | LIST로 파일 목록 열람 | payroll_2025Q3.xlsx 발견 |
| 45.3초 | payroll_2025Q3.xlsx 다운로드 | RETR 명령 |
| 50.3 ~ 52.1초 | 서버→외부(203.0.113.77) 51,840바이트 전송 | 한방향 대화, data 36프레임 |

읽는 법: "공격자가 한 것"과 "서버가 응답한 것"을 한 시계 위에 올리는 것이 타임라인의 전부입니다. Step 245에서 로그로 하던 일을 오늘은 패킷으로 했을 뿐입니다.

3-7. IR 보고서 — 6단 구성

실무 보고서의 표준 구성입니다. 분석 결과를 이 틀에 채웁니다.

# 침해 사고 분석 보고서 — incident.pcap
작성일: ____ | 분석가: ____ | 증거: incident.pcap (143 패킷)

### 1. 요약
외부 주소가 서버의 FTP를 무차별 대입으로 뚫고 급여 파일 1건을
탈취해 외부로 유출했습니다. 총 소요 약 52초. 즉시 조치가 필요합니다.

### 2. 타임라인
(3-6의 표)

### 3. 침입 경로
스캔(포트 21·22 발견) → FTP admin 무차별 대입(6번째 성공) →
파일 탈취(RETR) → 외부 유출(203.0.113.77)

### 4. 피해 범위
- 계정: FTP admin (비밀번호 backup01 — 노출됨, 폐기 필요)
- 호스트: 10.0.0.10
- 데이터: payroll_2025Q3.xlsx (51,200바이트, 유출 확인)

### 5. 봉쇄 조치 (제안)
- admin FTP 계정 비밀번호 즉시 변경 또는 계정 정지
- 10.0.0.55, 203.0.113.77 방화벽 차단
- 서버 10.0.0.10의 추가 침해 흔적 점검

### 6. 재발 방지
- FTP(평문) 서비스 중단, SFTP로 전환
- 로그인 실패 반복 시 계정 잠금 정책 적용
- 외부 발신 대용량 전송에 대한 탐지 규칙 추가

읽는 법: 4절의 피해 범위가 "목록화"되어 있다는 것이 중요합니다 — 계정·호스트·데이터 세 축으로 빠짐없이 셉니다. 5~6절은 발견과 한 쌍입니다. 침입 경로가 평문 FTP였으니 재발 방지는 SFTP 전환입니다.


4. 미션과 연습문제

미션 — 변형 시나리오를 만들고 분석 보고서를 쓴다

  1. 3-1의 생성기를 변형해 새 사건을 만듭니다: 비밀번호 목록을 바꾸고, 성공 위치를 옮기고(예: 9번째), 유출 크기를 조절하세요
  2. 만든 pcap을 닫아 두고(파일명만 확인), 분석자 역할만으로 3-2~3-5의 명령 순서대로 다시 분석합니다 — 생성 코드를 들여다보지 않는 것이 규칙입니다
  3. 3-6 형식의 타임라인 표를 완성합니다
  4. 3-7 형식의 보고서를 작성하되, 모든 수치(패킷 수, 바이트, 응답 코드 횟수)에 tshark 명령의 출력을 증거로 붙입니다
  5. 마지막으로 생성 코드와 분석 결과를 대조합니다 — 분석이 실제 사건과 얼마나 일치했는지 채점합니다

연습문제

문제 1. IR 절차 다섯 단계를 순서대로 쓰고, 오늘 실습이 그중 어느 구간이었는지 설명해 보세요.

문제 2. tshark -q -z io,phs-z conv,tcp를 상세 필터보다 먼저 실행하는 이유를 설명해 보세요.

문제 3. 오늘 pcap에서 "유출"이라고 판단한 근거를 세 가지 이상 들어 보세요.

문제 4. FTP가 평문이라는 사실이 공격자와 방어자 각각에게 어떤 의미인지 설명해 보세요.


5. 모범 답안과 완료 기준

미션 모범 답안

변형의 예: 성공 비밀번호를 9번째로 옮겼다면, 분석 결과 FTP 추출 표에 530이 8번 나온 뒤 230이 나와야 하고, 여러분의 보고서 3절에 "9번째 시도에서 성공"이라고 적혀 있어야 합니다. 유출 크기를 조절했다면 conv,tcp의 한방향 바이트와 4절의 피해 데이터 크기가 그에 맞게 달라집니다.

검증하는 법: ① 분석 중 생성 코드를 보지 않았는가(정직성 자가 확인). ② 타임라인의 각 행에 증거 열이 있는가. ③ 보고서의 모든 수치가 tshark 출력과 일치하는가. ④ 마지막 대조에서 "분석이 놓친 장면"이 있었다면 그것이 곧 다음 판의 개선점입니다 — Step 173의 놓친 단서 분석과 같은 원리입니다.

연습문제 해답

문제 1 해답. 준비 → 탐지 → 봉쇄 → 복구 → 교훈. 오늘 실습은 탐지(이상 징후를 찾아 사건 재구성)와 교훈(보고서 작성) 구간이었고, 봉쇄·복구는 5~6절의 제안 형태로만 다뤘습니다. 준비는 "분석 도구(tshark, scapy)를 미리 갖춰 둔 것"으로 간접 체험했습니다.

문제 2 해답. 낯선 pcap에서 상세부터 보면 143개(실무에서는 수백만 개)의 패킷에 묻힙니다. 통계는 "지도"입니다 — 어떤 프로토콜이 있고, 어느 대화가 큰지를 먼저 알아야 필터를 어디에 겨눌지 정할 수 있습니다. 전체 형태 → 상세 확대의 순서가 분석 시간을 좌우합니다.

문제 3 해답. ① 받은 바이트가 0인 한방향 대화(conv,tcp에서 <- 0 bytes). ② 나가는 양(51,840바이트)이 직전에 탈취된 파일 크기(51,200바이트)와 거의 일치. ③ 시각상 다운로드(RETR, 45.3초) 직후에 전송(50.3초~)이 이어짐. ④ 목적지가 내부 대역이 아닌 외부 주소(203.0.113.77).

문제 4 해답. 공격자에게는 패킷만 확보하면 비밀번호가 그대로 읽히는 무방비 채널입니다. 방어자에게는 ① 자격증명이 도청에 노출되고 ② 사고 분석 시 유출 내용까지 판독 가능해진다는 이중의 의미가 있습니다. 그래서 재발 방지의 첫 항목이 "평문 프로토콜 중단"이 됩니다.

완료 기준 체크리스트

  • [ ] IR 5단계를 순서대로 말할 수 있다
  • [ ] scapy로 시나리오 pcap을 생성할 수 있다
  • [ ] io,phsconv,tcp로 낯선 pcap의 전체 형태를 파악할 수 있다
  • [ ] SYN 스캔 지문을 필터로 찾을 수 있다
  • [ ] 인증 실패 반복(530) 후 성공(230)의 지문을 설명할 수 있다
  • [ ] 한방향 대용량 세션을 유출 후보로 지목할 수 있다
  • [ ] 미션: 변형 시나리오의 타임라인과 6단 보고서를 완성했다

6. 흔한 실수와 해결

벽 1. tshark가 "Running as user root" 경고를 띄운다

증상 (2026-09-09 실측):

Running as user "root" and group "root". This could be dangerous.

원인: WSL에 root로 접속한 상태에서 tshark를 실행했을 때 나오는 안내입니다.
해결: 읽기 전용 분석(-r)에는 무해하니 진행해도 됩니다. 신경 쓰이면 일반 사용자로 WSL에 들어가거나, 경고를 표준 에러로 버리는 2>/dev/null을 붙이세요 — 단, 진짜 오류 메시지까지 숨겨진다는 점은 기억해 두세요.

벽 2. 필터를 쳤는데 결과가 텅 비었다

증상: tshark -r incident.pcap -Y "ftp.request.command"가 아무것도 출력하지 않습니다.
원인: 대부분 파일 경로 오타이거나, 필터 필드명 오타입니다.
해결: -z io,phs로 해당 프로토콜이 파일에 실제 있는지부터 확인하세요. 오늘 파일에 FTP가 없었다면 추출할 것도 없습니다. 지도 없이 골목을 찾지 마세요.

벽 3. io,phs에서 FTP인 줄 알았던 트래픽이 data로 나온다

증상 (2026-09-09 실측): 유출 구간이 data frames:36 bytes:51840로만 표시됩니다.
원인: tshark는 내용을 해석할 수 없는 TCP 페이로드를 data로 분류합니다. 유출 트래픽처럼 형식이 없는 바이트 덩어리가 그렇습니다.
해결: data가 이상하게 크면 그 자체가 단서입니다. conv,tcp로 어느 대화인지 찾고, -Y "data" 필터로 페이로드를 들여다보세요.

벽 4. 절대 시각이 이상한 시간대로 보인다

증상: frame.time이 예상과 다른 시간대(예: KST)로 출력됩니다.
원인: pcap의 시각은 epoch(UTC 기준 초)이고, 표시 시간대는 분석 컴퓨터의 설정을 따릅니다.
해결: 분석 중에는 상대 시각(frame.time_relative)으로 관계를 보고, 보고서에는 절대 시각을 시간대와 함께 명기하세요. 여러 시스템의 시각을 합칠 때는 시간대가 증거 오염의 단골 원인입니다.

벽 5. "공격자 행위"와 "정상 관리자 행위"를 섞어서 본다

증상: FTP 로그인 성공이 공격인지 관리자의 정상 접속인지 판단이 안 섭니다.
원인: 기준선(baseline)이 없기 때문입니다.
해결: 전후 맥락으로 판단하세요 — 오늘 사건에서는 성공 직전에 실패 5회가 있었고, 직후에 대용량 외부 전송이 이어졌습니다. 단일 이벤트는 애매해도, 시퀀스는 명확합니다. 실무에서는 평소 로그인 시각·빈도의 기준선을 미리 만들어 두는 것이 IR의 "준비" 단계입니다.


7. 정리

오늘의 개념

개념 한 줄 설명
IR 5단계 준비 → 탐지 → 봉쇄 → 복구 → 교훈
스캔 지문 한 출발지의 짧은 간격 연속 SYN
무차별 대입 지문 인증 실패 반복(530) 뒤 성공(230)
유출 지문 받은 바이트 0인 한방향 대용량 세션
기준선(baseline) 평소 상태의 기록 — 이상은 비교로 보인다
증거 보존 원본은 읽기 전용, 분석은 복사본과 작업 폴더에서

오늘의 명령어·도구

명령 하는 일
tshark -r 파일 -q -z io,phs 프로토콜 계층 통계 (지도)
tshark -r 파일 -q -z conv,tcp TCP 대화별 프레임·바이트 (용의자 선별)
-Y "tcp.flags.syn==1 && tcp.flags.ack==0" 연결 시작(SYN) 패킷만 추출
-T fields -e 필드명 원하는 필드만 표로 추출
scapy wrpcap() 합성 패킷을 pcap으로 저장
frame.time / frame.time_relative 절대 시각 / 사건 시작 기준 상대 시각

명령어보다 중요한 감각

분석의 순서는 언제나 같습니다 — 통계로 지도를 얻고, 필터로 확대하고, 시각으로 엮습니다. 그리고 오늘 공격자 역할을 해 봤기에 알게 된 사실 하나: 공격의 각 장면은 모양이 다르고, 그래서 구별할 수 있습니다. 마지막으로, 분석의 산출물은 "알았다"가 아니라 보고서입니다 — 제3자가 여러분의 명령을 그대로 따라 하면 같은 결론에 닿아야 합니다. 오늘 쓴 6단 구성이 실무 IR 팀의 보고서와 같은 뼈대라는 것을 기억하세요.


전부 체크되면 Step 249 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.