Scanner de rede em Python
Publicado por mrxrobot (última atualização em 01/11/2017)
[ Hits: 27.482 ]
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 !")
LISCH e EISCH - Método de resolução de colisão
Nenhum comentário foi encontrado.
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Como colorir os logs do terminal com ccze
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
Máquinas Virtuais com IP estático acessando Internet no Virtualbox
Compartilhando uma ideia sobre computação quantica (6)
Meus HDs não aparecem mais no boot da placa mãe (12)
Acabei zuando meu Linux inteiro e estou desesperado (10)
Linux Mint com GForce 630 e 2 monitores dos quais só um está na resolu... (2)