Python端口扫描程序

时间:2013-02-20 04:36:27

标签: python sockets port

是python的新手并且陷入了困境。我想创建端口扫描程序只使用python 3内置库(意味着避免scapy等)我有以下代码:

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包。怎么能实现这个目标呢?

2 个答案:

答案 0 :(得分:1)

  

区分关闭和过滤的端口。在这两种情况下我   收到相同的errno作为回报,我该如何检查我是否收到了   支持第一个数据包或什么都没有

您可能只检查过发送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'
    
  

我想控制尝试次数(尝试次数),即我要发送   只有一个或两个syn包。

我认为没有公开setsockopt TCP选项,但在linux上有:

net.ipv4.tcp_syn_retries

但是,由于您限制了套接字的超时,因此所有未在0.5秒内完成的操作都将超时。因此,可能只有1或2个SYN将离开电台。

答案 1 :(得分: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')