精华内容
下载资源
问答
  • tcpdump抓包命令

    千次阅读 2017-06-12 21:50:57
    我并没有写这些东西,我做的事情仅仅是将网上的一些东西整合了起来,然后删掉了一些不常用的命令,仅此而已.tcpdump抓包命令tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取...

    我并没有写这些东西,我做的事情仅仅是将网上的一些东西整合了起来,然后删掉了一些不常用的命令,仅此而已.

    tcpdump抓包命令

    tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。

    tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。

    一、概述

    顾名思义,tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

    # tcpdump -vv # -vv表示显示详细的信息
    tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
    11:53:21.444591 IP (tos 0x10, ttl 64, id 19324, offset 0, flags [DF], proto 6, length: 92)
    
    asptest.localdomain.ssh > 192.168.228.244.1858: P 3962132600:3962132652(52) ack 2726525936 win 1266
    
    asptest.localdomain.1077 > 192.168.228.153.domain: [bad udp cksum 166e!] 325+ PTR? 244.228.168.192.in-addr.arpa. (46)
    
    11:53:21.446929 IP (tos 0x0, ttl 64, id 42911, offset 0, flags [DF], proto 17, length: 151) 192.168.228.153.domain > asptest.localdomain.1077: 325 NXDomain q: PTR? 244.228.168.192.in-addr.arpa. 0/1/0 ns: 168.192.in-addr.arpa. (123)
    
    11:53:21.447408 IP (tos 0x10, ttl 64, id 19328, offset 0, flags [DF], proto 6, length: 172) asptest.localdomain.ssh > 192.168.228.244.1858: P 168:300(132) ack 1 win 1266
    
    <==按下[ctrl]-c之后结束
    347 packets captured
    1474 packets received by filter
    745 packets dropped by kernel

    不带参数的tcpdump会收集网络中所有的信息包头,数据量巨大,必须过滤。

    二、选项介绍

    tcpdump采用命令行方式,它的命令大致如下:

    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 ]
                   [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
                   [ --immediate-mode ]
                   [ expression ]

    参数的含义如下:

    参数含义
    -A以ASCII格式打印出所有分组,通常用来抓取www的网页数据包数据。
    -c在收到指定的数量的分组后,tcpdump就会停止。
    -C在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。
    -d将匹配信息包的代码以人们能够理解的汇编格式给出。
    -dd将匹配信息包的代码以c语言程序段的格式给出。
    -ddd将匹配信息包的代码以十进制的形式给出。
    -D打印出系统中所有可以用tcpdump截包的网络接口。
    -e在输出行打印出数据链路层的头部信息,也就是使用数据链路层的MAC数据包数据来显示.
    -f将外部的Internet地址以数字的形式打印出来。
    -F从指定的文件中读取表达式,忽略命令行中给出的表达式。
    -i指定监听的网络接口。
    -l使标准输出变为缓冲行形式,可以把数据导出到文件。
    -L列出网络接口的已知数据链路。
    -b在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。
    -n不把网络地址转换成名字。
    -nn不进行端口名称的转换。
    -N不输出主机名中的域名部分。例如,‘nic.ddn.mil‘只输出’nic‘。
    -t在输出的每一行不打印时间戳。
    -O不运行分组分组匹配(packet-matching)代码优化程序。
    -P不将网络接口设置成混杂模式。
    -q快速输出。只输出较少的协议信息。
    -r从指定的文件中读取包(这些包一般通过-w选项产生)。
    -S将tcp的序列号以绝对值形式输出,而不是相对值。
    -s从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。
    -T将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议)。
    -t不在每一行中输出时间戳。
    -tt在每一行中输出非格式化的时间戳
    -ttt输出本行和前面一行之间的时间差。
    -tttt在每一行中输出由date处理的默认格式的时间戳。
    -v输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。
    -vv输出详细的报文信息。
    -w直接将分组写入文件中,而不是不分析并打印出来。
    -X可以列出16进制以及ASCII的数据包内容,对于监听数据包内容很有用.

    推荐的一些写法:

    tcpdump -ntv -i xxx # -n表示不将网络地址转化为名称,-t不输出时间戳,-v输出一些比较详细的信息(这个很好用)
    

    三、tcpdump的表达式介绍

    表达式对应命令参数中最后的可省略的 expression.tcpdump利用它作为过滤报文的条件,如果一个报文满足表 达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包 将会被截获。

    在表达式中一般如下几种类型的关键字:

    表达式由一个或多个 表达元组成(nt: primitive, 表达元, 可理解为组成表达式的基本元素). 一个表达元通常由一个或多个修饰符(qualifiers)后跟一个名字或数字表示的 id组成(nt: 即, qualifiers id).

    有三种不同类型的修饰符: type, dir以及 proto.

    type 修饰符指定id 所代表的对象类型, id可以是名字也可以是数字. 可选的对象类型有: host, net, port 以及portrange(nt: host 表明id表示主机, net表明id是网络, port 表明 id是端口, 而 portrange表明 id是一个端口范围). 如, host foo, net 128.3, port 20, portrange 6000-6008(nt: 分别表示主机 foo, 网络 128.3, 端口 20, 端口范围 6000-6008). 如果不指定type修饰符, id默认的修饰符为host.

    dir 修饰符描述 id 所对应的传输方向, 即发往 id 还是从 id 接收(nt: 而 id到底指什么需要看其前面的 type修饰符).可取的方向为: src, dst, src or dst, src and dst.(nt:分别表示, id是传输源, id是传输目的, id是传输源或者传输目的, id是传输源并且是传输目的). 例如, src foo,dst net 128.3, src or dst port ftp-data.(nt: 分别表示符合条件的数据包中, 源主机是 foo, 目的网络是 128.3, 源或目的端口为 ftp-data).如果不指定 dir修饰符, id 默认的修饰符为 src or dst.

    proto修饰符描述id所属的协议. 常用的协议有: ether, wlan, ip, ip6, arp, rarp, tcp以及 upd.(nt | rt: ether可理解为物理以太网传输协议; wlan, 无线局域网协议; ip, ip6 即通常的 TCP/IP协议栈中所使用的 ipv4以及 ipv6网络层协议; arp, rarp 即地址解析协议, 反向地址解析协议; tcp and udp, 即通常 TCP/IP协议栈中的两个传输层协议).

    例如, ether src foo, arp net 128.3, tcp port 21, udp portrange 7000-7009分别表示 从以太网地址foo来的数据包, 发往或来自128.3网络的arp协议数据包, 发送或接收端口为21的tcp协议数据包, 发送或接收端口范围为7000-7009的udp协议数据包.

    如果不指定 proto 修饰符, 则默认为与相应 type匹配的修饰符.

    例子:

    1. src foo 含义是 (ip or arp or rarp) src foo (nt: 即, 来自主机 fooip/arp/rarp协议数据包, 默认 typehost).
    2. net bar 含义是 (ip or arp or rarp) net bar (nt: 即, 来自或发往 bar网络的 ip/arp/rarp协议数据包).
    3. port 53 含义是 (tcp or udp) port 53(nt: 即, 发送或接收端口为 53tcp/udp协议数据包).

    对于修饰符后跟id的格式,可理解为, type id是对包最基本的过滤条件: 即对包相关的主机, 网络, 端口的限制; dir 表示对包的传送方向的限制; proto表示对包相关的协议限制)

    除以上所描述的表达元(‘primitive’), 还有其他形式的表达元, 并且与上述表达元格式不同. 比如: gateway, broadcast, less, greater以及算术表达式(nt: 其中每一个都算一种新的表达元). 下面将会对这些表达元进行说明.

    表达元之间还可以通过关键字 and, or以及 not 进行连接, 从而可组成比较复杂的条件表达式. 比如,
    host foo and not port ftp and not port ftp-data(nt: 其过滤条件可理解为, 数据包的主机为 foo,并且端口不是 ftp(端口 21) 和 ftp-data(端口 20, 常用端口和名字的对应可在 linux 系统中的 /etc/service文件中找到)).

    为了表示方便, 同样的修饰符可以被省略, 如 tcp dst port ftp or ftp-data or domain与以下的表达式含义相同 tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain.(nt: 其过滤条件可理解为,包的协议为 tcp, 目的端口为 ftpftp-datadomain(端口 53) ).

    可用的表达元

    ==========================================

    dst host host

    如果IPv4/v6 数据包的目的 ip地址是 host, 那么捕获该数据包. host 可以是一个 ip地址, 也可以是一个主机名.

    src host host

    如果IPv4/v6 数据包的源 ip地址是 host, 则捕获该数据包. host 可以是一个 ip地址, 也可以是一个主机名.

    host host

    如果IPv4/v6数据包的源或目的 ip地址是 host, 则捕获该数据包.以上的几个host 表达式之前可以添加以下关键字: ip, arp, rarp, 以及 ip6.比如:

    ip host host

    也可以表达为:

    ether proto \ip and host host # 这种表达方式在下面有说明, 其中ip之前需要有\来转义,因为ip 对tcpdump 来说已经是一个关键字了.

    如果 host是一个拥有多个 IP的主机, 那么任何一个地址都会用于包的匹配(nt: 即发向host 的数据包的目的地址可以是这几个IP中的任何一个, 从host 接收的数据包的源地址也可以是这几个IP中的任何一个).

    ==========================================

    ether dst ehost

    如果数据包(nt: 指tcpdump 可抓取的数据包, 包括ip 数据包, tcp数据包)的以太网目标地址是 ehost,则捕获该数据包.

    ehost 可以是 /etc/ethers 文件中的名字或一个 数字地址(nt: 可通过 man ethers 看到对 /etc/ethers 文件的描述, 样例中用的是数字地址)

    ether src ehost

    如果数据包的以太网源地址是 ehost, 则捕获该数据包.

    ether host ehost

    如果数据包的以太网源地址或目标地址是ehost, 则捕获该数据包..

    ==========================================

    dst net net

    如果数据包的目标地址(IPv4或IPv6格式)的网络号字段为 net, 则捕获该数据包.

    net可以是从网络数据库文件 /etc/networks 中的名字, 也可以用数字形式的来表示.

    一个数字IPv4 网络号可以用点分四元组(比如, 192.168.1.0), 或点分三元组(比如, 192.168.1), 或点分二元组(比如, 172.16), 或单一单元组(比如, 10)来表示.

    这四种情况对应的网络掩码分别为:四元组: 255.255.255.255(这实际上已经是是一个具体的网络地址了),三元组: 255.255.255.0, 二元组: 255.255.0.0, 一元组: 255.0.0.0.

    src net net

    如果数据包的源地址(IPv4或IPv6格式)的网络号字段为 net, 则捕获该数据包.

    net net

    如果数据包的源或目的地址(IPv4或IPv6格式)的网络号字段为 net, 则捕获该数据包.

    ==========================================

    net net mask netmask

    如果数据包的源或目的 ip地址的网络掩码与 netmask匹配, 则捕获该数据包.

    此选项之前还可以配合 srcdst来进一步限定数据包的来源,比如.

    src net net mask 255.255.255.0 

    ==========================================

    net net/len

    如果数据包的源或目的地址(IPv4或IPv6格式)的属于该网段( net/len表示的网段), 则捕获该数据包.

    此选项之前还可以配合 srcdst来进一步限定数据包的来源.

    src net net/24 # 表示需要匹配源地址的网络编号有24位的数据包

    ==========================================

    dst port port

    如果数据包(包括ip/tcp, ip/udp, ip6/tcp or ip6/udp协议)的目的端口为 port, 则捕获该数据包.

    port 可以是一个数字也可以是一个名字(相应名字可以在 /etc/services 中找到该名字, 也可以通过 man tcpman udp来得到相关描述信息 ). 推荐使用数字.

    dst port 80 # 监听目的端口为80的数据包

    src port port

    如果数据包的源端口为 port, 则捕获该数据包.

    port port

    如果数据包的源或目的端口为 port, 则捕获该数据包.

    ==========================================

    dst portrange port1-port2

    监听目的端口在[port1, port2]的数据包,当然,既然存在端口,那么这个数据包必然属于ip/tcp, ip/udp, ip6/tcp 或者ip6/udp这几种中的一种.

    src portrange port1-port2

    监听源端口在[port1, port2]范围内的数据包.

    portrange port1-port2

    如果数据包的源端口或目的端口在[port1,port2]这个端口范围, 则捕获该数据包.以上关于 port 的选项都可以在其前面添加关键字: tcp 或者 udp对数据包加以更严格的限定.

    tcp src port port # 抓取源端口是port的tcp数据包

    ==========================================

    less length

    如果数据包的长度比 length 小或等于 length, 则捕获该数据包. 这与 len <= length的含义一致.

    greater length

    如果数据包的长度比length 大或等于length, 则捕获该数据包. 这与 len >= length的含义一致.

    ==========================================

    ip proto protocol

    如果数据包为 ipv4数据包并且其协议类型为 protocol, 则与此对应的条件表达式为真. protocol可以是一个数字也可以是名字, 比如: icmp6, pim, udp, tcp 等. 由于 tcp , udp 以及 icmp是tcpdump 的关键字,所以在这些协议名字之前必须要用\来进行转义(如果在C-shell 中需要用\来进行转义). 注意此表达元不会把数据包中协议头链中所有协议头内容全部打印出来(nt: 实际上只会打印指定协议的一些头部信息, 比如可以用

     tcpdump -i eth0 'ip proto \tcp and host 192.168.3.144

    则只打印主机 192.168.3.144发出或接收的数据包中 tcp 协议头所包含的信息).

    tcpdump -i eth0 'ip proto \tcp or \udp' # 捕获通过eth0接口的tcp或者udp数据包.

    ==========================================

    ether broadcast

    如果数据包是以太网广播数据包, 则捕获该数据包. ether 关键字是可选的.

    ip broadcast

    如果数据包是 IPv4广播数据包, 则捕获该数据包.

    ==========================================

    ether multicast

    如果数据包是一个以太网多点广播数据包,则捕获该数据包.关键字ether可以省略.

    ip multicast

    如果数据包是 ipv4多点广播数据包, 则捕获该数据包.

    ==========================================

    ether proto protocol

    如果数据包属于以下以太协议类型, 则与此对应的条件表达式为真.协议(protocol)字段, 可以是数字或以下所列出的名字: ip, ip6, arp, rarp, stp(Spanning tree protocol, 生成树协议, 可用于防止网络中产生链接循环)等.必须要注意的是如果标识符也是关键字, 从而必须通过\来进行转义.

    四、输出结果介绍

    下面我们介绍几种典型的tcpdump命令的输出信息

    (1) 数据链路层头信息

    使用命令:

    #tcpdump --e host ICE

    ICE是一台装有 linux的主机。它的 MAC地址是0:90:27:58:AF:1A, H219是一台装有Solaris的SUN工作站。它的 MAC地址是8:0:20:79:5B:46.

    上一条命令的输出结果如下所示:

    21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ICE. telne t 0:0(0) ack 22535 win 8760 (DF)

    21:50:12是显示的时间, 847509是ID号, eth0 > 表示从网络接口 eth0接收该分组, 同理 eth0 >表示从网络接口设备 eth0发送分组,8:0:20:79:5b:46是主机H219的 MAC地址, 它表明是从源地址H219发来的分组.0:90:27:58:af:1a是主机ICE的 MAC地址, 表示该分组的目的地址是ICE。 ip 是表明该分组是IP分组, 60是分组的长度, h219.33357 > ICE. telnet 表明该分组是从主机H219的 33357端口发往主机ICE的 TELNET(23)端口。 ack 22535表明对序列号是222535的包进行响应。 win 8760表明发 送窗口的大小是8760。

    (2) ARP包的tcpdump输出信息

    使用命令:

    #tcpdump arp

    得到的输出结果是:

    22:32:42.802509 eth0 > arp who-has route tell ICE (0:90:27:58:af:1a)
    22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)

    22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该分组,arp表明是ARP请求包, who-has route tell ICE表明是主机ICE请求主机route的MAC地址。 0:90:27:58:af:1a 是主机 ICE的MAC地址。

    (3) TCP包的输出信息

    用tcpdump捕获的TCP包的一般输出信息是:

    src > dst: flags data-seqno ack window urgent options

    src > dst:表明从源地址到目的地址, flags是TCP报文中的标志信息,具体描述如下:

    标识字符缩写描述
    SSYN同步标识
    FFIN终止标识
    RRST复位标识
    PPSH推送标识
    .以上四个标识bit全部为0

    data-seqno是报文中的数据的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小, urgent表明 报文中是否有紧急指针。 Options是选项。

    (4) UDP包的输出信息

    用tcpdump捕获的UDP包的一般输出信息是:

    route.port1 > ICE.port2: udp lenth

    UDP十分简单,上面的输出行表明从主机 routeport1端口发出的一个UDP报文 到主机 ICEport2端口,类型是UDP, 包的长度是 lenth

    五、举例

    (1) 想要截获所有210.27.48.1 的主机收到的和发出的所有的分组:

    #tcpdump host 210.27.48.1 

    (2) 想要截获主机210.27.48.1 和主机210.27.48.2或210.27.48.3的通信,使用命令(注意:括号前的反斜杠是必须的):

    #tcpdump host 210.27.48.1 and \(210.27.48.2 or 210.27.48.3 \)

    (3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:

    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    (4) 如果想要获取主机192.168.228.246接收或发出的ssh包,并且不转换主机名使用如下命令:

    #tcpdump -nn -n src host 192.168.228.246 and port 22 and tcp

    (5) 获取主机192.168.228.246接收或发出的ssh包,并把mac地址也一同显示:

    # tcpdump -e src host 192.168.228.246 and port 22 and tcp -n -nn

    (6) 过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头:

    tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24

    (7) 过滤源主机物理地址为XXX的报头:

    tcpdump ether src 00:50:04:BA:9B and dst……

    (为什么ether src后面没有host或者net?物理地址当然不可能有网络喽)。
    (8) 过滤源主机192.168.0.1和目的端口不是telnet的报头,并导入到tes.t.txt文件中:

    Tcpdump src host 192.168.0.1 and dst port not telnet -l > test.txt

    ip icmp arp rarptcpudpicmp 这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。

    六.man手册中的一些例子

    打印所有进入或离开主机 sundown 的数据包.

    tcpdump host sundown

    打印主机 helios 与主机 hot 或者与主机 ace 之间通信的数据包

    tcpdump host helios and \( hot or ace \)

    打印主机 ace 与 任何其他主机之间通信的IP 数据包, 但不包括与 helios之间的数据包.

    tcpdump ip host ace and not helios

    打印本地主机与Berkeley网络上的主机之间的所有通信数据包.

    tcpdump net ucb-ether

    打印所有源地址或目标地址是本地主机的 IP 数据包(如果本地网络通过网关连到了另一网络, 则另一网络并不能算作本地网络. localnet 在实际使用时要真正替换成本地网络的名字.

    tcpdump ip and not net localnet

    打印长度超过576字节, 并且网关地址是 snupIP 数据包

    tcpdump 'gateway snup and ip[2:2] > 576'

    以下列出了 tcp, ip头的结构, 以方便查看(需要以等宽字体查看).

    TCP 头格式(rfc793)

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |          Source Port          |       Destination Port        |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                        Sequence Number                        |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                    Acknowledgment Number                      |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |  Data |           |U|A|P|R|S|F|                               |
        | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
        |       |           |G|K|H|T|N|N|                               |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |           Checksum            |         Urgent Pointer        |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                    Options                    |    Padding    |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                             data                              |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    IPV4 头格式(rfc791)

        0                   1                   2                   3
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |Version|  IHL  |Type of Service|          Total Length         |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |         Identification        |Flags|      Fragment Offset    |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |  Time to Live |    Protocol   |         Header Checksum       |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                       Source Address                          |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                    Destination Address                        |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
        |                    Options                    |    Padding    |
        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

    七.输出格式

    tcpdump 的输出格式与协议有关. 以下简要描述了大部分常用的格式及相关例子.

    链路层头

    ARP/RARP 数据包

    tcpdump对 arp/rarp包的输出信息中会包含请求类型及该请求对应的参数. 显示格式简洁明了. 以下是从主机rtsg到主机csam的 rlogin(远程登录)过程开始阶段的数据包样例:

    arp who-has csam tell rtsg
    arp reply csam is-at CSAM

    第一行表示: rtsg发送了一个 arp数据包(nt:向全网段发送, arp数据包)以询问 csam的以太网地址,csam以她自己的以太网地址做了回应(在这个例子中, 以太网地址以大写的名字标识, 而internet地址(即ip地址)以全部的小写名字标识).

    如果使用 tcpdump -n, 可以清晰看到以太网以及 ip地址而不是名字标识:

    arp who-has 128.3.254.6 tell 128.3.254.68
    arp reply 128.3.254.6 is-at 02:07:01:00:01:c4

    如果我们使用 tcpdump -e, 则可以清晰的看到第一个数据包是全网广播的, 而第二个数据包是点对点的:

    RTSG Broadcast 0806  64: arp who-has csam tell rtsg
    CSAM RTSG 0806  64: arp reply csam is-at CSAM

    第一个数据包表明:以 arp包的源以太地址是RTSG, 目标地址是全以太网段, type域的值为16进制0806(表示ETHER_ARP即arp包的类型标识).包的总长度为64字节.

    TCP 数据包

    通常tcpdump对tcp数据包的显示格式如下:

    src > dst: flags data-seqno ack window urgent options

    srcdst 是源和目的 IP地址以及相应的端口. flags 标志由S(SYN), F(FIN), P(PUSH, R(RST)等组成,

    单独一个.表示没有flags标识. 数据段顺序号(Data-seqno)描述了此包中数据所对应序列号空间中的一个位置.

    ack描述的是同一个连接,同一个方向,下一个本端应该接收的(对方应该发送的)数据片段的顺序号.

    window是本端可用的数据接收缓冲区的大小(也是对方发送数据时需根据这个大小来组织数据).

    urg(urgent) 表示数据包中有紧急的数据. options 描述了tcp的一些选项, 这些选项都用尖括号来表示(如 <mss 1024>).

    src, dstflags 这三个域总是会被显示. 其他域的显示与否依赖于tcp协议头里的信息.

    下面是一个从主机trsg到csam的一个rlogin应用登录的开始阶段.

    rtsg.1023 > csam.login: S 768512:768512(0) win 4096 <mss 1024>
    csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 <mss 1024>
    rtsg.1023 > csam.login: . ack 1 win 4096
    rtsg.1023 > csam.login: P 1:2(1) ack 1 win 4096
    csam.login > rtsg.1023: . ack 2 win 4096
    rtsg.1023 > csam.login: P 2:21(19) ack 1 win 4096
    csam.login > rtsg.1023: P 1:2(1) ack 21 win 4077
    csam.login > rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1
    csam.login > rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1

    第一行表示有一个数据包从rtsg主机的tcp端口1023发送到了csam主机的 tcp端口login上. S表示设置了 SYN标志. 包的顺序号是768512, 并且没有包含数据.

    如果包含有数据,那么数据的表示格式为: first:last(nbytes), 其含义是此包中数据的顺序号从first开始直到last结束,不包括last. 并且总共包含nbytes的用户数据.

    没有捎带应答即ack, 可用的接受窗口的大小为4096bytes, 并且请求端(rtsg)的最大可接受的数据段大小是1024字节.

    主机csam 向主机rtsg 回复了基本相同的 SYN数据包, 其区别只是多了一个 piggy-backed ack(nt:捎带回的ack应答, 针对rtsg的SYN数据包).

    rtsg 同样针对csam的 SYN数据包回复了一 ACK数据包作为应答. .的含义就是此包中没有标志被设置. 由于此应答包中不含有数据, 所以包中也没有数据段序列号.

    提醒! 此ACK数据包的顺序号只是一个小整数1. 有如下解释:tcpdump对于一个tcp连接上的会话, 只打印会话两端的初始数据包的序列号,其后相应数据包只打印出与初始包序列号的差异.即初始序列号之后的序列号, 可被看作此会话上当前所传数据片段在整个要传输的数据中的’相对字节’位置(nt:双方的第一个位置都是1, 即’相对字节’的开始编号). -S将覆盖这个功能,使数据包的原始顺序号被打印出来.

    第六行的含义为:主机rtsg 向 主机csam发送了19字节的数据(字节的编号为2到20,传送方向为rtsg到csam). 包中设置了 PUSH标志.

    在第7行,主机csam回应道, 她已经从主机rtsg中收到了21以下的字节, 但不包括21编号的字节. 这些字节存放在主机csam的socket的接收缓冲中, 相应地,csam的接收缓冲窗口大小会减少19字节(nt:可以从第5行和第7行win属性值的变化看出来). csam在第7行这个包中也向rtsg发送了一个字节. 在第8行和第9行, csam 继续向rtsg 分别发送了两个只包含一个字节的数据包, 并且这个数据包带PUSH标志.

    如果头部含有虚假的属性信息(比如其长度属性其实比头部实际长度长或短), tcpdump会为该头部显示[bad opt].

    如果头部的长度告诉我们某些选项(nt | rt:从下文来看, 指tcp包的头部中针对ip包的一些选项, 回头再翻)会在此包中,而真正的IP(数据包的长度又不够容纳这些选项, tcpdump会显示[bad hdr length].

    UDP 数据包

    UDP 数据包的显示格式,可通过 rwho这个具体应用所产生的数据包来说明:

            actinide.who > broadcast.who: udp 84

    其含义为: actinide主机上的端口 whobroadcast主机上的端口 who发送了一个 udp数据包.这个数据包包含有84个字节的用户数据.

    一些UDP服务可通过数据包的源或目的端口来辨别,也可从所显示的更高层协议信息来识别. 比如, Domain Name service requests(DNS 请求).

    UDP 名称服务请求

    名称服务请求有如下的格式:

    src > dst: id op? flags qtype qclass name (len)

    比如有一个实际显示为:

    h2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37)

    主机 h2opolo 向主机 helios 上运行的名称服务器查询 ucbvax.berkeley.edu的地址记录(nt: qtype等于A). 此查询本身的id号为 3.

    符号 +意味着递归查询标志被设置(nt: dns服务器可向更高层dns服务器查询本服务器不包含的地址记录). 这个最终通过 IP包发送的查询请求数据长度为37字节, 其中不包括 UDPIP协议的头数据.

    因为此查询操作为默认值(nt | rt: normal one的理解), op字段被省略.如果op字段没被省略, 会被显示在 3+之间. 同样, qclass也是默认值, C_IN, 从而也没被显示, 如果没被忽略, 她会被显示在A之后.

    UDP 名称服务应答

    对名称服务应答的数据包,tcpdump会有如下的显示格式

        src > dst:  id op rcode flags a/n/au type class data (len)

    比如具体显示如下:

    helios.domain > h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273)
    helios.domain > h2opolo.1537: 2 NXDomain* 0/1/0 (97)

    第一行表示: 主机 helios 对主机 h2opolo所发送的3号查询请求回应了3条回答记录(nt | rt: answer records), 3条名称服务器记录,以及7条附加的记录. 第一个回答记录(nt: 3个回答记录中的第一个)类型为A(nt: 表示地址), 其数据为internet地址128.32.137.3.此回应UDP数据包, 包含273字节的数据(不包含UPD和IP的头部数据). op字段和rcode字段被忽略(nt: op的实际值为Query, rcode, 即response code的实际值为NoError), 同样被忽略的字段还有class 字段(nt | rt: 其值为C_IN, 这也是A类型记录默认取值)

    第二行表示: heliosh2opolo所发送的2号查询请求做了回应. 回应中, rcode编码为NXDomain(nt: 表示不存在的域)), 没有回答记录,但包含一个名称服务器记录, 不包含权威服务器记录(nt | ck: 从上文来看, 此处的authority records 就是上文中对应的additional records).

    *表示权威服务器回答标志被设置(nt: 从而additional records就表示的是authority records).

    由于没有回答记录, type, class, data字段都被忽略.

    flag字段还有可能出现其他一些字符, 比如 -(nt: 表示可递归地查询, 即RA 标志没有被设置), |(nt: 表示被截断的消息, 即TC 标志被置位). 如果应答(nt | ct: 可理解为, 包含名称服务应答的UDP数据包, tcpdump知道这类数据包该怎样解析其数据)的’question’段一个条目(entry)都不包含(nt: 每个条目的含义, 需补充),’[nq]’ 会被打印出来.

    要注意的是:名称服务器的请求和应答数据量比较大, 而默认的68字节的抓取长度(nt: snaplen, 可理解为tcpdump的一个设置选项)可能不足以抓取数据包的全部内容. 如果你真的需要仔细查看名称服务器的负载, 可以通过tcpdump 的-s 选项来扩大snaplen值.

    IP数据包分片

    IP分片数据包(nt: 即一个大的IP数据包切分后生成的小IP数据包)有如下两种显示格式.

    (frag id:size@offset+)
    (frag id:size@offset)

    (第一种格式表示, 此分片之后还有后续分片. 第二种格式表示, 此分片为最后一个分片.)

    id 表示分片的编号( 每个小 IP包被分配一个分片编号, 以便区分各个小分片).

    size表示此分片的大小,不包含分片头部数据.

    offset表示此分片所含数据在原始整个 IP包中的偏移.

    每个分片都会使tcpdump产生相应的输出打印. 第一个分片包含了高层协议的头数据(nt:从下文来看, 被分片IP数据包中相应 tcp头以及 IP头都放在了第一个分片中 ), 从而tcpdump会针对第一个分片显示这些信息, 并接着显示此分片本身的信息. 其后的一些分片并不包含高层协议头信息, 从而只会在显示源和目的之后显示分片本身的信息. 以下有一个例子:

    这是一个从 arizona.edulbl-rtsg.arpa途经CSNET网络的 ftp应用通信片段:

    arizona.ftp-data > rtsg.1170: . 1024:1332(308) ack 1 win 4096 (frag 595a:328@0+)
    arizona > rtsg: (frag 595a:204@328)
    rtsg.1170 > arizona.ftp-data: . ack 1536 win 2560

    有几点值得注意:
    第一, 第二行的打印中, 地址后面没有端口号.
    这是因为 TCP协议信息都放到了第一个分片中, 当显示第二个分片时, 我们无法知道此分片所对应 TCP包的顺序号.

    第二, 从第一行的信息中, 可以发现主机 arizonartsg发送308字节的用户数据, 而事实是, 相应IP包经分片后会总共产生512字节数据(第一个分片包含308字节的数据, 第二个分片包含204个字节的数据, 这超过了308字节).

    如果你在查找数据包的顺序号空间中的一些空洞(nt: hole,空洞, 指数据包之间的顺序号没有上下衔接上), 512这个数据就足够使你迷茫一阵(nt: 其实只要关注308就行,不必关注分片后的数据总量).

    一个 IP数据包如果带有非IP分片标志, 则显示时会在最后显示 (DF).

    时间戳

    tcpdump的所有输出打印行中都会默认包含时间戳信息.
    时间戳信息的显示格式如下

    hh:mm:ss.frac # 小时:分钟:秒.frac (未知, 需补充)

    此时间戳的精度与内核时间精度一致, 反映的是内核第一次看到对应数据包的时间. 而数据包从物理线路传递到内核的时间, 以及内核花费在此包上的中断处理时间都没有算进来.

    展开全文
  • TCPdump抓包命令

    2015-12-16 17:53:20
    TCPdump抓包命令  tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。  tcpdump提供了源代码,公开了接口...

    TCPdump抓包命令 
    tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。 
    tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。


    一、概述
    顾名思义,tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
    引用
    # tcpdump -vv
    tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
    11:53:21.444591 IP (tos 0x10, ttl 64, id 19324, offset 0, flags [DF], proto 6, length: 92) asptest.localdomain.ssh > 192.168.228.244.1858: P 3962132600:3962132652(52) ack 2726525936 win 1266
    asptest.localdomain.1077 > 192.168.228.153.domain: [bad udp cksum 166e!] 325+ PTR? 244.228.168.192.in-addr.arpa. (46)
    11:53:21.446929 IP (tos 0x0, ttl 64, id 42911, offset 0, flags [DF], proto 17, length: 151) 192.168.228.153.domain > asptest.localdomain.1077: 325 NXDomain q: PTR? 244.228.168.192.in-addr.arpa. 0/1/0 ns: 168.192.in-addr.arpa. (123)
    11:53:21.447408 IP (tos 0x10, ttl 64, id 19328, offset 0, flags [DF], proto 6, length: 172) asptest.localdomain.ssh > 192.168.228.244.1858: P 168:300(132) ack 1 win 1266
    347 packets captured
    1474 packets received by filter
    745 packets dropped by kernel
    不带参数的tcpdump会收集网络中所有的信息包头,数据量巨大,必须过滤。


    二、选项介绍
    引用
    -A 以ASCII格式打印出所有分组,并将链路层的头最小化。 
    -c 在收到指定的数量的分组后,tcpdump就会停止。 
    -C 在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。 
    -d 将匹配信息包的代码以人们能够理解的汇编格式给出。 
    -dd 将匹配信息包的代码以c语言程序段的格式给出。 
    -ddd 将匹配信息包的代码以十进制的形式给出。 
    -D 打印出系统中所有可以用tcpdump截包的网络接口。 
    -e 在输出行打印出数据链路层的头部信息。 
    -E 用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。 
    -f 将外部的Internet地址以数字的形式打印出来。 
    -F 从指定的文件中读取表达式,忽略命令行中给出的表达式。 
    -i 指定监听的网络接口。 
    -l 使标准输出变为缓冲行形式,可以把数据导出到文件。 
    -L 列出网络接口的已知数据链路。 
    -m 从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。 
    -M 如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。 
    -b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。
    -n 不把网络地址转换成名字。
    -nn 不进行端口名称的转换。
    -N 不输出主机名中的域名部分。例如,‘nic.ddn.mil‘只输出’nic‘。 
    -t 在输出的每一行不打印时间戳。 
    -O 不运行分组分组匹配(packet-matching)代码优化程序。 
    -P 不将网络接口设置成混杂模式。 
    -q 快速输出。只输出较少的协议信息。 
    -r 从指定的文件中读取包(这些包一般通过-w选项产生)。 
    -S 将tcp的序列号以绝对值形式输出,而不是相对值。 
    -s 从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。 
    -T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。 
    -t 不在每一行中输出时间戳。 
    -tt 在每一行中输出非格式化的时间戳。 
    -ttt 输出本行和前面一行之间的时间差。 
    -tttt 在每一行中输出由date处理的默认格式的时间戳。 
    -u 输出未解码的NFS句柄。 
    -v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。 
    -vv 输出详细的报文信息。 
    -w 直接将分组写入文件中,而不是不分析并打印出来。


    三、tcpdump的表达式介绍
    表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表 达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包 将会被截获。 
    在表达式中一般如下几种类型的关键字: 
    引用
    第一种是关于类型的关键字,主要包括host,net,port,例如 host 210.27.48.2, 指明 210.27.48.2是一台主机,net 202.0.0.0指明202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host。 
    第二种是确定传输方向的关键字,主要包括src,dst,dst or src,dst and src, 这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是 210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0。如果没有指明 方向关键字,则缺省是src or dst关键字。 
    第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI (分布式光纤数据接口网络)上的特定的网络协议,实际上它是”ether”的别名,fddi和ether 具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。 其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump 将会 监听所有协议的信息包。

    除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less, greater, 还有三种逻辑运算,取非运算是 ‘not ' '! ‘, 与运算是’and’,’&&';或运算是’or’ ,’&#124;&#124;’; 这些关键字可以组合起来构成强大的组合条件来满足人们的需要。

    四、输出结果介绍
    下面我们介绍几种典型的tcpdump命令的输出信息 
    (1) 数据链路层头信息 
    使用命令: 
    #tcpdump --e host ICE
    ICE 是一台装有linux的主机。它的MAC地址是0:90:27:58:AF:1A H219是一台装有Solaris的SUN工作站。它的MAC地址是8:0:20:79:5B:46; 上一条命令的输出结果如下所示:
    引用
    21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ICE. telne t 0:0(0) ack 22535 win 8760 (DF)
    21:50:12是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0接收该分组, eth0 >表示从网络接口设备发送分组, 8:0:20:79:5b:46是主机H219的MAC地址, 它表明是从源地址H219发来的分组. 0:90:27:58:af:1a是主机ICE的MAC地址, 表示该分组的目的地址是ICE。 ip 是表明该分组是IP分组,60 是分组的长度, h219.33357 > ICE. telnet 表明该分组是从主机H219的33357端口发往主机ICE的 TELNET(23)端口。 ack 22535 表明对序列号是222535的包进行响应。 win 8760表明发 送窗口的大小是8760。 
    (2) ARP包的tcpdump输出信息 
    使用命令: 
    #tcpdump arp
    得到的输出结果是:
    引用
    22:32:42.802509 eth0 > arp who-has route tell ICE (0:90:27:58:af:1a)
    22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)
    22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该分组,arp表明是ARP请求包, who-has route tell ICE表明是主机ICE请求主机route的MAC地址。 0:90:27:58:af:1a是主机 ICE的MAC地址。
    (3) TCP包的输出信息 
    用tcpdump捕获的TCP包的一般输出信息是: 
    引用
    src > dst: flags data-seqno ack window urgent options
    src > dst:表明从源地址到目的地址, flags是TCP报文中的标志信息,S 是SYN标志, F (FIN), P (PUSH) , R (RST) "." (没有标记); data-seqno是报文中的数据 的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小, urgent表明 报文中是否有紧急指针。 Options是选项。 
    (4) UDP包的输出信息
    用tcpdump捕获的UDP包的一般输出信息是: 
    引用
    route.port1 > ICE.port2: udp lenth
    UDP十分简单,上面的输出行表明从主机route的port1端口发出的一个UDP报文 到主机ICE的port2端口,类型是UDP, 包的长度是lenth。 

    五、举例
    (1) 想要截获所有210.27.48.1 的主机收到的和发出的所有的分组: 
    #tcpdump host 210.27.48.1 
    (2) 想要截获主机210.27.48.1 和主机210.27.48.2或210.27.48.3的通信,使用命令(注意:括号前的反斜杠是必须的): 
    #tcpdump host 210.27.48.1 and  210.27.48.2or210.27.48.3
    (3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令: 
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2
    (4) 如果想要获取主机192.168.228.246接收或发出的ssh包,并且不转换主机名使用如下命令: 
    #tcpdump -nn -n src host 192.168.228.246 and port 22 and tcp
    (5) 获取主机192.168.228.246接收或发出的ssh包,并把mac地址也一同显示:
    # tcpdump -e src host 192.168.228.246 and port 22 and tcp -n -nn
    (6) 过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头:
    tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24 
    (7) 过滤源主机物理地址为XXX的报头:
    tcpdump ether src 00:50:04:BA:9B and dst……
    (为什么ether src后面没有host或者net?物理地址当然不可能有网络喽)。 
    (8) 过滤源主机192.168.0.1和目的端口不是telnet的报头,并导入到tes.t.txt文件中:
    Tcpdump src host 192.168.0.1 and dst port not telnet -l > test.txt
    ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。

    tcpdump采用命令行方式,它的命令格式为:
    tcpdump [-nn] [-i 接口] [-w 储存档名] [-c 次数] [-Ae]
                            [-qX] [-r 文件] [所欲捕获的数据内容]
    参数:
    -nn,直接以 IP 及 Port Number 显示,而非主机名与服务名称。
    -i,后面接要「监听」的网络接口,例如 eth0, lo, ppp0 等等的接口。
    -w,如果你要将监听所得的数据包数据储存下来,用这个参数就对了。后面接文件名。
    -c,监听的数据包数,如果没有这个参数, tcpdump 会持续不断的监听,
         直到用户输入 [ctrl]-c 为止。
    -A,数据包的内容以 ASCII 显示,通常用来捉取 WWW 的网页数据包资料。
    -e,使用资料连接层 (OSI 第二层) 的 MAC 数据包数据来显示。
    -q,仅列出较为简短的数据包信息,每一行的内容比较精简。
    -X,可以列出十六进制 (hex) 以及 ASCII 的数据包内容,对于监听数据包内容很有用。
    -r,从后面接的文件将数据包数据读出来。那个「文件」是已经存在的文件,
         并且这个「文件」是由 -w 所制作出来的。
    所欲捕获的数据内容:我们可以专门针对某些通信协议或者是 IP 来源进行数据包捕获。
         那就可以简化输出的结果,并取得最有用的信息。常见的表示方法有。
        'host foo', 'host 127.0.0.1' :针对单台主机来进行数据包捕获。
         'net 192.168' :针对某个网段来进行数据包的捕获。
         'src host 127.0.0.1' 'dst net 192.168':同时加上来源(src)或目标(dst)限制。
         'tcp port 21':还可以针对通信协议检测,如tcp、udp、arp、ether 等。
         除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
    greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o
    r' ,'||';


    范例一:以 IP 与 Port Number 捉下 eth0 这个网卡上的数据包,持续 3 秒
    [root@linux ~]# tcpdump -i eth0 -nn
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
    01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win 
    9648
    01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 232:364(132) ack 1 win 
    9648
    <==按下 [ctrl]-c 之后结束
    6680 packets captured              <==捉取下来的数据包数量
    14250 packets received by filter   <==由过滤所得的总数据包数量
    7512 packets dropped by kernel     <==被核心所丢弃的数据包
    至于那个在范例一所产生的输出中,我们可以大概区分为几个字段,现以范例一当中那行特殊字体行来说明一下:

    · 01:33:40.41:这个是此数据包被捕获的时间,“时:分:秒”的单位。

    · IP:通过的通信协议是IP。

    · 192.168.1.100.22>:传送端是192.168.1.100这个IP,而传送的Port Number为22,那个大于(>)的符号指的是数据包的传输方向。

    · 192.168.1.11.1190:接收端的IP是192.168.1.11,且该主机开启port 1190来接收。

    · P 116:232(116):这个数据包带有PUSH的数据传输标志,且传输的数据为整体数据的116~232 Byte,所以这个数据包带有116 Bytes的数据量。

    · ack 1 win 9648:ACK与Window size的相关资料。

    最简单的说法,就是该数据包是由192.168.1.100传到192.168.1.11,通过的port是由22到1190,且带有116 Bytes的数据量,使用的是PUSH的标记,而不是SYN之类的主动联机标志。

    接下来,在一个网络状态很忙的主机上面,你想要取得某台主机对你联机的数据包数据时,使用tcpdump配合管线命令与正则表达式也可以,不过,毕竟不好捕获。我们可以通过tcpdump的表达式功能,就能够轻易地将所需要的数据独立的取出来。在上面的范例一当中,我们仅针对eth0做监听,所以整个eth0接口上面的数据都会被显示到屏幕上,但这样不好分析,可以简化吗?例如,只取出port 21的联机数据包,可以这样做:

    [root@linux ~]# tcpdump -i eth0 -nn port 21
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
    01:54:37.96 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 1 win 65535
    01:54:37.96 IP 192.168.1.100.21 > 192.168.1.11.1240:P 1:21(20) ack 1 win 5840
    01:54:38.12 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 21 win 65515
    01:54:42.79 IP 192.168.1.11.1240 > 192.168.1.100.21:P 1:17(16) ack 21 win 65515
    01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: . ack 17 win 5840
    01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: P 21:55(34) ack 17 win 5840

    看!这样就仅取出port 21的信息,如果仔细看的话,你会发现数据包的传递都是双向的,Client端发出请求而Server端则予以响应,所以,当然是有去有回了。而我们也就可以经过这个数据包的流向来了解到数据包运动的过程了。例如:

    · 我们先在一个终端机窗口输入“tcpdump-i lo-nn”的监听。

    · 再另开一个终端机窗口来对本机(127.0.0.1)登录“ssh localhost”,那么输出的结果会是如何?

    [root@linux ~]# tcpdump -i lo -nn
     1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
     2 listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes
     3 11:02:54.253777 IP 127.0.0.1.32936 > 
    127.0.0.1.22: S 933696132:933696132(0) 
       win 32767 
     4 11:02:54.253831 IP 127.0.0.1.22 > 127.0.0.1.32936: 
    S 920046702:920046702(0) 
       ack 933696133 win 32767 
     5 11:02:54.253871 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 1 win 8192 
     6 11:02:54.272124 IP 127.0.0.1.22 > 127.0.0.1.32936: 
    P 1:23(22) ack 1 win 8192 
       
     7 11:02:54.272375 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 23 win 8192

    代码显示的头两行是tcpdump的基本说明,然后:

    · 第3行显示的是来自Client端带有SYN主动联机的数据包。 
    · 第4行显示的是来自Server端,除了响应Client端之外(ACK),还带有SYN主动联机的标志。 
    · 第5行则显示Client端响应Server确定联机建立(ACK)。
    · 第6行以后则开始进入数据传输的步骤。

    从第3~5行的流程来看,熟不熟悉啊?没错。那就是3次握手的基础流程,有趣吧。不过tcpdump之所以被称为黑客软件之一远不止上面介绍的功能。上面介绍的功能可以用来作为我们主机的数据包联机与传输的流程分析,这将有助于我们了解到数据包的运作,同时了解到主机的防火墙设置规则是否有需要修订的地方。

    还有更神奇的用法。当我们使用tcpdump在Router上面监听明文的传输数据时,例如FTP传输协议,你觉得会发生什么问题呢?我们先在主机端执行“tcpdump -i lo port 21 -nn –X”,然后再以FTP登录本机,并输入账号与密码,结果你就可以发现如下的状况:

    [root@linux ~]# tcpdump -i lo -nn -X 'port 21'
        0x0000:  4500 0048 2a28 4000 4006 1286 7f00 0001  E..H*(@.@.......
        0x0010:  7f00 0001 0015 80ab 8355 2149 835c d825  .........U!I.\.%
        0x0020:  8018 2000 fe3c 0000 0101 080a 0e2e 0b67  .....<.........g
        0x0030:  0e2e 0b61 3232 3020 2876 7346 5450 6420  ...a220.(vsFTPd.
        0x0040:  322e 302e 3129 0d0a                      2.0.1)..
    
        0x0000:  4510 0041 d34b 4000 4006 6959 7f00 0001  E..A.K@.@.iY....
        0x0010:  7f00 0001 80ab 0015 835c d825 8355 215d  .........\.%.U!]
        0x0020:  8018 2000 fe35 0000 0101 080a 0e2e 1b37  .....5.........7
        0x0030:  0e2e 0b67 5553 4552 2064 6d74 7361 690d  ...gUSER.dmtsai.
        0x0040:  0a                                       .
    
        0x0000:  4510 004a d34f 4000 4006 694c 7f00 0001  E..J.O@.@.iL....
        0x0010:  7f00 0001 80ab 0015 835c d832 8355 217f  .........\.2.U!.
        0x0020:  8018 2000 fe3e 0000 0101 080a 0e2e 3227  .....>........2'
        0x0030:  0e2e 1b38 5041 5353 206d 7970 6173 7377  ...8PASS.mypassw
        0x0040:  6f72 6469 7379 6f75 0d0a                 ordisyou..

    上面的输出结果已经被简化过了,你需要自行在你的输出结果中搜索相关的字符串才行。从上面输出结果的特殊字体中,我们可以发现该FTP软件使用的是 vsFTPd,并且用户输入dmtsai这个账号名称,且密码是mypasswordisyou。如果使用的是明文方式来传输你的网络数据呢?

    另外你得了解,为了让网络接口可以让tcpdump监听,所以执行tcpdump时网络接口会启动在“混杂模式(promiscuous)”,所以你会在 /var/log/messages里面看到很多的警告信息,通知你说你的网卡被设置成为混杂模式。别担心,那是正常的。至于更多的应用,请参考man tcpdump了。


    例题:如何使用tcpdump监听来自eth0适配卡且通信协议为port 22,目标来源为192.168.1.100的数据包资料?

    答:tcpdump -i eth0 -nn 'port 22 and src host 192.168.1.100'。

    ##############例子2#######################################

     

    普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。
    # tcpdump
    tcpdump: listening on fxp0
    11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
    11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
    0000 0000 0080 0000 1007 cf08 0900 0000
    0e80 0000 902b 4695 0980 8701 0014 0002
    000f 0000 902b 4695 0008 00
    11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
    ffff 0060 0004 ffff ffff ffff ffff ffff
    0452 ffff ffff 0000 e85b 6d85 4008 0002
    0640 4d41 5354 4552 5f57 4542 0000 0000
    0000 00
    使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,
    使用-c参数指定要监听的数据包数量,
    使用-w参数指定将监听到的数据包写入文件中保存

    A想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
    #tcpdump host 210.27.48.1

    B想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令:(在命令行中适用   括号时,一定要
    #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

    C如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    D如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
    #tcpdump tcp port 23 host 210.27.48.1

    E 对本机的udp 123 端口进行监视 123 为ntp的服务端口
    # tcpdump udp port 123

    F 系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:
    #tcpdump -i eth0 src host hostname

    G 下面的命令可以监视所有送到主机hostname的数据包:
    #tcpdump -i eth0 dst host hostname

    H 我们还可以监视通过指定网关的数据包:
    #tcpdump -i eth0 gateway Gatewayname

    I 如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令:
    #tcpdump -i eth0 host hostname and port 80

    J 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
    ,使用命令:
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    K 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令
    :(在命令行中适用   括号时,一定要
    #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

    L 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    M 如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
    #tcpdump tcp port 23 host 210.27.48.1

    第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型
    除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
    greater,还有三种逻辑运算,取非运算是 ‘not ‘ ‘! ‘, 与运算是‘and‘,‘&&‘;或运算 是‘o
    r‘ ,‘||‘;
    第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
    如果我们只需要列出送到80端口的数据包,用dst port;如果我们只希望看到返回80端口的数据包,用src port。
    #tcpdump –i eth0 host hostname and dst port 80 目的端口是80
    或者
    #tcpdump –i eth0 host hostname and src port 80 源端口是80 一般是提供http的服务的主机
    如果条件很多的话 要在条件之前加and 或 or 或 not
    #tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80

    如果在ethernet 使用混杂模式 系统的日志将会记录

    May 7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.
    May 7 20:03:46 localhost kernel: device eth0 entered promiscuous mode
    May 7 20:03:57 localhost kernel: device eth0 left promiscuous mode

    tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。

    除了过滤语句,还有一个很重要的参数,也就是说,如果这个参数不设置正确,会导致包数据的丢失!

    它就是-s 参数,snaplen, 也就是数据包的截取长度,仔细看man就会明白的!默认截取长度为60个字节,但一般ethernet MTU都是1500字节。所以,要抓取大于60字节的包时,使用默认参数就会导致包数据丢失!

    只要使用-s 0就可以按包长,截取数据!

    展开全文
  • tcpdump抓包命令详解

    2016-01-14 17:55:12
    tcpdump抓包命令

    http://starsliao.blog.163.com/blog/static/89048201062333032563/

    TCPdump抓包命令 
    tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。 
    tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。


    一、概述
    顾名思义,tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
    引用
    # tcpdump -vv
    tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
    11:53:21.444591 IP (tos 0x10, ttl 64, id 19324, offset 0, flags [DF], proto 6, length: 92) asptest.localdomain.ssh > 192.168.228.244.1858: P 3962132600:3962132652(52) ack 2726525936 win 1266
    asptest.localdomain.1077 > 192.168.228.153.domain: [bad udp cksum 166e!] 325+ PTR? 244.228.168.192.in-addr.arpa. (46)
    11:53:21.446929 IP (tos 0x0, ttl 64, id 42911, offset 0, flags [DF], proto 17, length: 151) 192.168.228.153.domain > asptest.localdomain.1077: 325 NXDomain q: PTR? 244.228.168.192.in-addr.arpa. 0/1/0 ns: 168.192.in-addr.arpa. (123)
    11:53:21.447408 IP (tos 0x10, ttl 64, id 19328, offset 0, flags [DF], proto 6, length: 172) asptest.localdomain.ssh > 192.168.228.244.1858: P 168:300(132) ack 1 win 1266
    347 packets captured
    1474 packets received by filter
    745 packets dropped by kernel
    不带参数的tcpdump会收集网络中所有的信息包头,数据量巨大,必须过滤。


    二、选项介绍
    引用
    -A 以ASCII格式打印出所有分组,并将链路层的头最小化。 
    -c 在收到指定的数量的分组后,tcpdump就会停止。 
    -C 在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。 
    -d 将匹配信息包的代码以人们能够理解的汇编格式给出。 
    -dd 将匹配信息包的代码以c语言程序段的格式给出。 
    -ddd 将匹配信息包的代码以十进制的形式给出。 
    -D 打印出系统中所有可以用tcpdump截包的网络接口。 
    -e 在输出行打印出数据链路层的头部信息。 
    -E 用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。 
    -f 将外部的Internet地址以数字的形式打印出来。 
    -F 从指定的文件中读取表达式,忽略命令行中给出的表达式。 
    -i 指定监听的网络接口。 
    -l 使标准输出变为缓冲行形式,可以把数据导出到文件。 
    -L 列出网络接口的已知数据链路。 
    -m 从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。 
    -M 如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。 
    -b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。
    -n 不把网络地址转换成名字。
    -nn 不进行端口名称的转换。
    -N 不输出主机名中的域名部分。例如,‘nic.ddn.mil‘只输出’nic‘。 
    -t 在输出的每一行不打印时间戳。 
    -O 不运行分组分组匹配(packet-matching)代码优化程序。 
    -P 不将网络接口设置成混杂模式。 
    -q 快速输出。只输出较少的协议信息。 
    -r 从指定的文件中读取包(这些包一般通过-w选项产生)。 
    -S 将tcp的序列号以绝对值形式输出,而不是相对值。 
    -s 从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。 
    -T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。 
    -t 不在每一行中输出时间戳。 
    -tt 在每一行中输出非格式化的时间戳。 
    -ttt 输出本行和前面一行之间的时间差。 
    -tttt 在每一行中输出由date处理的默认格式的时间戳。 
    -u 输出未解码的NFS句柄。 
    -v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。 
    -vv 输出详细的报文信息。 
    -w 直接将分组写入文件中,而不是不分析并打印出来。


    三、tcpdump的表达式介绍
    表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表 达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包 将会被截获。 
    在表达式中一般如下几种类型的关键字: 
    引用
    第一种是关于类型的关键字,主要包括host,net,port,例如 host 210.27.48.2, 指明 210.27.48.2是一台主机,net 202.0.0.0指明202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host。 
    第二种是确定传输方向的关键字,主要包括src,dst,dst or src,dst and src, 这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是 210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0。如果没有指明 方向关键字,则缺省是src or dst关键字。 
    第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI (分布式光纤数据接口网络)上的特定的网络协议,实际上它是”ether”的别名,fddi和ether 具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。 其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump 将会 监听所有协议的信息包。

    除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less, greater, 还有三种逻辑运算,取非运算是 ‘not ' '! ‘, 与运算是’and’,’&&';或运算是’or’ ,’&#124;&#124;’; 这些关键字可以组合起来构成强大的组合条件来满足人们的需要。

    四、输出结果介绍
    下面我们介绍几种典型的tcpdump命令的输出信息 
    (1) 数据链路层头信息 
    使用命令: 
    #tcpdump --e host ICE
    ICE 是一台装有linux的主机。它的MAC地址是0:90:27:58:AF:1A H219是一台装有Solaris的SUN工作站。它的MAC地址是8:0:20:79:5B:46; 上一条命令的输出结果如下所示:
    引用
    21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ICE. telne t 0:0(0) ack 22535 win 8760 (DF)
    21:50:12是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0接收该分组, eth0 >表示从网络接口设备发送分组, 8:0:20:79:5b:46是主机H219的MAC地址, 它表明是从源地址H219发来的分组. 0:90:27:58:af:1a是主机ICE的MAC地址, 表示该分组的目的地址是ICE。 ip 是表明该分组是IP分组,60 是分组的长度, h219.33357 > ICE. telnet 表明该分组是从主机H219的33357端口发往主机ICE的 TELNET(23)端口。 ack 22535 表明对序列号是222535的包进行响应。 win 8760表明发 送窗口的大小是8760。 
    (2) ARP包的tcpdump输出信息 
    使用命令: 
    #tcpdump arp
    得到的输出结果是:
    引用
    22:32:42.802509 eth0 > arp who-has route tell ICE (0:90:27:58:af:1a)
    22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)
    22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该分组,arp表明是ARP请求包, who-has route tell ICE表明是主机ICE请求主机route的MAC地址。 0:90:27:58:af:1a是主机 ICE的MAC地址。
    (3) TCP包的输出信息 
    用tcpdump捕获的TCP包的一般输出信息是: 
    引用
    src > dst: flags data-seqno ack window urgent options
    src > dst:表明从源地址到目的地址, flags是TCP报文中的标志信息,S 是SYN标志, F (FIN), P (PUSH) , R (RST) "." (没有标记); data-seqno是报文中的数据 的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小, urgent表明 报文中是否有紧急指针。 Options是选项。 
    (4) UDP包的输出信息
    用tcpdump捕获的UDP包的一般输出信息是: 
    引用
    route.port1 > ICE.port2: udp lenth
    UDP十分简单,上面的输出行表明从主机route的port1端口发出的一个UDP报文 到主机ICE的port2端口,类型是UDP, 包的长度是lenth。 

    五、举例
    (1) 想要截获所有210.27.48.1 的主机收到的和发出的所有的分组: 
    #tcpdump host 210.27.48.1 
    (2) 想要截获主机210.27.48.1 和主机210.27.48.2或210.27.48.3的通信,使用命令(注意:括号前的反斜杠是必须的): 
    #tcpdump host 210.27.48.1 and  210.27.48.2or210.27.48.3
    (3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令: 
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2
    (4) 如果想要获取主机192.168.228.246接收或发出的ssh包,并且不转换主机名使用如下命令: 
    #tcpdump -nn -n src host 192.168.228.246 and port 22 and tcp
    (5) 获取主机192.168.228.246接收或发出的ssh包,并把mac地址也一同显示:
    # tcpdump -e src host 192.168.228.246 and port 22 and tcp -n -nn
    (6) 过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头:
    tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24 
    (7) 过滤源主机物理地址为XXX的报头:
    tcpdump ether src 00:50:04:BA:9B and dst……
    (为什么ether src后面没有host或者net?物理地址当然不可能有网络喽)。 
    (8) 过滤源主机192.168.0.1和目的端口不是telnet的报头,并导入到tes.t.txt文件中:
    Tcpdump src host 192.168.0.1 and dst port not telnet -l > test.txt
    ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。

    tcpdump采用命令行方式,它的命令格式为:
    tcpdump [-nn] [-i 接口] [-w 储存档名] [-c 次数] [-Ae]
                            [-qX] [-r 文件] [所欲捕获的数据内容]
    参数:
    -nn,直接以 IP 及 Port Number 显示,而非主机名与服务名称。
    -i,后面接要「监听」的网络接口,例如 eth0, lo, ppp0 等等的接口。
    -w,如果你要将监听所得的数据包数据储存下来,用这个参数就对了。后面接文件名。
    -c,监听的数据包数,如果没有这个参数, tcpdump 会持续不断的监听,
         直到用户输入 [ctrl]-c 为止。
    -A,数据包的内容以 ASCII 显示,通常用来捉取 WWW 的网页数据包资料。
    -e,使用资料连接层 (OSI 第二层) 的 MAC 数据包数据来显示。
    -q,仅列出较为简短的数据包信息,每一行的内容比较精简。
    -X,可以列出十六进制 (hex) 以及 ASCII 的数据包内容,对于监听数据包内容很有用。
    -r,从后面接的文件将数据包数据读出来。那个「文件」是已经存在的文件,
         并且这个「文件」是由 -w 所制作出来的。
    所欲捕获的数据内容:我们可以专门针对某些通信协议或者是 IP 来源进行数据包捕获。
         那就可以简化输出的结果,并取得最有用的信息。常见的表示方法有。
        'host foo', 'host 127.0.0.1' :针对单台主机来进行数据包捕获。
         'net 192.168' :针对某个网段来进行数据包的捕获。
         'src host 127.0.0.1' 'dst net 192.168':同时加上来源(src)或目标(dst)限制。
         'tcp port 21':还可以针对通信协议检测,如tcp、udp、arp、ether 等。
         除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
    greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o
    r' ,'||';


    范例一:以 IP 与 Port Number 捉下 eth0 这个网卡上的数据包,持续 3 秒
    [root@linux ~]# tcpdump -i eth0 -nn
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
    01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win 
    9648
    01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 232:364(132) ack 1 win 
    9648
    <==按下 [ctrl]-c 之后结束
    6680 packets captured              <==捉取下来的数据包数量
    14250 packets received by filter   <==由过滤所得的总数据包数量
    7512 packets dropped by kernel     <==被核心所丢弃的数据包
    至于那个在范例一所产生的输出中,我们可以大概区分为几个字段,现以范例一当中那行特殊字体行来说明一下:

    · 01:33:40.41:这个是此数据包被捕获的时间,“时:分:秒”的单位。

    · IP:通过的通信协议是IP。

    · 192.168.1.100.22>:传送端是192.168.1.100这个IP,而传送的Port Number为22,那个大于(>)的符号指的是数据包的传输方向。

    · 192.168.1.11.1190:接收端的IP是192.168.1.11,且该主机开启port 1190来接收。

    · P 116:232(116):这个数据包带有PUSH的数据传输标志,且传输的数据为整体数据的116~232 Byte,所以这个数据包带有116 Bytes的数据量。

    · ack 1 win 9648:ACK与Window size的相关资料。

    最简单的说法,就是该数据包是由192.168.1.100传到192.168.1.11,通过的port是由22到1190,且带有116 Bytes的数据量,使用的是PUSH的标记,而不是SYN之类的主动联机标志。

    接下来,在一个网络状态很忙的主机上面,你想要取得某台主机对你联机的数据包数据时,使用tcpdump配合管线命令与正则表达式也可以,不过,毕竟不好捕获。我们可以通过tcpdump的表达式功能,就能够轻易地将所需要的数据独立的取出来。在上面的范例一当中,我们仅针对eth0做监听,所以整个eth0接口上面的数据都会被显示到屏幕上,但这样不好分析,可以简化吗?例如,只取出port 21的联机数据包,可以这样做:

    [root@linux ~]# tcpdump -i eth0 -nn port 21
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
    01:54:37.96 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 1 win 65535
    01:54:37.96 IP 192.168.1.100.21 > 192.168.1.11.1240:P 1:21(20) ack 1 win 5840
    01:54:38.12 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 21 win 65515
    01:54:42.79 IP 192.168.1.11.1240 > 192.168.1.100.21:P 1:17(16) ack 21 win 65515
    01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: . ack 17 win 5840
    01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: P 21:55(34) ack 17 win 5840

    看!这样就仅取出port 21的信息,如果仔细看的话,你会发现数据包的传递都是双向的,Client端发出请求而Server端则予以响应,所以,当然是有去有回了。而我们也就可以经过这个数据包的流向来了解到数据包运动的过程了。例如:

    · 我们先在一个终端机窗口输入“tcpdump-i lo-nn”的监听。

    · 再另开一个终端机窗口来对本机(127.0.0.1)登录“ssh localhost”,那么输出的结果会是如何?

    [root@linux ~]# tcpdump -i lo -nn
     1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
     2 listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes
     3 11:02:54.253777 IP 127.0.0.1.32936 > 
    127.0.0.1.22: S 933696132:933696132(0) 
       win 32767 
     4 11:02:54.253831 IP 127.0.0.1.22 > 127.0.0.1.32936: 
    S 920046702:920046702(0) 
       ack 933696133 win 32767 
     5 11:02:54.253871 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 1 win 8192 
     6 11:02:54.272124 IP 127.0.0.1.22 > 127.0.0.1.32936: 
    P 1:23(22) ack 1 win 8192 
       
     7 11:02:54.272375 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 23 win 8192

    代码显示的头两行是tcpdump的基本说明,然后:

    · 第3行显示的是来自Client端带有SYN主动联机的数据包。 
    · 第4行显示的是来自Server端,除了响应Client端之外(ACK),还带有SYN主动联机的标志。 
    · 第5行则显示Client端响应Server确定联机建立(ACK)。
    · 第6行以后则开始进入数据传输的步骤。

    从第3~5行的流程来看,熟不熟悉啊?没错。那就是3次握手的基础流程,有趣吧。不过tcpdump之所以被称为黑客软件之一远不止上面介绍的功能。上面介绍的功能可以用来作为我们主机的数据包联机与传输的流程分析,这将有助于我们了解到数据包的运作,同时了解到主机的防火墙设置规则是否有需要修订的地方。

    还有更神奇的用法。当我们使用tcpdump在Router上面监听明文的传输数据时,例如FTP传输协议,你觉得会发生什么问题呢?我们先在主机端执行“tcpdump -i lo port 21 -nn –X”,然后再以FTP登录本机,并输入账号与密码,结果你就可以发现如下的状况:

    [root@linux ~]# tcpdump -i lo -nn -X 'port 21'
        0x0000:  4500 0048 2a28 4000 4006 1286 7f00 0001  E..H*(@.@.......
        0x0010:  7f00 0001 0015 80ab 8355 2149 835c d825  .........U!I.\.%
        0x0020:  8018 2000 fe3c 0000 0101 080a 0e2e 0b67  .....<.........g
        0x0030:  0e2e 0b61 3232 3020 2876 7346 5450 6420  ...a220.(vsFTPd.
        0x0040:  322e 302e 3129 0d0a                      2.0.1)..
    
        0x0000:  4510 0041 d34b 4000 4006 6959 7f00 0001  E..A.K@.@.iY....
        0x0010:  7f00 0001 80ab 0015 835c d825 8355 215d  .........\.%.U!]
        0x0020:  8018 2000 fe35 0000 0101 080a 0e2e 1b37  .....5.........7
        0x0030:  0e2e 0b67 5553 4552 2064 6d74 7361 690d  ...gUSER.dmtsai.
        0x0040:  0a                                       .
    
        0x0000:  4510 004a d34f 4000 4006 694c 7f00 0001  E..J.O@.@.iL....
        0x0010:  7f00 0001 80ab 0015 835c d832 8355 217f  .........\.2.U!.
        0x0020:  8018 2000 fe3e 0000 0101 080a 0e2e 3227  .....>........2'
        0x0030:  0e2e 1b38 5041 5353 206d 7970 6173 7377  ...8PASS.mypassw
        0x0040:  6f72 6469 7379 6f75 0d0a                 ordisyou..

    上面的输出结果已经被简化过了,你需要自行在你的输出结果中搜索相关的字符串才行。从上面输出结果的特殊字体中,我们可以发现该FTP软件使用的是 vsFTPd,并且用户输入dmtsai这个账号名称,且密码是mypasswordisyou。如果使用的是明文方式来传输你的网络数据呢?

    另外你得了解,为了让网络接口可以让tcpdump监听,所以执行tcpdump时网络接口会启动在“混杂模式(promiscuous)”,所以你会在 /var/log/messages里面看到很多的警告信息,通知你说你的网卡被设置成为混杂模式。别担心,那是正常的。至于更多的应用,请参考man tcpdump了。


    例题:如何使用tcpdump监听来自eth0适配卡且通信协议为port 22,目标来源为192.168.1.100的数据包资料?

    答:tcpdump -i eth0 -nn 'port 22 and src host 192.168.1.100'。

    ##############例子2#######################################

     

    普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。
    # tcpdump
    tcpdump: listening on fxp0
    11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
    11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
    0000 0000 0080 0000 1007 cf08 0900 0000
    0e80 0000 902b 4695 0980 8701 0014 0002
    000f 0000 902b 4695 0008 00
    11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
    ffff 0060 0004 ffff ffff ffff ffff ffff
    0452 ffff ffff 0000 e85b 6d85 4008 0002
    0640 4d41 5354 4552 5f57 4542 0000 0000
    0000 00
    使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,
    使用-c参数指定要监听的数据包数量,
    使用-w参数指定将监听到的数据包写入文件中保存

    A想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
    #tcpdump host 210.27.48.1

    B想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令:(在命令行中适用   括号时,一定要
    #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

    C如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    D如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
    #tcpdump tcp port 23 host 210.27.48.1

    E 对本机的udp 123 端口进行监视 123 为ntp的服务端口
    # tcpdump udp port 123

    F 系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:
    #tcpdump -i eth0 src host hostname

    G 下面的命令可以监视所有送到主机hostname的数据包:
    #tcpdump -i eth0 dst host hostname

    H 我们还可以监视通过指定网关的数据包:
    #tcpdump -i eth0 gateway Gatewayname

    I 如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令:
    #tcpdump -i eth0 host hostname and port 80

    J 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
    ,使用命令:
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    K 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令
    :(在命令行中适用   括号时,一定要
    #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)

    L 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2

    M 如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
    #tcpdump tcp port 23 host 210.27.48.1

    第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型
    除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
    greater,还有三种逻辑运算,取非运算是 ‘not ‘ ‘! ‘, 与运算是‘and‘,‘&&‘;或运算 是‘o
    r‘ ,‘||‘;
    第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
    如果我们只需要列出送到80端口的数据包,用dst port;如果我们只希望看到返回80端口的数据包,用src port。
    #tcpdump –i eth0 host hostname and dst port 80 目的端口是80
    或者
    #tcpdump –i eth0 host hostname and src port 80 源端口是80 一般是提供http的服务的主机
    如果条件很多的话 要在条件之前加and 或 or 或 not
    #tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80

    如果在ethernet 使用混杂模式 系统的日志将会记录

    May 7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.
    May 7 20:03:46 localhost kernel: device eth0 entered promiscuous mode
    May 7 20:03:57 localhost kernel: device eth0 left promiscuous mode

    tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。

    除了过滤语句,还有一个很重要的参数,也就是说,如果这个参数不设置正确,会导致包数据的丢失!

    它就是-s 参数,snaplen, 也就是数据包的截取长度,仔细看man就会明白的!默认截取长度为60个字节,但一般ethernet MTU都是1500字节。所以,要抓取大于60字节的包时,使用默认参数就会导致包数据丢失!

    只要使用-s 0就可以按包长,截取数据!

    展开全文
  • Tcpdump抓包命令

    2017-01-20 14:28:34
    tcpdump src host 172.168.0.56 and port 2000 -vv

    tcpdump src host 172.168.0.56 and port 2000 -vv -XX


    http://blog.sina.com.cn/s/blog_45497dfa0100ph13.html;


    http://www.blogjava.net/stevenjohn/archive/2014/12/06/421133.html;

    展开全文
  • TCPdump抓包命令详解

    2021-05-07 06:43:56
    TCPdump抓包命令详解(转载)
  • tcpdump抓包命令 tcpdump 的抓包保存...
  • 1、tcpdump抓包命令使用----https://www.cnblogs.com/golinux/p/11012781.html 2、Tcpdump命令抓包详细分析----https://www.cnblogs.com/ct20150811/p/9431976.html 3、TCPdump抓包命令详解----...
  • TCPdump抓包命令 详解

    2016-12-21 19:38:59
    TCPdump抓包命令 详解
  • tcpdump抓包命令使用

    2019-11-12 19:57:56
    tcpdump抓包命令使用 抓包工具使用 1.作用: (1)捕获网络协议包 (2)分析网络协议包 2.分类: (1)命令行工具,如tcpdump (2)图像界面工具,wireshark 3.tcpdump命令行工具的使用 3.1格式:tcpdump ...
  • tcpdump抓包命令介绍

    2020-02-16 21:00:55
    TCPdump抓包命令 tcpdump -vv -s 0 -i eth0 port 3306 -w /123/a.txt tcpdump -nnr a.txt|more tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略, 使其成为类UNIX系统...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,350
精华内容 5,740
关键字:

tcpdump抓包命令