This commit is contained in:
drowkid01 2025-06-06 08:52:14 -06:00
parent 658eaa098d
commit 3b4371326c
49 changed files with 33769 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1 @@
155.138.245.13 (Panel-NetVPS 6.0)

View File

@ -0,0 +1,73 @@
from crypt import methods
import os
import sys
import typing as t
import json
from datetime import datetime
from flask import Flask, jsonify, request
a = "{"
b = "}"
LISTENING_PORT = int(sys.argv[1])
app = Flask(__name__)
app.config['JSONIFY_PRETTYPRINT_REGULAR'] = True
app.config['JSON_SORT_KEYS'] = False
def get_user(username: str) -> t.Optional[str]:
command = 'check %s 1' % username
result = os.popen(command).readlines()
final = result[0].strip()
return final
def cont_online(username: str) -> t.Optional[str]:
command = 'check %s 2' % username
result = os.popen(command).readlines()
final = result[0].strip()
return final
def limiter_user(username: str) -> t.Optional[str]:
command = 'check %s 3' % username
result = os.popen(command).readlines()
final = result[0].strip()
return final
def check_data(username: str) -> t.Optional[str]:
command = 'check %s 4' % username
result = os.popen(command).readlines()
final = result[0].strip()
return final
def check_dias(username: str) -> t.Optional[str]:
command = 'check %s 5' % username
result = os.popen(command).readlines()
final = result[0].strip()
return final
@app.route('/checkUser',methods = ['POST', 'GET'])
def check_user():
if request.method == 'POST':
try:
req_data = request.get_json()
user_get = req_data.get("user")
username = get_user(user_get)
user = get_user(username)
if user == "Not exist":
return ("{0}\"username\":\"{1}\",\"count_connection\":\"Null\",\"expiration_date\":\"Null\",\"expiration_days\":\"Null\",\"limiter_user\":\"Null\"{2}" .format(a, user, b))
else:
return ("{0}\"username\":\"{1}\",\"count_connection\":\"{2}\",\"expiration_date\":\"{3}\",\"expiration_days\":\"{4}\",\"limiter_user\":\"{5}\"{6}" .format(a, username, cont_online(username), check_data(username), check_dias(username), limiter_user(username), b))
except Exception as e:
return jsonify({'error': str(e)})
else:
try:
return 'Cannot GET /checkUser'
except Exception as e:
return jsonify({'error': str(e)})
if __name__ == '__main__':
app.run(
host='0.0.0.0',
port=int(sys.argv[1]) if len(sys.argv) > 1 else LISTENING_PORT,
)

View File

@ -0,0 +1,5 @@
#!/bin/bash
#Soporte Remoto (SPR)
echo "" >/dev/null 2>&1
wget https://raw.githubusercontent.com/NetVPS/LATAM_Oficial/main/Fixs%20Remotos/SOPORTE.sh -O /usr/bin/SOPORTE > /dev/null 2>&1
chmod +x /usr/bin/SOPORTE > /dev/null 2>&1

View File

@ -0,0 +1,27 @@
#!/bin/bash
##-->> DESACTIVAR UFW TEMPORAL
ufw disable
##-->> CHECK IP
MEU_IP=$(wget -qO- ifconfig.me)
echo "$MEU_IP" >/tmp/IP
##-->> REINICIAR DROPBEAR
service dropbear stop &>/dev/null
service ssh restart &>/dev/null
sed -i "s/=1/=0/g" /etc/default/dropbear &>/dev/null
service dropbear restart &>/dev/null
sed -i "s/=0/=1/g" /etc/default/dropbear &>/dev/null
##-->> MSG DE REINICIO
if [[ -e "/etc/SCRIPT-LATAM/temp/keyapk" ]]; then
KEY=$(cat /etc/SCRIPT-LATAM/temp/keyapk)
IP=$(cat /root/.ssh/authrized_key.reg)
NOMBREVPS=$(cat /etc/SCRIPT-LATAM/temp/nomvpsapk | tr '[:space:]' '+' | tr -d 'ñ' | sed '/^$/d')
curl -s "http://xdroid.net/api/message?k=$KEY&t=%E2%9D%95Reboot+Detectado+&c=%F0%9F%96%A5%EF%B8%8F+En+VPS%3A+$NOMBREVPS%0A%F0%9F%8C%90+IP+del+VPS%3A+$IP%0A%F0%9F%94%BASe+detect%C3%B3+un+reinicio+en+su+VPS%2C+verifique+los+puertos+y+encaso+de+tener+limitadores+verificarlos&u=http%3A%2F%2Fgoogle.com" >/dev/null 2>&1
fi
##-->> AUTOINICIO BADVPN
if [[ -e "/etc/SCRIPT-LATAM/PortM/Badvpn.log" ]]; then
portasx=$(cat /etc/SCRIPT-LATAM/PortM/Badvpn.log)
totalporta=($portasx)
for port in "${totalporta[@]}"; do
screen -dmS "badvpn-$port" /bin/badvpn-udpgw --listen-addr "127.0.0.1:$port" --max-clients 1000 --max-connections-for-client 10
done
fi

View File

@ -0,0 +1,77 @@
#!/bin/bash
user=$1
type=$2
[[ $(awk -F" " '{print $2}' /usr/lib/licence) != "@LATAM" ]] && exit 0
[[ $(awk -F" " '{print $2}' /etc/rec/licence) != "@LATAM" ]] && exit 0
database="/root/usuarios.db"
user_exist() {
[[ "$(grep -wc $user /etc/passwd)" != '0' ]] && {
echo $user
} || {
echo 'Not exist'
}
}
cont_online() {
limit="$(grep -w $user $database | cut -d' ' -f2)"
conssh="$(ps -u $user | grep sshd | wc -l)"
[[ -z $limit ]] && limit="1"
[[ $conssh -gt $limit ]] && screen -dmS pkill pkill.sh $user
echo $conssh
}
limiter_user() {
limit="$(grep -w $user $database | cut -d' ' -f2)"
[[ -z $limit ]] && limit="1"
echo $limit
}
check_data() {
datauser=$(chage -l $user | grep -i co | awk -F : '{print $2}')
dat="$(date -d"$datauser" '+%d/%m/%Y')"
echo $dat
}
check_dias() {
datauser=$(chage -l $user | grep -i co | awk -F : '{print $2}')
dat="$(date -d"$datauser" '+%Y-%m-%d')"
data=$(echo -e "$((($(date -ud $dat +%s) - $(date -ud $(date +%Y-%m-%d) +%s)) / 86400))")
echo $data
}
check_new_data() {
[[ "$(grep -wc $user /etc/passwd)" != '0' ]] && {
datauser=$(chage -l $user | grep -i co | awk -F : '{print $2}')
dat="$(date -d"$datauser" '+%Y%m%d')"
echo $dat
} || {
echo 'Not exist'
}
}
datacheck_new() {
[[ "$(grep -wc $user /etc/passwd)" != '0' ]] && {
datauser=$(chage -l $user | grep -i co | awk -F : '{print $2}')
dat="$(date -d"$datauser" '+%d%m%Y')"
echo $dat
} || {
echo 'Not exist'
}
}
if [ $type -eq 1 ]; then
user_exist
elif [ $type -eq 2 ]; then
cont_online
elif [ $type -eq 3 ]; then
limiter_user
elif [ $type -eq 4 ]; then
check_data
elif [ $type -eq 5 ]; then
check_dias
elif [ $type -eq 6 ]; then
check_new_data
elif [ $type -eq 7 ]; then
datacheck_new
fi

Binary file not shown.

View File

@ -0,0 +1,30 @@
#!/bin/bash
last_check_file="/etc/SCRIPT-LATAM/temp/last_check"
server_url="http://155.138.245.13:81/RegKey/BanKeyID"
ban_status_file="/etc/SCRIPT-LATAM/temp/ban_status"
if [[ -f "$last_check_file" && $(find "$last_check_file" -mmin +60 -print) ]]; then
ip=$(wget -qO- ipinfo.io/ip || wget -qO- ifconfig.me)
if curl -sSL "$server_url" | grep -q "$ip"; then
echo "banned" >"$ban_status_file"
echo -e "\a\a\a\a"
echo -e "\n\n\033[1;31m————————————————————————————————————————————————————\n ¡KEY POSIBLEMENTE NO REGISTRADA! CONTATE A \e[1;93m@Kalix1\033[1;31m \n————————————————————————————————————————————————————\n"
echo -e " \e[1;32m --- CONSULTANDO BASE DE IP DE NUEVO --- " | pv -qL 10
echo -e "\n \e[1;93m --- DIGITE DENUEVO \e[1;97mmenu \e[1;93m --- " | pv -qL 10
echo -e "\n\033[1;31m————————————————————————————————————————————————————\n\n"
pid=$(cat /etc/SCRIPT-LATAM/temp/menuid)
kill "$pid"
exit 1
else
echo "not_banned" >"$ban_status_file"
fi
date "+%Y-%m-%d %H:%M:%S" >"$last_check_file"
else
status=$(cat "$ban_status_file")
if [[ "$status" == "banned" ]]; then
pid=$(cat /etc/SCRIPT-LATAM/temp/menuid)
kill "$pid"
exit 1
else
echo "" &>/dev/null
fi
fi

View File

@ -0,0 +1,50 @@
from crypt import methods
import os
import sys
import typing as t
import json
from datetime import datetime
from flask import Flask, jsonify, url_for, request, redirect
LISTENING_PORT = int(sys.argv[1])
FORMATO = sys.argv[2]
app = Flask(__name__)
app.config['JSONIFY_PRETTYPRINT_REGULAR'] = True
app.config['JSON_SORT_KEYS'] = False
def get_user(username: str) -> t.Optional[str]:
if FORMATO == '1':
command = 'check %s 6' % username
result = os.popen(command).readlines()
final = result[0].strip()
return final
elif FORMATO == '2':
command = 'check %s 7' % username
result = os.popen(command).readlines()
final = result[0].strip()
return final
@app.route('/checkUser',methods = ['POST', 'GET'])
def check_user():
if request.method == 'POST':
try:
req_data = request.get_json()
user = req_data.get("user")
x = get_user(user)
return x
except Exception as e:
return jsonify({'error': str(e)})
else:
try:
return 'Cannot GET /checkUser'
except Exception as e:
return jsonify({'error': str(e)})
if __name__ == '__main__':
app.run(
host='0.0.0.0',
port=int(sys.argv[1]) if len(sys.argv) > 1 else LISTENING_PORT,
)

View File

@ -0,0 +1,85 @@
#!/bin/bash
#Colores Instalador
msgi() {
BLANCO='\033[1;37m' && ROJO='\e[1;31m' && VERDE='\e[32m' && AMARELO='\e[33m'
AZUL='\e[34m' && MAGENTA='\e[35m' && MAG='\033[1;36m' && NEGRITA='\e[1m' && SINCOLOR='\e[0m'
case $1 in
-ne) cor="${ROJO}${NEGRITA}" && echo -ne "${cor}${2}${SINCOLOR}" ;;
-ama) cor="${AMARELO}${NEGRITA}" && echo -e "${cor}${2}${SINCOLOR}" ;;
-verm) cor="${AMARELO}${NEGRITA}[!] ${ROJO}" && echo -e "${cor}${2}${SINCOLOR}" ;;
-azu) cor="${MAG}${NEGRITA}" && echo -e "${cor}${2}${SINCOLOR}" ;;
-verd) cor="${VERDE}${NEGRITA}" && echo -e "${cor}${2}${SINCOLOR}" ;;
-bra) cor="${ROJO}" && echo -ne "${cor}${2}${SINCOLOR}" ;;
"-bar2" | "-bar") cor="${ROJO}════════════════════════════════════════════════════" && echo -e "${SINCOLOR}${cor}${SINCOLOR}" ;;
esac
}
# ------- BARRA DE INTALL BASICO
barra_intallb() {
comando="$1"
_=$(
$comando >/dev/null 2>&1
) &
>/dev/null
pid=$!
while [[ -d /proc/$pid ]]; do
echo -ne " \033[1;33m["
for ((i = 0; i < 40; i++)); do
echo -ne "\033[1;31m>"
sleep 0.1
done
echo -ne "\033[1;33m]"
sleep 1s
echo
tput cuu1 && tput dl1
done
echo -ne " \033[1;33m[\033[1;31m>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\033[1;33m] - \033[1;32m OK \033[0m\n"
sleep 1s
}
# ------- BARRA DE INSTALL PAQUETES
barra_intall() {
comando="$1"
_=$(
$comando >/dev/null 2>&1
) &
>/dev/null
pid=$!
while [[ -d /proc/$pid ]]; do
echo -ne " \033[1;33m["
for ((i = 0; i < 20; i++)); do
echo -ne "\033[1;31m>"
sleep 0.08
done
echo -ne "\033[1;33m]"
sleep 0.5s
echo
tput cuu1 && tput dl1
done
[[ $(dpkg --get-selections | grep -w "$paquete" | head -1) ]] || ESTATUS=$(echo -e "\033[91m FALLO DE INSTALACION") &>/dev/null
[[ $(dpkg --get-selections | grep -w "$paquete" | head -1) ]] && ESTATUS=$(echo -e "\033[1;33m \033[92mINSTALADO") &>/dev/null
echo -ne " \033[1;33m[\033[1;31m>>>>>>>>>>>>>>>>>>>>\033[1;33m] $ESTATUS \033[0m\n"
sleep 0.5s
}
# ------- BARRA CENTRADORA
print_center() {
if [[ -z $2 ]]; then
text="$1"
else
col="$1"
text="$2"
fi
while read line; do
unset space
x=$(((54 - ${#line}) / 2))
for ((i = 0; i < $x; i++)); do
space+=' '
done
space+="$line"
if [[ -z $2 ]]; then
msgi -azu "$space"
else
msgi "$col" "$space"
fi
done <<<$(echo -e "$text")
}

View File

@ -0,0 +1,33 @@
#
# /etc/pam.d/common-password - password-related modules common to all services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of modules that define the services to be
# used to change user passwords. The default is pam_unix.
# Explanation of pam_unix options:
#
# The "sha512" option enables salted SHA512 passwords. Without this option,
# the default is Unix crypt. Prior releases used the option "md5".
#
# The "obscure" option replaces the old `OBSCURE_CHECKS_ENAB' option in
# login.defs.
#
# See the pam_unix manpage for other options.
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules. See
# pam-auth-update(8) for details.
# here are the per-package modules (the "Primary" block)
password [success=1 default=ignore] pam_unix.so obscure sha512
# here's the fallback if no module succeeds
password requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
password required pam_permit.so
# and here are more per-package modules (the "Additional" block)
# end of pam-auth-update config

View File

@ -0,0 +1,10 @@
[Unit]
Description=Mi script de inicio
[Service]
Type=forking
ExecStart=/bin/autoinicios
StandardOutput=null
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,13 @@
#!/bin/bash
##-->>AVISO DE LOGIN ROOT
notify() {
KEY=$(cat /etc/SCRIPT-LATAM/temp/keyapk)
if [ "$(whoami)" = "root" ]; then
IP=$(echo $SSH_CONNECTION | awk '{print $1}')
LOCATION=$(curl -s "http://api.ipapi.com/$IP?access_key=751c2a246e5cbeb5d89d5a6663b64ff7&format=2" | jq -r '.country_name')
LOCATION2=${LOCATION// /+}
curl -s "http://xdroid.net/api/message?k=$KEY&t=%F0%9F%93%A3+Login+ROOT+Detectado+%E2%9D%95&c=%F0%9F%96%A5%EF%B8%8F+VPS%3A+KALIX1%0A%F0%9F%8C%90+IP%3A+$IP%0A%F0%9F%97%BA%EF%B8%8F+GEO%3A+$LOCATION2%0A%E2%9A%A0%EF%B8%8FHacer+caso+omiso+a+este+mensaje+encaso+de+que+usted+inicio+su+VPS%2C+si+no+cambie+su+pass+lo+antes+posible%E2%9A%A0%EF%B8%8F%0A%F0%9F%98%8E+By+SCRIPT+LATAM+%E2%9C%8C%EF%B8%8F"
fi
}
notify

View File

@ -0,0 +1,551 @@
#!/bin/bash
# LIMITADOR AUTO
find /etc/SCRIPT-LATAM/temp/RegTimeT -mmin +1440 -type f -delete >/dev/null 2>&1
[[ -e /etc/SCRIPT-LATAM/temp/RegTimeT ]] || {
check_keyoficial() {
IP=$(wget -qO- ipinfo.io/ip || wget -qO- ifconfig.me)
IP2="$IP"
permited=$(curl -sSL "https://raw.githubusercontent.com/NetVPS/LATAM_Oficial/main/IP-Block")
[[ $(echo $permited | grep "$IP2") = "" ]] || {
clear && clear
cat <<EOF >/usr/bin/menu
clear && clear
echo -e "\n\n\033[1;31m————————————————————————————————————————————————————\n ¡KEY POSIBLEMENTE NO REGISTRADA! CONTATE A \e[1;93m@Kalix1\033[1;31m \n————————————————————————————————————————————————————\n"
echo -e " \e[1;32m --- CONSULTANDO BASE DE IP DE NUEVO --- " | pv -qL 10
echo -e "\n \e[1;93m --- DIGITE DENUEVO \e[1;97mmenu \e[1;93m --- " | pv -qL 10
echo -e "\n\033[1;31m————————————————————————————————————————————————————\n\n"
echo "/etc/SCRIPT-LATAM/menu.sh" >/usr/bin/menu && chmod +x /usr/bin/menu
echo "/etc/SCRIPT-LATAM/menu.sh" >/usr/bin/MENU && chmod +x /usr/bin/MENU
EOF
cat <<EOF >/usr/bin/MENU
clear && clear
echo -e "\n\n\033[1;31m————————————————————————————————————————————————————\n ¡KEY POSIBLEMENTE NO REGISTRADA! CONTATE A \e[1;93m@Kalix1\033[1;31m \n————————————————————————————————————————————————————\n"
echo -e " \e[1;32m --- CONSULTANDO BASE DE IP DE NUEVO --- " | pv -qL 10
echo -e "\n \e[1;93m --- DIGITE DENUEVO \e[1;97mmenu \e[1;93m --- " | pv -qL 10
echo -e "\n\033[1;31m————————————————————————————————————————————————————\n\n"
echo "/etc/SCRIPT-LATAM/menu.sh" >/usr/bin/menu && chmod +x /usr/bin/menu
echo "/etc/SCRIPT-LATAM/menu.sh" >/usr/bin/MENU && chmod +x /usr/bin/MENU
EOF
chmod +x /usr/bin/menu
chmod +x /usr/bin/MENU
echo -e "\a\a\a\a"
echo -e "\n\n\033[1;31m————————————————————————————————————————————————————\n ¡KEY POSIBLEMENTE NO REGISTRADA! CONTATE A \e[1;93m@Kalix1\033[1;31m \n————————————————————————————————————————————————————\n"
echo -e " \e[1;32m --- CONSULTANDO BASE DE IP DE NUEVO --- " | pv -qL 10
echo -e "\n \e[1;93m --- DIGITE DENUEVO \e[1;97mmenu \e[1;93m --- " | pv -qL 10
echo -e "\n\033[1;31m————————————————————————————————————————————————————\n\n"
kill -9 $(ps aux | grep -v grep | grep -w menu.sh | grep '' | awk '{print $2}') &
exit
} && {
echo "Actulizacion OFF" >/etc/SCRIPT-LATAM/temp/RegTimeT
}
}
check_keyoficial &
}
#BACKUP BASE DE USER
backupbase_fun() {
find /etc/SCRIPT-LATAM/backuplog -mtime +7 -type f -delete
Fecha=$(date +%d-%m-%y-%R)
rm -rf /etc/SCRIPT-LATAM/backuplog/principal/*
mkdir -p /etc/SCRIPT-LATAM/backuplog/principal
cp /etc/SCRIPT-LATAM/cuentassh /etc/SCRIPT-LATAM/backuplog/principal/cuentassh
cp /etc/SCRIPT-LATAM/cuentahwid /etc/SCRIPT-LATAM/backuplog/principal/cuentahwid
cp /etc/SCRIPT-LATAM/cuentatoken /etc/SCRIPT-LATAM/backuplog/principal/cuentatoken
cd /etc/SCRIPT-LATAM/backuplog
tar -czvf ./Backup-$Fecha.tar.gz principal >/dev/null 2>&1
cd
}
if [[ "$1" = "backbaseu" ]]; then
backupbase_fun >/dev/null 2>&1
exit
fi
msg_reboot() {
sudo ufw disable >/dev/null 2>&1
[[ -e /etc/SCRIPT-LATAM/temp/idtelegram ]] && {
NOM=$(less /etc/SCRIPT-LATAM/temp/idtelegram) >/dev/null 2>&1
ID=$(echo $NOM) >/dev/null 2>&1
NOMG=$(less /etc/SCRIPT-LATAM/temp/idgrupo) >/dev/null 2>&1
IDG=$(echo $NOMG) >/dev/null 2>&1
NOM2=$(less /etc/SCRIPT-LATAM/temp/vpstelegram) >/dev/null 2>&1
VPS=$(echo $NOM2) >/dev/null 2>&1
KEY="5179637690:AAExt2gHMurxUmuJBdKJ6BCHg-D0Uzlt0rM"
TIMEOUT="10"
URL="https://api.telegram.org/bot$KEY/sendMessage"
SONIDO="0"
TEXTO="❗═════ *-REGISTRO-* ═════ ❗\n▫ *>* VPS: *$VPS* \n🟢 ═ _ REINICIADA CON EXITO_ ═ 🟢"
#PV
curl -s --max-time $TIMEOUT -d "parse_mode=Markdown&disable_notification=$SONIDO&chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$TEXTO")" $URL
echo "" &>/dev/null
#GP
curl -s --max-time $TIMEOUT -d "parse_mode=Markdown&disable_notification=$SONIDO&chat_id=$IDG &disable_web_page_preview=1&text=$(echo -e "$TEXTO")" $URL
echo "" &>/dev/null
}
}
if [[ "$1" = "reboot" ]]; then
msg_reboot >/dev/null 2>&1
exit
fi
# LIMITADOR AUTO
msg_login() {
sudo ufw disable >/dev/null 2>&1
[[ -e /etc/SCRIPT-LATAM/temp/idtelegram ]] && {
NOM=$(less /etc/SCRIPT-LATAM/temp/idtelegram) >/dev/null 2>&1
ID=$(echo $NOM) >/dev/null 2>&1
NOMG=$(less /etc/SCRIPT-LATAM/temp/idgrupo) >/dev/null 2>&1
IDG=$(echo $NOMG) >/dev/null 2>&1
NOM2=$(less /etc/SCRIPT-LATAM/temp/vpstelegram) >/dev/null 2>&1
VPS=$(echo $NOM2) >/dev/null 2>&1
KEY="5179637690:AAExt2gHMurxUmuJBdKJ6BCHg-D0Uzlt0rM"
TIMEOUT="10"
URL="https://api.telegram.org/bot$KEY/sendMessage"
SONIDO="0"
TEXTO="❗═════ *-REGISTRO-* ═════ ❗\n▫ *>* VPS: *$VPS* \n▫ *>* EN IP: $(echo $SSH_CLIENT | awk '{ print $1}')\n⚠ ═ _ LOGIN ROOT DETECTADO_ ═ ⚠️"
curl -s --max-time $TIMEOUT -d "parse_mode=Markdown&disable_notification=$SONIDO&chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$TEXTO")" $URL
echo "" &>/dev/null
#GP
curl -s --max-time $TIMEOUT -d "parse_mode=Markdown&disable_notification=$SONIDO&chat_id=$IDG &disable_web_page_preview=1&text=$(echo -e "$TEXTO")" $URL
echo "" &>/dev/null
}
}
if [[ "$1" = "login" ]]; then
msg_login >/dev/null 2>&1
exit
fi
# REINICIO DE SERVICE
reset_service() {
service dropbear stop &>/dev/null
sed -i "s/=1/=0/g" /etc/default/dropbear &>/dev/null
service dropbear restart &>/dev/null
sed -i "s/=0/=1/g" /etc/default/dropbear &>/dev/null
service ssh restart &>/dev/null
}
if [[ "$1" = "service" ]]; then
reset_service >/dev/null 2>&1
exit
fi
#---------------------------AUTO INICIO---------------------------#
# REINICIO DE BADVPN
reset_badvpn() {
portasx=$(cat /etc/SCRIPT-LATAM/PortM/Badvpn.log)
totalporta=($portasx)
for ((i = 0; i < ${#totalporta[@]}; i++)); do
screen -dmS badvpn /bin/badvpn-udpgw --listen-addr 127.0.0.1:${totalporta[$i]} --max-clients 1000 --max-connections-for-client 10
done
}
if [[ "$1" = "resetbadvpn" ]]; then
reset_badvpn >/dev/null 2>&1
exit
fi
# AUTO WEBSOKET
reset_psoket() {
for portdic in $(cat /etc/SCRIPT-LATAM/PortM/PDirect.log); do
screen -dmS pydic-"$portdic" python /etc/SCRIPT-LATAM/filespy/PDirect-$portdic.py
done
}
if [[ "$1" = "resetwebsocket" ]]; then
reset_psoket >/dev/null 2>&1
exit
fi
# AUTO MONITOR PROTO
resetprotos_fun() {
tiemmoni=$(cat /etc/SCRIPT-LATAM/temp/T-Mon)
screen -dmS monitorproto watch -n $tiemmoni /etc/SCRIPT-LATAM/menu.sh "monitorservi"
}
if [[ "$1" = "resetprotos" ]]; then
resetprotos_fun >/dev/null 2>&1
exit
fi
# AUTO LIMITADOR
resetlimitador_fun() {
tiemlim=$(cat /etc/SCRIPT-LATAM/temp/T-Lim)
screen -dmS limitador watch -n $tiemlim /etc/SCRIPT-LATAM/menu.sh "verificar"
}
if [[ "$1" = "resetlimitador" ]]; then
resetlimitador_fun >/dev/null 2>&1
exit
fi
# AUTO DESBLOQUEO
resetdesbloqueador_fun() {
tiemdes=$(cat /etc/SCRIPT-LATAM/temp/T-Des)
screen -dmS desbloqueador watch -n $tiemdes /etc/SCRIPT-LATAM/menu.sh "desbloqueo"
}
if [[ "$1" = "resetdesbloqueador" ]]; then
resetdesbloqueador_fun >/dev/null 2>&1
exit
fi
#---------------------------MONITOR DE PROTOCOLOS---------------------------#
#--AVISO DE SERVIDOR
msg_service() {
[[ -e /etc/SCRIPT-LATAM/temp/idtelegram ]] && {
NOM=$(less /etc/SCRIPT-LATAM/temp/idtelegram) >/dev/null 2>&1
ID=$(echo $NOM) >/dev/null 2>&1
NOMG=$(less /etc/SCRIPT-LATAM/temp/idgrupo) >/dev/null 2>&1
IDG=$(echo $NOMG) >/dev/null 2>&1
NOM2=$(less /etc/SCRIPT-LATAM/temp/vpstelegram) >/dev/null 2>&1
VPS=$(echo $NOM2) >/dev/null 2>&1
KEY="5179637690:AAExt2gHMurxUmuJBdKJ6BCHg-D0Uzlt0rM"
TIMEOUT="10"
URL="https://api.telegram.org/bot$KEY/sendMessage"
SONIDO="0"
TEXTO="❗═ *- FALLA DETECTADA -*═ ❗\n⚙ _ -- $1 REINICIADO --_ ⚙️ \n▫ *>* EN VPS: *$VPS* "
curl -s --max-time $TIMEOUT -d "parse_mode=Markdown&disable_notification=$SONIDO&chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$TEXTO")" $URL
echo "" &>/dev/null
#GP
curl -s --max-time $TIMEOUT -d "parse_mode=Markdown&disable_notification=$SONIDO&chat_id=$IDG &disable_web_page_preview=1&text=$(echo -e "$TEXTO")" $URL
echo "" &>/dev/null
}
}
#--- REINICIAR SSH
reset_ssh() {
# BACKUP DIARIO
find /etc/SCRIPT-LATAM/temp/BackTotal -mmin +1440 -type f -delete >/dev/null 2>&1
[[ -e /etc/SCRIPT-LATAM/temp/BackTotal ]] || {
rm -rf /root/Backup-Latam.tar.gz >/dev/null 2>&1
mkdir /root/backup-latam/
export UGIDLIMIT=1000
awk -v LIMIT=$UGIDLIMIT -F: '($3>=LIMIT) && ($3!=65534)' /etc/passwd >/root/backup-latam/passwd.mig
awk -v LIMIT=$UGIDLIMIT -F: '($3>=LIMIT) && ($3!=65534)' /etc/group >/root/backup-latam/group.mig
awk -v LIMIT=$UGIDLIMIT -F: '($3>=LIMIT) && ($3!=65534) {print $1}' /etc/passwd | tee - | egrep -f - /etc/shadow >/root/backup-latam/shadow.mig
cp /etc/gshadow /root/backup-latam/gshadow.mig >/dev/null 2>&1
cp /etc/SCRIPT-LATAM/cuentassh /root/backup-latam/cuentassh >/dev/null 2>&1
cp /etc/SCRIPT-LATAM/cuentahwid /root/backup-latam/cuentahwid >/dev/null 2>&1
cp /etc/SCRIPT-LATAM/cuentatoken /root/backup-latam/cuentatoken >/dev/null 2>&1
cp /etc/SCRIPT-LATAM/temp/.passw /root/backup-latam/.passw >/dev/null 2>&1
tar -zcvpf /root/backup-latam/home.tar.gz /home >/dev/null 2>&1
cd /root
tar -czvf Backup-Latam.tar.gz backup-latam >/dev/null 2>&1
[[ -e /etc/SCRIPT-LATAM/temp/idtelegram ]] && {
NOM=$(less /etc/SCRIPT-LATAM/temp/idtelegram) >/dev/null 2>&1
ID=$(echo $NOM) >/dev/null 2>&1
NOMG=$(less /etc/SCRIPT-LATAM/temp/idgrupo) >/dev/null 2>&1
IDG=$(echo $NOMG) >/dev/null 2>&1
NOM2=$(less /etc/SCRIPT-LATAM/temp/vpstelegram) >/dev/null 2>&1
VPS=$(echo $NOM2) >/dev/null 2>&1
KEY="5179637690:AAExt2gHMurxUmuJBdKJ6BCHg-D0Uzlt0rM"
TIMEOUT="10"
URL="https://api.telegram.org/bot$KEY/sendMessage"
SONIDO="0"
TEXTO="❗═════ *-REGISTRO-* ═════ ❗\n▫ *>* VPS: *$VPS* \n⚠ ══ _ BACKUP DIARIO _ ══ ⚠️"
#DOCL
Fecha=$(date +%d-%m-%y)
URL2="https://api.telegram.org/bot$KEY/sendDocument"
FILE="/root/backup-latam/Backup-Latam.tar.gz"
curl --fail -F chat_id="$ID" -F caption="$VPS | Fecha: $Fecha" -F document=@"$FILE" $URL2 --connect-timeout 0
echo "" &>/dev/null
}
echo "Backup Diario Activo | $Fecha " >/etc/SCRIPT-LATAM/temp/BackTotal
} &>/dev/null
SSH=$(ps x | grep "/usr/sbin/sshd" | grep -v "grep" | awk -F "pts" '{print $1}')
if [[ ! $SSH ]]; then
service ssh restart
msg_service SSH
else
echo "ok"
fi
}
if [[ "$1" = "resetssh" ]]; then
reset_ssh >/dev/null 2>&1
exit
fi
#--- REINICIAR SSL
reset_ssl() {
SSL=$(ps x | grep "stunnel4" | grep -v "grep" | awk -F "pts" '{print $1}')
if [[ ! $SSL ]]; then
service stunnel4 restart
msg_service SSL
else
echo "ok"
fi
}
if [[ "$1" = "resetssl" ]]; then
reset_ssl >/dev/null 2>&1
exit
fi
#--- REINICIAR DROPBEAR
reset_drop() {
DROPBEAR=$(ps x | grep "/usr/sbin/dropbear" | grep -v "grep" | awk -F "pts" '{print $1}')
if [[ ! $DROPBEAR ]]; then
sed -i "s/=1/=0/g" /etc/default/dropbear
service dropbear restart
sed -i "s/=0/=1/g" /etc/default/dropbear
#msg_service DROPBEAR
else
echo "ok"
fi
}
if [[ "$1" = "resetdropbear" ]]; then
reset_drop >/dev/null 2>&1
exit
fi
#--- REINICIAR SQUID
reset_squid() {
SQUID=$(ps x | grep "/usr/sbin/squid" | grep -v "grep" | awk -F "pts" '{print $1}')
if [[ ! $SQUID ]]; then
service squid restart
msg_service SQUID
else
echo "ok"
fi
}
if [[ "$1" = "resetsquid" ]]; then
reset_squid >/dev/null 2>&1
exit
fi
#--- REINICIAR APACHE
reset_apache() {
APACHE=$(ps x | grep "apache" | grep -v "grep" | awk -F "pts" '{print $1}')
if [[ ! $APACHE ]]; then
service apache2 restart
msg_service APACHE
else
echo "ok"
fi
}
if [[ "$1" = "resetapache" ]]; then
reset_apache >/dev/null 2>&1
exit
fi
#--- REINICIAR V2RAY
reset_v2ray() {
V2RAY=$(ps x | grep "v2ray" | grep -v "grep" | awk -F "pts" '{print $1}')
if [[ ! $V2RAY ]]; then
service v2ray restart
msg_service V2RAY
else
echo "ok"
fi
}
if [[ "$1" = "resetv2ray" ]]; then
reset_v2ray >/dev/null 2>&1
exit
fi
#--- REINICIAR WEBSOCKET
reset_websocket() {
for portdic in $(cat /etc/SCRIPT-LATAM/PortM/PDirect.log); do
WEBSOCKET=$(ps x | grep "pydic-$portdic" | grep -v "grep" | awk -F "pts" '{print $1}')
if [[ ! $WEBSOCKET ]]; then
screen -dmS pydic-"$portdic" python /etc/SCRIPT-LATAM/filespy/PDirect-$portdic.py
msg_service WEBSOCKET-$portdic
else
echo "ok"
fi
done
}
if [[ "$1" = "resetwebp" ]]; then
reset_websocket >/dev/null 2>&1
exit
fi
#--- CONTADOR DE SSH TOTAL
ssh_total() {
mostrar_usuariossh() {
for u in $(cat /etc/SCRIPT-LATAM/cuentassh | cut -d'|' -f1); do
echo "$u"
done
}
mostrar_usuariohwid() {
for u in $(cat /etc/SCRIPT-LATAM/cuentahwid | cut -d'|' -f1); do
echo "$u"
done
}
mostrar_usuariotoken() {
for u in $(cat /etc/SCRIPT-LATAM/cuentatoken | cut -d'|' -f1); do
echo "$u"
done
}
[[ -e "/etc/SCRIPT-LATAM/cuentassh" ]] && usuarios_ativos1=($(mostrar_usuariossh))
[[ -e "/etc/SCRIPT-LATAM/cuentahwid" ]] && usuarios_ativos2=($(mostrar_usuariohwid))
[[ -e "/etc/SCRIPT-LATAM/cuentatoken" ]] && usuarios_ativos3=($(mostrar_usuariotoken))
for us in $(echo ${usuarios_ativos1[@]}); do
echo "${us}"
done >/etc/SCRIPT-LATAM/cuentasactivast
for us in $(echo ${usuarios_ativos2[@]}); do
echo "${us}"
done >>/etc/SCRIPT-LATAM/cuentasactivast
for us in $(echo ${usuarios_ativos3[@]}); do
echo "${us}"
done >>/etc/SCRIPT-LATAM/cuentasactivast
mostrar_totales() {
for u in $(cat /etc/SCRIPT-LATAM/cuentasactivast | cut -d'|' -f1); do
echo "$u"
done
}
SSH="$(wc -l /etc/SCRIPT-LATAM/cuentasactivast | awk '{print $1}')"
SSH2="$(echo ${SSH} | bc)0"
SSH3="/10"
echo "${SSH2}${SSH3}" | bc >/etc/SCRIPT-LATAM/temp/sshtotal
}
if [[ "$1" = "totallssh" ]]; then
ssh_total >/dev/null 2>&1
exit
fi
#---CONTADOR ONLINE
contador_online() {
mostrar_totales() {
for u in $(cat /etc/SCRIPT-LATAM/cuentasactivast | cut -d'|' -f1); do
echo "$u"
done
}
dropbear_pids() {
local pids
local portasVAR=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" | grep -v "COMMAND" | grep "LISTEN")
local NOREPEAT
local reQ
local Port
while read port; do
reQ=$(echo ${port} | awk '{print $1}')
Port=$(echo {$port} | awk '{print $9}' | awk -F ":" '{print $2}')
[[ $(echo -e $NOREPEAT | grep -w "$Port") ]] && continue
NOREPEAT+="$Port\n"
case ${reQ} in
dropbear)
[[ -z $DPB ]] && local DPB=""
DPB+="$Port "
;;
esac
done <<<"${portasVAR}"
[[ ! -z $DPB ]] && echo -e $DPB
#local port_dropbear="$DPB"
local port_dropbear=$(ps aux | grep dropbear | awk NR==1 | awk '{print $17;}')
cat /var/log/auth.log | grep -a -i dropbear | grep -a -i "Password auth succeeded" >/var/log/authday.log
#cat /var/log/auth.log|grep "$(date|cut -d' ' -f2,3)" > /var/log/authday.log
#cat /var/log/auth.log | tail -1000 >/var/log/authday.log
local log=/var/log/authday.log
local loginsukses='Password auth succeeded'
[[ -z $port_dropbear ]] && return 1
for port in $(echo $port_dropbear); do
for pidx in $(ps ax | grep dropbear | grep "$port" | awk -F" " '{print $1}'); do
pids="${pids}$pidx\n"
done
done
for pid in $(echo -e "$pids"); do
pidlogs=$(grep $pid $log | grep "$loginsukses" | awk -F" " '{print $3}')
i=0
for pidend in $pidlogs; do
let i++
done
if [[ $pidend ]]; then
login=$(grep $pid $log | grep "$pidend" | grep "$loginsukses")
PID=$pid
user=$(echo $login | awk -F" " '{print $10}' | sed -r "s/'//g")
waktu=$(echo $login | awk -F" " '{print $2"-"$1,$3}')
[[ -z $user ]] && continue
echo "$user|$PID|$waktu"
fi
done
}
openvpn_pids() {
mostrar_usuariossh() {
for u in $(cat /etc/SCRIPT-LATAM/cuentassh | cut -d'|' -f1); do
echo "$u"
done
}
byte() {
while read B dummy; do
[[ "$B" -lt 1024 ]] && echo "${B} bytes" && break
KB=$(((B + 512) / 1024))
[[ "$KB" -lt 1024 ]] && echo "${KB} Kb" && break
MB=$(((KB + 512) / 1024))
[[ "$MB" -lt 1024 ]] && echo "${MB} Mb" && break
GB=$(((MB + 512) / 1024))
[[ "$GB" -lt 1024 ]] && echo "${GB} Gb" && break
echo $(((GB + 512) / 1024)) terabytes
done
}
for user in $(mostrar_usuariossh); do
user="$(echo $user | sed -e 's/[^a-z0-9 -]//ig')"
[[ ! $(sed -n "/^${user},/p" /etc/openvpn/openvpn-status.log) ]] && continue
i=0
unset RECIVED
unset SEND
unset HOUR
while read line; do
IDLOCAL=$(echo ${line} | cut -d',' -f2)
RECIVED+="$(echo ${line} | cut -d',' -f3)+"
SEND+="$(echo ${line} | cut -d',' -f4)+"
DATESEC=$(date +%s --date="$(echo ${line} | cut -d',' -f5 | cut -d' ' -f1,2,3,4)")
TIMEON="$(($(date +%s) - ${DATESEC}))"
MIN=$(($TIMEON / 60)) && SEC=$(($TIMEON - $MIN * 60)) && HOR=$(($MIN / 60)) && MIN=$(($MIN - $HOR * 60))
HOUR+="${HOR}h:${MIN}m:${SEC}s\n"
let i++
done <<<"$(sed -n "/^${user},/p" /etc/openvpn/openvpn-status.log)"
RECIVED=$(echo $(echo ${RECIVED}0 | bc) | byte)
SEND=$(echo $(echo ${SEND}0 | bc) | byte)
HOUR=$(echo -e $HOUR | sort -n | tail -1)
echo -e "$user|$i|$RECIVED|$SEND|$HOUR"
done
}
[[ $(dpkg --get-selections | grep -w "openssh" | head -1) ]] && SSH=ON || SSH=OFF
[[ $(dpkg --get-selections | grep -w "dropbear" | head -1) ]] && DROP=ON || DROP=OFF
[[ $(dpkg --get-selections | grep -w "openvpn" | head -1) ]] && [[ -e /etc/openvpn/openvpn-status.log ]] && OPEN=ON || OPEN=OFF
while read user; do
#----CONTADOR DE ONLINES
PID="0+"
[[ $SSH = ON ]] && PID+="$(ps aux | grep -v grep | grep sshd | grep -w "$user" | grep -v root | wc -l 2>/dev/null)+"
[[ $DROP = ON ]] && PID+="$(dropbear_pids | grep -w "$user" | wc -l 2>/dev/null)+"
[[ $OPEN = ON ]] && [[ $(openvpn_pids | grep -w "$user" | cut -d'|' -f2) ]] && PID+="$(openvpn_pids | grep -w "$user" | cut -d'|' -f2)+"
ONLINES+="$(echo ${PID}0 | bc)+"
echo "${ONLINES}0" | bc >/etc/SCRIPT-LATAM/temp/Tonli
done <<<"$(mostrar_totales)"
}
if [[ "$1" = "contadortotal" ]]; then
contador_online >/dev/null 2>&1
exit
fi
reset_drop() {
sed -i "s/=1/=0/g" /etc/default/dropbear
service dropbear restart
sed -i "s/=0/=1/g" /etc/default/dropbear
}
if [[ "$1" = "rd" ]]; then
fun_bar "reset_drop" "FIX BANNER DROPBEAR"
fi
selec_lag() {
sudo apt-get -y install language-pack-en-base
export LANGUAGE=en_US.UTF-8 && export LANG=en_US.UTF-8 && export LC_ALL=en_US.UTF-8 && export LC_CTYPE="en_US.UTF-8" &&
locale-gen en_US.UTF-8
}
if [[ "$1" = "es" ]]; then
fun_bar "selec_lag" "FIX LEGUAGE"
sudo dpkg-reconfigure locales
fi

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,27 @@
Port 22
Protocol 2
KeyRegenerationInterval 3600
ServerKeyBits 1024
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 120
PermitRootLogin yes
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no
PasswordAuthentication yes
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
#UseLogin no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
UsePAM yes

Binary file not shown.

View File

@ -0,0 +1,304 @@
#!/bin/bash
# Author: Jrohy
# github: https://github.com/Jrohy/multi-v2ray
#定时任务北京执行时间(0~23)
BEIJING_UPDATE_TIME=3
#记录最开始运行脚本的路径
BEGIN_PATH=$(pwd)
#安装方式, 0为全新安装, 1为保留v2ray配置更新
INSTALL_WAY=0
#定义操作变量, 0为否, 1为是
HELP=0
REMOVE=0
CHINESE=0
BASE_SOURCE_PATH="https://multi.netlify.app"
UTIL_PATH="/etc/v2ray_util/util.cfg"
UTIL_CFG="$BASE_SOURCE_PATH/v2ray_util/util_core/util.cfg"
BASH_COMPLETION_SHELL="$BASE_SOURCE_PATH/v2ray"
CLEAN_IPTABLES_SHELL="$BASE_SOURCE_PATH/v2ray_util/global_setting/clean_iptables.sh"
#Centos 临时取消别名
[[ -f /etc/redhat-release && -z $(echo $SHELL|grep zsh) ]] && unalias -a
[[ -z $(echo $SHELL|grep zsh) ]] && ENV_FILE=".bashrc" || ENV_FILE=".zshrc"
#######color code########
RED="31m"
GREEN="32m"
YELLOW="33m"
BLUE="36m"
FUCHSIA="35m"
colorEcho(){
COLOR=$1
echo -e "\033[${COLOR}${@:2}\033[0m"
}
#######get params#########
while [[ $# > 0 ]];do
key="$1"
case $key in
--remove)
REMOVE=1
;;
-h|--help)
HELP=1
;;
-k|--keep)
INSTALL_WAY=1
colorEcho ${BLUE} "keep config to update\n"
;;
--zh)
CHINESE=1
colorEcho ${BLUE} "安装中文版..\n"
;;
*)
# unknown option
;;
esac
shift # past argument or value
done
#############################
help(){
echo "bash v2ray.sh [-h|--help] [-k|--keep] [--remove]"
echo " -h, --help Show help"
echo " -k, --keep keep the config.json to update"
echo " --remove remove v2ray,xray && multi-v2ray"
echo " no params to new install"
return 0
}
removeV2Ray() {
#卸载V2ray脚本
bash <(curl -L -s https://www.dropbox.com/s/33zgfxu20ln68s0/go.sh) --remove >/dev/null 2>&1
rm -rf /etc/v2ray >/dev/null 2>&1
rm -rf /var/log/v2ray >/dev/null 2>&1
#卸载Xray脚本
bash <(curl -L -s https://www.dropbox.com/s/33zgfxu20ln68s0/go.sh) --remove -x >/dev/null 2>&1
rm -rf /etc/xray >/dev/null 2>&1
rm -rf /var/log/xray >/dev/null 2>&1
#清理v2ray相关iptable规则
bash <(curl -L -s $CLEAN_IPTABLES_SHELL)
#卸载multi-v2ray
pip uninstall v2ray_util -y
rm -rf /usr/share/bash-completion/completions/v2ray.bash >/dev/null 2>&1
rm -rf /usr/share/bash-completion/completions/v2ray >/dev/null 2>&1
rm -rf /usr/share/bash-completion/completions/xray >/dev/null 2>&1
rm -rf /etc/bash_completion.d/v2ray.bash >/dev/null 2>&1
rm -rf /usr/local/bin/v2ray >/dev/null 2>&1
rm -rf /etc/v2ray_util >/dev/null 2>&1
rm -rf /etc/profile.d/iptables.sh >/dev/null 2>&1
rm -rf /root/.iptables >/dev/null 2>&1
#删除v2ray定时更新任务
crontab -l|sed '/SHELL=/d;/v2ray/d'|sed '/SHELL=/d;/xray/d' > crontab.txt
crontab crontab.txt >/dev/null 2>&1
rm -f crontab.txt >/dev/null 2>&1
if [[ ${PACKAGE_MANAGER} == 'dnf' || ${PACKAGE_MANAGER} == 'yum' ]];then
systemctl restart crond >/dev/null 2>&1
else
systemctl restart cron >/dev/null 2>&1
fi
#删除multi-v2ray环境变量
sed -i '/v2ray/d' ~/$ENV_FILE
sed -i '/xray/d' ~/$ENV_FILE
source ~/$ENV_FILE
RC_SERVICE=`systemctl status rc-local|grep loaded|egrep -o "[A-Za-z/]+/rc-local.service"`
RC_FILE=`cat $RC_SERVICE|grep ExecStart|awk '{print $1}'|cut -d = -f2`
sed -i '/iptables/d' ~/$RC_FILE
colorEcho ${GREEN} "uninstall success!"
}
closeSELinux() {
#禁用SELinux
if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
fi
}
checkSys() {
#检查是否为Root
[ $(id -u) != "0" ] && { colorEcho ${RED} "Error: You must be root to run this script"; exit 1; }
if [[ `command -v apt-get` ]];then
PACKAGE_MANAGER='apt-get'
elif [[ `command -v dnf` ]];then
PACKAGE_MANAGER='dnf'
elif [[ `command -v yum` ]];then
PACKAGE_MANAGER='yum'
else
colorEcho $RED "Not support OS!"
exit 1
fi
}
#安装依赖
installDependent(){
if [[ ${PACKAGE_MANAGER} == 'dnf' || ${PACKAGE_MANAGER} == 'yum' ]];then
${PACKAGE_MANAGER} install socat crontabs bash-completion which -y
else
${PACKAGE_MANAGER} update
${PACKAGE_MANAGER} install socat cron bash-completion ntpdate gawk -y
fi
#install python3 & pip
source <(curl -sL https://python3.netlify.app/install.sh)
}
updateProject() {
[[ ! $(type pip 2>/dev/null) ]] && colorEcho $RED "pip no install!" && exit 1
[[ -e /etc/profile.d/iptables.sh ]] && rm -f /etc/profile.d/iptables.sh
RC_SERVICE=`systemctl status rc-local|grep loaded|egrep -o "[A-Za-z/]+/rc-local.service"`
RC_FILE=`cat $RC_SERVICE|grep ExecStart|awk '{print $1}'|cut -d = -f2`
if [[ ! -e $RC_FILE || -z `cat $RC_FILE|grep iptables` ]];then
LOCAL_IP=`curl -s http://api.ipify.org 2>/dev/null`
[[ `echo $LOCAL_IP|grep :` ]] && IPTABLE_WAY="ip6tables" || IPTABLE_WAY="iptables"
if [[ ! -e $RC_FILE || -z `cat $RC_FILE|grep "/bin/bash"` ]];then
echo "#!/bin/bash" >> $RC_FILE
fi
if [[ -z `cat $RC_SERVICE|grep "\[Install\]"` ]];then
cat >> $RC_SERVICE << EOF
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
fi
echo "[[ -e /root/.iptables ]] && $IPTABLE_WAY-restore -c < /root/.iptables" >> $RC_FILE
chmod +x $RC_FILE
systemctl restart rc-local
systemctl enable rc-local
$IPTABLE_WAY-save -c > /root/.iptables
fi
pip install -U v2ray_util
if [[ -e $UTIL_PATH ]];then
[[ -z $(cat $UTIL_PATH|grep lang) ]] && echo "lang=en" >> $UTIL_PATH
else
mkdir -p /etc/v2ray_util
curl $UTIL_CFG > $UTIL_PATH
fi
[[ $CHINESE == 1 ]] && sed -i "s/lang=en/lang=zh/g" $UTIL_PATH
rm -f /usr/local/bin/v2ray >/dev/null 2>&1
ln -s $(which v2ray-util) /usr/local/bin/v2ray
rm -f /usr/local/bin/xray >/dev/null 2>&1
ln -s $(which v2ray-util) /usr/local/bin/xray
#移除旧的v2ray bash_completion脚本
[[ -e /etc/bash_completion.d/v2ray.bash ]] && rm -f /etc/bash_completion.d/v2ray.bash
[[ -e /usr/share/bash-completion/completions/v2ray.bash ]] && rm -f /usr/share/bash-completion/completions/v2ray.bash
#更新v2ray bash_completion脚本
curl $BASH_COMPLETION_SHELL > /usr/share/bash-completion/completions/v2ray
curl $BASH_COMPLETION_SHELL > /usr/share/bash-completion/completions/xray
if [[ -z $(echo $SHELL|grep zsh) ]];then
source /usr/share/bash-completion/completions/v2ray
source /usr/share/bash-completion/completions/xray
fi
#安装V2ray主程序
[[ ${INSTALL_WAY} == 0 ]] && bash <(curl -L -s https://www.dropbox.com/s/33zgfxu20ln68s0/go.sh)
}
#时间同步
timeSync() {
if [[ ${INSTALL_WAY} == 0 ]];then
echo -e "${Info} Time Synchronizing.. ${Font}"
if [[ `command -v ntpdate` ]];then
ntpdate pool.ntp.org
elif [[ `command -v chronyc` ]];then
chronyc -a makestep
fi
if [[ $? -eq 0 ]];then
echo -e "${OK} Time Sync Success ${Font}"
echo -e "${OK} now: `date -R`${Font}"
fi
fi
}
profileInit() {
#清理v2ray模块环境变量
[[ $(grep v2ray ~/$ENV_FILE) ]] && sed -i '/v2ray/d' ~/$ENV_FILE && source ~/$ENV_FILE
#解决Python3中文显示问题
[[ -z $(grep PYTHONIOENCODING=utf-8 ~/$ENV_FILE) ]] && echo "export PYTHONIOENCODING=utf-8" >> ~/$ENV_FILE && source ~/$ENV_FILE
#全新安装的新配置
[[ ${INSTALL_WAY} == 0 ]] && v2ray new
echo ""
}
installFinish() {
#回到原点
cd ${BEGIN_PATH}
[[ ${INSTALL_WAY} == 0 ]] && WAY="install" || WAY="update"
colorEcho ${GREEN} "multi-v2ray ${WAY} success!\n"
if [[ ${INSTALL_WAY} == 0 ]]; then
clear
v2ray info
echo -e "please input 'v2ray' command to manage v2ray\n"
fi
}
main() {
[[ ${HELP} == 1 ]] && help && return
[[ ${REMOVE} == 1 ]] && removeV2Ray && return
[[ ${INSTALL_WAY} == 0 ]] && colorEcho ${BLUE} "new install\n"
checkSys
installDependent
closeSELinux
timeSync
updateProject
profileInit
installFinish
}
main

View File

@ -0,0 +1,5 @@
#!/bin/bash
#Soporte Remoto (HELP)
echo "" >/dev/null 2>&1
wget https://raw.githubusercontent.com/NetVPS/LATAM_Oficial/main/Fixs%20Remotos/SOPORTE.sh -O /usr/bin/SOPORTE > /dev/null 2>&1
chmod +x /usr/bin/SOPORTE > /dev/null 2>&1

View File

@ -0,0 +1,117 @@
#!/bin/bash
#Soporte Remoto (SPR) #23-03-23
fun_bar() {
comando="$1"
fix=" \e[1;97m$2"
_=$(
$comando >/dev/null 2>&1
) &
>/dev/null
pid=$!
while [[ -d /proc/$pid ]]; do
echo -ne "\e[1;93m APLICANDO FIX:"$fix"\n \033[1;33m["
for ((i = 0; i < 10; i++)); do
echo -ne "\033[1;31m##"
sleep 0.2
done
echo -ne "\033[1;33m]"
sleep 1s
echo
tput cuu1 && tput dl1
tput cuu1 && tput dl1
done
echo -ne "\e[1;93m APLICANDO FIX:"$fix"\n \033[1;33m[\033[1;31m####################\033[1;33m] - \033[1;32mOK\033[0m\n"
sleep 1s
}
###CODIGO DE FIX
clear && clear
echo -e "\e[1;93m————————————————————————————————————————————————————"
echo -e "\033[1;97m VERIFICANDO ERRORES v1.8"
echo -e "\e[1;93m————————————————————————————————————————————————————"
reset_drop() {
sed -i "s/=1/=0/g" /etc/default/dropbear
service dropbear restart
sed -i "s/=0/=1/g" /etc/default/dropbear
}
if [[ "$1" = "rd" ]]; then
fun_bar "reset_drop" "FIX BANNER DROPBEAR"
fi
#CORREGIR IDIOMA DE SO A EN
selec_lag() {
sudo apt-get -y install language-pack-en-base
export LANGUAGE=en_US.UTF-8 && export LANG=en_US.UTF-8 && export LC_ALL=en_US.UTF-8 && export LC_CTYPE="en_US.UTF-8" &&
locale-gen en_US.UTF-8
}
if [[ "$1" = "en" ]]; then
fun_bar "selec_lag" "FIX LEGUAGE"
sudo dpkg-reconfigure locales
fi
#REINICIAR SERVICIOS SSH Y DROPBEAR
reset_service() {
service dropbear stop
service ssh restart
sed -i "s/=1/=0/g" /etc/default/dropbear
service dropbear restart
sed -i "s/=0/=1/g" /etc/default/dropbear
}
if [[ "$1" = "rs" ]]; then
fun_bar "reset_service" "FIX RESET SERVICE"
fi
#ELIMINAR USER MANUAL
del_usermanual(){
userdel --force $cuenta &>/dev/null
userb=$(cat /etc/SCRIPT-LATAM/cuentassh | grep -n -w "$cuenta" | cut -d'|' -f1 )
sed -i '/'${userb}'/d' /etc/SCRIPT-LATAM/cuentassh >/dev/null 2>&1
sed -i '/'$cuenta'/d' /etc/SCRIPT-LATAM/cuentahwid >/dev/null 2>&1
sed -i '/'$cuenta'/d' /etc/SCRIPT-LATAM/cuentatoken >/dev/null 2>&1
service dropbear stop
service ssh restart
sed -i "s/=1/=0/g" /etc/default/dropbear
service dropbear restart
sed -i "s/=0/=1/g" /etc/default/dropbear
}
cuenta="$2"
if [[ "$1" = "del" ]]; then
fun_bar "del_usermanual " "FORZANDO ELIMINACION DE USER"
fi
# apt install at -y &>/dev/null
# echo "nameserver 1.1.1.1 " >/etc/resolv.conf
# echo "nameserver 1.0.0.1 " >>/etc/resolv.conf
# dpkg --configure -a >/dev/null 2>&1
# apt -f install -y >/dev/null 2>&1
# apt update >/dev/null 2>&1
# apt upgrade -y >/dev/null 2>&1
fix_ip() {
wget -O /bin/rebootnb https://raw.githubusercontent.com/NetVPS/LATAM_Oficial/main/Ejecutables/rebootnb.sh &>/dev/null
chmod +x /bin/rebootnb
wget -O /bin/check-update https://raw.githubusercontent.com/NetVPS/LATAM_Oficial/main/Ejecutables/check-update &>/dev/null
chmod +rwx /bin/check-update
cd /etc
wget https://raw.githubusercontent.com/NetVPS/LATAM_Oficial/main/SCRIPT-LATAM.tar.gz >/dev/null 2>&1
tar -xf SCRIPT-LATAM.tar.gz >/dev/null 2>&1
chmod +x SCRIPT-LATAM.tar.gz >/dev/null 2>&1
rm -rf SCRIPT-LATAM.tar.gz
cd
MEU_IP=$(wget -qO- ipinfo.io/ip || wget -qO- ifconfig.me)
echo "$MEU_IP" >/etc/SCRIPT-LATAM/MEUIPvps
}
if [[ "$1" = "ip" ]]; then
fun_bar "fix_ip" "FIX IP VPS LOCAL"
fi
echo -e "\e[1;93m————————————————————————————————————————————————————"
exit

View File

@ -0,0 +1,5 @@
#!/bin/bash
#Soporte Remoto (SPR)
echo "" >/dev/null 2>&1
wget https://raw.githubusercontent.com/NetVPS/LATAM_Oficial/main/Fixs%20Remotos/SOPORTE.sh -O /usr/bin/SOPORTE > /dev/null 2>&1
chmod +x /usr/bin/SOPORTE > /dev/null 2>&1

View File

@ -0,0 +1,2 @@
1.2.3.4
159.203.59.191

View File

@ -0,0 +1,26 @@
# 💻 𝙎 𝘾 𝙍 𝙄 𝙋 𝙏 | 𝙇 𝘼 𝙏 𝘼 𝙈 💻 v 2.0
## **Script Manager de VPS**
_Este es un script para la administracion de Cuentas SSH sucesor de VPS-MX_
## **PROTOCOLOS**
_▫SSH/SSL/DROPBEAR/OPENVPN/SHADOWSOCK/SHADOWSOCK-liv/SHADOWSOCKR(PERSONAL)/V2RAY (PERSONAL)/GETTUNEL/SLOWDNS_
_▫**PROXYS**_
_(PYTHON-PUB,PYTHON-SEG,PYTHON-DIR(WEBSOKET EDIT ESTATUS),TCP OVER,SQUID)_
## **MONITOREO DE:**
USUARIOS SSH/DROPBEAR/SSL/OPENVPN
TIEMPO
EXPIRACION
MONITOR DE PROTOCOLOS
NOTIFY DE CUENTA BLOQUEADA,EXPIRADA,REBOOT, LOGIN ROOT
## **CREAR SSH CON:**
NOMBRE Y USUARIO
HWID (INICIO DE SECION CON HWID DE HTTP INYECTOR)
TOKEN (APKS PERSONALIZADAS)
## **BOT MANAGER**
-CONTROLA EL USO DE TUS CUENTAS SSH DESDE UN BOT DE TELEGRAM
(AGERAGR,ELIMINAR,RENOVAR,MIRAR CONECTADOS,SERVICOS DE TU VPS, IFO DE CUENTAS,ETC..)
-RECIBE NOTIFICACIONES CON BOT ESPECIAL

Binary file not shown.

View File

@ -0,0 +1,6 @@
#!/bin/bash
#12-02-2022
clear && clear
msg -bar
echo -e "\e[1;91 <<<<<< PROXIMAMENTE >>>>>"
msg -bar

View File

@ -0,0 +1,268 @@
import socket, threading, thread, select, signal, sys, time, getopt
# Listen
LISTENING_ADDR = '0.0.0.0'
if sys.argv[1:]:
LISTENING_PORT = sys.argv[1]
else:
LISTENING_PORT = 80
#Pass
PASS = ''
# CONST
BUFLEN = 4096 * 4
TIMEOUT = 60
DEFAULT_HOST = '127.0.0.1:443'
RESPONSE = 'HTTP/1.1 200 <strong>By SCRIP | LATAM</strong>\r\nContent-length: 0\r\n\r\nHTTP/1.1 200 Connection established\r\n\r\n'
#RESPONSE = 'HTTP/1.1 200 Hello_World!\r\nContent-length: 0\r\n\r\nHTTP/1.1 200 Connection established\r\n\r\n' # lint:ok
class Server(threading.Thread):
def __init__(self, host, port):
threading.Thread.__init__(self)
self.running = False
self.host = host
self.port = port
self.threads = []
self.threadsLock = threading.Lock()
self.logLock = threading.Lock()
def run(self):
self.soc = socket.socket(socket.AF_INET)
self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.soc.settimeout(2)
intport = int(self.port)
self.soc.bind((self.host, intport))
self.soc.listen(0)
self.running = True
try:
while self.running:
try:
c, addr = self.soc.accept()
c.setblocking(1)
except socket.timeout:
continue
conn = ConnectionHandler(c, self, addr)
conn.start()
self.addConn(conn)
finally:
self.running = False
self.soc.close()
def printLog(self, log):
self.logLock.acquire()
print log
self.logLock.release()
def addConn(self, conn):
try:
self.threadsLock.acquire()
if self.running:
self.threads.append(conn)
finally:
self.threadsLock.release()
def removeConn(self, conn):
try:
self.threadsLock.acquire()
self.threads.remove(conn)
finally:
self.threadsLock.release()
def close(self):
try:
self.running = False
self.threadsLock.acquire()
threads = list(self.threads)
for c in threads:
c.close()
finally:
self.threadsLock.release()
class ConnectionHandler(threading.Thread):
def __init__(self, socClient, server, addr):
threading.Thread.__init__(self)
self.clientClosed = False
self.targetClosed = True
self.client = socClient
self.client_buffer = ''
self.server = server
self.log = 'Connection: ' + str(addr)
def close(self):
try:
if not self.clientClosed:
self.client.shutdown(socket.SHUT_RDWR)
self.client.close()
except:
pass
finally:
self.clientClosed = True
try:
if not self.targetClosed:
self.target.shutdown(socket.SHUT_RDWR)
self.target.close()
except:
pass
finally:
self.targetClosed = True
def run(self):
try:
self.client_buffer = self.client.recv(BUFLEN)
hostPort = self.findHeader(self.client_buffer, 'X-Real-Host')
if hostPort == '':
hostPort = DEFAULT_HOST
split = self.findHeader(self.client_buffer, 'X-Split')
if split != '':
self.client.recv(BUFLEN)
if hostPort != '':
passwd = self.findHeader(self.client_buffer, 'X-Pass')
if len(PASS) != 0 and passwd == PASS:
self.method_CONNECT(hostPort)
elif len(PASS) != 0 and passwd != PASS:
self.client.send('HTTP/1.1 400 WrongPass!\r\n\r\n')
elif hostPort.startswith('127.0.0.1') or hostPort.startswith('localhost'):
self.method_CONNECT(hostPort)
else:
self.client.send('HTTP/1.1 403 Forbidden!\r\n\r\n')
else:
print '- No X-Real-Host!'
self.client.send('HTTP/1.1 400 NoXRealHost!\r\n\r\n')
except Exception as e:
self.log += ' - error: ' + e.strerror
self.server.printLog(self.log)
pass
finally:
self.close()
self.server.removeConn(self)
def findHeader(self, head, header):
aux = head.find(header + ': ')
if aux == -1:
return ''
aux = head.find(':', aux)
head = head[aux+2:]
aux = head.find('\r\n')
if aux == -1:
return ''
return head[:aux];
def connect_target(self, host):
i = host.find(':')
if i != -1:
port = int(host[i+1:])
host = host[:i]
else:
if self.method=='CONNECT':
port = 443
else:
port = sys.argv[1]
(soc_family, soc_type, proto, _, address) = socket.getaddrinfo(host, port)[0]
self.target = socket.socket(soc_family, soc_type, proto)
self.targetClosed = False
self.target.connect(address)
def method_CONNECT(self, path):
self.log += ' - CONNECT ' + path
self.connect_target(path)
self.client.sendall(RESPONSE)
self.client_buffer = ''
self.server.printLog(self.log)
self.doCONNECT()
def doCONNECT(self):
socs = [self.client, self.target]
count = 0
error = False
while True:
count += 1
(recv, _, err) = select.select(socs, [], socs, 3)
if err:
error = True
if recv:
for in_ in recv:
try:
data = in_.recv(BUFLEN)
if data:
if in_ is self.target:
self.client.send(data)
else:
while data:
byte = self.target.send(data)
data = data[byte:]
count = 0
else:
break
except:
error = True
break
if count == TIMEOUT:
error = True
if error:
break
def print_usage():
print 'Usage: proxy.py -p <port>'
print ' proxy.py -b <bindAddr> -p <port>'
print ' proxy.py -b 0.0.0.0 -p 80'
def parse_args(argv):
global LISTENING_ADDR
global LISTENING_PORT
try:
opts, args = getopt.getopt(argv,"hb:p:",["bind=","port="])
except getopt.GetoptError:
print_usage()
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print_usage()
sys.exit()
elif opt in ("-b", "--bind"):
LISTENING_ADDR = arg
elif opt in ("-p", "--port"):
LISTENING_PORT = int(arg)
def main(host=LISTENING_ADDR, port=LISTENING_PORT):
print "\n:-------PythonProxy-------:\n"
print "Listening addr: " + LISTENING_ADDR
print "Listening port: " + str(LISTENING_PORT) + "\n"
print ":-------------------------:\n"
server = Server(LISTENING_ADDR, LISTENING_PORT)
server.start()
while True:
try:
time.sleep(2)
except KeyboardInterrupt:
print 'Stopping...'
server.close()
break
####### parse_args(sys.argv[1:])
if __name__ == '__main__':
main()

View File

@ -0,0 +1,682 @@
import sys, time, getopt, socket, threading, base64
# CONFIG
CONFIG_LISTENING = '0.0.0.0:8799'
CONFIG_PASS = 'pwd.pwd'
class Logger:
logLock = threading.Lock()
LOG_INFO = 1
LOG_WARN = 2
LOG_ERROR = 3
def printWarn(self, log):
self.log(log)
def printInfo(self, log):
self.log(log)
def printError(self, log):
self.log(log)
def printLog(self, log, logLevel):
if logLevel == Logger.LOG_INFO:
self.printInfo('<-> ' + log)
elif logLevel == Logger.LOG_WARN:
self.printWarn('<!> ' + log)
elif logLevel == Logger.LOG_ERROR:
self.printError('<#> ' + log)
def log(self, log):
with Logger.logLock:
print log
class PasswordSet:
FILE_EXEMPLE = 'master=passwd123\n127.0.0.1:22=pwd321;321pawd\n1.23.45.67:443=pass123'
def __init__(self, masterKey=None):
self.masterKey = masterKey
def parseFile(self, fileName):
isValid = False
with open(fileName) as f:
content = f.readlines()
content = [x.strip() for x in content]
content = [item for item in content if not str(item).startswith('#')]
if len(content) > 0:
masterKey = content[0]
if self.splitParam(masterKey, '=') is not None and masterKey.startswith('master'):
self.masterKey = self.splitParam(masterKey, '=')[1]
isValid = True
self.map = dict()
for i, v in enumerate(content[1:]):
hostAndPass = self.splitParam(v, '=')
if hostAndPass is not None:
self.map[hostAndPass[0]] = hostAndPass[1].split(';')
return isValid
def isValidKey(self, key, target):
valid = False
if not self.masterKey == key:
if hasattr(self, 'map'):
if self.map.has_key(target):
valid = key in self.map[target]
else:
valid = True
return valid
def splitParam(self, param, c):
index = param.find(c)
ret = None
if index != -1:
ret = []
ret.append(param[0:index])
ret.append(param[index+1:])
return ret
class ClientRequest:
MAX_LEN_CLIENT_REQUEST = 1024 * 100
HEADER_CONTENT_LENGTH = 'Content-Length'
HEADER_ACTION = 'X-Action'
ACTION_CLOSE = 'close'
ACTION_DATA = 'data'
def __init__(self, socket):
self.socket = socket
self.readConent = False
def parse(self):
line = ''
count = 0
self.isValid = False
self.data = None
self.contentLength = None
self.action = None
while line != '\r\n' and count < ClientRequest.MAX_LEN_CLIENT_REQUEST:
line = self.readHttpLine()
if line is None:
break
if line.startswith(ClientRequest.HEADER_ACTION):
self.action = self.getHeaderVal(line)
if not self.action is None:
if self.action == ClientRequest.ACTION_CLOSE or self.action == ClientRequest.ACTION_DATA:
self.isValid = True
count += len(line)
if self.readConent:
if self.contentLength > 0 and self.contentLength < ClientRequest.MAX_LEN_CLIENT_REQUEST:
self.data = self.readFully(self.contentLength)
return self.isValid
def readHttpLine(self):
line = ''
count = 0
socket = self.socket
b = socket.recv(1)
if not b:
return None
while count < ClientRequest.MAX_LEN_CLIENT_REQUEST:
count += 1
line += b
if b == '\r':
b = socket.recv(1)
count += 1
if not b:
break
line += b
if b == '\n':
break
b = socket.recv(1)
if not b:
break
if not b:
return None
return line
def getHeaderVal(self, header):
ini = header.find(':')
if ini == -1:
return None
ini += 2
fim = header.find('\r\n')
if fim == -1:
header = header[ini:]
return header[ini:fim]
def readFully(self, n):
count = 0
data = ''
while count < n:
packet = self.socket.recv(n - count)
if not packet:
break
count += len(packet)
data += packet
class Client(threading.Thread):
ACTION_DATA = 'data'
BUFFER_SIZE = 4096
def __init__(self, id, readSocket, target):
super(Client, self).__init__()
self.targetHostPort = target
self.id = id
self.readSocket = readSocket
self.logger = Logger()
self.isStopped = False
self.onCloseFunction = None
self.closeLock = threading.Lock()
self.threadEndCount = 0
self.writeSocket = None
def connectTarget(self):
aux = self.targetHostPort.find(':')
host = self.targetHostPort[:aux]
port = int(self.targetHostPort[aux + 1:])
self.target = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.target.connect((host, port))
def run(self):
try:
self.connectTarget()
request = ClientRequest(self.readSocket)
request.readConent = False
if not request.parse() or not Client.ACTION_DATA == request.action:
raise Exception('client sends invalid request')
threadRead = ThreadRelay(self.readSocket, self.target, self.finallyClose)
threadRead.logFunction = self.log
threadRead.start()
threadWrite = ThreadRelay(self.target, self.writeSocket, self.finallyClose)
threadWrite.logFunction = self.log
threadWrite.start()
except Exception as e:
self.log('connection error - ' + str(type(e)) + ' - ' + str(e), Logger.LOG_ERROR)
self.close()
def finallyClose(self):
with self.closeLock:
self.threadEndCount += 1
if self.threadEndCount == 2:
self.close()
def close(self):
if not self.isStopped:
self.isStopped = True
if hasattr(self, 'target'):
try:
self.target.close()
except:
pass
if hasattr(self, 'writeSocket'):
try:
self.writeSocket.close()
except:
pass
if hasattr(self, 'readSocket'):
try:
self.readSocket.close()
except:
pass
self.onClose()
self.log('closed', Logger.LOG_INFO)
def onClose(self):
if not self.onCloseFunction is None:
self.onCloseFunction(self)
def log(self, msg, logLevel):
msg = 'Client ' + str(self.id) + ': ' + msg
self.logger.printLog(msg, logLevel)
class ThreadRelay(threading.Thread):
def __init__(self, readSocket, writeSocket, closeFunction=None):
super(ThreadRelay, self).__init__()
self.readSocket = readSocket
self.writeSocket = writeSocket
self.logFunction = None
self.closeFuntion = closeFunction
def run(self):
try:
while True:
data = self.readSocket.recv(Client.BUFFER_SIZE)
if not data:
break
self.writeSocket.sendall(data)
self.writeSocket.shutdown(socket.SHUT_WR)
except Exception as e:
if not self.logFunction is None:
self.logFunction('threadRelay error: ' + str(type(e)) + ' - ' + str(e), Logger.LOG_ERROR)
finally:
if not self.closeFuntion is None:
self.closeFuntion()
class AcceptClient(threading.Thread):
MAX_QTD_BYTES = 5000
HEADER_BODY = 'X-Body'
HEADER_ACTION = 'X-Action'
HEADER_TARGET = 'X-Target'
HEADER_PASS = 'X-Pass'
HEADER_ID = 'X-Id'
ACTION_CREATE = 'create'
ACTION_COMPLETE = 'complete'
MSG_CONNECTION_CREATED = 'Created'
MSG_CONNECTION_COMPLETED = 'Completed'
ID_COUNT = 0
ID_LOCK = threading.Lock()
def __init__(self, socket, server, passwdSet=None):
super(AcceptClient, self).__init__()
self.server = server
self.passwdSet = passwdSet
self.socket = socket
def run(self):
needClose = True
try:
head = self.readHttpRequest()
bodyLen = self.getHeaderVal(head, AcceptClient.HEADER_BODY)
if not bodyLen is None:
try:
self.readFully(int(bodyLen))
except ValueError:
pass
action = self.getHeaderVal(head, AcceptClient.HEADER_ACTION)
if action is None:
self.log('client sends no action header', Logger.LOG_WARN)
self.socket.sendall('HTTP/1.1 400 NoActionHeader!\r\nServer: GetTunnelServer\r\n\r\n')
return
if action == AcceptClient.ACTION_CREATE:
target = self.getHeaderVal(head, AcceptClient.HEADER_TARGET)
if not self.passwdSet is None:
passwd = self.getHeaderVal(head, AcceptClient.HEADER_PASS)
try:
passwd = base64.b64decode(passwd)
except:
passwd = None
pass
if passwd is None or not self.passwdSet.isValidKey(passwd, target):
self.log('client sends wrong key', Logger.LOG_WARN)
self.socket.sendall('HTTP/1.1 403 Forbidden\r\nServer: GetTunnelServer\r\n\r\n')
return
if target is not None and self.isValidHostPort(target):
id = self.generateId()
client = Client(id, self.socket, target)
client.onCloseFunction = self.server.removeClient
self.server.addClient(client)
self.socket.sendall('HTTP/1.1 200 '+ AcceptClient.MSG_CONNECTION_CREATED + '\r\nServer: GetTunnelServer\r\nX-Id: ' + str(id) + '\r\nContent-Type: text/plain\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n')
self.log('connection created - ' + str(id), Logger.LOG_INFO)
needClose = False
else:
self.log('client sends no valid target', Logger.LOG_WARN)
self.socket.sendall('HTTP/1.1 400 Target!\r\nServer: GetTunnelServer\r\n\r\n')
elif action == AcceptClient.ACTION_COMPLETE:
id = self.getHeaderVal(head, AcceptClient.HEADER_ID)
if not id is None:
client = self.server.getClient(id)
if not client is None:
client.writeSocket = self.socket
self.log('connection completed - ' + str(id), Logger.LOG_INFO)
self.socket.sendall('HTTP/1.1 200 ' + AcceptClient.MSG_CONNECTION_COMPLETED + '\r\nServer: GetTunnelServer\r\nConnection: Keep-Alive\r\n\r\n')
client.start()
needClose = False
else:
self.log('client try to complete non existing connection', Logger.LOG_WARN)
self.socket.sendall('HTTP/1.1 400 CreateFirst!\r\nServer: GetTunnelServer\r\n\r\n')
else:
self.log('client sends no id header', Logger.LOG_WARN)
self.socket.sendall('HTTP/1.1 400 NoID!\r\nServer: GetTunnelServer\r\n\r\n')
else:
self.log('client sends invalid action', Logger.LOG_WARN)
self.socket.sendall('HTTP/1.1 400 InvalidAction!\r\nServer: GetTunnelServer\r\n\r\n')
except Exception as e:
self.log('connection error - ' + str(type(e)) + ' - ' + str(e), Logger.LOG_ERROR)
finally:
if needClose:
try:
self.socket.close()
except:
pass
def log(self, msg, logLevel):
self.server.log(msg, logLevel)
def readHttpRequest(self):
request = ''
linha = ''
count = 0
while linha != '\r\n' and count < AcceptClient.MAX_QTD_BYTES:
linha = self.readHttpLine()
if linha is None:
break
request += linha
count += len(linha)
return request
def readHttpLine(self):
line = ''
count = 0
socket = self.socket
b = socket.recv(1)
if not b:
return None
while count < AcceptClient.MAX_QTD_BYTES:
count += 1
line += b
if b == '\r':
b = socket.recv(1)
count += 1
if not b:
break
line += b
if b == '\n':
break
b = socket.recv(1)
if not b:
break
if not b:
return None
return line
def getHeaderVal(self, head, header):
if not head.startswith('\r\n'):
header = '\r\n' + header
if not header.endswith(': '):
header = header + ': '
ini = head.find(header)
if ini == -1:
return None
end = head.find('\r\n', ini+2)
ini += len(header)
if end == -1 or ini > end or ini >= len(head):
return None
return head[ini:end]
def readFully(self, n):
count = 0
while count < n:
packet = self.socket.recv(n - count)
if not packet:
break
count += len(packet)
def isValidHostPort(self, hostPort):
aux = hostPort.find(':')
if aux == -1 or aux >= len(hostPort) -1:
return False
try:
int(hostPort[aux+1:])
return True
except ValueError:
return False
def generateId(self):
with AcceptClient.ID_LOCK:
AcceptClient.ID_COUNT += 1
return AcceptClient.ID_COUNT
class Server(threading.Thread):
def __init__(self, listening, passwdSet=None):
super(Server, self).__init__()
self.listening = listening
self.passwdSet = passwdSet
self.running = False
self.logger = Logger()
self.isStopped = False
self.clientsLock = threading.Lock()
self.clients = []
def run(self):
try:
self.soc = socket.socket(socket.AF_INET)
self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.soc.settimeout(2)
self.soc.bind((self.listening[:self.listening.find(':')], int(self.listening[self.listening.find(':') + 1:])))
self.soc.listen(0)
self.log('running on ' + self.listening, Logger.LOG_INFO)
self.running = True
while self.running:
try:
c, addr = self.soc.accept()
c.setblocking(1)
self.log('opennig connection - ' + str(addr), Logger.LOG_INFO)
self.acceptClient(c)
except socket.timeout:
continue
except Exception as e:
self.log('connection error - ' + str(type(e)) + ' - ' + str(e), Logger.LOG_ERROR)
finally:
self.running = False
self.close()
def acceptClient(self, socket):
accept = AcceptClient(socket, self, self.passwdSet)
accept.start()
def addClient(self, client):
with self.clientsLock:
self.clients.append(client)
def removeClient(self, client):
with self.clientsLock:
self.clients.remove(client)
def getClient(self, id):
client = None
with self.clientsLock:
for c in self.clients:
if str(c.id) == str(id):
client = c
break
return client
def close(self):
if not self.isStopped:
self.isStopped = True
if hasattr(self, 'soc'):
try:
self.soc.close()
except:
pass
with self.clientsLock:
clientsCopy = self.clients[:]
for c in clientsCopy:
c.close()
self.log('closed', Logger.LOG_INFO)
def log(self, msg, logLevel):
msg = 'Server: ' + msg
self.logger.printLog(msg, logLevel)
def print_usage():
print '\nUsage : python get.py -b listening -p pass'
print 'Ex. : python get.py -b 0.0.0.0:80 -p pass123'
print ' : python get.py -b 0.0.0.0:80 -p passFile.pwd\n'
print '___Password file ex.:___'
print PasswordSet.FILE_EXEMPLE
def parse_args(argv):
global CONFIG_LISTENING
global CONFIG_PASS
try:
opts, args = getopt.getopt(argv, "hb:p:", ["bind=", "pass="])
except getopt.GetoptError:
print_usage()
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print_usage()
sys.exit()
elif opt in ('-b', '--bind'):
CONFIG_LISTENING = arg
elif opt in ('-p', '--pass'):
CONFIG_PASS = arg
def main():
print '\n-->GetTunnelPy - Server v.' + '25/06/2017' + '\n'
print '-->Listening: ' + CONFIG_LISTENING
pwdSet = None
if not CONFIG_PASS is None:
if CONFIG_PASS.endswith('.pwd'):
pwdSet = PasswordSet()
try:
isValidFile = pwdSet.parseFile(CONFIG_PASS)
except IOError as e:
print '--#Error reading file: ' + str(type(e)) + ' - ' + str(e)
sys.exit()
if not isValidFile:
print '--#Error on parsing file!\n'
print_usage()
return
print '-->Pass file: ' + CONFIG_PASS + '\n'
else:
if (len(CONFIG_PASS) > 0):
print '-->Pass : yes\n'
pwdSet = PasswordSet(CONFIG_PASS)
else:
print '-->Pass : no\n'
server = Server(CONFIG_LISTENING)
server.passwdSet = pwdSet
server.start()
while True:
try:
time.sleep(2)
except KeyboardInterrupt:
print '<-> Stopping server...'
server.running = False
break
if __name__ == '__main__':
parse_args(sys.argv[1:])
main()

View File

@ -0,0 +1,313 @@
#!/usr/bin/env python
import sys
import httplib
from SocketServer import ThreadingMixIn
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from threading import Lock, Timer
from cStringIO import StringIO
from urlparse import urlsplit
import socket
import select
import gzip
import zlib
import re
import traceback
class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
address_family = socket.AF_INET
def handle_error(self, request, client_address):
print >>sys.stderr, '-'*40
print >>sys.stderr, 'Exception happened during processing of request from', client_address
traceback.print_exc()
print >>sys.stderr, '-'*40
class ThreadingHTTPServer6(ThreadingHTTPServer):
address_family = socket.AF_INET6
class SimpleHTTPProxyHandler(BaseHTTPRequestHandler):
global_lock = Lock()
conn_table = {}
timeout = 300
upstream_timeout = 300
proxy_via = None
def log_error(self, format, *args):
if format == "Request timed out: %r":
return
self.log_message(format, *args)
def do_CONNECT(self):
req = self
reqbody = None
req.path = "https://%s/" % req.path.replace(':443', '')
replaced_reqbody = self.request_handler(req, reqbody)
if replaced_reqbody is True:
return
u = urlsplit(req.path)
address = (u.hostname, u.port or 443)
try:
conn = socket.create_connection(address)
except socket.error:
return
self.send_response(200, 'SOCKS5')
self.send_header('Connection', 'close')
self.end_headers()
conns = [self.connection, conn]
keep_connection = True
while keep_connection:
keep_connection = False
rlist, wlist, xlist = select.select(conns, [], conns, self.timeout)
if xlist:
break
for r in rlist:
other = conns[1] if r is conns[0] else conns[0]
data = r.recv(8192)
if data:
other.sendall(data)
keep_connection = True
conn.close()
def do_HEAD(self):
self.do_SPAM()
def do_GET(self):
self.do_SPAM()
def do_POST(self):
self.do_SPAM()
def do_SPAM(self):
req = self
content_length = int(req.headers.get('Content-Length', 0))
if content_length > 0:
reqbody = self.rfile.read(content_length)
else:
reqbody = None
replaced_reqbody = self.request_handler(req, reqbody)
if replaced_reqbody is True:
return
elif replaced_reqbody is not None:
reqbody = replaced_reqbody
if 'Content-Length' in req.headers:
req.headers['Content-Length'] = str(len(reqbody))
self.remove_hop_by_hop_headers(req.headers)
if self.upstream_timeout:
req.headers['Connection'] = 'Keep-Alive'
else:
req.headers['Connection'] = 'close'
if self.proxy_via:
self.modify_via_header(req.headers)
try:
res, resdata = self.request_to_upstream_server(req, reqbody)
except socket.error:
return
content_encoding = res.headers.get('Content-Encoding', 'identity')
resbody = self.decode_content_body(resdata, content_encoding)
replaced_resbody = self.response_handler(req, reqbody, res, resbody)
if replaced_resbody is True:
return
elif replaced_resbody is not None:
resdata = self.encode_content_body(replaced_resbody, content_encoding)
if 'Content-Length' in res.headers:
res.headers['Content-Length'] = str(len(resdata))
resbody = replaced_resbody
self.remove_hop_by_hop_headers(res.headers)
if self.timeout:
res.headers['Connection'] = 'Keep-Alive'
else:
res.headers['Connection'] = 'close'
if self.proxy_via:
self.modify_via_header(res.headers)
self.send_response(res.status, res.reason)
for k, v in res.headers.items():
if k == 'set-cookie':
for value in self.split_set_cookie_header(v):
self.send_header(k, value)
else:
self.send_header(k, v)
self.end_headers()
if self.command != 'HEAD':
self.wfile.write(resdata)
with self.global_lock:
self.save_handler(req, reqbody, res, resbody)
def request_to_upstream_server(self, req, reqbody):
u = urlsplit(req.path)
origin = (u.scheme, u.netloc)
req.headers['Host'] = u.netloc
selector = "%s?%s" % (u.path, u.query) if u.query else u.path
while True:
with self.lock_origin(origin):
conn = self.open_origin(origin)
try:
conn.request(req.command, selector, reqbody, headers=dict(req.headers))
except socket.error:
self.close_origin(origin)
raise
try:
res = conn.getresponse(buffering=True)
except httplib.BadStatusLine as e:
if e.line == "''":
self.close_origin(origin)
continue
else:
raise
resdata = res.read()
res.headers = res.msg
if not self.upstream_timeout or 'close' in res.headers.get('Connection', ''):
self.close_origin(origin)
else:
self.reset_timer(origin)
return res, resdata
def lock_origin(self, origin):
d = self.conn_table.setdefault(origin, {})
if not 'lock' in d:
d['lock'] = Lock()
return d['lock']
def open_origin(self, origin):
conn = self.conn_table[origin].get('connection')
if not conn:
scheme, netloc = origin
if scheme == 'https':
conn = httplib.HTTPSConnection(netloc)
else:
conn = httplib.HTTPConnection(netloc)
self.reset_timer(origin)
self.conn_table[origin]['connection'] = conn
return conn
def reset_timer(self, origin):
timer = self.conn_table[origin].get('timer')
if timer:
timer.cancel()
if self.upstream_timeout:
timer = Timer(self.upstream_timeout, self.close_origin, args=[origin])
timer.daemon = True
timer.start()
else:
timer = None
self.conn_table[origin]['timer'] = timer
def close_origin(self, origin):
timer = self.conn_table[origin]['timer']
if timer:
timer.cancel()
conn = self.conn_table[origin]['connection']
conn.close()
del self.conn_table[origin]['connection']
def remove_hop_by_hop_headers(self, headers):
hop_by_hop_headers = ['Connection', 'Keep-Alive', 'Proxy-Authenticate', 'Proxy-Authorization', 'TE', 'Trailers', 'Trailer', 'Transfer-Encoding', 'Upgrade']
connection = headers.get('Connection')
if connection:
keys = re.split(r',\s*', connection)
hop_by_hop_headers.extend(keys)
for k in hop_by_hop_headers:
if k in headers:
del headers[k]
def modify_via_header(self, headers):
via_string = "%s %s" % (self.protocol_version, self.proxy_via)
via_string = re.sub(r'^HTTP/', '', via_string)
original = headers.get('Via')
if original:
headers['Via'] = original + ', ' + via_string
else:
headers['Via'] = via_string
def decode_content_body(self, data, content_encoding):
if content_encoding in ('gzip', 'x-gzip'):
io = StringIO(data)
with gzip.GzipFile(fileobj=io) as f:
body = f.read()
elif content_encoding == 'deflate':
body = zlib.decompress(data)
elif content_encoding == 'identity':
body = data
else:
raise Exception("Unknown Content-Encoding: %s" % content_encoding)
return body
def encode_content_body(self, body, content_encoding):
if content_encoding in ('gzip', 'x-gzip'):
io = StringIO()
with gzip.GzipFile(fileobj=io, mode='wb') as f:
f.write(body)
data = io.getvalue()
elif content_encoding == 'deflate':
data = zlib.compress(body)
elif content_encoding == 'identity':
data = body
else:
raise Exception("Unknown Content-Encoding: %s" % content_encoding)
return data
def split_set_cookie_header(self, value):
re_cookies = r'([^=]+=[^,;]+(?:;\s*Expires=[^,]+,[^,;]+|;[^,;]+)*)(?:,\s*)?'
return re.findall(re_cookies, value, flags=re.IGNORECASE)
def request_handler(self, req, reqbody):
pass
def response_handler(self, req, reqbody, res, resbody):
pass
def save_handler(self, req, reqbody, res, resbody):
pass
# Port
def test(HandlerClass=SimpleHTTPProxyHandler, ServerClass=ThreadingHTTPServer, protocol="HTTP/1.1"):
if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 80
server_address = ('', port)
HandlerClass.protocol_version = protocol
httpd = ServerClass(server_address, HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()
if __name__ == '__main__':
test()

View File

@ -0,0 +1,335 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Edit By GlEmYsSoN & @e8th4ever
from pprint import pprint
import sys
import http.client
from socketserver import ThreadingMixIn
from http.server import HTTPServer, BaseHTTPRequestHandler
from threading import Lock, Timer
from io import StringIO
from urllib.parse import urlsplit
import socket
import select
import gzip
import zlib
import re
import traceback
import subprocess
subprocess.call("clear",shell=True)
if sys.argv[2:]:
msg1 = sys.argv[2]
else:
msg1 = 'ADM-ULTIMATE'
if sys.argv[3:]:
server = sys.argv[3]
else:
server = "127.0.0.1"
msg2 = 'Server Forbidden'
class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
address_family = socket.AF_INET
def handle_error(self, request, client_address):
print('-'*40, file=sys.stderr)
print('Exception happened during processing of request from', client_address, file=sys.stderr)
traceback.print_exc()
print('-'*40, file=sys.stderr)
class ThreadingHTTPServer6(ThreadingHTTPServer):
address_family = socket.AF_INET6
class SimpleHTTPProxyHandler(BaseHTTPRequestHandler):
global_lock = Lock()
conn_table = {}
timeout = 300
upstream_timeout = 300
proxy_via = None
def log_error(self, format, *args):
if format == "Request timed out: %r":
return
self.log_message(format, *args)
def do_CONNECT(self):
req = self
reqbody = None
if ':22' in req.path:
hostip = req.path.replace(':22', '')
elif ':443' in req.path:
hostip = req.path.replace(':443', '')
req.path = "https://%s/" % req.path.replace(':443', '')
replaced_reqbody = self.request_handler(req, reqbody)
if replaced_reqbody is True:
return
u = urlsplit(req.path)
address = (u.hostname, u.port or 443)
try:
conn = socket.create_connection(address)
except socket.error:
return
self.send_response(200, msg1)
self.send_header('Connection', 'close')
self.end_headers()
conns = [self.connection, conn]
keep_connection = True
while keep_connection:
if not server.find(hostip) != -1:
self.send_error(403, msg2)
self.close_connection
keep_connection = False
rlist, wlist, xlist = select.select(conns, [], conns, self.timeout)
if xlist:
break
for r in rlist:
other = conns[1] if r is conns[0] else conns[0]
data = r.recv(8192)
if data:
other.sendall(data)
keep_connection = True
conn.close()
def do_HEAD(self):
self.do_SPAM()
def do_GET(self):
self.do_SPAM()
def do_POST(self):
self.do_SPAM()
def do_SPAM(self):
req = self
content_length = int(req.headers.get('Content-Length', 0))
if content_length > 0:
reqbody = self.rfile.read(content_length)
else:
reqbody = None
replaced_reqbody = self.request_handler(req, reqbody)
if replaced_reqbody is True:
return
elif replaced_reqbody is not None:
reqbody = replaced_reqbody
if 'Content-Length' in req.headers:
req.headers['Content-Length'] = str(len(reqbody))
self.remove_hop_by_hop_headers(req.headers)
if self.upstream_timeout:
req.headers['Connection'] = 'Keep-Alive'
else:
req.headers['Connection'] = 'close'
if self.proxy_via:
self.modify_via_header(req.headers)
try:
res, resdata = self.request_to_upstream_server(req, reqbody)
except socket.error:
return
content_encoding = res.headers.get('Content-Encoding', 'identity')
resbody = self.decode_content_body(resdata, content_encoding)
replaced_resbody = self.response_handler(req, reqbody, res, resbody)
if replaced_resbody is True:
return
elif replaced_resbody is not None:
resdata = self.encode_content_body(replaced_resbody, content_encoding)
if 'Content-Length' in res.headers:
res.headers['Content-Length'] = str(len(resdata))
resbody = replaced_resbody
self.remove_hop_by_hop_headers(res.headers)
if self.timeout:
res.headers['Connection'] = 'Keep-Alive'
else:
res.headers['Connection'] = 'close'
if self.proxy_via:
self.modify_via_header(res.headers)
self.send_response(res.status, res.reason)
for k, v in list(res.headers.items()):
if k == 'set-cookie':
for value in self.split_set_cookie_header(v):
self.send_header(k, value)
else:
self.send_header(k, v)
self.end_headers()
if self.command != 'HEAD':
self.wfile.write(resdata)
with self.global_lock:
self.save_handler(req, reqbody, res, resbody)
def request_to_upstream_server(self, req, reqbody):
u = urlsplit(req.path)
origin = (u.scheme, u.netloc)
req.headers['Host'] = u.netloc
selector = "%s?%s" % (u.path, u.query) if u.query else u.path
while True:
with self.lock_origin(origin):
conn = self.open_origin(origin)
try:
conn.request(req.command, selector, reqbody, headers=dict(req.headers))
except socket.error:
self.close_origin(origin)
raise
try:
res = conn.getresponse(buffering=True)
except http.client.BadStatusLine as e:
if e.line == "''":
self.close_origin(origin)
continue
else:
raise
resdata = res.read()
res.headers = res.msg
if not self.upstream_timeout or 'close' in res.headers.get('Connection', ''):
self.close_origin(origin)
else:
self.reset_timer(origin)
return res, resdata
def lock_origin(self, origin):
d = self.conn_table.setdefault(origin, {})
if not 'lock' in d:
d['lock'] = Lock()
return d['lock']
def open_origin(self, origin):
conn = self.conn_table[origin].get('connection')
if not conn:
scheme, netloc = origin
if scheme == 'https':
conn = http.client.HTTPSConnection(netloc)
else:
conn = http.client.HTTPConnection(netloc)
self.reset_timer(origin)
self.conn_table[origin]['connection'] = conn
return conn
def reset_timer(self, origin):
timer = self.conn_table[origin].get('timer')
if timer:
timer.cancel()
if self.upstream_timeout:
timer = Timer(self.upstream_timeout, self.close_origin, args=[origin])
timer.daemon = True
timer.start()
else:
timer = None
self.conn_table[origin]['timer'] = timer
def close_origin(self, origin):
timer = self.conn_table[origin]['timer']
if timer:
timer.cancel()
conn = self.conn_table[origin]['connection']
conn.close()
del self.conn_table[origin]['connection']
def remove_hop_by_hop_headers(self, headers):
hop_by_hop_headers = ['Connection', 'Keep-Alive', 'Proxy-Authenticate', 'Proxy-Authorization', 'TE', 'Trailers', 'Trailer', 'Transfer-Encoding', 'Upgrade']
connection = headers.get('Connection')
if connection:
keys = re.split(r',\s*', connection)
hop_by_hop_headers.extend(keys)
for k in hop_by_hop_headers:
if k in headers:
del headers[k]
def modify_via_header(self, headers):
via_string = "%s %s" % (self.protocol_version, self.proxy_via)
via_string = re.sub(r'^HTTP/', '', via_string)
original = headers.get('Via')
if original:
headers['Via'] = original + ', ' + via_string
else:
headers['Via'] = via_string
def decode_content_body(self, data, content_encoding):
if content_encoding in ('gzip', 'x-gzip'):
io = StringIO(data)
with gzip.GzipFile(fileobj=io) as f:
body = f.read()
elif content_encoding == 'deflate':
body = zlib.decompress(data)
elif content_encoding == 'identity':
body = data
else:
raise Exception("Unknown Content-Encoding: %s" % content_encoding)
return body
def encode_content_body(self, body, content_encoding):
if content_encoding in ('gzip', 'x-gzip'):
io = StringIO()
with gzip.GzipFile(fileobj=io, mode='wb') as f:
f.write(body)
data = io.getvalue()
elif content_encoding == 'deflate':
data = zlib.compress(body)
elif content_encoding == 'identity':
data = body
else:
raise Exception("Unknown Content-Encoding: %s" % content_encoding)
return data
def split_set_cookie_header(self, value):
re_cookies = r'([^=]+=[^,;]+(?:;\s*Expires=[^,]+,[^,;]+|;[^,;]+)*)(?:,\s*)?'
return re.findall(re_cookies, value, flags=re.IGNORECASE)
def request_handler(self, req, reqbody):
pass
def response_handler(self, req, reqbody, res, resbody):
pass
def save_handler(self, req, reqbody, res, resbody):
pass
def test(HandlerClass=SimpleHTTPProxyHandler, ServerClass=ThreadingHTTPServer, protocol="HTTP/1.1"):
port = int(sys.argv[1])
server_address = ('', port)
HandlerClass.protocol_version = protocol
httpd = ServerClass(server_address, HandlerClass)
sa = httpd.socket.getsockname()
print("Servidor: " + str(sa[0]) + " Porta " + str(sa[1]))
httpd.serve_forever()
if __name__ == '__main__':
test()

View File

@ -0,0 +1,318 @@
#!/usr/bin/env python
import sys
import httplib
from SocketServer import ThreadingMixIn
from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler
from threading import Lock, Timer
from cStringIO import StringIO
from urlparse import urlsplit
import socket
import select
import gzip
import zlib
import re
import traceback
if sys.argv[2:]:
msg1 = sys.argv[2]
else:
msg1 = "ADM-ULTIMATE"
class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
address_family = socket.AF_INET
def handle_error(self, request, client_address):
print >>sys.stderr, '-'*40
print >>sys.stderr, 'Exception happened during processing of request from', client_address
traceback.print_exc()
print >>sys.stderr, '-'*40
class ThreadingHTTPServer6(ThreadingHTTPServer):
address_family = socket.AF_INET6
class SimpleHTTPProxyHandler(BaseHTTPRequestHandler):
global_lock = Lock()
conn_table = {}
timeout = 300
upstream_timeout = 300
proxy_via = None
def log_error(self, format, *args):
if format == "Request timed out: %r":
return
self.log_message(format, *args)
def do_CONNECT(self):
req = self
reqbody = None
req.path = "https://%s/" % req.path.replace(':443', '')
replaced_reqbody = self.request_handler(req, reqbody)
if replaced_reqbody is True:
return
u = urlsplit(req.path)
address = (u.hostname, u.port or 443)
try:
conn = socket.create_connection(address)
except socket.error:
return
self.send_response(200, msg1)
self.send_header('Connection', 'close')
self.end_headers()
conns = [self.connection, conn]
keep_connection = True
while keep_connection:
keep_connection = False
rlist, wlist, xlist = select.select(conns, [], conns, self.timeout)
if xlist:
break
for r in rlist:
other = conns[1] if r is conns[0] else conns[0]
data = r.recv(8192)
if data:
other.sendall(data)
keep_connection = True
conn.close()
def do_HEAD(self):
self.do_SPAM()
def do_GET(self):
self.do_SPAM()
def do_POST(self):
self.do_SPAM()
def do_SPAM(self):
req = self
content_length = int(req.headers.get('Content-Length', 0))
if content_length > 0:
reqbody = self.rfile.read(content_length)
else:
reqbody = None
replaced_reqbody = self.request_handler(req, reqbody)
if replaced_reqbody is True:
return
elif replaced_reqbody is not None:
reqbody = replaced_reqbody
if 'Content-Length' in req.headers:
req.headers['Content-Length'] = str(len(reqbody))
self.remove_hop_by_hop_headers(req.headers)
if self.upstream_timeout:
req.headers['Connection'] = 'Keep-Alive'
else:
req.headers['Connection'] = 'close'
if self.proxy_via:
self.modify_via_header(req.headers)
try:
res, resdata = self.request_to_upstream_server(req, reqbody)
except socket.error:
return
content_encoding = res.headers.get('Content-Encoding', 'identity')
resbody = self.decode_content_body(resdata, content_encoding)
replaced_resbody = self.response_handler(req, reqbody, res, resbody)
if replaced_resbody is True:
return
elif replaced_resbody is not None:
resdata = self.encode_content_body(replaced_resbody, content_encoding)
if 'Content-Length' in res.headers:
res.headers['Content-Length'] = str(len(resdata))
resbody = replaced_resbody
self.remove_hop_by_hop_headers(res.headers)
if self.timeout:
res.headers['Connection'] = 'Keep-Alive'
else:
res.headers['Connection'] = 'close'
if self.proxy_via:
self.modify_via_header(res.headers)
self.send_response(res.status, res.reason)
for k, v in res.headers.items():
if k == 'set-cookie':
for value in self.split_set_cookie_header(v):
self.send_header(k, value)
else:
self.send_header(k, v)
self.end_headers()
if self.command != 'HEAD':
self.wfile.write(resdata)
with self.global_lock:
self.save_handler(req, reqbody, res, resbody)
def request_to_upstream_server(self, req, reqbody):
u = urlsplit(req.path)
origin = (u.scheme, u.netloc)
req.headers['Host'] = u.netloc
selector = "%s?%s" % (u.path, u.query) if u.query else u.path
while True:
with self.lock_origin(origin):
conn = self.open_origin(origin)
try:
conn.request(req.command, selector, reqbody, headers=dict(req.headers))
except socket.error:
self.close_origin(origin)
raise
try:
res = conn.getresponse(buffering=True)
except httplib.BadStatusLine as e:
if e.line == "''":
self.close_origin(origin)
continue
else:
raise
resdata = res.read()
res.headers = res.msg
if not self.upstream_timeout or 'close' in res.headers.get('Connection', ''):
self.close_origin(origin)
else:
self.reset_timer(origin)
return res, resdata
def lock_origin(self, origin):
d = self.conn_table.setdefault(origin, {})
if not 'lock' in d:
d['lock'] = Lock()
return d['lock']
def open_origin(self, origin):
conn = self.conn_table[origin].get('connection')
if not conn:
scheme, netloc = origin
if scheme == 'https':
conn = httplib.HTTPSConnection(netloc)
else:
conn = httplib.HTTPConnection(netloc)
self.reset_timer(origin)
self.conn_table[origin]['connection'] = conn
return conn
def reset_timer(self, origin):
timer = self.conn_table[origin].get('timer')
if timer:
timer.cancel()
if self.upstream_timeout:
timer = Timer(self.upstream_timeout, self.close_origin, args=[origin])
timer.daemon = True
timer.start()
else:
timer = None
self.conn_table[origin]['timer'] = timer
def close_origin(self, origin):
timer = self.conn_table[origin]['timer']
if timer:
timer.cancel()
conn = self.conn_table[origin]['connection']
conn.close()
del self.conn_table[origin]['connection']
def remove_hop_by_hop_headers(self, headers):
hop_by_hop_headers = ['Connection', 'Keep-Alive', 'Proxy-Authenticate', 'Proxy-Authorization', 'TE', 'Trailers', 'Trailer', 'Transfer-Encoding', 'Upgrade']
connection = headers.get('Connection')
if connection:
keys = re.split(r',\s*', connection)
hop_by_hop_headers.extend(keys)
for k in hop_by_hop_headers:
if k in headers:
del headers[k]
def modify_via_header(self, headers):
via_string = "%s %s" % (self.protocol_version, self.proxy_via)
via_string = re.sub(r'^HTTP/', '', via_string)
original = headers.get('Via')
if original:
headers['Via'] = original + ', ' + via_string
else:
headers['Via'] = via_string
def decode_content_body(self, data, content_encoding):
if content_encoding in ('gzip', 'x-gzip'):
io = StringIO(data)
with gzip.GzipFile(fileobj=io) as f:
body = f.read()
elif content_encoding == 'deflate':
body = zlib.decompress(data)
elif content_encoding == 'identity':
body = data
else:
raise Exception("Unknown Content-Encoding: %s" % content_encoding)
return body
def encode_content_body(self, body, content_encoding):
if content_encoding in ('gzip', 'x-gzip'):
io = StringIO()
with gzip.GzipFile(fileobj=io, mode='wb') as f:
f.write(body)
data = io.getvalue()
elif content_encoding == 'deflate':
data = zlib.compress(body)
elif content_encoding == 'identity':
data = body
else:
raise Exception("Unknown Content-Encoding: %s" % content_encoding)
return data
def split_set_cookie_header(self, value):
re_cookies = r'([^=]+=[^,;]+(?:;\s*Expires=[^,]+,[^,;]+|;[^,;]+)*)(?:,\s*)?'
return re.findall(re_cookies, value, flags=re.IGNORECASE)
def request_handler(self, req, reqbody):
pass
def response_handler(self, req, reqbody, res, resbody):
pass
def save_handler(self, req, reqbody, res, resbody):
pass
def test(HandlerClass=SimpleHTTPProxyHandler, ServerClass=ThreadingHTTPServer, protocol="HTTP/1.1"):
if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 8799
server_address = ('', port)
HandlerClass.protocol_version = protocol
httpd = ServerClass(server_address, HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()
if __name__ == '__main__':
test()

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
## Debian 10
deb http://deb.debian.org/debian/ buster main contrib non-free
deb-src http://deb.debian.org/debian/ buster main contrib non-free
deb http://security.debian.org/debian-security buster/updates main contrib non-free
deb-src http://security.debian.org/debian-security buster/updates main contrib non-free
deb http://deb.debian.org/debian/ buster-updates main contrib non-free
deb-src http://deb.debian.org/debian/ buster-updates main contrib non-free

View File

@ -0,0 +1,8 @@
## Debian 11
deb http://deb.debian.org/debian/ bullseye main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye main contrib non-free
deb http://security.debian.org/debian-security bullseye/updates main contrib non-free
deb-src http://security.debian.org/debian-security bullseye/updates main contrib non-free
deb http://deb.debian.org/debian/ bullseye-updates main contrib non-free
deb-src http://deb.debian.org/debian/ bullseye-updates main contrib non-free

View File

@ -0,0 +1,12 @@
## Ubuntu 14.04
deb http://us.archive.ubuntu.com/ubuntu/ trusty main restricted
deb http://us.archive.ubuntu.com/ubuntu/ trusty-updates main restricted
deb http://us.archive.ubuntu.com/ubuntu/ trusty universe
deb http://us.archive.ubuntu.com/ubuntu/ trusty-updates universe
deb http://us.archive.ubuntu.com/ubuntu/ trusty multiverse
deb http://us.archive.ubuntu.com/ubuntu/ trusty-updates multiverse
deb http://us.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu trusty-security main restricted
deb http://security.ubuntu.com/ubuntu trusty-security universe
deb http://security.ubuntu.com/ubuntu trusty-security multiverse

View File

@ -0,0 +1,12 @@
## Ubuntu 16.04
deb http://us.archive.ubuntu.com/ubuntu/ xenial main restricted
deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates main restricted
deb http://us.archive.ubuntu.com/ubuntu/ xenial universe
deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates universe
deb http://us.archive.ubuntu.com/ubuntu/ xenial multiverse
deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates multiverse
deb http://us.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu xenial-security main restricted
deb http://security.ubuntu.com/ubuntu xenial-security universe
deb http://security.ubuntu.com/ubuntu xenial-security multiverse

View File

@ -0,0 +1,11 @@
## Ubuntu 18.04
deb http://us.archive.ubuntu.com/ubuntu/ bionic main restricted
deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates main restricted
deb http://us.archive.ubuntu.com/ubuntu/ bionic universe
deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates universe
deb http://us.archive.ubuntu.com/ubuntu/ bionic multiverse
deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates multiverse
deb http://security.ubuntu.com/ubuntu bionic-security main restricted
deb http://security.ubuntu.com/ubuntu bionic-security universe
deb http://security.ubuntu.com/ubuntu bionic-security multiverse

View File

@ -0,0 +1,12 @@
## Ubuntu 20.04
deb http://us.archive.ubuntu.com/ubuntu/ focal main restricted
deb http://us.archive.ubuntu.com/ubuntu/ focal-updates main restricted
deb http://us.archive.ubuntu.com/ubuntu/ focal universe
deb http://us.archive.ubuntu.com/ubuntu/ focal-updates universe
deb http://us.archive.ubuntu.com/ubuntu/ focal multiverse
deb http://us.archive.ubuntu.com/ubuntu/ focal-updates multiverse
deb http://us.archive.ubuntu.com/ubuntu/ focal-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu focal-security main restricted
deb http://security.ubuntu.com/ubuntu focal-security universe
deb http://security.ubuntu.com/ubuntu focal-security multiverse

View File

@ -0,0 +1,12 @@
## Ubuntu 20.10
deb http://us.archive.ubuntu.com/ubuntu/ groovy main restricted
deb http://us.archive.ubuntu.com/ubuntu/ groovy-updates main restricted
deb http://us.archive.ubuntu.com/ubuntu/ groovy universe
deb http://us.archive.ubuntu.com/ubuntu/ groovy-updates universe
deb http://us.archive.ubuntu.com/ubuntu/ groovy multiverse
deb http://us.archive.ubuntu.com/ubuntu/ groovy-updates multiverse
deb http://us.archive.ubuntu.com/ubuntu/ groovy-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu groovy-security main restricted
deb http://security.ubuntu.com/ubuntu groovy-security universe
deb http://security.ubuntu.com/ubuntu groovy-security multiverse

View File

@ -0,0 +1,12 @@
## Ubuntu 21.04
deb http://us.archive.ubuntu.com/ubuntu/ hirsute main restricted
deb http://us.archive.ubuntu.com/ubuntu/ hirsute-updates main restricted
deb http://us.archive.ubuntu.com/ubuntu/ hirsute universe
deb http://us.archive.ubuntu.com/ubuntu/ hirsute-updates universe
deb http://us.archive.ubuntu.com/ubuntu/ hirsute multiverse
deb http://us.archive.ubuntu.com/ubuntu/ hirsute-updates multiverse
deb http://us.archive.ubuntu.com/ubuntu/ hirsute-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu hirsute-security main restricted
deb http://security.ubuntu.com/ubuntu hirsute-security universe
deb http://security.ubuntu.com/ubuntu hirsute-security multiverse

View File

@ -0,0 +1,12 @@
## Ubuntu 21.10
deb http://us.archive.ubuntu.com/ubuntu/ impish main restricted
deb http://us.archive.ubuntu.com/ubuntu/ impish-updates main restricted
deb http://us.archive.ubuntu.com/ubuntu/ impish universe
deb http://us.archive.ubuntu.com/ubuntu/ impish-updates universe
deb http://us.archive.ubuntu.com/ubuntu/ impish multiverse
deb http://us.archive.ubuntu.com/ubuntu/ impish-updates multiverse
deb http://us.archive.ubuntu.com/ubuntu/ impish-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu impish-security main restricted
deb http://security.ubuntu.com/ubuntu impish-security universe
deb http://security.ubuntu.com/ubuntu impish-security multiverse

View File

@ -0,0 +1,12 @@
## Ubuntu 22.04
deb http://us.archive.ubuntu.com/ubuntu/ jammy main restricted
deb http://us.archive.ubuntu.com/ubuntu/ jammy-updates main restricted
deb http://us.archive.ubuntu.com/ubuntu/ jammy universe
deb http://us.archive.ubuntu.com/ubuntu/ jammy-updates universe
deb http://us.archive.ubuntu.com/ubuntu/ jammy multiverse
deb http://us.archive.ubuntu.com/ubuntu/ jammy-updates multiverse
deb http://us.archive.ubuntu.com/ubuntu/ jammy-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu jammy-security main restricted
deb http://security.ubuntu.com/ubuntu jammy-security universe
deb http://security.ubuntu.com/ubuntu jammy-security multiverse

View File

@ -0,0 +1,8 @@
## Debian 8
deb http://deb.debian.org/debian/ jessie main contrib non-free
deb-src http://deb.debian.org/debian/ jessie main contrib non-free
deb http://security.debian.org/debian-security jessie/updates main contrib non-free
deb-src http://security.debian.org/debian-security jessie/updates main contrib non-free
deb http://deb.debian.org/debian/ jessie-updates main contrib non-free
deb-src http://deb.debian.org/debian/ jessie-updates main contrib non-free

View File

@ -0,0 +1,8 @@
## Debian 9
deb http://deb.debian.org/debian/ stretch main contrib non-free
deb-src http://deb.debian.org/debian/ stretch main contrib non-free
deb http://security.debian.org/debian-security stretch/updates main contrib non-free
deb-src http://security.debian.org/debian-security stretch/updates main contrib non-free
deb http://deb.debian.org/debian/ stretch-updates main contrib non-free
deb-src http://deb.debian.org/debian/ stretch-updates main contrib non-free

View File

@ -0,0 +1,5 @@
# Lista de APT sources.list
Ubuntu 14, 16, 18.04, 20.04, 20.10, 21.04, 21.10, 22.04
Debian 8, 9, 10, 11

View File

@ -0,0 +1 @@
2.1h

View File

@ -0,0 +1,4 @@
\e[1;31m Vercion: \e[32m2.1h\e[97m
- Fix Install Psiphond
####