路由攻击(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,就在一遍一遍捋脉络和深入学习。现在将这次的学习成果展示如下。 什么是多线程? 操作系统运行一个程序,就是一个线程。同时运行多个程序,就是多线程。即在同一时间࿰…...
【uniapp】微信小程序 , 海报轮播图弹窗,点击海报保存到本地,长按海报图片分享,收藏或保存
uivew 2.0 uniapp 海报画板 DCloud 插件市场 第一步,下载插件并导入HbuilderX 第二步,文件内 引入 海报组件 <template><painter ref"haibaorefs"></painter> <template> <script>import painter from /comp…...
SpringBoot与前端交互遇到的一些问题
一、XXX.jar中没有主清单属性 场景: SpringBoot打的jar包在Linux运行报错 解决方案: 百度找了很多都是一样的答案,但是解决不了我的问题,于是我新建了一个springboot项目发现打的jar包可以在Linux上运行。检查了下只要把下面这2个…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
