tcpdump抓包分析
Tcpdump网络/命令行抓包工具
1 | tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息 |
1. tcpdump常用参数
参数 | 含义 |
---|---|
-a | 将网络地址和广播地址转变成名字 |
-c | 在收到指定的包的数目后,tcpdump就会停止 ; |
-d | 将匹配信息包的代码以人们能够理解的汇编格式给出;以可阅读的格式输出 |
-dd | 将匹配信息包的代码以c语言程序段的格式给出; |
-ddd | 将匹配信息包的代码以十进制的形式给出 |
-e | 在输出行打印出数据链路层的头部信息; |
-f | 将外部的Internet地址以数字的形式打印出来 |
-I | 使标准输出变为缓冲行形式; |
-n | 直接显示IP地址,不显示名称; |
-nn | 端口名称显示为数字形式,不显示名称 |
-t | 在输出的每一行不打印时间戳; |
-v | 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息; |
-vv | 输出详细的报文信息; |
-F | 从指定的文件中读取表达式,忽略其它的表达式 |
-i | 指定监听的网络接口; |
-r | 从指定的文件中读取包(这些包一般通过-w选项产生); |
-w | 直接将包写入文件中,并不分析和打印出来 ; |
-T | 将监听到的包直接解释为指定的类型的报文,常见的类型有rp (远程过程调用)和snmp(简单 网络管理协议;) |
2. 常用使用参数选项
2.1 截获主机收到和发出的所有数据包
1 | 基础格式:时间 数据包类型 源IP 端口/协议 > 目标IP 端口/协议 协议详细信息 |
2.2 指定抓包数量
1 | ping jwgod.com |
2.3 将抓包信息写入文件 -w
1 | tcpdump -c 10 -w tcpdump_test.log |
2.4 读取记录文件 -r
1 | tcpdump -r tcpdump_test.log |
2.5 打印出所有可工作的接口 -D
1 | tcpdump -D |
2.6 指定监控的网卡 -i
1 | tcpdump -i eth0 |
2.7 显示更详细的数据包信息 -v -vv
1 | tcpdump -i eth0 -v |
2.8 不使用域名反解 -n
1 | 使用-n后,tcpdump会直接显示IP地址,不会显示域名 |
2.9 增加抓包时间戳 -tttt选项
1 | tcpdump -i eth0 -tttt |
3. 条件过滤
3.1 过滤–指定需要抓取的协议
1 | 备注:tcpdump可以只抓某种协议的包,支持指定以下协议:「ip,ip6,arp,tcp,udp,wlan」等 |
3.2 过滤–指定协议的端口号
1 | 备注:使用port参数,用于指定端口号。 |
3.3 过滤–指定源与目标
1 | 备注: |
3.4 过滤–指定特定主机的消息包
1 | 备注:若使用了host参数使用了计算机名或域名。例tcpdump host jwgod.com ,则无法再使用-n选项 |
3.5 过滤–指定数据包大小
1 | 备注:使用greater(大于)与less(小于)可以指定数据包大小的范围。 |
4. 逻辑表达式
4.1 逻辑与
1 | 备注:逻辑与关系,使用and |
4.2 逻辑或
1 | 备注:逻辑或关系,使用or |
4.3 逻辑非
1 | 备注:逻辑非关系,使用not,也可以使用 !,若使用 ! 必须与其后面的字符隔开一个空格 |
4.4 括号
1 | 备注:括号需要使用在引号内,或转意使用。否则会报错 |
5. 其他使用实例
5.1 打印所有进入或离开jwgod.com的数据包
1 | tcpdump host jwgod.com |
5.2 截获主机192.168.64.11 和主机192.168.64.12 或192.168.64.13的通信
1 | tcpdump host 192.168.64.11 and (192.168.64.12 or 192.168.64.13 ) |
5.3 想要获取主机192.168.64.11除了和主机192.168.64.12之外所有主机通信的ip包
1 | tcpdump ip host 192.168.64.11 and ! 192.168.64.12 |
5.4 监视所有送到主机hostname的数据包
1 | tcpdump -i eth0 dst host hostname |
5.5 获取主机192.168.64.11接收或发出的telnet包
1 | 23为telnet的端口 |
5.6 监视本机的udp 123 端口
1 | 123 为ntp的服务端口 |
5.7 使用tcpdump抓取HTTP包
1 | tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 |
6. 查看数据包完整内容
1 | tcpdump默认不显示数据包的详细内容 |
6.1 使用-A参数能以ASCII码显示数据包
1 | 只抓取1个数据包,并显示其内容。 |
6.2 使用-X参数能16进制数与ASCII码共同显示数据包
1 | 只抓取1个数据包,并显示其内容。 |
7. tcpdump 与 wireshark
1 | 通过Tcpdump抓取的数据包分析比较麻烦,要想很方便的分析数据包, 我们可以用Tcpdump + Wireshark 的完美组合实现:在 Linux 里抓包,然后在Windows 里分析包,保存数据包为wireshark能识别的文件 |
参数 | 含义 |
---|---|
tcp | ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型 |
-i eth0 | 只抓经过接口eth0的包 |
-t | 不显示时间戳 |
-s 0 | 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包 |
-c 100 | 只抓取100个数据包 |
dst port ! 22 | 不抓取目标端口是22的数据包 |
src net 192.168.64.0/24 | 数据包的源网络地址为192.168.1.0/24 |
-w ./target.cap | 保存成cap文件,方便用ethereal(即wireshark)分析 |
wireshark安装
1 | 下载地址:https://2.na.dl.wireshark.org/win64/Wireshark-4.2.6-x64.exe |
三次握手失败
三次握手成功
Flags 标识符
1 | 使用 tcpdump 抓包后,会遇到的 TCP 报文 Flags,有以下几种: |
8. 抓包实战应用例子
8.1 提取 HTTP 的 User-Agent
1 | 从 HTTP 请求头中提取 HTTP 的 User-Agent: |
8.2 抓取 HTTP GET 和 POST 请求
1 | 抓取 HTTP GET 请求包: |
8.3 找出发包数最多的 IP
1 | 找出一段时间内发包最多的 IP,或者从一堆报文中找出发包最多的 IP,可以使用下面的命令: |
8.4 抓取 DNS 请求和响应
1 | DNS 的默认端口是 53,因此可以通过端口进行过滤 |
8.5 切割 pcap 文件
1 | 当抓取大量数据并写入文件时,可以自动切割为多个大小相同的文件。例如,下面的命令表示每 3600 秒创建一个新文件 `capture-(hour).pcap`,每个文件大小不超过 `200*1000000` 字节: |
8.6 提取 HTTP POST 请求中的密码
1 | 从 HTTP POST 请求中提取密码和主机名: |
8.7 提取 HTTP 请求的 URL
1 | 提取 HTTP 请求的主机名和路径: |
8.8 抓取 HTTP 有效数据包
1 | 抓取 80 端口的 HTTP 有效数据包,排除 TCP 连接建立过程的数据包(SYN / FIN / ACK): |
8.9 结合 Wireshark 进行分析
1 | 通常 Wireshark(或 tshark)比 tcpdump 更容易分析应用层协议。一般的做法是在远程服务器上先使用 tcpdump 抓取数据并写入文件,然后再将文件拷贝到本地工作站上用 Wireshark 分析。 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 悩姜!