- 目标
- 了解网络嗅探的基本含义
- 了解tcpdump工具的基本用法
- 掌握tcpdump工具抓包保存到文件的方法
- 熟悉wireshark工具的基本用法
- 掌握借助wireshark抓包工具分析简单网络协议的方法
6.1. 概述
网络嗅探是一种常用的数据收集、分析的方法:
黑客常通过网络嗅探获取主机或网络的控制权,安全人员亦使用网络嗅探进行信息泄露和攻击行为分析。
嗅探所得数据,可以是用户的账号和密码,也可以是一些商用机密数据。
常用的工具包括tcpdump(命令行)、wireshark(图形界面)
6.2. Tcpdump嗅探器
tcpdump是一个用于捕获网络报文,并输出报文内容的工具。
tcpdump 是一款功能强大的命令行嗅探(抓包)工具。
Tcpdump项目官网, 该项目除提供tcpdump工具外,还提供了一个用于网络流量捕获的c/c++库(可移植), 可用于网络协议分析领域的二次开发。
tcpdump在windows的版本叫WinDUMP,
6.2.1. 牛刀小试
- 基本用法
itcast@itcast $ sudo tcpdump -i wlp2s0
-i wlp2s0
, -i选项用来指定网络接口设备,wlp2s0 为我网络设备名称,你的电脑可能为eth0
-v
、-vv
, 选项用来显示更详细(繁琐)的输出
tcpdump的总的输出格式:系统时间 协议 源主机.端口 > 目标主机.端口 数据包参数
-
典型用法
tcpdump作为命令行抓包神器, 一般抓包保存,借助wireshark图形化协议分析工具进行分析网络包。
-w filename
, 用于指定保存的文件
itcast@itcast $ sudo tcpdump -i wlp2s0 -w wlp2s0_2018.pcap
tcpdump: listening on wlp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
添加 -v
, 会显示抓取到的包数量,如下
itcast@itcast $ sudo tcpdump -i wlp2s0 -v -w wlp2s0_2018.pcap
tcpdump: listening on wlp2s0, link-type EN10MB (Ethernet), capture size 262144 bytes
Got 15
-
帮助信息
man信息
itcast@itcast $ man tcpdump
-h
选项,显示帮助信息
itcast@itcast $ sudo tcpdump -h
tcpdump version 4.9.2
libpcap version 1.8.1
OpenSSL 1.0.2l 25 May 2017
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ][ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ][ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ][ -Q in|out|inout ][ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ][ --immediate-mode ] [ -T type ] [ --version ] [ -V file ][ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ][ -Z user ] [ expression ]
6.2.2. 高级过滤技巧
tcpdump作为一个命令行工具,可以包含过滤表达式( filter expression),满足表达式的报文将会被捕获。 如没有给过滤表达式,则网络上所有的信息包将会被捕获。
- 捕获特定主机的网络包(src, dst)host
itcast@itcast $ sudo tcpdump -i wlp2s0 host 61.135.169.121
host 61.135.169.121
获取源ip或者目标ip为61.135.169.121
的网络数据包
- 捕获特定源IP的网络包 src
itcast@itcast $ sudo tcpdump -i wlp2s0 src 61.135.169.121
11:32:09.605183 IP 61.135.169.121.https > localhost.46000: Flags [.], ack 518, win 808, length 0
。。。
- 捕获特定目标IP的网络包 dst
itcast@itcast $ sudo tcpdump -i wlp2s0 dst 61.135.169.121 11:33:31.977839 IP localhost.46010 > 61.135.169.121.https: Flags [.], ack 3076821759, win 237, length 0
11:33:31.977858 IP localhost.46004 > 61.135.169.121.https: Flags [.], ack 4115011400, win 237, length 0
。。。
- 捕获特定端口的网络包 port
itcast@itcast $ sudo tcpdump -i wlp2s0 port 80
- 捕获特定协议的网络包 tcp/arp/udp/...
itcast@itcast $ sudo tcpdump -i wlp2s0 host 172.16.28.100 and tcp
itcast@itcast $ sudo tcpdump -i wlp2s0 arp
- 帮助信息
itcast@itcast $ man pcap-filter
补充: 三种逻辑运算: 取非运算( ‘not ' or '! ‘)、 与运算(’and’ or,’&&')、 或运算(’or’ or ‘||’)
6.2.3. 附录
Panda.Guo@2018-04-27 16:15:09 $ man 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 直接将分组写入文件中,而不是不分析并打印出来。
6.3. Wireshark 网络协议分析工具
Wireshark(前身Ethereal)是一个网络报文分析工具。 网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。 2006年6月,因为商标的问题,Ethereal更名为Wireshark。
wireshark 官网
6.3.1. 基本用法
按照国际惯例,从最基本的程序启动说起。
开启抓包
启动wireshark程序后, 在在接口列表中选择接口名称(见下图中标识1),然后点击“开始捕获分组”(见下图标识2)在此接口上抓包。 本例选取enp8s0, 具体因电脑网卡不同而异, 关于enp8s0的含义,后续我写一篇网文做一正式说明。
报文捕获窗口
选取接口名称并点击开始捕获之后,就可以看到实时接收的报文。Wireshark会捕捉系统发送和接收的每一个报文。如果抓取的接口是无线并且选项选取的是混合模式,那么也会看到网络上其他报文。
接下来再界面我们可以看到wireshark抓到的实时数据包。我们对数据包的各个字段进行解释。
- No:代表数据包标号。
- Time:在软件启动的多长时间内抓到。
- Source:来源ip。
- Destination: 目的ip。
- Protocol:协议。
- Length:数据包长度。
- info:数据包信息。
在上面wireshark抓包窗口中,可以简单分割成三个小窗口,上部窗口每一行对应一个网络报文,点击某一行可以在下面两个窗口看到更多信息。中间窗口描述的是报文里面每一层的详细信息。底 部窗口以十六进制和ASCII码的方式列出报文内容。
停止抓包
在抓包过程中,我们随时可以点击图标停止或启动。来停止或者启动抓取数据包。
在上图中,标识2的地方, 为停止抓取数据包, 标识3的地方,为再次启动抓取数据包。
6.3.2. 报文过滤及分析
报文过滤,是wireshark出彩的地方,也是网络协议的分析的重要工作步骤
在下图方框中,输入相应的源ip、目的ip、协议等等表达式,点击箭头部分,在窗口中即可显示过滤后的数据包。
-
典型IP地址过滤表达式
- ip.src==172.16.28.102 : 指定源IP
- ip.dst==192.168.0.111 : 指定目标IP
- ip.addr == 192.0.2.1 : 指定IP,(不区分源和目标IP)
- ip.src==192.168.43.167 and ip.dst==223.166.152.109 : 指定源ip 并且目标IP
- ip.src==192.168.43.167 or ip.dst==223.166.152.109 : 指定源ip 或者目标IP
-
典型端口过滤表达式
- tcp.port ==52304
- tcp.dstport==30
- tcp.srcport==52304
- udp.....
-
典型网络协议过滤表达式
- telnet
- tcp
- udp
- 。。。。
6.3.3. 网络嗅探实战
-
目标: 通过抓取telnet网络报文, 分析并获取用户登录口令
telnet 登录典型命令
telnet 目标主机ip -l 用户名
, 在Password后输入口令,
itcast@itcast $ telnet 127.0.0.1 -l itcast
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Password:
---> 输入口令Last login: Thu Sep 6 18:19:01 CST 2018 from localhost on pts/1
。。。。。。
-
补充
安装telnet和telnetd服务
itcast@itcast $ sudo apt-get install telnet telnetd
6.3.4. 补充: 普通用户抓包配置
- 添加wireshark用户组。
Panda.Guo@2018-04-27 10:08:46 $ groupadd wireshark
Panda.Guo@2018-04-27 10:07:30 $ sudo cat /etc/group | grep "wireshark"
wireshark:x:128
- 添加当前用户(我的为panda,具体根据情况决定)到wireshark组
Panda.Guo@2018-04-27 10:12:23 $ sudo usermod -aG wireshark panda
Panda.Guo@2018-04-27 10:13:05 $ sudo cat /etc/group | grep "wireshark"
wireshark:x:128:panda
- 将dumpcap更改为wireshark用户组
Panda.Guo@2018-04-27 10:16:08 $ ls -l /usr/bin/dumpcap
-rwxr-xr-- 1 root root 96464 Jan 23 01:03 /usr/bin/dumpcap
Panda.Guo@2018-04-27 10:15:00 $ sudo chmod root:wireshark /usr/bin/dumpcap
Panda.Guo@2018-04-27 10:16:23 $ ls -l /usr/bin/dumpcap
-rwxr-xr-- 1 root wireshark 96464 Jan 23 01:03 /usr/bin/dumpcap
- 设置 setuid (root), 使普通用户执行具备root用户权限,或者添加能力
方法一:setuid root
Panda.Guo@2018-04-27 10:19:16 $ sudo chmod 4754 /usr/bin/dumpcap
Panda.Guo@2018-04-27 10:19:34ls -l /usr/bin/dumpcap
-rwsr-xr-- 1 root wireshark 96464 Jan 23 01:03 /usr/bin/dumpcap
方法二:添加能力
Panda.Guo@2018-04-27 10:20:39 $ sudo setcap "cap_net_admin,cap_net_raw+eip" /usr/bin/dumpcap
Panda.Guo@2018-04-27 10:21:28sudo getcap /usr/bin/dumpcap
/usr/bin/dumpcap = cap_net_admin,cap_net_raw+eip
6.4. 知识拓展
-
网络嗅探的工作原理
所有网络接口都有一个硬件地址(MAC),用于区别其他网络设备。
在正常情况下,一个合法的网络接口应该只能响应属于自己的网络数据。
然而,当将本地网卡设置成混杂状态时,它将对所有网络数据进行响应。
由于嗅探器工作于网络环境的底层(链路层),它能够拦截所有在网络上传送的数据,再通过相应的软件工具,就可以实时分析这些数据的内容。
-
交换网络
在共享网络中,把网卡设为混杂模式就可以监听所有的网络数据包,但是在交换网络中,情况就发生了变化。
以太网分为共享式以太网和交换式以太网:
共享式以太网通常以集线器作为网络设备,交换式以太网通常使用交换机作为网络连接设备。
共享式以太网中数据帧以广播方式传送到每个以太网端口,网内每台主机的网卡能接收到网内的所有数据帧。因此只要把网卡设置成为混杂模式就可以获取到这本地网卡的所有数据帧。
最典型的交换网络使用交换机连接,在交换机中可以设为一个端口一个MAC地址,形成一个端口对应一个MAC地址对。这样当网络数据包到达端口时,而不是转发给所有的端口,只是转发MAC对应的端口。这样,其他端口的通讯不受干扰,所以其他端口上的主机就无法接收到网络上的数据包了。
Tips:从网络嗅探角度看,交换机连接网络,比hub连接网络要安全。
-
数据包在局域网内的传输方式
众所周知,数据包在互联网上的传播是根据IP地址进行寻址的,但是完整的过程并非如此。数据包通过IP地址可以达到的最远的地点就是目标主机所在的子网,而在该子网内的寻址却是使用物理地址的,即MAC地址。
数据包被传送到目标主机所在的子网时,如果该子网为共享式网络(由集线器连接),数据包将被广播方式传播出去,这意味着该子网内的所有主机都可以接收到该数据包。当主机接收到数据包后通常会先检查其目的MAC地址,如果目的MAC地址不是自己,那么就是丢弃,只有目的MAC地址为自己的数据包才会将其交付给上一层处理。
Sniffer将网卡设置为混杂模式,这样就可以接收到所有的数据包了,达到了嗅探了目的。
(如果为交换网络,则根据MAC地址转发到相应主机,当MAC地址为FFFFFFFFFF...全1时广播)。
上述内容待确认。
-
设置网卡混杂模式
网卡当前是否是混杂模式, 关键通过ifconfig命令,查看flags项中,是否有PROMISC.
#设置混杂模式(其中enp8s0为你的网络接口名称,视具体而定)
itcast@itcast $ sudo ifconfig enp8s0 promisc
itcast@itcast $ sudo ifconfig enp8s0
enp8s0: flags=4355<UP,BROADCAST,PROMISC,MULTICAST> mtu 1500ether e0:db:55:f0:07:d0 txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0device interrupt 16 #取消混杂模式
itcast@itcast $ sudo ifconfig enp8s0 -promisc
itcast@itcast $ sudo ifconfig enp8s0
enp8s0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500ether e0:db:55:f0:07:d0 txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0device interrupt 16