Tcpdump入门教程示例

2018-05-01|Categories: External cmd, Linux, Network, Translation|

译者序

Tcpdump是一个分析网络流量(俗称抓包)的命令行工具,是Linux系统的标配工具,功能非常强大。有了Tcpdump,处理网络相关的问题时方向会更加清晰。因此,Tcpdump是经常和网络协议打交道的技术人员必须掌握的技能。

信息安全专家Daniel Miessler在他自己的网站上撰写了非常详细易懂的Tcpdump教程《A tcpdump Tutorial and Primer with Examples》,这份教程非常适合初学者,同样也适合有一定经验的用户。

在这篇文章里,我尝试翻译这份教程,同时适当补充我自己的学习笔记。由于技术水平和英文水平的双重限制,尽管我力求准确,但想来错漏之处难免,欢迎读者朋友们批评指正,不足之处,还请见谅。


以下是正文。

为什么使用Tcpdump

Tcpdump是信息安全专业人士的首要网络分析工具。对于希望彻底了解TCP/IP的人来说,掌握这个超级强大的应用程序是必须的。许多人喜欢使用更高层次的分析工具,如Wireshark,但我相信这通常是一个错误。

当使用工具以更自然(未经处理)的方式显示网络流量时,分析流量的重任直接由人承担,而不是应用程序。这种方法培养了对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 
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

表一:未经处理的TCP/IP输出

Tcpdump基础

下面是配置tcpdump时可以使用的一些选项。它们很容易忘记,或是与Wireshark之类工具的过滤器混淆,所以希望这一页可以作为你的参考,就像它对我的作用一样。下面是我想记住的主要部分,这取决于我所要查找的内容。

常用选项

  • -i any:监听所有网卡。
  • -i eth0:只监听eth0网卡。
  • -D:显示可用网卡列表。
  • -n:只显示IP地址,不解析IP对应的域名。
  • -nn:只显示IP地址和端口号,不解析对应的域名和服务。
  • -q:安静模式,显示更少的协议信息。
  • -t:让时间戳适合人类阅读。
  • -tttt:让时间戳更适合人类阅读,时间信息更丰富。
  • -X:同时使用十六进制字符和ASCII字符显示数据包内容。
  • -XX:与-X相同,还会显示以太网首部。
  • -v, -vv, -vvv:输出信息越来越详细。
  • -c:仅获取指定数量的包,然后停止。
  • -s:定义抓包的字节数,-s 0表示抓取完整的包。
    • Tcpdump 4.0的默认抓包长度(snaplength)已从68字节更改为96字节。虽然这会让你看到更多的数据包内容,但它仍然不会得到完整的包内容。使用-s 1514-s 0可以得到完整的包内容。
  • -S:显示实际的数据包序号。
  • -e:获取以太网首部。
  • -E:如果提供了密钥,解密IPSEC流量。

表达式

tcpdump中,表达式允许你裁剪各种类型的流量并准确找到要查找的内容。掌握表达式并学习如何创造性地将它们结合起来,是发挥tcpdump强大功能的关键。

有三种主要的表达式类型:类别、方向、协议。

  • 类别:hostnetport
  • 方向:srcdst,以及二者的组合。
  • 协议:tcpudpicmp等等。

Tcpdump示例

现在我们已经知道了一些常用选项,接下来让我们看看我们日常工作中可能会看到的一些真实的例子。

所有网卡的通讯

tcpdump -i any

特定网卡的通讯

tcpdump -i eth0

未经处理的输出

详细的输出,不解析域名或端口号,实际的数据包序号,人类可读的时间戳:

tcpdump -ttttnnvvS

根据IP查找流量

最常见的查询之一,这将显示来自1.2.3.4的流量,无论它是作为源地址还是目标地址。

tcpdump host 1.2.3.4

使用十六进制显示更多的包内容

如果希望查看数据包的内容,十六进制输出非常有用:非常适合用于筛选特定的数据包内容作更详细的观察。

tcpdump -nnvXSs 0 -c1 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
1 packets captured
1 packets received by filter
0 packets dropped by kernel

表二:一个ICMP包的详细内容

根据源地址、目标地址过滤

tcpdump src 2.3.4.5

tcpdump dst 3.4.5.6

根据网络过滤

net选项用于根据网络过滤数据包。可以和srcdst选项结合使用。

tcpdump net 1.2.3.0/24

显示与特定端口相关的流量

tcpdump port 3389 

tcpdump src port 1025

显示使用特定协议的流量

tcpdump icmp

只显示IPv6流量

tcpdump ip6

查找指定端口范围内的流量

tcpdump portrange 21-23

根据数据包大小过滤流量

可以使用lessgreater,也可以使用等价的数学符号。

tcpdump less 32 

tcpdump greater 64 

tcpdump <= 128

把抓包内容另存为一个文件

将捕获的数据包保存到文件中供将来进行分析通常很有用。这些文件被称为PCAP(发音:PEE-cap)文件,它们可以被数百种不同的应用程序处理,包括网络分析器,入侵检测系统,当然还有tcpdump本身。这里我们使用-w开关写入一个名为capture_file的文件。

tcpdump port 80 -w capture_file

读取PCAP文件

你可以使用-r开关读取PCAP文件。请注意,你可以在读取文件时使用tcpdump中的所有常规命令,唯一的限制是:你无法捕获和处理文件中不存在的内容。

tcpdump -r capture_file

Tcpdump高级技巧

前面介绍的都是tcpdump的基础内容,接下来是高级内容。

一切都是组合

前面的内容通过单独的选项展示了tcpdump的强大功能,但tcpdump真正的魔力来自于以创造性的方式组合选项的能力,以便准确地分离出你正在寻找的东西。有三种方法可以进行组合,如果你已经学过编程,你会非常熟悉它们:

  • 与(AND)
    • and&&
  • 或(OR)
    • or||
  • 非(EXCEPT)
    • not!

以下是一些组合命令的示例。

从特定IP到特定端口的流量

查找从10.5.2.3到任意主机的3389端口的所有流量。

tcpdump -nnvvS src 10.5.2.3 and dst port 3389

从一个网络到另一个网络的流量

查找来自192.168.x.x网段,目标地址为10.x172.16.x.x网段的所有流量。我们显示的是十六进制输出,不解析主机名,附带一个额外的详细级别(-v)。

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

到特定IP的非ICMP流量

tcpdump dst 192.168.0.2 and src net and not icmp

来自特定主机上某个特定端口之外的所有流量

显示来自特定主机的、除了SSH(假设使用默认的22端口)流量之外的所有流量。

tcpdump -vv src mars and not dst port 22

正如你所看到的,你可以建立查询来找到你需要的任何东西。关键是首先要搞清楚你要寻找的内容,然后构建隔离特定类型流量的语法。

复杂的分组和特殊字符

另外请记住,当你构建复杂的查询时,你可能必须使用单引号将选项分组。使用单引号是为了告诉tcpdump忽略某些特殊字符,在本例中是圆括号()。同样的技术可以用于使用其他表达式进行分组,例如主机,端口,网络等。请看下面的命令。

# Traffic that’s from 10.0.2.4 AND destined for ports 3389 or 22 (incorrect)
# 错误的语法
tcpdump src 10.0.2.4 and (dst port 3389 or 22)

如果你试图运行这个非常有用的命令,你会因为括号而出错。你可以通过转义括号(在每个括号之前放置一个反斜线\),或通过将整个命令放在单引号中来解决此问题:

# Traffic that’s from 10.0.2.4 AND destined for ports 3389 or 22 (correct)
# 正确的语法
tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'

隔离特定的TCP标记位

你还可以基于特定的TCP标记位捕获流量。

下面的过滤器就可以查找这些不同的数据包,(以tcpdump 'tcp[13] & 32!=0'为例),因为tcp[13]表示查找TCP首部中偏移量为13的那个字节,(后面的)数字(32 = 2^5)代表字节内的位置(第6位,因为最低位为0),!= 0意味着所讨论的标记位被设置为1,即它是开启的。


图一:TCP首部详图(还可以下载其它协议的首部详图

译者注:原文作者写了另一篇文章介绍如何记住TCP标记位,也就是把六个TCP标记位的首字母按照它们在TCP首部的位置扩展成一句话:Unskilled Attackers Pester Real Security Folks(不熟练的攻击者骚扰真正的安全专家)。

显示所有URG标记位为1的包:

tcpdump 'tcp[13] & 32!=0'

显示所有ACK标记位为1的包:

tcpdump 'tcp[13] & 16!=0'

显示所有PSH标记位为1的包:

tcpdump 'tcp[13] & 8!=0'

显示所有RST标记位为1的包:

tcpdump 'tcp[13] & 4!=0'

显示所有SYN标记位为1的包:

tcpdump 'tcp[13] & 2!=0'

显示所有FIN标记位为1的包:

tcpdump 'tcp[13] & 1!=0'

显示所有SYN/ACK包:

# 18 = 2^1 (SYN) + 2^4 (ACK)
tcpdump 'tcp[13]=18'

只有PSH,RST,SYN和FIN标记位显示在tcpdump的标记位字段输出中。URG和ACK显示在输出的其他地方而不是标记位字段中。

与大多数强大的工具一样,tcpdump有多种方法可以完成(同样的)任务。以下示例显示了另一种捕获特定TCP标记位的方法。

tcpdump 'tcp[tcpflags] == tcp-syn'

tcpdump 'tcp[tcpflags] == tcp-rst'

tcpdump 'tcp[tcpflags] == tcp-fin'

其他标记位也可以使用相同的方式(捕获),为了行文简洁,此处不再赘述。

识别值得注意的流量

最后,你需要记住一些小窍门,以便捕获特定的和专门的流量,例如格式错误、可能有恶意的数据包。

同时启用了RST和SYN标记位(正常通讯中不会出现)

tcpdump 'tcp[13] = 6'

查找未加密的HTTP GET请求

tcpdump 'tcp[32:4] = 0x47455420'

译者注①:原文是「find cleartext http get requests」,cleartext常用于表示传输或存储的数据未加密。

Cleartext usually refers to data that is transmitted or stored unencrypted ('in the clear').

https://en.wikipedia.org/wiki/Plaintext

译者注②:此处表达式的意义请参见man 7 pcap-filter,在ManPage内搜索关键词expr relop expr

译者注③:0x47455420表示GET这四个字符(最后一个字符是空格)。

查找任意端口上的SSH连接(根据banner文字)

tcpdump 'tcp[(tcp[12]>>2):4] = 0x5353482D'

译者注:0x5353482D'表示SSH-这四个字符。

TTL小于10的数据包(表示存在问题或使用traceroute

tcpdump 'ip[8] < 10'

启用了Evil Bit的数据包

tcpdump 'ip[6] & 128 != 0'

译者注:Evil Bit(邪恶位)是RFC 3514中提出的一个虚构的IPv4数据包首部字段,这是一个由Steve Bellovin撰写的愚人节RFC。这个RFC建议使用IPv4数据包报头中最后剩余的未使用位,也就是保留位,来指示数据包是否被恶意发送,从而使计算机安全工程变成一个简单问题:忽略启用了邪恶位的数据包,放行(信任)其余的数据包。

https://en.wikipedia.org/wiki/Evil_bit

总结

  • 对于任何希望了解网络或信息安全的人来说,tcpdump都是一个有价值的工具。
  • 它连接流量的原始方式,配合它在检查数据包时提供的精度,使其成为学习TCP/IP的最佳工具。
  • 像Wireshark这样的协议分析器是非常棒的,但是如果你想真正掌握数据包分析,你必须首先使用tcpdump

这份入门手册应该能提升你的tcpdump使用水平,但ManPage总是可以方便的用于各种使用场景。我真心希望这篇文章对你有用,如果你有任何问题,请随时与我联系


译文结束。全文完。

Leave A Comment