当前位置:   article > 正文

tcpdump - 数据包进行截获的包分析工具

android tcpdump 抓包wlan0

From:http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html

30 分钟掌握 tcpdumphttp://zhuanlan.51cto.com/art/201701/527498.htm

Android tcpdump 下载:https://www.androidtcpdump.com/android-tcpdump/downloads

tcpdump for Android 移动端抓包:https://blog.csdn.net/whatday/article/details/86493505

tcpdump -i wlan0 -p -s 0 -w 抓包结果.pcap    

简介

        用简单的话来定义 tcpdump 就是:dump the traffic on a network,即对网络上的数据包进行截获的包分析工具。 顾名思义,tcpdump 可以将网络中传送的数据包的 "头" 完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

        tcpdump 是一个用于截取网络分组,并输出分组内容的工具。tcpdump 凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。tcpdump 提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。

        tcpdump 需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备 root 权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。

        tcpdump 是一个运行在命令行下的抓包工具( 其他的嗅探工具有 Wireshark、Ngrep等等)。

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

tcpdump 选项

        如果你是第一次看 tcpdump 的 man page 时,肯定一个头两个大,因为 tcpdump 几乎都是分析封包的表头数据,用户如果没有简易的网络封包基础,要看懂粉难吶! 所以,至少您得要回到网络基础里面去将 TCP 封包的表头数据  理解理解才好!

tcpdump 不加参数时是捕获所有的数据包(数据量巨大)。可以定义过滤规则,捕获符合过滤条件的包
tcpdump 对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障。通常的解决办法:先使用带 -w 参数的 tcpdump 截获数据并保存到文件中,然后再使用其他程序( 保存为.pcap后缀的文件,可以使用 wireshark )进行解码分析。

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 ]
-A    以ASCII格式打印出所有分组,并将链路层的头最小化。 
-b    在BGP包中打印AS号的数字,而不是简单的表示法。
-B buffer_size    设置操作系统捕获缓冲区的大小,以KiB(1024字节)为单位
-c count          在收到指定的包的数目后,tcpdump就会推出;例如: -c 10 表示接收到 10 个包之后 tcpdump 就停止。
-C file_size      在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,
                  然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。 
-d    将匹配信息包的代码以人们能够理解的汇编格式给出。 
-dd   将匹配信息包的代码以c语言程序段的格式给出。 
-ddd  将匹配信息包的代码以十进制的形式给出。 
-D    打印出系统中所有可以用tcpdump截包的网络接口。 
-e    在输出行打印出数据链路层的头部信息。 包括源mac和目的mac,以及网络层的协议;
-E    用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。 
-f    将外部的Internet地址以数字的形式打印出来。 
-F file              // 从指定的文件中读取表达式,忽略命令行中给出的表达式。 
-G rotate_seconds    // 还是看英文解释吧
-h    或者 --help   打印tcpdump和libpcap版本,使用方法,然后退出。 
-H    尝试检测802.11 s草案的网络头
-i interface    指定监听的网络接口。 
-K    不尝试验证IP、TCP或UDP校验和。这非常有用对于在硬件中执行部分或全部校验和计算的接口;否则,所有传出的TCP校验和都将被标记为坏的。
-l    使标准输出变为缓冲行形式,可以把数据导出到文件。  E.g: tcpdump -l | tee dat 或者 tcpdump -l > dat & tail -f dat
-L    列出网络接口的已知数据链路。 即 列出数据链路类型。
-m module    从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。 
-M secret    如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。 
-n    不把 IP地址 转换 成名字。指定将每个监听到数据包中的域名转换成IP地址后显示。
-nn   不进行端口名称的转换。指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示.
-N    不输出主机名中的域名部分。例如,‘nic.ddn.mil‘只输出’nic‘。 
-#    或者 --number 。 在行的开头打印一个可选的包号。
-O    不运行报文匹配(packet-matching)代码优化程序。 
-P    不将网络接口设置成混杂模式。 
-Q direction    选择捕获的数据包的 发送/接收 方向。可能的值是“in、out”和“inout”。不是在所有平台上都能使用。
-q    快速输出。只输出较少的协议信息。 
-r file    从指定的文件中读取包(这些包一般通过-w选项产生)。 
-S    打印绝对的,而不是相对的TCP序列号 
-s snaplen     //snaplen表示从一个包中截取的字节数。即 读取数据包的长度。 0表示包不截断,抓完整的数据包。默认的话 tcpdump 只显示部分数据包,默认68字节。
-T type    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。 
-t    不在每一行中输出时间戳。 
-tt   在每一行中输出非格式化的时间戳。 
-ttt  输出本行和前面一行之间的时间差。 
-tttt  在每一行中输出由date处理的默认格式的时间戳。 
-ttttt 以微秒形式打印时间戳。 
-u    输出未解码的NFS句柄。 
-v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。 
-vv    输出详细的报文信息。
-vvv   输出详细的报文信息。 
-w file    直接将包写入文件中,并不分析和打印出来;
-X    就是告诉tcpdump命令,需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器。
-XX

使用示例:

  • 1. 针对特定网口抓包 ( -i 选项 )
            不加任何选项执行 tcpdump 时,tcpdump 将抓取通过所有网口的包;使用 -i 在指定的网口抓包:
            示例:tcpdump 抓取所有通过 eth0 的包。命令:root@kali:~# tcpdump -i eth0
  • 2. 抓取指定数目的包( -c 选项 )。        默认情况下 tcpdump 将一直抓包,直到按下 Ctrl + c 中止,使用 -c 选项我们可以指定抓包的数量:        示例:只针对 eth0 网口抓 10 个包。命令:root@kali:~# tcpdump -i eth0 -c 10
  • 3. 将抓到包写入文件中( -w 选项 )。使用 -w 选项,将抓包记录到一个指定文件中,保存为.pcap后缀的文件,可以使用 wireshark 等工具读取分析。        命令:root@kali:~# tcpdump -i eth0 -c 10 -w 2017.pcap      
  • 4. 读取 tcpdump 保存文件( -r 选项 )。对于保存的抓包文件,我们可以使用 -r 选项进行读取。命令:root@kali:~# tcpdump -r 2017.pcap
  • 5. 抓包时不进行域名解析( -n选项 )。默认情况下,tcpdump 抓包结果中将进行域名解析,显示的是域名地址而非 ip 地址,使用 -n 选项,可指定显示 ip 地址。
  • 6. 增加抓包时间戳(-tttt选项)。使用-tttt选项,抓包结果中将包含抓包日期:
  • 7. 指定抓包的协议类型。我们可以只抓某种协议的包,tcpdump 支持指定以下协议:ip、ip6、arp、tcp、udp、wlan 等。
            示例:只抓取 arp 协议的包:root@kali:~# tcpdump -i eth0 -tttt arp
  • 8. 指定抓包端口。如果想要对某个特定的端口抓包,可以通过以下命令:root@kali:~# tcpdump -i eth0 port 22
  • 9. 抓取特定目标 ip和端口 的包。网络包的内容中,包含了源ip地址、端口和目标ip、端口,我们可以根据目标ip和端口过滤tcpdump抓包结果,以下命令说明了此用法:
            示例:root@kali:~# tcpdump -i eth0 dst 10.70.121.92 and port 22
            示例:root@kali:~# tcpdump -i eth0 -c 10 ip -tttt -X

1、抓取回环网口的包:tcpdump -i lo
2、防止包截断:tcpdump -s0
3、以数字显示主机及端口:tcpdump -n

命令: tcpdump -i eth0 port 1111 -X -c 3

  • -i   是 interface 的含义,是让 tcpdump 监听哪一个网卡
  • port 1111  我们只关心源端口或目的端口是 1111 的数据包.
  • -X  把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器。
  • -c 是 Count 的含义,这设置了我们希望 tcpdump 帮我们抓几个包。
  • 其中还有另外一个比较重要的参数 -l  使得输出变为行缓冲。-l  选项就是将 tcpdump 的输出变为“行缓冲”方式,这样可以确保 tcpdump 遇到的内容一旦是换行符,就将缓冲的内容输出到标准输出,以便于利用管道或重定向方式来进行后续处理。Linux / UNIX 的标准 I/O 提供了 全缓冲、行缓冲和无缓冲 三种缓冲方式。标准错误是不带缓冲的,终端设备常为行缓冲,而其他情况默认都是全缓冲的。        例如:我们只想提取包的每一行的第一个域(时间域),这种情况下我们就需要  -l  将默认的全缓冲变为行缓冲了。        tcpdump -i eth0 port 1111 -l | awk '{print $1}'
  • -w  将 数据包 写入文件中(即原始包,如果使用 重定向 > 则只是保存显示的结果,而不是原始文件),即所谓的 "流量保存" --- 把抓到的网络包存储到磁盘上为后续使用。
  • -r   从文件中读取 数据包。即 "流量回放" --- 就是把历史上的某一时间段的流量,重新模拟回放出来,用于流量分析。

通过 -w 选项将流量都存储在 cp.pcap (二进制格式)文件中。可以通过 -r 读取 raw packets 文件 cp.pcap
示例:sudo tcpdump i- eth0 'port 1111' -c 3 -r cp.pcap 即可进行流量回放。

tcpdump 的表达式介绍

selects which packets will be dumped. If no expression is given, all packets on the net will be dumped. Otherwise, only packets for which expression is `true' will be dumped.

For the expression syntax, see pcap-filter(7).

The expression argument can be passed to tcpdump as either a single Shell argument, or as multiple Shell arguments, whichever is more convenient. Generally, if the expression contains Shell metacharacters, such as backslashes used to escape protocol names, it is easier to pass it as a single, quoted argument
rather than to escape the Shell metacharacters. Multiple arguments are concatenated with spaces before being parsed.

tcpdump规则命令大全: tcpdump规则命令大全 - 百度文库

BPF 过滤规则参考:BPF过滤规则参考 - 百度文库

伯克利包过滤(Berkeley Packet Filter,BPF)语言:http://www.cnblogs.com/zhongxinWang/p/4303153.html

Wireshark-BPF过滤规则:Wireshark-BPF过滤规则 - John_ABC - 博客园

表达式是一个正则表达式,tcpdump 利用它作为过滤报文的条件,

  • 如果一个报文满足表达式的条件,则这个报文将会被捕获。
  • 如果没有给出任何条件,则网络上所有的信息包 将会被截获。

表达式由一个或多个 "表达元" 组成。( "表达元" 可理解为组成表达式的基本元素 )
一个 表达元 通常由一个或多个 限定符(qualifiers) 后跟 一个名字或数字表示的 id 组成 ( 即 qualifiers id )。
有三种不同类型的 修饰符(即 限定符):

  • type
  • dir
  • proto

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

  • 第一种是关于类型的关键字:主要包括 host,net,port。如果没有指定类型,缺省的类型是host。 
            例如:host 210.27.48.2, 指明 210.27.48.2是一台主机,
                    net 202.0.0.0指明202.0.0.0是一个网络地址,
                    port 23 指明端口号是23。
  • 第二种是确定传输方向的关键字:主要包括 src、dst、dst or src、dst and src 。这些关键字指明了传输的方向。如果没有指明方向关键字,则缺省是 src or dst 关键字。 
            示例:src 210.27.48.2     指明ip包中源地址是 210.27.48.2
                  dst net 202.0.0.0   指明目的网络地址是202.0.0.0。
  • 第三种是协议的关键字:主要包括 fddi,ip,arp,rarp,tcp,udp 等类型。如果没有指定任何协议,则 tcpdump 将会 监听所有协议的信息包。
    Fddi 指明是在FDDI (分布式光纤数据接口网络)上的特定的网络协议,实际上它是 "ether" 的别名,fddi 和 ether 具有类似的源地址和目的地址,所以可以将 fddi协议 包当作 ether 的包进行处理和分析。 其他的几个关键字就是指明了监听的包的协议内容。
type 修饰符指定id 所代表的对象类型, id 可以是名字也可以是数字. 
    可选的对象类型有: host, net, port 以及 portrange
        host 表示 是 主机
        net  表示 是 网络
        port 表示 是 端口
        portrange 表示 是 一个端口范围
    示例:
        host foo             表示 是 主机foo
        net 128.3            表示 是 网络128.3
        port 20              表示 是 端口20
        portrange 6000-6008  表示 端口范围 6000-6008   
    如果不指定 type 修饰符, 则默认的修饰符为 host

dir 修饰符描述id所对应的传输方向, 即 发送 还是 接收。可取的方向为: src, dst, src or dst, src and dst
    ( 分别表示, id是传输源, id是传输目的, id是传输源或者传输目的, id是传输源并且是传输目的 )    
    示例:
        src foo            表示符合条件的数据包中, 源主机是foo
        dst net 128.3      表示符合条件的数据包中,目的网络是128.3
        src or dst port ftp-data      表示符合条件的数据包中,源或目的端口为 ftp-data

    如果不指定 dir 修饰符, 则默认的修饰符为 src or dst
    对于链路层的协议,比如 SLIP(nt: Serial Line InternetProtocol, 串联线路网际网络协议), 
    以及linux下指定'any' 设备, 并指定'cooked'(nt | rt: cooked 含义未知, 需补充) 抓取类型, 
    或其他设备类型可以用'inbound''outbount' 修饰符来指定想要的传输方向.

proto 修饰符描述id 所属的协议. 
    可选的协议有: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp以及 upd.
    ( 
        ether, fddi, tr, 具体含义未知, 需补充. 可理解为物理以太网传输协议, 光纤分布数据网传输协议,以及用于路由跟踪的协议.  
        wlan, 无线局域网协议; ip,ip6 即通常的TCP/IP协议栈中所使用的ipv4以及ipv6网络层协议; 
        arp, rarp 即地址解析协议,反向地址解析协议; 
        decnet, Digital Equipment Corporation开发的, 最早用于PDP-11 机器互联的网络协议; 
        tcp and udp, 即通常TCP/IP协议栈中的两个传输层协议
    ).

    示例:
        ether src foo              '从以太网地址 foo 来的数据包'
        arp net 128.3              '发往或来自128.3网络的arp协议数据包'
        tcp port 21                '发送或接收端口为21的tcp协议数据包'
        udp portrange 7000-7009    '发送或接收端口范围为7000-7009的udp协议数据包'
    如果不指定 proto 修饰符, 则默认为与相应 type 匹配的修饰符. 例如:
        src foo  含义是 '(ip or arp or rarp) src foo' (nt: 即, 来自主机foo的ip/arp/rarp协议数据包, 默认type为host)
        net bar  含义是`(ip  or  arp  or rarp) net bar'(nt: 即, 来自或发往bar网络的ip/arp/rarp协议数据包)
        port 53  含义是 `(tcp or udp) port 53'(nt: 即, 发送或接收端口为53的tcp/udp协议数据包)
    
    (nt: 由于tcpdump 直接通过数据链路层的 BSD 数据包过滤器或 
     DLPI(datalink provider interface, 数据链层提供者接口)来直接获得网络数据包, 其可抓取的数据包可
     涵盖上层的各种协议, 包括arp, rarp, icmp(因特网控制报文协议),ip, ip6, tcp, udp, sctp(流控制传输协议).

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

    'fddi'(nt: Fiber Distributed Data Interface) 实际上与'ether' 含义一样: 
    tcpdump 会把他们当作一种''指定网络接口上的数据链路层协议''. 
    如同ehter网(以太网), FDDI 的头部通常也会有源, 目的, 以及包类型, 从而可以像ether网数据包一样对这些域进行过滤. 
    此外, FDDI 头部还有其他的域, 但不能被放到表达式中用来过滤

    同样, 'tr''wlan' 也和 'ether' 含义一致, 上一段对fddi 的描述同样适用于tr(Token Ring) 和
    wlan(802.11 wireless LAN)的头部. 对于802.11 协议数据包的头部, 目的域称为DA, 源域称为 SA;
    而其中的 BSSID, RA, TA 域(nt | rt: 具体含义需补充)不会被检测(nt: 不能被用于包过虑表达式中).

除了这三种类型的关键字之外,其他重要的关键字如下:

  • gateway
  • broadcast
  • less
  • greater
  • 还有三种逻辑运算  运算:and&&
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/937485
推荐阅读
  

闽ICP备14008679号