arp欺骗原理以及实现方式

news2024/11/14 12:11:02

我们知道了arp的作用,那么此时我们怎么可以用他来进行攻击呢?在一个局域网中,我们怎么实现呢?

原理:

这样B就可以做到中间人了,可以接受到两个主机的数据了。换句话来说,在同一个局域网内,我们要黑掉一个主机,只需要构建大量的arp应答,把自己的mac地址发送给要黑掉的主机,这样他发送的所有数据都会经过你的主机,如果你不管,也不转发,那么,恭喜你,成功让他的主机无法上网了。但是其实现在就算是黑掉也没什么用,因为https中经过加密,还有认证,一改数据就会被发现。所以没有什么意义。但是你可以黑掉同一个局域网中的另一台主机,让他无法上网。

说来说去,原理我知道了,但是我们应该怎么实现呢?此时我们就要回忆一下套接字类型了,有三种。流式套接字,数据报套接字,原始套接字。流式套接字对应的是tcp,数据包套接字是udp,那么答案已经出来了吧,不错,我们可以用原始套接字来实现伪造arp数据包。那么怎么实现呢?代码如下:

#include <iostream>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ether.h>
#include <cstring>
#include <unistd.h>
#define BUF_SIZE 1024
#define DST_SIZE 7
#define SRC_SIZE 7
int main()
{
    int sockfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ARP));
    if (sockfd < 0)
    {
        std::cout << "socket fail" << std::endl;
        exit(1);
    }
    unsigned char buffer[1024];
    memset(buffer, 0, 1024);
    while (true)
    {
        ssize_t s = recvfrom(sockfd, buffer, 1024, 0, nullptr, nullptr);
        if (s < 0)
        {
            std::cout << "recvfrom fail" << std::endl;
            exit(2);
        }
        // 以太网数据包头
        std::cout << "以太网数据包报头" << std::endl;
        unsigned short type = 0;
        unsigned char dst[DST_SIZE] = "";
        unsigned char src[SRC_SIZE] = "";
        type = ntohs(*(unsigned short *)(buffer + 12));
        for (size_t i = 0; i < 6; i++)
            dst[i] = buffer[i];
        for (size_t i = 6; i < 12; i++)
            src[i - 6] = buffer[i];
        printf("目的mac:%x%x%x%x%x%x", dst[0], dst[1], dst[2], dst[3], dst[4], dst[5]);
        printf("源mac:%x%x%x%x%x%x", src[0], src[1], src[2], src[3], src[4], src[5]);
        printf("类型:%x", type);
        std::cout << std::endl;
        // arp协议数据报头
        std::cout << "arp数据包报头" << std::endl;
        // 硬件类型
        unsigned short hardware;
        // 协议类型
        unsigned short pro;
        // 硬件地址长度
        unsigned char hardware_len;
        // 协议长度
        unsigned char pro_len;
        // op
        unsigned short op;
        // 发送方mac地址
        unsigned char src_mac[7] = "\0";
        // 发送方ip地址
        std::string src_ip;
        // 目的mac地址
        unsigned char dst_mac[7] = "\0";
        // 目的ip地址
        std::string dst_ip;
        ///
        hardware = ntohs(*(unsigned short *)(buffer + 14));

        pro = ntohs(*(unsigned short *)(buffer + 16));

        hardware_len = buffer[18];

        pro_len = buffer[19];

        op = ntohs(*(unsigned short *)(buffer + 20));

        for (size_t i = 22; i < 28; i++)
            src_mac[i - 22] = buffer[i];

        src_ip = inet_ntoa(*(in_addr *)(buffer + 28));

        for (size_t i = 32; i < 38; i++)
            dst_mac[i - 32] = buffer[i];

        dst_ip = inet_ntoa(*(in_addr *)(buffer + 38));
        /
        printf("硬件类型:%x ", hardware);
        printf("协议类型:%x ", pro);
        printf("硬件长度:%x ", hardware_len);
        printf("协议长度:%x ", pro_len);
        printf("op:%x ", op);
        printf("源mac:%x%x%x%x%x%x ", src_mac[0], src_mac[1], src_mac[2], src_mac[3], src_mac[4], src_mac[5]);
        std::cout << "源ip" << src_ip << " ";
        printf("目的mac:%x%x%x%x%x%x ", dst_mac[0], dst_mac[1], dst_mac[2], dst_mac[3], dst_mac[4], dst_mac[5]);
        std::cout << "目的ip" << dst_ip << " ";
        std::cout << std::endl;
    }
    // 完成之后关闭文件
    close(sockfd);
    return 0;
}

以上是我实现的一个类似于抓包工具(不是抓包工具,就是类似于)。他可以获取我们局域网中的所有数据包。并且可以解析。这个代码只有读取,没有发送,因为我用的是云服务器,这个云服务器所在局域网不是我所在的(害怕弄出麻烦来)。所以我就只进行了读取,但是如果你想测试的话,可以试试,用sendto就可以,但是在用sendto时,我们有几个地方与udp中使用的不一样,这个我就不在这里详细说了,想知道的小伙伴可以私信问或是上网查查。那么此时我们应该怎么用呢?测试如下:

我开了两个端口,一个是用来删除arp缓存中的默认网关的地址的,一个来运行。我们可以清楚的看见,这个我删除了之后,有一个arp的应答,所以我们可以得知,在这之前,肯定有一个请求。

所以这里也证明了网络中是有Arp请求和应答的,你可以等一会,你会看见另一个arp请求,这个就证明了他是有时间限制的。(时间可能有点长)

最后最后,小伙伴们千万不要胡乱试,这个如果出了差错的话,额......不过可以在虚拟机上进行试试。最后,如果大家看完本章内容有所收获的话,希望点一下赞吧!谢谢!!

如果有小伙伴对网络的数据包怎么发送与接收不清楚的,也不要太着急,下一次会发整个网络中的数据包是怎么发和怎么收的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM 详解(JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路)

目录 JVM 详解&#xff08;JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路&#xff09;1、概念&#xff1a;什么是 JVM ?JVM 的作用&#xff1f; 2、JVM 的主要组成部分&#xff1f;类加载器&#xff08;Class Loader&#xff09;&#xff1a;简单…

坚鹏:美国智库认为中国在70%战略产业里领先,美国正迅速衰落

【重榜】2023年12月13日&#xff0c;美国智库信息技术与创新基金会&#xff08;ITIF&#xff09;发布重榜报告&#xff0c;认为中国在70%战略产业里领先&#xff0c;美国正迅速衰落。美国智库ITIF认为在计算机和电子产品、化工品、机器设备、机动车、基本金属、金属制品、电气设…

linux 网络子系统 摘要

当你输入一个网址并按下回车键的时候&#xff0c;首先&#xff0c;应用层协议对该请求包做了格式定义;紧接着传输层协议加上了双方的端口号&#xff0c;确认了双方通信的应用程序;然后网络协议加上了双方的IP地址&#xff0c;确认了双方的网络位置;最后链路层协议加上了双方的M…

精细化工ERP系统是什么?精细化工ERP软件包含哪些模块

化工是比较特殊的行业&#xff0c;日常的生产经营活动比较繁杂&#xff0c;传统的手工管理模式逐渐不能满足现代化工管理需求。进入信息化时代&#xff0c;如何顺应现代化工市场发展&#xff0c;是摆在很多化工企业面前的难题。 随着行业竞争愈加激烈&#xff0c;各种成本的上…

Word写大论文常见问题(持续更新)

脚注横线未定格 解决方案&#xff1a;“视图”-“草图”&#xff0c;“引用”-“显示备注”-选择“脚注分隔符”&#xff0c;把横线前的空格删掉。

基于Java SSM框架实现抗疫医疗用品销售系统项目【项目源码+论文说明】

基于java的SSM框架实现抗疫医疗用品销售系统演示 摘要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;抗疫医疗用品销售平台当然也不能排除在外。抗疫医疗用品销售平台是以实…

亿欧网首届“元创·灵镜”科技艺术节精彩纷呈,实在智能AI Agent智能体展现硬核科技图景

12月4日-10日&#xff0c;持续一周的首届“元创灵镜”科技艺术节在海南陵水香水湾拉开帷幕&#xff0c;虚实交互创造出的“海岛之镜”开幕式呈现出既真实又虚幻的未来感&#xff0c;融入前沿科技元素的艺术装置作品在“虚实之镜&自然生长”科技艺术展诠释着浪漫想象&#x…

爬虫chrome浏览器抓包说明

chrome浏览器抓包说明 目标&#xff1a;掌握chrome在爬虫中的使用 1. 新建隐身窗口&#xff08;无痕窗口&#xff09; 作用&#xff1a;在打开无痕窗口的时候&#xff0c;第一次请求某个网站是没有携带cookie的&#xff0c;和代码请求一个网站一样&#xff0c;这样就能够尽可…

jpa 修改信息拦截

实现目标springbootJPA 哪个人&#xff0c;修改了哪个表的哪个字段&#xff0c;从什么值修改成什么值 Component // 必须加 Slf4j Configurable(autowire Autowire.BY_TYPE) public class AuditingEntityListener {// 线程变量&#xff0c;保存修改前的 objectprivate Thre…

PyVMomi 克隆虚拟机时将磁盘改为Thin模式

需求介绍&#xff1a; 之前已经使用pyvmomi库实现了虚拟机的自动备份&#xff0c;不过由于备份的虚拟机都是较为重要的系统&#xff0c;磁盘都是厚置备模式&#xff0c;终于有一天&#xff0c;备份目标的空间不够了&#xff0c;导致几个虚拟机无法备份。在不想增加磁盘的情况下…

Linux16 ftp文件服务区、vsftpd文件系统服务安装、lftp客户端安装、NFS远程共享存储

目录 一、FTP基础ftp主动模式ftp被动模式 二、vsftpd配置共享目录编辑配置文件使用windows 访问 三、客户端安装 &#xff08;lftp&#xff09;匿名用户的一些操作&#xff08;lftp {ip}&#xff09;ftp配置本地用户登录配置本地用户ftp配置文件 lftp操作 NFS远程共享存储安装n…

Leetcode—380.O(1) 时间插入、删除和获取随机元素【中等】

2023每日刷题&#xff08;五十七&#xff09; Leetcode—380.O(1) 时间插入、删除和获取随机元素 算法思想 实现代码 class RandomizedSet { public:vector<int> nums;unordered_map<int, int> dict;RandomizedSet() {srand((unsigned)time(NULL));}bool insert(…

如何为您的项目选择最优化的 RTLS系统方案

到 2030 年&#xff0c;实时定位市场预计将是当今市场规模的 10 倍&#xff1b;各种全球宏观经济趋势加剧了 RTLS 的指数增长&#xff0c;其中包括&#xff1a; 企业投资回报率的压力增加&#xff0c;从而扩大了对数字化、简化数据和分析的需求&#xff0c;尤其是在 COVID-19 之…

PS扣印章

1 印章区域图片 2 3 吸取印章上的颜色&#xff0c;调节容差&#xff0c;尽量小一点&#xff0c;过大会将背景也进来 4 CtrlJ 把选区复制出来&#xff0c;这个印章图层比较淡&#xff0c;可以通过多复制几个叠加或通过叠加模式来调节。 5 对几个图层选中后CtrlE合并图层 6 选…

Linux查询指定时间点段日志Linux查询指定文件

Linux服务器高效查询日志查询文件 Ⅰ、常用几种日志查询语法Ⅱ、常用几种查询语法 Ⅰ、常用几种日志查询语法 #查询某日志前xx行日志 head -n 行数 日志文件名 #查询某日志后xx行日志 tail -n 行数 日志文件名 #查询固定时间点日志&#xff08;前提是这个时间点确实有日志输出…

观测云产品更新 | 智能监控、数据访问、指标分析等优化

观测云更新 监控 > 智能监控 1、新增「智能监控」&#xff0c;您只需要在检测规则中设置好检测范围和通知对象即可快速开启监控。支持「主机监控」、「日志监控」、「应用监控」&#xff0c;每个监控包含的检测项如下&#xff1a; 智能监控器检测项主机监控CPU的突增/突降…

PyQt6 一个简单的例子

PyQt6简单例子 需求代码目录代码实现代码运行效果 需求 1、通过PyQt6实现一个小的应用程序&#xff0c;并设置应用程序的图标&#xff0c;应用程序的标题&#xff0c;然后再提示一个气泡框&#xff0c;不过显示一会就会消失不见。 代码目录 在PyQt文件夹下新建一个包&#x…

绿萝送温暖,扫雪助出行

今冬的大雪如约而至&#xff0c;给居民的出行带来诸多不便&#xff0c;为保障居民安全出行&#xff0c;绿萝志愿服务队第一时间召集志愿者参与扫雪铲冰工作。2023年12月13日&#xff0c;志愿者在房山城关街道青年北路园林所门口、星城生活区等地进行了志愿扫雪活动。 大雪把街道…

三星挑战台积电霸主地位,2nm订单争夺战硝烟四起

根据Trendforce报道&#xff0c;台积电依然在代工行业拥有绝对的领导地位。台积电和三星都计划在2025年开始生产2nm工艺&#xff0c;引发了相关订单的早期争夺战。 扩展阅读&#xff1a;华山论剑&#xff1a;2nm芯片工艺谁更强&#xff1f; 据英国《金融时报》报道&#xff0c…