Twosmi1e's Blog.

中间人攻击

Word count: 4,776 / Reading time: 17 min
2019/11/12 Share

概述

中间人攻击(man-in-the-middle attack, abbreviated to MITM),简单的讲,就是黑客悄悄的躲在通信双方之间,窃听甚至篡改通信信息。而通信双方并不知道消息已经被截获甚至篡改了。

举个例子,小明用微信发一条消息给小红,这条消息会从小明的手机发送到微信的服务器,再由微信服务器转发给小红,理论上讲,微信服务器是可以查看或者修改小明发送的信息的。这个时候,微信服务器就可以是实施攻击的中间人。
Alt text

wiki百科上也有一个生动的例子:

假设爱丽丝(Alice)希望与鲍伯(Bob)通信。同时,马洛里(Mallory)希望拦截窃会话以进行窃听并可能在某些时候传送给鲍伯一个虚假的消息。

首先,爱丽丝会向鲍勃索取他的公钥。如果Bob将他的公钥发送给Alice,并且此时马洛里能够拦截到这个公钥,就可以实施中间人攻击。马洛里发送给爱丽丝一个伪造的消息,声称自己是鲍伯,并且附上了马洛里自己的公钥(而不是鲍伯的)。
爱丽丝收到公钥后相信这个公钥是鲍伯的,于是爱丽丝将她的消息用马洛里的公钥(爱丽丝以为是鲍伯的)加密,并将加密后的消息回给鲍伯。马洛里再次截获爱丽丝回给鲍伯的消息,并使用马洛里自己的私钥对消息进行解密,如果马洛里愿意,她也可以对消息进行修改,然后马洛里使用鲍伯原先发给爱丽丝的公钥对消息再次加密。当鲍伯收到新加密后的消息时,他会相信这是从爱丽丝那里发来的消息。
我们的身份就是Mallory,我们希望欺骗Alice和Bob,让其认为我们是交互的正确目标,从而来获取他们之间交流的信息。
Alt text

攻击方式

  1. 数据包嗅探
    1) 明文嗅探
    2) 借助中间人代理进行密文嗅探
  2. 数据注入
    1) CRIME中在数据包中注入javascript代码实现攻击目的
  3. 数据流量劫持
    1) 使用iptables工具对数据包的IP地址进行强制重定向
  4. 数据包篡改
    1) DNS劫持中篡改DNS返回数据包的IP地址,达到DNS劫持的目的

    攻击场景

0x00 ARP投毒

Arp协议

ARP(Address Resolution Protocol,地址解析协议)是一个位于TCP/IP协议栈中的网络层,负责将某个IP地址解析成对应的MAC地址。

以太网(局域网)进行信息传输时,不是根据IP地址进行通信,因为IP地址是可变的,用于通信是不安全的。然而MAC地址是网卡的硬件地址,一般出厂后就具有唯一性。ARP协议就是将目标IP地址解析成MAC地址进行验证通信。

ARP欺骗的三种方式

  1. 攻击者仅仅欺骗被攻击主机(单向):
    主机C向主机B发送伪造的ARP回应包,声称自己的MAC地址就是网关对应的IP,这样,主机B就会将所有的流量发送主机C(攻击者),主机C开启ip_forward路由转发功能将数据包进行转发
  1. 攻击者仅仅欺骗被攻击主机、同时在本地进行Iptable NAT转发(双向)
    主机C向主机B发送伪造的ARP回应包,声称自己的MAC地址就是网关对应的IP,这样,主机B就会将所有的流量发送主机C(攻击者),同时,攻击者在本地使用Iptables进行NAT转换,这样就可以
    接收到网关返回的数据包,完成双向流量窃取的目的
  1. 攻击者同时欺骗被攻击主机和网关(双向)
    主机C同时欺骗主机B和网关,实现数据中转,并监听到所有主机B的数据(双向)
    主机C向网关发送ARP回应包,声称自己是主机B,同时向主机B发送ARP回应包,声称自己是网关,这样,网关和主机B两边的流量都会发往主机C,主机C并不需要使用Iptables做特殊的转发,只需要打开ip_forward路由开关(即打开转发功能),是主机C具有数据包转发的功能即可,就可以成功劫持主机B的流量数据

1.主机C冒充网关欺骗主机B

Alt text
可以看到,攻击者只污染了受攻击主机的ARP缓存表,所以受攻击主机的原本发往网关的数据包都会发送到攻击者的主机中,但是网关的ARP表是正常的,网关会根据当前数据包的目的IP地址(受攻击主机的IP地址)进行正确的ARP解析,从而将数据包发送到受攻击主机上。

这种方式的直接后果就是我们只能窃取到受攻击主机的”外发数据包”,无法接收到从远程服务端返回的”返回数据包”,自然也就无法进行流量内容修改、流量注入的目的。

1
2
3
4
5
6
7
1. 开启端口转发,允许本机像路由器那样转发数据包
echo 1 > /proc/sys/net/ipv4/ip_forward
2. ARP投毒,向主机B声称自己(攻击者)就是网关
arpspoof -h
Usage: arpspoof [-i interface] [-t target] host
arpspoof -i eth0 -t 192.168.159.132 192.168.159.2
(192.168.159.132是我们的攻击目标、192.168.159.2是网关IP地址)

攻击的原理是攻击者不断向受攻击目标(192.168.159.132)发送”ARP回应包”,声称自己就是网关,因为ARP机制没有身份验证,所以受攻击目标会把接收到的ARP回应包保存进自己的ARP缓存中,从而达到ARP污染的目的。

2. 攻击者仅仅欺骗被攻击主机、同时在本地进行Iptable NAT转发(双向)

Alt text
从图中可以看到,由于使用了NAT技术,从服务端返回的数据包也会经过攻击者的主机了,这样,攻击者就可以在本地进行流量内容的修改、流量注入了

3. 攻击者同时欺骗被攻击主机和网关(双向)

Alt text
在双向ARP欺骗中,攻击者仅仅充当了一个”数据包路由转发”的角色,将两个方向的数据包都进行转发

疑问

(1)如何清空B中的ARP Table?不然它一查询,直接发包给网关。

ARP Table采用老化机制,某一行一段时间不用就被删除,提速。
hacker大量发ARP包产生大量ARP通信量使通络堵塞,A就找不到B,A必然会发ARP Request包问:B是谁,
此时hacker的伪造包,也就改变了A中的ARP Table。

(2)如何保证在网关前响应B的请求查询?

因为(1)中已经提到,局域网中充斥着大量hacker伪造B的ARP响应包,B竞争不过hacker,所以hacker会比B更快响应

总结

上述三种方式从本质上来说是一样的

1
2
3
4
网络数据包的通信是通过MAC地址来连接的,数据包只会根据MAC进行点对点的发送和接收
为了解决跨局域网、跨域发送的问题,所以有了IP层,IP负责对数据包进行路由
数据包在发送的过程中,MAC会在不同的"跳"中变化,而源、目的IP地址是不会变的,它负责路由的功能
我们在设置网卡参数的网关GetWay时填写的IP,其实只是为了获取网关的MAC而存在的,默认网关也因此得名,即当我们发送的目的IP不在当前局域网范围内,这个数据包就会被发送网关(即目的MAC地址填写网关的MAC地址)

0x01 SSL证书伪造

SSL通信原理:http://www.cnblogs.com/LittleHann/p/3733469.html
攻击思路:

1
2
3
4
5
6
7
8
1. 攻击者对目标客户端和网关发送ARP投毒攻击,污染它们的ARP缓存表
2. 客户端在浏览器中输入"https://mail.google.com/"的网址,浏览器会尝试和"https://mail.google.com/"的443端口建立SSL连接,但是因为客户端受到了ARP投毒攻击,原本发往
网关的数据包被发往了攻击者的主机
3. 攻击者在本机使用iptables将接收到的443目的端口的数据包重定向到本机的IP地址
4. 这样,受攻击者客户端的浏览器就只会和攻击者主机进行SSL连接
5. 攻击者在本机使用监听443端口,并且伪造一个假的SSL证书,用于和客户端的连接,同时,提取客户端发送的数据包的原始目的IP地址,用于和客户端原始请求的服务器建立另一个SSL连接
6. 中间人攻击者在双向的SSL Socket通信都建立完成后,对两边的socket进行数据读写同步,将数据通道打通,使客户端的浏览器能够正常访问(受攻击者不会察觉到已经收到SSL中间人攻击)
7. 在数据同步的同时,记录下明文数据,达到SSL中间人攻击的目的

Alt text

0x02 SSL卸载攻击

攻击思路:

  1. ARP欺骗,使得攻击者能截获所有目标主机的网络流量
  2. 攻击者利用用户对于地址栏中HTTPS与HTTP的疏忽,将所有的HTTPS连接都用HTTP来代替
  3. 同时,与目标服务器建立正常的HTTPS连接
  4. 由于HTTP通信是明文传输,攻击者能轻松实施嗅探
  5. 受攻击客户端与原始请求服务器之间的全部通信经过了代理转发。
  6. 其中,出现的图标被替换成为用户熟悉的”小黄锁”图标,以建立信任。
  7. 这样,中间人攻击就成功骗取了密码、账号等信息,而受害者一无所知

产生原因:

  1. 大部分使用SSL的网站并非”全站加密”,仅对部分重要的网页使用SSL,这就给攻击者以可乘之机。可以简单地理解为:
    网站在普通页面、非机密页面都是采用HTTP方式访问的,而在进入登录页面的时候才会采用HTTPS加密处理
  2. 大多数网站为了保证用户习惯的兼容性,都同时支持HTTP、HTTPS的访问,大多数情况下,这两种访问方式并没有太大的安全问题,但是当用户访问的页面是涉及机密信息的登录页面时,
    服务端往往会采用”重定向”的方式,”强制”用户的浏览器以HTTPS的方式来访问登录页面,为的是保证密钥信息的安全传输

其中原因(2)是我们能够利用SSLStrip发动攻击的关键,服务端为了”强制”用户以HTTPS方式进行登录,会向浏览器返回重定向数据包,即”302 Moved Temporarily”,正常情况下,浏览器收到这个数据包之后,就会重新使用新的URL发起一个新的HTTPS连接。

而SSLStrip就是盯准了这个时机,当发现浏览器试图加密即采用https传输数据时,它就适时的介入中间,充当代理作用,然后主机认为安全会话开始,这是上文中的被动加密的提示就不会出现了,SSLstrip也通过https连接了安全服务器。那么所有用户到SSLstrip的连接时http,所有的传输数据就能被拦截。
Alt text

0x03 基于中间人攻击的SSL BEAST攻击

攻击原理:

  1. SSL/TLS中使用”记录协议数据包”来封装上层的应用数据
  2. SSL/TLS使用CBC加密模式进行分组对称加密,并且不同”记录协议数据包”之间并不是独立的IV,不同的数据包之间形成一个整体的CBC模式
  3. 中间人攻击者可以在返回流量中注入javascript代码,根据攻击者已知的IV和Ciper,来穷举出下一个数据包中包含的cookie信息

相关链接:
http://blog.ivanristic.com/2011/10/mitigating-the-beast-attack-on-tls.html
http://blog.csdn.net/jimmyleeee/article/details/7029435
http://www.butian.org/server/2543.html
http://www.educatedguesswork.org/2011/09/security_impact_of_the_rizzodu.html
http://www.freebuf.com/articles/web/5636.html

0x04 基于中间人攻击的DNS劫持

DNS劫持是指在劫持的网络范围内拦截域名解析的请求,分析请求的域名,把审查范围以外的请求放行,否则返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能反应或访问的是假网址。

属于数据包篡改的一种。用自己的伪造的IP冒名顶替正常的DNS服务器的IP,让受攻击者访问到你的服务器。

攻击思路:

1
2
3
4
5
6
7
8
9
10
11
12
13
1. ARP投毒,进行中间人攻击劫持流量 
echo 1 > /proc/sys/net/ipv4/ip_forward
arpspoof -i eth0 -t 192.168.159.132 192.168.159.137
arpspoof -i eth0 -t 192.168.159.137 192.168.159.132
2. 使用ettercap的dns_spoof插件进行DNS劫持
locate etter.dns
vim /usr/local/share/ettercap/etter.dns
添加一个你需要劫持的URL的IP记录
www.jnrain.com A 192.168.159.254
www.jnrain.com PTR 192.168.159.254
启动ettercap插件
ettercap -i eth0 -T -P dns_spoof
3. 客户端访问指定URL,返回的是攻击者指定的IP,达到DNS劫持的目的

相关链接:https://www.freebuf.com/articles/system/5265.html

0x05 基于DNS劫持的SET社会工程钓鱼攻击

在完成DNS劫持之后,作为攻击者我们可以控制用户访问某个URL时实际访问的IP地址。我们可以以此为基础进行钓鱼攻击。

攻击思路:

1
2
3
4
5
1. 发送中间人攻击,劫持目标客户端流量
2. 进行DNS劫持,将"http://www.jnrain.com"这个URL劫持到攻击者所在的本机上
3. 目标客户端在访问"http://www.jnrain.com"的时候实际访问的是攻击者所在的服务器
4. 攻击者在本机服务器上搭建一个钓鱼页面,对"http://www.jnrain.com"进行高度仿真,并加入记录密码的代码
5. 通过钓鱼页面直接获取目标客户端的帐号、密码

SET工具套件提供了一个基础的社工平台,它提供了一些基本功能,例如”网页克隆”、”钓鱼邮件发送”等
https://github.com/trustedsec/social-engineer-toolkit/
http://www.freebuf.com/tools/7841.html

一个内网下的钓鱼案例:https://mp.weixin.qq.com/s/J7h4pB2r1BmbgQqBOS28IQ

0x06 基于中间人攻击的会话劫持攻击(Session Hajacking)

发送这种攻击方式的一个根本原因是”当前的HTTP环境采用Cookie当作一种连接状态的标识符”,即服务端根据Cookie来识别当前登录用户的身份,基本上来说,我们在访问一个购物网站的时候,浏览器和服务器的交互过程是这样的

  1. 用户第一次访问这个网站,网站服务端产生一个session,并将这个session的ID值保存在cookie值中,写入客户端
  2. 客户端在之后的每次访问这个网站的同一个域下的页面时都会带上这个cookie值,
  3. 服务端根据cookie中的sessionID来映射对应的session,从而得到当前用户的登录状态
  4. 这样,借助cookie的机制,HTTP协议从某种程度上来说,就成为了一个有状态的协议

对攻击者来说,如果能获取到这个Cookie值,等于也就获取了对应用户的”身份令牌”,即可以不需要帐号、密码就以目标用户的身份合法的登录网站(XSS攻击也是这个目的)

“基于中间人攻击的会话劫持”属于前面说的”数据包流量嗅探”类别,它的思路如下:

1
2
3
4
1. 攻击者对目标客户端发送中间人攻击,劫持流量
2. 使用ferret抓取WEB通信流量包
3. 使用hamster对抓取的数据包进行重组、分析,得出包含cookie信息的HTTP包
4. 攻击者使用hamster组合出的HTTP包进行重放,以目标用户的身份登录目标网站,达到会话劫持

案例拓展

利用域名碰撞实现从任何地方发起中间人攻击
如何通过中间人攻击嗅探SIM卡的流量通信
BT5 + wireshark玩wifi捕获和中间人攻击
基于MitM的RDP降级攻击
WSUS MITM远程攻击实战全过程详解

参考

中间人攻击-DNS欺骗
浅谈Arp攻击和利用Arp欺骗进行MITM
HTTPS中间人攻击及防御
MITM——SSL篇
初探MITM-中间人攻击
中间人攻击(MITM)姿势总结

总结

我们常常提到HTTPS使用了SSL/TLS加密协议,是一种非常安全的WEB通信机制,这句话从某种角度来说是对的。我觉得更准备地应该说是针对传统的明文嗅探进行了有效的防御。但同时,我们应该认识到,安全技术、攻击方式往往在不同的场景、组合不同的技术可以形成多种多样的业务架构,而安全问题往往就发生在这些新出现的业务架构中。在一些特定的前提、特定的触发条件下,一些看似传统的攻击方式能够形成新的攻击向量。

几种防御技术

  1. 公钥基础建设PKI:在PKI方案中,主要防御中间人攻击的方案就是PKI的相互认证的机制。使用这样的机制并由应用程序验证用户,用户设备验证应用程序。但在某些流氓应用的情况下,这不是很有用,所以需要注意对流氓软件应与正规软件进行区分。
  2. 更强力的相互认证
  • 密钥(通常是高信息熵的密钥,从而更安全)
  • 密码(通常是低的信息熵的密钥,从而降低安全性)
  1. 延迟测试:例如使用复杂加密哈希函数进行计算以造成数十秒的延迟;如果双方通常情况下都要花费20秒来计算,并且整个通讯花费了60秒计算才到达对方,这就能表明存在第三方中间人。
  2. 使用其他形式的密钥交换形式
CATALOG
  1. 1. 概述
  2. 2. 攻击方式
  3. 3. 攻击场景
    1. 3.1. 0x00 ARP投毒
      1. 3.1.1. Arp协议
      2. 3.1.2. ARP欺骗的三种方式
      3. 3.1.3. 1.主机C冒充网关欺骗主机B
      4. 3.1.4. 2. 攻击者仅仅欺骗被攻击主机、同时在本地进行Iptable NAT转发(双向)
      5. 3.1.5. 3. 攻击者同时欺骗被攻击主机和网关(双向)
      6. 3.1.6. 疑问
      7. 3.1.7. 总结
    2. 3.2. 0x01 SSL证书伪造
    3. 3.3. 0x02 SSL卸载攻击
    4. 3.4. 0x03 基于中间人攻击的SSL BEAST攻击
    5. 3.5. 0x04 基于中间人攻击的DNS劫持
    6. 3.6. 0x05 基于DNS劫持的SET社会工程钓鱼攻击
    7. 3.7. 0x06 基于中间人攻击的会话劫持攻击(Session Hajacking)
  4. 4. 案例拓展
  5. 5. 参考
  6. 6. 总结
    1. 6.1. 几种防御技术