tcpdump抓包分析详解

来源:互联网 发布:看图猜成语软件 编辑:程序博客网 时间:2024/04/30 02:38

 

说 实在的,对于 tcpdump 这个软件来说,你甚至可以说这个软件其实就是个黑客软件,因为他不但可以分析封包的流向,连封包的内容也可以进行『监听』, 如果你使用的传输数据是明码的话,不得了,在 router 上面就可能被人家监听走了!很可怕吶!所以,我们也要来了解一下这个软件啊!(注:这个 tcpdump 必须使用 root 的身份执行)


如果你是第一次看 tcpdump 的 man page 时,肯定一个头两个大,因为 tcpdump 几乎都是分析封包的表头数据,用户如果没有简易的网络封包基础,要看懂粉难吶!所以,至少您得要回到网络基础里面去将 TCP 封包的表头数据理解理解才好啊!^_^!至于那个范例一所产生的输出范例中,我们可以约略区分为数个字段, 我们以范例一当中那个特殊字体行来说明一下:

[root@linux ~]# tcpdump [-nn] [-i 接口] [-w 储存档名] [-c 次数] [-Ae]

                        [-qX] [-r 档案] [所欲撷取的数据内容]

参数:

-nn:直接以 IP 及 port number 显示,而非主机名与服务名称

-i :后面接要『监听』的网络接口,例如 eth0, lo, ppp0 等等的界面;

-w :如果你要将监听所得的封包数据储存下来,用这个参数就对了!后面接档名

-c :监听的封包数,如果没有这个参数, tcpdump 会持续不断的监听,

     直到使用者输入 [ctrl]-c 为止。

-A :封包的内容以 ASCII 显示,通常用来捉取 WWW 的网页封包资料。

-e :使用资料连接层 (OSI 第二层) 的 MAC 封包数据来显示;

-q :仅列出较为简短的封包信息,每一行的内容比较精简

-X :可以列出十六进制 (hex) 以及 ASCII 的封包内容,对于监听封包内容很有用

-r :从后面接的档案将封包数据读出来。那个『档案』是已经存在的档案,

     并且这个『档案』是由 -w 所制作出来的。

所欲撷取的数据内容:我们可以专门针对某些通讯协议或者是 IP 来源进行封包撷取,

     那就可以简化输出的结果,并取得最有用的信息。常见的表示方法有:

     'host foo', 'host 127.0.0.1' :针对单部主机来进行封包撷取

     'net 192.168' :针对某个网域来进行封包的撷取;

     'src host 127.0.0.1' 'dst net 192.168':同时加上来源(src)或目标(dst)限制

     'tcp port 21':还可以针对通讯协议侦测,如 tcp, udp, arp, ether 等

     还可以利用 and 与 or 来进行封包数据的整合显示呢!

范例一:以 IP 与 port number 捉下 eth0 这个网络卡上的封包,持续 3 秒

[root@linux ~]# tcpdump -i eth0 -nn

tcpdump: verbose output suppressed, use -v or-vv for full protocol decode

listening on eth0, link-type EN10MB(Ethernet), capture size 96 bytes

01:33:40.41 IP192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win 9648

01:33:40.41 IP 192.168.1.100.22 >192.168.1.11.1190: P 232:364(132) ack 1 win 9648

<==按下 [ctrl]-c 之后结束

6680 packets captured              <==捉下来的封包数量

14250 packets received by filter   <==由过滤所得的总封包数量

7512 packets dropped by kernel     <==被核心所丢弃的封包

  • 01:33:40.41:这个是此封包被撷取的时间,『时:分:秒』的单位;
  • IP:透过的通讯协议是 IP ;
  • 192.168.1.100.22     > :传送端是 192.168.1.100 这个 IP,而传送的 port number 为 22,您必须要了解的是,那个大于 (>) 的符号指的是封包的传输方向喔!    
  • 192.168.1.11.1190:接收端的 IP 是     192.168.1.11, 且该主机开启 port 1190 来接收;
  • P     116:232(116):这个封包带有 PUSH 的数据传输标志, 且传输的数据为整体数据的 116~232     byte,所以这个封包带有 116 bytes 的数据量;
  • ack     1 win 9648:ACK与 Window size 的相关资料。

最简单的说法,就是该封包是由 192.168.1.100 传到 192.168.1.11,透过的 port 是由 22 到 1190 , 且带有 116bytes 的数据量,使用的是 PUSH 的旗标,而不是SYN 之类的主动联机标志。 呵呵!不容易看的懂吧!所以说,上头才讲请务必到 TCP 表头数据的部分去瞧一瞧的啊!

再来,一个网络状态很忙的主机上面,你想要取得某部主机对你联机的封包数据而已时, 使用 tcpdump 配合管线命令与正规表示法也可以,不过,毕竟不好捉取!我们可以透过 tcpdump 的表示法功能,就能够轻易的将所需要的数据独立的取出来。 在上面的范例一当中,我们仅针对 eth0 做监听,所以整个 eth0 接口上面的数据都会被显示到屏幕上,不好分析啊!那么我们可以简化吗?例如只取出 port 21 的联机封包,可以这样做:

[root@linux ~]# tcpdump -i eth0 -nnport 21

tcpdump: verbose output suppressed, use -v or-vv for full protocol decode

listening on eth0, link-type EN10MB(Ethernet), capture size 96 bytes

01:54:37.96 IP 192.168.1.11.1240 >192.168.1.100.21: . ack 1 win 65535

01:54:37.96 IP 192.168.1.100.21 >192.168.1.11.1240: P 1:21(20) ack 1 win 5840

01:54:38.12 IP 192.168.1.11.1240 >192.168.1.100.21: . ack 21 win 65515

01:54:42.79 IP 192.168.1.11.1240 >192.168.1.100.21: P 1:17(16) ack 21 win 65515

01:54:42.79 IP 192.168.1.100.21 >192.168.1.11.1240: . ack 17 win 5840

01:54:42.79 IP 192.168.1.100.21 >192.168.1.11.1240: P 21:55(34) ack 17 win 5840

瞧!这样就仅提出 port 21 的信息而已,且仔细看的话,你会发现封包的传递都是双向的, client 端发出『要求』而 server 端则予以『响应』,所以,当然是有去有回啊!而我们也就可以经过这个封包的流向来了解到封包运作的过程。 举例来说:

  1. 我们先在一个终端机窗口输入『 tcpdump -i lo -nn 』 的监听,
  2. 再另开一个终端机窗口来对本机 (127.0.0.1) 登入『ssh localhost』

那么输出的结果会是如何?

[root@linux ~]# tcpdump -i lo -nn

1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

2 listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes

3 11:02:54.253777 IP 127.0.0.1.32936 > 127.0.0.1.22: S 933696132:933696132(0)

   win32767 <mss 16396,sackOK,timestamp 236681316 0,nop,wscale 2>

4 11:02:54.253831 IP 127.0.0.1.22 > 127.0.0.1.32936: S 920046702:920046702(0)

   ack 933696133 win 32767 <mss16396,sackOK,timestamp 236681316 236681316,nop,

  wscale 2>

5 11:02:54.253871 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 1 win 8192 <nop,

  nop,timestamp 236681316 236681316>

6 11:02:54.272124 IP 127.0.0.1.22 > 127.0.0.1.32936: P 1:23(22) ack 1 win8192

  <nop,nop,timestamp 236681334 236681316>

7 11:02:54.272375 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 23 win 8192<nop,

  nop,timestamp 236681334 236681334>

上表显示的头两行是 tcpdump 的基本说明,然后:

  • 第 3 行显示的是『来自 client 端,带有 SYN 主动联机的封包』,
  • 第 4 行显示的是『来自 server 端,除了响应 client 端之外(ACK),还带有 SYN 主动联机的标志;
  • 第 5 行则显示 client 端响应 server 确定联机建立 (ACK)
  • 第 6 行以后则开始进入数据传输的步骤。

从第 3-5 行的流程来看,熟不熟悉啊?没错!那就是 三向交握 的基础流程啦!够有趣吧!不过 tcpdump 之所以被称为黑客软件之一可不止上头介绍的功能吶! 上面介绍的功能可以用来作为我们主机的封包联机与传输的流程分析,这将有助于我们了解到封包的运作,同时了解到主机的防火墙设定规则是否有需要修订的地方。

更神奇的使用要来啦!如果我们使用 tcpdump 在router 上面监听『明码』的传输数据时, 例如 FTP 传输协议,你觉得会发生什么问题呢? 我们先在主机端下达『 tcpdump -i lo port 21 -nn -X 』然后再以 ftp 登入本机,并输入账号与密码,结果你就可以发现如下的状况:

[root@linux ~]# tcpdump -i lo -nn -X'port 21'

   0x0000:  4500 0048 2a28 4000 40061286 7f00 0001  E..H*(@.@.......

   0x0010:  7f00 0001 0015 80ab 83552149 835c d825  .........U!I.\.%

   0x0020:  8018 2000 fe3c 0000 0101080a 0e2e 0b67  .....<.........g

   0x0030:  0e2e 0b61 3232 3020 28767346 5450 6420  ...a220.(vsFTPd.

   0x0040:  322e 302e 3129 0d0a                      2.0.1)..

   0x0000:  4510 0041 d34b 4000 40066959 7f00 0001  E..A.K@.@.iY....

    0x0010: 7f00 0001 80ab 0015 835c d825 8355 215d .........\.%.U!]

   0x0020:  8018 2000 fe35 0000 0101080a 0e2e 1b37  .....5.........7

   0x0030:  0e2e 0b67 5553 4552 20646d74 7361 690d  ...gUSER.dmtsai.

   0x0040:  0a                                       .

   0x0000:  4510 004a d34f 4000 4006694c 7f00 0001  E..J.O@.@.iL....

   0x0010:  7f00 0001 80ab 0015 835cd832 8355 217f  .........\.2.U!.

   0x0020:  8018 2000 fe3e 0000 0101080a 0e2e 3227  .....>........2'

   0x0030:  0e2e 1b38 5041 5353 206d 79706173 7377  ...8PASS.mypassw

   0x0040:  6f72 6469 7379 6f750d0a                 ordisyou..

上面的输出结果已经被简化过了,你必须要自行在你的输出结果当中搜寻相关的字符串才行。从上面输出结果的特殊字体中,我们可以发现『该 FTP 软件使用的是vsftpd ,并且使用者输入 dmtsai 这个账号名称,且密码是 mypasswordisyou』 嘿嘿!你说可不可怕啊!如果使用的是明码的方式来传输你的网络数据? 所以我们才常常在讲啊,网络是很不安全低!

另外你得了解,为了让网络接口可以让 tcpdump 监听,所以执行 tcpdump 时网络接口会启动在 『错乱模式 (promiscuous)』,所以你会在 /var/log/messages 里面看到很多的警告讯息, 通知你说你的网络卡被设定成为错乱模式!别担心,那是正常的。至于更多的应用,请参考 man tcpdump 啰!

例题:如何使用 tcpdump 监听 (1)来自 eth0 适配卡且 (2)通讯协议为 port 22 ,(3)目标来源为192.168.1.100 的封包资料?

答:

tcpdump-i eth0 -nn 'port 22 and src host 192.168.1.100'