我尝试使用横幅抓取来编写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()
答案 0 :(得分: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”命令,因此它要么挂起,要么更可能引发连接重置错误。