Scanner de rede em Python

Publicado por mrxrobot (última atualização em 01/11/2017)

[ Hits: 27.327 ]

Homepage: https://notabug.org/mrxrobot_

Download marcos.py

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ões atualizadas deste script

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.

Download 1508038521.scan.py


Esconder código-fonte

#!/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 !")

Scripts recomendados

Script em Python com várias funções matemáticas [iniciante]

multimídia tools 0.1 BETA

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


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts