Scanner de rede em Python
Publicado por mrxrobot (última atualização em 01/11/2017)
[ Hits: 27.834 ]
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 !")
Dicionário Ingles de expressões.
O maior quebra cabeças de sempre
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Warcraft II Remastered no Linux? (7)
O programa assinador digital (5)









