tcpdump 教程及入门示例

看到一个关于 tcpdump 的教程,感觉写得很好,想翻译以下,以做记录、学习
这是 原文链接,多多指教!

以下是正文

TCP 头部
TCP 头部

——更多相关教程,请点击 这里

tcpdump 是重要的网络专业信息安全分析工具,它具有超级强大的截取能力,是所有想深入了解 TCP/IP 的人所必备的。许多人喜欢使用更高一级的分析工具,如 Wireshark ,但我相信这是错误的。

对于这样一门如此依赖概念理解和机械学习的学科中,精通底层的 TCP/IP 协议簇是很重要的。精通掌握这些协议的人解决问题的能力水平远远高于一般的分析师,但是掌握协议的唯一可能是持续地将他们暴露出来。

当使用工具更自然(原始)的显示网络流量时,分析的负担直接压在人的身上,而不是应用程序。这种方法培养人不断提升对 TCP/IP 套件的理解能力,正因如此,我强烈建议使用 tcpdump 而不是其它分析工具。

15:31:34.079416 IP (tos 0x0, ttl  64, id 20244, offset 0, flags [DF], 
proto: TCP (6), length: 60) source.35970 > dest.80: S, cksum 0x0ac1 
(correct), 2647022145:2647022145(0) win 5840 0x0000:  4500 003c 4f14 4000 
4006 7417 0afb 0257  E..  0x0010:  4815 222a 8c82 0050 9dc6 5a41 0000 
0000  H."*...P..ZA....  0x0020:  a002 16d0 0ac1 0000 0204 05b4 
0402 080a  ................  0x0030:  14b4 1555 0000 0000 0103 0302

选项

下面是一些选项(带例子),它们会对你使用这个工具有很大的帮助。它们很容易被忘记,并且/或者和其它类型的过滤器混淆,因此,希望这个页面能够作为一个参考来为你服务,正如它为我服务一样。

首先,我会根据我想查找什么给 tcpdump 添加一些它自己的选项。第一个是 -n,这会使得主机名不被解析,结果总是显示 IP 地址本身。第二个是 -X,这会将数据包的内容同时以十六进制数据和 ASCII 数据来显示。最后一个是 -S,它会显示绝对序列号而不是相对的。这样做的结果是,如果它对你隐藏,你就不能看到离奇的序列号。请记住,对于其它工具来说,使用 tcpdump 的优势是对数据包的人工交互。

同样重要的一点是,tcpdump 默认值取数据包的 96 字节的数据。如果你想获取更多的数据,添加 -s number,这个 number 代表截取的字节数。我建议使用 0,这会截取所有的数据。这里是我常用的选项列表:

——注意:以下所有的选项都是跟在 tcpdump 之后,例如:tcpdump -i any

  • -i any:监听所有的网卡是否有流量
  • -i eth0:监听 eth0 接口
  • -D:显示可用的接口列表
  • -n:不解析主机名
  • -nn:不解析主机名或者端口名
  • -q:简略的输出(更安静)
  • -X:将数据包的内容同时以十六进制和 ASCII 的格式显示
  • -XX:和 -X 一样,但多显示以太网报头
  • -v,-vv,-vvv:不断增加你所获取的数据包的信息
  • -c:只捕获特定数量的数据包,然后停止
  • icmp:只捕获 ICMP 数据包
  • -s:定义每个数据包要截取的字节数。使用 -s0 来截取所有数据,除非你故意捕获很少的数据
  • -S:打印绝对序列号
  • -e:同时捕获以太网报头
  • -E:通过提供一个加密密钥来解密 IPSEC 流量

基本用法

所以,根据我所要寻找的流量类型,我使用不同的 tcpdump 选项组合,正如下面的一样:

  1. 基本通信 //查看基本信息,不需要其它选项
# tcpdump -nS
  1. 基本通信(很详细) //查看流量的详细信息,不解析主机名和端口名
# tcpdump -nnvvS
  1. 更深入地查看流量 //增加 -X 选项,但没有抓取数据包更多的数据
# tcpdump -nnvvXS
  1. 非常深入的查看数据包 //最后的“s”增加了捕获数据包的数据量,抓取整个数据包的数据
# tcpdump -nnvvXSs 1514

以下是使用上面描述的选项来捕获两个(-c2) ICMP 数据包,注意我们在每个数据包中我们能够看到多少信息。

hermes root # tcpdump -nnvXSs 0 -c2 icmp
tcpdump: listening on eth0, link-type EN10MB (Ethernet), 23:11:10.370321 IP 
(tos 0x20, ttl  48, id 34859, offset 0, flags [none], length: 84) 
69.254.213.43 > 72.21.34.42: icmp 64: echo request seq 0

        0x0000:  4520 0054 882b 0000 3001 7cf5 45fe d52b  E..T.+..0.|.E..+
        0x0010:  4815 222a 0800 3530 272a 0000 25ff d744  H."..50'..%..D
        0x0020:  ae5e 0500 0809 0a0b 0c0d 0e0f 1011 1213  .^..............
        0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223  .............!"#
        0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233  $%&'()+,-./0123
        0x0050:  3435 3637                                4567
23:11:10.370344 IP (tos 0x20, ttl  64, id 35612, offset 0, flags [none], 
length: 84) 72.21.34.42 > 69.254.213.43: icmp 64: echo reply seq 0
        0x0000:  4520 0054 8b1c 0000 4001 6a04 4815 222a  E..T....@.j.H."
        0x0010:  45fe d52b 0000 3d30 272a 0000 25ff d744  E..+..=0'..%..D
        0x0020:  ae5e 0500 0809 0a0b 0c0d 0e0f 1011 1213  .^..............
        0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223  .............!"#
        0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233  $%&'()+,-./0123
        0x0050:  3435 3637                                4567
2 packets captured
2 packets received by filter
0 packets dropped by kernel
hermes root #

例子

表达式允许你选出各种各样的流量类型,精准地找到你想要的数据。掌握并且创造性地将表达式结合在一起是 tcpdump 真正强大的地方。一共有三类主要的表达式:类型、方向和协议。

类型选项有主机、网络和端口。方向由关键字 dir 表示,可以有以下表达式,srcdstsrc or dstsrc and dst。这里有一些你应该比较熟悉的:

host //根据 IP 地址查询流量(如果你没有使用-n 的话,用域名也可以)

# tcpdump host 1.2.3.4

src,dst //查找从源或者目标发出的流量(忽略会话的另一方)

# tcpdump src 2.3.4.5 
# tcpdump dst 3.4.5.6

net //使用 CIDR 符号来捕获整个网络的流量

# tcpdump net 1.2.3.0/24

proto //对 tcp,udp 和 icmp 有效。不必使用 proto 关键字

# tcpdump icmp

port //只捕获某一端口的流量

# tcpdump port 3389 

src,dst port //根据源或者目标端口来查找

# tcpdump src port 1025 
# tcpdump dst port 389

src/dst,port,protocol //三者结合使用

# tcpdump src port 1025 and tcp 
# tcpdump udp and src port 53

除了单独定义单个的端口来过滤信息,你也可以定义一个范围的端口,大于或者小于某一字节数的数据包。

端口范围 //查找任意范围的端口

# tcpdump portrange 21-23

数据包大小过滤 //只查找大于或小于某一字节数的数据包(单位是字节)

# tcpdump less 32 
# tcpdump greater 128

你也可以使用以下比较符号,>,<,<=,>=

# tcpdump > 32
# tcpdump <= 128

写到文件

使用选项 -w,tcpdump 允许你将捕获的数据保存到文件也便以后分析,然后使用选项 -r 将保存的数据进行分析。这是一个很好的捕获原始数据的方法,然后将数据使用其它工具分析。

以这种方式捕获的数据被保存为 tcpdump 的格式,这在网络分析领域是非常普遍的。这意味着它可以被各种各样的工具读取,包括 Wireshark,Snort 等等。

捕获所有的 80 端口的流量到文件

# tcpdump -s 1514 port 80 -w capture_file

然后在将来的某个时候,你可以将捕获的数据按一下方式读取:

将捕获的数据读回 tcpdump

# tcpdump -r capture_file

创意

表达式很好,但 tcpdump 真正神奇的地方是,它可以将这些表达式创造性的结合到一起,以便可以精确地找到你想要的。共有三种方式进行结合,如果你有学过计算机,你对这会非常熟悉:

  1. AND
and 或者 &&
  1. OR
or 或者 ||
  1. EXCEPT
not 或者 !

更多例子

# 源 IP 为 10.5.2.3 目标端口为 3389 的 TCP 流量

# tcpdump -nnvvS src 10.5.2.3 and dst port 3389

# 源网络为 192.168 目标网络为 10 或者 172.16

tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16

# 没有 ICMP 流量,目标主机是 192.168.0.2 并且源网络是 172.16

# tcpdump -nvvXSs 1514 dst 192.168.0.2 and src net and not icmp

# 从 mars 或者 pluto 发出的并且目标端口不是 SSH 的流量

# tcpdump -vv src mars and not dst port 22

正如你所看到的那样,你可以建立查询来找到任意你想要的流量。关键是,首先你需要精确地知道你想要查找什么,然后建立查询来查找你想要的具体流量。

分组

同样需要记住的是,当你建立一个复杂的查询时,你可能需要使用括号将你的选项括起来。括号可以告诉 tcpdump 忽略其它特殊字符——这里是“()”。这项技术可以使用于组合其它表达式,例如 host,port,net 等等。请看下面的命令行:

# 来自主机 10.0.2.4 目标端口是 3389 或 22(不正确的例子)

# tcpdump src 10.0.2.4 and (dst port 3389 or 22)

如果你尝试运行这条非常有用的命令,你会得到一个关于括号的错误。有两个方法来更正这个错误,一个是将括号进行转义(在每个括号之前加一个转义符 \ ),另一个是将整个表达式放到单引号里面:

# 来自主机 10.0.2.4 目标端口是 3389 或 22(正确的例子)

# tcpdump src 10.0.2.4 and \(dst port 3389 or 22\)
# tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'

高级

你也可以根据数据包的某一部分进行过滤,也可以将多个条件组合起来。前者对 SYN 或者 RST 之类的有用,后者则是更高级的网络数据隔离。

——提示: TCP 标志的构成

# 显示所有的 URGENT(URG)数据包...

# tcpdump ‘tcp[13] & 32!=0‘

# 显示所有的 ACKNOWLEDGE(ACK)数据包...

# tcpdump ‘tcp[13] & 16!=0‘

# 显示所有的 PUSH(PSH)数据包...

# tcpdump ‘tcp[13] & 8!=0‘

# 显示所有的 RESET(RST)数据包...

# tcpdump ‘tcp[13] & 4!=0‘

# 显示所有的 SYNCHRONIZE(SYN)数据包...

# tcpdump ‘tcp[13] & 2!=0‘

# 显示所有的 FINISH(FIN)数据包...

# tcpdump ‘tcp[13] & 1!=0‘

# 显示所有的 SYNCHRONIZE/ACKNOWLEDGE(SYN/ACK)数据包...

# tcpdump ‘tcp[13]=18‘

——注意:只有 PSH,RST,SYN 和 FIN 标志会显示在 tcpdump 的标志段那里。URG 和 ACK 也会被显示,但他们会显示在输出的其它地方,而不是标志段

请记住这些过滤的工作原理。上面的过滤器能够找到各式各样的数据包是因为 tcp[13] 是 TCP 头部的 13 个位移,那个数字代表的是位位置,!=0 意味着那个标志为 1,也就是说打开。

和其它强大的工具一样,它有很多种方式来工作的。下面的例子展示了另一种捕获特定 TCP 标志位的数据包的方法。

# 使用 tcpflags 选项来捕获 TCP 标志...

# tcpdump ‘tcp[tcpflags] && tcp-syn != 0‘

特定的流量

最后,当捕获特定和专门的流量时,例如 IPv6 和 畸形/恶意的数据包,这里有一些快速方法需要记住的。

# IPv6 流量

# tcpdump ip6

# 同时设置 RST 和 SYN 标志位的数据包

# tcpdump ‘tcp[13] = 6’

总结

这个教程应该可以让你变得强大了,但是 man 页更适合更高级的和一次性的使用场景。我真心希望这篇文章能够对你有用,如果有任何问题,请随时联系我。

END

本文作者: chenishr

本文标题:《tcpdump 教程及入门示例》

本文地址: http://blog.chenishr.com/?p=543

©版权所有,除非注明, 永在路上文章均为原创,转载请以链接形式注明出处和作者细信息。

发表评论

电子邮件地址不会被公开。 必填项已用*标注