TTL介绍
TTL(time to live)生存时间字段设置了IP数据报能够经过的最大的路由器数,TTL字段是由发送端初始设置的,每个处理该数据报的路由器都需要将其TTL值减1,当路由器收到一个TTL值为0的数据报时,路由器会将其丢弃。
TTL字段的目的是防止数据报在选路时无休止地在网络中流动。例如,当路由器瘫痪或者两个路由器之间的连接丢失时,可能会造成路由环路,而路由器可能根据其路由表将该数据报一直循环转发下去。这种情况下,就需要一种机制来给这些循环传递的数据报上加上一个生存上限,TTL字段正是实现这种机制的手段。
TTL是IP数据报头中的字段,其在IP头部的位置如下图所示:
图1 TTL字段在IP报头的位置
通过上图,我们可以发现,TTL字段占了8个bit,那么一般而言,最大的TTL值就是2^8=255啦。
应用分析案例
介绍完TTL字段的作用,接下来我们分别来看一下在实际的网络分析过程中, TTL字段能够给我们提供哪些有用的信息和帮助。
2.1 识别操作系统
根据操作系统和传输协议的不同,其TTL字段的值也不同,那么我们可以根据IP数据报的TTL字段来大体识别相应的操作系统类型。下图为各种操作系统在传输TCP和UDP时默认使用的TTL值:
图2 不同操作系统默认情况下的TTL值
绝大多数的用户都不会主动的修改其操作系统默认的TTL值,因此黑客会利用这个特性来简单判断目的主机的操作系统,从而实施相应的攻击计划,而在我们网络维护和分析的过程中,也可以通过对异常数据包的TTL值的分析来简单判断异常主机的操作系统,从而缩小我们的故障定位范围,提高故障解决的效率。
2.2 发现网络环路
在计算机网络中,环路一般分为两种,一种为二层物理环路,另一种为三层路由环路。
二层物理环路一般是由于二层交换机出现了物理连接上的环路并且二层交换机上未启用STP生成树协议导致的。二层物理环路一旦产生,其导致的广播风暴会给网络带来致命的威胁。由于数据包在二层环路间转发时,其TTL值不会递减,因此,我们可以利用这个特点,通过分析数据包的TTL值字段来定位网络中是否存在二层物理环路。如果同一数据包(根据IP报头中的IP标识字段来定位)多次出现而且其TTL值一直保持一致,那么就说明网络中出现了二层的物理环路了。
三层路由环路一般是由于路由策略配置不当导致的。我们前面在介绍TTL时,已经说明TTL主要是为了防止路由环路的情况出现而设置的,当网络出现路由环路时,IP数据报会在路由环路间不断的循环转发最终使其TTL值递减为0,我们可以利用路由环路的这个特性和TTL值来定位路由环路,如下图所示:
图3 路由环路情况下IP数据报的TTL值
当我们在网络分析过程中发现TTL=1的IP数据包(多播报文除外)时,我们就需要关注是否存在网络路由环路了,我们一般会结合IP数据报的标识字段,来快速的定位出网络中存在路由环路,如果同一数据包反复出现,而且其TTL值呈递减的趋势并最终变为1,那么就说明当前的网络中存在三层的路由环路了。
2.3 检测是否经过了路由设备
当IP数据报经过路由设备时,该路由设备在转发时一般会将其TTL值减1,因此,我们可以根据路由设备后所抓取数据包的TTL值来判断该数据包是否已经经过路由设备。这个在实际网络分析过程中似乎用处不大,但是在一些特殊的网络管理情况下,我们需要知道某些数据包是否经过了路由设备,例如,在一个对网络访问限制较为严格的网络环境中,部分重要的服务器可能只有某几个网段的机器可以访问,其他网段的IP地址是没有访问权限的,那么,就可能出现某些别有用心的人利用具有访问权限的IP地址做NAT地址转换间接访问受限服务器资源的情况,具体如下图所示:
图4 通过NAT非法访问服务器端示意图
网络管理者当然不期望这种情况发生,因为它很可能会带来各种致命的网络安全问题。在这种情况下,访问权限的主机访问受限访问服务器时,经过有访问权限主机的NAT和转发,因此,其IP数据报的TTL值比系统初始值小1,那么,我们就可以利用这个特性,在网络中部署网络分析系统,对网络中的数据包进行捕获,通过查看数据包的TTL值来判断网络中是否存在NAT设备,从而定位出利用路由设备进行越权访问的主机。
这种方法也是电信所使用的ADSL多用户检测技术之一。
2.4 检测数据包的不对称路由
我们知道IP是不可靠的的协议,它不能保证数据包在传输的过程中会被丢失、失序,而IP选路功能可以让同一连接的数据包通过不同的路径进行转发,这种特性提高了IP数据包的转发效率,但有时也会带来不必要的麻烦,例如,在使用基于状态检测的防火墙环境中,如果在TCP连接建立阶段的三次握手报文经过不同的路径转发,那么,很可能导致TCP应用异常(由于防火墙没有收到完整的TCP三次握手的数据包,因此无法正常建立TCP状态表),如下图所示:
图5 不对称路由示意图
在这种情况下,我们一般可以通过在服务器端与客户端分别traceroute对端地址来判断数据包来回路径的是否一致,我们也可以通过在客户端与服务器端同时抓包,分析数据包的TTL值来确定客户端与服务器端在转发数据包时经过的路由跳数是否一致,从而判断数据包来回的路由路径是否一致。
2.5 发现TCP会话劫持
会话劫持(Session Hijack)是指攻击者使用一些技术手段将攻击主机伪装成客户端或服务器的应用程序,在客户端与服务器之间进行数据传输,从而导致服务器或客户端误认为攻击主机是自己想要进行数据交互的合法主机。
黑客一般会利用TCP会话劫持来实现对数据包的监听,从而从中获取很多机密的敏感信息,包括用户名和口令等;运营商也经常使用TCP会话劫持技术来推送广告,或由于一些特殊的原因而干扰客户端的正常应用。
会话劫持利用了TCP/IP工作原理来设计攻击根据TCP/IP中的规定,使用TCP协议进行通讯需要提供两段序列号,TCP协议使用这两段序列号确保连接同步以及数据传输的可靠性,系统的TCP/IP协议栈依据时间或线性的产生这些值。在通讯过程中,双方的序列号是相互依赖的,这也就是为什么称TCP协议是可靠的传输协议(具体可参见RFC 793)。如果攻击者在这个时候进行会话劫持,结果肯定是失败,因为会话双方“不认识”攻击者,攻击者不能提供合法的序列号;所以,会话劫持的关键是预测正确的序列号,攻击者可以采取嗅探技术获得这些信息。在讨论TCP会话攻击之前,我们先来看一下TCP序列号的相关知识,在每一个数据包中,都有两段序列号,它们分别为:
SEQ:当前数据包中的第一个字节的序号
ACK:期望收到对方数据包中第一个字节的序号
假设双方现在需要进行一次连接,服务器的相关TCP段中的字段为:
S_SEQ:将要发送的下一个字节的序号
S_ACK:将要接收的下一个字节的序号
S_WIND:接收窗口
客户端相关TCP段中的字段为:
C_SEQ:将要发送的下一个字节的序号
C_ACK:将要接收的下一个字节的序号
C_WIND:接收窗口
它们之间必须符合下面的逻辑关系,否则该数据包会被丢弃,并且返回一个ACK包(包含期望的序列号)。
C_ACK <= C_SEQ <= C_ACK + C_WIND
S_ACK <= S_SEQ <= S_ACK + S_WIND
接下来我们一起来看一下TCP会话劫持的过程,假设现在主机A和主机B进行一次TCP会话,C为攻击者,劫持过程如下:
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
FLAGS: -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风暴,就可以成功进行会话劫持了。这里涉及到攻击主机C所处的位置了,攻击主机C必定处于主机A与主机B之间,那么主机A的数据包到主机B的数据包路径基本一致,也就是说,主机A与主机B间的数据包的TTL值基本上固定的,那么当攻击主机C处于主机A与主机B之间实施TCP会话劫持时,其劫持发向主机A与主机B的数据包的TTL值肯定与原本主机A与主机B间的通讯数据包的TTL值不一样,我们就可以利用这一特性,通过抓取并分析这些数据包,发现TCP会话攻击行为。
2.6 发现局域网内中间人攻击
局域网内的中间人攻击一般首先采用arp欺骗的手段,让局域网内被攻击主机的流量全部经过实施攻击的主机,再由实施攻击的主机将相关数据包转发到网关设备上(需攻击主机开启路由转发服务),从而使被攻击主机的数据流都经过实施攻击的主机,这样,实施攻击的主机就可以抓取相应的数据包,收集相应的敏感信息了(用户名和密码)。一般的中间人攻击(特别是有意的攻击)其在流量不大的情况下,很难被用户发现,因为,对用户的网络访问影响很小,用户基本上感觉不到“中间人”的存在。
实施这种攻击的工具比较多,(最著名、使用最简单的windows下实施局域网中间人攻击的工具就是cain了,当然,我们也可以直接使用sniffer类工具构造欺骗包实施欺骗),有时候在不具备抓包环境的交换网络中,我们也可以通过中间人攻击的方式抓取全网的数据包。具体局域网中间人攻击的示意图如下所示:
图6 局域网中间人攻击示意图
我们来简单看一下局域网中间人攻击的行为特征:
l 首先需要进行arp欺骗(具有arp欺骗的一些特征);
l 其次需要经过攻击主机转发数据包;
l 攻击主机在转发数据包后需要发送icmp重定向数据包给被攻击主机。
我们通过上面三个网络行为特征,可以很容易的定位一个局域网中间人攻击行为,但是,我们如果只看到arp欺骗行为的话,并没有办法定位到底是不是一个局域网中间人攻击行为,而icmp重定向包在实施有意的中间人攻击时,“黑客”一般会使用本机防火墙过滤icmp重定向包,在网络中就不会看到icmp重定向包了,在这种情况下,我们可以发现,本应该发送给网关的数据包经过了攻击主机的转发,因此,其TTL值比原先正常的数据包的TTL小1,我们可以通过抓包分析数据包的TTL变化来定位局域网中是否存在类似的攻击;另一方面,考虑到网关设备操作系统默认的TTL值与攻击主机操作系统的TTL值一般都是有差别的,那么,我们也可以使用以下最简单的方法来定位:利用ping命令ping网关地址,根据ping返回的TTL值来判断是否是当前的正确的网关。
2.7 发现IDS等旁路部署的安全设备的阻断行为
现在在网络中存在大量的安全设备,有些安全设备是旁路部署的,例如IDS、网络行为管理系统等,这些安全设备通过交换机的端口镜像(或其他方式)收集网络中的数据包,再通过对数据包的重组和分析,完成对网络主机相关网络行为的检测和审计,同时,可以根据管理员设置的安全策略,管理控制网络相关主机的网络访问行为。一般针对基于TCP的应用,其主要通过向客户端和服务器端发送TCP RESET包来阻断非授权TCP应用,针对基于UDP应用则发送ICMP端口不可达报文来阻断非授权的UDP应用。
在这种情况下,由于RST或ICMP端口不可达数据报文不是真正的服务器端发送的,而是安全设备构造的虚假欺骗报文,我们可以通过抓取数据包,查看相应数据包的TTL值来确认这种情况的存在,其分析的原理跟分析TCP会话劫持的原理是一样的,在此就不作重复说明了。
补充说明与总结
3.1 补充说明
1、有些NAT设备在转发数据包时,不会将TTL值减1,这个跟具体设备的实现有关。
2、TTL值是可以人工修改的。在windows环境下可以通过修改注册表来实现对系统TTL值的设置,具体方法如下:
在windows注册表中,按照下面的路径找到defaultTTL,双击其修改即可。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
图7 windows系统修改默认TTL值图示
3、很多组播应用为将多播数据限制在一个局域网内会将其TTL值设为1;还有些特殊的局域网应用考虑到信息的安全性,不希望将其跨路由传输到局域网以外的网络,其可能会将其TTL设置为1;
4、路由设备在收到TTL为0或1的数据包时,路由是不会转发这个数据包的,主机如果收到TTL为0或1的数据包则提交给上层应用程序处理。
3.2 总结
TTL字段在实际的分析过程中有着非常多的应用,我上面已经列举了很多,但其实我们大家只要深入理解了TTL字段的本质作用,就可以在更多的实际分析过程中灵活地运用其来定位故障或发现异常。