Tcpdump 是信息安全领域常用的嗅探和网络分析工具,运行在命令行下。虽然要用好它需要对 TCP/IP 协议有足够的了解,但从另一个角度讲,多用一下同样也能促进对网络协议的掌握。
大部分 Linux 发行版都内置了 Tcpdump 工具。如果没有,也可以直接使用对应的包管理器进行安装(如:$ sudo apt-get install tcpdump
和 $ sudo yum install tcpdump
)
一、命令选项
-i any
:监听所有网络接口-i eth0
:监听指定的网络接口(eth0)-D
:列出所有可用的网络接口-n
:不解析主机名-nn
:不解析主机名和端口名-q
:输出较少的信息-t
:更便于阅读的时间戳输出-tttt
:最便于阅读的时间戳输出-X
:以 HEX 和 ASCII 模式输出数据包的内容-XX
:与 -X 选项相同,同时还输出 ethernet 头-v, -vv, -vvv
:输出更多数据包的信息-c
:获取到指定数目的数据包后就停止-s
:定义 snaplength (size) ,-s0
表示获取全部-S
:输出绝对序列号-e
:获取 ethernet 头信息-E
:通过提供 key 来解密 IPSEC 流量
二、表达式
通过表达式可以对各种不同类型的网络流量进行过滤,以获取到需要的信息。这也是 tcpdump 强大功能的一个体现。
主要有 3 种类型的表达式:
- Type(类型)选项包括
host
、net
和port
- Direction(方向)选项包括
src
和dst
以及它们的组合 - Proto(协议)包括
tcp
、udp
、ICMP
和ah
等
三、应用实例
指定网络接口:# tcpdump -i <dev>
vboxnet0 是 virtualvox 虚拟机通过 Host-only 方式虚拟的一张网卡
原始信息输出模式:# tcpdump -ttttnnvvS
更详细的输出,不解析主机名和端口名,使用绝对序列号,方便阅读的时间戳
通过IP地址过滤:# tcpdump host 10.2.64.1
10.2.64.1 是我的 DNS 服务器地址
HEX 输出# tcpdump -nnvXSs 0 -c1 icmp
通过源地址和目标地址进行过滤# tcpdump src 10.2.67.203
# tcpdump dst 10.2.67.203
通过子网进行过滤# tcpdump net 10.2.64.0/24
监听指定端口号# tcpdump port 515
515 是本地打印机 LPD 服务的端口号
指定协议# tcpdmp icmp
端口范围# tcpdump portrange 21-23
通过包大小过滤# tcpdump less 32
# tcpdump greater 64
# tcpdump <= 128
写入 PCAP 文件# tcpdump port 80 -w capture_file
读取 PCAP 文件# tcpdump -r capture_file
四、高级功能
1. 逻辑运算符
可以通过命令选项的不同组合(使用逻辑运算符)完成更复杂的任务。运算符包括以下3种:
- AND(
and
或&
) - OR(
or
或||
) - EXCEPT (
not
或!
)
# tcpdump src 10.2.64.29 and dst port 80
即捕捉从指定主机(10.2.64.92)发出,且目标端口为 80 的所有网络数据
# tcpdump src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16
即捕捉从指定子网(192.168.0.0/16)发送到目标子网(10.0.0.0/8 和 172.16.0.0/16)的所有网络数据
# tcpdump src 192.168.56.1 and not dst port 22
即捕捉从指定主机(192.168.56.1)发出,且目标端口不为 22 的所有网络数据
2. 指定 TCP 标志位(Flags)
# tcpdump 'tcp[13] & 32!=0'
所有 URGENT (URG) 包# tcpdump 'tcp[13] & 16!=0'
所有 ACKNOWLEDGE (ACK) 包# tcpdump 'tcp[13] & 8!=0'
所有 PUSH (PSH) 包# tcpdump 'tcp[13] & 4!=0'
所有 RESET (RST) 包# tcpdump 'tcp[13] & 2!=0'
所有 SYNCHRONIZE (SYN) 包# tcpdump 'tcp[13] & 1!=0'
所有 FINISH (FIN) 包# tcpdump 'tcp[13]=18'
所有 SYNCHRONIZE/ACKNOWLEDGE (SYNACK) 包
其他指定标志位的方式如:# tcpdump 'tcp[tcpflags] == tcp-syn'
# tcpdump 'tcp[tcpflags] == tcp-fin'
一些特殊的用法# tcpdump 'tcp[13] = 6'
RST 和 SYN 同时启用的数据包(不正常)# tcpdump 'tcp[32:4] = 0x47455420'
获取 http GET 请求的文本# tcpdump 'tcp[(tcp[12]>>2):4] = 0x5353482D'
获取任何端口的 ssh 连接(通过 banner 信息)# tcpdump 'ip[8] < 10'
ttl 小于 10 的数据包(出现问题或 traceroute 命令)# tcpdump 'ip[6] & 128 != 0'
非常有可能是黑客入侵的情况