使用 Socks5 来劫持 HTTPS(TCP-TLS) 之旅

MITM 劫持的过程中,HTTP 协议并不是唯一选择。

实际在 MITM 使用过程中,BurpSuite 和 Yakit 提供的交互式劫持工具只能劫持 HTTP 代理的 TLS 流量;但是这样是不够的,有时候我们并不能确保 HTTP 代理一定生效,或者说特定的后端只支持 TCP 传输层代理(Socks5)代理,那么交互式劫持将失效,也没有办法获取到基于 Socks5 代理的 HTTP 通信。

因此我们做了一些简单的验证,去实现了基于 Socks5 协议的代理劫持,同时我们以一种更加简单高效的方式让 Socks5 的代理适配了传统的普通 MITM 交互式劫持中。

TLS 劫持的本质:证书信任链的崩坏

1698828956_6542129ccc99e7ad23f59.png!small?1698828957300

  • 内容引用自笔者在他处的 PPT 中的节选内容

因为信任链是树形结构的,可以“推导”信任关系,那么被信任的 CA 签发的证书,也会被信任。

那么理所当然的,我们得出结论:从原理上来讲,TLS 的劫持和 HTTP 代理甚至任何代理都没有半毛钱关系;从技术上来讲,HTTP 代理在其中的作用仅仅是提供了一个连接介质。

MITM-TLS 劫持时序

1698829105_65421331c9b5885bfba5c.png!small?1698829106556

回顾基于HTTP 代理的MITM 劫持

如果要实现一个正常的 HTTP 代理,我们需要处理两种情况:

  1. 通过 Proxy-Connection 等直接 HTTP 头控制的非 TLS 劫持
  2. 通过 CONNECT 控制的通用 HTTP 代理。

在第一种情况下,代理只需要去掉 Proxy 头,解析出对应的 Host 地址,发起明文 HTTP 链接即可。我们就不做过多解释;在第二种情况下,CONNECT 成功发起后,TCP 连接将被建立,中间人需要同时进行客户端的握手,同时尽可能还原信息去和服务端进行握手。实际上,从 TCP 连接建立开始就和 HTTP 代理没有任何关系了。实际上在 Socks5 代理中,从 TCP 连接开始建立之前和 HTTP 代理是不一样的,但是从 TCP 连接开始建立之后,如果我们要进行劫持,那么关于劫持的技术实现和现有 TLS 劫持技术是几乎一致的。

Socks5 可进行中间人攻击的代理实现

我们要实现这个技术,一般的 Socks5 服务器一般来说也是不好使的,所以我们需要花几分钟来学习一下一个简单好用的 Socks5 协议应该怎么实现。

Socks5 一般有三种模式:

  1. TCP Forward: 最常见的模式,正向代理,转发客户端的所有连接

  2. TCP Port Forward: 反向模式,映射远端一个端口,然后让客户端自行连接

  3. UDP Forwarded:UDP 转发模式

一般的 Socks5 服务器和客户端都只支持第一种协议,因此我们以第一种协议为例,拆解一下通信过程,我们把通信过程分为:

  1. 握手

  2. 连接

Socks5 握手

1698829166_6542136ed5b2f09562b3a.png!small?1698829167771

1698829177_654213798f161b92429c2.png!small?1698829178344

  • 代码仅供参考。

Socks5 转发

当我们实现握手之后,我们发现拿到了 TCP 连接,那么正常来说,我们此时就有了决策点:

  1. 如果我们正常无脑转发 TCP 到目标 TCP 连接中,那我们的 Socks5 就是一个 “正义” 的 Socks5 代理
  2. 当我们劫持过程中,尝试预读(Peek)TLS Handshake ClientHello 的时候,我们就可以知道这个连接到底是不是 TLS 握手,要不要伪装了。具体的代码如下:

1698829248_654213c0d189dafd8127a.png!small?1698829249689

Socks5 邪恶版本实现之后,我们就可以顺利劫持到 TLS 的原始内容了。

备注:SNI 仍然不受任何影响

SNI 在 TLS Handshake ClientHello 中作为 TLS Extension 信息,他的存储结构其实并不是一个 string,而是一个 []string,我们仔细回想一下,劫持后的 TLS 握手发生的时间肯定至少应该在上一个 SNI 的解析出来之后,如果没有解析出来,那么应该读取 Socks5 连接的时候的目标 Addr。

工程问题:如何使用现有的基础设施?

经过上面的 proof of concept,我们顺利实现了 Socks5 代理的 TLS 劫持,但是我们发现他劫持的实际上并不是真正的 HTTP 请求,而是更加通用的 TCP 请求,这下遇到了问题了:“MITM 的基础设施一般都是用来处理 HTTP 请求的,那么接下来难道要完全重写一遍基础设施吗?”,我们发现,让这个小技术更好的造福用户和他的技术实现还是有很大差距的,那么真的束手无策了吗?

多协议端口复用(Socks5 HTTP 代理共存)

大家很多时候仍然记得我们在 Yakit 中的 “反连” 中实现了一个端口同时 Serve 多种不同的应用协议的功能;很自然地,我们知道 Socks5 的第一个字符 \x05 和 \x16(TLS) 并不冲突,因此 Socks5 其实也可和 HTTP 协议并存,因此 ClashX 等工具的本地代理你可以设置为 Socks5 代理,也可以设置为 HTTP 代理。

很自然的,我们为了减轻用户切换代理的负担,第一件事儿应该是让 Socks5 和 HTTP 共存。

  1. 通过我们的 TCP Connection Peek 技术很容易实现这个功能

  2. Facades 已经提供了长时间健康运行的证明,这个技术并不会额外增加负担

因为我们很快就解决了这个小问题

以退为进:巧妙利用二级代理

我们使用 Socks5 劫持 TLS 本质上是劫持了 TCP(HTTP 的传输层),并不是劫持了 HTTP,按理说并不能兼容 HTTP 代理,但是如果我们主动放弃除 HTTP 之外的其他协议,那么是否可以服用基础设施呢?既然决定自我退化,那么实际上这个 “劫持” 问题可以降级为:

“如果我能给 Socks5 转发的 TCP 连接增加一个二级代理,这个二级代理是有劫持功能的,那么是不是说也算是成功劫持?”

结合多协议复用技术,我们实现了如下有趣的技术内容

  1. 我们预读了 HTTP 代理中的 Socks5 代理请求,手动进行了 Socks5 握手

  2. 如果握手成功,我们将会把 TCP 连接当成 Socks5 代理连接来使用,同时让 Socks5 服务器启动新连接的时候设置同端口的 HTTP 代理;

  3. HTTP 协议被 HTTP 代理直接劫持!完美兼容 Socks5 代理协议

最终实现

1698829297_654213f195e7bd54e85b0.png!small?1698829298071

细心的同学在 Yakit 的使用中发现:曾几何时 MITM 的提示词已经变成 http://127.0.0.1:8083 或 socks5://127.0.0.1:8083。

既然最近有对 MITM 的调整,那么也顺便来说一下 MITM 的其他变化:

国密GM-TLS 支持

虽然大家在 yak 核心引擎中还能看到 martian 的影子,但是需要提醒的是,这个 martian 已经不是大家认识的 google/martian 了,我们对他进行了大量 Bug 修复,上下文控制以及 Socks5 支持,认证代理支持的修改,甚至我们还在他的基础上支持了国密算法的劫持套件,以助力对国内一些特殊站点的测试。

同时,支持 GMTLS 我们还支持多种选项:

  1. 国密 TLS 优先:当这个选项开启后,进行 TLS 劫持后连接时将优先进行 GMTLS 连接

  2. 仅国密 TLS:当这个选项开启后,将不再支持普通 TLS 的劫持功能

当然,普通模式下,TLS 如果连接不成功,会自动进行 GMTLS 的备份连接,前提是需要开启 “国密劫持” 选项。

1698829325_6542140dac0d7b1e98cfe.png!small?1698829326384

代理认证:

当然,我们现在 MITM 劫持是可以开启认证的,用户可以输入用户名和密码以限制自己的 TLS 不会被其他人连接。

1698829381_654214459b2e570384b58.png!small?1698829382102

当我们在同一端口上进行了 Socks5 和 HTTP 代理的时候,将会同时对 Socks5 和 HTTP 代理启用认证。大家尽可放心使用。

虽然我们实现它的技术难度并不高,但是这却是一个非常有趣的技术点,在大家配置和使用的过程中已经发挥了巨大的作用。如法炮制,大家可以用同样的技术和思路为 BurpSuite 实现一个 Socks5 代理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【js逆向实战】某sakura动漫视频逆向

写在前面 再写一个逆向实战,后面写点爬虫程序来实现一下。 网站简介与逆向目标 经典的一个视频网站,大多数视频网站走的是M3U8协议,就是一个分段传输,其实这里就有两个分支。 通过传统的m3u8协议,我们可以直接进行分…

python回文日期 并输出下一个ABABBABA型回文日期

题目: 输入: 输入包含一个八位整数N,表示日期 对于所有的测评用例,10000101 ≤N≤89991231,保证N是一个合法日期的8位数表示 输出: 输出两行,每行一个八位数。第一行表示下一个回文日期第二…

【论文阅读】DALL·E: Zero-Shot Text-to-Image Generation

OpenAI第一代文本生成图片模型 paper:https://arxiv.org/abs/2102.12092 DALLE有120亿参数,基于自回归transformer,在2.5亿 图片-文本对上训练的。实现了高质量可控的text to image,同时也有zero-shot的能力。 DALL-E没有使用扩…

【腾讯云 HAI域探秘】探索AI绘画之路:利用腾讯云HAI服务打造智能画家

目录 前言1 使用HAI服务作画的步骤1.1 注册腾讯云账户1.2 创建算力服务器1.3 进入模型管理界面1.4 汉化界面1.5 探索AI绘画 2 模型参数的含义和调整建议2.1 模型参数的含义和示例2.2 模型参数的调整建议 3 调整参数作画的实践和效果3.1 实践说明3.2 实践效果13.3 实践效果23.4 …

专门为Web应用程序提供安全保护的设备-WAF

互联网网站面临着多种威胁,包括网络钓鱼和人为的恶意攻击等。这些威胁可能会导致数据泄露、系统崩溃等严重后果。 因此,我们需要采取更多有效的措施来保护网站的安全。其中WAF(Web application firewall,Web应用防火墙&#xff0…

网站接口测试记录

1.被测试服务器端口输入htop指令进行cpu监控 2.测试机器安装宝塔-》我的工具-》进行网站测试 访问地址:https://www.bt.cn/bbs/thread-52772-1-1.html

Spring Cloud智慧工地管理平台源码,智慧工地APP源码,实现对劳务人员、施工进度、工地安全、材料设备、环境监测等方面的实时监控和管理

智慧工地管理平台源码,智慧工地APP源码, 智慧工地管理平台实现对人员管理、施工进度、安全管理、材料管理、设备管理、环境监测等方面的实时监控和管理,提高施工效率和质量,降低安全风险和环境污染。智慧工地平台支持项目级、公司…

SpringCloud——负载均衡——Ribbon

负载均衡分为集中式LB(Nginx实现)和进程内LB(Ribbon)。 Ribbon简单来说就是负载均衡RestTemplate调用。 1.Ribbon在工作中分成两步 1.先选择EurekaServer,它优先选择在同一个区域内负载较少的EurekaServer。 2.在根据用户指定的策略,从服务注册的列表…

Go 什么是循环依赖

Go 中的循环依赖是指两个或多个包之间相互引用,形成了一个循环依赖关系。这种情况下,包 A 依赖包 B,同时包 B 也依赖包 A,导致两个包之间无法明确地确定编译顺序,从而可能引发编译错误或其他问题。循环依赖是 Go 中需要…

js实现向上、向下、向左、向右无缝滚动

向左滚动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, ini…

ClickHouse Keeper: Coordination without the drawbacks没有缺点的分布式协作系统

ClickHouse Keeper 介绍 现代分布式系统需要一个共享和可靠的信息存储库和共识系统来协调和同步分布式操作。对于ClickHouse来说&#xff0c;ZooKeeper最初是被选中的。它的广泛使用是可靠的&#xff0c;提供了简单而强大的API&#xff0c;并提供了合理的性能。 然而&#xf…

三菱FX3U系列-定位指令

目录 一、简介 二、指令形式 1、相对定位[DRVI、DDRVI] 2、绝对定位[DRVA、DDRVA] 三、总结 一、简介 定位指令用于控制伺服电机或步进电机的位置移动。可以通过改变脉冲频率和脉冲数量来控制电机的移动速度和移动距离&#xff0c;同时还可以指定移动的方向。 二、指令形…

【K-means聚类算法】实现鸢尾花聚类

文章目录 前言一、数据集介绍二、使用步骤1.导包1.2加载数据集1.3绘制二维数据分布图1.4实例化K-means类&#xff0c;并且定义训练函数1.5训练1.6可视化展示2.聚类算法2.1.可视化生成3其他聚类算法进行鸢尾花分类 前言 例如&#xff1a;随着人工智能的不断发展&#xff0c;机器…

LiveMedia视频监控汇聚管理平台方案(三)

上一篇文章中我们介绍了LiveMedia视频监控汇聚管理平台视频接入方案中功能设计的设备接入方法。在这篇文章中我们来介绍下LiveMedia视频监控汇聚管理平台方案中功能设计里的流媒体转发是如何实现的&#xff1f; 图1流媒体转发框架 平台流媒体转发框架如图1流媒体转发框架所示&a…

JSP 中医知识管理系统myeclipse开发sql数据库BS模式java编程网页结构

一、源码特点 JSP 中医知识管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;比较流行的ssh框架系统具有完整的源代码和数据库&#xff0c;myeclipse开发系统主要采用B/S模式开发。 javaWeb中医知识系统 二、功能介绍 此次系统主要…

麒麟KYLINOS中制作Ghost镜像文件

原文链接&#xff1a;麒麟KYLINOS中制作Ghost镜像文件 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇在麒麟KYLINOS桌面操作系统2203中制作Ghost镜像文件的文章&#xff0c;首先需要将系统进行备份&#xff0c;然后在系统自带的备份还原工具中点击一键Ghost制作镜像…

邮箱哪家强?哪个牌子邮箱好用

邮箱在国内外使用情况不太一样&#xff0c;国内一般都是工作中需要用邮箱&#xff0c;直接使用公司发的企业邮箱就可以了&#xff0c;个人一般自己需要使用邮箱频率比较少&#xff0c;大多是用来注册其他平台信息&#xff0c;接受验证码、电子发票等等&#xff0c;使用不频繁。…

EAS 去除重复的 职位 组织树信息

--备份 SELECT * into T_PM_ORGRANGE_bak1110 FROM T_PM_ORGRANGE --检查是否备份成功 select count(1) from T_PM_ORGRANGE_bak1110 --查询是否有重复脏数据 SELECT FORGID,FUSERID,FTYPE FROM T_PM_ORGRANGE group by FORGID,FUSERID,FTYPE having count(1)>1 --删除脏数据…

git拉取项目所有分支

1、执行git clone &#xff0c;随便拉取一个分支 2、进入成功拉取去的分支生成的文件夹中&#xff0c;执行下面的命令即可完成拉拉取&#xff0c;如下图所示 for branch in git branch -a | grep remotes | grep -v HEAD | grep -v master ; dogit branch --track ${branch#r…

【机器学习】正则化到底是什么?

先说结论&#xff1a;机器学习中的正则化主要解决模型过拟合问题。 如果模型出现了过拟合&#xff0c;一般会从两个方面去改善&#xff0c;一方面是训练数据&#xff0c;比如说增加训练数据量&#xff0c;另一方面则是从模型角度入手&#xff0c;比如&#xff0c;降低模型复杂…