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 许可协议。转载请注明来自 悩姜!



