套接字无法建立连接

Socket can't establish connection

我正尝试在 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()

并非所有端口都有侦听它们的服务,当它们侦听时,您需要遵循该服务的任何正常协议。我假设您有某种响应 "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" 命令,它要么会挂起,要么更有可能引发连接重置错误。