#!/bin/bash #xderm_mini2021_stable1 injek () { sni=$(grep sni= config.txt|awk -F "=" '{print $2}') echo "#!/usr/bin/python import re import ssl import time import json import random import select import datetime import socket import threading import os import sys class server_tunnel(threading.Thread): def __init__(self, socket_accept, force_tunnel_type=None, external=False, quiet=False): super(server_tunnel, self).__init__() self.socket_client, (self.client_host, self.client_port) = socket_accept self.force_tunnel_type = force_tunnel_type self.external = external self.quiet = quiet self.server_name_indication = '$sni' self.tunnel_type = '' self.proxies = [] self.payload = '' self.config = {} self.do_handshake_on_connect = True self.buffer_size = 65535 self.timeout = 3 self.daemon = True def extract_client_request(self): self.client_request = self.socket_client.recv(self.buffer_size).decode('charmap') result = re.findall(r'(([a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+):([0-9]+))', self.client_request) result = result[0] if len(result) else '' self.host, self.port = result[1], int(result[3]) return True def handler(self): sockets = [self.socket_tunnel, self.socket_client] timeout = 0 self.socket_client.sendall(b'HTTP/1.0 200 Connection established\r\n\r\n') while True: timeout += 1 socket_io, _, errors = select.select(sockets, [], sockets, 3) if errors: break if socket_io: for socket in socket_io: try: data = socket.recv(self.buffer_size) if not data: break if socket is self.socket_tunnel: self.socket_client.sendall(data) elif socket is self.socket_client: self.socket_tunnel.sendall(data) timeout = 0 except: break if timeout == 30: break def konek(self): try: print('Soket disentuh oleh ' +self.host) self.socket_tunnel.connect((self.host, int(self.port))) self.socket_tunnel = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2).wrap_socket(self.socket_tunnel, server_hostname=self.server_name_indication, do_handshake_on_connect=self.do_handshake_on_connect) self.handler() except OSError: print('Error: Connection closed.') finally: self.socket_tunnel.close() self.socket_client.close() def run(self): self.socket_tunnel = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket_tunnel.settimeout(self.timeout) if not self.extract_client_request(): self.socket_tunnel.close() self.socket_client.close() return self.konek() class server(threading.Thread): def __init__(self, inject_host_port, force_tunnel_type=None, external=False, quiet=False): super(server, self).__init__() self.inject_host, self.inject_port = self.inject_host_port = inject_host_port self.socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.force_tunnel_type = force_tunnel_type self.external = external self.quiet = quiet self.daemon = True def run(self): try: self.socket_server.bind(self.inject_host_port) self.socket_server.listen(True) while True: try: server_tunnel(self.socket_server.accept(), self.force_tunnel_type, self.external, self.quiet).start() except KeyboardInterrupt: pass except OSError: print('Inject not running!') def main(): print('Inject Started on 8789.') server(('127.0.0.1', 8789), external=True, quiet=False).run() if __name__ == '__main__': main()" > /tmp/xderm.py echo -e "{$(date +%M:%S)} Menjalankan Inject..." >> screenlog.0 screen -dmS injek python3 /tmp/xderm.py*;sleep 1;rm -rf /tmp/xderm.py* } routing () { mode=$(grep mode= config.txt|awk -F "=" '{print $2}') if [ $mode -eq 0 ]; then host=$(grep host= config.txt|awk -F "=" '{print $2}') else port=$(grep vmess: config.txt 2>/dev/null|awk -F "//" '{print $2}'|base64 -d 2>/dev/null|awk -F '"port' '{print $2}'|awk -F ',' '{print $1}'|sed -e 's/://g' -e 's/ //g' -e 's/"//g') if [ -f $port ]; then echo "Akun vmess belom disetting!" >> screenlog.0;cp screenlog.0 log/log.txt 2>/dev/null;exit fi host=$(grep vmess: config.txt 2>/dev/null|awk -F "//" '{print $2}'|base64 -d 2>/dev/null|awk -F '"add' '{print $2}'|awk -F ',' '{print $1}'|sed -e 's/://g' -e 's/ //g' -e 's/"//g') fi ifaces=$(ip r|grep default|awk '{print $3}') if [ ! -f $(echo $ifaces|awk -F "." '{print $2}') ]; then if [ $(echo $ifaces|awk -F "." '{print $4}'|wc -c) != "2" ]; then ipg=$(ip r|grep default|awk '{print $3}');ifaces=$(ip r|grep default|awk '{print $5}') ip route add $host dev $ifaces via $ipg 2>/dev/null ip route add 8.8.8.8 $ifaces via $ipg 2>/dev/null route del default;ip route add default dev $ifaces via $ipg metric 1 2>/dev/null else type=gw;route add $host $type $ifaces 2>/dev/null route add 8.8.8.8 $type $ifaces 2>/dev/null route del default;route add default $type $ifaces metric 1 2>/dev/null fi else type=dev;route add $host $type $ifaces 2>/dev/null route add 8.8.8.8 $type $ifaces 2>/dev/null route del default;route add default $type $ifaces metric 1 2>/dev/null fi } flush () { echo -e "{$(date +%M:%S)} Membersihkan sisa sisa...." >> screenlog.0;sleep 1 killall -q sshpass openvpn autorekonek;killall -q v2ray kill $(ps w|grep python3|grep xderm.py|awk "NR==1"|awk '{print $1}') 2>/dev/null kill $(ps w|grep badvpn|grep tun|awk "NR==1"|awk '{print $1}') 2>/dev/null;sleep 1 host=$(grep host config.txt|awk -F "=" '{print $2}') route del $host 2>/dev/null;route del 8.8.8.8 2>/dev/null if [ -f $(base64 --help 2>/dev/null|awk "NR==2"|awk '{print $1}') ]; then echo "Paket base64 belom terinstall. install dulu!" >> screenlog.0 cp screenlog.0 log/log.txt 2>/dev/null;exit fi host=$(grep vmess: config.txt 2>/dev/null|awk -F "//" '{print $2}'|base64 -d 2>/dev/null|awk -F '"add' '{print $2}'|awk -F ',' '{print $1}'|sed -e 's/://g' -e 's/ //g' -e 's/"//g');route del $host 2>/dev/null } update () { url="https://raw.githubusercontent.com/ryanfauzi1/xderm-mini_GUI/main" echo -ne "{$(date +%M:%S)} Checking for update..." >> screenlog.0 sleep 4 v=$(curl -m21 $url/xderm-mini -s|grep "Current versi"|awk "NR==2"|awk '{print $6}') if [ ! -f $v ]; then if [ "$v" != "1.0" ]; then echo -e " (Memperbarui..)" >> screenlog.0;sleep 1 wget -O /www/xderm/xderm-mini $url/xderm-mini -q;chmod +x /www/xderm/xderm-mini wget -O /www/xderm/index.php $url/index.php -q echo -e "{$(date +%M:%S)} Script & GUI diUpdate, Silahkan Start Ulang!" >> screenlog.0 else echo " (Terbaru!)" >> screenlog.0;sleep 1 fi else echo " (no koneksi!)" >> screenlog.0 echo -e "{$(date +%M:%S)} Update Gagal, Terjadi Masalah Pada DNS" >> screenlog.0 fi echo -e "{$(date +%M:%S)} Selesai." >> screenlog.0;exit } start () { ######################### if [ -f $(grep mode= config.txt|awk -F "=" '{print $2}') ]; then echo "mode=0" >> config.txt fi pudp=$(grep pudp= config.txt 2>/dev/null|awk -F "=" '{print $2}') sni=$(grep sni= config.txt 2>/dev/null|awk -F "=" '{print $2}') mode=$(grep mode= config.txt|awk -F "=" '{print $2}') if [ -f $(badvpn-tun2socks -version 2>/dev/null|awk '{print $1}'|awk "NR==1") ]; then echo -e "Paket badvpn-tun2socks belom terinstall. install dulu!" >> screenlog.0 cp screenlog.0 log/log.txt 2>/dev/null;exit fi if [ $mode -eq 1 ]; then if [ -f $(v2ray -version 2>/dev/null|awk '{print $1}'|awk "NR==1") ]; then echo "Paket V2Ray belom terinstall. install dulu!" >> screenlog.0 cp screenlog.0 log/log.txt 2>/dev/null;exit fi if [ -f $(base64 --help 2>/dev/null|awk "NR==2"|awk '{print $1}') ]; then echo "Paket base64 belom terinstall. install dulu!" >> screenlog.0 cp screenlog.0 log/log.txt 2>/dev/null;exit fi flush;ssa=8;echo -e "{$(date +%M:%S)} Mode yang dipilih: $mode" >> screenlog.0 port=$(grep vmess: config.txt 2>/dev/null|awk -F "//" '{print $2}'|base64 -d 2>/dev/null|awk -F '"port' '{print $2}'|awk -F ',' '{print $1}'|sed -e 's/://g' -e 's/ //g' -e 's/"//g') if [ -f $port ]; then echo "Akun vmess belom disetting!" >> screenlog.0;cp screenlog.0 log/log.txt 2>/dev/null;exit fi mkdir -p /usr/local/etc/v2ray/ uuid=$(grep vmess: config.txt 2>/dev/null|awk -F "//" '{print $2}'|base64 -d 2>/dev/null|awk -F '"id' '{print $2}'|awk -F ',' '{print $1}'|sed -e 's/://g' -e 's/ //g' -e 's/"//g') host=$(grep vmess: config.txt 2>/dev/null|awk -F "//" '{print $2}'|base64 -d 2>/dev/null|awk -F '"add' '{print $2}'|awk -F ',' '{print $1}'|sed -e 's/://g' -e 's/ //g' -e 's/"//g') aid=$(grep vmess: config.txt 2>/dev/null|awk -F "//" '{print $2}'|base64 -d 2>/dev/null|awk -F '"aid' '{print $2}'|awk -F ',' '{print $1}'|sed -e 's/://g' -e 's/ //g' -e 's/"//g') net=$(grep vmess: config.txt 2>/dev/null|awk -F "//" '{print $2}'|base64 -d 2>/dev/null|awk -F '"net' '{print $2}'|awk -F ',' '{print $1}'|sed -e 's/://g' -e 's/ //g' -e 's/"//g') path=$(grep vmess: config.txt 2>/dev/null|awk -F "//" '{print $2}'|base64 -d 2>/dev/null|awk -F '"path' '{print $2}'|awk -F ',' '{print $1}'|sed -e 's/://g' -e 's/ //g' -e 's/"//g') echo "##############################################" >> screenlog.0 echo " Host: $host" >> screenlog.0 echo " Port: $port" >> screenlog.0 echo " ID: $uuid" >> screenlog.0 echo " Net: $net" >> screenlog.0 echo " Path: $path" >> screenlog.0 echo " Port UDPgw: $pudp" >> screenlog.0 echo "##############################################" >> screenlog.0 echo "{ \"policy\": null, \"log\": { \"access\": \"\", \"error\": \"\", \"loglevel\": \"none\" }, \"inbounds\": [ { \"tag\": \"proxy\", \"port\": 10808, \"listen\": \"127.0.0.1\", \"protocol\": \"socks\", \"sniffing\": { \"enabled\": false, \"destOverride\": [ \"http\", \"tls\" ] }, \"settings\": { \"auth\": \"noauth\", \"udp\": true, \"ip\": null, \"address\": null, \"clients\": null }, \"streamSettings\": null } ], \"outbounds\": [ { \"tag\": \"proxy\", \"protocol\": \"vmess\", \"settings\": { \"vnext\": [ { \"address\": \"$host\", \"port\": $port, \"users\": [ { \"id\": \"$uuid\", \"alterId\": $aid, \"email\": \"t@t.tt\", \"security\": \"auto\" } ] } ], \"servers\": null, \"response\": null }, \"streamSettings\": { \"network\": \"$net\", \"security\": \"tls\", \"tlsSettings\": { \"allowInsecure\": true, \"serverName\": \"$sni\" }, \"tcpSettings\": null, \"kcpSettings\": null, \"wsSettings\": { \"connectionReuse\": true, \"path\": \"$path\", \"headers\": { \"Host\": \"$sni\" } }, \"httpSettings\": null, \"quicSettings\": null }, \"mux\": { \"enabled\": true, \"concurrency\": 8 } }, { \"tag\": \"direct\", \"protocol\": \"freedom\", \"settings\": { \"vnext\": null, \"servers\": null, \"response\": null }, \"streamSettings\": null, \"mux\": null }, { \"tag\": \"block\", \"protocol\": \"blackhole\", \"settings\": { \"vnext\": null, \"servers\": null, \"response\": { \"type\": \"http\" } }, \"streamSettings\": null, \"mux\": null } ], \"stats\": null, \"api\": null, \"dns\": null, \"routing\": { \"domainStrategy\": \"IPIfNonMatch\", \"rules\": [ { \"type\": \"field\", \"port\": null, \"inboundTag\": [ \"api\" ], \"outboundTag\": \"api\", \"ip\": null, \"domain\": null } ] } }" > /usr/local/etc/v2ray/config.json screen -dmS pimes v2ray -config /usr/local/etc/v2ray/config.json;routing echo -e "{$(date +%M:%S)} Menjalankan VMESS (di latarbelakang)...." >> screenlog.0;sleep 1 elif [ $(grep mode= config.txt|awk -F "=" '{print $2}') -eq 0 ]; then ssa=;host=$(grep host= config.txt|awk -F "=" '{print $2}') if [ -f $host ]; then echo -e "{$(date +%M:%S)} Config belom disetting !!" >> screenlog.0;sleep 1;exit 2>/dev/null fi port=$(grep port= config.txt|awk -F "=" '{print $2}') user=$(grep user= config.txt|awk -F "=" '{print $2}') pass=$(grep pass= config.txt|awk -F "=" '{print $2}') ######################### flush;killall -q timeout;ifaces=$(ip r|grep default|awk '{print $3}');routing echo -e "{$(date +%M:%S)} Mode yang dipilih: $mode" >> screenlog.0 echo "#!/bin/bash sleep 15;killall -q openssl" > /tmp/timeout;screen -dmS cb bash /tmp/timeout echo -ne "{$(date +%M:%S)} Menguji bug SNI... " >> screenlog.0 if [ -f $(echo "exit"|openssl 2>/dev/null) ]; then echo -e " tidak ada paket openssl, install dulu!" >> screenlog.0;cp screenlog.0 log/log.txt 2>/dev/null;exit fi sleep 2;supp=$(echo "QUIT"|openssl s_client -connect www.smadav.net:443 -servername $sni 2>/dev/null|grep supp|awk '{print $4}') if [ ! -f $supp ]; then echo "OK" >> screenlog.0 else echo "Closed!" >> screenlog.0;cp screenlog.0 log/log.txt 2>/dev/null;exit fi injek;echo "##############################################" >> screenlog.0 host=$(grep host= config.txt|awk -F "=" '{print $2}') echo " Host: $host" >> screenlog.0 echo " Port: $port" >> screenlog.0 echo " User: $user" >> screenlog.0 echo " Pass: ********" >> screenlog.0 echo " Port UDPgw: $pudp" >> screenlog.0 echo "##############################################" >> screenlog.0 echo -e "{$(date +%M:%S)} Menjalankan SSH (di latarbelakang)...." >> screenlog.0;sleep 1 screen -Logfile screenlog.1 -dmS xderm sshpass -p "$pass" ssh -oTCPKeepAlive=yes -oServerAliveInterval=180 -oServerAliveCountMax=2 -oStrictHostKeyChecking=no -CND 127.0.0.1:1080 -p $port $user@$host -o "Proxycommand=corkscrew 127.0.0.1 8789 %h %p";sleep 2 echo -ne "{$(date +%M:%S)} Menguji Koneksi... " >> screenlog.0;n=1 while true; do r=$(curl -m4 google.com -w "%{http_code}" --proxy socks://127.0.0.1:1080 -s -o /dev/null) if [ $r -eq 301 ]; then echo '

HTTP/1.1 200 OK

' >> screenlog.0;break fi if [ $n -eq 17 ]; then echo "Not Connect!" >> screenlog.0 if [ ! -f $(grep Permission screenlog.1 2>/dev/null|awk '{print $4}') ]; then echo -e "{$(date +%M:%S)} Username/Password Salah/Kadaluarsa." >> screenlog.0 fi flush;echo -e "{$(date +%M:%S)} Berhenti." >> screenlog.0 cp screenlog.0 log/log.txt 2>/dev/null;exit fi ((n++));sleep 1 done echo -e "{$(date +%M:%S)} Menjalankan rekonek otomatis..." >> screenlog.0;sleep 1 echo "#!/bin/bash while true; do r=\$(curl -m71 google.com -w \"%{http_code}\" --proxy socks://127.0.0.1:1080 -s -o /dev/null);sleep 2 if [ \$r != 301 ]; then killall -q sshpass screen -dmS xdermr sshpass -p \"$pass\" ssh -oTCPKeepAlive=yes -oServerAliveInterval=180 -oServerAliveCountMax=2 -oStrictHostKeyChecking=no -CND 127.0.0.1:1080 -p $port $user@$host -o \"Proxycommand=corkscrew 127.0.0.1 8789 %h %p\";sleep 10 fi sleep 1 done" > /tmp/autorekonek;cd /tmp;chmod +x autorekonek screen -dmS auto ./autorekonek;sleep 2;rm -rf autorekonek fi cd /www/xderm 2> /dev/null ############################################################ echo -e "{$(date +%M:%S)} Menjalankan Badvpn-tun2socks...." >> screenlog.0;sleep 1 if [ -f $(iptables -t nat -L|grep MASQ|grep tcp|awk '{print $1}') ]; then iptables -A POSTROUTING --proto tcp -t nat -o tun0 -j MASQUERADE fi pudp=$(grep pudp config.txt|awk -F "=" '{print $2}') screen -dmS gerbang badvpn-tun2socks --tundev tun0 --netif-ipaddr 10.0.0.2 --netif-netmask 255.255.255.0 --socks-server-addr 127.0.0.1:1080$ssa --udpgw-remote-server-addr 127.0.0.1:$pudp --udpgw-transparent-dns --loglevel 0;sleep 4 ifconfig tun0 10.0.0.1 netmask 255.255.255.0 echo -e "{$(date +%M:%S)} Menggunakan $ifaces sebagai Pusat sumber." >> screenlog.0;sleep 1 echo -e "{$(date +%M:%S)} Routing Host, IP Gateway dan dns.." >> screenlog.0;sleep 1 route add default gw 10.0.0.2 metric 0;sleep 1 echo -e "{$(date +%M:%S)} Selesai." >> screenlog.0;cp screenlog.0 log/log.txt;exit } cf () { echo "#!/bin/bash #autostart #xderm while true; do def=\$(ip r|grep default|awk '{print \$1}') if [ ! -f \$def ]; then sleep 15;xderm-mini start;exit fi sleep 1 done" > /usr/bin/xderm-boot;chmod +x /usr/bin/xderm-boot } enable () { if [ ! -f $(grep xderm- /etc/rc.local|awk '{print $1}'|awk -F "-" '{print $1}') ]; then sed -i "s/$(grep xderm- /etc/rc.local)/screen -dmS autos xderm-boot/g" /etc/rc.local 2>/dev/null else sed -i "s/$(grep exit /etc/rc.local)/screen -dmS autos xderm-boot\nexit 0/g" /etc/rc.local 2>/dev/null fi cf } disable () { sed -i "s/$(grep xderm- /etc/rc.local)//g" /etc/rc.local 2>/dev/null sed -i ':a;N;$!ba;s/\n\n/\n/g' /etc/rc.local 2>/dev/null rm -rf /usr/bin/xderm-boot } case $1 in "start") start ;; "update") update ;; "enable") enable;echo -e "{$(date +%M:%S)} Autostart on boot Active Now..." >> screenlog.0;sleep 1;exit ;; "disable") disable;echo -e "{$(date +%M:%S)} Autostart on boot non-Active Now..." >> screenlog.0;sleep 1;exit ;; "stop") flush;echo -e "{$(date +%M:%S)} Selesai." >> screenlog.0;exit ;; esac echo -e " Current versi 1.0 Copyright ®2021" >> screenlog.0 echo -e " Openwrt Tunnel & Logika Bash Linux" >> screenlog.0