在powershell中编写反向socks5代理。第1部分

一个关于研发的故事分为三个部分。 第 3 部分是探索性的。
这里有很多山毛榉树——甚至还有更多好处。

制定问题

在渗透测试和 RedTeam 活动期间,并不总是可以使用客户的标准工具,例如 VPN、RDP、Citrix 等。 作为进入内网的锚点。 在某些地方,标准 VPN 使用 MFA 工作,并使用硬件令牌作为第二个因素,在其他地方,它受到残酷的监控,我们的 VPN 登录立即变得可见,正如他们所说,以及它所需要的一切,但在其他地方,根本就没有这样的手段。

在这种情况下,我们经常必须建立所谓的“反向隧道”——从内部网络到外部资源或我们控制的服务器的连接。 在这样的隧道内,我们已经可以利用客户的内部资源。

这些返回隧道有多种类型。 其中最著名的当然是Meterpreter。 具有反向端口转发功能的 SSH 隧道在黑客群体中也有很大的需求。 实现反向隧道的方法有很多,其中许多方法都得到了很好的研究和描述。
当然,就安全解决方案的开发人员而言,他们不会袖手旁观并主动检测此类行为。
例如,MSF 会话可以被 Cisco 或 Positive Tech 的现代 IPS 成功检测到,而反向 SSH 隧道可以被几乎所有普通防火墙检测到。

因此,为了在红队战役中不被察觉,我们需要使用非标准手段构建反向隧道,并尽可能贴近网络的真实运行模式。

让我们尝试寻找或发明类似的东西。

在发明任何东西之前,我们需要了解我们想要达到什么结果,我们的开发应该执行什么功能。 为了让我们能够在最大隐秘模式下工作,对隧道有什么要求?

显然,对于每种情况,这些要求可能会有很大差异,但根据工作经验,可以确定主要要求:

  • 在 Windows-7-10 操作系统上工作。 由于大多数企业网络使用Windows;
  • 客户端通过 SSL 连接到服务器,以避免使用 ips 进行愚蠢的监听;
  • 连接时,客户端必须支持通过授权的代理服务器进行工作,因为在许多公司中,通过代理访问互联网。 事实上,客户端机器甚至可能对此一无所知,代理是以透明模式使用的。 但我们必须提供这样的功能;
  • 客户端部分应简洁、便携;
    很明显,要在客户的网络中工作,您可以在客户端计算机上安装 OpenVPN 并创建到服务器的成熟隧道(幸运的是,openvpn 客户端可以通过代理工作)。 但是,首先,这并不总是有效,因为我们可能不是那里的本地管理员,其次,它会产生很大的噪音,以至于像样的 SIEM 或 HIPS 会立即“告密”我们。 理想情况下,我们的客户端应该是所谓的内联命令,例如,许多 bash shell 都是通过命令行实现和启动的,例如,当从单词宏执行命令时。
  • 我们的隧道必须是多线程的并且同时支持多个连接;
  • 客户端-服务器连接必须具有某种授权,以便仅为我们的客户端建立隧道,而不是为通过指定地址和端口访问我们服务器的每个人建立隧道。 理想情况下,应向“第三方用户”打开包含与原始域相关的猫或专业主题的登陆页面。
    例如,如果客户是医疗组织,那么信息安全管理员决定检查诊所员工访问的资源、包含药品的页面、包含诊断描述的维基百科或 Komarovsky 博士的博客等.应该打开。

现有工具分析

在重新发明自己的自行车之前,您需要对现有自行车进行分析,了解我们是否真的需要它,并且可能我们不是唯一考虑过需要这种功能性自行车的人。

在互联网上谷歌搜索(我们似乎通常用谷歌搜索),以及在 Github 上使用关键字“reverseocks”进行搜索并没有给出很多结果。 基本上,这一切都归结为构建具有反向端口转发的 ssh 隧道以及与之相关的所有内容。 除了SSH隧道之外,还有以下几种解决方案:

github.com/klsecservices/rpivot
卡巴斯基实验室的人员长期实施反向隧道。 从名称就可以清楚地看出该脚本的用途。 该隧道在 Python 2.7 中实现,以明文模式运行(正如现在流行的说法 - 你好 RKN)

github.com/tonyseek/rsocks
Python 中的另一个实现,也是明文形式,但具有更多可能性。 它被编写为模块,并具有用于将解决方案集成到您的项目中的 API。

github.com/llkat/rsockstun
github.com/mis-team/rsockstun
第一个链接是Golang中反向sox实现的原始版本(开发者不支持)。
第二个链接是我们的修订版,带有附加功能,也在 Golang 中。 在我们的版本中,我们实现了 SSL,通过具有 NTLM 授权的代理进行工作,在客户端上进行授权,在密码不正确的情况下提供登录页面(或者更确切地说,重定向到登录页面),多线程模式(即几个人可以与隧道同时工作),这是一种对客户端进行 ping 操作以确定其是否还活着的系统。

github.com/jun7th/tsocks
我们“中国朋友”用Python实现的reverse sox。 在那里,对于懒惰和“不朽”的人来说,有一个现成的二进制文件(exe),由中国人组装并可以使用。 在这里,只有中国上帝知道这个二进制文件除了主要功能之外还可能包含什么,所以使用时需要您自担风险。

github.com/securesocketfunneling/ssf
这是一个相当有趣的 C++ 项目,用于实现反向 sox 等。 除了反向隧道之外,它还可以进行端口转发、创建命令 shell 等。

无国界医生组织翻译员
正如他们所说,这里没有评论。 所有受过或多或少教育的黑客都非常熟悉这个东西,并且了解它是多么容易被安全工具检测到。

上述所有工具都使用类似的技术工作:在网络内部的计算机上启动预先准备好的可执行二进制模块,该模块与外部服务器建立连接。 服务器运行 SOCKS4/5 服务器,该服务器接受连接并将其中继到客户端。

上述所有工具的缺点是必须在客户端机器上安装Python或Golang(您是否经常看到Python安装在例如公司主管或办公室职员的机器上?),或者预先组装好的二进制文件(实际上是Python)必须拖到这台机器上,并将脚本放在一个瓶子里)并在那里运行这个二进制文件。 下载 exe 然后启动它也是本地防病毒软件或 HIPS 的签名。

总的来说,结论不言而喻——我们需要一个 powershell 解决方案。 现在西红柿会向我们飞来——他们说 powershell 已经很陈腐了,它被监控、封锁等等。 等等。 事实上,并非到处都有。 我们负责任地声明。 顺便说一句,有很多方法可以绕过阻塞(这里又出现了一个关于 hello RKN 的时髦短语 🙂),从 powershell.exe -> cmdd.exe 的愚蠢重命名开始,到 powerdll 结束等等。

让我们开始发明吧

很明显,我们首先会在 Google 上查找,然后……我们不会找到有关此主题的任何内容(如果有人找到了,请在评论中发布链接)。 只有 履行 powershell 上的 Socks5,但这只是一个普通的“直接”sox,它有许多自己的缺点(我们稍后会谈到)。 当然,你可以用手轻轻一动,把它变成相反的,但这只是单线袜,这并不是我们所需要的。

所以,我们还没有找到任何现成的东西,所以我们仍然需要重新发明轮子。 我们将以此作为我们自行车的基础 我们的发展 在 Golang 中反向 sox,我们在 powershell 中为其实现一个客户端。

RSocksTun
那么 rsockstun 是如何工作的呢?

RsocksTun(以下简称RS)的运行基于两个软件组件——Yamux和Socks5服务器。 Socks5服务器是一个普通的本地socks5,它运行在客户端上。 使用 yamux 提供多路连接(还记得多线程吗?)另一个多路复用器)。 该方案允许您启动多个客户端socks5服务器并向它们分发外部连接,通过一个TCP连接(几乎像在meterpreter中)将它们从客户端转发到服务器,从而实现多线程模式,没有它我们根本就不会能够在内部网络中充分工作。

yamux 工作原理的本质是它引入了额外的流网络层,以每个数据包 12 字节标头的形式实现它。 (这里我们故意使用“流”这个词而不是线程,以免读者与程序流“线程”混淆——我们在本文中也将使用这个概念)。 yamux 标头包含流编号、安装/终止流的标志、传输的字节数以及传输窗口的大小。

在powershell中编写反向socks5代理。第1部分

除了安装/终止流之外,yamux 还实现了 keepalive 机制,允许您监视已建立的通信通道的性能。 keeplive 消息机制的操作是在创建 Yamux 会话时配置的。 实际上,设置中只有两个参数:启用/禁用和发送数据包的频率(以秒为单位)。 Keepalive 消息可以由 yamux 服务器或 yamux 客户端发送。 当接收到保活消息时,远程方必须通过发送与其接收到的完全相同的消息标识符(实际上是一个数字)来响应它。 一般来说,keepalive 是相同的 ping,仅适用于 yamux。

多路复用器的整个操作技术:数据包类型、连接建立和终止标志以及数据传输机制在 规格 到 yamux。

第一部分的结论

因此,在本文的第一部分中,我们熟悉了一些用于组织反向隧道的工具,了解了它们的优点和缺点,研究了 Yamux 多路复用器的操作机制,并描述了新创建的 powershell 模块的基本要求。 在下一部分中,我们将从头开始开发模块本身。 待续。 不要切换:)

来源: habr.com

添加评论