我正在编写一个软件,可以让Nmap相信GuildFTPd FTP服务器在端口21上运行。到目前为止,我的python代码如下所示:
import socket
s = socket.socket( )
s.bind(('', 21))
s.listen(1)
conn, addr = s.accept()
conn.send("220-GuildFTPd FTP Server (c) 1997-2002\r\n220-Version 0.999.14")
conn.close()
用于匹配此特定服务的Nmap正则表达式是:
match ftp m|^220-GuildFTPd FTP Server \(c\) \d\d\d\d(-\d\d\d\d)?\r\n220-Version (\d[-.\w]+)\r\n| p/Guild ftpd/ v/$2/ o/Windows/
但是,当我使用Nmap扫描运行脚本的主机时,结果为:
21/tcp open ftp?
这怎么可能?当我使用Nmap扫描真实服务时,它可以正确识别服务。
答案 0 :(得分:1)
首先,您在错误回复结束时错过了匹配线所需的\r\n
。
另一个主要问题是您的程序只处理一个连接,然后关闭。 Nmap将首先进行端口扫描,然后发送服务指纹探针。如果您以root身份运行nmap(或Windows上的Administrator),它将使用半开TCP SYN扫描,您的应用程序将不会将portscan视为连接,但是否则它将接受portscan,关闭连接,以及无法进行服务扫描阶段。
这是一个非常基本的脚本修改,可以处理顺序连接(但不是并行),这足以欺骗Nmap:
import socket
s = socket.socket( )
s.bind(('', 21))
s.listen(1)
while True:
conn, addr = s.accept()
conn.send("220-GuildFTPd FTP Server (c) 1997-2002\r\n220-Version 0.999.14\r\n")
conn.close()