网络流量分析(一) 原著: 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.
来自:http://blogold.chinaunix.net/u2/62281/showart_571266.html
| |