2013-02-20 157 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