网络流量分析(一)
原著: Karen Frederick
翻译:土鳖(ISHTAR ISHTARIII@263.NET)
发表日期:2001/01/29
发表地点:www.securityfocus.net
以往关于入侵分析的文章都把注意力集中在可疑的数据包(TCP包或者保留的IP地址)上.但是弄清楚什么是正常的网络数据流也是非常重要的.知道什么是正常数据流最好的办法就是先产生一些正常的数据流,然后拦截数据包进行分析.在本文中,本人介绍一些截获数据包的工具并对截获数据进行一些分析,顺带说一下非正常的数据流.学习本文的前提在于你已经有TCP/IP的基础.
现在已经有了 很多截获数据包的工具,最有名的是UNIX下的TCPDUMP和WINDOWS下面的WINDUMP.我在自己家98的机器上用过WINDUMP2.1,用CABLE MODEM上网拦截数据包,不过需要指出的是:未经授权而拦截数据包时你可千万要小心啊.
WINDUMP基础
WINDUMP使用起来很简单,在它的站点上你可以找到使用文件.我经常用的命令是WINDUMP –N –S,或者WINDUMP –n –S –v 或者WINDUMP –n-S-vv.-N是不显示计算机名而直接显示IP地址;-S是显示TCP/IP的实际进程数,如果不选择这个选项,可能出现的就是近似值,比如:如果现在的进程数是87334271,下一秒变成了多了一个,就会显示出来是87334272.-V和-VV是让机器显示更加全面的信息,显示诸如存活时间/IP的ID等信息.
在开始剖析例子之前,我们先看一下WINDUMP记录的不同种类的数据包,这里有一个TCP的例子,
13:45:19.184932 sshserver.xx.yy.zz.22 > mypc.xx.yy.zz.3164: P 4138420250:4138420282(32) ack
87334272 win 32120 (DF)
13:45:19.184932 [timestamp] sshserver.xx.yy.zz.22 [source address and port] >
mypc.xx.yy.zz.3164: [destination address and port] P [TCP flags] 4138420250:4138420282
[sequence numbers] (32) [bytes of data] ack 87334272 [acknowledgment flag and number] win
32120 [window size] (DF) [don't fragment flag is set]
and then gives the number of data bytes in the packet:
下一个是UDP的例子,里面也是该有的全有了:时戳/数据源地址和端口/目的地地址和端口,最后还招供了使用的协议(UDP)和数据包里面的数据数
15:19:14.490029 208.148.96.68.23079 > mypc.xx.yy.zz.6976: udp 401
ICMP包格式也是类似的,只是注意一下最后,出现了存活时间和IP的ID,当然,你要使用-V选项
18:33:45.649204 mypc.xx.yy.zz > 64.208.34.100: icmp: echo request (ttl 4, id 56693)
最后,WINDUMP也抓获ARP请求和回复.我们来看看:第一行是ARP请求;在这个例子里,MYPC把MAC地址为24.167.235.1的机器信息发送MYPC.XX.YY.ZZ(MYPC的IP地址),第二行则显示了ARP回复,包含着24.167.235.1这个MAC地址.
13:45:13.836036 arp who-has 24.167.235.1 tell mypc.xx.yy.zz
13:45:13.841823 arp reply 24.167.235.1 is-at 0:xx:xx:xx:xx:xx
UDP和ICMP例子
上面我们已经看过了WINDUMP的记录格式,接下来我们看看数据包:MYPC使用DHCP来获得IP地址,而DHCP租用是定时更新的,这个过程是从MYPC的68端口到DHCP机器的67端口,然后由DHCP服务器回送到MYPC
18:47:02.667860 mypc.xx.yy.zz.68 > dnsserver.xx.yy.zz.67: xid:0x8d716e0f C:mypc.xx.yy.zz [|bootp]
18:47:03.509471 dnsserver.xx.yy.zz.67 > mypc.xx.yy.zz.68: xid:0x8d716e0f C:mypc.xx.yy.zz
Y:mypc.xx.yy.zz [|bootp]
WINDUMP的一个好处就在于它可以自动识别协议和记录的其他信息,在这个例子里,他就识别出这是一个BOOTP,所以它不仅记录了标准的UDP记录,而且记录了BOOTP的特定信息:XID,C,Y.
现在我们来看看一些ICMP数据:一个例子就是你在98机器上使用TRACERT命令时出现的数据流,WINDOWS使用ICMP来识别系统之间的跳(UNIX则使用UDP).
WINDOWS在执行路由追踪时先向目的主机发送3个ICMP包,将存活时间设为1,这意味着当数据包到达第一跳时,数值会降为0.此时.第一跳的机器会将ICMP超时错的信息回送到主机,主机就再发出3个ICMP包,将跳数设为2,所以这会就可以在时延结束前到达第二跳的机器,第二跳的机器就又将时延错回送到主机,主机重新再发ICMP包,如此这般,直到找到目标机或者中间有一关将数据流截断为止.
which is one of the intermediate network devices between mypc and 64.208.34.100.
这里就有一个路由追踪的例子,ICMP的时延值已经被设为1,2,3而且都已经过期,由于尚未到达最终目的机,WINDOWS开始发送时延设为4的ICMP包,这里是第一个数据包和回复 ,请注意虽然第一个数据包的目的地址是64.208.34.100,回复却来自于24.95.80.133,这是MYPC和64.208.34.100之间的一个网络设施的地址.
18:33:45.649204 mypc.xx.yy.zz > 64.208.34.100: icmp: echo request (ttl 4, id 56693)
18:33:45.668638 24.95.80.133 > mypc.xx.yy.zz: icmp: time exceeded in-transit (ttl 252, id 0)
在收到时延错误信息的千分之一秒内,MYPC发出后续的ICMP包,在收到数据包的错误信息时,机器立即发送出第三个ICMP包:
18:33:45.669968 mypc.xx.yy.zz > 64.208.34.100: icmp: echo request (ttl 4, id 56949)
18:33:45.690719 24.95.80.133 > mypc.xx.yy.zz: icmp: time exceeded in-transit (ttl 252, id 0)
18:33:45.691863 mypc.xx.yy.zz > 64.208.34.100: icmp: echo request (ttl 4, id 57205)
18:33:45.710787 24.95.80.133 > mypc.xx.yy.zz: icmp: time exceeded in-transit (ttl 252, id 0)
请注意这些数据相当近似,只是每一个ICMP回应请求中IP的ID号不同,这点很重要,我们应该对IP的ID号雷同的现象引起高度的重视.
检测SSH进程
SSH是一个更加典型的数据流.我在工作站上装了个SSH的客户并连接到一个开了俺帐户的机器上.
我有用于连接到SSH服务器上的SSH的客户端软件.我的机器并不直到SSH服务器的IP地址,所以他需要DNS的服务,不幸的是,我的机器上又使不了DNS,所以没办法的办法之一就是先使ARP取得默认网关的MAC地址.
13:45:13.836036 arp who-has gateway.xx.yy.zz tell mypc.xx.yy.zz
13:45:13.841823 arp reply gateway.xx.yy.zz is-at 0:xx:xx:xx:xx:xx
would expect with a DNS query:
现在可以连接到网关上了,MYPC可以发出如下所示的DNS请求,请注意MYPC使用了大于1023的端口,要求建立到DNS的53端口的连接,这种请求使用的是UDP协议
13:45:13.841920 mypc.xx.yy.zz.3163 > dnsserver.xx.yy.zz.53: 1+ A? sshserver. (32)
DNS请求的结果是”1+A SSHSERVER”,我们可以认为这是一个IP地址的进程,因为A和+证明我们要求的是一个循环进程,1是DNS请求数,用于匹配DNS的请求和回复,SSHSERVER则是我们要解析的名字
以下是DNS服务器的回应:
13:45:13.947208 dnsserver.xx.yy.zz.53 > mypc.xx.yy.zz.3163: 1 q: sshserver. 3/4/6 sshserver. CNAME
ssh2server., ssh2server. CNAME ssh3server., ssh3server. A sshserver.xx.yy.zz (283)
回复情况由"1 q: sshserver. 3/4/6"体现,1是DNS的进程序号, "q: sshserver."是显示我们的请求,3/4/6是显示有3个回复,4个标准记录和6个额外记录,和SSHSERVER连接的IP地址方在A后面
现在我们知道了SSH服务器的IP地址,就可以连上去了,MYPC开始三次握手:
13:45:13.956853 mypc.xx.yy.zz.3164 > sshserver.xx.yy.zz.22: S 87334271:87334271(0) win 65535 (DF)
13:45:14.059243 sshserver.xx.yy.zz.22 > mypc.xx.yy.zz.3164: S 4138420249:4138420249(0) ack 87334272
win 32120 (DF)
13:45:14.059475 mypc.xx.yy.zz.3164 > sshserver.xx.yy.zz.22: . 87334272:87334272(0) ack 4138420250
win 65535 (DF)
三次握手完成,记住:即使2台机器在SSH端口建立了连接,我也没有登录到SSH服务器上去,在3次握手完成前机器间并没有数据交流.SSH客户和服务器是建立了SSH进程,通过下面的数据包进行交流:
13:45:19.184932 sshserver.xx.yy.zz.22 > mypc.xx.yy.zz.3164: P 4138420250:4138420282(32) ack
87334272 win 32120 (DF)
13:45:19.201814 mypc.xx.yy.zz.3164 > sshserver.xx.yy.zz.22: P 87334272:87334314(42) ack 4138420282
win 65503 (DF)
13:45:19.300401 sshserver.xx.yy.zz.22 > mypc.xx.yy.zz.3164: . 4138420282:4138420282(0) ack 87334314
win 32120 (DF)
13:45:19.300616 mypc.xx.yy.zz.3164 > sshserver.xx.yy.zz.22: P 87334314:87334690(376) ack 4138420282
win 65503 (DF)
13:45:19.303977 sshserver.xx.yy.zz.22 > mypc.xx.yy.zz.3164: P 4138420282:4138421210(928) ack
87334314 win 32120 (DF)
13:45:19.422141 sshserver.xx.yy.zz.22 > mypc.xx.yy.zz.3164: . 4138421210:4138421210(0) ack 87334690
win 32120 (DF)
13:45:19.488282 mypc.xx.yy.zz.3164 > sshserver.xx.yy.zz.22: . 87334690:87334690(0) ack 4138421210
win 64575 (DF)
sshserver's port 22.
我敲了密码,正式作为用户登录了进去,所有我使用SSH服务器所产生的数据流都很类似,在MYPC的3136端口和SERVER的22端口之间,有PSH/ACK和ACK包.
我从SSHSERVER注销的时候,服务器和客户机之间也有数据流产生,客户机收到来自服务器的最后数据:
13:45:33.791528 mypc.xx.yy.zz.3164 > sshserver.xx.yy.zz.22: P 87335442:87335474(32) ack 4138426586
win 64359 (DF)
13:45:33.902690 sshserver.xx.yy.zz.22 > mypc.xx.yy.zz.3164: . 4138426586:4138426586(0) ack 87335474
win 32120 (DF)
一旦收到这个数据,客户机就自动断开连接,服务器确认断开:
13:45:33.902909 mypc.xx.yy.zz.3164 > sshserver.xx.yy.zz.22: F 87335474:87335474(0) ack 4138426586
win 64359 (DF)
13:45:34.002179 sshserver.xx.yy.zz.22 > mypc.xx.yy.zz.3164: . 4138426586:4138426586(0) ack 87335475
win 32120 (DF)
13:45:34.003336 sshserver.xx.yy.zz.22 > mypc.xx.yy.zz.3164: F 4138426586:4138426586(0) ack 87335475
win 32120 (DF)
13:45:34.003492 mypc.xx.yy.zz.3164 > sshserver.xx.yy.zz.22: . 87335475:87335475(0) ack 4138426587
win 64359 (DF)
所以,我们可以归纳出SSH连接的5个步骤:
(1)使用ARP确认MYPC的默认网关的MAC地址
(2)发出DNS请求确认SSH服务器的IP地址
(3)MYPC的高端口和SSHSERVER低端口间的三次TCP握手
(4)MYPC和SSHSERVER之间的数据交流,包括建立SSH连接,用户认证和数据传输.
(5)MYPC和服务器间的TCP连接断开
在这个例子里,SSH客户机使用的是高端口(高于1023).在一般连接里,客户机使用的高端口而服务器使用的是低端口,但是需要引起注意的是很多SSH的客户机也使用低端口,所以千万别让一个和本文例子不同的情况把你给弄糊涂了
在和SSH类似的连接里,有更多的如TELNET等协议
结论
对例行的网络流量进行分析是好好了解TCP/IP和我们环境的好办法,每次我拦截数据包时,我总能学到点新东西,如果你对本文有了兴趣, 我强烈建议你生产/拦截并分析你自己的数据包, 我只是稍微进行 了一些介绍,后面将继续介绍更多的数据流分析,尤其是FTP和HTTP.
以下为作者简介:
Karen Frederick is a senior security engineer for NFR Security. Karen has a B.S. in Computer Science and is completing her Master's thesis in intrusion detection through the University of Idaho's Engineering Outreach program. She holds several certifications, including Microsoft Certified Systems Engineer + Internet, Check Point Certified Security Administrator, and SANS GIAC Certified Intrusion Analyst. Karen is one of the authors and editors of "Intrusion Signatures and Analysis", a new book on intrusion detection that was published in January 2001.