Linux tcpdump网络数据分析

Linux tcpdump网络抓包实例

TCPDUMP 毫无疑问是最重要的网络分析工具,因为它简单实用,而且功能强大。

Linux抓包原理

Linux抓包 是通过注册一种虚拟的底层网络协议来完成对网络报文(准确的说是网络设备)消息的处理权。

当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,例如以太网协议、x25协议处理模块来尝试进行报文的解析处理,这一点和一些文件系统的挂载相似,就是让系统中所有的已经注册的文件系统来进行尝试挂载,如果哪一个认为自己可以处理,那么就完成挂载。

当抓包模块把自己伪装成一个网络协议的时候,系统在收到报文的时候就会给这个伪协议一次机会,让它来对网卡收到的报文进行一次处理,此时该模块就会趁机对报文进行 窥探 ,也就是把这个报文完完整整的 复制 一份, 假装 是自己接收到的报文,汇报给抓包模块。

tcpdump介绍

tcpdump 是Linux系统下的一款抓包命令集,工作原理是基于网卡抓取流动在网卡上的数据包。

在Linux系统中由于tcpdump命令的简单和强大,我们一般直接使用tcpdump命令来抓取数据包。

保存之后,拖下来在wireshark中分析。一般会在图形化界面的Linux(Ubuntu、CentOS等)上使用wireshark进行分析,也可以在Windows(Windows wireshark基于winpcap处理网络驱动层)上分析。

默认情况下,tcpdump不会抓取本机内部通讯的报文。根据网络协议栈的规定,对于报文,即使是目的地是本机,也需要经过本机的网络协议层,所以本机通讯肯定是通过API进入了内核,并且完成了路由选择。

如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言说就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给它或者是它发出的。

一般而言,Unix不会让普通用户设置混杂模式,因为这样可以看到别人的信息,比如telnet的用户名和密码,这样会引起一些安全上的问题,所以只有root用户可以开启混杂模式,开启混杂模式的命令是:ifconfig en0 promisc, en0是你要打开混杂模式的网卡。(ifconfig ens32 -promisc关闭)

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

这篇教程将会教你从 IP、端口、协议、应用层等多方面来获取通信数据包,确保你可以尽可能快的找到你想要的数据。

tcpdump 的安装很简单,在 ubuntu 上:

apt install tcpdump

在 Redhat/Centos 上:

yum install tcpdump

首先通过一个简单的命令来获取 HTPPS 的数据包:

tcpdump -nnSX port 443

上面展示了一些 HTTPS 通信的内容,通过十六进制的形式展现出来,并且还加密了。当你对网络有任何疑问时,就可以通过上面的命令去获取你关注端口的信息。下面来看一些更详细的例子。

安装ping工具

apt install iputils-ping

基本用法

现在你可以获取一些基本的流量包,再来看看其他的用法,下面的这些例子在你从事网络、安全或者其他工作时都可以用到。

输入下面的命令,然后看看会出现什么:

tcpdump -i eth0

:如果 eth0 网卡没有配置,那什么都不会出现 ,这个时候可以将 eth0 换成 any

Ctrl+C退出

通过 IP 获取流量

最常用的查询方法之一,通过 host 参数,获取从特定 IP 发出和收到的流量:

tcpdump host baidu.com

点击在实验区上方的+号,点击open ssh,新开一个ssh界面,输入

ping baidu.com

然后再切换回原ssh窗口,就可以看到一直有数据包被抓取

下方的实验都需要这样进行,以便于观察到数据。

通过源地址和目标地址来过滤

如果你只需要获取一个方向的流量,可以使用 srcdst 来限定方向:

tcpdump src baidu.com
tcpdump dst baidu.com

通过特定网络获取流量包

如果想从一个特定的网络或者子网获取流量,使用 net 参数:

tcpdump net 1.2.3.0/24

获取十六进制的数据包内容

十六进制输出在你想看数据内容的时候非常有用,特别是你想深入其中一部分内容的时候,这是最好的方法,只需要加上 -X 参数:

tcpdump -c 1 -X icmp

通过特定的端口获取流量包

你可以通过特定的端口来获取流量数据,只需要使用 port 参数,在参数后加上具体的端口:

tcpdump port 3389
tcpdump src port 1025 

获取具体协议的流量包

如果你想获得特定类型的流量包,可以使用 tcpudpicmp 或者其他的协议:

tcpdump icmp

只获取 IPv6 的流量包

只获取 IPv6 的 流量包:

tcpdump ip6

通过端口范围来获取流量包

你也可以指定一个流量范围,然后只获取这个范围内的流量:

tcpdump portrange 21-23

通过流量包的大小来筛选

如果你想获得一个特定大小的包,你可以使用这个选项,你可以使用 less greate 或者其他你可以在数学中能找到的符号:

tcpdump less 32
tcpdump greater 64
tcpdump <= 128

读写流量包(pcap)

还可以流量包存成一个文件,以便后续可以对这个流量包进行分析。这个文件的格式是 PCAP(PEE-cap),它可以被数百种的应用处理,包括网络分析,系统入侵检测,当然也可以被 tcpdump 本身所处理。只需要使用 -w 参数就可以把流量包存成文件:

tcpdump port 80 -w capture_file

也可以使用 -r 参数来读取 PCAP 文件。在读取这个文件的时候同时也可以使用其他的参数,唯一受限制的就是无法捕捉和处理文件中不存在的内容。

tcpdump -r capture_file

进阶用法

上面我们已经通过一些基本的例子展示 tcpdump 的能力,下来来看一下更进阶的内容。

其他参数

下面这些参数在你使用 tcpdump 的时候也可以使用:

  • -X : 通过 16 进制和 ASCII 码来展示数据包中的内容

  • -XX : 和 -X 类似,但会另外展示以太网头部

  • -D : 展示可用的借口列表

  • -l : 单行输出(以便在保存时查看或者发送到其他命令)

  • -q : 减少一些不必要的输出

  • -t : 输出可读的时间格式

  • -tttt : 提供最大程度的人类可读的时间戳输出

  • -i eth0 : 监听 eth0 网口

  • -vv : 输出更详细的细节

  • c : 只获取一定的数量包,然后停止

  • -s : 获取以字节为单位固定大小的包,使用 -s0 可以获取到所有的内容

  • -S : 打印绝对序列号(注:TCP 的序列号)

  • -e : 同时获取以太网头部

  • -q : 减少协议信息的展示

  • -E : 通过提供加密密钥解密IPSEC通信

条件组合

上面提到的这些命令就已经很强大了,但 tcpdump 的真正黑魔法是你可以随意的组合这些参数,来达到找特定内容的目的。

有三种组合方式,如果你会一点编程的话,这些对你来说应该很熟悉:

  • 与: and&&

  • 或: or||

  • 非: not!

原始输出视图

使用此组合可以查看详细的输出,不包含主机名或端口号的解析,使用绝对序列号,并显示人类可读的时间戳。

tcpdump -ttnnvvS

下面是一些使用组合命令的例子。

获取特定 IP 和特定端口号的数据包

比如获取所有从 10.5.2.3 发出去,并且目标端口号是 3389 的数据包:

tcpdump -nnvvS src 10.5.2.3 and dst port 3389

从一个网络到另一挂网络的包

比如获取从 192.168.x.x 网络发到 10.x 或者 172.16.x.x 网络的包,并且会通过16进制的形式展现出来。

tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16

到特定 IP 且不包含 ICMP 的包

比如获取目标 IP 是192.168.0.2 且不包含 ICMP 的包:

tcpdump dst 192.168.0.2 and src net and not icmp

获取从特定 IP 发出但不包含特定端口的包

比如获取一个从特定 IP 出发,但不包括 SSH 的包(假设使用的是默认端口):

tcpdump -vv src mars and not dst port 22

如你所见,你可以构建查询来查找所需的任何内容。关键是首先精确地找出要查找的内容,然后构建语法来隔离特定类型的流量。

要注意的是,在构建复杂查询时,可能必须使用单引号对选项进行分组。使用单引号是为了告诉tcpdump忽略括号下面的某些特殊字符。同样的方式也可以用于使用其他表达式分组,如主机、端口、网络等。

tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'

隔离 TCP 标志

你还可以使用过滤器来隔离设置了特定TCP标志的数据包。

隔离 TCP RST 标志

tcpdump 'tcp[13] & 4!=0'
tcpdump 'tcp[tcpflags] == tcp-rst'

隔离 TCP SYN 标志

tcpdump 'tcp[13] & 2!=0'
tcpdump 'tcp[tcpflags] == tcp-syn'

隔离设置了 SYN 和 ACK 标志的包

tcpdump 'tcp[13]=18'

隔离TCP URG 标志

tcpdump 'tcp[13] & 32!=0'
tcpdump 'tcp[tcpflags] == tcp-urg'

隔离 TCP ACK 标志

tcpdump 'tcp[13] & 16!=0'
tcpdump 'tcp[tcpflags] == tcp-ack'

隔离 TCP PSH 标志

tcpdump 'tcp[13] & 8!=0'
tcpdump 'tcp[tcpflags] == tcp-psh'

隔离 TCP FIN 标志

tcpdump 'tcp[13] & 1!=0'
tcpdump 'tcp[tcpflags] == tcp-fin'

日常例子

最后,我们已经看完了基本理论,下面的这些例子可以用于日常快速获取某种类型的数据包。

同时设置 SYN 和 RST 标志

tcpdump 'tcp[13] = 6'

查找 HTTP 使用的 Agent

tcpdump -vvAls0 | grep 'User-Agent:'

获取明文的 Get 请求

tcpdump -vvAls0 | grep 'GET'

获取 HTTP 的 host 头部

tcpdump -vvAls0 | grep 'Host:'

获取 HTTP 的 cookies

tcpdump -vvAls0 | grep 'Set-Cookie|Host:|Cookie:'

获取 SSH 连接

无论连接来自哪个端口,这个都可以工作。

tcpdump 'tcp[(tcp[12]>>2):4] = 0x5353482D'

获取 DNS 的包

tcpdump -vvAs0 port 53

获取 FTP 的包

tcpdump -vvAs0 port ftp or ftp-data

获取 NTP 的包

tcpdump -vvAs0 port 123

获取明文的密码

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 '

发现包中不正常的数据

在IP报头中,有一点合法的应用程序永远不会设置,如果设置了就不正常。这里有一个有趣的过滤器,可以找到它被设置的包。

tcpdump 'ip[6] & 128 != 0'

总结

下面是一些思考:

  1. tcpdump 对于任何希望进入网络或信息安全领域的人来说都是一个有价值的工具

  2. 它有可以与流量交互的直接接口,加上它在检查数据包方面提供的精确性,它可能是学习TCP/IP最好的工具

  3. 像 Wireshark 这样的工具虽然也很棒,但是如果你想真正掌握数据包的结构,你必须先学会 tcpdump

移动端设备除iPad Pro外,其它移动设备仅能阅读基础的文本文字。
建议使用PC或笔记本电脑,浏览器使用Chrome或FireFox进行浏览,以开启左侧互动实验区来提升学习效率,推荐使用的分辨率为1920x1080或更高。
我们坚信最好的学习是参与其中这一理念,并致力成为中文互联网上体验更好的学练一体的IT技术学习交流平台。
您可加QQ群:575806994,一起学习交流技术,反馈网站使用中遇到问题。
内容、课程、广告等相关合作请扫描右侧二维码添加好友。

狐狸教程 Copyright 2021

进入全屏