0

我是 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. 我想控制尝试(尝试)的次数,即我只想发送一两个同步数据包。我不希望这个程序发送超过 2 个用于探测的同步数据包。这东西怎么可能实现?
4

2 回答 2

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'
    

我想控制尝试(尝试)的次数,即我只想发送一两个同步数据包。

我认为没有setsockopt暴露 TCP 选项,但在 linux 上有:

net.ipv4.tcp_syn_retries

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

于 2013-02-20T04:53:18.483 回答
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')
于 2017-10-27T18:11:59.240 回答