Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
epsylon
GitHub Repository: epsylon/ufonet
Path: blob/master/core/doll.py
1207 views
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-"
3
"""
4
This file is part of the UFONet project, https://ufonet.03c8.net
5
6
Copyright (c) 2013/2020 | psy <[email protected]>
7
8
You should have received a copy of the GNU General Public License along
9
with UFONet; if not, write to the Free Software Foundation, Inc., 51
10
Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
11
"""
12
from threading import Thread
13
import socket, time, os, base64, re
14
try:
15
from urlparse import urlparse
16
except:
17
from urllib.parse import urlparse
18
class Needle(Thread):
19
def __init__(self, client, addr, parent):
20
Thread.__init__(self)
21
self.daemon = True
22
self.client = client
23
self.parent = parent
24
25
def run(self):
26
data = self.client.recv(1024)
27
if data:
28
if data.startswith("HEAD"):
29
self.parent.data_arrived(data)
30
self.client.send("""HTTP/1.1 200 OK
31
Server: UFONet Galactic Cyber Warfare
32
Date: Wed, 05 Nov 2042 16:21:23 GMT
33
Content-Type: text/html
34
Content-Length: """+str(len('thanks for coming!'))+"""
35
Connection: close
36
37
""")
38
self.client.close()
39
else:
40
self.parent.data_arrived(data)
41
self.client.send('Welcome to UFONet mothership! ;-)\n')
42
self.client.send('='*40)
43
self.client.send("\n\nStream:\n")
44
self.client.send('-'*15 + "\n\n")
45
f = open("mothership", 'r') # read mothership stream
46
self.client.send(str(f.read()))
47
f.close()
48
self.client.close()
49
self.parent.client_finished(self)
50
51
class Doll(Thread):
52
def __init__(self, parent):
53
Thread.__init__(self)
54
self.daemon = True
55
self._clients = []
56
self._armed = True
57
self.ready = False
58
self.running =False
59
self.parent = parent
60
self.real_zombies = [] # 100% vulnerable zombies
61
if os.path.exists('mothership') == True:
62
os.remove('mothership') # remove mothership stream
63
with open('alien') as f: # call alien to verify vulnerability
64
self.alien = f.read().splitlines()
65
f.close()
66
67
def data_arrived(self, data):
68
data.split("\n")[0]
69
self.check_zombie(data)
70
f = open("mothership", 'a') # append data mothership stream
71
f.write(data)
72
f.close()
73
74
def check_zombie(self, data): # check for requests received by a zombie
75
if str(''.join(self.alien)) in data: # hash check
76
if "%7C" in data: # %7C -> |
77
regex_zmb = re.compile('{}(.*){}'.format(re.escape('%7C'), re.escape(' HTTP'))) # regex magics
78
else:
79
regex_zmb = re.compile('{}(.*){}'.format(re.escape('|'), re.escape(' HTTP'))) # regex magics
80
pattern_zmb = re.compile(regex_zmb)
81
zombie_vul = re.findall(pattern_zmb, data)
82
if zombie_vul not in self.real_zombies: # add zombies only one time
83
self.real_zombies.append(zombie_vul)
84
85
def client_finished(self, _thread):
86
self._clients.remove(_thread)
87
88
def shutdown(self):
89
if self.ready:
90
self.socket.shutdown(socket.SHUT_RDWR)
91
self.socket.close()
92
self.running = False
93
self._armed = False
94
self.ready = False
95
96
def run(self):
97
while not self.running and self._armed:
98
try:
99
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
100
s.bind(('', 8080))
101
self.running = True
102
except socket.error as e:
103
print("\n[Warning] Doll socket busy, retry opening")
104
if e.errno == 98: # if is in use wait a bit and retry
105
time.sleep(3)
106
else:
107
return
108
if not self._armed:
109
print("\n[Error] Doll not armed")
110
return
111
self.socket = s
112
self.ready = True
113
s.listen(1)
114
while self.running and self._armed:
115
try:
116
conn, addr = s.accept()
117
except socket.timeout:
118
print("\n[Warning] Socket is giving timeout...")
119
pass
120
except socket.error as e:
121
if self.ready == False:
122
return
123
else:
124
break
125
else:
126
t = Needle(conn, addr, self)
127
t.start()
128
self._clients.append(t)
129
if self.ready:
130
s.close()
131
self.ready = False
132
133