Scanner de rede em Python
Publicado por mrxrobot (última atualização em 01/11/2017)
[ Hits: 27.327 ]
Homepage: https://notabug.org/mrxrobot_
Download 1508038521.scan.py (versão 2)
Aos amantes da linguagem Python e aos curiosos que gostam de obter conhecimento, trago nesse script uma ideia muito boa para se utilizar a linguagem de programação Python.
O script a seguir demonstra como é simples desenvolver um utilitário de rede que descobre informações sobre determinado host na rede.
Para o desenvolvimento do programa utilizei o Scapy que é uma excelente ferramenta para a manipulação de pacotes em Python.
Sobre o script:
- O script necessita ser executado com permissões de usuário root.
- Quanto ao funcionamento do script, funciona tanto em modo texto quanto numa interface gráfica GUI (Graphical User Interface).
- Caso o IP destino seja de um site na internet é aconselhável que a parte que obtém o endereço MAC seja removida do programa, pois não funcionará. Entretanto, se o programa for executado numa rede interna (doméstica e/ou empresarial), todas as opções do programa serão executadas com sucesso.
Atenção: este script é livre e pode ser modificado por qualquer pessoa e redistribuído de modo a favorecer a todos.
Versão 2 - Enviado por mrxrobot em 15/10/2017
Changelog: Script que faz a descoberta de hosts na rede interna, por meio do módulo scapy do python.
#!/usr/bin/env python # -*- coding: utf-8 -*- # Programa scanner # Programado por: Marcos Rodrigues de Carvalho # Nick no viva o Linux: marcos_warlock # Versão python utilizada: python2.7 # importação dos módulos necessários para ao funcionamento do programa # modulo de interface gráfica " Tkinter " from Tkinter import * # modulo de sistema " sys " import sys # modulo para criar e manipular pacotes de rede em python " scapy " from scapy.all import * # importar o modulo system from os import system def help(): # imprime o conjunto de strings entre """ """ na tela print """ ================== = Scanner via IP = ============================================================ = Opções: = = [-t] Utilizar o programa em modo texto = = EXEMPLO: python marcos.py -t <ip destino> = = = = [-g] Utilizar o programa no modo interface gráfica = = EXEMPLO: python marcos.py -g = = = = [--help ] ajuda do programa = = EXEMPLO python marcos.py --help = = = = [--verion] exibe a versão do programa = = EXEMPLO: python marcos.py --version = ============================================================ """ # se os argumentos passados forem menores do que 2, # o programa apresentará uma mensagem de erro e chamará a função help() # finalizando a execução. if len(sys.argv) < 2: system('clear') print "ERRO !" print "Nenhum argumento foi passado" help() sys.exit() elif sys.argv[1].startswith('--'): # se o 1º argumentos iniciar com -- op = sys.argv[1][2:] # a variável op recebe o argumento sem os dois traços " -- " if op == 'help': # se a variável op for igual a 'help' help() # chama a função help() sys.exit() # encerra a execução do programa if op == 'version': # se a variável op for igual a 'version' # imprime a versão do programa # imprime a string entre " " na tela print """ Scanner via IP Versão 1.2 Dados do programador: Marcos Rodrigues de Carvalho """ sys.exit() # encerra a execução do programa else: # se não print "Opção inválida" # imprime a string entre " " na tela sys.exit() # encerra a execução do programa elif sys.argv[1] == "-t": alvo = sys.argv[2] # a variável alvo recebe o segundo argumento ip = IP() # a variável ip recebe a função IP() pertencente ao scapy ping = ICMP() # a variável ping recebe a função ICMP() responsável em criar o pacote do ping ip.dst = alvo # o destino da variável ip recebe o alvo resp = sr1(ip/ping) # a variável resp recebe o pacote de envio res = sr1(ARP(pdst=sys.argv[2])) # envia o pacote ao alvo e permite a análise mac = res.hwsrc # a variável mac recebe o mac do alvo. Isso é muito simples através da linguagem python. :-) if resp.ttl < 65: # se resp.ttl, isto é o ttl do sistema do alvo for < 65, será Linux. ''' Para quem não sabe fica uma dica abaixo sobre o ttl dos sistemas operacionais: ● Cyclades - Normalmente 30 ● Linux - Normalmente 64 ● Windows - Normalmente 128 ● Cisco - Normalmente 255 ● Linux + iptables - Normalmente 255 ''' # imprime o conjunto de strings entre """ """ na tela print """ SISTEMA OPERACIONAL ========= = LINUX = MAC: %s ========= """ %mac else: # imprime o conjunto de strings entre """ """ na tela print """ SISTEMA OPERACIONAL =========== = WINDOWS = MAC %s =========== """ %mac elif sys.argv[1] == '-g': # INTERFACE GRÁFICA class Programa: def __init__(self, toplevel): self.frame1=Frame(toplevel.title("Scan")) self.frame1.pack() self.frame2=Frame(toplevel) self.frame2.pack() self.frame3=Frame(toplevel) self.frame3.pack() self.frame4=Frame(toplevel) self.frame4.pack() self.frame5=Frame(toplevel) self.frame5.pack() self.frame6=Frame(toplevel) self.frame6.pack() Label(self.frame1,text='marcos_warlock', fg='darkblue',font=('Verdana','10','bold'), height=3).pack() # cria uma Label fonte1=('Verdana','10','bold') # define a fonte Label(self.frame2,text='IP: ',font=fonte1,width=10).pack(side=LEFT) # cria uma Label self.ip=Entry(self.frame2,width=10,font=fonte1) # cria uma entrada, onde o usuário ira digitar numa caixa de texto self.ip.focus_force() # força o foco em self.ip self.ip.pack(side=LEFT) # define a posição do objeto Label(self.frame3,font=fonte1,height=3,text='SO: ').pack(side=LEFT) # cria uma Label self.msg1=Label(self.frame3,font=fonte1,height=3,text='AGUARDANDO...') # cria uma Label self.msg1.pack(side=RIGHT) # define a posição do objeto Label(self.frame4,font=fonte1,height=3,text='MAC: ').pack(side=LEFT) # cria uma Label self.msg2=Label(self.frame4,font=fonte1,height=3,text='AGUARDANDO...') self.msg2.pack(side=RIGHT) # define a posição do objeto self.conferir=Button(self.frame5, font=fonte1, text="Iniciar", bg="pink", command=self.conf) # cria um botão que chama a função conf self.conferir.pack(side=LEFT) self.conferir=Button(self.frame5, font=fonte1, text="Limpar", bg="pink", command=self.limpa)# cria um botão que chama a função limpa self.conferir.pack(side=RIGHT) # função confi # Todos os componentes dentro de conf são os mesmos explicados no início do código. # O que há de diferente aqui é o uso da interface gráfica def conf(self): alvo=self.ip.get() ip = IP() ping = ICMP() ip.dst = alvo resp = sr1(ip/ping) if resp.ttl == 64: self.msg1['text'] = "LINUX" self.msg1['fg']='darkgreen' elif resp.ttl == 128: self.msg1['text'] = "Windows" self.msg1['fg']='red' elif resp.ttl == 30: self.msg1['text'] = "Cyclades" self.msg1['fg']='darkgreen' else: self.msg1['text'] = "Desconhecido" self.msg1['fg']='darkgreen' res = sr1(ARP(pdst=self.ip.get())) self.msg2['text'] = res.hwsrc self.msg2['fg']='red' #função limpa # o objetivo desta função é limpar todos os componentes visíveis do programa (Label) def limpa(self): self.ip.delete(INSERT, END) self.msg1['text'] = " " self.msg2['text'] = " " instancia=Tk() ################################################################################# Programa(instancia) # Mantém o programa aberto até que um evento seja chamado e finalize a execução # instancia.mainloop() ################################################################################# else: print ("Opção inválida !")
Script em Python com várias funções matemáticas [iniciante]
Resolução de problemas por meio de buscas - Labirinto (Inteligência Artificial)
Gerador palpite Mega Sena v1.0
Combinações de letras, números e muito mais
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)