This repository has been archived by the owner on May 25, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathservice2client.py
executable file
·67 lines (61 loc) · 2.28 KB
/
service2client.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
import authlib
from pwn import *
context.log_level = "error"
PORT = 1234
class Client():
def __init__(self, server_ip, username, password, service):
self.server_addr = server_ip
self.server_port = PORT
self.username = username
self.password = password
self.service = service
self.auth_token = None
self.shared_key = None
def open_connection(self):
s = remote(self.server_addr, self.server_port)
assert s.recvline(False) == b"HELLO"
s.sendline(b"HELLO")
assert s.recvline(False) == b"OK"
return s
def register(self):
s = self.open_connection()
s.sendline(b"REG")
assert s.recvline(False) == b"OK"
s.sendline(self.username.encode())
resp = s.recvline(False)
if resp != b"OK":
return False
s.sendline(self.password.encode())
resp = s.recvline(False)
s.close()
if resp != b"OK":
return False
return True
def login(self):
auth = authlib.AuthClient(self.username, self.password)
initial_values = auth.get_starting_values()
s = self.open_connection()
s.sendline(b"AUTH")
assert s.recvline(False) == b"OK"
s.sendline(self.username.encode())
resp = s.recvline(False)
if resp != b"OK":
return False
s.sendline(initial_values.encode())
intermediate_values = s.recvline(False).decode()
final_values = auth.get_final_values(intermediate_values)
s.sendline(final_values.encode())
self.auth_token = s.recvline(False).decode()
self.shared_key = auth.get_shared_key()
s.close()
return True
def get_token(self):
token_client = authlib.TicketClient(self.username, self.service, self.auth_token, self.shared_key)
user_token = token_client.get_user_token()
s = self.open_connection()
s.sendline(b"TOKEN")
assert s.recvline(False) == b"OK"
s.sendline(user_token.encode() + b"." + self.auth_token.encode())
key_token, service_token = s.recvline(False).decode().split(".")
s.close()
return token_client.finalize_token(key_token, service_token)