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

news2024/11/28 12:55:51

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 代理。

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

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

相关文章

力扣每日一题 ---- 2906. 构造乘积矩阵

这题很简单(一下就能想到是前缀和的提米),但是在处理12345上面需要仔细一点,本来我最开始想到的时候全部累乘在除掉当前数,但是这样就没有把12345考虑进去,如果他本身是12345的话,那么除他以外的乘积并不一定是0&#…

CSS3 边框、圆角、背景

CSS3是最新的CSS标准。CSS3被拆分为“模块”。一些最重要的CSS3模块如下:选择器、盒模型、背景和边框、文字特效、2D/3D转换、动画、多列布局、用户界面。 一、CSS3边框: 用CSS3,可以创建圆角边框、添加阴影框,并作为边界的形象而…

碳酚醛防热复合材料渗透率测试方法及其精密压差控制解决方案

摘要:气体渗透率是树脂基纤维防热和烧蚀复合材料的关键性能参数,基于现有的稳态法渗透率测试技术相关研究报道,本文提出了更详细和切实可行的渗透率测试中的真空压力差精密控制解决方案。解决方案采用了两个真空度可精密控制的缓冲罐布置在被…

死亡游戏:密室互猜硬币规则及其破解方法

今天听到一个有点小恐怖的死亡游戏 规则是 将你和最好的朋友 分别关进两个不同的房间 要关 100天 在被关的时间里 你们无法进行任何的沟通 每一天 会有一个人在你和朋友的房间分别抛一次硬币 你们需要去猜对方硬币的正反面 只需要一个人猜对了 则 相安无事 如果两个人都猜错了…

nuxt3踩坑

1、安装nuxt3报错:Error: Failed to download template from registry: fetch failed (1)以管理员身份打开cmd (2)进入hosts所在目录,默认是在C:\Windows\System32\drivers\etc下: cd C:\Wi…

Mac代码文本编辑器Sublime Text 4

Sublime Text 4 for Mac拥有快速响应的功能,可以快速加载文件和执行命令,并提供多种语言支持,包括C 、Java、Python、HTML、CSS等。此外,该编辑器还支持LaTeX、Markdown、JSON、XML等技术领域。 Sublime Text 4 for Mac的插件丰富…

centos 上redis以及远程连接工具rdm安装与使用

目录 一 安装包准备 二 安装 三 启动 redis 四 rdm 连接 redis 一 安装包准备 redis 6.2.4 网盘资源: 链接: https://pan.baidu.com/s/1R120Va9FEyraLdiPe9fBHg?pwdgq9i 提取码: gq9i rdm 网盘资源: 链接: https://pan.baidu.com/s/1GiYnfIuQdSUmM…

解决EnableKeyword(“_Emission“)运行状态不起作用

我使用的是Standard Shader,一开始“_Emission”没有开启 当我运行下面的代码,可以看到Inspector窗口已经生效,然而物体本身并没有重新开始渲染,反射没有开启 public GameObject go; // Start is called before the first frame…

spring boot 中@Value读取中文配置时乱码

1.spring boot 读取application.properties 该文件是iso8859编码 如果是直接写中文 读取时会乱码 显示成?? 必须得转ascii码才能正常显示 其他方法测试也不行 Value("${apig.order.tiaokong.qianzi}") private String apigOrderTiaokongQianzi;

【k8s-1】基于docker Desktop一键式搭建k8s环境

在docker desktop中一键启动k8s环境很简单。 下面介绍如何启动dashboard,dashboard仪表盘是新手学习k8s至关重要的一个工具。 1、配置控制台 kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.1/aio/deploy/recommended.yaml 2、开…

Bcc-tools 中文件系统相关工具介绍

之前简单介绍过了Linux下的工具集 bcc-tools, 本次详细的介绍一下和文件系统相关的一些实用工具,以下工具可以快速的帮我们定位文件系统相关问题,比如: 当前系统在读写哪些文件?哪些文件读写耗时比较长?哪…

electron+vite+vue3项目打包

1.安装打包依赖,调整打包命令 npm install electron-builder -D 2.安装完成后,在 package json 中,配置 build 命令 "build": "vite build && electron-builder", 3.electron/index.js修改 win.loadURL 中…

C语言指针详解与应用

写在前面:本文是基于哔哩哔哩江协科技的[C语言] 指针的详解与应用-理论结合实践,真正理解指针!学习时写的笔记,复习查阅方便,如有侵权,联系删除。 另外本人也是初学者,有很多理解不透彻的或者错…

聚焦谋发展,筑梦新征程——云起无垠乔迁新址

2021年7月,网络安全新锐企业北京云起无垠科技有限公司(以下简称:云起无垠)注册成立。云起无垠致力于研究漏洞挖掘尖端技术和打造卓越漏挖工具,并在业界迅速崭露头角,受到了广泛瞩目。 发展至今&#xff0c…

如何查看笔记本电脑电池损耗

1.下载图吧工具箱 在官网下,不要下错了,不然会有很多垃圾捆绑软件,我放一个百度云链接,安装包上传上去了 链接:https://pan.baidu.com/s/18dguF5OGktbPkW7EszZZqA 提取码:1024 2.安装打开后点击主办工具-…

基于SSM的公务用车管理智慧云服务监管平台

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

零基础产品经理如何迅速学习Axure原型制作?快速上手攻略!

如果Adobe xd是一个简单易用的UI设计软件,那么Axure应该是一个强大的原型软件。Axure不仅可以制作静态界面原型,还可以在此基础上增加交互效果。虽然Axure的功能比较复杂,但在学习和掌握之后,可以完美实现产品经理心目中的原型体验…

“产业大数据”助推园区实现可持续发展!

​产业园区在现代经济体系中扮演着重要角色,不仅是地方经济的重要支柱,更是企业发展的舞台。产业园区要想实现可持续的长远发展,不仅需要不断的招引优质企业入驻,更要时刻关注园内的企业,培育有潜力的企业,…

22款奔驰GLS450升级中规主机 实现导航地图 中文您好奔驰

很多平行进口的奔驰GLS都有这么一个问题,原车的地图在国内定位不了,语音交互功能也识别不了中文,原厂记录仪也减少了,使用起来也是很不方便的。星骏汇小许 Xjh15863 其实很简单,我们只需要更换一台中规的新主机就可以实…

算法记录|笔试中遇到的题

栈 394. 字符串解码730.统计不同回文子序列 394. 字符串解码 我自己写的方法 class Solution {public String decodeString(String s) {char[] chs s.toCharArray();LinkedList<Character> stack new LinkedList<>();for(char ch:chs){if(ch]){stack helper(st…