취약점분석 (Blue Team)/Network

[Network] ARP & ARP Spoofing (Address Resolution Protocol)

poiri3r 2026. 6. 6. 16:57

이번 포스팅은 ARP와 ARP 프로토콜을 이용한 공격인 ARP Spoofing에 대해 포스팅을 해보겠습니다.

 

ARP는 Address Resolution Protocol의 약자로 IP주소를 MAC 주소로 변환하는 프로토콜입니다.

즉, LAN(네트워크) 안에서 해당 IP를 가진 장비의 MAC 주소가 뭔지 알아내기 위해 사용합니다.

저번 포스팅할때부터 wireshark를 아주 많이 쓰고 있는데, 이 ARP 프로토콜을 사용한 통신이 상당히 많습니다.

IP주소를 MAC주소로 변경하는 프로토콜이기 때문에, 2계층~3계층 사이의 프로토콜입니다.

 

이게 왜 필요한지에 대해 알면 좋을 것 같아서 조사해왔습니다.

다음과 같이 네트워크가 구성이 되어 있다고 해보겠습니다.

모든 하드웨어 장비들은 고유의 MAC주소를 가집니다.

 

제 pc가 192.168.0.4 IP를 가진다고 생각을 해보겠습니다.

만약에 1.2.3.4 IP를 가진 곳으로 정보를 보내려고 할때 목적지 IP는 1.2.3.4를 가지지만, 실제로는 공유기를 거치고, 스위치를 거치고, 통신을 가야할 것입니다. 그럼 제 PC는 일단 공유기의 MAC주소를 알아야하고, 공유기는 패킷을 받은 뒤, 이제 어디로 보낼지 확인하고 해당 MAC주소로 보내야합니다.

 

같은 LAN에서는 IP주소가 아닌 MAC주소로 패킷을 전달하기 때문에 제 컴퓨터는 공유기의 MAC주소가 필요합니다.

따라서 ARP를 이용해서 다음과 같은 메세지를 보냅니다.

x.x.x.1의 IP를 가진 장비가 누구야? 내 ip주소로 알려줘를 broadcast 통신으로 보냅니다.

broadcast 통신은 같은 LAN 전체에게 보내기 때문에, 같은 192.168.0.x 대역을 쓰는 모든 ip로 패킷을 보낼 것 입니다

이러면 모든 컴퓨터에서 who is ~~라는 패킷을 받고, 본인이 해당 ip에 속하면 응답을 보내서, MAC주소를 보내줍니다.

본인 IP가 아니라면 그냥 무시합니다.

 

이게 왜 필요한지에서 얘기가 조금 샜는데, 그래서 이거 귀찮고 패킷 낭비 같은데 왜 해야됨?? 할수도 있습니다.

일단 제일 중요한건 IP는 계속 바뀌기 때문입니다.

핸드폰 그림이 하나 있는데 wifi로 네트워크에 연결하는 경우 연결할때마다 ip가 동적으로 바뀝니다.(DHCP)

이때 arp가 없이 통신을 하게되면, 패킷이 꼬이거나 제대로 도착을 못하는 경우가 생깁니다.

 

두번째로는 장비가 바뀌면 MAC주소가 바뀔 수 있습니다. 꼭 컴퓨터가 바뀌지 않더라도, 랜카드, VM, Docker컨테이너 등이 바뀌면 같은 IP여도 MAC이 달라질 수 있습니다.

 

저번에 OSI 7계층안에 프레이밍에 대해서 자세히 다루지 않았던 것 같은데 

이렇게 프레임이 겉포장 되어서 MAC 주소가 써져 있습니다.

그래서 라우터를 지날때마다 프레임을 풀고, 다시 프레이밍해서 패킷을 보내고 합니다.

 

그렇다고 아예 ip에 대한 정보를 기억해두진 않는 건 아닙니다.

ARP 캐시를 사용해서 IP 주소 <-> MAC 주소를 임시로 저장을 해두고, 일정시간이 지나면 삭제합니다.

wsl에서 arp -a 명령을 이용해서 확인할 수 있습니다.

이런식으로 다 저장이 되어 있습니다.

 

추가로 꼭 통신할때만 ARP Request를 보내는건 아닙니다. 

Gratuitous ARP라는 방식도 있는데, 자기 자신의 IP 주소를 타겟으로 ARP 요청을 보내는 것입니다.

크게는 2가지 이유가 있습니다.

 

첫번째는 IP주소 충돌 감지입니다.

host에서 자신의 IP주소를 타겟으로 ARP 요청을 보냈는데, 다른 pc에서 응답을 보내온다면, 해당 IP주소를 사용하고 있는 host가 존재하는 것을 알 수 있습니다.

 

두번째는 본인의 IP주소를 알려서 ARP Table을 갱신하는 것 입니다. garp를 받은 호스트/라우터는 ARP Table(arp cache)를 갱신하여 IP와 MAC 주소를 수정해서 저장합니다.

 

garp는 windows에서는 scapy나 nping같은 도구를 써야하는데 linux에서는 쉽게 보낼 수 있습니다.

ip addr로 wsl에서 사용하는 ip를 확인한 후 다음 명령어를 사용했습니다.

sudo arping -A -c 3 -I eth0 172.31.132.209

*생각해보니 arping도 따로 설치해야하긴 합니다.

 

그리고 wsl에다가 wireshark를 붙여서 패킷을 보면

패킷이 뜨게되는데,

sender와 target의 ip가 같은걸 알 수 있습니다.

참고로 gratuitous는 쓸데없는이라는 뜻입니다 ㅋㅋ

 

이런 ARP를 악용한 공격도 존재합니다.

제일 대표적인게 ARP Spoofing인데, IP Spoofing때도 봤었지만 Spoofing은 속이다는 뜻입니다.

ARP 공격의 경우 일단 같은 LAN안에 들어가야 한다는 제약이 있긴 합니다.

대형 침해사고 보고서에서 원인으로 작용하지는 않으나, 공용 Wifi에서 특히 위험하고,

https://www.wired.com/story/russian-spies-indictment-hotel-wi-fi-hacking/?utm_source=chatgpt.com

 

How Russian Spies Infiltrated Hotel Wi-Fi to Hack Victims

A new indictment details how Russian agents camped outside hotels when remote hacking efforts weren't enough.

www.wired.com

러시아 해커들의 경우는 같은 호텔에서 도청을 하는 경우도 있었습니다.

 

ARP spoofing의 경우에는 개인 PC 혹은 공유기 사이에 껴서 MITM(중간자 공격)을 통해 snooping의 경우가 많습니다.

다음과 같이 해커가 숨어들었다고 하겠습니다.

해커가 garp 혹은 가짜 ARP 응답을 보내면, 공유기 혹은 다른 PC들의 arp cache가 오염될 것 입니다.

그럼 만약에 192.168.0.6에서 원래 주인으로 갔어야 하는 패킷이 있다면 이 패킷은 그 전에 해커의 PC로 먼저 갔다가, 해커가 패킷을 확인한 후 192.168.0.2로 보내거나 혹은 내용을 바꿔서 보낼 것 입니다.

마찬가지로 원래 pc주인인 192.168.0.2한테도 본인이 공유기인것처럼 spoofing을 하면 원래 pc에서 네트워크로 나가는 패킷을 훔쳐볼 수 있을 것 입니다.

 

물론 패킷양이 엄청나게 많고, HTTPS 통신과 같은 암호화가 적용된 통신들은 패킷을 훔쳐봐도 목적지 IP/포트 번호 외에 추가적인 정보를 습득하긴 어렵습니다.

하지만 정보보안 또 해킹이라는 것 자체가 이런 작은 데이터들을 모아서 스노우볼을 굴리는게 중요하다고 생각합니다.

보안은 가장 약한 고리의 크기만큼 강하니까요.

 

일단 포스팅은 여기까지해서 마치도록 하겠습니다. 읽어주셔서 감사드립니다.