2013-02-20 152 views
0

新手到python並卡住了一個點。我想創建一個端口掃描器只使用Python 3個的內置庫(意味着避免Scapy的等),我有以下代碼:Python端口掃描器

import socket 
for i in range(1,26): 
    s = socket.socket() 
    s.settimeout(0.5) 
    ip = "74.207.244.221" #scanme.nmap.org 
    response = s.connect_ex((ip, i)) 
    if response: 
     print ("%d\tclose" %i) 
    else: 
     print ("%d\topen" %i) 
    s.close() 

現在我想2層的功能添加到這一點:那就是

  1. 區分關閉和過濾端口之間。在這兩種情況下,我都會收到相同的errno,因此如何檢查我是否收到了第一個數據包?據我所知s.recv()不適用於此。
  2. 我想控制嘗試次數(嘗試),即我只想發送一個或兩個syn數據包。我不希望這個程序發送超過2個syn數據包用於探測。這件事如何實現?
+0

我希望每一個現有的端口掃描器會比與1 – 2013-02-20 05:24:58

回答

1

區分關閉和過濾的端口。在這兩種情況下是 接收返回同一錯誤號我怎麼能檢查,如果我收到 回RST包或沒有

你可能只與發送RST服務器進行檢查。下面是我的嘗試:

  • 第一種情況,正常的配置:

    >>> os.strerror(s.connect_ex((ip, 81))) 
    'Connection refused' 
    
  • 其次,具有手動iptables的:

    iptables -A OUTPUT -p tcp --dport 81 -j DROP 
    
    >>> os.strerror(s.connect_ex((ip, 81))) 
    'Resource temporarily unavailable' 
    

我要控制數量嘗試(嘗試),即我想發送 只有一個或兩個同步數據包。

我不認爲有暴露setsockopt TCP選項,但在Linux上有:

net.ipv4.tcp_syn_retries 

不過,既然你限制了超時套接字,所有操作不中0.5完成秒會超時。所以很可能只有1或2個SYN會離開電臺。

0
#!/usr/bin/python 

import socket 

s = socket.socket(socket.AF_INET, socekt.SOCK_STREAM) 
host = 74.207.244.221 

def portscan(port): 
    try: 
     s.connect((host,port)) 
     return True 
    else: 
     return False 
for x in range(1,255): 
    if portscan(x): 
     print('Port',x,'Is Open') 
+0

的聲譽寫一個新手儘管此代碼可以回答這個問題的代碼要好得多,提供關於爲什麼和/或如何代碼的其他方面回答這個問題提高了它的長期價值。 – 2017-10-27 19:20:54