【问题标题】:Socket can't establish connection套接字无法建立连接
【发布时间】:2016-12-28 16:14:58
【问题描述】:

我正在尝试用带有横幅抓取功能的 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()

【问题讨论】:

    标签: python sockets network-programming broken-pipe


    【解决方案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”命令,它要么会挂起,要么更有可能引发连接重置错误。

    【讨论】:

    • 它按预期工作。谢谢你的建议
    猜你喜欢
    • 2021-05-10
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多