论坛: 黑客进阶 标题: 如何发现和防范内部网络的非法代理服务器~~ZT 复制本贴地址    
作者: tuzi [tuzi]    版主   登录
一些ISP和一些单位,需要限制内部网络的某些机器不能访问Internet,这时,一些能够访问Internet的机器会架设一台代理服务器或者NAT来让一些非法用户访问Internet,这篇文章,就是说明如何从技术角度来侦测(或者反侦测)这些非法的代理服务器或者NAT。

首先,得区分两个概念:
Proxy和NAT
这两个概念都搞不明白的,偶想最好还是先找点相关资料看看再来看这篇文章

本来是不想取这么个名字的,代理服务器,概念太大了,HTTP Proxy/FTP Proxy/SMTP Proxy/Telnet Proxy/Socks Proxy等等等等...
xxbin经常用的代理,其实也就是HTTP Proxy,下面将会针对如何发现内部网络的非法HTTP Proxy来进行分析。(第一部分的文章的标题似乎改成如何发现内部网络的非法HTTP代理服务器更合适  不过还是保留这个标题吧,哪天知道其它协议的Proxy的检测方法也可以继续写在这里了。)


如何发现非法HTTP代理服务器?
1) 流量监控
若是有条件的话,进行流量监控是个不错的选择,代理别人的机器,其流量会比一般机器的平均流量大几倍,从流量,可以发现可疑的用户,不过,仅仅根据流量,你是没有证据说他用了代理软件的,碰上一些有资历的或者刁蛮的用户,你反而会吃不了兜着走的说。 

2) 端口扫描
开一个nmap或者你所喜欢的端口扫描器,对某些网段进行端口扫描,然后再在扫描的结果中人工寻找可疑目标,比如哪些8080/3128什么的端口,多半是HTTP Proxy,最后再用代理猎手来确认,或者自己利用HTTP协议来手工确认(use telnet or netcat )。
不过,端口扫描仅仅是对菜鸟有用,高手会把自己的端口改成一个很怪异很高数值的端口(谁会愿意每隔一段时间去扫描几个网段的IP的1-64K的端口?),甚至,他还可以把代理服务器的端口仅仅开在他的内部IP上(就是那个接其它需要非法上网机器的非法IP),这样你从你的内部网络,是不可能用通常手段扫描到他的内部IP到底开了哪些端口的。

3) SNIFFER
以上的两个方法对侦测HTTP Proxy都不是太有效,不得已,我们可能需要从HTTP协议本身来下手分析某个HTTP请求是否用了非法的代理服务器。为了分析HTTP协议,首先要做的就是SNIFFER,若你真的是网络管理员,偶想你是有N个办法来搞到某个IP对外的HTTP请求甚至是整个内部网络所有的对外的HTTP请求(偶的建议是Internet出口采用Linux+IPTables+Squid来做一个透明代理服务器+防火墙,并且可以利用tcpdump来sniffer  当然你也可以选择你所喜欢的方法)。

首先来看看标准的HTTP协议,HTTP协议分HTTP请求和HTTP应答两部分,在通常的情况下,HTTP请求由浏览器发出,而HTTP应答是由HTTP Server来发出。
用telnet可以非常简单的模拟出这个过程:
telnet www.netbuddy.org 80 (然后在TELNET窗口里面输入)
GET / HTTP/1.1
Host: www.netbuddy.org

最后跟两个回车

以上就是HTTP请求部分,接着偶们的telnet窗口就会显示这个HTTP请求的应答:
HTTP/1.1 200 OK
Date: Fri, 28 Nov 2003 17:40:18 GMT
Server: Apache/2.0.47
Last-Modified: Tue, 02 Sep 2003 13:12:50 GMT
Accept-Ranges: bytes
Content-Length: 755
Content-Type: text/html; charset=GB2312

<html><head><title>NetBuddy.Org首页</title></head>
...

通常,一般的浏览器(IE or Mozilla)都不会提交象偶上面这么简单的HTTP请求的,它还会把一些有关信息包括进去,比如浏览器的版本以及操作系统版本,(User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0),这样HTTP服务器就可以得到更多的客户端的信息,偶们监听这个HTTP会话的话,也可以看到这些信息。

HTTP客户端(浏览器)通过HTTP Proxy来访问某个HTTP服务器的过程大概如下:

       HTTP请求->                     HTTP请求->
HTTP Client ------------------ HTTP Proxy (更改某些HTTP头部信息) ------------------- HTTP Server
       <-HTTP应答                     <-HTTP应答

HTTP Proxy基本上会做一个中间人的位置,以自己的身份向HTTP服务器发起请求,这个HTTP请求的主要内容来自HTTP Client发给HTTP Proxy的请求,但是某些细节可能会有改变,HTTP Proxy甚至会加一些信息进去(怎么样,是不是眼前一亮啊?这就是偶们的机会了)。

OK,确定我们的方向,只要发现某个HTTP请求中有HTTP Proxy加进去的信息,那么我们就可以判断某个IP是HTTP Proxy了,甚至可以判断出真正提交这个HTTP请求的非法用户的真实IP。
HTTP Proxy何其多啊,xxbin熟悉的只有Linux/UNIX下著名了squid和M$ ISA Server(原来的M$ Proxy)中带的HTTP Proxy,偶只能针对这两个HTTP Proxy来讨论,下面的方法,对其它的HTTP Proxy是否适应,偶没有条件测试不了。  而且下面所描述的协议的细节,并不是RFC中的规范,仅仅是针对某几个产品的一些特性。  (不过HTTP Proxy,这两大巨头是占了相当市场份额的,还算是有点代表性的说)

通常,HTTP Proxy会更改或者添加以下的HTTP请求变量:
REMOTE_ADDR
HTTP_VIA
HTTP_X_FORWARDED_FOR

当没有使用HTTP Proxy的时候,这几个变量的值应该如下:
REMOTE_ADDR: HTTP Client(浏览器)所在机器的IP
HTTP_VIA: 无定义,也就是说不会在HTTP请求中出现
HTTP_X_FORWARDED_FOR: 无定义,同上

当你使用了普通配置的HTTP Proxy的时候,这几个变量就变成下面的样子了:
REMOTE_ADDR: HTTP Proxy's IP (不变的话就容易判断了,呵呵)
HTTP_VIA: HTTP Proxy's IP or HTTP Proxy' ServerName或HTTP协议版本号或HTTP Proxy版本信息(有什么办法呢,这可没有RFC定义的说,不同的厂商做出来的HTTP Proxy这个字段的东东是不一样的说)
HTTP_X_FORWARDED_FOR: HTTP Client(浏览器)所在机器的IP (Squid使用,ISA不支持此字段)

其实分析到这里,偶们的目的已经可以实现了。
只要发现某个HTTP请求头部带有HTTP_VIA或HTTP_X_FORWARDED_FOR,那么这个发起HTTP请求的IP必定是个HTTP Proxy。OK,知道IP就好办了,接下去的事情~~~罚款!!!

4) 针对HTTP请求分析的其它变通办法
可能有人会觉得监听HTTP请求是件很困难和复杂的事情,那么有没有其它的变通办法呢?当然有。
一是可以利用IDS系统,若是Internet出口处放置了IDS设备,那么可以让它针对内部网络进行侦测,一旦发现内部网络发起的HTTP请求头中有那两个变量,就发出告警信息。 (怎么配置不要问偶啊,问厂商或者集成商吧。  )
二是可以利用你们内部的某个网站的日志来记录那些非法代理,假设你的内部网络中有一台谁都要上的内部的WEB服务器(现在B/S结构流行,找这么个东东容易吧?),再假设这台HTTP服务器是Apache架设的(呵呵,假设太多了是不,偶不是很熟悉IIS的日志怎么实现这个,说白了是不喜欢M$),编辑你的httpd.conf,加入下面一行:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{HTTP_X_FORWARDED_FOR}e\" \"%{HTTP_VIA}e\"" proxy-log

然后再把你的网站的日志格式改成这个proxy-log格式,即修改CustomLog logs/access_log这一行为

CustomLog logs/access_log proxy-log

然后重启apache服务,然后就可以看你的日志了,若是发现最后两个变量有东西的,那么这条记录最前面那个IP必定是个HTTP Proxy,日志的范例如下:

192.168.1.1 - - [28/Nov/2003:17:43:14 +0800] "GET /phpinfo.php HTTP/1.0" 200 41339 "10.1.1.2" "192.168.1.1 (Squid/2.4.STABLE7)"
192.168.1.2 - - [28/Nov/2003:22:47:54 +0800] "GET /phpinfo.php HTTP/1.0" 200 2962 "-" "-"
192.168.1.3 - - [28/Nov/2003:23:00:02 +0800] "GET /phpinfo.php HTTP/1.0" 200 37561 "-" "1.0 ISA-SERVER"

很容易可以看出第一条记录是某个非法的用户(IP地址为10.1.1.2,其实这个地址要来没有太大用处),利用了外部地址是192.168.1.1的这台HTTP Proxy(版本信息:Squid/2.4.STABLE7)来访问这台服务器的某个网页,192.168.1.1这台机器是HTTP代理  呵呵,被发现了吧!
第二条记录是没有问题的;
第三条记录可以看出是代理服务器IP是192.168.1.3,有可能用的是ISA。

另外一个变通的方法是利用CGI脚本或者其它的HTTP服务器端的程序来判断HTTP_VIA等变量,以此判断客户端是否是非法代理。范例脚本如下(PHP写的,呵呵):
CODE 
<?php

if ( $GLOBALS[HTTP_VIA] == "" ) {
echo "User Proxy is Not Available <br>";
}
else {
echo "User Proxy: $GLOBALS[HTTP_VIA] <br>";
echo "Proxy Server's IP: $GLOBALS[REMOTE_ADDR] <br>";
$yourip = isset($GLOBALS[HTTP_X_FORWARDED_FOR]) ? $GLOBALS[HTTP_X_FORWARDED_FOR]: "Unknown. are you use a M$ ISA Server?";
echo "Your IP: $yourip";
}

?>


你可以改改这个脚本,让它把信息记录到文本文件中,然后伪装成图片(象bug签名那种)或者用其它的形式包含到一个你的内部网用户都要访问的一个内部网页里面去。

5) 防范措施
对于高校的网管,偶的建议是在Internet出口采用Linux+IPTables+Squid来做一个透明代理服务器+防火墙,并用iptables对HTTP协议进行内容过滤,发现头部有HTTP_VIA什么的就DROP掉。

6) 其它补充
上面所描述的任何一种方式,都需要很多条件来实现,而且只能针对HTTP代理。而且那个针对HTTP协议细节的检测方法必须是HTTP代理所代理的那些客户端向外或者向你的内部站点发起请求之后,才能得到我们所要的信息。
除了上面偶说的那两个HTTP变量,当下面的变量出现在HTTP请求头部的时候,这个HTTP请求多半是HTTP Proxy发起的了。
HTTP_VIA, HTTP_X_FORWARDED_FOR, HTTP_USER_AGENT_VIA, HTTP_CACHE_CONTROL, HTTP_CACHE_INFO, HTTP_PROXY_CONNECTION
另外根据国外的资料,Netscape Proxy Server会增加一个名叫HTTP_PROXY_USER 的变量,其值为Client的真实IP地址。xxbin几年前调过这个代理服务器,因为在AIX平台上跑得不稳定,就换成Squid了,所以也就没有测试环境来检测这个说法是否正确,哪位有条件的可以测试一下。

上文是对HTTP代理检测的一个总结,具有非常强的针对性――仅仅针对管理大型内部网络的网络管理员,而且是那些不怕麻烦的管理员。另外,友情提醒一下,光靠技术是不行的,行政手段要跟上,技术仅仅只能是做为实施行政手段的一个有效的方法。





地主 发表时间: 12/19 14:17

回复: yanhui [yanhui]   论坛用户   登录

看到,你可真是个电脑痴

版主释:请不要将自己的头衔扣到别人头上,以免引上不必要的误会。另,谁将宠物到处乱放,请快领回!!!

[此贴被 TomyChen(quest) 在 07月19日22时24分 编辑过]

B1层 发表时间: 04-07-18 03:01

回复: TomyChen [quest]   版主   登录
已经发起一个警告了。自重

B2层 发表时间: 04-07-19 22:20

论坛: 黑客进阶

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号