Previous Posts
About IP Address
About MAC Address
About ARP
ARP Spoofing Attack이란?
ARP reply packet의 target MAC address를 attacker MAC address로 변조하여 victim의 arp table을 감염시키는 공격이다.
공격 시 infected vitci이 LAN 외부의 host와 통신을 시도하는 경우, 패킷이 gateway가 아닌 attacker에게 전송되게 된다.
이를 통해 host가 정상적인 네트워크 통신을 할 수 없는 효과를 기대할 수 있는 공격이다.
Terms
sender(victim) : 공격의 대상이 될 host
attacker : 공격자
target(gateway) : 위장할 대상
Infection Scenario
- Get sender, target IP address from command line argument
- insert pairs of sender-target IP address to 'Flow' structure
- Get host IP/MAC address, sender, target MAC address
- Infect victim (Attacker sends ARP reply packet to victim)
- Reinfect victim when victim's ARP table refreshed (Attacker sends ARP reply packet to victim)
- Send malicious ARP reply packet continuously to victim
Test in Private Domain
Configuration
hypervisor : VMWare Pro 17
sender(victim) : Mac OS (Host OS)
attacker : kali linux 64bit(Guest OS) on Window 64bit (Host OS)
target(gateway) : Wifi Router (LAN)
LAN : same domain
Attack Flow
sudo ./arp-spoof {sender IP addr} {target IP addr} {target IP addr} {sender IP addr}
실제로 arp spoof 실습시에, sender IP 에는 Mac OS의 IP address, target IP에는 공유기의 IP address를 argument로 넣었다.
이런 공격으로 기대할 수 있는 효과는 다음과 같다.
- 첫 번째 쌍({sender IP addr} {target IP addr})의 Flow에서, Mac OS(sender)의 arp table에서, 공유기(target)의 mac addr가 attacker의 mac addr로 변조된다.
- 두 번째 쌍({target IP addr} {sender IP addr})의 Flow에서, 공유기(target)의 arp table의 Mac OS(sender)의 mac addr가 attacker의 mac addr로 변조된다.
- 1., 2.를 간단하게 요약하자면, 같은 LAN에 있는 두 node(router, Mac OS)가 서로의 MAC address를 attacker의 MAC address로 인식하게 된다.
- 추가적으로, 다양한 이유들로 인해 sender의 arp table이 refresh될 수 있다. refresh 될 수 있는 case들을 탐지하여, infect packet(ARP reply packet)을 다시 보내어 감염된 상태를 유지시킬 수 있도록 한다.
bool isRefreshed(pcap_t *handle, const u_char *receivedPkt, Flow flow)
{
EthArpPacket *pkt = (EthArpPacket *)receivedPkt;
// case : broadcast (ARP)
if (pkt->eth_.type_ == ntohs(EthHdr::Arp) && pkt->eth_.dmac_ == Mac::broadcastMac())
{
// sender arp table의 임의의 node cache가 만료되어 broadcast를 할 때
if (ntohl(pkt->arp_.sip_) == flow.senderIp && pkt->eth_.smac_ == flow.senderMac)
{
printf("[*] sender refreshed by sender broadcast..\n");
return true;
}
// target arp table의 임의의 node cache가 만료되어 broadcast를 할 때
if (ntohl(pkt->arp_.sip_) == flow.targetIp && pkt->eth_.smac_ == flow.targetMac)
{
printf("[*] sender refreshed by target broadcast..\n");
return true;
}
}
else // case : unicast
{
// sender -> target 으로 unicast packet(IP packet)이 전송될 때
if (ntohl(pkt->arp_.sip_) == flow.senderIp && pkt->eth_.smac_ == flow.senderMac)
{
if (ntohl(pkt->arp_.tip_) == flow.targetIp && pkt->arp_.tmac_ == flow.attackerMac)
{
printf("[*] sender refreshed by sender->target unicast..\n");
return true;
}
}
}
return false;
}
이 외에도 다양한 이유로 arp table이 refresh 되는 경우가 있다. 이를 위해 daemon thread로 10초간격으로 지속적으로 infect packet을 전송하도록 한다.
- 이렇게 sender를 지속적으로 감염시켜 공격자가 활용할 수 있는 예시를 설명하자면 다음과 같다.
Mac OS(sender)에서 외부로 패킷을 보낼 때 (ex. ping 8.8.8.8 //구글로 핑을 보냄, 혹은 외부로 http request packet을 보냄) 라우터를 거쳐서 보내야 하는데 이 ICMP request packet은 attacker에게 가게 된다.
그래서 외부로 패킷이 전송될 때, attacker는 수신한 IP(ICMP) request packet을 변조하여 router에게 전달한다.
router에서는 그대로 이 변조된 ICMP request packet을 8.8.8.8에 전송하게 된다.
request에 대한 reply응답이 오면, 이 응답도 마찬가지로 router(wifi, 즉 gateway) -> attacker -> sender 이 흐름으로 전달되게 된다.
2.에서 설정한 두 번째 flow로 진행된 감염이 target의 arp table도 변조시켰기에 reply packet이 성공적으로 relay되어 sender에게 전달되는 것을 돕는다.
결론적으로, sender와 target은 본인이 감염된 상태인지도 모른 상태에서 packet을 주고 받으며 attacker는 그 사이에서 plain text인 packet은 모두 볼 수 있다.
Wireshark
- attacker
- getting Info
- SpoofThread #1, #2
- reinfect when sender is refreshed
- getting Info
- sender
arp table의 MAC addr이 바뀌었지만, IP packet이 relay되는 모습
Ref
'Security' 카테고리의 다른 글
대칭키 암호 시스템 (0) | 2023.10.02 |
---|---|
메시지 변조 감지 코드(MDC) (0) | 2023.09.29 |
암호학적 해시 함수 (0) | 2023.09.28 |
보안 기본 개념 및 공격모델 (0) | 2023.09.26 |
정보보안의 이해 (0) | 2023.09.26 |