네트워크보안

wireshark, dnsiff, tcpdump를 이용한 sniffing에 대하여

JustSangRok 2026. 6. 3. 23:19

Sniffing Attack 

평범한 사람들은 정보를 가로채는 것에 대한 로망이 있을 것이다.

따라서 오늘은 Sniffing Attack(스니핑 공격)에 대해 알아보겠다.

Sniffing이란 자신이 아닌 다른 상대방들이 주고받는 패킷을 몰래 훔쳐보는 것이다. 정상적으로는 송신자(Sender)와 수신자(Receiver) 사이에서만 흘러야 할 데이터를, 같은 네트워크에 붙어 있는 공격자(Attacker)가 옆에서 가만히 받아 보는 그림이다.

   Sender ─────[ 패킷 ]─────▶ Receiver
                  │
                  └── (몰래 보고 있는) Attacker

이번 실습 환경은 이렇다.

Rocky Linux 9.7 — FTP/Telnet/SSH 서버 

Windows 10 — 일반 클라이언트 

Kali Linux — 공격자 


1.  Promiscuous 모드에 대하여

스니핑이 가능한 이유는 결국 NIC(랜카드)의 동작 방식 때문이다. NIC에는 두 가지 모드가 있다.

Normal 모드 vs Promiscuous 모드

Normal(일반) 모드 — 목적지 MAC이 자기 것이거나, 브로드캐스트/멀티캐스트일 때만 받아들이고 나머지는 NIC 단계에서 그냥 버린다.

Promiscuous(무차별) 모드 — 목적지 MAC을 아예 보지 않고 전부 받아들인다. OS 위로 모든 프레임이 올라온다.

ifconfig flags 해석

Rocky Linux에서 ifconfig를 쳐보면 이런 줄이 보인다.

ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

각 플래그가 뜻하는 바는 이렇다.

UP - 인터페이스가 활성화돼 있음 

RUNNING - 케이블이 연결되어 링크가 살아있음 (물리적 동작)

BROADCAST / MULTICAST - 그냥 브로드캐스트·멀티캐스트를 지원

mtu 1500 - 한 프레임에 담을 수 있는 최대 페이로드 크기(이더넷 표준)

Promiscuous 모드 토글

리눅스에서 NIC를 무차별 모드로 바꾸는 명령은 한 줄이다.

ifconfig ens160 promisc

다시 ifconfig를 쳐보면 플래그가 바뀌어 있다.

ens160: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500

PROMISC가 추가된 것을 볼 수 있다. 끄려면 앞에 -만 붙이면 된다.

ifconfig ens160 -promisc

m그리고 단순히 재부팅만 해도 원상태로 돌아간다.

리눅스에서 따로 설정 파일에 설정해놓지 않고 명령어로 실행시킨 대부분은 재부팅시 원상태로 복구된다  


2. ARP 매핑의 동적 상태에 대하여

스위치 환경에선 단순히 NIC를 무차별 모드로 바꿨다고 해서 다른 사람 패킷이 자동으로 흘러 들어오지는 않는다.

스위치가 MAC 주소 기준으로 패킷을 해당 포트로만 보내기 때문이다. 그래서 등장하는 게 ARP Spoofing이다.

Windows에서 arp -a를 쳐보면 IP-MAC 매핑 테이블이 보이는데, 자세히 보면 대부분 동적(Dynamic) 으로 갱신되는 항목이다.

ARP Spoofing이 가능한 이유가 바로 여기에 있다.

ARP 스푸핑은 이 매핑을 위조한다. 예를 들어 피해자의 ARP 테이블에서 192.168.0.1(게이트웨이 IP)에 매핑된 MAC을, 원래 라우터 MAC에서 공격자 MAC으로 덮어쓴다. IP는 그대로 두고 그 IP가 가리키는 MAC만 가짜로 바꿔치기하는 것이다.

[변조 전]                       [변조 후]
192.168.0.1 → AA:BB:CC:11:22:33   192.168.0.1 → 공격자 MAC
            (진짜 라우터)                       (가짜)

이렇게 되면 피해자가 외부로 보내려던 패킷이 공격자를 거쳐서 라우터로 흘러가게 된다. 이른바 MITM(Man-in-the-Middle, 중간자 공격) 의 가장 전형적인 형태다.


3. Wireshark로 FTP 평문 캡처해보기

Wireshark는 이미 두 번이나 다뤄봐서 기본 설명은 생략하고, 새로운거 있으면 그거만 다룰 것이다.

Rocky에서는 보통 기본 설치가 안 돼있어서 깔아준다.

dnf -y install wireshark*

Wireshark의 Edit → Preferences → Capture 메뉴에 들어가보면 Capture packets in promiscuous mode 항목이 기본적으로 체크돼 있다.

즉 우리가 굳이 ifconfig ens160 promisc를 따로 줄 필요 없이 Wireshark가 자기 자신만 알아서 NIC를 무차별 모드로 전환해서 캡처한다.

과거에는 이 체크가 꺼져있으면 캡처가 잘 안 되는 경우도 있었다고 들었는데, 요즘 버전에서는 거의 문제가 없다고 한다.

FTP TCP Stream 들여다보기

Wireshark로 캡처를 시작한 뒤 Windows 10에서 Rocky의 FTP 서버에 한 번 접속해보자. 패킷 하나를 골라 마우스 오른쪽 → Follow → TCP Stream을 누르면 다음과 같은 내용이 그대로 보인다.

220 (vsFTPd 3.0.5)
OPTS UTF8 ON
200 Always in UTF8 mode.
USER test
331 Please specify the password.
PASS 123456
230 Login successful.
PORT 192,168,10,201,194,78
200 PORT command successful. Consider using PASV.
NLST -la
150 Here comes the directory listing.
226 Directory send OK.
CWD /home
250 Directory successfully changed.
PORT 192,168,10,201,194,82
200 PORT command successful. Consider using PASV.

평문 그대로다. 계정, 비밀번호, 디렉터리 이동까지 전부 노출된다.

IP가 콤마인 이유

위 캡처에서 IP줄인데 이상한 줄이 하나 있다.

PORT 192,168,10,201,194,78

IP가 점이 아니라 콤마로 적혀있고, 뒤에 숫자 두 개가 더 붙어있다.

IP가 콤마로 구분되어있는 이유는 FTP는 ASCII 텍스트 명령으로 통신하기 때문이다. 1985년에 발표된 FTP 규격이 정한 형식이 "숫자는 콤마로 구분한다"이다. 그냥 과거의 잔재가 남아있는 거라고 보면 된다.

이 줄이 의미하는 것은 클라이언트가 서버에게 자기 IP와 데이터 포트를 알려주는 것이다.

PORT 192,168,10,201,194,78
     └──── IP ─────┘ └─포트─┘
     192.168.10.201   ?

 

포트 번호는 어디 있냐 하면 뒤의 숫자 두 개(194, 78) 가 포트 번호이다. 다만 왜 포트 번호를 저따구로 표현하냐 하면 이유가  한 바이트(0~255)에 들어가지 않는 큰 수라서 2바이트로 쪼개서 콤마로 따로 보내는 것이다. 클라이언트가 쓰는 동적 포트(Dynamic Port, 49152~65535) 는 모두 한 바이트로 표현할 수 없는 범위라 항상 이렇게 두 칸으로 나뉜다.

포트 번호를 계산하는 법은 생각보다 쉽다.

포트 = (앞 숫자 × 256) + 뒤 숫자
     = 194 × 256 + 78
     = 49,664 + 78
     = 49,742

확인하고 싶다면 Windows 10에서 netstat -a를 쳐보면 되는데, 보기 힘들다. 우리가 계산하고 명령을 칠 시점엔 이미 데이터 전송이 끝나 포트가 닫혔기 때문이다. 보고 싶으면 어떻게 잘 빠르게 보거나 wireshark에서 포트 번호를 보는 기능을 켜서 보면 된다.

Consider using PASV

캡처에 신기한 한 줄이 있어서 좀 찾아봤다.

200 PORT command successful. Consider using PASV.

서버가 "PASV 쓰는 게 좋을 거 같다" 라고 권유하고 있다. 이게 무슨 의미인가 하면, FTP에는 데이터 연결을 만드는 두 가지 모드가 있다.

Active 모드 — 클라이언트가 PORT 명령으로 자기 데이터 포트를 알려주면, 서버(20번 포트) → 클라이언트로 데이터 연결을 연다. (위 캡처)

Passive 모드(PASV) — 반대로 클라이언트가 PASV 명령을 보내면 서버가 자기 데이터 포트를 알려주고, 클라이언트 → 서버로 데이터 연결을 연다.

NAT/방화벽 환경에서는 외부에서 클라이언트로 들어오는 연결이 거의 막혀 있어서 Active 모드가 잘 안 통한다. 그래서 요즘은 PASV가 사실상 표준이다. 그래서 서버가 권유하는 것이다


4. dsniff 

Wireshark가 모든 패킷을 다 잡아 보여주는 도구라면, dsniff는 그중에서 계정·비밀번호 같은 자격증명만 보여주는 도구다. 평문 프로토콜(FTP, Telnet, POP3, HTTP Basic Auth 등)의 인증 데이터를 자동으로 파싱해준다.

기본 사용법

Kali에서:

dsniff -i eth0

이 상태로 띄워놓고, 같은 망에서 Kali가 Rocky로 FTP·Telnet 접속을 한 뒤 연결을 끊으면 실시간으로 다음과 같은 출력이 뜬다.

dsniff: listening on eth0

>>>>> 06/02/26 07:33:42 tcp 192.168.10.250:56310 -> 192.168.10.50:23 (telnet)
test
123456
exit

>>>>> 06/02/26 07:34:19 tcp 192.168.10.250:53820 -> 192.168.10.50:21 (ftp) [HOTHOT]
USER test
PASS 123456

출력 끝의 [HOTHOT] 같은 표시는 dsniff가 "이건 자격증명일 가능성이 매우 높다"고 판정한 흐름에 붙이는 표식이다. 분석가가 한눈에 의심스러운 트래픽을 잡을 수 있게 도와주는 거라고 한다.

그래서 모든 거 다 캡쳐하고 싶으면 wireshark 쓰면 되고 자격증명만 캡쳐하고 싶으면 dsniff 쓰면 된다.

 

그리고 dsniff를 켜놓고 SSH로 접속해서 명령을 친 다음 끊어봐도 아무것도 안 뜬다.  

 

이게 같은 LAN/Wi-Fi에서 Telnet 대신 SSH를, FTP 대신 SFTP/FTPS를 쓰는 가장 직접적인 이유다.


5. tcpdump 

세 번째로 살펴볼 도구는 tcpdump다. 듣기로는 리눅스에서 패킷 캡처의 거의 표준급 도구라고 한다.

실제로 Kali 같은 공격용 배포판뿐 아니라 거의 모든 리눅스에 기본으로 깔려 있다. Rocky Linux에도 들어있다.

기본 사용법

tcpdump -i ens160 -s 1500 port 23 -w telnet.pcap

 

옵션 의미

-i <iface> 캡처할 인터페이스 지정
-n 호스트명·서비스명을 조회하지 않고 IP·포트 그대로 표시
-nn -n보다 한 단계 더 - 포트도 서비스명 변환 안 함 (예: 22 대신 ssh로 안 바꿈)
-s <snaplen> 패킷당 캡처할 바이트 수 
-w <file> Wireshark와 호환되는 pcap 파일로 저장
-r <file> 저장된 pcap 파일을 읽기
-X 페이로드를 16진수 + ASCII로 같이 출력
-q 간략 출력 (quiet)

dsniff와 비슷하게 먼저 실행시켜놓고 다른 머신에서 FTP/Telnet/SSH로 접속하다가, 어느정도 캡처됐다 싶으면 Ctrl+C로 멈춘다.

그러면 -w로 지정해둔 이름의 pcap 파일이 생긴다.

pcap 파일 확인

파일을 터미널에서 바로 보려면:

tcpdump -Xqnr telnet.pcap

다만 pcap 파일은 Wireshark가 읽으라고 만들어진 바이너리 포맷이라 터미널에서는 핵심 정보를 알아보기 힘들다. Wireshark로 파일을 열어서 보는 편이 훨씬 깔끔하다.

BPF 필터로 원하는 트래픽만 추리기

tcpdump는 BPF(Berkeley Packet Filter) 표현식으로 캡처 대상을 거를 수 있다.

① 특정 호스트만 캡처

tcpdump -i ens160 host 192.168.10.201 -w ftp4.pcap

192.168.10.201이 출발지든 목적지든, 이 IP가 관여한 패킷만 잡는다.

② 호스트 + 특정 포트

tcpdump -i ens160 host 192.168.10.201 and port 21 -w ftp5.pcap

and로 조건을 연결한다. 같은 호스트가 FTP·Telnet 둘 다 쓰고 있어도 21번(FTP)만 추려진다.

③ 호스트 + 여러 포트 (괄호로 묶기)

tcpdump -i ens160 host 192.168.10.201 and '(port 21 or port 23)' -w ftp7.pcap

괄호는 BPF 식의 우선순위를 잡아주는데, 셸이 괄호를 가로채지 않게 작은따옴표로 감싸는 게 안전하다.

④ 방향 한정 - src 

tcpdump -i ens160 src host 192.168.10.201 and '(port 21 or port 23)' -w ftp8.pcap

src host를 쓰면 출발지가 해당 IP인 트래픽만 잡는다. 클라이언트가 보낸 패킷만 보고 싶을 때 유용하다.

⑤ 방향 한정 - dst 

tcpdump -i ens160 dst host 192.168.10.201 and '(port 21 or port 23)' -w ftp9.pcap

dst host는 반대로 목적지가 해당 IP인 트래픽만 잡는다.

⑥ 네트워크 대역 설정 - net

# 192.168.10.0 ~ 192.168.10.127 (앞 절반)
tcpdump -i ens160 net 192.168.10.0/25 and '(port 21 or port 23)' -w ftp10.pcap

# 192.168.10.128 ~ 192.168.10.255 (뒷 절반)
tcpdump -i ens160 net 192.168.10.128/25 and '(port 21 or port 23)' -w ftp11.pcap

⑦ 부정 조건 — not

tcpdump -i eth0 -s 1500 src host 192.168.10.100 and '(not port 21)' -w nonftp.pcap

"FTP만 빼고" 같은 식의 필터링도 가능하다.