2011-12-26 72 views
1

我写一个软件,可以骗过Nmap的,以为GuildFTPd FTP服务器端口21上运行我的Python代码到目前为止是这样的:编造一个FTP服务

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

我的猜测是,有更多的FTP协议。你给nmap一个响应,让它知道那个端口上有一个程序*。但是,它不知道它是否实际上是一个ftp服务器,因为命令集不正确。 – 2011-12-26 20:34:56

+0

我用Wireshark嗅探了真正的应用程序,它似乎没有发送任何额外的信息,所以我仍然感到困惑。 – 2011-12-26 20:56:40

+0

没有人知道吗? – 2011-12-26 22:34:14

回答

1

首先,您在匹配行所需的假响应末尾缺少\r\n

另一个主要问题是您的程序只处理一个连接,然后关闭。 Nmap将首先进行端口扫描,然后发送服务指纹探针。如果以root身份运行nmap(或Windows上的管理员),它将使用半开TCP SYN扫描,并且您的应用程序不会将端口扫描视为连接,否则它将接受端口扫描,关闭连接,以及在服务扫描阶段不可用。

这是你的脚本,它可以处理顺序连接(但不平行),这足以骗过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()