YES东 发表于 2006-4-16 00:38:30

[04.16] [转帖]如何发现和防范内部网络的非法代理服务器和NAT

简述:如何从技术角度来侦测(或者反侦测)内部网非法的代理服务器或者NAT

一些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&#36; ISA Server(原来的M&#36; 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&#36;),编辑你的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 - - "GET /phpinfo.php HTTP/1.0" 200 41339 "10.1.1.2" "192.168.1.1 (Squid/2.4.STABLE7)"
192.168.1.2 - - "GET /phpinfo.php HTTP/1.0" 200 2962 "-" "-"
192.168.1.3 - - "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写的,呵呵):
<?php
if ( &#36;GLOBALS == "" ) {
echo "User Proxy is Not Available <br>";
}
else {
echo "User Proxy: &#36;GLOBALS <br>";
echo "Proxy Server';s IP: &#36;GLOBALS <br>";
&#36;yourip = isset(&#36;GLOBALS) ? &#36;GLOBALS: "Unknown. are you use a M&#36; ISA Server?";
echo "Your IP: &#36;yourip";
}
?>
有兴趣的可以检测一下你是否用了代理。
http://www.netbuddy.org/tools/proxy-detect.php
你可以改改这个脚本,让它把信息记录到文本文件中,然后伪装成图片(象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代理检测的一个总结,具有非常强的针对性——仅仅针对管理大型内部网络的网络管理员,而且是那些不怕麻烦的管理员。另外,友情提醒一下,光靠技术是不行的,行政手段要跟上,技术仅仅只能是做为实施行政手段的一个有效的方法。
偶抛出这篇文章,仅仅想抛砖引玉,希望大家多多参与讨论,其实这个问题,是困扰网络管理员的一个非常头痛的问题。
另外有关NAT的检测,还是等到下一篇再说吧。 或者,谁把自己的玉拿出来给大家开开眼?
简述:如何从技术角度来侦测(或者反侦测)内部网非法的NAT

非法代理服务器藏身之道
所谓道高一尺,魔高一丈
处于"正义"的一方的网络管理员都是处于劣势的,那些用户们玩出一些新花招了,偶们管理员们才会想着去如何应付。
在非法代理服务器这个问题也是如此,其实,可以有多种办法来隐藏代理服务器。
==========================
关于NAT的检测,要做到自动检测,有点难度,这个时候要用上SNIFFER了。
可以根据一些特征来判断:
1 流量持续稳定,比较大。
2 一个流由四个部分组成:源IP,源端口,目标IP,目标端口。
当发现这样的流---源IP相同,而源端口很多,而且是持续增长的,目标IP很多,目标端口是80
可以推测,这个是经过NAT转换的流。
分析客户的能力,一般私立NAT的服务器都是WINDOWS,而软件用的最多的是SYGATE和WINROUTE等。如果是在局域网内部的话,一般有两个网卡、或者是两个IP。
在确定嫌疑目标后,可以对他做进一步的检测。
================================
真正的浏览网页所需要的带宽根本不大,你觉得你的流量限制会在多少呢?100k/sec?
如果是这样的话,高手可以限制自己的代理服务器的最高上限流量,加上WEB Cache,代动5-10台Client,是没有任何问题的。
================================
(错误的观点)


寻找代理服务器最简单的方法就是在本机上进行跟踪:(这里专指IP层的代理服务器,与NAT或PAT功能相似)
1. 进入DOS状态,用Ipconfig命令看自己的IP,如果是一个私有IP,则访问Internet必须经过NAT或PAT。
2. 跟踪路由线路,用tracert 命令来查看路由出访Internet的线路,如下:
C:\>tracert www.hzcnc.com -d
Tracing route to www.hzcnc.com
over a maximum of 30 hops:
1 <10 ms <10 ms <10 ms 218.108.255.91
2 <10 ms <10 ms 10 ms 218.108.253.249
3 <10 ms <10 ms <10 ms 218.108.254.201
4 <10 ms <10 ms <10 ms 218.108.253.90
5 <10 ms <10 ms <10 ms 218.108.254.34
6 <10 ms 10 ms <10 ms 218.108.250.243
Trace complete.
如果使用代理出去的,那么第一跳必定是一个私网IP,并且一般来讲就是那台代服务器。
接下来就是要找到这台代理服务器的位置,这就更简单了
1. ping 代理服务器IP
2. arp -a 找出代理服务器的MAC
3. 通知网管代理服务器的MAC
4. 确定代理服务器相应的接入端口
==========================
在什么环境下来发现代理服务器再来谈这些好么?
另外你对Proxy和NAT的概念的确没有搞清楚
===========================
代理和NAT的区别我认为在于做代理或NAT的设备在这个事情上的角色。代理完全切断内外的联系,代理的客户端是把请求发给代理服务器,由服务器向目标主机发起请求;而NAT则是网络设备把数据包中的地址进行了处理,NAT inside直接把请求发给目标主机。
客户端连接的不是目标服务器而是代理服务器,然后由代理服务器以自己的身份向真实的服务器发起请求,然后接收回应,最后再把回应送给Client
NAT和PROXY最主要的区别是从七层协议来看,NAT是网络层(3),PROXY是应用层(7),而且,连接在NAT处没有中断(仅仅是转换),而在PROXY处,连接是完全中断的。
================
10个SESSION算多也不算多,而且和你的Internet接入速度有关。
比若偶看网页通常同时开N个窗口,若是网络速度慢的话,可能这N个窗口都会同时在连接,算上图片什么的,就算一个窗口同时两个SESSION,那么你开的这10个SESSION,偶只能同时开5个窗口,偶不造反才怪呢。若是加上一些下载狂人,经常用多点并发下载工具的,呵呵,10个SESSION真的是不够哦。
从HTTP Proxy来看,最关键是在于其Cache的命中率,若是好朋友,上网的习惯都差不多,上的可能都是那几个网站,而且HTTP Proxy可以配置成在空闲的时间自己去某些网站抓网页,考虑上这些因素,并发10个SESSION或许能够带动5台要求不太苛刻的客户端。
再说了,你用FIREWALL来控制10个SESSION,若是超过了10个SESSION怎么办?直接DROP掉?那样你的领导会时不时问你——怎么一些网站的图片现在总是显示叉叉啊?
偶觉得SESSION和流量可以作为判断代理的一个手段,但是以此为限制或者证据,可能网管会惹上更多的麻烦。
========================
nat转化的话,,那么肯定两块以上的网卡,,
所以,可以第一步,先利用扫描mac地址的方法,找到
多于两个ip的机器?

=========================
可以使用网管软件来发现,最近使用SNMPc在客户那里安装的时候,就发现几个网段,客户说ip add不是他们的,很奇怪为什么会有,当时心里一惊,还以为是这个网管不行,后来发现全是下面做的代理,非法上网,私设的网段。

============================
页: [1]
查看完整版本: [04.16] [转帖]如何发现和防范内部网络的非法代理服务器和NAT