研发故事分为3部分。 第1部分-研究。
山毛榉有很多-甚至更多。
问题陈述
在进行渗透测试和RedTeam活动期间,并非总是能够使用常规的客户手段,例如VPN,RDP,Citrix等。 作为进入内部网络的解决方案。 正如他们所说,在某个地方,常规的VPN根据MFA起作用,并且使用铁令牌作为第二个因素,在某个地方,严格监控它,并且我们的VPN条目立即变为可见-产生了所有后果,但在某个地方,根本没有这种方法。
在这种情况下,必须不断进行所谓的“反向隧道”-从内部网络到外部资源或我们控制的服务器的连接。 在这样的隧道内,我们已经可以使用客户的内部资源。
这种反向隧道有几种。 当然,其中最著名的是Meterpreter。 具有反向端口转发功能的SSH隧道在黑客群体中也有很高的需求。 有很多反向隧道工具,并且其中许多工具都经过了充分的研究和描述。
当然,就其自身而言,保护性解决方案的开发人员不会袖手旁观并积极地发现此类行为。
例如,现代IPS可以从Cisco或Positive Tech成功检测到MSF会话,而几乎或多或少的普通防火墙都可以检测到反向SSH隧道。
因此,为了在良好的RedTeam活动中不被注意,我们需要使用非标准的方法构建反向隧道,并尽可能地适应网络的实际模式。
让我们尝试寻找或发明类似的东西。
在发明某些东西之前,您需要了解我们想要实现的结果,我们的开发应执行的功能。 对隧道的要求是什么,以便我们可以在最大隐身模式下工作?
显然,对于每种情况,这样的要求可以有很大的不同,但是根据经验,我们可以区分主要的要求:
- 在Windows 7-10操作系统上运行。 由于大多数公司网络使用Windows;
- 客户端通过SSL连接到服务器,以防止使用ips进行愚蠢的侦听;
- 连接时,客户端必须支持具有授权的代理服务器的操作,因为 许多公司通过代理访问Internet。 实际上,客户端计算机甚至可能不了解任何信息,并且代理以透明模式使用。 但是我们必须铺设这样的功能。
- 客户部分应简洁,可移植;
很明显,要在客户端计算机上的客户网络内部工作,您可以安装OpenVPN并为服务器建立完整的隧道(因为openvpn客户端可以通过代理工作)。 但是,首先,这并不总是可行的,因为我们可能不是那里的本地管理员,其次,它将发出巨大的噪音,以至于体面的SIEM或HIPS会立即“敲打我们”。 理想情况下,我们的客户端应该是所谓的内联命令,例如,实现了许多bash shell,并通过命令行运行(例如,当从word宏执行命令时)。 - 我们的隧道必须是多线程的,并同时支持许多连接;
- 客户端-服务器连接必须具有某种授权,以便仅为我们的客户端建立隧道,而不为在指定地址和端口到达我们服务器的每个人建立隧道。 理想情况下,对于“第三方用户”,应该打开一个带有与源域相关的图章或专业主题的登录页面。
例如,如果客户是医疗机构,则对于决定检查诊所员工使用的资源的信息安全管理员,应打开药品页面,描述诊断的Wikipedia或Dr.Komarovsky的博客等。
分析现有工具
在发明您的自行车之前,您需要分析现有的自行车并了解我们是否真正需要它,而且可能不仅我们考虑了对这种功能性自行车的需求。
在Internet上进行谷歌搜索(我们似乎对Google没问题),以及在github上搜索关键字“ reverse socks”,都没有得到太多结果。 基本上,这一切都归结为使用反向端口转发以及与其关联的所有内容构建ssh隧道。 除了SSH隧道外,还可以区分几种解决方案:
github.com/klsecservices/rpivot卡巴斯基实验室的人员长期以来一直在实施反向隧道。 顾名思义,此脚本的用途很明确。 该隧道在Python 2.7中实现,在明文模式下运行(因为现在很流行-向ILV打招呼)
github.com/tonyseek/rsocks另一个python实现也是明文形式的,但是有更多选择。 它是作为模块编写的,并且具有用于将解决方案集成到您的项目中的API。
github.com/llkat/rsockstungithub.com/mis-team/rsockstun第一个链接是Golang上反向Sox实施的初始版本(开发者不支持)。
第二个链接已经是我们的修订版,在golang上也添加了其他芯片。 在我们的版本中,我们实现了SSL,通过具有NTLM授权,客户端授权,登录页面密码错误(或重定向到登录页面),多线程模式(即,多个人可以同时使用隧道)的代理工作,客户端ping系统是否存在。
github.com/jun7th/tsocks通过我们的“中国朋友”用python反向执行Sox。 懒人和“不朽”的地方就是由中国人组装并准备使用的现成的binar(exe)。 在这里,只有中国神知道这个Binar的功能远不止主要功能,因此使用它的风险和风险由您自己承担。
github.com/securesocketfunneling/ssf相当有趣的C ++项目,可以实现反向袜子等。 除反向隧道外,它还可以进行端口转发,创建命令外壳等。
MSF MeterPreter正如他们所说,在这里没有任何评论。 或多或少受过良好教育的黑客都非常熟悉这个东西,并且了解保护设备可以很容易地检测到它。
以上所有工具均以类似的技术工作:在网络内部的计算机上,启动了预先准备的可执行二进制模块,该模块建立了与外部服务器的连接。 服务器启动SOCKS4 / 5服务器,该服务器接受连接并将其转换为客户端。
上述所有工具的缺点是客户端计算机上需要使用Python或Golang(您是否经常在计算机上安装了Python,例如公司董事或办公室工作人员?),或者您需要将预组装的Binar拖到该计算机上(实际上是python)并将脚本放在一个瓶子中)并在此运行此二进制文件。 下载exe及其后续启动也是本地防病毒或HIPS的签名。
总的来说,结论表明了自己-我们需要在powershell上解决方案。 现在,西红柿将飞向我们-他们说,动力壳-所有西红柿都被打碎,受到监视,阻止等。 等 实际上-并非无处不在。 我们负责任地声明。 顺便说一句,有很多方法可以绕开锁(这里是关于向ILV问候的时髦说法:)),从愚蠢的重命名powershell.exe-> cmdd.exe到以powerdll等结束。
开始发明
很明显,首先我们将在google上搜索,...我们将找不到与此主题相关的任何内容(如果找到了该人,则抛出评论链接)。 在Powershell上只有Socks5的
实现 ,但这是通常的“直接” Sox,它有很多缺点(我们将在后面讨论)。 当然,您可以一挥手就能将其变成反向,但是它只会是单线程的袜子,这并不是我们真正需要的。
因此,我们没有找到任何准备好的东西,因此我们仍然必须发明自行车。 作为我们自行车的基础,我们在golang上
开发了反向袜,并在powershell上为其实现了客户。
RSocksTun那么rsockstun如何工作?
RsocksTun(以下简称rs)的工作核心是两个软件组件-Yamux和Socks5服务器。 Socks5服务器是常规的本地socks5,它在客户端上运行。 并使用yamux(
另一个多路复用器 )提供与它的多路复用连接(还记得多线程吗?)。 通过此方案,您可以运行多个客户端socks5服务器并为其分配外部连接,通过一个TCP连接(几乎类似于meterpreter)将它们从客户端转发到服务器,从而实现多线程模式,否则,我们无法在内部完全工作网络。
yamux的本质在于它引入了附加的网络级别的流,将其实现为每个数据包的12字节报头。 (在这里,我们有意使用“流”一词,而不是流,以免使读者与程序线程“线程”混淆-我们还将在本文中使用此概念)。 yamux标头中包含流号,用于设置/结束流的标志,已传输的字节数,传输窗口的大小。

除了安装/完成流之外,yamux还实现了keepalive机制,使您可以监视已安装的通信通道的运行状况。 创建Yamux会话时配置了keeplive消息的机制。 实际上,从设置中来看,只有两个参数:启用/禁用以及发送数据包的频率(以秒为单位)。 yamux服务器可以发送keepalive消息,因此yamux客户端可以发送。 接收到保持活动消息后,远程方有义务通过发送与接收到的消息完全相同的消息标识符(实际上是一个数字)来对其进行响应。 通常,仅对于yamux,keepalive是相同的ping。
整个多路复用器操作技术的详细信息:yamux
规范中描述了数据包类型,安装和终止标志,数据传输机制。
结语至第一部分
因此,在本文的第一部分中,我们熟悉了一些用于组织反向隧道的工具,了解了它们的优缺点,研究了Yamux多路复用器的工作机制,并描述了新创建的powershell模块的基本要求。 在下一部分中,我们将实际上从头开始开发模块本身。 待续。 不要切换:)