路由攻击(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个…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...