2016-12-28 44 views
1

J'essaye de coder un scanner de port en python avec l'accrochage de bannière.Le socket ne peut pas établir la connexion

Sans la ligne s.send('getBanner\n') (qui saisit la bannière) mon script fonctionne, et il imprime les ports ouverts.

Mais lorsque j'ajoute la ligne 'getBanner', une erreur de socket indique '[Errn 32] Broken Pipe'.

Je sais que cette erreur se produit probablement parce que les clients n'attendent pas que la connexion soit établie et ferment le socket. Comment puis-je resoudre ceci?

Le code:

import socket 

host = '192.168.1.1' 

for port in range(1,1024): 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     result = s.connect_ex((host, port)) 
     s.send(('getBanner\n')) 
     banner = s.recv(1024) 
     if result == 0: 
       print "[+] Port %s tcp/open" % port 
       print "[+] Banner: %s" % banner 
     s.close() 

Répondre

1

Tous les ports ont un service d'écoute sur eux et quand ils le font, vous devez suivre le protocole qui est normal pour ce service. Je suppose que vous avez une sorte de service qui répond à "getBanner", mais la plupart ne le feront pas. Vous vous connectez à des choses comme FTP, SSH, DNS, NFS et les serveurs de messagerie et ces choses n'ont pas de commandes "getBanner". Mais vous essayez aussi de vous connecter à des ports qui n'ont rien à écouter et cela génère une erreur.

En regardant les docs:

connect_ex(...) 
    connect_ex(address) -> errno 

    This is like connect(address), but returns an error code (the errno value) 
    instead of raising an exception when an error occurs. 

Votre appel de connexion retourne un code d'erreur et vous devez vérifier que avant d'essayer d'envoyer la demande. Ainsi, au minimum:

import socket 

host = '192.168.1.1' 

for port in range(1,1024): 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     result = s.connect_ex((host, port)) 
     if result == 0: 
      s.send(('getBanner\n')) 
      banner = s.recv(1024) 
      if result == 0: 
        print "[+] Port %s tcp/open" % port 
        print "[+] Banner: %s" % banner 
     s.close() 

Mais puisque la plupart des serveurs d'écoute sur les ports ne répondent pas à une commande « getBanner », son soit va suspendre ou plus probablement des erreurs réinitialiser la connexion augmentation.

+0

Cela a fonctionné comme prévu. Merci pour les conseils –