流量嗅探详解

 

 

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

 

 

 

 

 

 

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://www.hqwc.cn/news/457949.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt 常见容器类用法(一)

目录 QMap类 QHash类 QVector类 QMap类 QMap<key,T>提供一个从类型为Key的键到类型为T的值的映射。通常&#xff0c;QMap存储的数据形式是一个键对应一个值&#xff0c;并且按照键Key的次序存储数据。为了能够支持一键多值的情况&#xff0c;QMap提供QMap<key,T&g…

C语言——字符、数组和函数指针变量

目录 1. 字符指针变量2. 数组指针变量2.1 数组指针变量是什么&#xff1f;2.2 数组指针变量怎么初始化 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 typedef关键字 5. 函数指针数组6. 转移表 1. 字符指针变量 在指针的类型中我们知道…

解析基于检索排序的知识图谱问答系统

目录 前言1 问句的表示与语义理解1.1 问句表示的重要性1.2 端到端网络的优势 2 知识图谱中的排序问题2.1 知识图谱的核心作用2.2 查询匹配的转化与排序问题2.3 实体链接的关键性2.4 路径的构建与系统优化 3 难点与挑战3.1 实体链接、命名实体识别和消歧3.2 排序模型的挑战 4 优…

泛娱乐社交出海洞察,Flat Ads解锁海外增长新思路

摘要:解读泛娱乐社交应用出海现状与趋势,解锁“掘金”泛娱乐社交出海赛道新思路。 根据全球舆情监测机构 Meltwater 和社交媒体机构We are Social最新发布数据显示,全球社交媒体活跃用户数量已突破50亿,约占世界人口总数62.5%。庞大的用户数量意味着广阔的增量空间,目前,随着全…

板块零 IDEA编译器基础:第三节 下载和在IDEA中集成 Tomcat服务器 来自【汤米尼克的JAVAEE全套教程专栏】

板块零 IDEA编译器基础&#xff1a;第三节 下载和在IDEA中集成 Tomcat服务器 一、为什么选择Tomcat&#xff08;1&#xff09;常见的JAVA WEB服务器&#xff08;2&#xff09;选择Tomcat的理由 二、Tomcat 8.5下载解压三、Tomcat 结构目录四、在IDEA中集成Tomcat 假设我们已经…

23.HarmonyOS App(JAVA)堆叠布局StackLayout使用方法

不常用 StackLayout直接在屏幕上开辟出一块空白的区域&#xff0c;添加到这个布局中的视图都是以层叠的方式显示&#xff0c;而它会把这些视图默认放到这块区域的左上角&#xff0c;第一个添加到布局中的视图显示在最底层&#xff0c;最后一个被放在最顶层。上一层的视图会覆盖…

过年回家必备,向日葵远程控制帮您假期轻松“应急”

春节假期临近&#xff0c;无论是回家过年还是假期出游&#xff0c;我们都可能遇到突然的“业务”需要临时处理&#xff0c;可是电脑没在身边又怎么办呢&#xff1f;别慌&#xff0c;我们可以用向日葵远程控制。 通过使用向日葵远程控制&#xff0c;手机就能远程控制办公电脑&a…

微信小程序(三十六)事件传参

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.传参步骤 2.传参接收解构步骤 源码&#xff1a; index.wxml <button type"primary" bind:tap"onclick" mark:index"{{0}}" mark:remb"{{1}}" class"But&quo…

DataX详解和架构介绍

系列文章目录 一、 DataX详解和架构介绍 二、 DataX源码分析 JobContainer 三、DataX源码分析 TaskGroupContainer 四、DataX源码分析 TaskExecutor 五、DataX源码分析 reader 六、DataX源码分析 writer 七、DataX源码分析 Channel 文章目录 系列文章目录DataX是什么&#xff…

在WORD中设置公式居中编号右对齐设置方式

1 软件环境 Office Microsoft Office LTSC 专业增强版2021 2 最终效果 3 操作步骤 编辑公式&#xff1b;光标定位到公式的最后&#xff08;不是行的最后&#xff09;&#xff1b;输入#编号光标定位在公式最后&#xff08;不是行的最后&#xff09;&#xff0c;按Enter键回车…

(五)springboot 配置多数据源连接mysql和hive

项目结构如下 mysql 执行如下建表语句&#xff0c;并插入一条测试数据 1 2 3 4 5 CREATE TABLE user ( id int(11) NOT NULL, name varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_ge…

Java实现网上药店系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 药品类型模块2.3 药品档案模块2.4 药品订单模块2.5 药品收藏模块2.6 药品资讯模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 药品表3.2.3 药品订单表3.2.4 药品收藏表3.2.5 药品留言表…