微信号:Computer-network

介绍:信息安全公益宣传,信息安全知识启蒙. (网络安全、系统安全、数据安全)

会话劫持攻击的原理、检测及防范

2018-10-08 15:43 计算机与网络安全

一次性进群,长期免费索取教程,没有付费教程。

教程列表见微信公众号底部菜单

进微信群回复公众号:微信群;QQ群:16004488


微信公众号:计算机与网络安全

ID:Computer-network

通常,大家所说的入侵都是针对一台主机,其实,真正的入侵是占领整个内部网络。针对内部网络的攻击方法比较多,但比较有效的方法非ARP欺骗、DNS欺骗莫属了。但是,不管使用什么技术,无非都是抓取目标的数据分组,然后分析出敏感数据。如果目标内部采用的是共享式网络,那只需要把网卡设置为“混杂模式”,挂上嗅探器(Sniffer),就能监听到需要的数据。如果是交换式网络,这样方法就行不通了,因为对于嗅探器,有3种网络环境是无法跨越的:网桥、交换机、路由器。可惜,对于ARP欺骗,交换式网络还是无能为力,如果借助ARP欺骗,再实现更高一层的“入侵手段”,从而真正地控制内部网络。


一、会话劫持原理


所谓会话,就是两台主机之间的一次通信。例如Telnet到某台主机,这就是一次Telnet会话;浏览某个网站,这就是一次 HTTP 会话。而会话劫持(Session Hijack),就是结合了嗅探以及欺骗技术在内的攻击手段。例如,在一次正常的会话过程当中,攻击者作为第三方参与到其中,可以在正常数据分组中插入恶意数据,也可以在双方的会话当中进行监听,甚至可以是代替某一方主机接管会话。会话劫持攻击分为2种类型。


①中间人攻击(MITM,Man In The Middle)。


②注射式攻击(Injection)。


并且还可以把会话劫持攻击分为2种形式。


①被动劫持:被动劫持实际上就是在后台监视双方会话的数据流,从中获得敏感数据。


②主动劫持:主动劫持是将会话当中的某一台主机“踢”下线,然后由攻击者取代并接管会话,这种攻击方法危害非常大,攻击者可以做很多事情,如“cat etc/master.passwd”(FreeBSD下的Shadow文件)。图1会话劫持示意图。

图1  会话劫持示意

1、MITM攻击简介


这就是常说的“中间人攻击”,在网上讨论比较多的就是SMB会话劫持,也是一个典型的中间人攻击。要想正确地实施中间人攻击,攻击者首先需要使用ARP欺骗或DNS欺骗。但不管是ARP欺骗,还是DNS欺骗,中间人攻击都改变正常的通信流,它就相当于会话双方之间的一个透明代理,可以得到一切想知道的信息,甚至是利用一些有缺陷的加密协议来实现。


2、ARP欺骗


ARP协议是一种将IP地址转化成MAC地址的一种协议。在每台主机的内存中,都有一个ARP→MAC的转换表,通常是动态的转换表(注意在路由中,该ARP表可以被设置成静态)。也就是说,该对应表会被主机在需要的时候刷新。在TCP网络环境下,一个IP包走到哪里,要怎么走是靠路由表定义。但是,当IP包到达该网络后,哪台机器响应这个IP包却是靠该IP包中所包含的MAC地址来识别。在网络中如何实现ARP欺骗,可以看看这样一个例子。


一个入侵者想非法进入某台主机,他知道这台主机的防火墙只对192.0.0.3(假设)这个IP开放23口(telnet),而他必须要使用telnet来进入这台主机,所以他要这么做。


(1)他先研究192.0.0.3这台主机,发现这台机器使用一个OOB就可以让他死掉。


(2)于是,他送一个洪水包给192.0.0.3的139口,于是,该机器应包而死。


(3)这时,主机发到192.0.0.3的IP包将无法被机器应答,系统开始更新自己的ARP对应表。将192.0.0.3的项目搽去。


(4)这段时间里,入侵者把自己的IP改成192.0.0.3。


(5)他发一个PING(ICMP 0)给主机,要求主机更新主机的ARP转换表。


(6)主机找到该IP,然后在ARP表中加入新的IP→MAC对应关系。


(7)防火墙失效了,入侵的IP变成合法的MAC地址,可以Telnet了。


上面就是一个ARP的欺骗过程,这是在同网段发生的情况。但是,需要注意的是,利用交换集线器或网桥是无法阻止ARP欺骗的,只有路由分段是有效的阻止手段。


3、DNS欺骗


DNS(Domain Name System),即域名服务器,对于正常的DNS请求,例如在浏览器输入www.hacker.com.cn,然后系统先查看Hosts文件,如果有相对应的IP,就使用这个IP地址访问网站(其实,利用Hosts文件就可以实现DNS欺骗);如果没有,才去请求DNS服务器;DNS 服务器在接收到请求之后,解析出其对应的 IP 地址,返回给本地,最后就可以登录到黑客防线的网站。而DNS欺骗则是,目标将其DNS请求发送到攻击者这里,然后攻击者伪造DNS响应,将正确的IP地址替换为其他IP,之后你就登录了这个攻击者指定的IP,而攻击者早就在这个IP中安排好了恶意网页,可你却在不知不觉中已经被攻击者下了“套”。DNS欺骗也可以在广域网中进行,比较常见的有“Web服务器重定向”、“邮件服务器重定向”等。

二、注射式攻击简介


这种方式的会话劫持比中间人攻击实现起来简单一些,它不会改变会话双方的通信流,而是在双方正常的通信流插入恶意数据。在注射式攻击中,需要实现2种技术。


(1)IP欺骗;

(2)预测TCP序列号。


如果是UDP协议,只需伪造IP地址,然后发送过去就可以了,因为UDP没有所谓的TCP三次握手,但基于UDP的应用协议有流控机制,所以也要做一些额外的工作。对于IP欺骗,有2种情况需要用到。


(1)隐藏自己的IP地址;

(2)利用两台机器之间的信任关系实施入侵。


在Unix/Linux平台上,可以直接使用Socket构造IP包,在IP头中填上虚假的IP地址,但需要root权限;在Windows平台上,不能使用Winsock,需要使用Winpacp(也可以使用Libnet)。例如在Linux系统,首先打开一个RawSocket(原始套接字),然后自己编写IP头及其他数据。可以参考下面的实例代码。


sockfd = socket(AF_INET, SOCK_RAW, 255);

setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));

struct ip *ip;

struct tcphdr *tcp;

struct pseudohdr pseudoheader;

ip->ip_src.s_addr = xxx;

pseudoheader.saddr.s_addr = ip->ip_src.s_addr;

tcp->check = tcpchksum((u_short *)&pseudoheader,12+sizeof(struct tcphdr));

sendto(sockfd, buf, len, 0, (const sockaddr *)addr, sizeof(struct sockaddr_in))


对于基于TCP协议的注射式会话劫持,攻击者应先采用嗅探技术对目标进行监听,然后从监听到的信息中构造出正确的序列号,如果不这样,就必须先猜测目标的 ISN(初始序列号),如果不知道会话双方的序列号,就会产生一个致命的弱点,这个致命的弱点就是 ACK风暴(Storm)。当会话双方接收到一个不期望的数据分组后,就会用自己期望的序列号返回ACK分组;而在另一端,这个数据分组也不是所期望的,就会再次以自己期望的序列号返回ACK分组…于是就这样来回往返,形成了恶性循环,最终导致ACK风暴。


下面看一下TCP会话劫持过程。


假设现在主机A和主机B进行一次TCP会话,C为攻击者,如图2所示。

图2  TCP会话劫持过程

劫持过程如下。


A向B发送一个数据分组


SEQ (hex): X ACK (hex): Y

FLAGS: -AP--- Window: ZZZZ,包大小为:60


B回应A一个数据分组


SEQ (hex): Y ACK (hex): X+60

FLAGS: -AP--- Window: ZZZZ,包大小为:50


A向B回应一个数据分组


SEQ (hex): X+60 ACK (hex): Y+50

FLAGS: -AP--- Window: ZZZZ,包大小为:40


B向A回应一个数据分组


SEQ (hex): Y+50 ACK (hex): X+100

FLAGS: -AP--- Window: ZZZZ,包大小为:30


攻击者C冒充主机A给主机B发送一个数据分组


SEQ (hex): X+100 ACK (hex): Y+80

LAGS: -AP--- Window: ZZZZ,包大小为:20


B向A回应一个数据分组


SEQ (hex): Y+80 ACK (hex): X+120

FLAGS: -AP--- Window: ZZZZ,包大小为:10


现在,主机B执行了攻击者C冒充主机A发送过来的命令,并且返回给主机A一个数据分组;但是,主机A并不能识别主机B发送过来的数据分组,所以主机A会以期望的序列号返回给主机B一个数据分组,随即形成ACK风暴。如果成功地解决了ACK风暴(如前边提到的ARP欺骗),就可以成功进行会话劫持了。


三、检测方法


1、共享环境下SNIFFER检测


对发生在局域网的其他主机上的监听,一直以来都缺乏很好的检测方法。这是由于产生网络监听行为的主机在工作时总是不做声地收集数据分组,几乎不会主动发出任何信息。但目前网上已经有了一些解决这个问题的思路和产品。


(1)利用ARP数据分组进行监测


除了使用PING进行监测外,目前,比较成熟的有利用ARP方式进行监测的。这种模式是上述PING方式的一种变体,它使用ARP数据分组替代了上述的ICMP数据分组。向局域网内的主机发送非广播方式的ARP包,如果局域网内的某个主机响应了这个ARP请求,那么我们就可以判断它很可能就是处于网络监听模式了,这是目前相对而言比较好的监测模式。这种方式,在 neped 和 PromiScan 这 2 个产品中有所体现。


(2)观测DNS


许多的网络监听软件都会尝试进行地址反向解析,在怀疑有网络监听发生时可以在DNS系统上观测有没有明显增多的解析请求。


(3)利用PING模式进行监测


上面说过:当一台主机进入混杂模式时,以太网的网卡会将所有不属于他的数据照单全收。按照这个思路,就可以进行以下操作。假设怀疑的主机的硬件地址是00:30:6E:00:9B:B9,它的IP地址是192.168.1.1,那么现在伪造出这样的一种ICMP数据分组:硬件地址是不与局域网内任何一台主机相同的00:30:6E:00:9B:9B,目的地址是192.168.1.1不变,设想一下这种数据分组在局域网内传输会发生什么现象?任何正常的主机都会检查这个数据分组,比较数据分组的硬件地址和自己的不同,于是不理会这个数据分组。那么处于网络监听模式的主机呢?由于它的网卡现在是在混杂模式的,所以它不会去对比这个数据分组的硬件地址,而是将这个数据分组直接传到上层,上层检查数据分组的 IP 地址是否符合自己的 IP,于是会对对这个PING的包做出回应。这样,一台处于网络监听模式的主机就被发现了。这种方法在10pht这个黑客组织的AntiSniff产品中有很好的体现。


2、交换环境下SNIFFER检测


(1)借助检测IP地址和MAC地址对应的工具,如arpwatch,安装了arpwatch的系统在发生MAC地址变化时会在系统的日志文件中看到如图3所示的提示。

图3  发生MAC地址变化时的提示文件

从提示中可以看出arpwatch检测到了网关MAC地址发生了改变。


(2)借助于一些入侵检测系统(如snort),亦可以起到一定的检测作用。在snort的配置文件中打开arpspoof的preprocessor开关并进行配置即可。


(3)使用AntiSniff工具,也可以远程检测出交换环境下处于SNIFFER状态的机器。


四、会话劫持防范


防范会话劫持是一个比较大的工程。首先应该使用交换式网络替代共享式网络,虽然像Hunt这样的工具可以在交换环境中实现会话劫持,但还是应该使用交换式网络替代共享式网络,因为这样可以防范最基本的嗅探攻击。然而,最根本的解决办法是采用加密通信,使用SSH代替Telnet、使用SSL代替HTTP,或者干脆使用IPSec/VPN,这样会话劫持就无用武之地了。其次,监视网络流量,如发现网络中出现大量的 ACK 包,则有可能已被会话劫持攻击。


还有一点是比较重要的,就是防范ARP欺骗。实现中间人攻击的前提是ARP欺骗,如能阻止攻击者进行ARP欺骗,中间人攻击也就无法成功了。


(1)不要把网络安全信任关系建立在IP基础上或MAC基础上,(RARP同样存在欺骗的问题),理想的关系应该建立在IP+MAC基础上。


(2)设置静态的MAC→IP对应表,不要让主机刷新设定好的转换表。


(3)除非很有必要,否则停止使用ARP,将ARP作为永久条目保存在对应表中。


(4)使用ARP服务器。通过该服务器查找自己的ARP转换表来响应其他机器的ARP广播,确保这台ARP服务器不被攻击。


(5)使用proxy代理IP的传输。


(6)使用硬件屏蔽主机。设置好路由,确保 IP 地址能到达合法的路径(静态配置路由ARP条目)。注意,使用交换集线器和网桥无法阻止ARP欺骗。


(7)管理员定期用响应的IP包中获得一个RARP请求,然后检查ARP响应的真实性。


(8)管理员定期轮询,检查主机上的ARP缓存。


(9)使用防火墙连续监控网络。注意有使用SNMP的情况下,ARP的欺骗有可能导致陷阱包丢失。


五、会话劫持的应急响应对策


1、检测嗅探器


检测嗅探器可以采用检测混杂模式网卡的工具。由于嗅探器需要将网络中入侵的网卡设置为混杂模式才能工作,能够检测混杂模式网卡的 AntiSniff 是一个工具。


证明你的网络有嗅探器有两条经验。


网络通信分组丢失率非常高:通过一些网管软件,可以看到信息包传送情况,最简单是PING命令。它会告诉你掉了百分之多少的包。如果你的网络结构正常,而又有20%~30%数据分组丢失以致数据分组无法顺畅的流到目的地。就有可能有人在监听,这是由于嗅探器拦截数据分组导致的。


网络带宽出现反常:通过某些带宽控制器,可以实时看到目前网络带宽的分布情况,如果某台机器长时间地占用了较大的带宽,这台机器就有可能在监听。应该也可以察觉出网络通信速度的变化。


对于SunOS和其他BSD Unix系统可以使用lsof(该命令显示打开的文件)来检测嗅探器的存在。lsof的最初的设计目的并非为了防止嗅探器入侵,但因为在嗅探器入侵的系统中,嗅探器会打开其输出文件,并不断传送信息给该文件,这样该文件的内容就会越来越大。如果利用lsof发现有文件的内容不断地增大,我们就怀疑系统被嗅探。因为大多数嗅探器都会把截获的“TCP/IP”数据写入自己的输出文件中。这里可以用ifconfig le0检查端口,然后用#/usr/sbin/lsof >test


#vi test 或 grep [打开的端口号]


检测文件大小的变化。


注意,如果你确信有人接了嗅探器到自己的网络上,可以去找一些进行验证的工具。这种工具被称为时域反射计量器(TDR,Time Domaio Reflectometer)。TDR对电磁波的传播和变化进行测量。将一个 TDR 连接到网络上,能够检测到未授权的获取网络数据的设备。不过很多中小公司没有这种价格昂贵的工具。


2、将数据隐藏,使嗅探器无法发现


嗅探器非常难以被发现, 因为它们是被动的程序。一个老练的攻击者可以轻易通过破坏日志文件来掩盖信息。它们并不会给别人留下进行核查的尾巴。完全主动的解决方案很难找到,则可以采用一些被动的防御措施。


(1)安全的拓扑结构。


(2)会话加密。


(3)用静态的ARP或者IP→MAC对应表代替动态的。


3、安全的拓扑结构


嗅探器只能在当前网络段上进行数据捕获。这就意味着,将网络分段工作进行得越细,嗅探器能够收集的信息就越少。但是,除非你的公司是一个 ISP,或者资源相对不受限制,否则这样的解决方案需要很大的代价。网络分段需要昂贵的硬件设备。有3种网络设备是嗅探器不可能跨过的:交换机、路由器、网桥。大家可以通过灵活地运用这些设备来进行网络分段。大多数早期建立的内部网络都使用 HUB 集线器来连接多台工作站,这就为网络中数据的泛播(数据向所有工作站流通),让嗅探器能顺利地工作提供了便利。普通的嗅探器程序只是简单地进行数据的捕获,因此需要杜绝网络数据的泛播。随着交换机的价格下降,网络改造变得可行且很必要了。不使用 HUB 而用交换机来连接网络,就能有效地避免数据进行泛播,也就是避免让一个工作站接收任何非与之相关的数据。对网络进行分段,如在交换机上设置 VLAN,使得网络隔离不必要的数据传送。一般可以采用 20 个工作站为一组,这是一个比较合理的数字。然后,每个月人为地对每段进行检测(也可以每个月采用 MD5 随机地对某个段进行检测)。网络分段只适应于中小网络。如果有一个 500 个工作站的网络,分布在50个以上的部门中,那么完全分段的成本是很高的。


4、会话加密


会话加密提供了另外一种解决方案,不用特别地担心数据被嗅探,而是要想办法使得嗅探器不认识嗅探到的数据。这种方法的优点是明显的:即使攻击者嗅探到了数据,这些数据对他也是没有用的。S/Key和其他一次性口令技术一样,使窃听账号信息失去意义。S/key的原理是远程主机已得到一个口令(这个口令不会在不安全的网络中传输),当用户连接时会获得一个“挑战”(Challenge)信息,用户将这个信息和口令经过某个算法运算,产生正确的“响应”(Response)信息(如果通信双方口令正确的话)。这种验证方式无需在网络中传输口令,而且相同的“挑战/响应”也不会出现两次。它的缺点是所有账号信息都存放在一台主机中,如果该主机被入侵,则会危及整个网络安全。另外,配置它也不是一件简单的事情。Kerberos包括流加密rlogind和流加密telnetd等,它可以防止入侵者捕获用户在登录完成后所进行的操作。在加密时有2个主要的问题:一个是技术问题,另一个是人为问题。


技术问题是指加密能力是否高。例如,64位的加密就可能不够,而且并不是所有的应用程序都集成了加密支持。而且,跨平台的加密方案还比较少见,一般只在一些特殊的应用之中才有。人为问题是指,有些用户可能不喜欢加密,他们觉得这太麻烦。用户可能开始会使用加密,但他们很少能够坚持。总之必须寻找一种友好的媒介——使用支持这样强大的应用程序,还要具有一定的用户友好性。使用secure shell、secure copy或者IPv6协议都可以使信息安全地传输。传统的网络服务程序,SMTP、HTTP、FTP、POP3和Telnet等在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,嗅探器非常容易就可以截获这些口令和数据。通过使用 SSH(Secure Shell),可以把所有传输的数据进行加密,这样“中间服务器”这种攻击方式就不可能实现了,而且也能够防止DNS和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至PPP提供一个安全的“通道”。SSH绑定在端口22上,其连接采用协商方式使用RSA加密。身份鉴别完成之后,后面的所有流量都使用IDEA进行加密。SSH程序可以通过网络登录到远程主机并执行命令。SSH的加密隧道保护的只是中间传输的安全性,使任何普通的嗅探工具软件无法获取发送的内容。它提供了很强的安全验证可以在不安全的网络中进行安全的通信,所以它是防范嗅探器的一种方法。


5、用静态的ARP或者IP→MAC对应表代替动态的


该措施主要是进行渗透嗅探的防范,采用诸如ARP欺骗手段能够让入侵者在交换网络中顺利完成嗅探。网络管理员需要对各种欺骗手段进行深入了解,比如嗅探中通常使用的ARP欺骗,主要是通过欺骗进行ARP动态缓存表的修改。在重要的主机或者工作站上设置静态的ARP对应表,比如Windows系统使用ARP命令设置,在交换机上设置静态的IP→MAC对应表等,防止利用欺骗手段进行嗅探的手法。


还要重视重点区域的安全防范。这里说的重点区域,主要是针对嗅探器的放置位置而言。入侵者要让嗅探器发挥较大功效,通常会把嗅探器放置在数据交汇集中区域,比如网关、交换机、路由器等附近,以便能够捕获更多的数据。因此,对于这些区域就应该加强防范,防止在这些区域存在嗅探器。


六、会话劫持防范总结


嗅探器技术被广泛应用于网络维护和管理方面,它工作的时候就像一部被动声呐,默默地接收来自网络的各种信息,通过对这些数据的分析,网络管理员可以深入了解网络当前的运行状况,以便找出网络中的漏洞。在网络安全日益被注意的今天,人们不但要正确使用嗅探器,还要合理防范嗅探器的危害。嗅探器能够造成很大的安全危害,主要是因为它们不容易被发现。对于一个安全性要求很严格的企业,在使用技术防范的同时安全管理的制度建设也是非常重要的。


1、防止网络会话劫持方面,管理显得格外重要


除网络管理员外其他人员禁止在网络中使用任何嗅探工具(包括一些企业高级管理人员),是完全有必要的。这能从制度上明确限制一些工作站主动使用嗅探器的情况。


2、对于网络管理员来说更重要的是要建立安全意识


了解你的用户(系统管理员越熟悉自己的用户和用户的工作习惯,就越能快速发现不寻常的事件,而不寻常的事件往往意味着系统安全问题)。定期检查网络中的重点设备如服务器、交换机、路由器。最好配备一些专业工具,如前边介绍的TDR。网络管理员还要给用户提供安全服务。对用户要定期发送安全邮件,让用户具有安全意识。管理意识是提高安全性的另一个重要因素。如果用户的管理部门对安全要求不强烈,只靠系统管理员也不行。最好让管理部门建立一套每个人都必须遵守的安全标准,如果系统管理员在此基础再建立自己的安全规则,就强化了安全。管理有助于加强用户意识,让用户明确信息是有价值的资产。系统管理员应当使安全保护方法对用户尽可能地简单,提供一些提高安全的工具。网络管理员要建立合理的用户痛苦量(痛苦量是指安全限制引起抵制的函数),不能仅仅从技术上考虑问题,还要站在用户的观点上考虑。例如,我们能够想每次 Macintosh 用户登录时都使用 S/Key吗?用户知道的关于安全的知识越多,网络安全就更有保障。

    微信公众号:计算机与网络安全

    ID:Computer-network

    【推荐书籍】
     
    计算机与网络安全 更多文章 【视频】| 正在秘密定位追踪你的公司 【视频】| 网络中国 【视频】| 互联网公司该如何保障用户的安全 【视频】| 黑客测试环境搭建 【视频】| 系统漏洞扫描
    猜您喜欢 《全栈数据》第七章知识点与目录 携程React Native早期工程实践和优化 8点1氪:苹果或将成为全球首家市值过万亿美元的公司;微信小店小程序上线;融360交易首日收涨5% JSON 的正确用法:Pyhong、MongoDB、Js与Ajax O2O产品质量保障体系(五)| 百糯电影商家服务质量保障