浅析反向代理

转载自公众号:alisrc

最近这段时间频频接触到反代的东西,所以就更进一步的了解了一番, 有什么不对的地方还请大佬们指正~本文需要用到的代码已上传Github

本文涉及到的东西仅供技术研究,请勿用于非法用途,否则后果自负。

前言

最近把博客重新弄了一下,发现了一个特别有意思的东西,看图~

image

还有一些有意思的东西,比如反代谷歌(谷歌镜像站)、钓鱼、绕过国内备案和线下CTF中的一些骚操作,等等。

简介

反向代理,简而言之就是反向代理服务器从目标内容服务器上抓取内容返回给用户,反向代理服务器充当一个中介功能,他本身是没有任何内容的。

区别于正向代理而言,反向代理是代理的服务端,而正向代理是代理的客户端。

image

再来简单介绍一下我在前言中所说的我让我的博客ip是如何变成1.1.1.1的,其实1.1.1.1是一台DNS服务器(号称全球最快的DNS),正好1.1.1.1又是cf cdn中的一个节点。

这样我们就可以将域名解析到1.1.1.1,然后在cf中设置好真实的回源地址即可。在文末已附上教程链接,感兴趣的可以玩玩~

一些有意思的东西

除了上述所说的套一个CDN,让自己ip变成1.1.1.1来隐藏自己站点ip,还有一些其他好玩的~

CTF线下中的一些思路

因为我们线下赛中每支队伍的web站点都一样,笔者在之前的一次线下训练赛的时候尝试过修改apache配置文件来反代分数最高的队伍的站点,从而达到流量转发(伤害转移)的效果。这个具体能不能实现得看服务器的权限能提升到多高,其次也得根据具体的check机制来灵活使用。如果提升的权限不够高的话,也可以配置.htaccess来实现反代。用tcpdump倒流量顺手抓一波别人的payload。

如果我们采用的是.htaccess方法进行反向代理,这里说一下这种方法的原理和其他的不同在于它本质上是利用.htaccess映射到一个php文件,然后利用php文件去抓取目标服务器的信息返回给客户端。这里.htaccess配置的作用是重写url。所以我们不妨在这个php文件中包含一下这个demo1.php即可达到payload的记录的效果:

代码如下:

demo1.php

<?php
write_log();

function get_http_raw() {
    $raw = '';

    $raw .= $_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']."rn";

    foreach($_SERVER as $key => $value) {
        if(substr($key, 0, 5) === 'HTTP_') {
            $key = substr($key, 5);
            $key = str_replace('_', '-', $key);
            $raw .= $key.': '.$value."rn";
        }
    }
    $raw .= "rn";
    $raw .= file_get_contents('php://input');
    return $raw;
}


function write_log(){
    $data = date("Y/m/d H:i:s")."rn".get_http_raw()."rnrn";
    $file = fopen('log1.txt', 'a'); //日志路径
    fwrite($file, $data);
    fclose($file);

}

记录如下:

image

克隆网站 —中间人攻击

我们可以安装一个nginx的第三方模块ngx_http_substitutions_filter_module,然后nginx的配置文件中加入一段,即可弹窗等。

subs_filter </head> "<script>alert('1');</script></head>";

location部分的配置如下:

image

这里有个坑弄了我好久… 就是我们请求网站的时候,数据包头部一般会有Accept-Encoding部分,如下图所示,这个部分告诉服务器,客户端能以怎样的形式解码。

那么问题来了,数据包是压缩的,我们怎样才能用subs_filter 替换其中的内容呢? 其实正像上面截图的配置那样设置:反代服务器请求上游服务器的时候带上Accept-Encoding=‘ ’ 即可,表示不接受任何压缩数据。

image

访问http://a.cuit.store,效果如下:

image

这样如果我们反代一个登录页面,比如qq空间,然后植入我们的js脚本,后果emmm…
当然了,不同站的反代难度是不一样的~

绕过网站所有权验证,调用在线的云扫描器给我们需要渗透的网站进行扫描

以人人扫这个云扫描平台为例:

http://www.renrenscan.com/, 其中需要我们把一个认证文件放到网站根目录上,我们可以设置反代规则的时候,对这个文件进行排除,不进行代理即可绕过,或者直接用.htaccess的方法进行反代就行。

image

这样我们只需要等待扫描结果,即可get目标站的漏洞了~

如果我们再邪恶一点….顺便也可以包含上demo1.php,把这些扫描的payload都导出来下来(手动滑稽)

ps:这里说点其他的,我发现在给我博客加cdn的时候,发现了如下图所示的这个,因为我用的是cloudflare免费版的套餐,可以看到有很多请求没有经过CDN处理就直接回源了,这就可以让我们想到如果我们渗透的站点是套了CDN的,常规的找邮件服务器,静态文件,ssrf啥的如果都不管用,还不如来点简单粗暴的,暴力发包让CDN承受不住而回源,这样真实ip’轻松’get~

image

反向代理不当

一般当我们遇到了反代服务器的时候,可以试着用burpsuite的repeat功能,设置host为反代服务器,然后把http请求中的路径改为内网中的host(一般需要穷举,穷举网段ip端口域名等等)。

因为反向代理的本质就是将客户端的请求url重写后发往上游服务器,将返回结果发回客户端,在这之中,如果对路径的配置不当就有可能导致反向代理变正向代理导致一些信息泄露,内网穿透等等漏洞。

image

参考:

1、内网穿透代理洞

https://bbs.ichunqiu.com/thread-36628-1-1.html

2、谷歌内部主机信息泄露漏洞

https://www.freebuf.com/vuls/143959.html

3、挖洞经验之代理不当日进内网

https://paper.tuisec.win/detail/b6d9381e54b0778

4、还有一种就是nginx为Django做反代的时候,静态文件配置错误导致源码泄露

https://www.leavesongs.com/PENETRATION/nginx-insecure-configuration.html#_1

如何防止被反向代理

反向代理不仅会对用户造成威胁,而且对服务器来说也会增强负载,还有就是通过代理的方式盗取网站数据,还有就是seo相关的影响了等等…

通过js防止反代:如果地址栏的网址不是www.passer6y.fun那么就进行跳转。

<script type="text/javascript">
if (document.domain !='www.passer6y.fun'){
 window.location.href='http://www.passer6y.fun/';
}
</script>

其实这种方法还是可以绕过的,nginx有扩展模块可以将指定的字符进行替换,这时我们只需将target域名替换成我们自己的就行了(上文有说到如何替换)。或者直接不代理这个js文件也行。

php

<?php 
if($_SERVER['SERVER_NAME'] != 'www.passer6y.fun' )   
{  
header('Location: http://www.passer6y.fun/');
}  
?>

.htaccess

RewriteEngine On
    RewriteBase /
    php_value auto_append_file proxy.php

proxy.php

<?php
        $f = getenv(“HTTP_X_FORWARDED_FOR”);
        $server = getenv(“HTTP_HOST”);
        if (($f!=””)&&($server!=”www.passer6y.fun”){
            echo ‘本服务器禁止恶意反向代理!’;
        }

    ?>

Apache 反代配置方法

1. windows下

修改配置文件:Apacheconfhttpd.conf,将以下两个前面的注释符去掉。

#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_http_module modules/mod_proxy_http.so

然后新增一个Apacheconfvhosts.conf文件

<VirtualHost *:80>

        ServerAdmin admin   # 域名信息

        ServerName passer6y.cn # 邮件信息

        ProxyRequests Off  

        <Proxy *>

        Order deny,allow

        Allow from all

        </Proxy>

        ProxyPass / http://passer6y.cn/ # 将一个远端服务器映射到本地服务器的URL空间

        ProxyPassReverse / http://passer6y.cn/ # 调整由反向代理服务器发送的HTTP回应头中的URL。

    </VirtualHost>

2. linux下

参考:https://www.leaseweb.com/labs/2014/12/tutorial-apache-2-4-transparent-reverse-proxy/
测试环境:Ubuntu 16.04,apache2
加载”proxy_http”模块:

sudo a2enmod proxy_http
sudo service apache2 restart

在/etc/apache2/sites-available/下,修改配置:

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyPass / http://192.168.83.1/  # 指定根URL(/)下的内容映射到给定地址的后端服务器
    ProxyPassReverse / http://192.168.83.1/  
</VirtualHost>
~

重启apache生效配置:

sudo service apache2 reload
sudo service apache2 restart

3.htaccess配置反向代理

这种方法配置反向代理准确的说是php反向代理,我们通过.htaccess中配置一些重写规则,然后把请求映射到一个php文件中,这个php帮我们请求上游服务器的内容,然后将上游服务器的返回的内容获取回来发回客户端。这种配置反代的好处是所需权限比较小,但是也有很多弊端,随着网站的复杂度,我们所写的抓取页面的php脚本难度就不大一样了。

Github上放了3个php反代脚本的demo,使用说明也见里面的readme即可。

nginx 反向代理

1. 简单反代

Nginx核心配置文件nginx.conf:

server {
        listen       80;   # 监听端口(web服务端口)
        server_name  localhost;  # 当前服务的域名,这里是本地测试

        location / {   # 这里的/ 表示把服务器的根目录反代到www.baidu.com的根目录。
            proxy_pass http://www.baidu.com;
            proxy_redirect default;
        }
}

2. 实例:反代Google

测试环境:cent os7
条件准备:一个域名,OneinStack一键安装lnmp,Let’s Encrypt 的ssl证书

接下来编辑nginx下的主机配置文件:/usr/local/nginx/conf/vhost/

image

然后在最后插入:

location / {  
    proxy_set_header  Host  "www.google.com";
    proxy_set_header  User-Agent $http_user_agent;
    proxy_set_header  Connection "";
    proxy_http_version 1.1;
    proxy_pass https://www.google.com;
}

检测Nginx配置是否正确:

[root@vultr vhost]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

重载Nginx服务:

[root@vultr vhost]# service nginx reload
Reloading nginx configuration (via systemctl):             [  OK  ]

打开google.cuit.store,成功~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容