Windows是当今最流行的操作系统,不仅被个人用户使用,也在大型企业中广泛采用。由于其导航的简便性和重度依赖图形用户界面来向最基础的用户传达所有媒体和控制功能,如今大量实体企业的企业网络中都充斥着运行Windows操作系统的主机和服务器。无论这些机器是面向最终用户(即典型员工)还是现场技术团队,Windows操作系统都可能由于其呈现的简便性而被错误配置,这仍然是一个现实问题。Windows提供的管理机制集群中控制位置的差异性意味着,在进行安全加固程序时,要覆盖操作系统的所有隐藏角落和缝隙并非易事,特别是对于较为新手的团队而言。

在本例中,我们将查看一个配置错误的SMB共享,它提供了两种攻击向量。一种是可发现且易于实施的。另一种则涉及安装和部署一个流行的利用框架,虽然效果显著,但在可发现性方面有其自身的缺点。在实际环境中,你总会遇到这样的选择。采取正确的步骤,选择正确的路径,并认识到攻击向量的后果,对你的职业发展至关重要。

为了获得目标主机的总体情况,我们将从一个始终受欢迎的nmap扫描开始。但是,我们将为扫描使用一个新的开关。我们将使用-Pn开关,而不是-sV服务检测开关。在真实环境中,你应该预见到防火墙的存在,它们会在每一步拦截连接并拒绝所有非标准的连接请求或扫描尝试。在典型的nmap扫描过程中,nmap脚本会执行一种复杂的ping扫描,而大多数防火墙都被设置为自动无条件拒绝这种扫描。重复的拒绝会引起怀疑,在典型扫描中,大量相同的请求会被拒绝。-Pn标志将跳过主机发现阶段,直接进入其他探测类型,从而在一定程度上减少你的主动扫描活动。无论多么微小,这个程度都可能证明是你在考虑主动攻击主机之前所需要的生命线。

-Pn:将所有主机视为在线状态——跳过主机发现阶段
-sC:等同于--script=default(使用默认脚本)

根据nmap扫描结果,该机器运行着Windows系统,且在445端口上运行着服务器消息块(SMB)服务。我们已经找到了目标。以下是每个发现端口及其功能的简短摘要,以便了解目标的一些背景信息。在开始任何类型的攻击之前,记录这些端口和目标的一般信息至关重要。这将帮助你避免目标崩溃或触发防火墙阻止和警报。

端口135:
远程过程调用(RPC)服务支持Windows应用程序之间的通信。具体来说,该服务实现了RPC协议——这是一种低级别的进程间通信形式,客户端进程可以向服务器进程发出请求。微软的基础COM和DCOM技术都构建在RPC之上。该服务名为RpcSs,运行在共享服务主机进程svchost.exe中。这是任何Windows操作系统中的主要进程之一,不应终止。

端口139:
此端口用于NetBIOS。NetBIOS是网络基本输入/输出系统(Network Basic Input/Output System)的缩写。它提供与OSI模型会话层相关的服务,允许局域网中不同计算机上的应用程序进行通信。作为严格的API,NetBIOS不是网络协议。较早的操作系统通过IEEE 802.2和IPX/SPX运行NetBIOS,分别使用NetBIOS帧(NBF)和IPX/SPX上的NetBIOS(NBX)协议。在现代网络中,NetBIOS通常通过TCP/IP上的NetBIOS over TCP/IP(NBT)协议运行。这导致网络中的每台计算机都有一个IP地址和一个对应于(可能不同)主机名的NetBIOS名称。NetBIOS也用于在TCP/IP(Windows)中识别系统名称。

简单来说,它是一个允许在OSI模型的会话层通过局域网进行文件和打印机通信的协议。

端口445:
此端口用于SMB。SMB是一种网络文件共享协议,需要计算机或服务器上的开放端口来与其他系统通信。SMB端口通常是端口号139和445。端口139由通过NetBIOS通信的SMB方言使用。它是一个会话层协议,设计用于在局域网上的Windows操作系统。端口445由更新版本的SMB(Windows 2000之后)在TCP堆栈上使用,允许SMB通过互联网通信。这也意味着你可以使用IP地址来使用SMB这样的文件共享。

简单来说,SMB一直是一种网络文件共享协议。因此,SMB需要计算机或服务器上的网络端口来实现与其他系统的通信。SMB使用IP端口139或445。

本质上,SMB(服务器消息块)是一种文件共享协议,这意味着我们通过探索它可能会提取一些有用的副产品。这可以通过使用smbclient工具来实现。它预装在Pwnbox使用的Parrot OS中,但如果你的虚拟机中没有它,可以通过运行以下命令来安装:

sudo apt install smbclient

为了找到这个工具的适当开关,我们可以使用其帮助菜单,通过输smbclient -h命令来访问。然而,这个帮助菜单比较简短且描述性不强,但足以满足我们当前的需求。基于到目前为止我们对命令结构以及几个常用工具的开关命名约定的了解,我们可以猜测帮助菜单中输出的开关将为我们实现什么功能。但是,如果你想了解更多关于每个命令具体功能的详细信息,可以通过在终端窗口中输man smbclient命令来访问smbclient工具的完整手册。

在探索了各种选择后,我们将采用以下命令,以列出各种可用的共享(-L),并尝试以管理员账户登录,这是Windows操作系统的高权限标准账户。通常,SMB服务器会要求输入密码,但由于我们想要涵盖所有可能的错误配置情况,我们可以尝试无密码登录。在提示输入管理员密码时直接按回车键,将向服务器发送一个空输入。无论服务器是否接受,我们仍然需要去发现。

-L:列出目标上可用的共享。
-U:使用的登录身份。
smbclient -L 10.129.44.211 -U Administrator

可以看到很明显有个share

读一下

└─# smbclient \\\\10.129.44.211\\C$ -U Administrator

从这里我们有两种攻击选择。一种是高调的,另一种则不然。

1. 使用Smbclient简单导航到C$共享,通过管理员授权

2. 使用Impacket中的PSexec.py,涉及Impacket安装和常见攻击面,具有较大的指纹特征。

选项A:SMB未受保护的C$共享

smbclient \\\\10.129.44.211\\ADMIN$ -U Administrator

我们可以访问C$共享,而不是访问ADMIN$共享,C$共享是Windows机器的文件系统:

我们已经获得了文件系统访问权限。从这里开始,我们将直接导航到任何Hack The Box Windows漏洞机器上的标准根标志位置:C:\Users\Administrator\Desktop。使用dir命令,我们发现标志文件就在我们的系统中。

smb: \> cd Users\Administrator\Desktop
smb: \Users\Administrator\Desktop\> dir
  .                                  DR        0  Thu Apr 22 15:16:03 2021
  ..                                 DR        0  Thu Apr 22 15:16:03 2021
  desktop.ini                       AHS      282  Wed Apr 21 23:23:32 2021
  flag.txt                            A       32  Fri Apr 23 17:39:00 2021

                3774463 blocks of size 4096. 1157736 blocks available
smb: \Users\Administrator\Desktop\> 

为了从服务器检索flag.txt文件,我们可以使get flag.txt命令。这将初始化一个下载,输出位置将是我们运行smbclient工具时攻击者虚拟机上最后访问的目录。

我们现在可以退出smbclient命令行,并使用cat命令读取我们刚刚下载的文件。

选项B:Impacket

我们成功获得了SMB命令行交互界面。然而,由于我们可以访问这个ADMIN$共享,我们将尝试使用一个名为psexec.py的工具来利用这个错误配置并获得交互式系统shell。psexec.py是Impacket框架的一部分。

Impacket是一个用Python编写的网络协议框架。它专注于提供对数据包的低级编程访问,对于某些协议(如SMB和MSRPC),它还提供了协议实现本身。简而言之,Impacket包含了数十个与Windows系统和应用程序交互的出色工具,其中许多工具非常适合攻击Windows和Active Directory。

Impacket中最常用的工具之一是psexec.py。它以微软Sysinternals套件中的实用程序PsExec命名,因为它执行相同的功能,使我们能够在远程Windows机器上执行完全交互式的shell。

PsExec是微软的一款便携式工具,允许你使用任何用户的凭据远程运行进程。它有点像远程访问程序,但不是用鼠标控制计算机,而是通过命令提示符发送命令,无需手动安装客户端软件。

与任何工具一样,了解Impacket的psexec如何工作是很重要的。

Impacket通过在远程系统的ADMIN$共享上上传一个随机命名的可执行文件,然后将其注册为Windows服务来创建远程服务。这将导致通过TCP端口445在远程Windows系统上获得一个交互式shell。

Psexec需要具有本地管理员权限或更高级别用户的凭据,因为需要读取/写入ADMIN$共享。一旦你成功认证,它将让你进入NT AUTHORITY\SYSTEM shell。

我们可以从这个链接下载Impacket

安装指南:

git clone https://github.com/SecureAuthCorp/impacket.git
cd impacket
pip3 install .
# OR:
sudo python3 setup.py install
# In case you are missing some modules:
pip3 install -r requirements.txt

注意:如果你没有安装pip3(Python3的pip)或Python3,请使用以下命令安装:

sudo apt install python3 python3-pip

pkexec工具可以在/impacket/examples/pkexec.py路径下找到。运行以下命令查看psexec.py的帮助信息:

psexec.py -h

获取目标交互式shell的简单语法:

python psexec.py username:password@hostIP

从我们之前使用smbclient的方法中,我们知道'Administrator'用户没有密码。所以,我们要运行的命令是:

psexec.py administrator@10.129.44.211

当提示输入密码时,直接按回车键(因为没有密码)。

我们获得了最高权限的shell,即NT Authority/System用户权限。

太棒了!现在,你可以浏览文件系统并获取flag。

然而,在模拟测试环境中通常更倾向于使用pkexec工具,但在真实环境评估中,它很容易被Windows Defender检测到。