네트워크 보안: 스니핑(Sniffing)
1. 스니핑(Sniffing)이란?
- 스니핑(sniffing): sniff는 '코를 킁킁거리다'라는 의미
- 수동적(Passive) 공격: 트래픽을 가만히 보기만 해도 정보 획득 가능
- 예: 전화선이나 UTP 케이블에 탭핑(tapping)하여 전기신호 분석
핵심: 보내는 쪽은 아무것도 모른 채 정보가 새나감
2. 스니핑이 가능하려면? – 네트워크 구조의 OSI 계층과 패킷 전달 과정 이
패킷은 OSI 계층을 따라 전송된다.
2계층 (데이터링크) | 프레임 전달 | MAC 주소 |
3계층 (네트워크) | IP 패킷 전송 (데이터그램) | IP 주소 |
4계층 (전송) | TCP/UDP 전송 (세그먼트) | 포트 번호 |
패킷 전달 조건
- 목적지 IP가 본인의 주소일 경우만 수신
- 아니면 폐기하거나 라우팅 테이블을 따라 다음 네트워크로 전달
일반적으로 네트워크 카드는 목적지가 본인 MAC이 아니면 패킷을 버리게 되어 스니핑이 불가능하다.
그런데 이 필터링을 해제하는 것이 바로 다음 단계이다.
3. 스니핑의 원리
일반적으로 네트워크 카드는 목적지가 본인 MAC/IP가 아니면 패킷을 버리게 되어 스니핑이 불가능하다.
그런데 이 필터링을 해제하는 것이 바로 다음 단계이다.
프러미스큐어스(Promiscuous) 모드: 스니핑의 필수 조건
NIC(Network Interface Card)가 모든 네트워크 트래픽을 받아들이도록 설정하는 것
→ 기본적으로 NIC는 목적지 MAC 주소가 자신일 때만 수신하지만, 이 모드에서는 모든 패킷이 애플리케이션에 전달됨
- NIC가 모든 트래픽을 수신하도록 설정
- 필터링 없이 모든 프레임을 사용자에게 전달함
랜카드 설정 명령어
$ ifconfig # 인터페이스 상태 확인
$ ifconfig [ifname] promisc # Promiscuous 모드 설정
4. 스니핑 실습도구
도구 ①: TCPDump
특징
- 리눅스 기본 스니핑 도구
- 관리자 느낌이 강
- 법적 증거로도 사용 가능
▶ 실행 예시
$ sudo tcpdump -i eth0 -xX host 192.168.4.128
옵션 | 설명 |
-i [ifname] | 감시할 인터페이스 |
-xX | 16진수 + ASCII 함께 출력 |
host | 특정 IP와의 트래픽만 캡처 |
실습 환경에서는 공격자가 tcpdump를 실행 중이고, 피해자는 Telnet 서버(192.168.4.128)에 접속 중이다.
-> Telnet은 ID/PW를 암호화 없이 평문 전송하기 때문에, 도청 시 모든 정보가 드러난다.
5. 스니핑 실습 예제: Telnet 도청
실습 시나리오
공격자 | 192.168.4.129 | tcpdump 실행 |
피해자 | 192.168.4.128 | Telnet 서버 |
브릿지 | 192.168.4.2 | 가상 연결 |
- Telnet ID: test
- Telnet PW: testpw1234
- 입력된 문자 한 글자씩 전송됨
- 서버가 입력된 문자를 echo 반사함
🔓 Telnet, FTP 등은 평문 전송이므로 쉽게 탈취 가능
6. 스니핑 보조 도구
(1) Fragrouter
- 세션 중간 가로채기 후, 받은 패킷을 정상 목적지로 전달(relay)
- 패킷 릴레이 도구
- Fragrouter 대체 명령 (리눅스 기본 기능) : sudo sysctl net.ipv4.ip_forward=1
(2) DSniff
- FTP, Telnet, HTTP 등 다양한 프로토콜의 ID/PW를 자동 추출 도구
- Telnet, FTP, POP3, IMAP, HTTP 등 다양한 프로토콜 지원
- 해커 대응 도구로도 사용됨
사용 예
- dsniff 실행 후 FTP/Telnet 접속 시 ID/PW 감지
- Telnet은 입력한 명령어까지 노출됨
7. Scapy로 스니핑
Scapy는 Python 기반의 네트워크 패킷 생성/분석 도구다.
패킷을 수집하고, 구조를 분석하고, 스니핑에 응용할 수 있다.
패킷 수집 예제
from scapy.all import *
pkts = sniff(iface="eno1", count=2)
hexdump(pkts[0])
ls(pkts[0])
traceroute 예제
from scapy.all import *
ip = IP(dst="inclab.sungshin.ac.kr")
icmp = ICMP()
for ttl in range(1, 5):
ip.ttl = ttl
resp = sr1(ip/icmp, timeout=2, verbose=0)
print(resp.src if resp else "***", f"hops = {ttl}")
8. 스위치 환경의 스니핑 제한과 우회
스위치 동작 | 각 장비의 MAC 주소 기억 → 해당 포트로만 전달 |
결과 | 스니핑 불가 (기본 상태에서는 다른 호스트 패킷 볼 수 없음) |
→ 스위칭 네트워크에서는 패킷이 대상 포트에만 전달되기 때문에 스니핑이 원천적으로 차단된다.
하지만 다음과 같은 방법으로 우회가 가능하다.
우회방법: ARP 스푸핑, 스위치 재밍
9. ARP 스푸핑 및 리다이렉트
앞서 언급한 스니핑은 도청 기술이고, ARP 스푸핑은 도청을 가능하게 만드는 트래픽 유도 기술이다.
서로 다르지만 **실제 공격에서는 함께 사용되어 중간자 공격(MITM)**이 완성됨
🔸 ARP 스푸핑
ARP는 ARP 메세지가 유효한지 확인할 수 있는 정보 X
- 거짓된 ARP 메시지를 송신하여 피해자의 ARP 캐시를 오염시킴 =ARP 캐시 포이즈닝
- “이 IP는 나야”라고 MAC 주소 속이기
🔸 ARP 리다이렉션 (2계층 공격)
- ARP 스푸핑의 일종
- 자신을 라우터라고 속여 피해자 패킷을 가로챔
- 이후 relay를 통해 실제 라우터로 전송
$ sudo arpspoof -t 192.168.4.128 192.168.4.1
→ 받은 패킷은 fragrouter나 IP forwarding으로 다시 라우터로 전달
ARP 리다이렉션 실습 과정의 흐름
- arpspoof로 클라이언트에게 "내가 라우터야"라고 속임
- fragrouter 또는 ip_forward로 패킷을 실제 라우터로 전달
- 세션이 끊어지지 않음 → MITM 성공
- 스니핑 도구(tcpdump, dsniff)로 트래픽 감청 가능
10. 스위치 재밍(Switch Jamming)
스위치 MAC 테이블 과부하로 허브처럼 동작 유도
- 스위치 내부는 MAC 주소 ↔ 포트 번호 매핑 테이블을 유지함
- 이 테이블의 저장 용량이 유한
- 수천 개의 가짜 MAC 주소를 브로드캐스트로 전송하면 → 테이블이 넘쳐서 기존의 올바른 MAC 정보가 삭제됨
- 스위치가 동작 실패하여 모든 포트로 트래픽을 전달 → 스니핑이 가능해짐 (더미 허브처럼 됨)
🔥 일종의 MAC 테이블 버퍼 오버플로우 공격