1

我正在编写一个软件,它可以欺骗 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 扫描真实服务时,它会正确识别服务。

4

1 回答 1

1

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

另一个主要问题是您的程序只处理一个连接,然后关闭。Nmap 将首先进行端口扫描,然后发送服务指纹探测。如果您以 root(或 Windows 上的管理员)身份运行 nmap,它将使用半开 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()
于 2012-04-13T01:56:56.900 回答