2011-12-26 67 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()