流量嗅探详解

 

 

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

 

 

 

 

 

 

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查看数据包

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2.13作业

21.c 22.b 23.b 假设,入:12345,出:54132.要出5,必须12345按顺序入,然后出5,依次出4321,想要在4之后出1是不可能实现的。 24.b10,c11,d100 25.3 ,2 …

leetcode:45.跳跃游戏二

1.解题思路: 用最少的步数增加覆盖范围,直至覆盖到终点。 2. 代码实现: 如果数组长度为1,返回0 初始化cur,next,result为0 for循环遍历数组,使得next指向下一步能够覆盖的最远距离&#x…

人力资源智能化管理项目(day07:员工详情)

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/humanResourceIntelligentManagementProject 页面结构和路由 <template><div class"dashboard-container"><div class"app-container"><div class"edit-form">…

数学实验第三版(主编:李继成 赵小艳)课后练习答案(九)(3)

实验九&#xff1a;线性函数极值求解 练习三 1.设有三种证券 期望收益率分别为10%,15%和40%,风险分别是10%,5%和20%,假定投资总风险用最大一种投资股票的风险来度量,且同期银行存款利率为 5%,无风险,为投资者建议一种投资策略(投资比例),使其尽可能获得最大收益. clc;clear;…

【数据结构】链表OJ面试题4《返回链表入环的第一个结点》(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 后三题在这http://t.csdnimg.cn/gbohQ 给定一个链表&#xff0c;判断链表中是否有环。http://t.csdnimg.cn/Rcdyc 记录每天的刷题&#xff0c;继续坚持&#xff01; 2.OJ题目训练 10. 给定一个链表&#xff0c;返回链表开始…

【Tauri】(3):使用Tauri1.5版本,进行桌面应用开发,在windows上搭建环境,安装node,rust环境,可以打包成功,使用vite创建应用

1&#xff0c;视频地址&#xff1a; https://www.bilibili.com/video/BV1Ny421a7nA/ 【Tauri】&#xff08;3&#xff09;&#xff1a;使用Tauri1.5版本&#xff0c;进行桌面应用开发&#xff0c;在windows上搭建环境&#xff0c;安装node&#xff0c;rust环境&#xff0c;可以…

9.【CPP】List (迭代器的模拟实现||list迭代器失效||list的模拟实现)

介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。list与forward_…

文件压缩炸弹,想到有点后怕

今天了解到一个概念&#xff0c;压缩炸弹。 参考&#xff1a; https://juejin.cn/post/7289667869557178404 https://www.zhihu.com/zvideo/1329374649210302464 什么是压缩炸弹 压缩炸弹&#xff08;也称为压缩文件炸弹、炸弹文件&#xff09;是一种特殊的文件&#xff0c;它…

年假作业10

一、选择题 BBDBACCCAD 二、填空题 1,4,13,40 3715 358 5 2 6 1 5 4 8 2 0 2 三、编程题 1、 #include <iostream> #include<array> #include <limits> using namespace std; int main() {array<int,10> score;array<int,10>::iterat…

黑马程序员——移动Web——day01

目录&#xff1a; 平面转换 简介平移定位居中案例-双开门旋转转换原点案例-时钟多重转换缩放案例-播放特效倾斜渐变 线性渐变案例-产品展示径向渐变综合案例 导航-频道渐变按钮轮播图猜你喜欢 1.平面转换 简介 作用&#xff1a;为元素添加动态效果&#xff0c;一般与过渡配…

鸿蒙开发系列教程(十七)--路由Router

页面路由指在应用程序中实现不同页面之间的跳转和数据传递 1、页面跳转 跳转模式 router.pushUrl()&#xff1a;目标页不会替换当前页&#xff0c;而是压入页面栈。这样可以保留当前页的状态&#xff0c;并且可以通过返回键或者调用[router.back()]方法返回到当前页。router…

MATLAB|【免费】高比例可再生能源电力系统的调峰成本量化与分摊模型

目录 主要内容 部分代码 结果一览 下载链接 主要内容 程序复现文献《高比例可再生能源电力系统的调峰成本量化与分摊模型》&#xff0c;从净负荷波动的角度出发&#xff0c;建立了调峰成本的量化与分摊模型&#xff0c;构造了无调峰需求的替代场景&#xff0c;将…

Vulnhub靶机:DC4

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;DC4&#xff08;10.0.2.57&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/dc-4,313/…

勒索DASH币CrySiS最新变种的同源分析

前言 CrySiS勒索病毒&#xff0c;又称为Dharma勒索病毒&#xff0c;首次出现于2016年&#xff0c;2017年5月此勒索病毒万能密钥被公布之后&#xff0c;导致此勒索病毒曾消失过一段时间&#xff0c;不过随后该勒索病毒就开发了它的最新的一款变种样本&#xff0c;并于2018年开始…

Linux中signal/kill/raise/abort函数(信号函数)

signal函数&#xff1a; 函数作用&#xff1a;注册信号捕捉函数 函数原型&#xff1a; typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 函数参数&#xff1a; signum:信号编号handler:信号处理函数 测试&#xff1a;给没有读…

669. 修剪二叉搜索树

给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff0c;如果没有被移除&#xff0c;原有的父代子代关系都应当保留)。…

【小记】MacOS Install golang

问题 - command not found: go ➜ brew install golang ➜ go version go version go1.21.7 darwin/arm64写在最后&#xff1a;若本文章对您有帮助&#xff0c;请点个赞啦 ٩(๑•̀ω•́๑)۶

【Linux】基础命令 第二篇

目录 echo 输出重定向:(本质都是写入) 输入重定向cat more 指令 && less指令 head && tail && 管道初步使用 grep&#xff1a;行文本过滤工具&#xff08;文本按行搜索&#xff09; date&#xff1a;获取时间 date 命令用于 显示 或 设置系统的…

政安晨:在Jupyter中【示例演绎】Matplotlib的官方指南(四){Artist tutorial}·{Python语言}

第一次看到我的演绎文章的小伙伴&#xff0c;如果需要&#xff0c;可以先看一下我这篇文章的前三篇&#xff0c;包括准备环境等等&#xff1a; 政安晨&#xff1a;在Jupyter中【示例演绎】Matplotlib的官方指南&#xff08;一&#xff09;{Pyplot tutorial}https://blog.csdn.…

c++Qt网络操作

1、基础概念 1.1 TCP/UDP TCP 是一种面向连接的传输层协议&#xff0c;它能提供高可靠性通信(即数据无误、数据无丢失、 数据无失序、数据无重复到达的通信) 适用情况&#xff1a; 1.SN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议 2、适合于对传输质量要求较…