当前位置: 首页 > news >正文

路由攻击(ospf attack)及C/C++代码实现

开放式最短路径优先(OSPF)是应用最广泛的域内路由协议之一。不幸的是,它有许多严重的安全问题。OSPF上的伪造是可能导致路由循环和黑洞的最关键的漏洞之一。

大多数已知的OSPF攻击基于伪造攻击者控制的路由器的链路状态通告(LSA)。如果攻击者控制的路由器地理位置优越。然而,这些攻击只能伪造路由域的拓扑结构;因此它们的效果通常是有的。更多强大的攻击会影响其他未受控制的路由器的LSA攻击者。然而,这些攻击通常会引发“反击”受害者路由器的机制,该机制通告校正LSA攻击的影响是不持久的。

OSPF协议基础

从OSPF协议的概述开始。OSPF不使用TCP/IP传输协议,其消息直接封装在协议号为89的IP数据报。OSPF句柄其自身的错误检测和校正功能。

在这里插入图片描述
OSPF是一种链路状态路由协议,这意味着每个路由器通告其到相邻路由器和网络的链接。动态路由器通过执行Hello协议发现其邻居,其中每个路由器在本地网络上广播消息。一旦邻居发现路由器向他们通告其链接。这些通过是称为链路状态通告(LSA)。

一条重要信息在LSA中是每个链路的成本。链路的成本通常是静态的由网络管理员配置。LSA通过AS。一个路由器从它的一个邻居那里接收LSA,并将其重新发送给另一个邻居。通过这种方式,每个路由器都会编译一个包含AS。这个数据库在所有路由器中都是相同的。使用此数据库作为路由器获得AS拓扑的完整视图。这使得它可以使用Dijksatra算法计算其与每个其他通告网络或路由器。从这些路径,下一跳路由器为每个目的地派生。这形成了路由器的路由表。在这项工作中,我们提出了新的强大攻击,利用OSPF。这些袭击大大提高了艺术水平,并带来了新的阐明OSPF的安全弱点。所有攻击都利用设计RFC2328中定义的协议规范中的漏洞。

伪装LSA

根据RFC 2328 Sec.13.1,考虑LSA的两个实例相同,如果它们具有:

1) 相同的序列号,
2) 相同的校验和值
3) 大致相同的age(在15分钟的时间差内)。

即使LSA的实际内容不同,也是如此!攻击者可以通过向LSA发布相同的三个字段(序列、校验和和age)作为正在播发的有效LSA受害者路由器。这样做的好处是,即使受害者收到欺骗LSA由于LSA被伪装,因此不会触发反击被认为是与有效LSA相同的副本(同样,即使其内容非常不同),因此忽略它。

然而,AS中的所有其他路由器也会将虚假LSA视为重复,因此他们不会在LSA数据库中安装LSA。修复这样,攻击者将把LSA伪装成LSA的下一个有效实例受害者的起源。当攻击者发送伪装的LSA它触发受害者发起LSA的下一个有效实例。这个触发只是通过利用反击机制来完成的。也就是说攻击者向受害者发送虚假LSA,受害者通过发送LSA进行反击LSA的下一个有效实例。下图说明了


(1) 攻击开始于向R1自身发送一个伪造的R1 LSA。这将肯定会引发反击。让我们把这个数据包称为“触发器”。

(2) 同时,攻击者向R2发送R1的伪装LSA。这个伪装的LSA是具有相同序列的特制分组,校验和和age(+/-15分钟)作为R1的未来反击LSA。

(3) R1发送反击LSA。这将由R2接收,但具有与伪装的LSA相同的三个字段,R2会将反击视为其刚刚接收的LSA的相同副本。因此,它不会更新其LSA数据库并且它不会重新洪泛数据包。

(4) R2重新洪泛伪装的LSA。这将由R1接收,但具有与反击LSA相同的三个字段该LSA将被R1视为它刚刚发送的LSA的相同副本。因此,它不会更新其LSA数据库不会重新淹没数据包或引发另一次反击。在该分组序列之后,R1和R2在其LSA DB中具有两个不同的R1的LSA的副本。这种状态是持久的。路由器将再次仅在R1将在30之后通告其下一个LSA实例之后同步分钟(默认LSA间隔)

OSPF攻击序列


攻击从向受害者路由器发送Hello数据包开始。自从Hello在其邻居中包含受害者ID列表,受害者进入双向状态。受害者被假定为指定路由器(DR),因此它开始设置与幻影相邻,并进入ExStart状态。受害者然后发送具有他自己的序列y的DB描述(DBD)分组与受害者发送的所有数据包一样,攻击者没有接收到数据包因为它的目的地是受害者的虚幻路由器的伪造IP地址子网。

然后,攻击者发送其第一个DBD。数据包的定时不是重要的是,受害者每隔几次就会重新发送他的第一个DBD秒(默认为5秒)。攻击者的第一个DBD(实际上是phantom)设置Initialize(I)、More(M)和Master(MS)位,并将序列号设置为任意值(x)。由于数据包是这样制作的幻影的ID大于受害者的ID承认自己是奴隶,幻影成为主人。这意味着受害者采用幻影(x)的序列号,并发送他的下一个DBD只有在他从幻影中得到DBD之后。然后,攻击者继续重复发送DBD序列值。所有幻影的DBD都没有LSA,就好像幻影是空的。攻击者不断发送这些DBD,让受害者发送LSA数据库中的所有LSA。攻击者真的不知道怎么做然而,受害者需要发送许多DBD消息来发送其所有DB内容
他可以很容易地绑定这个数字(通常10个BDB就足够了)。

在这个界是N的例子。如果N是一个过冲,这并不重要;受害者会当他没有LSA要发送时,继续发送空的DBD。在攻击者(phantom)发送他的最后一个DBD(我们假设现在受害者也完成了发送自己的DB)受害者跳过加载状态因为幻影没有新的LSA,然后受害者进入完整状态。此时,受害者与幻影完全相邻,并更新相应地,其网络的网络LSA。

路由攻击(ospf attack)及C/C++代码实现

...
/* OSPF header format */
struct ospf_header {__u8	ospf_version;	/* Version Number		*/__u8	ospf_type;	/* Packet Type			*/__u16	ospf_len;	/* Packet Length		*/__u32	ospf_rid;	/* Router Identifier		*/__u32	ospf_aid;	/* Area Identifier		*/__u16	ospf_cksum;	/* Check Sum			*/__u16	ospf_authtype;	/* Authentication Type		*/__u64	ospf_auth; /* Authentication Field	*/
};/* OSPF Hello Packet */struct	ospf_hello {__u32	oh_netmask; /* Network Mask                */__u16	oh_hintv;   /* Hello Interval (seconds)    */__u8	oh_opts;    /* Options                     */__u8	oh_prio;    /* Sender's Router Priority	   */__u32	oh_rdintv;  /* Seconds Before Declare Dead */__u32	oh_drid;    /* Designated Router ID        */__u32	oh_brid;    /* Backup Designated Router ID */__u32	oh_neighbor; /* Living Neighbors           */
};#define	OSPF_HELLO_INTERVAL	0x0a00				/* 10 seconts defined */
#define	OSPF_HELLO_OPTIONS	0X12			/* Take default options from wireshark message */
#define	OSPF_HELLO_PRIORITY	1				/* Take default priority from wireshark message */
// #define	OSPF_HELLO_DEAD_INTERVAL	0X28000000		/* Take default dead interval from wireshark message *//* OSPF Database Description Packet */struct	ospf_dd {__u16	dd_mbz;		/* Must Be Zero			*/__u8	dd_opts;	/* Options			*/__u8	dd_control;	/* Control Bits	(DDC_* below)	*/__u32	dd_seq;		/* Sequence Number		*/
};#define DD_OPTIONS	0X52		/* Take default options from wireshark message */
#define	DDC_INIT	0x04		/* Initial Sequence		*/
#define	DDC_MORE	0x02		/* More to follow		*/
#define	DDC_MSTR	0x01		/* This Router is Master	*//* OSPF LSS */struct ospf_lls {__u32 data[3];
};/* Link State Update Packet Format */
struct	ospf_lsu {__u32 lsu_nads; /* # Advertisments This Packet */
};/* OSPF Link State Summary */struct	ospf_lss {__u16	lss_age;	/* Time (secs) Since Originated	*/__u8	lss_opts;	/* Options Supported		*/__u8	lss_type;	/* LST_* below			*/__u32	lss_lsid;	/* Link State Identifier	*/__u32	lss_rid;	/* Advertising Router Identifier*/__u32	lss_seq;	/* Link State Adv. Sequence #	*/__u16	lss_cksum;	/* Fletcher Checksum of LSA	*/__u16	lss_len;	/* Length of Advertisement	*/
};/* Network Links Advertisement */
struct	ospf_na {__u32 na_mask;	/* Network Mask			*/__u32 na_rid[2];	/* IDs of All Attached Routers	*/
};...
int ospf_write_header(unsigned char *buffer, char *local_ip, int ospf_len, unsigned char packet_type);
int ospf_write_hello(unsigned char *buffer, char *router_ip);
int ospf_write_lss_data_block(unsigned char *buffer);
int ospf_write_db_description(unsigned char* buffer, unsigned long sequence_number, __u8 control);
int ospf_write_ls_update(unsigned char *buffer, char *local_ip, char *router_ip, __u32 seq_number);
...
int attack_wait_ospf_packet(struct attack_env *env);
int attack_wait_for_db_description(struct attack_env *env);
void attack_sync_db_desc(struct attack_env *env);
int attack_send_db_description(struct attack_env *env, __u32 sequence_number, __u8 control);
int attack_wait_for_ls_update(struct attack_env *env);
...int create_socket(char *iface_name);
int send_packet(int sock_fd, unsigned char *dest_mac, unsigned char *buffer, int interface_index, int packet_size);
...
unsigned char *parse_mac_addr(char *mac_str);
int write_ipv4_ethernet_header(unsigned char *buffer, unsigned char *source_mac, unsigned char *dest_mac);
int write_ipv4_header(unsigned char *buffer, char *source_ip, char *dest_ip, int ip_data_len);
...
int main(int argc, char *argv[]) 
{if (argc != 5) {printf("Usage: route-attack INTERFACE_NAME INTERFACE_NUMBER LOCAL_MAC_ADDR LOCAL_IP_ADDR\n\n");exit(1);}...attack_establish_adjacency(&env);attack_send_keepalive(&env);return 0;
}

编译运行:

在这里插入图片描述
If you need the complete source code, please add the WeChat number (c17865354792)

ospf attack效果图:
在这里插入图片描述
攻击有几个注意事项:

1.必须通过发送Hello来持续保持相邻,每个RouterDeadInterval发送一条消息。默认情况下,此值为40秒。

2.在相邻设置之后,受害者将LSA洪泛到幻影并期望从其接收Ack。根据OSPF规范,如果相邻路由器不响应Ack,受害者只会无休止地重复发送LSA。尽管如此,我们观察到思科路由器在125秒后放弃,然后撕裂沿着邻接处往下走。最后一条警告意味着,对于思科路由器,应该重新启动攻击每125秒一次。但是,需要注意的是,如果攻击者受害者路由器位于同一区域,攻击者原则上知道每个LSA受害者洪水泛滥。这意味着它可以欺骗Ack消息以及(它具有超过120秒的时间窗口以Ack进行响应)。

总结

不同类型的攻击都利用了OSPF漏洞,尽管它在过去二十年中被广泛使用。我们已经深入分析了LSA伪造,这是近年来威胁OSPF协议的最严重的攻击之一。

Welcome to follow WeChat official account【程序猿编码

参考:RFC 2328

相关文章:

路由攻击(ospf attack)及C/C++代码实现

开放式最短路径优先(OSPF)是应用最广泛的域内路由协议之一。不幸的是,它有许多严重的安全问题。OSPF上的伪造是可能导致路由循环和黑洞的最关键的漏洞之一。 大多数已知的OSPF攻击基于伪造攻击者控制的路由器的链路状态通告(LSA&…...

nginx配置站点强制开启https

当站点域名配置完SSL证书后,如果要强制开启HTTPS,可以在站点配置文件中加上: #HTTP_TO_HTTPS_START if ($server_port !~ 443){rewrite ^(/.*)$ https://$host$1 permanent; } #HTTP_TO_HTTPS_END 附上完整的配置完SSL证书,强制…...

Jacoco XML 解析

1 XML解析器对比 1. DOM解析器: ○ 优点:易于使用,提供完整的文档树,可以方便地修改和遍历XML文档。 ○ 缺点:对大型文档消耗内存较多,加载整个文档可能会变慢。 ○ 适用场景:适合小型XML文档…...

【面试题】JDK(工具包)、JRE(运行环境和基础库)、JVM(java虚拟机)之间的关系?

【面试题】JDK、JRE、JVM之间的关系? JDK(Java Development Kit):Java开发工具包,提供给Java程序员使用,包含了JRE,同时还包含了编译器javac与自带的调试工具Jconsole、jstack等。 JRE(Java Runtime Environment):Java运行时环境&…...

软件设计师学习笔记7-输入输出技术+总线+可靠性+性能指标

目录 1.输入输出技术 1.1数据传输控制方式 1.2中断处理过程 2.总线 3.可靠性 3.1可靠性指标 3.2串联系统与并联系统 3.3混合模型 4.性能指标 1.输入输出技术 即CPU控制主存与外设交互的过程 1.1数据传输控制方式 (1)程序控制(查询)方式&…...

Windows下MATLAB调用Python函数操作说明

MATLAB与Python版本的兼容 具体可参看MATLAB与Python版本的兼容 操作说明 操作说明请参看下面两个链接: 操作指南 简单说明: 我安装的是MATLAB2022a和Python3.8.6(安装时请勾选所有可以勾选的,包括路径)。对应版本安…...

【android12-linux-5.1】【ST芯片】驱动与HAL移植后数据方向异常

ST的传感器驱动与HAL一直成功后,能拿到数据了,但是设备是横屏,系统默认是竖屏。就会出现屏幕自动转动时方向是错的的情况,设备横立展示的是竖屏,设备竖立展示的是横屏。 这个是PCB上设计的传感器贴片方向和横屏不一致…...

JavaScript Es6_3笔记

JavaScript 进阶 文章目录 JavaScript 进阶编程思想面向过程面向对象 构造函数原型对象constructor 属性对象原型原型继承原型链 了解构造函数原型对象的语法特征,掌握 JavaScript 中面向对象编程的实现方式,基于面向对象编程思想实现 DOM 操作的封装。 …...

Qt产生随机数

Qt产生随机数 提问:注意:实现: 提问: 有没有小伙伴遇到这么一种情况,使用rand()和qrand()函数生成的随机数好像不是那么随机,每次都一样。那这种就叫做“伪随机”,因为没有种随机数种子&#x…...

postgresql常用函数-数学函数

postgresql常用函数 简介数学函数算术运算符绝对值取整函数乘方与开方指数与对数整数商和余数弧度与角度常量 π符号函数生成随机数 简介 函数(function)是一些预定义好的代码模块,可以将输入进行计算和处理,最终输出一个 结果值…...

【排序】快速排序(前后指针法)—— 考的最少的一种算法

以从小到大的顺序进行说明。 前后指针法 是指对于一个数组,定义前后各一个指针(prev 和 cur) prev用于卡一个比基准值大的值进行交换cur用于向前遍历出比基准值小的,和prev进行交换 图解 初始化 选出基准值4 如果cur 所在的值…...

软考:中级软件设计师:关系代数:中级软件设计师:关系代数,规范化理论函数依赖,它的价值和用途,键,范式,模式分解

软考:中级软件设计师:关系代数 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 &…...

openCV实战-系列教程2:阈值与平滑处理(图像阈值/图像平滑处理/高斯/中值滤波)、源码解读

1、图像阈值 t图像阈值函数,就是需要判断一下像素值大于一个数应该怎么处理,小于一个数应该怎么处理 ret, dst cv2.threshold(src, thresh, maxval, type) 参数解析: src: 原始输入图,只能输入单通道图像&#…...

C语言第五章-循环结构练习

1、设计一个小型模拟彩票中奖机,已知彩票中奖号码是一个固定的3位数(原始号码)。对任意一个3位数,取出它的每位数字和原始号码的每位数字比较,有1位数相同中三等奖,有2位数相同中二等奖,有3位数…...

Echarts面积图2.0(范围绘制)

代码: // 以下代码可以直接粘贴在echarts官网的示例上 // 范围值 let normalValue {type: 内部绘制,minValue: 200,maxValue: 750 } // 原本的绘图数据 let seriesData [820, 932, 901, 934, 1290, 1330, 1320] let minData Array.from({length: seriesData.len…...

flink checkpoint时exact-one模式和atleastone模式的区别

背景: flink在开启checkpoint的时候有两种模式可以选择,exact-one和atleastone模式,那么这两种模式有什么区别呢? exact-one和atleastone模式的区别 先说结论:exact-one可以完全做到状态的一致性,而atle…...

QEMU 仿真RISC-V freeRTOS 程序

1. 安裝RISC-V 仿真環境 --QEMU 安裝包下載地址: https://www.qemu.org/ 安裝命令及安裝成功效果如下所示, target-list 設定爲riscv32-softmmu, $ cat ~/project/qemu-8.0.4/install.sh sudo apt-get install libglib2.0-dev sudo apt-get install libpixman-1-dev ./co…...

用大白话来讲讲多线程的知识架构

感觉多线程的知识又多又杂,自从接触java,就在一遍一遍捋脉络和深入学习。现在将这次的学习成果展示如下。 什么是多线程? 操作系统运行一个程序,就是一个线程。同时运行多个程序,就是多线程。即在同一时间&#xff0…...

【uniapp】微信小程序 , 海报轮播图弹窗,点击海报保存到本地,长按海报图片分享,收藏或保存

uivew 2.0 uniapp 海报画板 DCloud 插件市场 第一步&#xff0c;下载插件并导入HbuilderX 第二步&#xff0c;文件内 引入 海报组件 <template><painter ref"haibaorefs"></painter> <template> <script>import painter from /comp…...

SpringBoot与前端交互遇到的一些问题

一、XXX.jar中没有主清单属性 场景&#xff1a; SpringBoot打的jar包在Linux运行报错 解决方案&#xff1a; 百度找了很多都是一样的答案&#xff0c;但是解决不了我的问题&#xff0c;于是我新建了一个springboot项目发现打的jar包可以在Linux上运行。检查了下只要把下面这2个…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...