Python-penetration-testing-socket-and-methods

提供:Dev Guides
移動先:案内検索

ソケットとそのメソッド

ソケットは、双方向通信チャネルのエンドポイントです。 プロセス内、同じマシン上のプロセス間、または異なるマシン上のプロセス間で通信できます。 同様に、ネットワークソケットは、インターネットなどのコンピューターネットワーク上で実行される2つのプログラム間の通信フローの1つのエンドポイントです。 これは純粋に仮想的なものであり、ハードウェアを意味するものではありません。 ネットワークソケットは、IPアドレスとポート番号の一意の組み合わせによって識別できます。 ネットワークソケットは、TCP、UDPなどのさまざまなチャネルタイプで実装できます。

ネットワークプログラミングで使用されるソケットに関連するさまざまな用語は次のとおりです-

ドメイン

ドメインは、トランスポートメカニズムとして使用されるプロトコルファミリです。 これらの値は、AF_INET、PF_INET、PF_UNIX、PF_X25などの定数です。

Type

タイプは、2つのエンドポイント間の通信の種類を意味します。通常、接続指向プロトコルの場合はSOCK_STREAM、コネクションレスプロトコルの場合はSOCK_DGRAMです。

プロトコル

これは、ドメインおよびタイプ内のプロトコルのバリアントを識別するために使用できます。 デフォルト値は0です。 通常、これは省略されます。

ホスト名

これは、ネットワークインターフェイスの識別子として機能します。 ホスト名は、文字列、ドットで区切られた4つのアドレス、またはコロン(およびドット)表記のIPV6アドレスです。

Port

各サーバーは、1つ以上のポートで呼び出しているクライアントをリッスンします。 ポートは、Fixnumポート番号、ポート番号を含む文字列、またはサービスの名前です。

ソケットプログラミング用のPythonのソケットモジュール

Pythonでソケットプログラミングを実装するには、Socketモジュールを使用する必要があります。 以下は、ソケットを作成するための簡単な構文です-

import socket
s = socket.socket (socket_family, socket_type, protocol = 0)

ここでは、ソケットライブラリをインポートしてから、単純なソケットを作成する必要があります。 以下は、ソケットを作成するときに使用されるさまざまなパラメータです-

  • socket_family -これは、前述のようにAF_UNIXまたはAF_INETのいずれかです。
  • socket_type -これはSOCK_STREAMまたはSOCK_DGRAMのいずれかです。
  • protocol -これは通常省略され、デフォルトは0です。

ソケットメソッド

このセクションでは、さまざまなソケットメソッドについて学習します。 ソケットメソッドの3つの異なるセットは以下に説明されています-

  • サーバーソケットメソッド
  • クライアントソケットメソッド
  • 一般的なソケットメソッド

サーバーソケットメソッド

クライアント/サーバーアーキテクチャには、サービスを提供する1つの集中サーバーがあり、多くのクライアントがその集中サーバーからサービスを受け取ります。 クライアントはサーバーへのリクエストも行います。 このアーキテクチャのいくつかの重要なサーバーソケットメソッドは次のとおりです-

  • * socket.bind()*-このメソッドは、アドレス(ホスト名、ポート番号)をソケットにバインドします。
  • * socket.listen()*-このメソッドは、基本的にソケットへの接続をリッスンします。 TCPリスナーを起動します。 バックログは、キューに入れられた接続の最大数を指定するこのメソッドの引数です。 その最小値は0で、最大値は5です。
  • * socket.accept()*-これはTCPクライアント接続を受け入れます。 ペア(conn、address)は、このメソッドの戻り値のペアです。 ここで、connは接続でデータを送受信するために使用される新しいソケットオブジェクトであり、addressはソケットにバインドされたアドレスです。 このメソッドを使用する前に、socket.bind()およびsocket.listen()メソッドを使用する必要があります。

クライアントソケットメソッド

クライアント/サーバーアーキテクチャのクライアントは、サーバーを要求し、サーバーからサービスを受け取ります。 このため、クライアント専用の方法は1つだけです-

  • * socket.connect(address)*-このメソッドは、積極的にサーバー接続を確立します。簡単に言えば、このメソッドはクライアントをサーバーに接続します。 引数addressは、サーバーのアドレスを表します。

一般的なソケットメソッド

クライアントおよびサーバーのソケットメソッド以外に、一般的なソケットメソッドがいくつかあり、これらはソケットプログラミングに非常に役立ちます。 一般的なソケットメソッドは次のとおりです-

  • * socket.recv(bufsize)*-名前が示すように、このメソッドはソケットからTCPメッセージを受信します。 引数bufsizeはバッファサイズを表し、このメソッドが一度に受信できる最大データを定義します。
  • * socket.send(bytes)*-このメソッドは、リモートマシンに接続されているソケットにデータを送信するために使用されます。 引数bytesは、ソケットに送信されたバイト数を示します。
  • * socket.recvfrom(data、address)*-このメソッドは、ソケットからデータを受け取ります。 このメソッドは、2つのペア(データ、アドレス)の値を返します。 データは受信データを定義し、アドレスはデータを送信するソケットのアドレスを指定します。
  • * socket.sendto(data、address)*-名前が示すように、このメソッドはソケットからデータを送信するために使用されます。 このメソッドは、2つのペア(データ、アドレス)の値を返します。 データは送信されるバイト数を定義し、アドレスはリモートマシンのアドレスを指定します。
  • * socket.close()*-このメソッドはソケットを閉じます。
  • * socket.gethostname()*-このメソッドは、ホストの名前を返します。
  • * socket.sendall(data)*-このメソッドは、リモートマシンに接続されているソケットにすべてのデータを送信します。 エラーが発生するまで不用意にデータを転送し、エラーが発生した場合はsocket.close()メソッドを使用してソケットを閉じます。

サーバーとクライアント間の接続を確立するプログラム

サーバーとクライアント間の接続を確立するには、サーバー用とクライアント用の2つの異なるPythonプログラムを作成する必要があります。

サーバー側プログラム

このサーバー側のソケットプログラムでは、特定のIPアドレスとポートにバインドする* socket.bind()メソッドを使用して、そのIPとポートで着信要求をリッスンできるようにします。 後で、サーバーをリッスンモードにする socket.listen()メソッドを使用します。 * socket.listen()*メソッドの引数としての4という数は、サーバーがビジーで、5番目のソケットが接続を試みると接続が拒否される場合、4つの接続が待機することを意味します。 * socket.send()*メソッドを使用して、クライアントにメッセージを送信します。 最後に向かって、接続の開始と終了にそれぞれ socket.accept() socket.close()*メソッドを使用します。 以下は、サーバー側のプログラムです-

import socket
def Main():
   host = socket.gethostname()
   port = 12345
   serversocket = socket.socket()
   serversocket.bind((host,port))
   serversocket.listen(1)
   print('socket is listening')

   while True:
      conn,addr = serversocket.accept()
      print("Got connection from %s" % str(addr))
      msg = 'Connecting Established'+ "\r\n"
      conn.send(msg.encode('ascii'))
      conn.close()
if __name__ == '__main__':
   Main()

クライアント側プログラム

クライアント側のソケットプログラムでは、ソケットオブジェクトを作成する必要があります。 次に、サーバーが実行されているポート(この例では12345)に接続します。 その後、* socket.connect()メソッドを使用して接続を確立します。 次に、 socket.recv()メソッドを使用して、クライアントはサーバーからメッセージを受信します。 最後に、 socket.close()*メソッドはクライアントを閉じます。

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
port = 12345

s.connect((host, port))
msg = s.recv(1024)

s.close()
print (msg.decode('ascii'))

さて、サーバー側のプログラムを実行した後、ターミナルで次の出力を取得します-

socket is listening
Got connection from ('192.168.43.75', 49904)

そして、クライアント側のプログラムを実行した後、我々は他の端末で次の出力を取得します-

Connection Established

ネットワークソケット例外の処理

ネットワークソケット例外を処理するために使用できる tryexcept の2つのブロックがあります。 以下は、例外を処理するためのPythonスクリプトです-

import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
   s.bind((host,port))
   s.settimeout(3)
   data, addr = s.recvfrom(1024)
   print ("recevied from ",addr)
   print ("obtained ", data)
   s.close()
except socket.timeout :
   print ("No connection between client and server")
   s.close()

出力

上記のプログラムは、次の出力を生成します-

No connection between client and server

上記のスクリプトでは、最初にソケットオブジェクトを作成しました。 次に、サーバーが実行されているホストIPアドレスとポート番号(この例では12345)を指定しました。 後で、tryブロックが使用され、その内部で* socket.bind()メソッドを使用して、IPアドレスとポートをバインドしようとします。 クライアントの待機時間を設定するために socket.settimeout()*メソッドを使用しています。この例では3秒を設定しています。 サーバーとクライアント間で接続が確立されない場合にメッセージを出力するexceptブロックが使用されます。