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. Ubuntu18.04二进制安装elasticsearch

    1. 什么是Elasticsearch Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎.Logstash 和 Beats 有助于收集.聚合和丰富您的数据并将 ...

  2. Docke 使用与详解1 --Tomcat

    一.Docker容器案例使用 --Tomcat安装与使用 1.Tomcat 安装 --docker tomcat镜像官网 1>使用docker pull tomcat拉取镜像,默认拉取最新版本: ...

  3. 在Vue中发起axios请求成功,却被catch捕捉返回Network Error

    前端发起请求成功,后台接收处理返回,却被axios的catch捕获,没有走then函数. 最后添加了headers配置成功解决,如上,附上axios接口配置中文文档:axios中文文档|axios中文 ...

  4. 全局唯一ID的实现方案

    为什么需要保证唯一ID? 在单机服务架构中,数据库的每一个业务表的主键ID都是允许自增的,但是在分布式服务架构的分库分表的设计,使得多个库或者多个表存储了相同的业务表,如果没有一个全局的唯一ID设计方 ...

  5. AWS IAM介绍

    前言 AWS是世界上最大的云服务提供商,它提供了很多组件供消费者使用,其中进行访问控制的组件叫做IAM(Identity and Access Management), 用来进行身份验证和对AWS资源 ...

  6. python实现往飞书群发图片及消息

    飞书提供了丰富的api来实现消息的通知,包括文本消息.图片消息.富文本消息,本次介绍使用飞书api发送富文本消息,以下是实现思路飞书API地址:https://open.feishu.cn/docum ...

  7. Cisco RV32X系列路由器 从1day分析到0day挖掘

    前言 拿到一个iot设备,笔者比较喜欢先去看一下它的历史漏洞,也许可以从中得到一些启发.发现Cisco之前修补过这个系列设备的命令注入漏洞. https://sec.cloudapps.cisco.c ...

  8. [Linux]监控外部用户登录及外部主机连接情况

    1 外部用户/外部主机 /var/log 在CentOS系统上,用户登录历史存储在以下这些文件中: /var/log/wtmp 用于存储系统连接历史记录被last工具用来记录最后登录的用户的列表 /v ...

  9. JS引擎(2):Java平台上JavaScript引擎—Rhino/Nashorn概述

    可以后端开发的 javascript引擎有 Chrome V8 基于C++ java的Rhino引擎(JDK6被植入),Java8 被替换为Nashorn Rhino和Nashorn都是用Java实现 ...

  10. Http请求get与post请求方式的各种相关面试总结

    转载请注明出处: GET方法和POST方法是两种HTTP请求方法,GET方法通过URL传递参数,可以缓存,但参数长度有限,一般用于获取资源:POST方法通过表单传递参数,不能缓存,参数长度没有限制,一 ...