2016-12-28 252 views
1

我试图用横幅抓取在python中编写一个端口扫描器。套接字无法建立连接

没有s.send('getBanner\n')行(抓住横幅)我的脚本工作,并打印开放端口。

但是,当我添加'getBanner'行,套接字错误说'[Errn 32] Broken Pipe'

我知道这个错误可能发生,因为客户端不会等待连接建立并关闭套接字。我该如何解决这个问题?

代码:

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() 

回答

1

并非所有的端口对他们监听的服务,当他们这样做,你需要遵循任何协议是正常的该服务。我假设你有某种对“getBanner”有反应的服务,但大多数服务不会。您正在连接到诸如FTP,SSH,DNS,NFS和邮件服务器之类的东西,而这些东西没有“getBanner”命令。但是你也试图连接到没有任何监听的端口,这会产生一个错误。

望着文档:

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. 

你的连接调用返回错误代码,你需要检查尝试发送请求之前。所以,至少包括:

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() 

但由于大部分服务器侦听端口不为“getBanner”响应命令,它要么会挂起或更可能提高连接复位的错误。

+0

它像预期的那样工作。感谢您的建议 –