Ir para conteúdo
  • Cadastre-se
Entre para seguir isso  
gnoo

Portscan em Python

Posts Recomendados

Boas pessoal fiz um espécie de portscan, e o prblema é o seguinte, quando faço scan a um servidor num site de empregos qualquer a partir de 2000 porto o programa devolve um erro, mas na minha rede consigo fazer até 10 000 sem problema alguém pode explicar o porquê disso sff.

5a398ef576995_Capturadeecrno2017-12-1921-52-12.png.0a01de5f92a9478554486f54f98242a5.png5a398ecca1ca2_Capturadeecrno2017-12-1922-11-49.thumb.png.50cbf075080e6868f9f3f2d0f73667f8.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que a mensagem de erro leva a crer é que você está atingindo o limite de file descriptors (lembre-se que no Linux tudo é descripto por arquivos). A diferença entre fazer o scan na sua rede local e na Internet é a latência envolvida, portanto quando você realiza o scan na sua rede, rapidamente o SYN ACK (porta aberta) ou RST (porta fechada) e o socket é fechado, enquanto na Internet essa resposta tarda mais a demorar.

No entanto, o que deve estar acontecendo é que a porta não está nem aberta nem fechada, mas sim, filtrada. Nesse caso você não vai receber nenhuma resposta e seu socket vai continuar aberto (alocando um file descriptor). Seu script não está tratando esse caso... o que aconselharia fazer é setar um timeout, depois do qual você considera a porta filtrada.

 

Obs.: No Stackoverflow há uma referência que pode te ajudar a debugar a questão do file descriptor.

  • l33t 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado por responder @cpuodzius, também pensei que seria com o número de processos a executar ser elevado entretanto resolvi o problema com "tratamento de exceções" , não sei se foi a melhor decisão mas foi a que resultou melhor para mim na altura.

Agradeço a dica das portas filtradas , não tinha pensado nisso, vou fazer essa alteração também (tentar pelo menos).

Entretanto depois de alguma pesquisa cheguei a um resultado:

#!/usr/bin/env python

try:
    from scapy3k.all import *
except:
    print("O módulo scapy3k não está instalado")


from socket import *
import threading
from queue import Queue
import shelve
from time import strftime
from datetime import datetime

base_dados = shelve.open('servicos_scan.db')
base_dados_servicos = base_dados ['servicos']

host = input("Inserir host para reconhecimento: ")

segura_saida = threading.Lock()

porto_aberto = []

porto_fechado = []


def mapeamento(porto):
    sock = socket(AF_INET, SOCK_STREAM)
    try:
        resultado = sock.connect_ex((host, porto))
        with segura_saida:
            if resultado == 0:
                porto_aberto.append(porto)
                print("Detectado porto aberto %d/tcp em %s" % (porto, host))
            else: 
                porto_fechado.append(porto)
               
        sock.close()
    except:
        pass

def OSfingerprint(host):

    print("******OS Fingerprint******")
   
    pacote_ICMP = sr1(IP(dst=host)/ICMP(), timeout= 2, verbose= 0)
    if int(pacote_ICMP[IP].ttl) == 64:
        print("Host: %s Sistema possivel: linux/FreeBSD/Android" % host)
    elif int(pacote_ICMP[IP].ttl) == 128:
        print("Host: %s Sistema possivel: Windows" % host)
    elif int(pacote_ICMP[IP].ttl) == 255:
        print("Cisco routers")
    
def confirma_servicos():
   
    print("PORTO   ESTADO  SERVIÇO\n")
    for j in porto_aberto:
        print(j,"/tcp  Aberto",base_dados_servicos.get(j, "desconhecido"))
    
    print("Scan feito em %s" %total_tempo)
    print("Sem actividade:",len(porto_fechado),"portos fechados")

def thread():
    while True:
        acao = q.get()
        mapeamento(acao)
        q.task_done()

def executa_scan():
    print("A verificar total ([10 000])portos")
   
    global q
    q = Queue()


    for i in range(30):
        tarefa = threading.Thread(target= thread)
        tarefa.daemon = True
        tarefa.start()
        
    t1 = datetime.now()

    global hora_inicio
    hora_inicio = strftime("%H:%M")
    print("Scan iniciou  às %s " % hora_inicio)
    for porto in range(1, 10001):
        q.put(porto)

    q.join()

    global hora_fim
    hora_fim = strftime("%H:%M")
    print("Scan terminado às %s" %hora_fim)
    t2 = datetime.now()

    global total_tempo
    total_tempo = t2-t1
    
def main():
    executa_scan()
    confirma_servicos()
    OSfingerprint(host)
    
   

if __name__ == '__main__':
    main()

O código está um pouco desarrumado mas ainda estou a aprender a montar as coisas, ainda não está acabado, mais para a frente quero implementar uma função para analisar os headers do TCP , estou a começar agora a aprofundar nessa matéria. 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
Entre para seguir isso  

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×