SOCKS5 - 连接认证

时间:2018-03-29 20:09:00

标签: c winapi socks

我正在尝试根据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)请求发送给通过服务器中继的Client_1
  6. Client_1对https://dnsleaktest.com进行身份验证并获取CONNECT命令并发送回status_ok响应
  7. 接收来自网页的数据包,并加载网页
  8. 问题

    1. Client_2想要连接到其他网页(例如,我们可以选择https://packetstormsecurity.com。)
    2. 问题

      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文档中没有看到它们。

1 个答案:

答案 0 :(得分:2)

  

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

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

\x17 = content type (#23, application data)
\x03 = major version 3
\x03 = minor version 3
\x01 = fragment length (1 byte)
...
  

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

一旦建立了SOCKS隧道,通过该隧道传输的所有内容都是应用程序定义的数据。因此,SOCKS客户端无法通过现有TCP连接发送新的SOCKS命令。这意味着Client_2必须创建到中继服务器(以及Client_1)的新TCP连接,以便向不同的主机请求新的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必须按原样(在需要时处理封装)中继它在两个方向上接收的原始数据(就像您的中继服务器那样)。