Jump to content
Sign in to follow this  
gnoo

Portscan em Python

Recommended Posts

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...