流量嗅探详解

 

 

不少人存在这样的观点:只要计算机安装各种专业的安全软件,系统及时更 新补丁,密码尽可能复杂,那么计算机就会避免遭到入侵。当然这样的确不容易 被入侵,但那也只是针对传统的病毒、木马而言,在流量攻击面前,这些防护就 会显得无能为力。无论如何,当你与其他设备进行通信时就会产生流量,当这些 流量脱离了你的计算机后,其安全就不能得到有效的保障,然而这些流量中却包 含着你的敏感数据,攻击者完全可以在不入侵你计算机的情况下获得你的敏感数 据,这个过程叫流量嗅探。

 

 

 

 

 

 

9.1.1    工作原理

 

互联网中的流量都是以数据包的形式传送的,流量嗅探是对数据包中的流量 进行数据分析的一种手段。通过网络嗅探工具可以捕获到目标计算机网络的数据 包,数据包中的数据是根据所采用协议的要求来组织的,只要能够掌握协议的格 式,就能够分析出这些数据所表示的意义。

23b5a288213843feb4c8cd483becce02.png

图9-1    HTTP数据包

互联网中的大部分数据都没有采用加密的方式进行传输。例如,我们经常接  触的HTTP 、FTP 、Telnet等协议所传输的数据都是明文传输的,如图9-1~图9-3所 示。这也就意味着,一旦攻击者捕获了数据包,并用协议分析软件对数据包进行  分析,那么就可以截获这些数据。

1f3ed951654241d1950821d110fca207.png

图9-2    FTP数据包

d8a77d7ad0e743bbb1374969500c0021.png

图9-3    TELNET数据包

 

 

 

 

 

早期的局域网(LAN)是由集线器(HUB)构建的。因为HUB不具备交换机 的MAC地址表,所以它用广播的方式来发送数据。也就是说,HUB发送的数据, 局域网内的每台计算机都是能接收到的。如果把网络接口设置成“混杂”模式,就 可以实现不管是不是我的数据,我照单全收的情况,从而可以窃取到他人的流量 数据。

交换机的出现逐渐淘汰了HUB 。交换机会绑定MAC地址和接口,数据包最终 只发往一个终端主机,不会出现HUB的广播式方法数据。如果事先配置MAC地址 与对应的接口,理论上非常安全。但是很多人为了偷懒,直接使用了设备默认的 模式“ 自动学习” ,使得交换机成了非常容易被欺骗的对象。攻击者只要伪造一个  源MAC地址数据包,就能将这个地址的流量关联到自己的接口上,以此获得他人 的流量数据。

 

 

 

 

 

 

9.1.2    工具编写

 

9.1.1节我们介绍了流量嗅探的原理,本节我们使用Scapy模块来编写一个流量 嗅探工具来嗅探本机网卡上的流量。本次工具的编写需要使用到Scapy中的

sniff() 函数,该函数提供了多个参数,下面我们先了解其中几个比较重要的参 数的含义:

·iface:指定在哪个网络接口上抓包。

·count:表示要捕获数据包的数量。默认值为0 ,表示不限制数量。

·filter:流量的过滤规则。使用的是BPF(Berkeley Packet Filter ,柏克莱封包 过滤器)的语法。

·prn:定义回调函数,通常使用lambda表达式来写回调函数。当符合filter的 流量被捕获时,就会执行回调函数。

其中filter是最常用的参数。因为如果直接使用sniff() 函数,会捕获到大量 的流量数据,如果不进行过滤,我们很难从里面找到需要的数据库。filter采用的 是BPF ,利用它来匹配符合我们要求的流量并进行捕获。

BPF的过滤规则(表达式)由一个或多个原语组成。每个原语通常由一个标 识(ID 、名称或数字)和一个或多个限定词组成。

表达式主要有以下三种限定词:

·Type:类型限定词,指明ID或数字所代表的含义,例如host 、net和port等, 若不指定,则默认为host。

·Dir :方向限定词,指明数据包的传输方向,例如src 、dst 、src 、dst等。

·Proto:协议限定词,限定所要匹配的协议,例如tcp 、udp 、ip 、arp等。

表达式还可以使用逻辑运算符对原语进行组合,从而创建出更高级的表达 式,逻辑运算符主要有以下三种:

·&&:连接运算符。

· ||:选择运算符。

· ! :否定运算符。

下面举几个常见用例,帮助读者理解BPF语法:

 

 

 

 

· 只捕获与网络中某一IP的主机进行交互的流量:host 192.168.10.1。

· 只捕获与网络中某一MAC地址的主机的交互流量:ether src host 00:88: ca:86:f8:od。

· 只捕获来源于网络中某一IP的主机流量:src host 192.168.10.1。 · 只捕获去往网站中某一IP的主机的流量:dst host 192.168.10.1。

· 只捕获80端口的流量:port 80。

· 只捕获除80端口以外的其他端口的流量:!port 80。

· 只捕获ICMP流量:ICMP。

·只捕获源地址为192.168.10.1且目的端口为80的流量:src host 192.168.10.1&&dst port 80。

下面使用sniff() 来进行数据包的捕获。例如,我们捕获目的地址为 112.80.248.76的流量,如下所示:

1e7c6cbc42294910bc070b4b369c472c.png

这时Scapy就已经在开始捕获符合filter表达式的数据包,但是这个时候捕获到 数据是不会实时显示出来的,只有取消捕获时才会出现结果,如下所示:

493d728121fe4ceaa576ceffa92b9604.png

如果想要实时显示捕获到的数据包,就要加上prn选项,这里prn的内容我们 用lambda表达式来编写,具体内容为prn=lambda x:x.summary() ,如下所示:

 

7da7cbaa88b94b998a6741b670ab7ab5.png 0e39e3b1d94d4c8f9f19b062ea7f14a0.png

 

 

 

也可以进一步细化打印的内容。我们更改一下lambda表达式,让sniff() 打 印出源IP和目的IP ,如下所示:

如果需要更翔实的输出,则会需要更多的代码,那么sniff() 语句整体就会 很冗长。我们可以定义一个回调函数,然后让prn调用即可。定义一个

CallBack() 函数,代码如下:

U

def CallBack(packet) :

# 打印源地址和目标地址

print("Source:%s--->Target :%s"%(packet[IP] .src,packet[IP] .dst))

# 打印TTL值

print("TTL:%s"%packet[IP] .ttl)

# 使用内置函数show()打印数据包的内容

print(packet.show())

效果如下所示:

 

b736410827b24af59c5f35ce852a4be9.png

 

 

 

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml5872%5Cwps133.png&pos_id=9IZZ7FQq

除了显示这些数据包,我们还可以将这些数据包保存,用专业的工具查看、 分析这些数据包。保存数据包的格式有很多种, 目前最为通用的格式为pcap 。可 以借助wrpcap() 函数进行数据包的保存:

 

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml5872%5Cwps134.png&pos_id=IauDhzOC

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml5872%5Cwps135.png&pos_id=eYkv1lwD

packet=sniff(filter="dst packet)

112.80.248.76",

count=4)wrpcap("ms08067 .pcap",

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml5872%5Cwps136.png&pos_id=iyvyQdLT

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml5872%5Cwps137.png&pos_id=EBvdKkgB

同样,我们先通过sniff()进行捕获数据包,同时我们在增加一个count选  项,表明我们需要捕获数据包的数量,当捕获到规定数量的数据包时,sniff就停 止捕获。如下所示:

20230724024159.png?origin_url=file%3A%2F%2F%2FC%3A%5CUsers%5Clenovo%5CAppData%5CLocal%5CTemp%5Cksohtml5872%5Cwps138.png&pos_id=A84NWyLC

然后可以调用Wireshark来查看这些数据包

 

接下来,我们编写一个网络嗅探工具,根据用户传入的IP地址、数据包总数 来捕获相应的数据包,并保存为pcap格式。具体步骤如下:

1)导入相关模块并编写回调的打印函数,函数会打印输出源IP 、源端口、 目 标IP 、 目的端口以及整个数据包的信息。

2)编写一个时间戳转换函数,根据数据包内的时间戳进行转换输出,标明 该数据包的时间:

 

#!/usr/bin/python3

# -*- coding: utf-8 -*-

from scapy .all import *

import time

import optparse

 

# 回调打印函数

def PackCallBack(packet) :

print("*"*30)

# 打印源IP、源端口、 目的IP、 目的端口

print("[%s]Source:%s:%s--->Target :%s:%s"%(TimeStamp2Time(packet.time),

packet[IP] .src,packet.sport,packet[IP] .dst,packet.dport))

# print("[%s]Source:%s:%s--->Target :%s:%s"%(packet.time, packet[IP] .

src, 4444, packet[IP] .dst, 5555))

# 打印输出数据包

print(packet.show())

print("*"*30)

# 时间戳转换函数

def TimeStamp2Time(timeStamp) :

timeTmp = time .localtime(timeStamp)

myTime = time .strftime("%Y-%m-%d %H:%M:%S", timeTmp)

return myTime

3)编写main 函数,进行参数的定义以及流量数据的保存:

if __name__ == '__main__ ' :

parser = optparse .OptionParser("Example:python %prog -i 127 .0 .0 .1 -c 5 -o ms08067 .pcap\n")

#添加IP参数 -i

parser .add_option( '-i ', '--IP ', dest= 'host IP ',

default="127.0.0.1", type= 'string ',

help= 'IP address [default = 127 .0 .0 .1] ')

#添加数据包总数参数-c

parser .add_option( '-c ', '--count ', dest= 'packetCount ',

default=5, type= 'in t ',

help= 'Packet count [default = 5] ')

#添加保存文件名参数-o

parser .add_option( '-o ', '--output ', dest= 'fileName ',

default="ms08067 .pcap", type= 'string ',

help= 'save filename [default = ms08067 .pcap] ')

(options, args) = parser .parse_args()

def Filter = "dst " + options .host IP

packets = sniff(filter=def Filter, prn=PackCallBack, count=options .

packetCount)

# 保存输出文件

wrpcap(options .fileName, packets)

 

 

 

 

 

监听网络接口需要root权限,普通用户需要在命令前加上sudo ,否则会出现 错误,如下所示:

2a88a11685f24f4d988bef64d4517bc9.png

开启两个终端,一个终端进行监听,另一个终端使用curl命令,如下所示:

3f3622d64f434fb9ba0b4c4c31872e34.png

抓包效果如下所示:

01cfdca37cb14a3f8741e697af32dfa5.png

此时, 目录下会多出一个ms08067.pcap文件,我们用Wireshark打开查看,如 图9-5所示。

 

 

 

 

 

8a8abe4a3b6c4a09b2a8216958845246.png

图9-5    用Wireshark查看数据包

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2773966.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

汇编笔记 01

小蒟蒻的汇编自学笔记,如有错误,望不吝赐教 文章目录 笔记编辑器,启动!debug功能CS & IPmovaddsub汇编语言寄存器的英文全称中英对照表muldivandor 笔记 编辑器,启动! 进入 debug 模式 debug功能 …

在C++的union中使用std::string(非POD对象)的陷阱

struct和union的对比 union最开始是C语言中的关键字,在嵌入式中比较常见,由于嵌入式内存比较稀缺,所以常用union用来节约空间,在其他需要节省内存的地方也可以用到这个关键字,写一个简单程序来说明union的用途 struc…

如何合理规划 PostgreSQL 的数据库用户

PostgreSQL 作为世界上最领先的开源数据库,有一套强大的用户角色权限系统,和 MySQL 做一个对比: 但硬币的另一面则是对于简单场景来说增加了复杂度。在许多单应用场景,其实也不需要额外的 schema 层,也不需要额外的 ow…

2 月 7 日算法练习- 数据结构-树状数组上二分

问题引入 给出三种操作, 0在容器中插入一个数。 1在容器中删除一个数。 2求出容器中大于a的第k大元素。 树状数组的特点就是对点更新,成段求和,而且常数非常小。原始的树状数组只有两种操作,在某点插入一个数和求1到i的所有数的…

Sublime Text 3配置 Node.js 开发环境

《开发工具系列》 Sublime Text 3配置 Node.js 开发环境 一、引言二、主要内容2.1 初识 Sublime Text 32.2 初识 Node.js2.3 接入 Node.js2.3.1 下载并安装 Node.js2.3.2 环境变量配置 2.4 配置 Node.js 开发环境2.5 编写 Node.js 代码2.6 运行 Node.js 代码 三、总结 一、引言…

Spring Boot3整合Redis

⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 前置条件 1.导依赖 2.配置连接信息以及连接池参数 3.配置序列化方式 4.编写测试 前置条件 已经初始化好一个spr…

C++,stl,deque容器详解

目录 1.deque容器的构造函数 代码示例&#xff1a; 2.deque的赋值操作 3.deque的大小操作 4.deque的插入和删除 5.deque的数据存取 6.deque的排序操作 1.deque容器的构造函数 代码示例&#xff1a; #include<bits/stdc.h> using namespace std;void print(deque…

Spring Cloud使用ZooKeeper作为注册中心的示例

简单的Spring Cloud应用程序使用ZooKeeper作为注册中心的示例&#xff1a; 1.新建模块&#xff1a; 2.勾选依赖&#xff1a; 3.在pom.xml文件中做出部分修改及添加Spring Cloud Zookeeper 依赖版本&#xff1a; 完整pom文件 <?xml version"1.0" encoding&q…

单片机学习笔记---LED点阵屏的工作原理

目录 LED点阵屏分类 LED点阵屏显示原理 74HC595的介绍 一片74HC595的工作原理 多片级联工作原理 总结 LED点阵屏由若干个独立的LED组成&#xff0c;LED以矩阵的形式排列&#xff0c;以灯珠亮灭来显示文字、图片、视频等。LED点阵屏广泛应用于各种公共场合&#xff0c;如汽…

微信小程序(三十八)滚动容器

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.滚动触底事件 2.下拉刷新事件 源码&#xff1a; index.wxml <view class"Area"> <!-- scroll-y 垂直滚动refresher-enabled 允许刷新bindrefresherrefresh 绑定刷新作用函数bindscrollto…

Netty中使用编解码器框架

目录 什么是编解码器&#xff1f; 解码器 将字节解码为消息 将一种消息类型解码为另一种 TooLongFrameException 编码器 将消息编码为字节 将消息编码为消息 编解码器类 通过http协议实现SSL/TLS和Web服务 什么是编解码器&#xff1f; 每个网络应用程序都必须定义如何…

imgaug数据增强神器:增强器一览

官网&#xff1a;imgaug — imgaug 0.4.0 documentationhttps://imgaug.readthedocs.io/en/latest/ github:GitHub - aleju/imgaug: Image augmentation for machine learning experiments. imgaug数据增强神器&#xff1a;增强器一览_iaa 图像增强改变颜色-CSDN博客文章浏览阅…

C++新版本特性

目录: 前言 C11的常用新特性 auto类型推导&#xff1a; auto的限制&#xff1a; auto的应用&#xff1a; decltype类型推导&#xff1a; decltype的实际应用&#xff1a; 使用using 定义别名&#xff1a; 支持函数模板的默认模板参数 : tuple元组&#xff1a; 列表初…

泛型相关内容

1. 什么是泛型 泛型就是定义一种模板&#xff0c;既实现了编写一次&#xff0c;万能匹配&#xff0c;又通过编译器保证了类型安全。 2. 使用泛型 1&#xff09;使用泛型时&#xff0c;把泛型参数<T>替换为需要的class类型&#xff0c;不指定时默认为Obje…

uniapp中配置开发环境和生产环境

uniapp在开发的时候&#xff0c;可以配置多种环境&#xff0c;用于自动切换IP地址&#xff0c;用HBuilder X直接运行的就是开发环境&#xff0c;用HBuilder X发布出来的&#xff0c;就是生产环境。 1.使用HBuilder X创建原生的uniapp程序 选择vue3 2.什么都不改&#xff0c;就…

可达鸭二月月赛——入门赛第四场(周三)题解

可达鸭二月月赛——入门赛第四场&#xff08;周三&#xff09;题解 博文作者&#xff1a;王胤皓 题目&#xff08;可达鸭学员应该能打开&#xff0c;打不开的题解里有题目简述&#xff09;题解(点击即可跳转&#xff0c;里面有我的名字)T1 小可喝水linkT2 \texttt{ }\texttt{ …

06-OpenFeign-使用HtppClient连接池

默认下OpenFeign使用URLConnection 请求连接&#xff0c;每次都需要创建、销毁连接 1、添加ApacheHttpClient依赖 <!-- 使用Apache HttpClient替换Feign原生httpclient--><dependency><groupId>org.apache.httpcomponents</groupId><artifact…

音视频色彩:RGB/YUV

目录 1.RGB 1.1介绍 1.2分类 1.2.1RGB16 1)RGB565 2)RGB555 1.2.2RGB24 1.2.3RGB222 2.YUV 2.1介绍 2.2分类 2.2.1 YUV444 2.2.2 YUV 422 2.2.3 YUV 420 2.3存储格式 2.3.1 YUYV 2.3.2 UYVY 2.3.3 YUV 422P 2.3.4 YUV420P/YUV420SP 2.3.5 YU12 和…

百卓Smart管理平台 uploadfile.php 文件上传漏洞【CVE-2024-0939】

百卓Smart管理平台 uploadfile.php 文件上传漏洞【CVE-2024-0939】 一、 产品简介二、 漏洞概述三、 影响范围四、 复现环境五、 漏洞复现手动复现小龙验证Goby验证 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工…

【Linux】vim的基本操作与配置(上)

Hello everybody!今天我们要进入vim的讲解了。学会了vim,咱们就可以在Linux系统上做一些简单的编程啦&#xff01; 那么废话不多说&#xff0c;咱们直接进入正题&#xff01; 1.初识vim vim是一款多模式的文本编辑器&#xff0c;可以对一个文件进行编辑操作。 它一共有三个模…