数据包伪造替换、会话劫持、https劫持之探索和测试
(一)数据包替换攻击
该攻击过程如下:伪造服务器响应客户端的数据包。监听客户端的数据包,用预先伪造的数据包,伪装成服务器返回的数据发送给客户端。
因为攻击者跟目标在同一个局域网,所以攻击者发送的数据包肯定比服务器的响应数据要快很多,只要数据包构造正确,就一定可以被客户端按正常的数据处理。
这部分的重点和难点在于,要构造正确的数据包,需要根据攻击者的目的,修改数据包中的数据、MAC、IP、TCP(UDP)层的长度、校验值等多个字段的值,还要兼容多种网络协议,另外还需要高效的处理数据包。
这部分内容对于熟悉tcp/ip协议栈的程序员来讲非常容易,唯一需要注意的坑就是,udp和tcp封包中的checksum字段的计算,其格式不是简单的tcp和udp包头字节的crc校验,而是:
- 先将checksum字段清零
- 再将ip数据包中的 原ip(dword)、目的ip(dword)、包含tcp或者udp包头在内的数据长度值(short)、ip包中的协议字段(short)这4个字段加上tcp或者udp的包头加上数据部分之和(该长度还要2字节对齐,假如长度是奇数的话还要再补一个0)计算出来的校验和值。
- 将计算的校验值写入包头。
其结构体如下:
typedef struct
{unsigned char SrcIP[IPV6_IP_SIZE];unsigned char DstIP[IPV6_IP_SIZE];unsigned short Protocol;unsigned short PackLen;
}IPV6FAKEHEADER, *LPIPV6FAKEHEADER;
计算tcp和udp中校验和的代码大体如下所示:
WORD Checksum::checksum(WORD *buffer,int size)
{unsigned long cksum = 0;while(1<size){cksum += *buffer++;size -= sizeof(USHORT);}if(0<size)cksum += *(UCHAR*)buffer;cksum = (cksum>>16) + (cksum&0xffff);cksum += (cksum>>16);return(unsigned short)(~cksum);
}USHORT Checksum::subPackChecksum(char * lpCheckSumData,WORD wCheckSumSize,DWORD dwSrcIP,DWORD dwDstIP,unsigned int wProtocol)
{char szCheckSumBuf[MAX_SINGLE_PACKET_SIZE];LPCHECKSUMFAKEHEADER lpFakeHdr = (LPCHECKSUMFAKEHEADER)szCheckSumBuf;lpFakeHdr->dwSrcIP = dwSrcIP;lpFakeHdr->dwDstIP = dwDstIP;lpFakeHdr->Protocol = ntohs(wProtocol);lpFakeHdr->usLen = ntohs(wCheckSumSize);memcpy(szCheckSumBuf + sizeof(CHECKSUMFAKEHEADER),(char*)lpCheckSumData,wCheckSumSize);*(DWORD*)(szCheckSumBuf + sizeof(CHECKSUMFAKEHEADER) + wCheckSumSize) = 0;unsigned short nCheckSum = checksum((WORD*)szCheckSumBuf,wCheckSumSize + sizeof(CHECKSUMFAKEHEADER));return nCheckSum;
}
该模块基于winpcap开发。网络攻击的先决条件是能监听到目标的数据包,这是必须的前提条件。在Windows平台网络数据包开发包是winpcap,在linux上是libcap。
各层封包的包头处理有很多细节需要注意。在实际场景中,抓到的数据包并不是mac层,而是大多是pppoe或者wlan格式,其包头格式如下:
typedef struct {char version : 4;char type : 4;unsigned char code;unsigned short sessionid;unsigned short len;unsigned short protocol;
}PPPOEHEADER, *LPPPPOEHEADER;typedef struct
{unsigned char idhigh : 4;unsigned char canonical : 1;unsigned char priority : 3;unsigned char id : 8;unsigned short type;
}HEADER8021Q, *LPHEADER8021Q;
具体处理流程更多是包头协议格式的解析,在此按下不表。
本程序支持tcp和udp数据包的伪造、欺骗攻击,其代码主要位于ReplacePacket.cpp中。其中,dns劫持就是一种较为简单的数据包替换攻击,其代码位于 PacketProc.cpp中,要实现攻击需要了解dns数据包的格式,读者请自行百度。其主要数据结构如下:
typedef struct
{unsigned short TransactionID; //交易ID,发出和接收必须相同unsigned short Flags; //标志字段,发出和接收都应该修改该字段unsigned short Questions; //问题格式unsigned short AnswerRRS; //回答资源记录个数unsigned short AuthorityRRS; //认证资源记录个数unsigned short AdditionalRRS; //附加资源记录个数
}DNSHEADER,*LPDNSHEADER;//中间的要解析的名称以一个非可打印字符开头,以0结尾,后面紧跟着解析的类型要求,和CLASS要求
typedef struct
{unsigned short Name; //名称,低字节为从开头的偏移地址,只想要解析的内容unsigned short Type; //类型,0005为解析字符串,0001为解析IP地址unsigned short Class; //输入unsigned short HighTTL; //生存周期unsigned short LowTTL;unsigned short AddrLen; //解析的长度unsigned int Address; //解析的内容
}DNSANSWER,*LPDNSANSWER;typedef struct
{unsigned short Name; //名称,低字节为从开头的偏移地址,只想要解析的内容unsigned short Type; //类型,0005为解析字符串,0001为解析IP地址unsigned short Class; //输入unsigned short HighTTL; //生存周期unsigned short LowTTL;unsigned short AddrLen; //解析的长度unsigned char Address[16]; //解析的内容
}DNSANSWERIPV6, *LPDNSANSWERIPV6;typedef struct {unsigned short dnstype;unsigned short dnsclass;
}DNSTYPECLASS,*LPDNSTYPECLASS;typedef struct {unsigned short Name;unsigned short Type;unsigned short Class;unsigned int TTL;unsigned short AddrLen;
}DNSANSWERHEADER, *LPDNSANSWERHEADER;
如下以下视频中,当dns欺骗未开启时,在nslookup中查询到的www.baidu.com的IP地址是182.61.200.7,而当dns攻击开启时,www.baiducom的ip地址被替换为192.168.101.122,这个地址正好是本机的ip地址,本机上有一个服务器程序,监听443或者80端口的数据,这样就可以当作下一步https攻击的服务器。
从wireshark可以清晰看到网卡发出的dns伪造数据包。


(二)https劫持
https劫持有多种方式可以实现,比如dns劫持方式和数据包转发。
数据包转发方式较为复杂,各有各的实现方法。一般原理是:
- 在数据包监听处,有一链路层处理程序S,识别并修改ssl数据包,将目的mac和目的ip地址改为解析程序的mac和ip、并重新校验之后,从链路层发送。
- 解析程序在recv函数之后,会收到目的地址是自己的数据包,然后调用openssl接口,进入openssl接口处理部分,其返回结果是将https脱去后的明文数据。此时,解析程序可以当作中间人,将客户端数据发送给服务器的数据,从host取出真正的服务器地址,数据部分根据需要加工处理后发送给真正的服务器。对于服务器返回的数据,根据攻击者的目的,处理之后发送给真正的客户端。
- 最后,S需要将链路层监听到的、跟发送给解析程序相匹配的、返回数据包,在链路层修改原mac和ip地址,并重新校验之后,从链路层上放回原来的数据流中。
另一种方式较为简单,其过程如下:
- 预先获取客户端要访问的域名,对其进行dns数据包替换攻击,将客户端对域名M的访问,定向到特定的主机H上
- 客户端想要访问M域名时,由于伪造的dns数据包中返回的地址指向H,故此时客户端程序会误以为H就是M.
- 在H主机上有一特定程序,采用中间人方式,对客户端的数据访问伪装成服务器,将客户端数据再次转发给真正的服务器,对于服务务器返回的数据,再次转发给真正的客户端。
本程序采用第二种方法,主要的https中间人代码在sslEntry.cpp,sslProxyListener.cpp,sslProxy.cpp,makeCert.cpp,sslPublic.cpp等几个文件中,搬砖的工作暂且不表:)。
在https劫持中一个重要问题就是证书问题。这里采取的方式是,将生成次级证书的根证书导入到本机的根证书授信中心,接下来利用此证书签名的二级证书和三级证书在chrome和edge中的访问都是没问题的,但是firefox有单独的证书认证体系,windows等操作系统认可的证书、包括我们我们导入的证书不在其认可范围之内。
程序中实现了域名证书证书自动生成功能,可以根据客户端的clienthello数据包中的域名,动态生成域名证书。另外还支持自动检测和生成、导入根证书。
程序运行需要预先安装openssl。
在实际测试中,国内大厂包括阿里系,腾讯系的软件大都采用了https传输方式,但是也有极个别软件的服务器域名的ssl流量可以劫持成功,特别是某些Android移动端软件,ios端也发现过此种情况。当然,现在的趋势是验证机制越来越严格,难度越来越大。
本实例程序运行时,会将ssl数据存放在output目录下的ssl.dat文件中,如下截图所示,当未开启ssl攻击时,浏览器访问正常;当开启ssl劫持后,浏览器依然正常,此时ouput目录下的ssl.dat中存放着https中的明文数据。从host或者域名可以验证我们刚才点击访问的网址,证明ssl劫持成功。

本次测试的具体代码下载地址:点击下载
该项目具有tcp和udp数据包伪造替换、dns欺骗劫持、https中间人(mid in man)劫持攻击等多种功能。
相关文章:
数据包伪造替换、会话劫持、https劫持之探索和测试
(一)数据包替换攻击 该攻击过程如下:伪造服务器响应客户端的数据包。监听客户端的数据包,用预先伪造的数据包,伪装成服务器返回的数据发送给客户端。 因为攻击者跟目标在同一个局域网,所以攻击者发送的数…...
正则表达式集合
目录 一、校验数字的表达式 1. 数字 2. n位的数字 3. 至少n位的数字 4. m-n位的数字 5. 零和非零开头的数字 6. 非零开头的最多带两位小数的数字 7. 带1-2位小数的正数或负数 8. 正数、负数、和小数 9. 有两位小数的正实数 10. 有1~3位小数的正实数 11. 非零的正整…...
Django框架中models对象转换为json的方法
在django框架中输出api接口时一般都是输出json数据但是通过orm获取的数据库数据一般都是object所以需要转换成json数据,一般有一下3种情况 1.models对象使用“all()”时 from django.http import HttpResponse from django.core import serializers from TestMode…...
利用Servlet编写第一个“hello world“
利用Servlet编写第一个"hello world" 🔎创建 Maven 项目🔎引入依赖🔎创建目录🔎编写代码🔎打包代码🔎部署🔎程序验证🔎结尾 🔎创建 Maven 项目 Maven 是一个构…...
python 爬虫之js逆向爬虫详解
随着网站前端技术的不断发展,越来越多的网站采用JS进行渲染,并加上了一些反爬机制,导致传统的爬虫技术有些力不从心。本文将为大家介绍如何进行JS逆向爬虫,并且不少于1000字。 一、JS逆向爬虫的介绍 JS逆向是一种分析反爬机制的…...
SpringBoot:WebSocket实现消息撤回、图片撤回
下面只是讲述一下实现思路,代码基本没有哈!有时间单独发表一篇关于websocket的相关操作的博客。 1. 消息撤回、图片撤回 个人觉得关于撤回,需要下述几个过程: 发送的消息的标签上可以定义一个属性,这个属性的值应该是…...
输出指定日期区间内的所有天、周、月
部分方法需要依赖hutool工具包。 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.5.10</version> </dependency>需求:输出2023-04-17到2023-05-23期间所有的天、周、月。…...
【线性规划模型】
线性规划模型:原理介绍和预测应用 引言 线性规划是运筹学中一种重要的数学优化方法,被广泛应用于各个领域,包括工业、经济、物流等。 线性规划模型的原理 线性规划模型的目标是在一组线性约束条件下,寻找一组变量的最优解&…...
android 12.0卸载otg设备开机不加载otg设备
1.概述 在12.0定制化开发过程中,客户有功能需求,通过系统属性值控制是否加载挂载otg设备,当设置为卸载模式时,要求不能挂载otg设备,开机也不能挂载otg设备 2.卸载otg设备开机不加载otg设备的核心代码 frameworks/base/services/core/java/com/android/server/StorageMan…...
通过 Wacom 的 Project Mercury 提高远程办公效率
过去几年中,我们的工作方式发生了翻天覆地的变化。疫情加快了对远程办公和协作的采纳,导致人们更加依赖技术来联系团队和提高工作效率。 但是,那些依靠专门硬件和软件来完成工作的创作者呢?艺术家、设计师和开发人员需要使用专门…...
Linux-0.11 文件系统namei.c详解
Linux-0.11 文件系统namei.c详解 模块简介 namei.c是整个linux-0.11版本的内核中最长的函数,总长度为700行。其核心是namei函数,即根据文件路径寻找对应的i节点。 除此以外,该模块还包含一些创建目录,删除目录,创建目…...
计算机网络学习笔记
<!-- GFM-TOC --> 计算机网络体系结构 传输层:TCP和UDP 什么是三次握手? 什么是四次挥手? TCP如何实现流量控制? TCP的拥塞控制是怎么实现的? TCP如何最大利用带宽? TCP与UDP的区别 TCP如何保…...
Pod相关操作命令
Pod相关操作命令 Pod setup # CocoaPods 将信息下载到~/.cocoapods/repos 目录下。如果安装 CocoaPods 时不执行此命令,在初次执行pod intall 命令时,系统也会自动执行该指令 pod --version # 检查 CocoaPods 是否安装成功及其版本号 pod repo update #…...
图灵完备游戏:信号计数 解法记录
使用1个全加器 2个半加器完成。这关的思想主旨在于如何把输出4,输出2,输出1的情况统一在一根导线上。 首先用一个全加器来完成输入2-4这三个引脚的计数,因为全加器输出范围二进制是00 - 11,而输入正好有两个引脚数位是2和1&…...
数据结构图的基础概念
1、图的概念 图(Graph):是由顶点的有穷非空集合和顶点之间边的集合组成。顶点(Vertex):图中的数据元素。边(Edge):顶点之间的逻辑关系,边可以是有向的或无向的,也可以带有权重(可以表示距离,花费等…...
一场九年前的“出发”:奠基多模态,逐鹿大模型
原创:谭婧 全球AI大模型的技术路线,没有多少秘密,就那几条路线,一只手都数得过来。 而举世闻名的GPT-4浑身上下都是秘密。 这两件事并不矛盾。为什么呢? 这就好比,回答“如何制造一台光刻机?”。…...
什么是url跳转漏洞?
什么是url跳转漏洞 简介原因:如何防止 简介 URL跳转漏洞是一种Web应用程序安全问题,指的是在应用程序处理URL跳转时,由于程序员的疏忽或设计不当,攻击者可能通过构造恶意URL来实现对应用程序的攻击。 原因: 跳转条件…...
生物学经典blast比对算法,R语言和Python如何实现?
Blast比对算法原理与实现方式 做生物的同学肯定听说过blast比对这个方法,一般在NCBI等网站上可以在线进行比对,也可以在本地服务器进行比对,那么blast算法究竟是怎么实现对不同序列的比对呢? 本文分享经典blast算法的基础原理&…...
Android 开机动画支持mp4格式视频播放
前 言 Android系统在启动的过程中,最多可以出现三个画面,每一个画面都用来描述一个不同的启动阶段。无论是哪一个画面,它们都是在一个称为帧缓冲区(frame buffer,简称fb)的硬件设备上进行渲染的。 自定义…...
软考A计划-试题模拟含答案解析-卷十
点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
npm安装electron下载太慢,导致报错
npm安装electron下载太慢,导致报错 背景 想学习electron框架做个桌面应用,卡在了安装依赖(无语了)。。。一开始以为node版本或者npm版本太低问题,调整版本后还是报错。偶尔执行install命令后,可以开始下载…...
联邦学习带宽资源分配
带宽资源分配是指在网络中如何合理分配有限的带宽资源,以满足各个通信任务和用户的需求,尤其是在多用户共享带宽的情况下,如何确保各个设备或用户的通信需求得到高效且公平的满足。带宽是网络中的一个重要资源,通常指的是单位时间…...
