Step 80. Scapy 입문 — 패킷 수작업 공방

Step 80. Scapy 입문 — 패킷 수작업 공방

Level 1 — 프로그래밍과 컴퓨터 내부 | 난이도 ★★★★☆ | 예상 소요 시간 4시간

전제: Step 77~79를 마쳤다. 소켓 통신과 포트 스캔의 원리를 안다. 리눅스(WSL 또는 우분투) 터미널을 쓸 수 있다.

  • 준비물: 리눅스 터미널(WSL 포함)과 파이썬. 패킷 송수신 실습은 리눅스가 정석입니다 — 이유는 3-3에서 직접 겪게 됩니다.
  • 주의: ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다.

지금까지 우리는 소켓이라는 전화기로 대화했습니다. 편리했지만, 우리가 정할 수 있는 것은 "무슨 말을 할지"뿐 — 그 말을 담는 봉투(패킷)는 운영체제가 알아서 만들어 줬습니다. Scapy(스캐피)는 그 봉투를 우리 손으로 만드는 공방입니다. 패킷을 레고 블록처럼 한 층씩 쌓고, 변형하고, 보내고, 답을 받습니다. 비정상적인 패킷을 만들 수 있어야 그런 패킷이 와서 생기는 공격을 이해할 수 있습니다 — 오늘의 수작업이 내일의 분석력입니다.


1. 학습 목표

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

  • 패킷이 Ethernet/IP/TCP/데이터로 겹쳐진 다층 구조임을 show() 출력으로 읽는다
  • Scapy의 / 연산으로 패킷을 조립하고 필드 값을 바꾼다
  • sr1()으로 SYN 패킷을 보내고 답변의 flags(SA/RA)로 포트 상태를 판별한다
  • 왜 날 패킷 제작에 특별한 권한과 부품(Npcap/리눅스)이 필요한지 설명한다
  • 출발지 위조(스푸핑)가 한 줄로 되는 사실과 그 무게를 설명한다

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

오늘의 도구 한눈에 보기

구분 내용
언어·환경 파이썬 3 + Scapy (pip 설치). 송수신은 리눅스/WSL에서 진행
오늘의 함수 IP()/TCP()/ICMP(), /(층 겹치기), show(), summary(), sr1(), send(), sniff()
필요한 개념 패킷 계층, 3-way handshake(SYN/SYN-ACK/ACK/RST), flags, 관리자 권한
오늘의 산출물 수제 SYN 스캐너 syn_scan.py — 패킷 수준의 정찰기

2-1. 패킷은 겹겹이 쌓인 상자

네트워크 데이터는 "층"으로 포장됩니다. 편지지(데이터)를 봉투(TCP)에 넣고, 그것을 더 큰 봉투(IP)에 넣고, 다시 배달 봉투(Ethernet)에 넣는 식입니다. 각 층에는 그 층의 일에 필요한 정보(헤더, header)가 적힙니다.

  • Ethernet: 같은 건물 안에서의 배달 (MAC 주소)
  • IP: 건물과 건물 사이의 배달 (IP 주소)
  • TCP: 정확한 방(포트)까지, 순서와 확인을 챙기는 배달
  • 데이터: 진짜 내용물

Scapy에서는 이 겹침을 빗금(/)으로 표현합니다. IP()/TCP()는 "IP 봉투 안에 TCP 봉투"라는 뜻입니다.

2-2. SYN과 세 번의 악수

Step 79에서 connect로 포트를 두드렸습니다. 그 밑에서는 사실 세 번의 악수(3-way handshake)가 일어납니다.

  1. 클라이언트 → 서버: SYN ("연결하고 싶습니다")
  2. 서버 → 클라이언트: SYN-ACK ("좋습니다, 연결합시다")
  3. 클라이언트 → 서버: ACK ("확인했습니다")

포트가 닫혀 있으면 2번에서 대신 RST-ACK("그런 방 없습니다")이 옵니다. 지난 챕터의 "즉시 거절"이 바로 이것입니다. 오늘 우리는 이 SYN 패킷을 직접 조립해 보내고, 악수의 2번만 보고 판별합니다 — 연결을 끝까지 완성하지 않는 것, 이것이 지난 시간에 이름만 들은 "SYN 스캔"의 정체입니다.

2-3. 왜 특별한 권한과 부품이 필요한가

소켓이 "규격품 봉투 자동 포장기"라면, Scapy는 "날것의 봉투"를 만듭니다. 운영체제는 이런 날 패킷을 아무에게나 허락하지 않습니다 — 변조된 패킷은 네트워크를 어지럽힐 수 있으니까요. 리눅스에서는 관리자급 권한이, 윈도우에서는 Npcap이라는 별도 부품이 필요합니다. 오늘 이 사실을 이론이 아니라 오류 메시지로 만나게 됩니다.


3. 따라 하기

3-1. 설치 — pip 한 줄, 하지만

입력 (윈도우/리눅스 공통)

pip install scapy

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

Successfully installed scapy-2.7.0

설치 확인:

python -c "import scapy; print(scapy.__version__)"

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

2.7.0

읽는 법: 설치 자체는 평범한 pip 한 줄입니다. 단, 최근 리눅스 배포판(WSL 우분투 포함)은 시스템 파이썬을 보호하기 위해 직접 pip 설치를 막습니다 — 실측에서도 externally-managed-environment라는 안내와 함께 거절됐습니다 (2026-09-09). 이때는 가상환경을 만들어 그 안에 설치하는 것이 정석입니다:

python3 -m venv ~/scapy-venv
~/scapy-venv/bin/pip install scapy

: "막혔다"가 아니라 "보호 중이다"로 읽는 것이 중요합니다. 시스템 파이썬은 운영체제의 부품이라, 함부로 바꾸지 못하게 잠가 둔 것입니다. 가상환경은 그 잠금을 깨지 않고 우회하는 공식 통로입니다.

3-2. 패킷 조립 — 레고 쌓기

파이썬 대화형 모드(python 입력 후 >>>)에서 계속합니다. 조립은 윈도우에서도 됩니다.

입력

from scapy.all import IP, TCP, ICMP
pkt = IP(dst="127.0.0.1")/TCP(dport=9999, flags="S")
pkt.show()

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

###[ IP ]###
  version   = 4
  ihl       = None
  tos       = 0x0
  len       = None
  id        = 1
  flags     =
  frag      = 0
  ttl       = 64
  proto     = tcp
  chksum    = None
  src       = 127.0.0.1
  dst       = 127.0.0.1
  \options   \
###[ TCP ]###
     sport     = ftp_data
     dport     = 9999
     seq       = 0
     ack       = 0
     dataofs   = None
     reserved  = 0
     flags     = S
     window    = 8192
     chksum    = None
     urgptr    = 0
     options   = []

읽는 법: ###[ IP ]### 아래에 IP 층, 그 아래에 TCP 층이 — 빗금으로 겹친 그대로 출력됩니다. 우리가 정한 값은 dst와 dport, flags 세 개뿐인데, 나머지 칸은 Scapy가 기본값으로 채웠습니다. None으로 표시된 len, chksum 같은 칸은 실제로 보낼 때 Scapy가 계산해 채웁니다. sport가 ftp_data로 보이는 것은 기본값 20번을 Scapy가 서비스 이름으로 번역해 준 것입니다.

: "패킷은 칸칸이 채워진 양식"임을 보는 단계입니다. 공격 패킷이란 이 칸들을 의도대로 비틀어 채운 것일 뿐이며, 그래서 양식을 아는 것이 분석의 시작입니다.

3-3. 예측해 보기 — 윈도우에서보내면 어떻게 될까

예측입니다. 방금 만든 패킷을 윈도우에서 그대로보내면(sr1) 어떻게 될까요?

직접 확인 (2026-09-09 실측, 윈도우 + Npcap 없음):

ValueError: Interface 'Microsoft KM-TEST Loopback Adapter' not found !

읽는 법: 조립은 됐는데 발송이 안 됩니다. 윈도우에서 날 패킷을내려면 Npcap이라는 별도 부품이 필요한데, 없으면 인터페이스를 찾지 못해 이렇게 멈춥니다. (import 시점에 WARNING: No libpcap provider available 경고가 먼저 뜬 것도 같은 신호입니다 — 2026-09-09 실측.)

: 그래서 이 챕터의 송수신 실습은 리눅스(WSL/우분투)에서 하는 것이 정석입니다. 지금부터는 WSL 터미널로 옮겨 갑니다 — 3-1의 가상환경에 scapy를 설치한 그 환경입니다.

3-4. 보내고 답 받기 — 수제 SYN 스캔 (리눅스)

WSL에서 계속합니다. 먼저 닫힌 포트에 보내 봅니다.

입력

from scapy.all import IP, TCP, sr1
pkt = IP(dst="127.0.0.1")/TCP(dport=65000, flags="S")
ans = sr1(pkt, timeout=2, verbose=0)
print("답변 flags:", ans[TCP].flags if ans else "답 없음")

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

답변 flags: RA

읽는 법: sr1은 "보내고(send) 답 하나를 받는(receive)" 함수입니다. RA(RST-ACK)는 "그런 방은 없다"는 즉답입니다. 지난 챕터에서 Connection refused라는 오류로 만났던 그 신호를, 오늘은 패킷의 이름으로 정면에서 만났습니다.

이번에는 열린 포트에 보내 봅니다. 다른 WSL 터미널에서 일부러 문을 하나 열어 두세요.

입력 (터미널 2)

python3 -m http.server 9999 --bind 127.0.0.1

입력 (터미널 1, 대화형)

pkt2 = IP(dst="127.0.0.1")/TCP(dport=9999, flags="S")
ans2 = sr1(pkt2, timeout=2, verbose=0)
print("답변 flags:", ans2[TCP].flags if ans2 else "답 없음")

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

답변 flags: SA

읽는 법: SA(SYN-ACK)는 "좋습니다, 연결합시다" — 포트가 열려 있다는 뜻입니다. 답변의 flags가 SA면 열림, RA면 닫힘, 답이 없으면 걸러짐(filtered)입니다. Step 79의 connect_ex가 하던 일을, 이제 패킷 수준에서 직접 하고 있습니다.

: 지난 챕터의 스캐너가 "전화를 끝까지 걸어 본다"였다면, 오늘의 방식은 "첫 인사만 던지고 대답의 어감으로 판단한다"입니다. 연결을 완성하지 않아 로그가 적게 남는 SYN 스캔이 왜 조용한 스캔인지, 원리가 손에 잡힙니다.

3-5. flags 비교의 함정 — 출력과 자료형은 다르다

방금 판별에 쓴 flags를 정확히 들여다봅니다.

입력

f = ans2[TCP].flags
print("값:", f, "| 타입:", type(f).__name__)
print("문자열 비교 SA:", f == "SA")
print("문자열 비교 RA:", f == "RA")

출력 (2026-09-09 실측, RA가 돌아온 ans의 경우):

값: RA | 타입: FlagValue
문자열 비교 SA: False
문자열 비교 RA: True

읽는 법: 눈으로는 "RA"라고 보이지만 실체는 FlagValue라는 특수 객체입니다. 최신 Scapy(2.7.0 실측)에서는 문자열 비교가 먹히지만, 버전에 따라 다르게 동작할 수 있으니 "S" in str(f)처럼 문자열로 바꿔 판별하는 습관이 안전합니다.

: "화면에 보이는 것"과 "프로그램이 쥐고 있는 것"이 다른 대표 사례입니다. 디버깅할 때 print(type(x))를 찍어 보는 습관이 이런 함정에서 시간을 구해 줍니다.

3-6. ICMP — ping도 수작업으로

우리가 흔히 쓰는 ping 명령도 결국 패킷입니다. 직접 만들어 봅시다.

입력

ping = IP(dst="127.0.0.1")/ICMP()
ans3 = sr1(ping, timeout=2, verbose=0)
print("살아 있음" if ans3 else "응답 없음")

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

살아 있음

읽는 법: ICMP는 "네트워크 상태를 묻고 답하는" 제어용 규약입니다. 우리가 본낸 것은 그중 "살아 있니?(echo request)"이고, 돌아온 답이 "살아 있다(echo reply)"입니다. ping 명령이 매번 만들던 것을 오늘 손으로 만든 것입니다.

3-7. 지나가는 패킷 엿보기 — sniff

만드는 것의 반대편, "보는 것"입니다. sniff는 네트워크 카드에 스치는 패킷을 낚아챕니다. 루프백(lo)에서 ICMP를 발생시키며 낚아 봅니다.

입력 (sniff_icmp.py)

import threading, time
from scapy.all import IP, ICMP, send, sniff

def noise():
    time.sleep(0.5)
    for _ in range(3):
        send(IP(dst="127.0.0.1")/ICMP(), verbose=0)

threading.Thread(target=noise).start()
pkts = sniff(iface="lo", count=4, timeout=5)
for p in pkts:
    print(p.summary())

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

Ether / IP / ICMP 127.0.0.1 > 127.0.0.1 echo-request 0
Ether / IP / ICMP 127.0.0.1 > 127.0.0.1 echo-request 0
Ether / IP / ICMP 127.0.0.1 > 127.0.0.1 echo-reply 0
Ether / IP / ICMP 127.0.0.1 > 127.0.0.1 echo-reply 0

읽는 법: summary()는 각 패킷을 한 줄로 요약합니다 — 겹친 층(Ether / IP / ICMP)과 "누가 > 누구에게"가 그대로 읽힙니다. 요청 세 개와 응답 세 개 중 앞의 네 개가 낚였습니다.

: 여러분의 컴퓨터는 지금 이 순간에도 조용히 패킷을 주고받고 있습니다. 이 흐름을 볼 수 있다는 것이 분석의 출발점이며, 곧 배울 Wireshark의 눈과 같은 원리입니다.

3-8. 관찰 — 출발지 주소 바꿔치기

Scapy의 힘이자 위험을 한 번만, 조심스럽게 확인합니다. 대상은 127.0.0.1, 내 컴퓨터뿐입니다.

입력

from scapy.all import IP, ICMP, send, sr1
fake = IP(src="10.9.9.9", dst="127.0.0.1")/ICMP()
send(fake, verbose=0)
print("위조 패킷 전송됨")

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

위조 패킷 전송됨

읽는 법: src(출발지)를 존재하지 않는 주소(10.9.9.9)로 바꿔치기해 보냈습니다. 이것이 스푸핑(spoofing, 위조)의 한 줄 요약입니다. 답장은 엉뚱한 주소(10.9.9.9)로 가므로 우리에게는 오지 않습니다 — 같은 자리에서 정상 출발지로 보낸 ICMP에는 답이 왔습니다 (2026-09-09 실측). 위조 패킷에는 답이 오지 않는 이유가 바로 그것입니다.

: 소켓으로는 불가능했던 일(출발지 위조)이 날 패킷에서는 한 줄이 됩니다. 그래서 이 도구가 특별한 권한을 요구하고, 그래서 랩 바깥으로는 절대 나가면 안 됩니다. 이 확인에서 멈추세요.


4. 미션과 연습문제

미션 — 수제 SYN 스캐너

syn_scan.py를 만들어 다음을 수행하세요 (리눅스/WSL에서):

  1. 대상은 127.0.0.1로 고정하고, 포트 목록 [21, 22, 80, 443, 9999]를 코드에 적습니다
  2. 각 포트에 SYN 패킷을 만들어 보내고, 답변의 flags로 "열림(SA) / 닫힘(RA) / 무응답"을 판별해 표로 출력합니다
  3. 일부러 문을 하나 열고(python3 -m http.server 9999 --bind 127.0.0.1) 9999가 "열림"으로 잡히는지 확인합니다
  4. Step 79의 connect 스캐너 결과와 나란히 놓고 같은 결론이 나오는지 비교합니다
  5. 말미에 한 문단: "SYN 스캔이 connect 스캔보다 조용한 이유"를 세 번의 악수 그림과 함께 설명합니다

연습문제

문제 1. 패킷의 계층(Ethernet/IP/TCP/데이터)을 각 층의 역할과 함께 설명해 보세요.

문제 2. 세 번의 악수(3-way handshake)의 각 단계와, 포트가 닫혀 있을 때 2번이 어떻게 바뀌는지 말해 보세요.

문제 3. Scapy의 / 연산은 무엇을 의미하나요? IP()/TCP()/Raw("hello")를 말로 풀어 보세요.

문제 4. 소켓 프로그래밍(Step 77~79)으로는 불가능하지만 Scapy로는 되는 일을 하나 들고, 그래서 이 도구에 왜 특별한 권한이 필요한지 설명해 보세요.


5. 모범 답안과 완료 기준

미션 모범 답안

수제 SYN 스캐너의 뼈대:

from scapy.all import IP, TCP, sr1

target = "127.0.0.1"
ports = [21, 22, 80, 443, 9999]

print(f"대상: {target} — 내 랩인지 확인!")
for port in ports:
    pkt = IP(dst=target)/TCP(dport=port, flags="S")
    ans = sr1(pkt, timeout=2, verbose=0)
    if ans is None:
        state = "무응답 (filtered 가능)"
    else:
        flags = str(ans[TCP].flags)
        if "S" in flags and "A" in flags:
            state = "열림 (SA)"
        elif "R" in flags:
            state = "닫힘 (RA)"
        else:
            state = f"기타 ({flags})"
    print(f"포트 {port:>5}: {state}")

실행 결과는 환경에 따라 다릅니다. 실측 환경(2026-09-09)에서는 http.server를 켜 둔 9999만 "열림 (SA)"이고 나머지는 "닫힘 (RA)"이었습니다.

5번의 답 예시: "connect 스캔은 SYN → SYN-ACK → ACK 세 번의 악수를 끝까지 완성하므로 서비스의 접속 로그에 연결 기록이 남는다. SYN 스캔은 2번(SYN-ACK 또는 RST-ACK)까지만 보고 판별하고 악수를 완성하지 않으므로, ‘연결이 성립했다’는 기록이 남지 않아 상대적으로 조용하다."

검증하는 법: ① http.server를 켜기 전과 후를 각각 스캔해 9999의 판정이 "닫힘 → 열림"으로 바뀌는가. ② Step 79 스캐너와 결론이 일치하는가. ③ flags 판별이 문자열 비교 함정(3-5)을 피해 가는가. 셋이 전부 ‘예’이면 완성입니다.

연습문제 해답

문제 1 해답. Ethernet은 같은 네트워크 구간 안의 배달(MAC 주소), IP는 네트워크와 네트워크 사이의 배달(IP 주소), TCP는 목적지 프로그램(포트)까지 순서와 확인을 챙기는 배달, 데이터는 그 안의 실제 내용물입니다. 편지지를 봉투에, 봉투를 더 큰 봉투에 넣는 겹침 구조입니다.

문제 2 해답. ① 클라이언트가 SYN("연결하고 싶습니다")을 보내고, ② 서버가 SYN-ACK("좋습니다")로 답하고, ③ 클라이언트가 ACK("확인했습니다")로 마무리합니다. 포트가 닫혀 있으면 ②가 RST-ACK("그런 방 없습니다")로 바뀝니다 — 이것이 지난 챕터의 Connection refused의 정체입니다.

문제 3 해답. /는 "층 겹치기"입니다. IP()/TCP()/Raw("hello")는 "IP 봉투 안에 TCP 봉투를, 그 안에 hello라는 내용물을 넣은 패킷"입니다. 왼쪽이 바깥 봉투, 오른쪽이 안쪽입니다.

문제 4 해답. 출발지 주소 위조(스푸핑)입니다. 소켓은 봉투 겉의 주소를 운영체제가 채우므로 속일 수 없지만, Scapy는 양식의 모든 칸을 우리가 채우므로 한 줄이면 됩니다 (3-8 실측). 변조된 패킷은 네트워크를 어지럽힐 수 있으므로, 운영체제는 날 패킷 제작을 특별한 권한(리눅스의 관리자급 권한, 윈도우의 Npcap)을 가진 경우에만 허락합니다.

완료 기준 체크리스트

  • [ ] 패킷의 계층 구조(Ethernet/IP/TCP)를 설명할 수 있다
  • [ ] Scapy로 SYN 패킷을 조립하고 show() 출력을 읽을 수 있다
  • [ ] 답변의 flags(SA/RA/무응답)로 포트 상태를 판별했다
  • [ ] 윈도우에서 송수신이 안 되는 이유(Npcap)를 설명할 수 있다
  • [ ] sniff로 지나가는 패킷을 낚아 요약을 읽었다
  • [ ] 미션: 수제 SYN 스캐너를 완성했다

6. 흔한 실수와 해결

벽 1. pip install이 거절된다 (리눅스)

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

error: externally-managed-environment

원인: 최근 리눅스 배포판이 시스템 파이썬을 보호하기 위해 직접 설치를 막은 것입니다. 고장이 아니라 잠금입니다.
해결: 가상환경을 만들어 그 안에 설치하세요 — python3 -m venv ~/scapy-venv~/scapy-venv/bin/pip install scapy. 이후 실행도 그 가상환경의 파이썬으로 합니다.

벽 2. 윈도우에서 패킷이 안 나간다

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

WARNING: No libpcap provider available ! pcap won't be used
ValueError: Interface 'Microsoft KM-TEST Loopback Adapter' not found !

원인: 윈도우에서 날 패킷 송수신에는 Npcap이라는 별도 부품이 필요합니다. 조립(show)은 되는데 발송(sr1/send)이 안 되는 것이 특징입니다.
해결: 이 챕터의 송수신 실습은 리눅스(WSL/우분투 VM)에서 하는 것이 정석입니다. 윈도우에서는 조립 연습까지만 하고, 발송은 WSL로 옮기세요.

벽 3. flags 비교가 눈과 다르다

증상: ans[TCP].flags == "SA"가 False인데 눈으로는 SA입니다.
원인: Scapy의 flags는 FlagValue라는 특수 객체입니다 (2026-09-09 실측: 타입: FlagValue). 버전에 따라 문자열 비교 동작이 다릅니다.
해결: str(ans[TCP].flags)로 바꾼 뒤 "S" in ...처럼 포함 여부로 판별하세요. 의심스러울 때 print(type(x))가 최고의 진단 도구입니다.

벽 4. 답이 아예 안 온다

증상: 모든 포트에서 "답 없음"만 나옵니다.
원인: 대상이 꺼져 있거나, 방화벽이 전부 걸러내거나, 가상머신 네트워크가 단절된 경우입니다.
해결: 먼저 3-6의 수제 ICMP로 생사를 확인하세요. 이 챕터의 실습처럼 대상을 127.0.0.1로 두고 일부러 문을 하나 열어(http.server) 검증하면 환경 문제인지 코드 문제인지 갈라낼 수 있습니다.

벽 5. sniff가 아무것도 안 잡는다

증상: sniff를 돌렸는데 조용합니다.
원인: 잡을 패킷이 지나가지 않았기 때문입니다. 아무 통신도 없으면 낚이는 것도 없습니다 (2026-09-09 실측에서도 트래픽을 만들기 전에는 빈 손이었습니다).
해결: 3-7처럼 별도 스레드로 패킷을 발생시키거나, 브라우저로 아무 페이지나 열어 트래픽을 만드세요. iface 지정(리눅스 루프백은 "lo")도 확인합니다.


7. 정리

오늘의 개념

개념 한 줄 설명
패킷 계층 Ethernet/IP/TCP/데이터로 겹쳐진 다층 봉투 — Scapy는 /로 겹침
3-way handshake SYN → SYN-ACK → ACK 세 번의 악수로 연결 성립
SYN 스캔 악수의 2번(SA=열림, RA=닫힘)만 보고 판별하는 조용한 스캔
flags TCP 헤더의 상태 표시 칸 — SA, RA 등으로 읽음
스푸핑(spoofing) 출발지 주소 위조 — 날 패킷이라 가능한 한 줄의 위험
Npcap / 관리자 권한 날 패킷 제작에 필요한 특별한 부품과 권한

오늘의 함수

함수 하는 일
IP(dst=...)/TCP(dport=..., flags="S") 패킷 조립 (빗금으로 층 겹치기)
pkt.show() / pkt.summary() 양식 전체 보기 / 한 줄 요약
sr1(pkt, timeout=2) 보내고 답 하나 받기
send(pkt) 보내기만 하기 (답 안 기다림)
sniff(iface=..., count=n) 지나가는 패킷 n개 낚아채기

명령어보다 중요한 감각

네트워크 공부에서 실력 차이는 "명령을 아는가"보다 "명령 아래를 상상할 수 있는가"에서 갈립니다. ping을 치는 사람은 누구나 됩니다. 하지만 오늘 여러분은 그 ping의 속살(ICMP echo)을 손으로 만들었고, 포트 스캔의 속살(SYN과 그 답변)도 직접 조립했습니다. nmap이 아무리 훌륭해도 결국 보내는 것은 오늘 만든 것과 같은 패킷이고, 방화벽이 걸러내는 것도 결국 이 칸칸의 양식입니다. 도구가 고장 났을 때, 출력이 이상할 때 — "밑에서 무슨 패킷이 오갔을까"를 상상하는 습관이 생겼다면 그것이 오늘의 진짜 수확입니다.

그리고 무게감도 함께 가져가세요. 오늘 여러분의 손에 쥐인 것은 "패킷이라는 편지의 모든 칸을 마음대로 쓸 수 있는 펜"입니다. 이 펜으로 정상적인 시험(내 방화벽이 비정상 패킷을 잘 걸러내는가)을 할 수도, 나쁜 일을 할 수도 있습니다. 차이는 펜이 아니라 허락입니다. 오늘 날아간 모든 수제 패킷은 127.0.0.1, 여러분의 컴퓨터에게만 향했습니다 — 앞으로도 그 울타리를 지키는 것이 이 도구를 쓰는 자격입니다.


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