• Linux 命令(11)—— tcpdump




    一、命令简介

    tcpdump是一个网络抓包工具,它可以捕获和分析TCP/IP网络协议的数据包。它使用 libpcap 库来抓取网络数据包,这个库在几乎在所有的 Linux/Unix 中都有。之所以叫做tcpdump,是因为它最初是用于捕获和分析TCP协议的数据包。然而,随着时间的推移,它的功能扩展到了其他协议,如UDPICMP等。尽管如此,它的名称仍然保持为tcpdump

     它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

    二、使用方法

    tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
            [ -c count ]
            [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
            [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
            [ --number ] [ -Q in|out|inout ]
            [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
            [ -W filecount ]
            [ -E spi@ipaddr algo:secret,...  ]
            [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
            [ --time-stamp-precision=tstamp_precision ]
            [ --immediate-mode ] [ --version ]
            [ expression ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    三、命令选项

    -A    以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息)。在抓取包含网页数据的数据包时,可方便查看数据。
    
    -c    count
          tcpdump将在接受到count个数据包后退出。
    
    -C    file-size (此选项用于配合-w file 选项使用)
          该选项使得tcpdump在把原始数据包直接保存到文件中之前,检查此文件大小是否超过file-size。如果超过了,将关闭此文件。另创一个文件继 续用于原始数据包的记录。新创建的文件名与-w选项指定的文件名一致,但文件名后多了一个数字。该数字会从1开始随着新创建文件的增多而增加,单位是M。
    
    -d    把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出。
    
    -dd   把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出。
    
    -ddd  把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出。
    
    -D    打印系统中所有tcpdump可以在其上进行抓包的网络接口。
          每一个接口会打印出数字编号,相应的接口名字,以及可能的一个网络接口描述。其中网络接口名字和数字编号可以用于`-i`选项,用来指定要抓包的网络接口。
    
    -e    每行的打印输出中将包括数据包的数据链路层头部信息。默认情况下 tcpdump不会显示数据链路层信息,使用'-e'选项可以显示源和目的 MAC地址,以及VLAN tag信息。
    
    -f    用数字显示网际网络地址。
    
    -F    file
          使用file文件作为过滤条件表达式的输入,此时命令行上的输入将被忽略。
    
    -i    interface
    	  指定需要监听的网口。如果没有指定,tcpdump会从系统接口列表中搜寻编号最小的网口(不包括loopback网口)-l    对标准输出进行行缓冲(使标准输出设备遇到一个换行符就马上把这行的内容打印出来)。
          在需要同时观察抓包打印以及保存抓包记录的时候很有用。比如,可通过以下命令组合来达到此目的:
          tcpdump  -l  |  tee dat
          tcpdump  -l   > dat  &  tail  -f  dat
    
    -n    不把主机的网络地址转换成名字。
    
    -nn   不解析域名和端口。这样不仅方便查看IP和端口号,而且在抓取大量数据时非常高效,因为域名解析会降低抓取速度。
    
    -N    不打印出host的域名部分。比如,如果设置了此选现,tcpdump将会打印'nic'而不是'nic.ddn.mil'-O    不启用进行包匹配时所用的优化代码。当怀疑某些bug是由优化代码引起的,此选项将很有用。
    
    -p    不让网络界面进入混杂模式。但必须注意,在特殊情况下此网络接口还是会以混杂模式来工作。
    
    -q    快速输出,仅列出少数的传输协议信息。
    
    -r    file
          从文件file中读取包数据。如果file字段为'-'符号,则tcpdump会从标准输入中读取包数据。
          
    -s    snaplen
          设置tcpdump的数据包抓取长度为snaplen。tcpdump默认只会截取前96字节的内容,如果snaplen是0的话,表示截取报文全部内容。
    
    -S    打印TCP数据包的顺序号时,使用绝对的顺序号,而不是相对的顺序号。
          相对顺序号可理解为,相对第一个TCP包顺序号的差距。比如,接受方收到第一个数据包的绝对顺序号为232323,对于后来接收到的第2个,第3个数据包,tcpdump会打印其序列号为1,2分别表示与第一个数据包的差距为1和2。而如果此时'-S'选项被设置,对于后来接收到的第2个,第3个数据包会打印出其绝对顺序号:232324,232325)-T    type
          强制tcpdump按type指定的协议所描述的包结构来分析收到的数据包。
          目前已知的type可取的协议为:
          aodv (Ad-hoc On-demand Distance Vector protocol, 按需距离向量路由协议,在Ad hoc(点对点模式)网络中使用)
          cnfp (Cisco  NetFlow  protocol)
          rpc (Remote Procedure Call)
          rtp (Real-Time Applications protocol)
          rtcp (Real-Time Applications con-trol protocol)
          snmp (Simple Network Management Protocol)
          tftp (Trivial File Transfer Protocol, 碎文件协议)
          vat (Visual Audio Tool, 可用于在internet上进行电视电话会议的应用层协议)
          wb (distributed White Board, 可用于网络会议的应用层协议)
    
    -t    在每行输出中不打印时间戳。
    
    -tt   不对每行输出的时间进行格式处理(这种格式一眼可能看不出其含义,如时间戳打印成1261798315)-ttt  tcpdump输出时,每两行打印之间会延迟一个段时间(以毫秒为单位)-tttt 在每行打印的时间戳之前添加日期的打印。
    
    -v    当分析和打印的时候,产生详细的输出。
          比如,包的生存时间,标识,总长度以及IP包的一些选项。这也会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和。
    
    -vv   产生比-v更详细的输出。比如,NFS回应包中的附加域将会被打印,SMB数据包也会被完全解码。
    
    -vvv  产生比-vv更详细的输出。比如,telent时所使用的SB,SE选项将会被打印,如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来。
    
    -w    把包数据直接写入文件而不进行分析和打印输出。这些包数据可在随后通过'-r'选项来重新读入并进行分析和打印。
    
    -x    将每个数据包的头部数据以及数据部分以16进制的形式打印出来。需要注意的是,这个选项不会包括连接层的头部数据。 
    
    -xx   tcpdump会打印每个包的头部数据,同时会以16进制打印出每个包的数据。其中包括数据链路层的头部。
    
    -X    当分析和打印时,tcpdump会打印每个包的头部数据,同时会以16进制和ASCII码形式打印出每个包的数据(但不包括连接层的头部)。这对于分析一些新协议的数据包很方便。
    
    -XX   当分析和打印时,tcpdump会打印每个包的头部数据,同时会以16进制和ASCII码形式打印出每个包的数据,其中包括数据链路层的头部。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90

    四、基本语法和使用方法

    1. 显示 ASCII 字符串

    tcpdump -A -s0 port 22
    
    • 1

    2. 抓取特定协议的数据

    后面可以跟上协议名称来过滤特定协议的流量,以 UDP 为例,可以加上参数 udp 或 protocol 17,这两个命令意思相同。

    tcpdump -i eth0 udp
    tcpdump -i eth0 proto 17
    
    • 1
    • 2

    同理,tcp 与 protocol 6 意思相同。

    3. 抓取特定主机的数据

    使用过滤器 host 可以抓取特定目的地址和源IP地址的流量。也可以使用 srcdst 只抓取源或目的地。

    tcpdump -i eth0 host 10.10.1.1
    tcpdump -i eth0 dst 10.10.1.20
    
    • 1
    • 2

    4. 将抓取的数据写入文件

    使用 tcpdump 截取数据报文的时候,默认会打印到屏幕的默认输出,你会看到按照顺序和格式,很多的数据一行行快速闪过,根本来不及看清楚所有的内容。不过,tcpdump 提供了把截取的数据保存到文件的功能,以便后面使用其他图形工具(比如 wireshark,Snort)来分析。

    -w 选项用来把数据报文输出到文件:

    tcpdump -i eth0 -s0 -w test.pcap
    
    • 1

    5. 行缓冲模式

    如果想实时将抓取到的数据通过管道传递给其他工具来处理,需要使用 -l 选项来开启行缓冲模式(或使用 -c 选项来开启数据包缓冲模式)。使用 -l 选项可以将输出通过立即发送给其他命令,其他命令会立即响应。

    tcpdump -i eth0 -s0 -l port 80 | grep 'Server:'
    
    • 1


    五、理解tcpdump的输出

    截取数据只是第一步,第二步就是理解这些数据,下面就解释一下 tcpdump 命令输出各部分的意义。

    21:27:06.995846 IP (tos 0x0, ttl 64, id 45646, offset 0, flags [DF], proto TCP (6), length 64)
        192.168.1.106.56166 > 124.192.132.54.80: Flags [S], cksum 0xa730 (correct), seq 992042666, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 663433143 ecr 0,sackOK,eol], length 0
    
    21:27:07.030487 IP (tos 0x0, ttl 51, id 0, offset 0, flags [DF], proto TCP (6), length 44)
        124.192.132.54.80 > 192.168.1.106.56166: Flags [S.], cksum 0xedc0 (correct), seq 2147006684, ack 992042667, win 14600, options [mss 1440], length 0
    
    21:27:07.030527 IP (tos 0x0, ttl 64, id 59119, offset 0, flags [DF], proto TCP (6), length 40)
        192.168.1.106.56166 > 124.192.132.54.80: Flags [.], cksum 0x3e72 (correct), ack 2147006685, win 65535, length 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    最基本也是最重要的信息就是数据报的源地址/端口和目的地址/端口,上面的例子第一条数据报中,源地址 ip 是 192.168.1.106,源端口是 56166,目的地址是 124.192.132.54,目的端口是 80> 符号代表数据的方向。

    此外,上面的三条数据还是 tcp 协议的三次握手过程,第一条就是 SYN 报文,这个可以通过 Flags [S] 看出。下面是常见的 TCP 报文的 Flags:

    • [S] : SYN(开始连接)
    • [.] : 没有 Flag
    • [P] : PSH(推送数据)
    • [F] : FIN (结束连接)
    • [R] : RST(重置连接)

    而第二条数据的 [S.] 表示 SYN-ACK,就是 SYN 报文的应答报文。

    六、过滤表达式

    tcpdump的过滤表达式用于指定要捕获的数据包的条件。

    1. Host 过滤

    用来过滤某个主机的数据报文。例如:

    tcpdump host 1.2.3.4
    
    • 1

    该命令会抓取所有发往主机 1.2.3.4 或者从主机 1.2.3.4 发出的流量。如果想只抓取从该主机发出的流量,可以使用下面的命令:

    tcpdump src host 1.2.3.4
    
    • 1

    2. Network 过滤

    用来过滤某个网段的数据,使用的是 CIDR 模式。可以使用四元组(x.x.x.x)、三元组(x.x.x)、二元组(x.x)和一元组(x)。四元组就是指定某个主机,三元组表示子网掩码为 255.255.255.0,二元组表示子网掩码为 255.255.0.0,一元组表示子网掩码为255.0.0.0。例如,抓取所有发往网段 192.168.1.x 或从网段 192.168.1.x 发出的流量:

    tcpdump net 192.168.1
    
    • 1

    抓取所有发往网段 10.x.x.x 或从网段 10.x.x.x 发出的流量:

    tcpdump net 10
    
    • 1

    和 Host 过滤器一样,这里也可以指定源和目的:

    tcpdump src net 10
    
    • 1

    也可以使用CIDR 格式:

    tcpdump src net 172.16.0.0/12
    
    • 1

    3. Proto 过滤

    用来过滤某个协议的数据,关键字为 proto,可省略。proto 后面可以跟上协议号或协议名称,支持 icmp, igmp, igrp, pim, ah, esp, carp, vrrp, udp tcp。因为通常的协议名称是保留字段,所以在于 proto 指令一起使用时,必须根据 shell 类型使用一个或两个反斜杠(/)来转义。Linux 中的 shell 需要使用两个反斜杠来转义,MacOS 只需要一个。

    例如,抓取 icmp 协议的报文:

    tcpdump -n proto \\icmp
    # 或者
    tcpdump -n icmp
    
    • 1
    • 2
    • 3

    4. Port 过滤

    用来过滤通过某个端口的数据报文,关键字为 port。例如:

    tcpdump port 389
    
    • 1

    5. 使用逻辑运算符

    # and、or、not
    tcpdump src host 192.168.1.100 and dst port 80
    tcpdump src host 192.168.1.100 and (dst port 80 or dst port 443)
    tcpdump not icmp
    
    # 注意当你构建复杂查询的时候,你可能需要使用引号。单引号告诉tcpdump忽略特定的特殊字符,如下面的例子中的括号。
    tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7


    七、举例

    1. 原始数据输出

    tcpdump -ttnnvvS
    
    • 1

    2. 来自特定的IP,发往特定的端口

    tcpdump -nnvvS src 10.5.2.3 and dst port 3389

    tcpdump -nnvvS src 10.5.2.3 and dst port 3389
    
    • 1

    3. 从某个网段来,到某个网段去

    来自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
    
    • 1

    4. 到某个IP的非SSH流量

    来自mars主机,发往非SSH端口。

    tcpdump -vv src mars and not dst port 22
    
    • 1

    5. 根据 TCP Flags 分离数据

    # 使用TCP RST flag筛选
    tcpdump 'tcp[13] & 4!=0'
    tcpdump 'tcp[tcpflags] == tcp-rst'
    
    # 根据 TCP SYN flag筛选
    tcpdump 'tcp[13] & 2!=0'
    tcpdump 'tcp[tcpflags] == tcp-syn'
    
    # 根据 TCP SYN和ACK flag筛选
    cpdump 'tcp[13]=18'
    
    # 根据 TCP URG flag筛选
    tcpdump 'tcp[13] & 32!=0'
    tcpdump 'tcp[tcpflags] == tcp-urg'
    
    # 根据 TCP ACK flag筛选
    tcpdump 'tcp[13] & 16!=0'
    tcpdump 'tcp[tcpflags] == tcp-ack'
    
    # 根据 TCP PSH flag筛选
    tcpdump 'tcp[13] & 8!=0'
    tcpdump 'tcp[tcpflags] == tcp-psh'
    
    # 根据 TCP FIN flag筛选
    tcpdump 'tcp[13] & 1!=0'
    tcpdump 'tcp[tcpflags] == tcp-fin'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    5. 发现 HTTP Get请求

    tcpdump -vvAls0 | grep 'GET'
    
    • 1

    6. 抓取用户名和密码

    tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -lA | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd= |password=|pass:|user:|username:|password:|login:|pass |user '
    
    • 1
  • 相关阅读:
    Vue速成学习笔记
    设计模式-05建造者模式(Bulider模式)详解
    MongoDB安装及集成
    nvm安装及使用(mac)
    深度学习7 Transformer系列实例分割Mask2Former
    小程序如何设置用户同意服务协议并上传头像和昵称
    【日记】文章更新计划
    JavaFX:Insets在控件中使用简例
    51单片机应用从零开始(六)·逻辑运算
    synchronized原理-字节码分析、对象内存结构、锁升级过程、Monitor
  • 原文地址:https://blog.csdn.net/I_just_smile/article/details/134055425