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

news2025/1/19 14:25:37

(一)数据包替换攻击

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

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

这部分的重点和难点在于,要构造正确的数据包,需要根据攻击者的目的,修改数据包中的数据、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攻击的服务器。

从wireshark可以清晰看到网卡发出的dns伪造数据包。
在这里插入图片描述

在这里插入图片描述

(二)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/575952.html

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

相关文章

无监督学习——k均值

文章目录 聚类k均值代码实现1. 引入依赖2. 数据加载3. 算法实现4. 测试 无监督学习重要的应用有两类&#xff1a;聚类、降维。 聚类&#xff1a; k均值 基于密度的聚类 最大期望聚类 降维&#xff1a; 潜语义分析&#xff08;LSA&#xff09; 主成分分析&#xff08;PCA&a…

AcWing算法提高课-1.3.11二维费用的背包问题

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 有 N N N 件物品和一个容量是 V V V 的背包&#xff0c;背包能承受的最大重量是 M M M。 每件物品只能用一次。体积是 v i v_…

【C++系列P3】‘类与对象‘-三部曲——[精讲](1/3)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 C系列 &#xff0c;热烈欢迎&#xff01; 【 类与对象-三部曲】的大纲主要内容如下&#xff1a; 如标题所示&#xff0c;本章是【 类与对象-三部曲】三章中的第一章节——基础知识章节&#xff0c;主要内容如下&#xff1a; 目录 一.…

apache-jmeter:点击可视化界面闪退和中文乱码Failed to write core dump

目录 1、点击界面闪退1.1、问题描述1.2、解决方法 2、处理返回结果乱码问题3、中文界面乱码3.1、问题描述3.2、解决方法 1、点击界面闪退 1.1、问题描述 Java运行环境 $ java -version java version "1.8.0_251" Java(TM) SE Runtime Environment (build 1.8.0_25…

学生成绩管理系统(C语言有结构体实现)

目录标 一、要实现的功能1.首次运行2. 成绩录入3. 显示录入的成绩4. 计算平均值5. 对平均分排序6. 查询学生成绩7. 清屏8. 显示帮助菜单9. 系统 二、实现代码&#xff08;一&#xff09;所有代码在一个文件&#xff08;v1&#xff09;&#xff08;二&#xff09;分文件编写&…

全志V3S嵌入式驱动开发(制作根文件系统)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 根文件系统是嵌入式开发很重要的一环。目前对于大多数soc来说&#xff0c;制作嵌入式系统就是配置buildroot文件。今天使用的buildroot版本是build…

一个字牛!腾讯大牛把《数据结构与算法》讲透了,带源码笔记

话不多说&#xff0c;直接先上图 经历过校招的人都知道&#xff0c;算法和数据结构都是不可避免的。 在笔试的时候&#xff0c;最主要的就是靠算法题。像拼多多、头条这种大公司&#xff0c;上来就来几道算法题&#xff0c;如果你没AC出来&#xff0c;面试机会都没有。 在面试…

上午在改BUG,下午就被通知优化了····

前段时间&#xff0c;爱奇艺被曝出大规模裁员的消息&#xff0c;裁员比例为20%-40%&#xff0c;对此&#xff0c;爱奇艺并未回应。有多位爱奇艺员工向深燃证实了裁员消息。“现在&#xff0c;空了好些工位。”一位爱奇艺员工表示。据他了解&#xff0c;仅爱奇艺文学&#xff0c…

21天学会C++:Day5----引用

CSDN的uu们&#xff0c;大家好。这里是C入门的第五讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 知识引入 2. 引用的特性 2.1 引用在定义时必须初始化 2.2 一个变量可以有多…

车间静电消除不掉?静电接地桩来帮忙!

静电接地桩的原理是通过将金属导体与地面相连&#xff0c;以便在设备运行时能够稳定地将静电荷自然地释放到地面中&#xff0c;从而保护人员和设备不受到静电的危害。 在工业生产中&#xff0c;静电容易在人体和物体表面积聚&#xff0c;如果不及时地排放处理会对人员和设备造…

【算法】简单讲解如何使用两个栈实现一个队列

文章目录 什么是栈和队列&#xff1f;设计思路代码实现 什么是栈和队列&#xff1f; 栈和队列其实大家基本都知道是什么&#xff0c;或者说&#xff0c;最基本的&#xff0c;他们的特性我们是知道的。 栈是一种FILO先进后出的数据结构&#xff0c;队列是一种FIFO先进先出的数据…

SRS流媒体服务器 ---- st-thread框架

1.使用st-thread 我们用一个简单的demo研究一下st框架。 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include "st.h"static void *_thread(void *arg) {printf("thread: %lu\n", pthread_self());return NULL; }i…

实例6.1 六度空间

“六度空间”理论又称作“六度分隔&#xff08;Six Degrees of Separation&#xff09;”理论。这个理论可以通俗地阐述为&#xff1a;“你和任何一个陌生人之间所间隔的人不会超过六个&#xff0c;也就是说&#xff0c;最多通过五个人你就能够认识任何一个陌生人。”如图1所示…

MySql MVCC 详解

注意以下操作都是以InnoDB引擎为操作基准。 一&#xff0c;前置知识准备 1&#xff0c;MVCC简介 MVCC 是多版本并发控制&#xff08;Multiversion Concurrency Control&#xff09;的缩写。它是一种数据库事务管理技术&#xff0c;用于解决并发访问数据库的问题。MVCC 通过创…

ROS学习——Gazebo中搭建模型并显示

一、打开gazebo搭建模型 gazebo 在gazebo界面左上角点击“Edit”——>"Building Editor"进入下图的模型搭建界面。可以自己利用左边的材料搭建模型。 点击墙壁之类的物品&#xff0c;右键&#xff0c;点击“Open Wall Inspector”按钮&#xff0c;就会出现可以调…

jmeter做接口压力测试_jmeter接口性能测试

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是免…

第11届蓝桥杯Scratch省赛真题集锦

编程题 第 1 题 问答题 对对碰 题目说明 编程实现 对对碰 两两相同的一共四张扣下的纸牌&#xff0c;每次先后翻开两张。如果两张一样就消失&#xff0c;如果两张不一样就重新扣下。当舞台上所有纸牌都消失&#xff0c;就过关了 .1)创建四个经牌角色&#xff0c;每张纸牌…

linuxOPS基础_Linux文件管理

Linux下文件命名规则 可以使用哪些字符&#xff1f; 理论上除了字符“/”之外&#xff0c;所有的字符都可以使用&#xff0c;但是要注意&#xff0c;在目录名或文件名中&#xff0c;不建议使用某些特殊字符&#xff0c;例如&#xff0c; <、>、&#xff1f;、* 等&…

表单重复提交:

1. 表单重复提交原因 当用户提交完请求&#xff0c;浏览器会记录最后一次请求的全部信息。用户按下功能键F5&#xff0c;就会发起浏览器记录的最后一次请求。如果最后一次请求为添加操作&#xff0c;那么此时刷新按钮就会再次提交数据&#xff0c;造成表单重复提交。 2. 表单…

Hive优化

Hive的本质是MapReduce&#xff0c;优化其实大部分是对mapreduce的优化 hive优化目标&#xff1a;①横向增加并发&#xff0c;②纵向减少依赖 //开启mapjoin&#xff0c;默认为 true • set hive.auto.convert.join true; //开启map端数据聚合 • hive.map.aggrtrue&…