基本概念:
首先什么是TCP?传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793 [1] 定义,为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。
什么是tcp代理?TCP代理也称为tcp端口转发,工作原理就是,把proxy监听端口进来的tcp连接的数据原样转发到上级监听的一个端口。上级可以是proxy的tcp代理也可以是具体的第三方服务,如果上级是tcp代理,那么就组成了转发链。至于转发链可以做什么看自己业务需求。简言之,代理是代表客户端向服务器发送消息的中介。使用代理浏览互联网时,您不会直接询问Google“我如何在扑克中作弊?相反,你向你的代理发送一个请求,要求它询问谷歌如何为你在扑克中作弊。您的代理会询问 Google,然后向您发送回复。谷歌知道它正在与你的代理交谈,但不一定知道另一边是你。
代理广泛用于隐私、内容过滤、审查绕过、缓存和安全渗透测试。
我们将构建一种称为“中间人”(MITM)的特定类型的代理。安全渗透测试人员通常使用MITM代理来读取,记录和修改客户端(如智能手机)与远程服务器(如约会应用程序)交换的数据。
假设您想使用 MITM 代理(在您自己的笔记本电脑上运行)来检查发送到您最喜欢的约会应用程序的流量。您将指示智能手机将其流量发送到MITM代理,而不是直接将其发送到约会应用程序的服务器。你的智能手机将不再问约会应用程序的服务器“亚历克斯有多远?相反,它会要求您的MITM代理询问约会应用程序Alex代表您有多远。
您的MITM代理将发出此请求,并将其获得的任何响应发送回您的智能手机。它还会记录请求的内容和对文件的响应,允许您查看它们包含的内容。这就是使代理成为中间人的原因。您可以使用这些日志中的信息来修改来自智能手机的请求,甚至可以从头开始完全欺骗您自己的请求。
我们的代理将由 3 个组件组成,每个组件解决一个不同的问题:
该项目分为4期。第一部分概述了代理的设计,并介绍了我们将使用的协议和技术。最后三部分分别描述了如何构建上述组件之一,并对所涉及的技术进行了一些额外的说明,本博客讲述第一节基本概念。
我们将首先构建一个虚假的DNS服务器,并使用它来说服您的智能手机将其流量发送到我们的代理。
我们人类考虑使用主机名将数据发送到互联网上,比如。但是,互联网使用IP 地址将我们的数据路由到目的地,例如。这两个地址系统是完全不同的。IP地址对人类来说很不方便(“访问我的网站”不是很活泼),但主机名对互联网骨干网来说绝对没有任何意义robertheaton.com
104.18.33.191
104.18.33.191
设备(如智能手机)使用域名系统 (DNS) 协议在主机名和 IP 地址之间进行转换。有 20 个左右的免费和公共 DNS 服务器,每个服务器(粗略地说)都保留了一个从主机名到 IP 地址的所有映射的数据库。谷歌有一个带有IP地址的DNS服务器。威瑞信有一个。8.8.8.8/
64.6.64.6
假设您浏览到我的网站,在您的设备可以向我的服务器发送请求之前,它需要将此主机名转换为互联网骨干可以理解的 IP 地址。它向 DNS 服务器发出 DNSA 记录请求(从现在开始简称为“DNS 请求”),要求它转换为 IP 地址。一旦 DNS 服务器响应,您的浏览器就会向互联网发送一个 HTTP 请求,并发送到此 IP 地址。robertheaton.com
robertheaton.com
104.18.33.191
您可以通过在智能手机的系统设置中输入服务器的 IP 地址来选择智能手机使用哪个 DNS 服务器进行这些 DNS 转换。所有主要的DNS服务器都应该给出相同的正确答案,所以通常这个选择并不重要。
DNS 服务器没有什么特别之处。它只是一个侦听并响应 UDP 端口 53 上的 DNS 请求的服务器。实际上,我们可以在您的笔记本电脑上运行自己的DNS服务器,并且可以将您的智能手机配置为使用此伪造的DNS服务器而不是Google或Verizon的DNS服务器。
这不仅仅是一个怪事。我们可以对假DNS服务器进行编程,以发回我们喜欢的任何DNS响应。我们甚至可以让它发回完全的谎言。假设我们的 DNS 服务器收到一个主机名的 DNS 请求,我们希望通过我们的代理(例如)路由其请求。我们将对服务器进行编程,使其响应,不是使用真实的IP地址,而是使用笔记本电脑的本地IP地址。api.targetapp.com
api.targetapp.com
你的手机不会知道我们在撒谎,也不会看到我们的回答有任何错误。它将接受解析为笔记本电脑的本地 IP 地址,并调度它想要发送到您的笔记本电脑的任何数据。api.targetapp.com
api.targetapp.com
要利用此行为并接收此重新路由的数据,我们需要在您的笔记本电脑上设置第二台服务器。这将是实际的代理服务器。它将负责从您的手机接收数据;阅读和打印它,以便我们可以检查它;最后将其转发给其预期收件人。
像Burp这样的HTTP / S代理不需要做任何DNS欺骗来让你的智能手机向他们发送数据。为什么我们的 TCP 代理需要呢?
答案是,像Burp这样的HTTP / S代理使我们广泛地了解了HTTP协议的几个一流功能,这些功能只是为了帮助代理而存在。这些包括请求和HTTPheader,稍后会详细介绍。CONNECT
Host
所有明智的智能手机都利用这些功能,因此可以很好地与HTTP / S代理配合使用。您的智能手机有一个系统设置,允许您指定它应该用于其所有 HTTP 请求的代理。为了使用像Burp这样的HTTP MITM代理,您首先将笔记本电脑和智能手机连接到同一网络,然后告诉您的智能手机使用笔记本电脑的本地IP地址作为HTTP代理。您在笔记本电脑上打开Burp代理,智能手机乖乖地将其所有HTTP / S流量转发到笔记本电脑。Burp立即启动并运行。
但是,由于我们希望我们的代理能够处理所有基于 TCP 的协议,而不仅仅是 HTTP,因此我们无法利用任何特定于 HTTP 的功能。这就是为什么我们必须求助于我们的 DNS。您遇到的其他基于 TCP 的协议可能具有自己等效的代理友好功能,但同样可能没有。而且,在能够使用代理检查其请求之前,您将不知道正在检查的特定协议是否具有任何此类功能,并且在检查其请求之前,您将不知道如何代理其请求,并且...而不是想知道是先有鸡还是先有蛋,你只会有一个空荡荡的鸡舍和破碎的梦想。
现在我们知道了如何欺骗您的智能手机将其TCP数据发送到您的笔记本电脑,让我们看看如何用它做点什么。
我们系统的第二部分是代理服务器本身。这将是在您的笔记本电脑上运行的服务器。它将接受来自您的智能手机的流量(在我们的假 DNS 服务器的一点帮助下),将其转发到目标应用程序的远程服务器,并将其发送回您的智能手机的任何响应。
我们必须解决的主要问题是确保我们的代理知道将智能手机的流量转发到哪个远程服务器。代理,像所有计算机程序一样,像砖头一样愚蠢。他们当然不知道如何处理他们收到的数据,他们唯一能知道的方法是他们是否被明确告知。
当你想和你的朋友安排晚餐时,你会给他们的电话号码发一条短信,说“今晚想吃晚饭吗?这很有效,除非你的朋友特别脆弱,或者实际上并不那么喜欢你。
现在想象一下,您有一个私人助理,您聘请他作为所有文本的代理。您将所有文本发送到您的 PA,然后他们代表您将它们转发给您的朋友和敌人。如果你给你的PA发一条短信,只是说“今晚想吃晚饭吗?”那么他们就不知道该转发给谁。由于你最近是一个非常无情的老板,你可怜的,大概工资过低的助理会惊慌失措,删除消息,并假装他们从未收到过。
有许多方法可以解决此 PA 代理问题。您可以在消息中附加一个标题,指出“发送至:415-123-1234”。或者你可以提前制定一个规则,所有晚餐建议都应该总是发送给你的母亲。
再一次,HTTP/S 代理可以使用 HTTP 协议的特殊代理特定功能轻松解决此路由挑战。再一次,我们不能使用它们,因为我们希望我们的TCP代理完全与应用程序协议无关。
因此,我们要作弊一点。我们将把主机名硬编码到我们的代理中,并告诉我们的代理将它收到的所有数据转发到这个主机。这就像告诉你的PA将你今天发送的所有短信路由告知我一样。
这是一个合理的简化。您通常会使用代理来检查单个应用程序发送的数据。这个应用程序可能会将其所有有趣的数据发送到一个主机名,比如。api.targetapp.com
我们可以查看上一节中虚假DNS服务器的日志,并查看您的手机尝试联系的主机列表。我们可以使用直觉和猜测来找出我们最感兴趣的主机名。例如,可能比。然后我们可以将此主机名硬编码到我们的代理中,并指示我们的代理将其从智能手机接收的所有数据发送到此主机。api.targetapp.com
stats.mobileanalytics.com
请注意,我们需要将我们的假 DNS 服务器配置为仅发送我们的代理流量,该流量用于我们的代理将其所有数据发送到的相同主机名。对于所有其他主机名,我们的假DNS服务器应该向真实的DNS服务器发出真正的DNS请求,并将此真实响应转发到您的智能手机。这将导致您的智能手机绕过我们的代理,将这些主机名的所有流量直接发送到正确的位置。如果我们不这样做,我们的代理最终可能会将敏感数据转发到错误的服务器。
我提到Burp和其他HTTP / S代理使用HTTP协议的特殊功能路由请求。为了让我们知道我们错过了什么,让我们来看看这些特殊功能,以及它们如何帮助代理路由 HTTP 和 HTTPS 流量。
未加密的 HTTP 代理很容易。HTTP/1.x 请求包含标头,它显式指定请求应发送到的主机名。HTTP/2.x 请求包含一个包含相同信息的伪标头。HTTP 代理可以轻松地从未加密的请求中解析出此值,并相应地重新发送请求。这类似于在发送给助手的短信中包含“发送到”字段。
HTTPS代理更难,尽管仍然没有我们那么难。
HTTPS 代理有两种主要类型 - 转发代理和中间人代理。“转发代理”非常无聊。它代理HTTPS数据而无需解密。但是,它不能重用HTTP代理采用的方法,因为它只会将通过它的数据视为不可读的,TLS加密的废话字节。这意味着它无法读取 HTTPheader,因此不能使用它来重定向通过它的数据。它需要一个替代解决方案。如果PA无法解密,则向PA发送朋友的加密名称是没有用的。Host
HTTPS 协议通过向代理发送额外的、特定于代理的请求来解决此问题。如果客户端知道其HTTPS请求将通过代理传递,则在每个请求之前都有一个单独的HTTPrequest。此请求以未加密的明文形式明确告知代理它应向其发送加密请求的主机名,该主机名将在不久之后发布。这意味着代理不需要解密主有效负载即可正确路由它。这就像向您的 PA 发送一条初步的、未加密的短信,描述他们应该如何处理您将要发送的加密废话。CONNECT
CONNECT
第二种类型的HTTPS代理,也是我们正在构建的类型,是“中间人”(MITM)。正如我们已经讨论过的,MITM 与转发代理不同,因为它能够解密和读取通过它的数据。这意味着它可以读取HTTP请求的纯文本内容,因此也可以读取存储在其HTTPheader中的预期目标。HTTPS MITM 可以将请求转发到此位置,其方式与 HTTP 代理完全相同。Host
MITM 通常仍然喜欢在可能的情况下模仿转发代理和使用请求。他们使用标头的唯一时间是当“非代理感知”客户端不知道或不关心它们是否连接到代理并且不发送初步请求时。在这种情况下,标头是一个有用的回退。CONNECT
Host
CONNECT
Host
我们现在知道如何说服您的智能手机将其数据发送到我们的代理,以及如何确保我们的代理安全地接收这些数据。剩下的就是让我们处理您的智能手机和我们的代理之间的TLS加密。
该项目分为 3 个部分,每个部分都描述了如何构建代理的 3 个组件之一:
完成所有 3 个部分后,您将拥有一个完全工作的 TCP 代理,您可以使用它来检查和分析任何基于 TCP 的协议。我使用 Python3 为每个部分编写了示例代码。虽然这确实意味着你最好使用Python3,但用另一种语言实现项目也是完全可以的和可行的。.
Reference:
How to build a TCP proxy #1: Intro | Robert Heatonhttps://robertheaton.com/2018/08/31/how-to-build-a-tcp-proxy-1/