我想详细说明this question,特别是this answer。假设我有一个要检查的固定服务列表,例如:('ftp', 'ssh', 'http')
。打开一个套接字到远程服务器的端口22:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = s.connect_ex(('my_remote_server', 22))
if(result == 0) :
print s.recv(256)
s.close()
我得到以下输出:
'SSH-2.0-OpenSSH_6.1p1 Debian-4\r\n'
所以我猜可以在这个端口上监听ssh服务。因此,我的问题是:在哪里或如何为不同类型的服务找到欢迎消息(或类似)?这些是以某种方式受到监管吗?对于ssh,它始终以SSH-
开头吗?
答案 0 :(得分:1)
您从服务器获得的响应取决于确切的协议和服务器配置。
例如,HTTP有一个Server
标题,但是互联网上的许多服务器谎言关于服务器正在响应什么,以甩掉试图利用服务器特定漏洞的恶意黑客。此外,服务器保持静默,直到客户端发送请求为止;你的代码必须在有任何回复之前发送一些内容。
你能做的最好的事情是尝试不同的协议,看看对方是否做出明智的反应。例如,尝试将SSH握手发送到HTTP端口可能会导致HTTP/1.0 400 Bad Request
响应。
换句话说,没有现成的解决方案,你必须根据你想要检测的协议创建自己的启发式方法。
答案 1 :(得分:1)
你能做的最好的事情就是搜索字符串ssh(/ ftp / http)并根据它得出结论。 当然,即使这是一个猜测,因为通常可以使用config参数更改(请参阅here),并且将其更改为不暴露服务器程序/版本被视为良好的安全实践。