←︎ trollbots :: 0b81ff4


1
commit 0b81ff4a18d38d0eb2437ebcb1f381980488cdae
2
Author: acidvegas <acid.vegas@acid.vegas>
3
Date:   Fri Jun 28 02:34:03 2019 -0400
4
5
    Initial commit
6
---
7
 5000.py                           |    81 +
8
 LICENSE                           |    15 +
9
 README.md                         |    12 +
10
 badparent/README.md               |    10 +
11
 badparent/badparent/badparent.py  |   331 +
12
 badparent/badparent/config.py     |    33 +
13
 efknockr/README.md                |     6 +
14
 efknockr/efknockr/config.py       |    38 +
15
 efknockr/efknockr/efknockr.py     |   292 +
16
 efknockr/efknockr/msg.txt         |     8 +
17
 jupiter/README.md                 |    25 +
18
 jupiter/jupiter/jupiter.py        |   364 +
19
 jupiter/jupiter/jupiter364.py     |   333 +
20
 muhstik/README.md                 |    34 +
21
 muhstik/muhstik/CIDR.txt          |   316 +
22
 muhstik/muhstik/MONITOR.txt       |   117 +
23
 muhstik/muhstik/MOTD              |    10 +
24
 muhstik/muhstik/Makefile          |    21 +
25
 muhstik/muhstik/NAMES             |    40 +
26
 muhstik/muhstik/SASL.txt          |   119 +
27
 muhstik/muhstik/TODO.odt          |   Bin 0 -> 25588 bytes
28
 muhstik/muhstik/TODO.pdf          |   Bin 0 -> 83746 bytes
29
 muhstik/muhstik/TODO.tex          |   219 +
30
 muhstik/muhstik/cisco.txt         |  2641 +++++++
31
 muhstik/muhstik/ident.word        | 13581 ++++++++++++++++++++++++++++++++++++
32
 muhstik/muhstik/include/clone.h   |   101 +
33
 muhstik/muhstik/include/control.h |    31 +
34
 muhstik/muhstik/include/globals.h |    74 +
35
 muhstik/muhstik/include/init.h    |    92 +
36
 muhstik/muhstik/include/lists.h   |    55 +
37
 muhstik/muhstik/include/load.h    |    29 +
38
 muhstik/muhstik/include/mass.h    |    31 +
39
 muhstik/muhstik/include/muhstik.h |    25 +
40
 muhstik/muhstik/include/net.h     |    43 +
41
 muhstik/muhstik/include/print.h   |    32 +
42
 muhstik/muhstik/include/proxy.h   |    50 +
43
 muhstik/muhstik/include/string.h  |    46 +
44
 muhstik/muhstik/ipv6/config.sh    |    28 +
45
 muhstik/muhstik/ipv6/h.sh         |   178 +
46
 muhstik/muhstik/ipv6/he.sh        |    10 +
47
 muhstik/muhstik/ipv6/vhosts.sh    |    13 +
48
 muhstik/muhstik/jupes.txt         |    47 +
49
 muhstik/muhstik/muhstik           |   Bin 0 -> 92810 bytes
50
 muhstik/muhstik/muhstik.conf      |   154 +
51
 muhstik/muhstik/muhstik.wordlist  |  7209 +++++++++++++++++++
52
 muhstik/muhstik/prox/dns2ip.pl    |    34 +
53
 muhstik/muhstik/prox/prox.tcl     |   167 +
54
 muhstik/muhstik/prox/tor-enode.sh |    21 +
55
 muhstik/muhstik/proxies.txt       |  1938 +++++
56
 muhstik/muhstik/servers           |   225 +
57
 muhstik/muhstik/servers6          |   225 +
58
 muhstik/muhstik/shuffle.sh        |     4 +
59
 muhstik/muhstik/socks4.txt        |  2114 ++++++
60
 muhstik/muhstik/socks5.txt        |  2113 ++++++
61
 muhstik/muhstik/src/clone.c       |  1418 ++++
62
 muhstik/muhstik/src/control.c     |  1022 +++
63
 muhstik/muhstik/src/init.c        |   362 +
64
 muhstik/muhstik/src/lists.c       |   363 +
65
 muhstik/muhstik/src/load.c        |   316 +
66
 muhstik/muhstik/src/mass.c        |   277 +
67
 muhstik/muhstik/src/muhstik.c     |   469 ++
68
 muhstik/muhstik/src/net.c         |   205 +
69
 muhstik/muhstik/src/print.c       |   500 ++
70
 muhstik/muhstik/src/proxy.c       |   449 ++
71
 muhstik/muhstik/src/string.c      |   216 +
72
 muhstik/muhstik/vhosts            |   100 +
73
 spiderweb.py                      |    47 +
74
 surge/README.md                   |    23 +
75
 surge/screens/flood.png           |   Bin 0 -> 33599 bytes
76
 surge/screens/logo.gif            |   Bin 0 -> 9033 bytes
77
 surge/surge/config.py             |    24 +
78
 surge/surge/surge.py              |   361 +
79
 72 files changed, 39887 insertions(+)
80
81
diff --git a/5000.py b/5000.py
82
new file mode 100644
83
index 0000000..d1c3cd8
84
--- /dev/null
85
+++ b/5000.py
86
@@ -0,0 +1,81 @@
87
+#!/usr/bin/env python
88
+# 5000 IRC Bot - Developed by acidvegas in Python (https://acid.vegas/trollbots)
89
+
90
+'''
91
+Requirements
92
+	* Python (https://www.python.org/downloads/)
93
+	Note: This script was developed to be used with the latest version of Python.
94
+
95
+Information:
96
+	This bot requires network operator privledges in order to use the SAJOIN command.
97
+	The bot will idle in the #5000 channel and a channel defined in the config.
98
+	Anyone who joins the #5000 channel will be force joined into 5000 random channels.
99
+	It will announce in the channel defined in the config who joins the #5000 channel.
100
+	The command .kills can be used to see how many people have been 5000'd.
101
+'''
102
+
103
+import os,random,socket,ssl,time,threading
104
+
105
+nickserv_password='CHANGEME'
106
+operator_password='CHANGEME'
107
+
108
+def randstr():return ''.join(random.sample('aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ',random.randint(4,10)))
109
+def unicode():
110
+	msg=''
111
+	for i in range(random.randint(150,200)):msg+=chr(random.randint(0x1000,0x3000))
112
+	return msg
113
+def attack(nick):
114
+	try:
115
+		nicklist.append(nick)
116
+		raw(f'PRIVMSG #superbowl :I am fucking the shit out of {nick} right now...')
117
+		current=str(int(open(kill_file).read())+1)
118
+		with open(kill_file,'w') as kills_file:kills_file.write(current)
119
+		for i in range(200):
120
+			channels=','.join(('#'+randstr() for x in range(25)))
121
+			raw(f'SAJOIN {nick} {channels}')
122
+			raw(f'PRIVMSG #5000 :{unicode()} oh got {nick} what is happening {unicode()}')
123
+			raw(f'PRIVMSG {nick} :{unicode()} oh got {nick} what is happening {unicode()}')
124
+			time.sleep(0.4)
125
+	except:pass
126
+	finally:
127
+		if nick in nicklist:
128
+			nicklist.remove(nick)
129
+def raw(msg):sock.send(bytes(msg+'\r\n','utf-8'))
130
+kill_file=os.path.join(os.path.dirname(os.path.realpath(__file__)),'kills.log')
131
+last=0
132
+nicklist=list()
133
+if not os.path.isfile(kill_file):open(kill_file,'w').write('0')
134
+while True:
135
+	try:
136
+		sock=ssl.wrap_socket(socket.socket(socket.AF_INET,socket.SOCK_STREAM))
137
+		sock.connect(('localhost',6697))
138
+		raw(f'USER 5000 0 * :I CAN SHOW YOU THE WORLD')
139
+		raw('NICK FUCKYOU')
140
+		while True:
141
+			try:
142
+				data=sock.recv(1024).decode('utf-8')
143
+				for line in (line for line in data.split('\r\n') if len(line.split())>=2):
144
+					print('{0} | [~] - {1}'.format(time.strftime('%I:%M:%S'),line))
145
+					args=line.split()
146
+					if line.startswith('ERROR :Closing Link:'):raise Exception('Connection has closed.')
147
+					elif args[0]=='PING':raw('PONG '+args[1][1:])
148
+					elif args[1]=='001':
149
+						raw('MODE FUCKYOU +BDd')
150
+						raw('PRIVMSG NickServ IDENTIFY FUCKYOU '+nickserv_password)
151
+						raw('OPER 5000 '+operator_password)
152
+						raw('JOIN #superbowl')
153
+						raw('JOIN #5000')
154
+					elif args[1]=='401':
155
+						if args[3] in nicklist:
156
+							nicklist.remove(args[3])
157
+					elif args[1]=='JOIN' and len(args)==3:
158
+						nick=args[0].split('!')[0][1:]
159
+						if args[2][1:]=='#5000' and nick not in ('ak','ChanServ','FUCKYOU') and len(nicklist)<3 and nick not in nicklist:
160
+							threading.Thread(target=attack,args=(nick,)).start()
161
+					elif args[1]=='PRIVMSG' and len(args)==4:
162
+						if ' '.join(args[3:])[1:]=='.kills' and time.time()-last>3:
163
+							raw('PRIVMSG #superbowl :'+open(kill_file).read())
164
+							last=time.time()
165
+			except (UnicodeDecodeError,UnicodeEncodeError):pass
166
+	except:sock.close()
167
+	finally:time.sleep(15)
168
diff --git a/LICENSE b/LICENSE
169
new file mode 100644
170
index 0000000..b63b809
171
--- /dev/null
172
+++ b/LICENSE
173
@@ -0,0 +1,15 @@
174
+ISC License
175
+
176
+Copyright (c) 2019, acidvegas <acid.vegas@acid.vegas>
177
+
178
+Permission to use, copy, modify, and/or distribute this software for any
179
+purpose with or without fee is hereby granted, provided that the above
180
+copyright notice and this permission notice appear in all copies.
181
+
182
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
183
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
184
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
185
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
186
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
187
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
188
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
189
diff --git a/README.md b/README.md
190
new file mode 100644
191
index 0000000..29ccacc
192
--- /dev/null
193
+++ b/README.md
194
@@ -0,0 +1,12 @@
195
+# trollbots
196
+A collection of annoying scripts for the Internet Relay Chat (IRC) protocol
197
+
198
+###### Warning
199
+These scripts are for testing against your own server(s). I am not responsible for how the public uses these.
200
+
201
+###### Mirrors
202
+- [acid.vegas](https://acid.vegas/trollbots) *(main)*
203
+- [SuperNETs](https://git.supernets.org/acidvegas/trollbots)
204
+- [GitHub](https://github.com/acidvegas/trollbots)
205
+- [GitLab](https://gitlab.com/acidvegas/trollbots)
206
+
207
diff --git a/badparent/README.md b/badparent/README.md
208
new file mode 100644
209
index 0000000..707cb3f
210
--- /dev/null
211
+++ b/badparent/README.md
212
@@ -0,0 +1,10 @@
213
+###### Requirements
214
+* [Python](https://www.python.org/downloads/) *(**Note:** This script was developed to be used with the latest version of Python.)*
215
+* [PySocks](https://pypi.python.org/pypi/PySocks) *(**Optional:** For using the `--proxy` setting.)*
216
+
217
+###### Information
218
+The parent bot will join a channel, parse the entire nicklist, and maintain it during joins, quits, nick changes, etc.
219
+
220
+The child bot clones will use either proxies or virtual hosts to connect and PM the nicklist.
221
+
222
+Nicks that have the usermode +g *(callerid)*, +D *(privdeaf)*, and +R *(regonlymsg)* will be removed from the nicklist.
223
diff --git a/badparent/badparent/badparent.py b/badparent/badparent/badparent.py
224
new file mode 100644
225
index 0000000..af52a05
226
--- /dev/null
227
+++ b/badparent/badparent/badparent.py
228
@@ -0,0 +1,331 @@
229
+#!/usr/bin/env python
230
+# BadParent IRC Bot - Developed by acidvegas in Python (https://acid.vegas/trollbots)
231
+# badparent.py
232
+
233
+import argparse
234
+import concurrent.futures
235
+import os
236
+import random
237
+import ssl
238
+import socket
239
+import string
240
+import sys
241
+import threading
242
+import time
243
+
244
+sys.dont_write_bytecode = True
245
+
246
+import config
247
+
248
+def alert(msg):
249
+	print(f'{get_time()} | [+] - {msg}')
250
+
251
+def debug(msg):
252
+	print(f'{get_time()} | [~] - {msg}')
253
+
254
+def error(msg, reason=None):
255
+	print(f'{get_time()} | [!] - {msg} ({reason})') if reason else print(f'{get_time()} | [!] - {msg}')
256
+
257
+def error_exit(msg):
258
+	raise SystemExit(f'{get_time()} | [!] - {msg}')
259
+
260
+def get_time():
261
+	return time.strftime('%I:%M:%S')
262
+
263
+def random_str(size):
264
+	return ''.join(random.choice(string.ascii_letters) for _ in range(size))
265
+
266
+def unicode():
267
+	msg = ''
268
+	for i in range(random.randint(400,450)):
269
+		msg += chr(random.randint(0x1000, 0x3000))
270
+	return msg
271
+
272
+class parent(object):
273
+	def __init__(self):
274
+		self.nicklist = list()
275
+		self.sock     = None
276
+
277
+	def connect(self):
278
+		try:
279
+			self.create_socket()
280
+			self.sock.connect((config.connection.server, config.connection.port))
281
+			self.register()
282
+		except socket.error as ex:
283
+			error('Failed to connect to IRC server.', ex)
284
+			self.event_disconnect()
285
+		else:
286
+			self.listen()
287
+
288
+	def create_socket(self):
289
+		family = socket.AF_INET6 if config.connection.ipv6 else socket.AF_INET
290
+		if config.connection.proxy:
291
+			proxy_server, proxy_port = config.connection.proxy.split(':')
292
+			self.sock = socks.socksocket(family, socket.SOCK_STREAM)
293
+			self.sock.setblocking(0)
294
+			self.sock.settimeout(config.throttle.timeout)
295
+			self.sock.setproxy(socks.PROXY_TYPE_SOCKS5, proxy_server, int(proxy_port))
296
+		else:
297
+			self.sock = socket.socket(family, socket.SOCK_STREAM)
298
+		if config.connection.vhost:
299
+			self.sock.bind((config.connection.vhost, 0))
300
+		if config.connection.ssl:
301
+			ctx = ssl.SSLContext()
302
+			if config.cert.file:
303
+				ctx.load_cert_chain(config.cert.file, config.cert.key, config.cert.password)
304
+			self.sock = ctx.wrap_socket(self.sock)
305
+
306
+	def event_connect(self):
307
+		if config.login.nickserv:
308
+			self.identify(config.ident.nickname, config.login.nickserv)
309
+		self.join_channel(config.connection.channel, config.connection.key)
310
+
311
+	def event_disconnect(self):
312
+		error('The parent bot has disconected!')
313
+		self.sock.close()
314
+
315
+	def event_end_of_names(self, chan):
316
+	   if self.nicklist:
317
+		   alert(f'Found {len(self.nicklist)} nicks in channel.')
318
+		   threading.Thread(target=load_children).start()
319
+	   else:
320
+		   error('Failed to parse nicklist from channel.')
321
+
322
+	def event_join(self, nick, chan):
323
+		if chan == config.connection.channel:
324
+			if nick not in self.nicklist:
325
+				self.nicklist.append(nick)
326
+
327
+	def event_kick(self, nick, chan, kicked):
328
+		if chan == config.connection.channel:
329
+			if kicked == config.ident.nickname:
330
+				time.sleep(3)
331
+				self.join(self.chan, self.key)
332
+
333
+	def event_names(self, chan, names):
334
+		if chan == config.connection.channel:
335
+			for name in names:
336
+				if name[:1] in '~!@%&+:':
337
+					name = name[1:]
338
+				if name != config.ident.nickname and name not in self.nicklist:
339
+					self.nicklist.append(name)
340
+
341
+	def event_nick(self, nick, new):
342
+		if nick in self.nicklist:
343
+			self.nicklist.remove(nick)
344
+			self.nicklist.append(new)
345
+
346
+	def event_nick_in_use(self):
347
+		self.raw('NICK ' + random_str(random.randint(4,7)))
348
+
349
+	def event_quit(self, nick):
350
+		if nick in self.nicklist:
351
+			self.nicklist.remove(nick)
352
+
353
+	def handle_events(self, data):
354
+		args = data.split()
355
+		if data.startswith('ERROR :Closing Link:'):
356
+			raise Exception('Connection has closed.')
357
+		elif args[0] == 'PING':
358
+			self.raw('PONG ' + args[1][1:])
359
+		elif args[1] == '001':
360
+			self.event_connect()
361
+		elif args[1] == '433':
362
+			self.event_nick_in_use()
363
+		elif args[1] == '353':
364
+			chan = args[4]
365
+			if ' :' in data:
366
+				names = data.split(' :')[1].split()
367
+			elif ' *' in data:
368
+				names = data.split(' *')[1].split()
369
+			elif ' =' in data:
370
+				names = data.split(' =')[1].split()
371
+			else:
372
+				names = data.split(chan)[1].split()
373
+			self.event_names(chan, names)
374
+		elif args[1] == '366':
375
+			chan = args[3]
376
+			self.event_end_of_names(chan)
377
+		elif args[1] == 'JOIN':
378
+			nick = args[0].split('!')[0][1:]
379
+			chan = args[2][1:]
380
+			self.event_join(nick, chan)
381
+		elif args[1] == 'KICK':
382
+			chan   = args[2]
383
+			kicked = args[3]
384
+			self.event_kick(nick, chan, kicked)
385
+		elif args[1] == 'NICK':
386
+			nick = args[0].split('!')[0][1:]
387
+			new  = args[2][1:]
388
+			self.event_nick(nick, new)
389
+		elif args[1] == 'QUIT' :
390
+			nick = args[0].split('!')[0][1:]
391
+			self.event_quit(nick)
392
+
393
+	def join_channel(self, chan, key=None):
394
+		self.raw(f'JOIN {chan} {key}') if key else self.raw('JOIN ' + chan)
395
+
396
+	def listen(self):
397
+		while True:
398
+			try:
399
+				data = self.sock.recv(1024).decode('utf-8')
400
+				for line in (line for line in data.split('\r\n') if len(line.split()) >= 2):
401
+					self.handle_events(line)
402
+			except (UnicodeDecodeError,UnicodeEncodeError):
403
+				pass
404
+			except Exception as ex:
405
+				error('Unexpected error occured.', ex)
406
+				break
407
+		self.event_disconnect()
408
+
409
+	def raw(self, msg):
410
+		self.sock.send(bytes(msg + '\r\n', 'utf-8'))
411
+
412
+	def register(self):
413
+		if config.login.network:
414
+			self.raw('PASS ' + config.login.network)
415
+		self.raw(f'USER {config.ident.username} 0 * :{config.ident.realname}')
416
+		self.raw('NICK ' + config.ident.nickname)
417
+
418
+
419
+
420
+class child:
421
+	def __init__(self, data_line):
422
+		self.data_line = data_line
423
+		self.sock      = None
424
+
425
+	def attack(self):
426
+		while True:
427
+			try:
428
+				if not Parent.nicklist:
429
+					error('Nicklist has become empty!')
430
+					break
431
+				for name in Parent.nicklist:
432
+					self.sendmsg(name, unicode())
433
+					time.sleep(config.throttle.pm)
434
+			except:
435
+				break
436
+
437
+	def connect(self):
438
+		try:
439
+			self.create_socket()
440
+			self.sock.connect((config.connection.server, config.connection.port))
441
+			self.register()
442
+		except socket.error:
443
+			self.sock.close()
444
+		else:
445
+			self.listen()
446
+
447
+	def create_socket(self):
448
+		family = socket.AF_INET6 if config.connection.ipv6 else socket.AF_INET
449
+		if pargs.proxy:
450
+			proxy_server, proxy_port = self.data_line.split(':')
451
+			self.sock = socks.socksocket(family, socket.SOCK_STREAM)
452
+			self.sock.setblocking(0)
453
+			self.sock.settimeout(config.throttle.timeout)
454
+			self.sock.setproxy(socks.PROXY_TYPE_SOCKS5, proxy_server, int(proxy_port))
455
+		elif pargs.vhost:
456
+			self.sock = socket.socket(family, socket.SOCK_STREAM)
457
+			self.sock.bind((self.data_line, 0))
458
+		if config.connection.ssl:
459
+			self.sock = ssl.wrap_socket(self.sock)
460
+
461
+	def event_connect(self):
462
+		alert(f'Successful connection. ({self.data_line})')
463
+		threading.Thread(target=self.attack).start()
464
+
465
+	def event_bad_nick(self, nick):
466
+		if nick in Parent.nicklist:
467
+			Parent.nicklist.remove(nick)
468
+
469
+	def event_nick_in_use(self):
470
+			self.raw('NICK ' + random_str(random.randint(4,7)))
471
+
472
+	def handle_events(self, data):
473
+		args = data.split()
474
+		if data.startswith('ERROR :Closing Link:'):
475
+			raise Exception('Connection has closed.')
476
+		elif args[0] == 'PING':
477
+			self.raw('PONG ' + args[1][1:])
478
+		elif args[1] == '001':
479
+			self.event_connect()
480
+		elif args[1] == '401':
481
+			nick = args[3]
482
+			self.event_bad_nick()
483
+		elif args[1] == '433':
484
+			self.event_nick_in_use()
485
+		elif args[1] == '486':
486
+			nick = args[-1:]
487
+			self.event_bad_nick(nick)
488
+		elif args[1] == '716':
489
+			nick = args[3]
490
+			self.event_bad_nick(nick)
491
+		elif args[1] == 'NOTICE':
492
+			if 'User does not accept private messages' in data:
493
+				nick = args[5][1:-1]
494
+				self.event_bad_nick(nick)
495
+
496
+	def listen(self):
497
+		while True:
498
+			try:
499
+				data = self.sock.recv(1024).decode('utf-8')
500
+				for line in (line for line in data.split('\r\n') if len(line.split()) >= 2):
501
+					self.handle_events(line)
502
+			except (UnicodeDecodeError,UnicodeEncodeError):
503
+				pass
504
+			except:
505
+				break
506
+		self.sock.close()
507
+
508
+	def raw(self, msg):
509
+		self.sock.send(bytes(msg + '\r\n', 'utf-8'))
510
+
511
+	def register(self):
512
+		if config.login.network:
513
+			self.raw('PASS ' + config.login.network)
514
+		self.raw('USER {0} 0 * :{1}'.format(random_str(random.randint(4,7)), random_str(random.randint(4,7))))
515
+		self.raw('NICK ' + random_str(random.randint(4,7)))
516
+
517
+	def sendmsg(self, target, msg):
518
+		self.raw(f'PRIVMSG {target} :{msg}')
519
+
520
+
521
+
522
+def load_children():
523
+	debug('Loading children bots...')
524
+	for i in range(config.throttle.concurrency):
525
+		debug('Concurrency round starting....')
526
+		with concurrent.futures.ThreadPoolExecutor(max_workers=config.throttle.threads) as executor:
527
+			checks = {executor.submit(child(item).connect): item for item in data_lines}
528
+			for future in concurrent.futures.as_completed(checks):
529
+				checks[future]
530
+	debug('Flooding is complete. (Threads still may be running!)')
531
+
532
+# Main
533
+print('#'*56)
534
+print('#{0}#'.format(''.center(54)))
535
+print('#{0}#'.format('BadParent IRC PM Flooder'.center(54)))
536
+print('#{0}#'.format('Developed by acidvegas in Python'.center(54)))
537
+print('#{0}#'.format('https://acid.vegas/badparent'.center(54)))
538
+print('#{0}#'.format(''.center(54)))
539
+print('#'*56)
540
+parser = argparse.ArgumentParser(usage='%(prog)s <input> [options]')
541
+parser.add_argument('input',         help='file to scan')
542
+parser.add_argument('-p', '--proxy', help='proxy list', action='store_true')
543
+parser.add_argument('-v', '--vhost', help='vhost list', action='store_true')
544
+pargs = parser.parse_args()
545
+if (pargs.proxy and pargs.vhost) or (not pargs.proxy and not pargs.vhost):
546
+	error_exit('Invalid arguments.')
547
+if pargs.proxy:
548
+	try:
549
+		import socks
550
+	except ImportError:
551
+		error_exit('Missing PySocks module! (https://pypi.python.org/pypi/PySocks)')
552
+if not os.path.isfile(pargs.input):
553
+	error_exit('No such input file.')
554
+data_lines = [line.strip() for line in open(pargs.input).readlines() if line]
555
+debug(f'Loaded {len(data_lines)} lines from file.')
556
+random.shuffle(data_lines)
557
+debug('Starting parent bot connection...')
558
+Parent = parent()
559
+Parent.connect()
560
diff --git a/badparent/badparent/config.py b/badparent/badparent/config.py
561
new file mode 100644
562
index 0000000..f84f51f
563
--- /dev/null
564
+++ b/badparent/badparent/config.py
565
@@ -0,0 +1,33 @@
566
+#!/usr/bin/env python
567
+# BadParent IRC Bot - Developed by acidvegas in Python (https://acid.vegas/trollbots)
568
+# config.py
569
+
570
+class connection:
571
+	server  = 'irc.server.com'
572
+	port    = 6667
573
+	proxy   = None # IP:PORT Socks 5
574
+	ipv6    = False
575
+	ssl     = False
576
+	vhost   = None
577
+	channel = '#chats'
578
+	key     = None
579
+
580
+class cert:
581
+	key      = None
582
+	file     = None
583
+	password = None
584
+
585
+class ident:
586
+	nickname = 'BadParent'
587
+	username = 'badparent'
588
+	realname = 'acid.vegas/badparent'
589
+
590
+class login:
591
+	network  = None
592
+	nickserv = None
593
+
594
+class throttle:
595
+	concurrency = 3
596
+	pm          = 1.5
597
+	threads     = 100
598
+	timeout     = 15
599
diff --git a/efknockr/README.md b/efknockr/README.md
600
new file mode 100644
601
index 0000000..7e4ae52
602
--- /dev/null
603
+++ b/efknockr/README.md
604
@@ -0,0 +1,6 @@
605
+###### Requirements
606
+* Python  https://www.python.org/downloads/    (latest version)
607
+* PySocks https://pypi.python.org/pypi/PySocks (optional for using the --proxy setting)
608
+
609
+###### Information
610
+For each server defined in the config, the bot will connnect, join every channel, send the lines from msg.txt, mass hilight everyone, and then part.
611
diff --git a/efknockr/efknockr/config.py b/efknockr/efknockr/config.py
612
new file mode 100644
613
index 0000000..2074e00
614
--- /dev/null
615
+++ b/efknockr/efknockr/config.py
616
@@ -0,0 +1,38 @@
617
+#!/usr/bin/env python
618
+# EFknockr (EFK) - Developed by acidvegas in Python (https://acid.vegas/trollbots)
619
+# config.py
620
+
621
+class connection:
622
+	proxy = None # Proxy should be a Socks5 in IP:PORT format.
623
+	vhost = None
624
+
625
+class settings:
626
+	mass_hilite = True # Hilite all the users in a channel before parting.
627
+	part_msg    = 'Smell ya l8r'
628
+
629
+class throttle:
630
+	channels = 3   # Maximum number of channels to be flooding at once.
631
+	join     = 3   # Delay between each channel join.
632
+	message  = 0.5 # Delay between each message sent to a channel.
633
+	threads  = 100 # Maximum number of threads running.
634
+	timeout  = 15  # Timeout for all sockets.
635
+	users    = 10  # Minimum number of users required in a channel.
636
+
637
+# Attack List / Options
638
+defaults = {
639
+	'port'     : 6667,
640
+	'ipv6'     : False,
641
+	'ssl'      : False,
642
+	'password' : None, # This is the network password issued on connect.
643
+	'channels' : None, # Setting channels to None will crawl all channels.
644
+	'nickname' : 'EFknockr',
645
+	'username' : 'efk',
646
+	'realname' : 'acid.vegas/efknockr',
647
+	'nickserv' : None
648
+}
649
+
650
+targets  = {
651
+	'irc.server1.com' : None,                                              # None as the server options will use the default settings.
652
+	'irc.server2.com' : {'port':6697, 'ssl':True},                         # Change the default settings by specifying options to change.
653
+	'irc.server3.com' : {'channels':['#channel1','#channel2','#channel3']} # Setting specific channels can be done with a list.
654
+}
655
diff --git a/efknockr/efknockr/efknockr.py b/efknockr/efknockr/efknockr.py
656
new file mode 100644
657
index 0000000..56dd0aa
658
--- /dev/null
659
+++ b/efknockr/efknockr/efknockr.py
660
@@ -0,0 +1,292 @@
661
+#!/usr/bin/env python
662
+# EFknockr (EFK) - Developed by acidvegas in Python (https://acid.vegas/trollbots)
663
+# efknockr.py
664
+
665
+import concurrent.futures
666
+import os
667
+import random
668
+import socket
669
+import ssl
670
+import sys
671
+import threading
672
+import time
673
+
674
+sys.dont_write_bytecode = True
675
+
676
+import config
677
+
678
+# Bad IRC Events
679
+bad_msgs = (
680
+	'Color is not permitted',
681
+	'No external channel messages',
682
+	'You need voice',
683
+	'You must have a registered nick'
684
+)
685
+
686
+bad_numerics = {
687
+	'471' : 'ERR_CHANNELISFULL',
688
+	'473' : 'ERR_INVITEONLYCHAN',
689
+	'474' : 'ERR_BANNEDFROMCHAN',
690
+	'475' : 'ERR_BADCHANNELKEY',
691
+	'477' : 'ERR_NEEDREGGEDNICK',
692
+	'489' : 'ERR_SECUREONLYCHAN',
693
+	'519' : 'ERR_TOOMANYUSERS',
694
+	'520' : 'ERR_OPERONLY'
695
+}
696
+
697
+def debug(msg):
698
+	print(f'{get_time()} | [~] - {msg}')
699
+
700
+def error(msg, reason=None):
701
+	print(f'{get_time()} | [!] - {msg} ({reason})') if reason else print(f'{get_time()} | [!] - {msg}')
702
+
703
+def error_exit(msg):
704
+	raise SystemExit(f'{get_time()} | [!] - {msg}')
705
+
706
+def get_time():
707
+	return time.strftime('%I:%M:%S')
708
+
709
+class clone:
710
+	def __init__(self, server, options):
711
+		self.server           = server
712
+		self.options          = options
713
+		self.bad_channels     = list()
714
+		self.current_channels = list()
715
+		self.nicklist         = dict()
716
+		self.nickname         = None
717
+		self.sock             = None
718
+
719
+	def run(self):
720
+		if not self.options:
721
+			self.options = config.defaults
722
+		else:
723
+			self.options.update(config.defaults)
724
+		self.nickname = self.options['nickname']
725
+		self.connect()
726
+
727
+	def attack(self):
728
+		try:
729
+			while self.options['channels']:
730
+				chan = random.choice(self.options['channels'])
731
+				try:
732
+					self.join_channel(chan)
733
+				except Exception as ex:
734
+					error('Error occured in the attack loop!', ex)
735
+					break
736
+				else:
737
+					time.sleep(config.throttle.join)
738
+					while len(self.current_channels) >= config.throttle.channels:
739
+						time.sleep(1)
740
+				finally:
741
+					if chan in self.options['channels']:
742
+						self.options['channels'].remove(chan)
743
+			debug('Finished knocking all channels on ' + self.server)
744
+			self.event_disconnect()
745
+		except Exception as ex:
746
+			error('Error occured in the attack loop!', ex)
747
+
748
+	def connect(self):
749
+		try:
750
+			self.create_socket()
751
+			self.sock.connect((self.server, self.options['port']))
752
+			self.register()
753
+		except socket.error:
754
+			#error('Failed to connect to ' + self.server)
755
+			self.event_disconnect()
756
+		else:
757
+			self.listen()
758
+
759
+	def create_socket(self):
760
+		family = socket.AF_INET6 if self.options['ipv6'] else socket.AF_INET
761
+		if config.connection.proxy:
762
+			proxy_server, proxy_port = config.settings.proxy.split(':')
763
+			self.sock = socks.socksocket(family, socket.SOCK_STREAM)
764
+			self.sock.setblocking(0)
765
+			self.sock.setproxy(socks.PROXY_TYPE_SOCKS5, proxy_server, int(proxy_port))
766
+		else:
767
+			self.sock = socket.socket(family, socket.SOCK_STREAM)
768
+		self.sock.settimeout(config.throttle.timeout)
769
+		if config.connection.vhost:
770
+			self.sock.bind((config.connection.vhost, 0))
771
+		if self.options['ssl']:
772
+			self.sock = ssl.wrap_socket(self.sock)
773
+
774
+	def event_connect(self):
775
+		debug('Connected to ' + self.server)
776
+		if self.options['nickserv']:
777
+			self.sendmsg('NickServ', f'IDENTIFY {0} {1}'.format(self.options['nickname'], self.options['nickserv']))
778
+		if self.options['channels']:
779
+			if type(self.options['channels']) == list:
780
+ 				threading.Thread(target=self.attack).start()
781
+			else:
782
+				error('Invalid channel list for ' + self.server)
783
+				self.event_disconnect()
784
+		else:
785
+			self.options['channels'] = list()
786
+			time.sleep(65)
787
+			self.raw('LIST >' + str(config.throttle.users))
788
+
789
+	def event_disconnect(self):
790
+		self.sock.close()
791
+
792
+	def event_end_of_list(self):
793
+		if self.options['channels']:
794
+			debug('Found {0} channels on {1}'.format(len(self.options['channels']), self.server))
795
+			threading.Thread(target=self.attack).start()
796
+		else:
797
+			error('Found zero channels on ' + self.server)
798
+			self.event_disconnect()
799
+
800
+	def event_end_of_names(self, chan):
801
+		self.current_channels.append(chan)
802
+		debug(f'Knocking {chan} channel on {self.server}...')
803
+		try:
804
+			for line in msg_lines:
805
+				if chan in self.bad_channels:
806
+					break
807
+				self.sendmsg(chan, line)
808
+				time.sleep(config.throttle.message)
809
+			if chan in self.nicklist:
810
+				self.nicklist[chan] = ' '.join(self.nicklist[chan])
811
+				if len(self.nicklist[chan]) <= 400:
812
+					self.sendmsg(chan, self.nicklist[chan])
813
+				else:
814
+					while len(self.nicklist[chan]) > 400:
815
+						if chan in self.bad_channels:
816
+							break
817
+						segment = self.nicklist[chan][:400]
818
+						segment = segment[:-len(segment.split()[len(segment.split())-1])]
819
+						self.sendmsg(chan, segment)
820
+						self.nicklist[chan] = self.nicklist[chan][len(segment):]
821
+						time.sleep(config.throttle.message)
822
+			self.part(chan, config.settings.part_msg)
823
+		except Exception as ex:
824
+			error('Error occured in the attack loop!', ex)
825
+		finally:
826
+			if chan in self.current_channels:
827
+				self.current_channels.remove(chan)
828
+			if chan in self.bad_channels:
829
+				self.bad_channels.remove(chan)
830
+			if chan in self.nicklist:
831
+				del self.nicklist[chan]
832
+
833
+	def event_list_channel(self, chan, users):
834
+		self.options['channels'].append(chan)
835
+
836
+	def event_nick_in_use(self):
837
+		self.nickname += '_'
838
+		self.nick(self.nickname)
839
+
840
+	def event_names(self, chan, names):
841
+		if config.settings.mass_hilite:
842
+			if chan not in self.nicklist:
843
+				self.nicklist[chan] = list()
844
+			for name in names:
845
+				if name[:1] in '~!@%&+:':
846
+					name = name[1:]
847
+				if name != self.nickname and name not in self.nicklist[chan]:
848
+					self.nicklist[chan].append(name)
849
+
850
+	def handle_events(self, data):
851
+		args = data.split()
852
+		if data.startswith('ERROR :Closing Link:'):
853
+			if 'Password mismatch' in data:
854
+				error('Network has a password.', self.server)
855
+			raise Exception('Connection has closed.')
856
+		elif args[0] == 'PING' and len(args) == 2:
857
+			self.raw('PONG ' + args[1][1:])
858
+		elif args[1] == '001': # RPL_WELCOME
859
+			self.event_connect()
860
+		elif args[1] == '322' and len(args) >= 5: # RPL_LIST
861
+			chan  = args[3]
862
+			users = args[4]
863
+			self.event_list_channel(chan, users)
864
+		elif args[1] == '323': # RPL_LISTEND
865
+			self.event_end_of_list()
866
+		elif args[1] == '353' and len(args) >= 6: # RPL_NAMREPLY
867
+			chan  = args[4]
868
+			names = ' '.join(args[5:])[2:].split()
869
+			self.event_names(chan, names)
870
+		elif args[1] == '366' and len(args) >= 4: # RPL_ENDOFNAMES
871
+			chan = args[3]
872
+			threading.Thread(target=self.event_end_of_names, args=(chan,)).start()
873
+		elif args[1] == '404' and len(args) >= 4: # ERR_CANNOTSENDTOCHAN
874
+			chan = args[3]
875
+			for item in bad_msgs:
876
+				if item in data:
877
+					error(f'Failed to message {chan} channel on {self.server}', '404: ' + item)
878
+					if chan not in self.bad_channels:
879
+						self.bad_channels.append(chan)
880
+						break
881
+		elif args[1] == '433': # ERR_NICKNAMEINUSE
882
+			self.event_nick_in_use()
883
+		elif args[1] == '464': # ERR_PASSWDMISMATCH
884
+			error('Network has a password.', self.server)
885
+		elif args[1] in bad_numerics and len(args) >= 4:
886
+			chan = args[3]
887
+			if chan not in self.bad_channels:
888
+				self.bad_channels.append(chan)
889
+			error(f'Failed to knock {chan} channel on {self.server}', bad_numerics[args[1]])
890
+
891
+	def join_channel(self, chan):
892
+		self.raw('JOIN ' + chan)
893
+
894
+	def listen(self):
895
+		while True:
896
+			try:
897
+				data = self.sock.recv(1024).decode('utf-8')
898
+				for line in (line for line in data.split('\r\n') if len(line.split()) >= 2):
899
+					self.handle_events(line)
900
+			except (UnicodeDecodeError,UnicodeEncodeError):
901
+				pass
902
+			except Exception as ex:
903
+				#error('Unexpected error occured.', ex)
904
+				break
905
+		self.event_disconnect()
906
+
907
+	def nick(self, nick):
908
+		self.raw('NICK ' + nick)
909
+
910
+	def part(self, chan, msg):
911
+		self.raw(f'PART {chan} :{msg}')
912
+
913
+	def raw(self, msg):
914
+		self.sock.send(bytes(msg + '\r\n', 'utf-8'))
915
+
916
+	def register(self):
917
+		if self.options['password']:
918
+			self.raw('PASS ' + self.options['password'])
919
+		self.raw('USER {0} 0 * :{1}'.format(self.options['username'], self.options['realname']))
920
+		self.raw('NICK ' + self.nickname)
921
+
922
+	def sendmsg(self, target, msg):
923
+		self.raw(f'PRIVMSG {target} :{msg}')
924
+
925
+# Main
926
+print('#'*56)
927
+print('#{0}#'.format(''.center(54)))
928
+print('#{0}#'.format('EFknockr (EFK)'.center(54)))
929
+print('#{0}#'.format('Developed by acidvegas in Python'.center(54)))
930
+print('#{0}#'.format('https://acid.vegas/trollbots'.center(54)))
931
+print('#{0}#'.format(''.center(54)))
932
+print('#'*56)
933
+if config.connection.proxy:
934
+	try:
935
+		import socks
936
+	except ImportError:
937
+		error_exit('Missing PySocks module! (https://pypi.python.org/pypi/PySocks)')
938
+msg_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'msg.txt')
939
+if os.path.isfile(msg_file):
940
+	msg_lines = [line.rstrip() for line in open(msg_file, encoding='utf8', errors='replace').readlines() if line]
941
+	print(msg_lines)
942
+else:
943
+	error_exit('Missing message file!')
944
+del msg_file
945
+debug(f'Loaded {len(config.targets)} targets from config.')
946
+server_list = list(config.targets)
947
+random.shuffle(server_list)
948
+with concurrent.futures.ThreadPoolExecutor(max_workers=config.throttle.threads) as executor:
949
+	checks = {executor.submit(clone(server, config.targets[server]).run): server for server in server_list}
950
+	for future in concurrent.futures.as_completed(checks):
951
+		checks[future]
952
+debug('EFknockr has finished knocking.')
953
diff --git a/efknockr/efknockr/msg.txt b/efknockr/efknockr/msg.txt
954
new file mode 100644
955
index 0000000..43dd4b7
956
--- /dev/null
957
+++ b/efknockr/efknockr/msg.txt
958
@@ -0,0 +1,8 @@
959
+EFKnockr script developed by acidvegas
960
+███████╗███████╗██╗  ██╗
961
+██╔════╝██╔════╝██║ ██╔╝
962
+█████╗  █████╗  █████╔╝
963
+██╔══╝  ██╔══╝  ██╔═██╗
964
+███████╗██║     ██║  ██╗
965
+╚══════╝╚═╝     ╚═╝  ╚═╝
966
+https://acid.vegas/efknockr
967
diff --git a/jupiter/README.md b/jupiter/README.md
968
new file mode 100644
969
index 0000000..767b596
970
--- /dev/null
971
+++ b/jupiter/README.md
972
@@ -0,0 +1,25 @@
973
+###### Requirements
974
+* [Python](https://www.python.org/downloads/) *(**Note:** This script was developed to be used with the latest version of Python.)*
975
+
976
+###### Information
977
+This bot will automatically connect to a random EFNet server and idle in a channel.
978
+
979
+The bot is designed to be very minimal, secure, and trustless by nature.
980
+
981
+This means anyone can run a copy of your script on their server to help build your botnet.
982
+
983
+All commands must be prefixed with @all or the bots nick and will work in PM or the configured channel.
984
+
985
+Nicks added to the MONITOR list will attempt to jupe as the nick becomes available.
986
+
987
+You can use [this](https://github.com/acidvegas/random/blob/master/irc/identd.py) identd script with this.
988
+
989
+###### Commands
990
+| Command | Description |
991
+| --- | --- |
992
+| id | Send bot identity |
993
+| raw \<data> | Send \<data> to server |
994
+| rawd \<data> | Send \<data> to server delayed |
995
+| monitor list | Return MONITOR list |
996
+| monitor reset | Reset MONITOR list |
997
+| monitor \<+/->\<nicks> | Add (+) or Remove (-) \<nicks> from MONITOR list. *(Can be a single nick or comma seperated list)* |
998
diff --git a/jupiter/jupiter/jupiter.py b/jupiter/jupiter/jupiter.py
999
new file mode 100644