横向渗透中PSExec、SMBExec和WMIExec的使用及特征
2023-4-24 21:16:45 Author: Z2O安全攻防(查看原文) 阅读量:113 收藏

免责声明

本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。

只供对已授权的目标使用测试,对未授权目标的测试作者不承担责任,均由使用本人自行承担。

文章正文

在这篇短文中,我们将为读者详细介绍Impacket提供的几款非常有用的渗透工具,以及这些工具背后的运行机制。

注意:这篇文章中介绍的操作都是在个人实验环境中进行的,其目的只是为了介绍相关工具的运行机制。

背景介绍

就这里来说,我们将假设您正在进行内部网络安全评估。同时,假设您已经建立了初步的立足点,并获得了用户凭证,已开始进行网络枚举。为了简单起见,在获取有效的用户凭证时,我将使用Responder捕获NTLMv2哈希值,然后通过Hashcat进行离线破解。

 

 

通过枚举网络,你已经知道所获得的用户账号在网络中的一台机器上具有管理权限。

 

 

接下来,我们需要进行横向渗透来获得该机器的访问权限。为此,我们将介绍多种可用的横向渗透技术,特别是使用Impacket中的PSExec、SMBExec和WMIExec进行横向渗透的方法。

PSExec

现在,我们要考察的第一个Impacket工具是PSExec。简单的说,用户可以使用PSExec连接到远程机器并通过命名管道执行命令。命名管道是通过一个随机命名的二进制文件建立的,这个文件被写入远程机器上的ADMIN$共享,并供SVCManager用来创建新服务。

实际上,这一步相当于运行下列命令:

sc create [serviceName] binPath= "C:\Windows\[uploaded-binary].exe"

一旦建立了命名管道,我们与远程机器之间的所有命令的输入和输出都将通过SMB协议(445/TCP)进行通信。

下面,让我们仔细看看PSExec到底在背后做了些什么事情。

 

如上图所示,我们想要将二进制文件PDSwlQrA.exe写入远程机器的ADMIN$共享中。为此,我们可以通过列出\127.0.0.1\ADMIN$中的文件和目录来验证该二进制文件已经传到了远程系统中。 

 

好了,二进制文件已经成功写入远程机器,这时,SVCManager就会介入:它将启动一个服务,并创建回连我们的机器的命名管道。(当我们在查看远程机器的事件日志时,会发现SVCManager被调用了)。

在了解这个工具的大致作用后,我们就可以推测可能会留下哪些潜在的artifacts……以及在远程系统上会生成哪些事件日志?

假设我们正在使用PSExec,但我们的连接突然出错,或者意外地关闭了运行PSExec的进程窗口。这意味着远程系统上的artifacts没有被正确清理,所以,我们需要回去自己手动清理。要知道,这几乎适用于所有突然出错所致的连接中断情况。

至于远程机器上产生的事件日志,具体如下所示:

生成的事件日志 (建立通信并运行一个命令,然后退出PSExec)

1个系统事件ID:7045(服务已启动)。

12个安全事件ID:4672(特权登录)、4624(登录)、4634(注销)。

 

在下一节,我们将讨论SMBExec。实际上,虽然SMBExec的操作和PSExec非常相似,但还是存在某些细微的差别。 

SMBExec

正如刚才所说,SMBExec与PSExec非常相似,然而,SMBExec并不会将二进制文件保存到磁盘上。相反,SMBExec会利用一个批处理文件,以及一个临时文件,来执行和转发消息。就像PSExec一样,SMBExec也是通过SMB协议(445/TCP)来发送输入信息并接收输出结果的。

 

接下来,让我们仔细看看SMBExec的工作原理。首先,让我们使用SMBExec来建立与远程机器的交互式连接。

 

如上图所示,我们已经成功建立了与目标机器的连接。为了完成相关分析,让我们执行一个命令来请求运行Notepad.exe的实例。

 

我们很快就会看到,我们失去了进一步向远程机器发送输入的能力。这是因为我们仍在等待远程机器的命令输出,而我们永远不会收到该输出。这种情况非常适合在远程机器上进行分析。

如果我们转至远程机器,并打开进程资源管理器,就可以找到Notepad.exe进程,并可以查看相应的进程树。

我们可以看到:Notepad.exe进程是CMD.exe的子进程。如果我们将鼠标悬停在CMD.exe上,可以看到它正在处理存储在C:\Windows\TEMP\execute.bat中数据。那好,下面就让我们快速读取这个文件中存储的数据。

在读取execute.bat文件中的数据后,我们就会发现,原来发送给远程机器的输入被追加到了文件的开头处。

这个批处理文件本质作用就是把我们的输入发送到远程机器上,执行它们,并把输出重定向到一个名为__output的临时文件中,该文件位于\127.0.0.1\C$路径中。 

 

对于SMBExec在远程机器上产生的事件日志,具体如下所示:

生成的事件日志(建立通信并运行一条命令,然后退出SMBExec)

4个系统事件ID:7045(服务已启动)、7009(服务错误——超时)。

3个安全事件ID:4672(特权登录)、4624(登录)、4634(注销)。

 

本文最后介绍的工具是WMIExec。与PSExec和SMBExec相比,WMIExec的运行方式则截然不同,下面我们将具体进行介绍。 

WMIExec

WMIExec(Windows Management Instrumentation)允许通过TCP 135端口与远程过程调用(RPC)建立初始通信来远程访问机器。初始通信建立后,它会使用一个大于1024的随机端口进行协商。

该连接用于向远程机器发送输入。并且,输入的内容将在CMD.EXE进程中执行,输出的内容将保存在远程机器上ADMIN$共享的临时文件中。通过查找以“__”开头的文件名,我们可以很容易地在ADMIN$共享中找到这个临时文件。两个下划线后面的数值看似随机,但实际上是当前日期和时间转换而成的时间戳。

 

下面,让我们仔细看看这里到底发生了什么。同样,为了便于分析,让我们请求远程机器启动一个Notepad.exe的实例。我们会发现,执行这个命令会导致WMIExec被挂起。

 

如果我们转至远程机器,启动进程资源管理器,我们就可以识别和分析Notepad.exe了。

正如我们所看到的(用紫色高亮显示的部分),我们发送的输入是在CMD.exe进程中执行的。我们还可以发现,命令的输出将被重定向到位于ADMIN$共享中的临时文件中。

在进程内的线程完成任务后,该进程被终止,而输出则被写入临时文件中。然后,存储在临时文件内的输出将通过SMB发回我们的机器上。 

对于WMIExec在远程机器上生成的事件日志,具体如下所示:

产生的事件日志(建立通信并运行一条命令,然后退出WMIExec)

14个安全事件ID:4672(特权登录)、4624(登录)、4634(注销)。

 

小结

现在,我们已经在网络上横向移动到了一台拥有管理权限的机器上,这样,我们就可以通过进一步的枚举操作和post-exploitation技术,为在域网络上获得特权访问做好准备。

为了获得进一步的访问权限,我们可以转储本地安全授权子系统服务(LSASS.EXE)进程的内存,并提取/查看缓存的凭证(Cleartext密码、NTLM哈希值等)。

 

如果您遇到这样的情况:虽然已经成功地从LSASS.exe进程中提取了凭证,但您只有网络上其他地方具有管理员权限的用户的NTLM哈希值,那该怎么办呢?

不要着急,实际上Impacket(以及其他工具)也支持pass-the-hash技术。在下面的截图中,我们可以在Impacket的-WMIExec选项中提供一个用户的NTLM哈希值作为参数,以获得我们具有管理权限的远程机器上的交互式shell。

 


本文转自https://www.secpulse.com/archives/149206.html 如有侵权,请联系删除。

技术交流

知识星球

致力于红蓝对抗,实战攻防,星球不定时更新内外网攻防渗透技巧,以及最新学习研究成果等。常态化更新最新安全动态。专题更新奇技淫巧小Tips及实战案例。

涉及方向包括Web渗透、免杀绕过、内网攻防、代码审计、应急响应、云安全。星球中已发布 200+ 安全资源,针对网络安全成员的普遍水平,并为星友提供了教程、工具、POC&EXP以及各种学习笔记等等。

交流群

关注公众号回复“加群”,添加Z2OBot 小K自动拉你加入Z2O安全攻防交流群分享更多好东西。

关注我们

关注福利:

回复“app" 获取  app渗透和app抓包教程

回复“渗透字典" 获取 针对一些字典重新划分处理,收集了几个密码管理字典生成器用来扩展更多字典的仓库。

回复“书籍" 获取 网络安全相关经典书籍电子版pdf

回复“资料" 获取 网络安全、渗透测试相关资料文档


文章来源: http://mp.weixin.qq.com/s?__biz=Mzg2ODYxMzY3OQ==&mid=2247494158&idx=1&sn=5184a3d782496c975ee400561780d057&chksm=ceab014ef9dc885881f3bdaa7703dc73788c648e680daf89b2e228ca02d13c777423e980b78c#rd
如有侵权请联系:admin#unsafe.sh