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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDMI之编码篇

概述 HDMI 2.0b(含)以下版本,采用3个Channel方式输出。传输又分为3三种周期,视频数据,数据岛以及控制周期。视频传输采用8/10编码。数据岛采用4/10编码(TERC4)。控制周期采用2/10。编码都拓展成了10bits。 上图中,Pixel component(e.g.B)->D[7:0]表示视频数据周期…

74hc595模块参考

74hc595模块参考 8位串行并行输出(SIPO)移位寄存器 使用74HC595移位寄存器扩展微控制器上的输出引脚数量。如果你需要扩充输入引脚的数量那么你需要74HC165移位寄存器。 SER(串行输入)引脚用于一次一位地将数据发送到移位寄存器…

redux-devtools谷歌扩展插件的使用示例

目录 1. store.ts 2. reducer.ts 3. ReduxProvider.tsx 4. mapStateToProps.ts 5. mapDispatchToProps.ts 6. Todo组件(最外层包ReduxProvider 7. Todo组件里面涉及的子组件 1) TodoInput.tsx 2) TodoList.tsx 3) TodoItem.tsx 8. App组件使用Todo组件 1. store.ts …

认识继承和多态

1 继承 1.1 为什么需要继承 Java 中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,但是现实世界错综复杂,事物之间可能会存在一些关联,那在设计程序里就需要考虑 比如&a…

No182.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

No181.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

C# ZXing 二维码,条形码生成与识别

C# ZXing 二维码条形码生成识别 安装ZXing使用ZXing生成条形码生成二维码生成带Logo的二维码识别二维码、条形码 安装ZXing NuGet搜索ZXing安装ZXing.Net包 使用ZXing using ZXing; using ZXing.Common; using ZXing.QrCode; using ZXing.QrCode.Internal; 生成条形码 //…

mybatis嵌套查询子集合只有一条数据

我们再用mybatis做嵌套查询时&#xff0c;有时会遇到子集合只有1条数据的情况&#xff0c;例如下这样&#xff1a; 数据库查询结果 xml <resultMap id"userMap" type"com.springboot.demo.test.entity.User"><id column"uid" property…

腾讯云5年服务器CVM和3年轻量应用服务器配置价格表

腾讯云3年轻量和5年云服务器CVM活动入口&#xff0c;3年轻量应用服务器配置可选2核2G4M和2核4G5M带宽&#xff0c;5年CVM云服务器可以选择2核4G和4核8G配置可选&#xff0c;阿腾云atengyun.com分享腾讯云3年轻量应用服务器和5年云服务器CVM活动入口和配置报价&#xff1a; 目录…

ubuntu16.04安装vscode遇到的code 依赖于 libnss3 (>= 2:3.30)解决

1、ubuntu16.04安装最新版本vscode失败原因 ubuntu16.04安装最新版本的vscode会遇到依赖libnss3(>2:3.30)的问题&#xff0c;原因是ubuntu16.04安装的库libnss3版本更低&#xff0c;与vscode需要的更高版本的libnss3库不兼容&#xff0c;只需要升级libnss3库版本高于2:3.30…

【多线程】

文章目录 概念一、线程的生命周期图二、线程的创建方式一方式二线程API线程优先级sleep阻塞守护线程多线程并发安全问题 总结 概念 线程:一个顺序的单一的程序执行流程就是一个线程。代码一句一句的有先后顺序的执行。多线程:多个单一顺序执行的流程并发运行。造成"感官上…

计算机msvcp140.dll重新安装的四个解决方法,专门解决dll文件丢失问题的方法

在我多年的电脑使用经历中&#xff0c;曾经遇到过一个非常棘手的问题&#xff0c;那就是电脑提示找不到msvcp140.dll文件。这个问题让我苦恼了很久&#xff0c;但最终还是找到了解决方法。今天&#xff0c;我就来分享一下我解决这个问题的四种方法&#xff0c;希望对大家有所帮…

Node.js如何处理多个请求?

前言 在计算机科学领域&#xff0c;关于并发和并行的概念经常被提及。然而&#xff0c;这两个术语常常被混为一谈&#xff0c;导致很多人对它们的理解存在着很多混淆。本文小编将通过对并发和并行的深入解析&#xff0c;帮助读者更好地理解它们之间的不同特点和应用场景。同时…

【Java 进阶篇】Java中的 JSP(JavaServer Pages)

JavaServer Pages&#xff08;JSP&#xff09;是一种用于开发动态Web页面的Java技术。它是在静态Web页面中嵌入Java代码的一种方式&#xff0c;使得开发者可以借助Java的强大功能来创建动态、交互性强的Web应用程序。在本文中&#xff0c;我们将深入探讨JSP的概念、原理和基本用…

SpringBoot项目调用openCV报错:nested exception is java.lang.UnsatisfiedLinkError

今天在通过web项目调用openCV的时候提示如下错误&#xff1a; nested exception is java.lang.UnsatisfiedLinkError:org.opencv.imgcodecs.Imgcodecs.imread_0(Ljava/la如下图所示&#xff1a; 但是通过直接启动java main函数确正常&#xff0c;初步诊断和SpringBoot热加载…

(离散数学)命题及命题的真值

答案&#xff1a; &#xff08;5&#xff09;不是命题&#xff0c;因为真值不止一个 &#xff08;6&#xff09;不是命题&#xff0c;因为不是陈述句 &#xff08;7&#xff09;不是命题&#xff0c;因为不是陈述句 &#xff08;8&#xff09;不是命题&#xff0c;真值不唯一

ElasticSearch7.x - HTTP 操作 - 查询文档操作

查询索引下的所有文档 http://192.168.254.101:9200/shopping/_search 条件查询 请求路径上添加条件:http://192.168.254.101:9200/shopping/_search?q=category:小米 请求体上添加条件:http://192.168.254.101:9200/shopping/_search 请求体内容 {"query" :{&qu…

Git的原理与使用(一)

目录 Git初始 Git安装 Git基本操作 创建git本地仓库 配置git 工作区,暂存区,版本库 添加文件,提交文件 查看.git文件 修改文件 版本回退 小结 Git初始 git是一个非常强大的版本控制工具.可以快速的将我们的文档和代码等进行版本管理. 下面这个实例看理解下为什么需…

【IP-guard WebServer 远程命令执行漏洞复现(0day)】

文章目录 一、漏洞说明二、影响版本三、资产测绘四、漏洞复现五、修复建议 一、漏洞说明 IP-guard是由溢信科技股份有限公司开发的一款终端安全管理软件&#xff0c;旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。 IP-guard Webserver远程命令执行漏…

Openlayers:自定义Controls

Openlayers是一款优秀的二维开源地图框架,支持矢量/栅格图层,支持移动端,并且易于自定义和拓展。下面来讲述一下自定义Control的基本思路。 openlayers-features 问题描述 最近在做个人项目时,遇到了一个小问题,就是在地图中心添加一个十字针形状的符号,用来表示地图中心…