数据包伪造、替换、劫持,https劫持之探索和测试

news2024/7/6 17:54:48

(一)数据包替换攻击

该攻击过程如下:伪造服务器响应客户端的数据包。监听客户端的数据包,用预先伪造的数据包,伪装成服务器返回的数据发送给客户端。

因为攻击者跟目标在同一个局域网,所以攻击者发送的数据包肯定比服务器的响应数据要快很多,只要数据包构造正确,就一定可以被客户端按正常的数据处理。

这部分的重点和难点在于,要构造正确的数据包,需要根据攻击者的目的,修改数据包中的数据、MAC、IP、TCP(UDP)层的长度、校验值等多个字段的值,还要兼容多种网络协议,另外还需要高效的处理数据包。

这部分内容对于熟悉tcp/ip协议栈的程序员来讲非常容易,唯一需要注意的坑就是,udp和tcp封包中的checksum字段的计算,其格式不是简单的tcp和udp包头字节的crc校验,而是:

  1. 先将checksum字段清零
  2. 再将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开发。

各层封包的包头处理有很多细节需要注意。在实际场景中,抓到的数据包并不是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攻击的服务器。

在这里插入图片描述

(二)https劫持

https劫持有多种方式可以实现,比如dns劫持方式和数据包转发。

数据包转发方式较为复杂,各有各的实现方法。一般原理是:

  1. 在数据包监听处,有一链路层处理程序S,识别并修改ssl数据包,将目的mac和目的ip地址改为解析程序的mac和ip、并重新校验之后,从链路层发送。
  2. 解析程序在recv函数之后,会收到目的地址是自己的数据包,然后调用openssl接口,进入openssl接口处理部分,其返回结果是将https脱去后的明文数据。此时,解析程序可以当作中间人,将客户端数据发送给服务器的数据,从host取出真正的服务器地址,数据部分根据需要加工处理后发送给真正的服务器。对于服务器返回的数据,根据攻击者的目的,处理之后发送给真正的客户端。
  3. 最后,S需要将链路层监听到的、跟发送给解析程序相匹配的、返回数据包,在链路层修改原mac和ip地址,并重新校验之后,从链路层上放回原来的数据流中。

另一种方式较为简单,其过程如下:

  1. 预先获取客户端要访问的域名,对其进行dns数据包替换攻击,将客户端对域名M的访问,定向到特定的主机H上
  2. 客户端想要访问M域名时,由于伪造的dns数据包中返回的地址指向H,故此时客户端程序会误以为H就是M.
  3. 在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)劫持攻击等多种功能。

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

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

相关文章

算法27:最长公共子序列——样本模型(4)

目录 简介 题目&#xff1a; 思路&#xff1a; 递归版本&#xff1a; 根据递归 分析推导 动态规划版本&#xff1a; 简介 前面刷了几道题目&#xff0c;都是从暴力递归到递归动态规划的版本&#xff0c;最后演变成纯动态规划的版本。接下来的题目&#xff0c;将会跳过 递…

chatgpt赋能python:Python找出列表中出现最多的元素

Python找出列表中出现最多的元素 介绍 在Python的编程过程中&#xff0c;经常需要处理列表&#xff0c;而处理列表时最常见的问题之一就是如何找出列表中出现最多的元素。在某些情况下&#xff0c;我们可能需要确定列表中重复出现最多的元素&#xff0c;并将其提取出来。Pyth…

[机器学习]线性回归

准备入门一下机器学习算法。 今天学习了线性回归&#xff0c;都是理论的东西&#xff0c;没有对于代码的实现&#xff0c;代码也会跟着进度好好搞一下。 对于线性回归的基础概念&#xff0c;我感觉很依靠概率论和线性代数两门课&#xff0c;作为刚准备完数学一考研的我&#xf…

Systrace系列12 —— CPU Info 解读

本文主要是对 Systrace 中的 CPU 信息区域(Kernel)进行简单介绍,简单介绍了如何在 Systrace 中查看 Kernel 模块输出的 CPU 相关的信息,了解 CPU 频率、调度、锁频、锁核相关的信息。 CPU 区域图例 下面是高通骁龙 845 手机 Systrace 对应的 Kernel 中的 CPU Info 区域(底下…

人工智能轨道交通行业周刊-第46期(2023.5.22-5.28)

本期关键词&#xff1a;数字孪生、AI铁路人、道岔、施封锁、图像质量评价、大模型小型化 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道…

在VIVADO下烧写ZC706板载FLASH的操作步骤

1&#xff0c;原理图分析 首先看原理图&#xff0c;我们兼容ZC706的板子有两片 FLASH&#xff0c;型号是S25FL128A,连接方式如下&#xff1a; 可以看到两片是分别接在了XC7Z045芯片的引脚上&#xff0c;是互不相干的并联方式&#xff0c;每个FLASH芯片支持X4模式&#xff0c;也…

Systrace系列11 —— Triple Buffer 解读

本文主要是对 Systrace 中的 Triple Buffer 进行简单介绍,简单介绍了如何在 Systrace 中判断卡顿情况的发生,进行初步的定位和分析,以及介绍 Triple Buffer 的引入对性能的影响。 怎么定义掉帧? Systrace 中可以看到应用的掉帧情况,我们经常看到说主线程超过 16.6 ms 就会…

第一个Vue程序

什么是MVVM MVVM是Model-View-ViewModel的缩写&#xff0c;是一种软件架构模式&#xff0c;用于将用户界面&#xff08;UI&#xff09;的开发与业务逻辑和数据分离开来。 在MVVM架构中&#xff0c;Model代表数据模型层&#xff0c;View代表用户界面层&#xff0c;ViewModel充…

基于Java+控制台实现教材管理系统

基于Java控制台实现教材管理系统 一、系统介绍二、功能展示1.教材订购2.教材出售3.教材统计4.库存管理 四、其它1.其他系统实现2.获取源码 一、系统介绍 系统主要包括了教材订购、教材出售、教材统计、库存管理几大部分&#xff1b; 其中功能主要包括&#xff1a; 一、教材订购…

English Learning - L3 作业打卡 Lesson3 Day22 2023.5.26 周五

English Learning - L3 作业打卡 Lesson3 Day22 2023.5.26 周五 引言&#x1f349;句1: He would never pour salt on a wound, or make someone feel worse about something that was already a painful experience.成分划分弱读连读爆破语调 &#x1f349;句2: However, some…

字符串最后一个单词的长度

描述 计算字符串最后一个单词的长度&#xff0c;单词以空格隔开&#xff0c;字符串长度小于5000。&#xff08;注&#xff1a;字符串末尾不以空格为结尾&#xff09; 输入描述&#xff1a; 输入一行&#xff0c;代表要计算的字符串&#xff0c;非空&#xff0c;长度小于500…

JavaScript处理移动web交互

touch对象和touchevent touch事件 touch对象 每一次发生touch事件时就会产生一个touch对象&#xff0c;类似事件处理函数中的事件对象。 <div class" "><button class"child" style"height: 400px; width: 400px">我是按钮</b…

OneNote:隐藏OneNote笔记右边的作者和更新时间

OneNote在其他电脑登录后同步笔记&#xff0c;会在笔记右边显示用户名称和更新时间&#xff0c;消除方法如下&#xff1a; 在顶部找到历史记录&#xff0c;点击隐藏作者即可&#xff1a; 隐藏后效果&#xff1a; 说明&#xff1a; 1、用于window10系统。

Mybatis源码的理解

文章目录 0.核心的包1.1 配置文件mybatis-config.xml1.2 配置文件解析将配置文件转化为输入流,将 xml转化Configuration类.解析配置对应的标签为Configuration的属性Configuration的核心类的属性 1.3 解析完成查询之后的configurationenvironment类sqlFragments类mapperRegistr…

(转载)基于量子遗传算法的函数寻优算法

8.1 理论基础 8.1.1 量子遗传算法概述 量子遗传算法(quantum genetic algorithm,QGA)是量子计算与遗传算法相结合的产物&#xff0c;是一种新发展起来的概率进化算法。遗传算法是处理复杂优化问题的一种方法&#xff0c;其基本思想是模拟生物进化的优胜劣汰规则与染色体的交…

结构型设计模式02-代理模式

✨作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 代理模式 1、不使用代理模式 举例说明&#xff1a;小明喜欢一个女生&#xff08;小红&#xff09;&#xff0c;因为小红不认识小明…

【数据结构】初步了解排序

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 1.排序的概念及其运用 1.1排序的概念 2.常见排序算法的实现 2.1插入排序 2.2希尔排序 问题:gap是多少合适&#xff1f; 1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所…

App上架流程

准备 开发者账号完工的项目 上架步骤 一、创建App ID二、创建证书请求文件 &#xff08;CSR文件&#xff09;三、创建发布证书 &#xff08;CER&#xff09;四、创建Provisioning Profiles配置文件 &#xff08;PP文件&#xff09;五、在App Store创建应用六、打包上架 一、…

设置linux的时间

目录 一、什么是时间 &#xff08;1&#xff09;例子1 &#xff08;2&#xff09;例子2 二、什么是本地时间 三、linux设置本地时间的方法 &#xff08;1&#xff09;方式一&#xff1a;通过互联网自动同步 1.修改时间同步服务器 2.查看时间同步情况 &#xff08;2&…

自动化测试1

目录 1.什么是自动化测试 1.1自动化分类 1.1单元测试 1.2接口测试 1.3UI自动化测试 2.selenium 1.什么是selenium 2.selenium的特点 3.工作原理 3.seleniumJava 1.搭建 1.查看Chrome版本 2.下载Chrome浏览器驱动 3.配置,放到该目录下 2.验证是否搭建成功 1.什么是…