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端口转发的更多相关文章

  1. SSH的端口转发:本地转发Local Forward和远程转发Remote Forward

    关于使用ssh portforwarding来进行FQ的操作,网络上已经有很多很好的文章,我在这里只是画两个图解释一下. 首先要记住一件事情就是: SSH 端口转发自然需要 SSH 连接,而 SSH ...

  2. 【ssh】端口转发

    来源:https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 非常非常好用,可以通过跳板解决两台服务器无法连接的问题 第一部分 概述 ...

  3. ssh动态端口转发

    ssh本地和远程端口转发都需要固定的应用服务器IP和端口,但是很多情况下,应用的端口繁多逐个转发效率不高,而且一些应用使用不固定的端口,经常跳着使用端口,一些网站还不支持IP直接访问,这导致ssh本地 ...

  4. SSH 的端口转发

    第一部分 概述 当你在咖啡馆享受免费 WiFi 的时候,有没有想到可能有人正在窃取你的密码及隐私信息?当你发现实验室的防火墙阻止了你的网络应用端口,是不是有苦难言?来看看 SSH 的端口转发功能能给我 ...

  5. SSH的端口转发

    这里是一篇很好的介绍SSH PortForwarding的文章http://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/ 可以将远端服务器一 ...

  6. 【端口转发】k8s port-forward端口转发 和 ssh -NfL端口转发

    kubectl port-forward端口转发 将远程pod端口转发到本地端口 kubectl port-forward monitoring-grafana-695c545f46-rhtwc -- ...

  7. SSH远程端口转发实战详解

    问题 前段时间在外地没有在实验室,随身携带了一个笔记本电脑.但是笔记本性能不够,想用SSH远程连接实验室的电脑.问如何连接?现有以下设备 设备 IP 备注 系统 实验室电脑C1 192.168.0.2 ...

  8. ssh远程端口转发&&windows系统提权之信息收集&&网安工具分享(部分)

    一.ssh远程端口转发 背景:当我们在渗透过程中,获取到内网的一台仅有内网IP的服务器后,我们可以通过ssh隧道,将内网某个主机的端口进行远程转发 1.网络拓扑图 假设获取的服务器为web服务器,we ...

  9. ssh远程端口转发

    当ssh的连接方向和应用连接的方向不一致时,这就称为ssh远程转发. 主机3是一台web server 应用请求是主机2到主机1 ssh请求是主机1到主机2 主机2开启ssh服务 service ss ...

  10. SSH 远程端口转发

    既然"本地端口转发"是指绑定本地端口的转发,那么"远程端口转发"(remote forwarding)当然是指绑定远程端口的转发. 还是接着看上面那个例子,ho ...

随机推荐

  1. 淘宝商品页面的爬取.py(亲测有效)

    import requests def getHTMLText(url): try: r = requests.get(url,timeout=30) r.raise_for_status() #如果 ...

  2. Kali中python问题

    Kali中python问题 1.查看python有哪些版本 update-alternatives --display python 2.如果没有,可以去/usr/bin查看kali自带哪些版本 查看 ...

  3. 字符串常见API(charCodeAt\fromCharCode)

    1.myStr.charCodeAt(num) 返回指定位置的字符的Unicode(是字符编码的一种模式)编码. 2.String.fromCharCode() String的意思就是不能用自己定义的 ...

  4. PyQt5学习 (1)--对象的基本操作、QObject

    参考视频:[Python-GUI编程-PyQt5 (少)] https://www.bilibili.com/video/BV17J41177ro/?share_source=copy_web& ...

  5. 细节拉满,80 张图带你一步一步推演 slab 内存池的设计与实现

    1. 前文回顾 在之前的几篇内存管理系列文章中,笔者带大家从宏观角度完整地梳理了一遍 Linux 内存分配的整个链路,本文的主题依然是内存分配,这一次我们会从微观的角度来探秘一下 Linux 内核中用 ...

  6. 逍遥自在学C语言 | 关系运算符

    前言 一.人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 -- 自在. 第二位上场的是和我们一起学习的小白程序猿 -- 逍遥. 二.构成和表示方式 关系运算符的作用是判断符号两边大小的关系 ...

  7. win32api中文在线文档

    中文文档http://www.yfvb.com/help/win32sdk/ 英文手册https://www.jb51.net/books/724576.html

  8. vmware中安装windows11系统

    1.官网下载windwos11镜像(点击跳转下载) 2.打开vmware,创建新的虚拟机 3.选择典型方便快捷 4.选择安装程序光盘文件,点击浏览选择刚刚下载好的iso镜像 5.选择windows版本 ...

  9. 正则表达式、datetime

    1.正则表达式就是用来匹配字符串的 2.常用\d表示一个数字,\w表示数字或者字母,'.'表示任意字符 3.如果要匹配边长的字符串,使用*表示任意个字符,+表示至少一个字符,?表示0个或者1个字符,{ ...

  10. day12:闭包函数&匿名函数(lambda)

    闭包函数 闭包函数的定义: 如果内函数使用了外函数的局部变量并且外函数把内函数返回出来的过程 叫做闭包里面的内函数是闭包函数 一个简单的闭包函数示例: def songyunjie_family(): ...