我正在 node.js 中构建 SOCKS5 代理服务器,当我使用用户名和密码进行身份验证时,我从客户端得到的回复与 RFC-1929 定义的不同。
根据RFC-1929,当客户端向我提供身份验证方法时,然后服务器选择应使用哪种方法。我选择使用用户名/密码方法,客户端必须返回用户名长度、用户名本身、密码长度和密码本身。
但它只返回用户名和密码。
回复应如下所示:
+----+------+----------+------+----------+
|VER | ULEN | UNAME | PLEN | PASSWD |
+----+------+----------+------+----------+
| 1 | 1 | 1 to 255 | 1 | 1 to 255 |
+----+------+----------+------+----------+
但是,它看起来像这样:
+----+----------+----------+
|VER | UNAME | PASSWD |
+----+----------+----------+
| 1 | 1 to 255 | 1 to 255 |
+----+----------+----------+
所以我只是不知道用户名和密码是什么,因为我将它们作为单个字符串获取,而不知道它们各自的长度。
例如,当我将用户名作为用户,将密码作为通行证时,在整个初始协商过程之后,我得到了用户通行证。现在我不能只是随机猜测用户名和密码是什么,对吗?
我使用内置的 macOS 客户端。首选项 > 网络 > 详细信息 > 代理 > SOCKS > 等。 所以我想也许客户端软件构建不正确,我下载了Proxifier,得到了相同的结果。我什至观察了与 Wireshark 的初始协商过程,甚至在 Wireshark 中,当客户端发送凭据时,它们也没有长度。
有人知道为什么它不符合 RFC-1929 标准中的解释吗?我到底应该如何提取用户名和密码?
我尝试再次在 Wireshark 中查看,我注意到 ULEN 和 PLEN 没有显示为单独的参数,所以它是这样的:
+----+----------------+----------------+
|VER | ULEN + UNAME | PLEN + PASSWD |
+----+----------------+----------------+
| 1 | 1 + 1 to 255 | 1 + 1 to 255 |
+----+----------------+----------------+