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. 試行 (試行) の回数を制御したい、つまり、1 つまたは 2 つの syn パケットのみを送信したい。私は、このプログラムがプローブのために 2 つ以上の syn パケットを送信することを望んでいません。このことはどのように達成できますか?
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'
    

試行 (試行) の回数を制御したい、つまり、1 つまたは 2 つの syn パケットのみを送信したい。

setsockoptTCP オプションが公開されているとは思いませんが、Linux には次のオプションがあります。

net.ipv4.tcp_syn_retries

ただし、ソケットのタイムアウトを制限したため、0.5 秒以内に終了しない操作はすべてタイムアウトになります。したがって、1 つまたは 2 つの SYN だけがステーションを離れる可能性があります。

于 2013-02-20T04:53:18.483 に答える