基于Impacket的横向渗透技术

2020-12-10 14,492

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

 

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

背景介绍

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

image.png 

 

image.png 

 

image.png 

 

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

image.png 

image.png 

 

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

PSExec

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

 

实际上,这一步相当于运行下列命令:sc create [serviceName] binPath= "C:\Windows\[uploaded-binary].exe"。

 

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

 

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

 

image.png 

image.png 

 

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

 

image.png 

 

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

 

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

 

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

 

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

 

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

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

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

 

image.png 

image.png 

 

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

SMBExec

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

 

image.png 

 

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

 

image.png 

 

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

 

image.png 

 

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

 

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

image.png

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

 

image.png 

 

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

 

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

 

image.png 

 

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

 

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

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

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

 

image.png 

 

image.png 

 

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

WMIExec

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

 

image.png 

 

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

 

image.png 

 

image.png 

 

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

 

image.png 

 

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

 

image.png 

 

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

 

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

 

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

 

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

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

 

image.png 

小结

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

 

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

 

image.png 

 

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

 

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

 

image.png 

 

在下一篇文章中,我们将为读者详细介绍pass-the-hash技术,以及NTLM认证的工作原理。更多精彩内容,敬请关注! 

 

原文地址:https://jb05s.github.io/Attacking-Windows-Lateral-Movement-with-Impacket/


本文作者:mssp299

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/149206.html

Tags:
评论  (0)
快来写下你的想法吧!

mssp299

文章数:51 积分: 662

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号