2016-12-28 17 views
1

私はバナーをつかんで、Pythonでポートスキャナをコーディングしようとしています。ソケットは接続を確立できません

s.send('getBanner\n')行(バナーをつかむ)がなければ、私のスクリプトは動作し、開いているポートを表示します。

しかし、'getBanner'行を追加すると、ソケットエラーはと表示されます。

このエラーは、接続が確立されてソケットが閉じるまでクライアントが待機しないことが原因である可能性があります。これをどうすれば解決できますか?

コード:

import socket 

host = '192.168.1.1' 

for port in range(1,1024): 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     result = s.connect_ex((host, port)) 
     s.send(('getBanner\n')) 
     banner = s.recv(1024) 
     if result == 0: 
       print "[+] Port %s tcp/open" % port 
       print "[+] Banner: %s" % banner 
     s.close() 

答えて

1

すべてのポートはそれらにリスニングサービスを持っており、彼らが行うとき、あなたはそのサービスの正常な動作ですどんなプロトコルに従う必要がありますされていません。私はあなたが "getBanner"に応答する何らかのサービスを持っていると思いますが、ほとんどはそうしません。あなたはFTP、SSH、DNS、NFS、メールサーバーのようなものに接続しており、これらには "getBanner"コマンドがありません。しかし、リッスンしていないポートにも接続しようとしているため、エラーが発生します。

のドキュメントを見て:

connect_ex(...) 
    connect_ex(address) -> errno 

    This is like connect(address), but returns an error code (the errno value) 
    instead of raising an exception when an error occurs. 

あなたの接続コールがエラーコードを返して、あなたがリクエストを送信しようとする前にそれをチェックする必要があります。だから、最低でも:

import socket 

host = '192.168.1.1' 

for port in range(1,1024): 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     result = s.connect_ex((host, port)) 
     if result == 0: 
      s.send(('getBanner\n')) 
      banner = s.recv(1024) 
      if result == 0: 
        print "[+] Port %s tcp/open" % port 
        print "[+] Banner: %s" % banner 
     s.close() 

しかし、ほとんどのサーバーがポートでリスニング以来のハングアップするつもりは以上の可能性が高い昇給の接続リセット・エラーのいずれか、「getBanner」コマンドに応答しません。

+0

期待どおりに機能しました。アドバイスありがとう –

関連する問題