tcpdump - 命令使用

目录
警告
本文最后更新于 2022-07-27 19:16,文中内容可能已过时。

https://www.tcpdump.org/manpages/tcpdump.1.html

https://danielmiessler.com/study/tcpdump/

https://www.tcpdump.org/manpages/pcap-filter.7.html

tcpdump 参数 过滤器表达式

tcpdump 可以捕获系统中的网络数据包。

当 tcpdump 完成捕获数据包时,会有一个统计返回 (结果类似如下,最后三行):

81349-gtoq0yio2ju.png
81349-gtoq0yio2ju.png

captured: 这是 tcpdump 已接收和处理的数据包数 received by filter: 含义取决于运行 tcpdump 命令的操作系统

  1. 在某些操作系统上,它会对数据包进行计数,而不管它们是否与过滤表达式匹配,也不管 tcpdump 是否已读取并处理它们。
  2. 在某些操作系统上,它只计算被过滤器表达式匹配的数据包,而不管 tcpdump 是否已经读取和处理了它们
  3. 在某些操作系统上,它只计算被过滤器表达式匹配并被 tcpdump 处理的数据包

dropped by kernel: 由于缓冲区空间不足,而被 tcpdump 丢弃的数据包数量,可以通过 - B 参数设置缓冲区大小。

参数较多,解释一部分

-A: 以 ASCII 格式打印每个数据包 (减去其链路级报头)。便于抓取 http 请求。

-B (--buffer-size=buffer_size): 设置捕获缓冲区大小,单位为 KiB (1024 bytes).

-c: 收到指定数据包后退出。

-e: 显示 mac 地址

-w: 将捕获到的数据包输出到文件中。文件名支持使用 strftime 格式 (例如: -w test-% H% M% S.pcap)

-r: 从文件中读取数据包(使用 - w 选项保存的 pcap 文件)。如果文件为 -,则使用标准输入。

-G: 每隔多长时间输出一个文件 (文件名不能一样,否则会覆盖),单位秒 (s)

-C: 当使用 -w 将数据包保存到文件时,单个文件保存的最大大小。1 代表将近 1M (1000000 bytes)

-D: 显示操作系统中可以使用的网络接口

-E: 通过提供加密密钥来解密 IPSEC 通信。

-F: 指定一个文件,过滤器表达式将从这个文件中获取。

-i (--interface=interface): 指定捕获哪个网络接口的数据包,默认是 tcpdump -D 显示的第一个接口。

-l: 在捕获到数据包时立即将输出写入标准输出,而不是等待填满缓冲区再写入标准输出。这样可以让输出实时地显示在屏幕上,而不是等到缓冲区满了再一次性显示在屏幕上。tcpdump -l | tee dat or tcpdump -l > dat & tail -f dat

-n: 不将 ip 解析成名称

-nn: 不将 ip 解析成域名,不将端口解析成名称

-#: 打印数据包编号

--print: 当使用 -w 时,stdout 不会有数据包信息输出,加此参数可以同时输出。老版本不支持此参数

-Q: 数据包方向 (in,out,inout), 不是在所有平台都可以用

-q: 打印更少的协议信息

-S: 显示绝对的 seq 编号。默认单方向第一个条目显示绝对 seq 编号,后面的数据包显示的是相对的 seq 编号。(不知这么解释对不对) 看下图吧

50576-2l4oigizl9u.png
50576-2l4oigizl9u.png

-s: 指定从每个数据包中获取数据的字节数,而不是默认的 262144 字节。-s0 和默认值一样

-t: 不显示时间

-tt: 显示时间戳

-ttt: 与上一条的时间增量,详细请看 man 手册

-tttt: 可读性强的时间

-v: 打印 IP 数据包中的 ttl,flags,总长度和选项等信息

-vv: 更详细的输出。

-vvv: 更详细的输出。

-X: 数据包内容以 16 进制和 ascii 格式显示

-XX: 同上,信息可能更多

过滤表达式由一个或多个原语组成。原语的编写主要分为三个层面:

类型:根据主机、网络、端口等信息过滤。如: hostnetportportrange 等。

  • 例如: host xxx.com(也可以写ip),net 192.168.1.0/24,port 20(这里仅代表tcp和udp),portrange 6000-6008

传输方向:根据源和目的进行过滤。如: src, dst, src or dst,src and dst 等。

  • 例如:
    • src 192.168.1.10,dst 192.168.1.20
    • src or dst 192.168.1.1,src and dst 192.168.1.1,src or dst port 20
    • dst net 128.3.0.0

协议:基于协议进行过滤。如: tcpudpicmpipip6arprarpwlan 等。

  • 例如: arp net 128.3, tcp port 21, udp portrange 7000-7009

tcpdump 捕获的数据包和表达式匹配结果为 true,才是我们也要的结果,表达式中可以使用 and(&&),or(||),not(!),

dst: 目标主机。dst host 1.1.1.1 也可以写成 dst 1.1.1.1. 因为默认是 host,host 可以被省略

src: 源主机。

ether dst: ether 的目标地址 (mac 地址)

ether src: ether 的源地址 (mac 地址)

net: 网络 (网段)

dst net: 目标网络

src net: 源网络

port: 端口

dst port: 目标端口

src port: 源端口

portrange: 端口范围

dst portrange: 目标端口范围

src portrange: 源端口范围

less: 数据包的长度小于或等于指定长度。less 32 等同于 len <= 32

greater: 数据包的长度大于或等于指定长度。less 32 等同于 len >= 32

tcpdump host soulchild.cn

tcpdump -i eth0

1
2
tcpdump src 1.1.1.1
tcpdump dst 1.0.0.1

tcpdump net 1.2.3.0/24

1
2
3
tcpdump port 3389
tcpdump src port 1025
tcpdump dst port 80
1
2
3
tcpdump tcp
tcpdump ip6
tcpdump icmp

tcpdump portrange 20-21

1
2
3
tcpdump less 32 
tcpdump greater 64 
tcpdump 'len <= 128'
1
2
3
4
5
6
# 保存至文件中
tcpdump -w soulchild.cn.pcap 'host soulchild.cn and port 80'
# 从文件读取
tcpdump -r soulchild.cn.pcap
# 保存到文件中并同时在stdout输出
tcpdump --print -w soulchild.cn.pcap 'host soulchild.cn and port 80'

tcpdump -ttnnvvS

tcpdump -nnvvS src 10.5.2.3 and dst port 3389

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

1
2
3
tcpdump 'dst 192.168.0.2 and not icmp'
# 指定协议的另一种写法
tcpdump 'dst 192.168.0.2 and not proto \icmp'

tcpdump -vv src 192.168.0.2 and not dst port 22


tcp 标志可用字段 tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg, tcp-ece, tcp-cwr.

1
2
tcpdump 'tcp[13] & 4!=0'
tcpdump 'tcp[tcpflags] == tcp-rst'
1
2
tcpdump 'tcp[13] & 2!=0'
tcpdump 'tcp[tcpflags] == tcp-syn'
1
2
tcpdump 'tcp[13]=18'
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'

tcpdump -vvAls0 | grep 'User-Agent:'

tcpdump -vvAls0 | grep 'GET'

tcpdump -vvAs0 port 53

tcpdump -vvAs0 port 123

tcpdump -lA port http or port ftp or port smtp or port imap or port pop3 or port telnet | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd= |password=|pass:|user:|username:|password:|login:|pass |user '

icmp 可用字段 icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply.

1
2
3
4
5
6
7
8
#捕获icmp-echo(请求包)
tcpdump icmp[icmptype] = icmp-echo

#捕获icmp-echoreply(响应包)
tcpdump icmp[icmptype] = icmp-echoreply

#捕获不是icmp-echo、icmp-echoreply的状态
tcpdump icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply

IP 报头中有一位永远不会被合法应用程序设置,我们称之为 "Evil Bit"。 tcpdump 'ip[6] & 128 != 0'

这里有一个 tcpdump 高级用法的解释: https://blog.csdn.net/zhaojie0708/article/details/103496004

请我喝杯水
SoulChild 微信号 微信号
SoulChild 微信打赏 微信打赏
0%