标题：中间人攻击
简介
中间人攻击（Man-in-the-Middle Attack, MITM）是一种由来已久的网络入侵手段，并且在今天仍然有着广泛的发展空间，如SMB会话劫持、DNS欺骗等攻击都是典型的MITM攻击。简而言之，所谓的MITM攻击就是通过拦截正常的网络通信数据，并进行数据篡改和嗅探，而通信的双方却毫不知情。
随着计算机通信网技术的不断发展，MITM攻击也越来越多样化。最初，攻击者只要将网卡设为混杂模式，伪装成代理服务器监听特定的流量就可以实现攻击，这是因为很多通信协议都是以明文来进行传输的，如HTTP、FTP、Telnet等。后来，随着交换机代替集线器，简单的嗅探攻击已经不能成功，必须先进行ARP欺骗才行。如今，越来越多的服务商（网上银行，邮箱登陆）开始采用加密通信，SSL(Secure Sockets Layer 安全套接层)是一种广泛使用的技术，HTTPS、FTPS等都是建立在其基础上的。笔者将以常见的Gmail邮箱登陆为例，探讨针对SSL的MITM攻击的两种实现方式。
攻击方式
中间人攻击（Man-in-the-MiddleAttack，简称“MITM攻击”）中间人攻击很早就成为了黑客常用的一种古老的攻击手段，并且一直到今天还具有极大的扩展空间。  黑客在网络安全方面，MITM攻击的使用是很广泛的，曾经猖獗一时的SMB会话劫持、DNS欺骗等技术都是典型的MITM攻击手段。在黑客技术越来越多的运用于以获取经济利益为目标的情况下时，MITM攻击成为对网银、网游、网上交易等最有威胁并且最具破坏性的一种攻击方式。信息篡改当主机A、和机B通信时，都由主机C来为其“转发”，如图一，而A、B之间并没有真正意思上的直接通信，他们之间的信息传递同C作为中介来完成，但是A、B却不会意识到，而以为它们之间是在直接通信。这样攻击主机在中间成为了一个转发器，C可以不仅窃听A、B的通信还可以对信息进行篡改再传给对方，C便可以将恶意信息传递给A、B以达到自己的目的。信息窃取当A、B通信时，C不主动去为其“转发”，只是把他们的传输的数据备份，以获取用户网络的活动，包括账户、密码等敏感信息，这是被动攻击也是非常难被发现的。
实施中间人攻击时，攻击者常考虑的方式是ARP欺骗或DNS欺骗等，将会话双方的通讯流暗中改变，而这种改变对于会话双方来说是完全透明的。以常见的DNS欺骗为例，目标将其DNS请求发送到攻击者这里，然后攻击者伪造DNS响应，将正确的IP地址替换为其他IP，之后你就登陆了这个攻击者指定的IP，而攻击者早就在这个IP中安排好了一个伪造的网站如某银行网站，从而骗取用户输入他们想得到的信息，如银行账号及密码等，这可以看作一种网络钓鱼攻击的一种方式。对于个人用户来说，要防范DNS劫持应该注意不点击不明的连接、不去来历不明的网站、不要在小网站进行网上交易，最重要的一点是记清你想去网站的域名，当然，你还可以把你常去的一些涉及到机密信息提交的网站的IP地址记下来，需要时直接输入IP地址登录。
要防范MITM攻击，可以将一些机密信息进行加密后再传输，这样即使被“中间人”截取也难以破解，另外，有一些认证方式可以检测到MITM攻击。比如设备或IP异常检测：如果用户以前从未使用某个设备或IP访问系统，则系统会采取措施。还有设备或IP频率检测：如果单一的设备或IP同时访问大量的用户帐号，系统也会采取措施。更有效防范MITM攻击的方法是进行带外认证，具体过程是：系统进行实时的自动电话回叫，将二次PIN码发送至SMS（短信网关），短信网关再转发给用户，用户收到后，再将二次PIN码发送到短信网关，以确认是否是真的用户。带外认证提供了多种不同的认证方式及认证渠道，它的好处是：所有的认证过程都不会被MITM攻击者接触到。例如MITM是通过中间的假网站来截获敏感信息的，相关的“带外认证”就是指通过电话认证或短信认证等方式确认用户的真实性，而MITM攻击者却不能得到任何信息。当然，这种方式麻烦些。
DNS欺骗
DNS欺骗（DNSSpoofing），就是其中的一种惯用手法。攻击者通过入侵DNS服务器、控制路由器等方法  中间人攻击示意图把受害者要访问的目标机器域名对应的IP解析为攻击者所控制的机器，这样受害者原本要发送给目标机器的数据就发到了攻击者的机器上，这时攻击者就可以监听甚至修改数据，从而收集到大量的信息。如果攻击者只是想监听双方会话的数据，他会转发所有的数据到真正的目标机器上，让目标机器进行处理，再把处理结果发回到原来的受害者机器；如果攻击者要进行彻底的破坏，他会伪装目标机器返回数据，这样受害者接收处理的就不再是原来期望的数据，而是攻击者所期望的了。例如让DNS服务器解析银行网站的IP为自己机器IP，同时在自己机器上伪造银行登录页面，那么受害者的真实账号和密码就暴露给入侵者了。
如此说来，这种攻击理应是最强大最危险的，然而实际上它却很少派上大用场，为什么，因为DNS欺骗的攻击模型太理想了。在实际生活中，大部分用户的DNS解析请求均是通过自己的ISP服务器进行的，换句话说，就是系统在连接网络时会获取到ISP服务器提供的DNS服务器地址，所有解析请求都是直接发往这个DNS服务器的，攻击者根本无处入手，除非他能入侵更改ISP服务器上DNS服务的解析指向。所以这种手法在广域网上成功的几率不大。
当然，这种攻击的成功率也有例外存在，例如一个ISP服务器上存在Bind漏洞，攻击者就能通过Bind漏洞进入服务器更改掉DNS解析指向，甚至取得最高权限；另一种方法是入侵路由设备，修改里面的DNS服务器地址为自己控制的机器地址，这种方法只能在用户机器自身是通过路由器返回域名解析的情况下才能成功，多见于一些使用小区宽带连接Internet的用户，因为这种用户机器的DNS地址通常必须指向小区宽带内部的某台服务器地址或者交给路由进行转向，这时候只要攻击者入侵了路由或者那台关系到所有人的服务器修改掉DNS记录，整个小区用户的网络都完了。当然，攻击者不能把全世界网站都伪造到他硬盘上，他只需要改几个重要商务站点的指向即可，这样便可导致用户访问某些商务站点时被转向到攻击者的机器去。但是，这种攻击手法同时对攻击者自身也是一种伤害：如果小区内有许多用户都访问这些商务站点，则大量数据请求会疯狂消耗攻击者的机器资源，攻击者非但不能实时处理数据，更是面临着机器瘫痪和暴露自己的双重危险。
会话劫持
  会话劫持会话劫持”（SessionHijack）是一种结合了嗅探以及欺骗技术在内的攻击手段。广义上说，会话劫持就是在一次正常的通信过程中，攻击者作为第三方参与到其中，或者是在数据里加入其他信息，甚至将双方的通信模式暗中改变，即从直接联系变成有攻击者参与的联系。简单地说，就是攻击者把自己插入到受害者和目标机器之间，并设法让受害者和目标机器之间的数据通道变为受害者和目标机器之间存在一个看起来像“中转站”的代理机器（攻击者的机器）的数据通道，从而干涉两台机器之间的数据传输，例如监听敏感数据、替换数据等。由于攻击者已经介入其中，他能轻易知道双方传输的数据内容，还能根据自己的意愿去左右它。这个“中转站”可以是逻辑上的，也可以是物理上的，关键在于它能否获取到通信双方的数据。
典型的会话劫持是利用TCP/IP的工作原理来设计攻击的。在谈TCP/IP会话劫持前先解释一下TCP/IP用于确认数据传输的判断机制。许多人一定都有过这样的疑问：TCP/IP是使用点对点（PointtoPoint）连接进行数据传输的，但是它是如何知道上一条数据和下一条数据存在的联系的呢。如果发送数据后不慎掉线，恰好另一个人接着IP地址连接到了Internet，那他会不会收到服务器返回数据。其实只要看过TCP/IP协议的书籍就会明白，TCP协议采用了两种条件来确认每条已经建立连接的TCP通道，第一个是基础连接确认，即TCP连接中的四大必备条件：源IP、源TCP端口、目标IP、目标TCP端口；第二个条件是“序号标识”（Sequencenumbers，SEQ），它们是成对出现的，分为“Sequence”（SEQ，序号字段）和“AcknowledgementSequence”（ACKSEQ，确认序号字段），TCP每次建立一个连接时，会给双方指定这样一条规则：序号字段指出了本报文中传送的数据在发送主机所要传送的整个数据流中的顺序号，而确认序号字段指出了发送本报文的主机希望接收的对方主机中下一个八位组的顺序号。（这里可能比较难理解，可以举个不专业的例子解释：流水线上的工人被规定好了每人负责安装8个不同的零件，则每次传输到他们手上的都应该是只留下给他们安装的8个零件位置，这就是序号字段；而下一个工人则被规定在前一个工人的基础上安装另一个部分的8个零件，这就是确认序号字段，如果这个工人发现传到自己手上的产品多了或少了零件，则说明前一个工人出错，这个产品就被从流水线提取出来返工，这就是TCP对序号的严密审查和丢弃制度）。TCP如此谨慎，就是为了避免出现前面提到的假设，虽然这种假设发生的几率很小（需要满足TCP的基础连接确认条件），但是它总有机会发生的。然而不幸的是，这对序号是可以预测的，因为TCP必须遵从以下守则：一台主机即将发出的报文中的SEQ值应等于它所刚收到的报文中的ACKSEQ值，而它所要发送报文中的ACKSEQ值应为它所收到报文中的SEQ值加上该报文中所发送的TCP数据的长度，即两者存在“本次发送的SEQ=上次收到的ACKSEQ；本次发送的ACKSEQ=上次收到的SEQ+本次发送的TCP数据长度”的联系。知道这个规律后，攻击者就不难发起“中间人攻击”了，他只需要设法监听到受害者TCP连接中的第一个条件（源IP、源TCP端口、目标IP、目标TCP端口），就可以得知其中一台主机对将要收到的下一个TCP报文段中SEQ和ACKSEQ值的要求，这样攻击者就能在原来的合法主机收到另一台合法主机发送的TCP报文前根据所截获的信息向该主机发出一个符合条件二（序号标识）的TCP报文，如果该主机先收到攻击报文，就会受到欺骗而把合法的TCP会话建立在攻击主机与被攻击主机之间，而且攻击报文会让被攻击主机对下一次要收到的TCP报文中的确认序号值的要求发生变化，最终使另一台合法的主机向被攻击主机发出的报文被拒绝，这种模式被称为“主动劫持”。换句话说，就是其中一方合法主机被攻击者掠夺了连接的权限，而攻击者却成为了合法的连接方之一。这种会话劫持让攻击者避开了被攻击主机对访问者的身份验证和安全认证，从而使攻击者直接进入对被攻击主机的的访问状态，因而危害严重。例如，你刚向某站点发送完账户密码，就被攻击者抢先冒充你的TCP连接上了，那你的损失可就难预料了。不过，会话劫持对网络环境的一点要求可以让大家松口气，它必须在使用MAC寻址的网络环境中才能发挥作用，必要时还要配合ARP协议欺骗，能同时满足这两个条件的只有局域网。而广域网不是靠MAC地址来查找计算机的，因此攻击者很难从现有的广域网结构里插入到某两台计算机之间。
代理服务器
不再可靠的代理服务器
网络上存在许多各种各样的代理服务器，其中的一些，是披着羊皮的狼……客车在一个“老乡”的指引下  代理服务器缓缓前进，司机这时候却感到有点不对劲，因为这条小路越来越泥泞。他还没来得及思考更多，就觉得车子颠簸了一下，再也动弹不得：车轮陷进水坑里了！满车旅客沸腾起来，那几个“老乡”很有自信的说：“我们下车去找人来推！”遂跳下车向后方走去，只留了两个人在车外“守”着。司机趁那两个人看着后方抽烟的时候偷偷拨打了110……过了一会儿，旅客们欢呼起来，因为他们看到一群“老乡”拿着锄头棍棒等东西走过来。但是只过了很短的时间，欢呼声变成了恐惧的叫声：那群人气势汹汹的，而且有些人手上还拿着砍刀！这些人不是什么“老乡”，而是一伙歹徒！司机明白自己从一开始就中了圈套，忙开足马力前进，可是无奈车轮只能在坑里空转……
代理服务器（ProxyServer）的存在已经是很长久的事实了，而且由最初的几个基于TCP/IP协议的代理软件如HTTP、SMTP、POP3和FTP等发展到SSL、SOCK4/5以及其他未知的代理类型，可谓给一些特殊用途者提供了极大的方便。例如，通过代理跨过某些服务器的IP屏蔽，从而浏览到本来不能看到的信息；或者害怕自己IP暴露被对方入侵而寻找层层代理把自己包裹起来；还有些是因为系统不支持Internet共享而被迫采用代理软件来让内部网络的计算机能正常连接Internet……此外还有许多原因，让各种代理服务器经久不衰。
代理服务器相当于一个透明的数据通道，它根据客户发来的“要求连接某计算机”的请求数据，进而用自己本身作为原客户机器去连接目标计算机，在目标计算机返回数据后，再发送给原客户，这时目标计算机获取到的是代理服务器的IP，而不是原客户IP，从而实现突破IP屏蔽或者让对方无法获取你的真实IP。
简单举个HTTP代理服务器工作的原理：IE发送一个包含目标URL的HTTP请求，代理服务器接收并析出HTTP报文里的目标URL和相关参数，然后把这个URL作为一次标准的HTTP连接过程与目标网站连接，获取目标网站返回的数据后缓冲到代理服务器的硬盘上，再把这些数据返回给客户端。
请求连接目标URL------>连接目标服务器------->
客户端-------------------------代理服务器------------------------目标服务器
<-----返回数据----(缓冲)<-------------返回数据
其它协议的代理工作模式也都差不多，代理服务器充当了一个数据转向的工作站，相当于一个专门负责数据转发的“勤劳工人”。
代理服务器的工作模式，正是典型的“中间人攻击”模型。代理服务器在其中充当了一个“中间人”的角色，通讯双方计算机的数据都要通过它。因此，“代理服务器进行的‘中间人攻击’”逐步成为现实，相对于其他“中间人攻击”方法，这种利用代理服务器暗渡陈仓的做法简直天衣无缝，攻击者可以自己写一个带有数据记录功能的代理服务程序，放到任意一台稳定的肉鸡甚至直接在自己机器上，然后通过一些社会工程学手段让受害者使用这个做了手脚的“代理服务器”，便可守株待兔了。这种方法最让人不设防，因为它利用的是人们对代理的无条件信任和贪便宜的想法，使得一个又一个“兔子”自动撞了上来，在享受这顿似乎美味的“胡萝卜”的同时却不知道安全正在逐渐远离自己。
如果制作这个代理服务器的攻击者仅限于窥探数据，那么受害者的损失可能还能估量，但是如果攻击者在目标服务器返回的数据里加入一个带有木马程序的数据呢。例如在HTTP代理返回的HTML报文里加入一个MIME攻击漏洞代码，而受害者的计算机恰好没有打相应补丁，那么由此带来的损失就难以估量了，而且计算机技术不高的受害者也难以查出木马究竟是从哪里来的，因为很少有人怀疑代理服务器自身会有问题。
防御
攻防为一家，有攻就有防，只要措施正确，MITM攻击是可以预防的。  中间人攻击对于DNS欺骗，要记得检查本机的HOSTS文件，以免被攻击者加了恶意站点进去；其次要确认自己使用的DNS服务器是ISP提供的，因为目前ISP服务器的安全工作还是做得比较好的，一般水平的攻击者无法成功进入；如果是依靠网关设备自带的DNS解析来连接Internet的，就要拜托管理员定期检查网关设备是否遭受入侵。
至于局域网内各种各样的会话劫持（局域网内的代理除外），因为它们都要结合嗅探以及欺骗技术在内的攻击手段，必须依靠ARP和MAC做基础，所以网管应该使用交换式网络（通过交换机传输）代替共享式网络（通过集线器传输），这可以降低被窃听的机率，当然这样并不能根除会话劫持，还必须使用静态ARP、捆绑MAC+IP等方法来限制欺骗，以及采用认证方式的连接等。
但是对于“代理中间人攻击”而言，以上方法就难以见效了，因为代理服务器本来就是一个“中间人”角色，攻击者不需要进行任何欺骗就能让受害者自己连接上来，而且代理也不涉及MAC等因素，所以一般的防范措施都不起作用。除非你是要干坏事，或者IP被屏蔽，或者天生对网络有着恐惧，否则还是不要整天找一堆代理来隐藏自己了，没必要的。常在河边走，即使遇上做了手脚的代理也难察觉。