IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> tcpdump详解 -> 正文阅读

[网络协议]tcpdump详解

tcpdump能够分析网络行为,性能和应用产生或接收网络流量。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息,从而使用户能够进一步找出问题的根源。

也可以使用 tcpdump 的实现特定目的,例如在路由器和网关之间拦截并显示其他用户或计算机通信。通过 tcpdump 分析非加密的流量,如Telnet或HTTP的数据包,查看登录的用户名、密码、网址、正在浏览的网站内容,或任何其他信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁

权限要求

一些类Unix操作系统,用户有必须拥有超级用户权限方可使用 tcpdump,因为在这些系统需要使用超级用户权限将网络界面设置为混杂模式。用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给它或者是它发出的。一般而言,Unix不会让普通用户设置混杂模式,因为这样可以看到别人的信息,比如telnet的用户名和密码,这样会引起一些安全上的问题,所以只有root用户可以开启混杂模式,开启混杂模式的命令是:ifconfig eth0 promisc, eth0是你要打开混杂模式的网卡。

指令解释

-i eth0   #-i 指定指定监听的网络接口。如果不指定网卡,默认tcpdump只会监视第一个网络接口eth0。
-s 0      #-s 指定从每个数据包中 获取snaplen字节的数据,而不是默认的 262144 字节。
由于快照有限而被截断的数据包在输出中用``[| 表示 proto ]'',其中proto 是发生截断的协议级别的名称。请注意,拍摄更大的快照既会增加处理数据包所需的时间,也能有效地减少数据包缓冲量。这可能会导致数据包丢失。另请注意,拍摄较小的快照将丢弃来自传输层以上协议的数据,这会丢失可能很重要的信息。例如,NFS 和 AFS 请求和回复非常大,如果选择的快照长度太短,则大部分细节将不可用。
如果您需要将快照大小降低到默认值以下,您应该将snaplen限制为将捕获您感兴趣的协议信息的最小数字。将snaplen设置 为 0 会将其设置为默认值 262144
-l   #使 stdout 行缓冲。如果您想在捕获数据时查看数据,则很有用
-nn #指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示
-nnA #抓取包详情
-A #以 ASCII 格式打印每个数据包(减去其链接级标头)。方便捕捉网页。
-n 表示不要解析域名,直接显示 ip。
-X 同时用 hex 和 ascii 显示报文的内容。
-XX 同 -X,但同时显示以太网头部。
-S 显示绝对的序列号(sequence number),而不是相对编号。
-v, -vv, -vvv:显示更多的详细信息
-c number: 截取 number 个报文,然后结束
tcp port 80 #如果只包含HTTP请求,将上面命令中的“tcp port 80”修改为“tcp dst port 80
tcpdump -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

我上面的拆分开解释

tcp[((tcp[12:1] & 0xf0) >> 2):4]
&           #是按位与运算。
>> 			#表示按位右移。
>tcp[12:1]  #在offset 12处取TCP段(即包含报头的包)的1个字节

结构中我们可以看出offset 12(0xC)是Data Offset字段。其定义如下:
数据偏移量(4 位)以 32 位字为单位指定 TCP 标头的大小。标题的最小大小为 5 个字,最大为 15 个字,因此最小大小为 20 个字节,最大大小为 60 个字节,标题中最多允许 40 个字节的选项。这个字段的名字来源于它也是从 TCP 段的开始到实际数据的偏移量。
但是,该字段只有 4 位,并且tcp[12:1]占用整个字节(8 位)。我们只想要前四个。

tcp[12:1] & 0xf0获取该数据偏移字节并使用常量 0xF0 应用按位与运算。这通常称为屏蔽操作,因为常量中设置为 0 的任何位在输出中也将设置为零。用二进制来考虑这个更容易。0xF0 只是 11110000,并且由于x & 0对于任何位 x 始终为 0,并且x & 1对于任何位 x 始终为 x,因此 0xF0 中的零位将“关闭”或屏蔽给定的位,但不理会其余的位。在这种情况下,如果我们假设它tcp[12:1]是 10110101,那么结果将是 10110000,因为最后四位被屏蔽为零。这里的想法是,由于数据偏移字段只有 4 位长,但我们有 8 位,我们屏蔽掉不相关的位,所以我们只有前 4 位。

这里的问题是,从数字上讲,我们的 4 位位于字节的“顶部”侧。这意味着我们有 11010000,而不是只有 1101(我们的数据偏移位)。如果我们只想获得数据偏移字段的“原始”值,我们将右移四位。10110000 >> 4 = 1101,即我们扔掉“底部” 4 位并将顶部 4 位右移。但是,在这种情况下,您会注意到过滤器只移动了 2 个位置,而不是 4 个。

这就是我们要回顾数据偏移字段定义的地方:它以32 位字而不是字节指定标头的大小。因此,如果我们想知道以字节为单位的标头长度,我们需要将其乘以 4。事实证明,按位左移 1 与将数字乘以 2 相同,按位左移 -移位 2 与将数字乘以 4 相同。

现在,将此与我们已经看到的内容结合起来:>> 4如果您想获得 Data Offset 的原始值,这在过滤器中是有意义的,但是我们想将其乘以 4,这与左移 ( << 2)等效,即抵消了该右移的一部分,导致>> 2.

因此,(tcp[12:1] & 0xf0) >> 2提取数据偏移字段并将其乘以 4 以获得 TCP 标头的大小(以字节为单位)。

port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420

该0x47455420常量实际上是 ASCII 字节的数字编码GET(最后一个字符是空格),其中这些字符的 ASCII 值是 0x47、0x45、0x54、0x20。

那么,这是如何全面运作的呢?它从 TCP 标头中提取 4 位数据偏移字段,将其乘以 4 以计算以字节为单位的标头大小(这也是数据的偏移量),然后在此偏移量处提取 4 个字节以获得前 4 个数据的字节数,然后将其与“GET”进行比较以检查它是 HTTP GET。

端口范围

(tcp[0:2] > 1500 and tcp[0:2] < 1550) or (tcp[2:2] > 1500 and tcp[2:2] < 1550)

tcp portrange 1501-1549

过滤协议头

过滤 tcp SYN 消息包:

'tcp[tcpflags] & (tcp-syn) != 0'

过滤 tcp SYN/ACK 消息包:

'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0'

常用的 tcp 标记:

tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg, tcp-ece, tcp-cwr

源端口大于1024的TCP数据包:

'tcp[0:2] > 1024'

过滤 HTTP

# 0x4745"GET"前两个字母"GE",0x4854"HTTP"前两个字母"HT"。
tcpdump  -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 

过滤 GET 请求:

'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'

#上面的 0x47455420'GET '16 进制:

过滤 POST 请求:

'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354 && tcp[((tcp[12:1] & 0xf0) >> 2) + 4:1] = 0x20'

# post的十六进制['0x50', '0x4f', '0x53', '0x54', '0x20']

过滤 PUT 请求:

'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x50555420'

#put的十六进制['0x50', '0x55', '0x54', '0x20']

过滤 PATH 请求:

'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x50415443 && tcp[((tcp[12:1] & 0xf0) >> 2) + 4:2] = 0x4820'

#path的十六进制['0x50', '0x41', '0x54', '0x43', '0x48', '0x20']

过滤 DELETE 请求:

'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x44454c45 && tcp[((tcp[12:1] & 0xf0) >> 2) + 4:2] = 0x5445 && tcp[((tcp[12:1] & 0xf0) >> 2) + 6:1] = 0x20'

过滤 OPTIONS 请求:

'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x4f505449 && tcp[((tcp[12:1] & 0xf0) >> 2) + 4:4] = 0x4f4e5320'

过滤 HTTP 响应 (HTTP/1.):

'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450 && tcp[((tcp[12:1] & 0xf0) >> 2) + 4:2] = 0x2f31 && tcp[((tcp[12:1] & 0xf0) >> 2) + 6:1] = 0x2e'
  1. grep简介
    grep (global search regular expression_r(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

-?
同时显示匹配行上下的?行,如:grep -2 pattern filename同时显示匹配行的上下2行。

-b,--byte-offset
打印匹配行前面打印该行所在的块号码。

-c,--count
只打印匹配的行数,不显示匹配的内容。

-f File,--file=File
从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。

-h,--no-filename
当搜索多个文件时,不显示匹配文件名前缀。

-i,--ignore-case
忽略大小写差别。

-q,--quiet
取消显示,只返回退出状态。0则表示找到了匹配的行。

-l,--files-with-matches
打印匹配模板的文件清单。

-L,--files-without-match
打印不匹配模板的文件清单。

-n,--line-number
在匹配的行前面打印行号。

-s,--silent
不显示关于不存在或者无法读取文件的错误信息。

-v,--revert-match
反检索,只显示不匹配的行。

-w,--word-regexp
如果被\<和\>引用,就把表达式做为一个单词搜索。

-V,--version
显示软件版本信息。
sudo tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -l -A | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user '
(tcpdump -i eth0 -s 0 -l -nnA 'tcp dst port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354 && tcp[((tcp[12:1] & 0xf0) >> 2) + 4:1] = 0x20)'| egrep -i 'os_username=' --line-buffered) > /tmp/result.txt


tcpdump -i eth0 -nnvvXS -s1514 'port 22 or port 23 or port 25 or port 110' | egrep -i 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|pass:|user:|username:|password:|login:|pass |user '

参考:
https://blog.51cto.com/mcmvp/1180951
https://security.stackexchange.com/questions/121011/wireshark-tcp-filter-tcptcp121-0xf0-24#

https://blog.csdn.net/LL845876425/article/details/105061376

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 13:03:32  更:2021-08-18 13:04:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:35:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码