【问题标题】:SOCKS5 - Connection authenticationSOCKS5 - 连接认证
【发布时间】:2018-03-29 20:09:00
【问题描述】:

我正在尝试根据RFC1928 实现反向 SOCKS5。我有一个中继服务器,它被动地等待来自充当代理的 SOCKS5 客户端的连接,以及想要使用隧道的客户端。

传奇

服务器 (10.211.55.6) = 中继 = PC 1(发送/接收)

Client_1 (10.211.55.10) = 代理(在我网络中的另一台 PC 上运行)

Client_2 (10.211.55.8) = Tunneller(从 MaxThon 浏览器连接(因为它允许 SOCKS5 身份验证))

执行流程

  1. Client_1 在端口 9444 上连接到服务器
  2. 服务器找到一个未使用的端口并绑定到它(假设端口 13451 已打开)
  3. Client_2 在端口 13451 上连接到服务器
  4. 服务器接受连接,现在中继 Client_1 和 Client_2 之间的流量
  5. Client_2 将 SOCKS5 协议(根据 RFC1928)请求通过 Server 中继发送到 Client_1
  6. Client_1 进行身份验证并获得一个 CONNECT 命令到 https://dnsleaktest.com 并返回一个 status_ok 响应
  7. 收到来自网页的数据包,并加载网页

问题

  1. Client_2 想要连接到另一个网页(以https://packetstormsecurity.com 为例)。

问题

Client_1 只接收来自 Client_2 的几个数据包,例如 \x17\x3\x3\x17\x3\x3\x1(这些字节代表什么?)。 Client_1 是否必须再次通过 SOCKS5 认证,或者它将如何处理对新网页的请求?

旁注

A) 过了一会儿,Client_2 向 Client_1 请求的页面在浏览器中返回 ERR_TIMED_OUT,因为 Client_2 没有得到任何响应。但如果它期待响应,那么它也假设我知道如何解析它发送的字节,但我不知道它们是什么,因为我在 RFC1928 文档中没有看到它们。

【问题讨论】:

    标签: c winapi socks


    【解决方案1】:

    Client_1 仅接收来自 Client_2 的几个数据包,例如 \x17\x3\x3 或 \x17\x3\x3\x1(这些字节代表什么?)。

    Client_2 正在请求到 HTTPS 主机的隧道。您看到的是 Client_2 和 HTTPS 服务器之间的 TLS 1.2 数据包,在建立到 HTTPS 服务器的 SOCKS 隧道之后:

    \x17 = 内容类型(#23,应用程序数据) \x03 = 主要版本 3 \x03 = 次要版本 3 \x01 = 片段长度(1 字节) ...

    Client_1 是否必须再次通过 SOCKS5 身份验证

    一旦建立了 SOCKS 隧道,通过该隧道传输的所有内容都是应用程序定义的数据。因此,SOCKS 客户端无法通过现有 TCP 连接发送新的 SOCKS 命令。这意味着 Client_2 必须创建一个新的 TCP 连接到您的中继服务器(以及 Client_1),以便请求一个新的 SOCKS 隧道到不同的主机,这涉及到一个新的 SOCKS 身份验证握手,是的(即使没有涉及 SOCKS,无论如何,Client_2 都必须与新主机建立新的 TCP 连接)。

    或者它将如何处理对新网页的请求?

    Client_1 必须等待接受来自 Client_2(或任何其他客户端)的新 TCP 连接,然后才能处理对新 SOCKS 隧道的请求。

    一段时间后,Client_2 向 Client_1 请求的页面在浏览器中返回 ERR_TIMED_OUT,因为 Client_2 没有得到任何响应。

    那么 HTTPS 服务器没有响应 Client_2 的 HTTPS 请求,或者更可能是 Client_1 在处理 SOCKS 隧道时存在逻辑错误,并且没有将 HTTPS 服务器的响应数据中继到 Client_2。

    但如果它期待响应,那么它也假设我知道如何解析它发送的字节,但我不知道它们是什么,因为我没有在 RFC1928 文档中看到它们。

    一旦 Client_1 建立了 SOCKS 隧道,它就不应解析通过该隧道传输的任何内容(除非您协商的 SOCKS 身份验证方案需要封装传输的数据)。通过 SOCKS 隧道传输的数据是应用程序定义的,因此只有隧道两端的客户端和目标服务器才知道数据到底是什么。 Client_1 必须按原样中继(如果需要,处理封装)它在两个方向上接收到的任何原始数据(就像您的中继服务器一样)。

    【讨论】:

    • 感谢您回答我所有的问题,关于您的回答的最后一个问题。 Client_1 如何知道 Client_2 正在尝试访问新主机?原因是,我知道我可以运行另一个 Client_1.exe,它会在指定端口上等待来自 Client_2 的另一个连接以连接到新主机。但是我将如何自动化这个......
    • "Client_1 如何知道 Client_2 正在尝试访问新主机?" - 因为 Client_2 必须将新的 TCP 连接连接到 Client_1(通过您的中继服务器)然后通过该新连接发送 SOCKS CONNECT 请求。 Client_2 无法通过先前的 TCP 连接发出新的 SOCKS 命令。我在回答中提到了这一点。 “我可以运行另一个 Client_1.exe,它会等待来自 Client_2 的另一个连接” - 前提是您的中继服务器支持。
    • 但是,我现在的实现方式是,Client_2 连接到由 Relay 打开的端口,该端口仅在 Client_1 连接到它时才打开。这是否意味着为了做到这一点,我必须关闭 Relay 上相同端口的现有套接字,然后重新打开该端口,以便重新启动此连接,然后当 Client_2 连接到它时(当它请求一个新主机时),它会重新发送 SOCKS 命令吗? “我可以运行另一个 Client_1.exe,它会等待来自 Client_2 的另一个连接” - 我的中继服务器一次支持多个连接,是的。
    • "但是我将如何实现自动化" - 没有什么可以真正实现自动化。 Client_2 决定何时与中继服务器建立新的 TCP 连接,然后中继服务器决定中继到哪个 Client_1。 Client_1 必须在每个 TCP 连接的基础上处理 SOCKS。
    • 当Client_2 想要连接到一个新主机时,它必须创建一个新的TCP 连接,句号(它可以保持之前的TCP 连接保持打开状态,即在Client_2 的浏览器中打开多个选项卡时)。服务器套接字一次可以有多个客户端连接到它。因此,您的中继服务器可以(并且应该)只打开 1 个端口供多个 Client_2 连接。中继服务器必须跟踪哪个 Client_2 连接与哪个 Client_1 连接相关,以便它可以来回中继数据。 Client_1 打开通往请求服务器的隧道时也是如此
    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    相关资源
    最近更新 更多