# SAM 安全账户管理器

安全帐户管理器 (SAM) 数据库以 NTLM 哈希格式存储本地 Windows 凭证。在本地登录期间，用户输入密码后，本地安全机构 (LSA) 通过根据存储在 SAM 中的数据验证凭证来验证登录尝试。当输入的密码的哈希与 SAM 中的 NTLM 哈希匹配时，登录成功。当我们在主机上得到了提升特权，我们就可以通过多种方式从 SAM 中提取凭证。在域环境中，本地帐户的凭证对我们来说可能看起来不那么令人兴奋。但是，考虑到密码重用的可能性，如果我们获得主机上本地管理员帐户的 NTLM 哈希或明文密码，域用户可能会在另一台主机上重用该凭证。一个实际生活中的例子可以是，某服务器管理员同时管理 2 个 SQL 数据库服务器，为了方便记忆，于是给这 2 台服务器设置了相同的本地管理员密码。

至于从 SAM 中导出哈希，我们有多种方法，分别如下。

### **通过工具在线导出**

我们可以借助诸如 mimikatz 之类的工具在线导出 SAM 中的凭证，十分方便。我们需要获得一个受害主机的 SYSTEM 会话。

##### **mimikatz**

考虑到 Cobalt Strike 自带了 Mimikatz 的命令，我们可以直接使用内置的 mimikatz 导出 SAM 中的凭证。命令为 **mimikatz lsadump::sam**

不出所料，我们得到的都是本地帐号

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/btGeORh36mKZ29c7-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/btGeORh36mKZ29c7-image.png)

##### **C2 内置命令**

导出 SAM 数据库中的凭证并不是 mimikatz 的独有功能，因此诸多 C2 也集成了导出 SAM 的内置命令，在 Cobalt Strike 中，也有这样的一个单独命令的存在，使用 **hashdump** 命令即可。

输出十分简洁明了。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/12rDfK7qSlpTPea0-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/12rDfK7qSlpTPea0-image.png)

##### **Impacket 远程导出**

Impacket 中的 secretdump.py 脚本可以在提供凭证后远程导出 SAM 中的凭证，通过**远程注册表**的方法。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/zXD6IsmFE7Y3rvKX-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/zXD6IsmFE7Y3rvKX-image.png)

### **离线导出**

使用 mimikatz 之类的工具在线导出固然很方便，我们也可以将相关文件复制或导出，然后进行离线解析从而获得之中的凭证。

##### **注册表复制**

分别从注册表 HKLM\\SAM 和 HKTM\\SYSTEM 的位置拷贝 SAM 数据库和 SYSTEM。

```powershell
reg save HKLM\SYSTEM C:\Windows\Tasks\SYSTEM
reg save HKLM\SAM C:\Windows\Tasks\SAM
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/3tqptp4QEbARp5xM-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/3tqptp4QEbARp5xM-image.png)

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/dXMwnLjeOrXOeEPV-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/dXMwnLjeOrXOeEPV-image.png)

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/zHJ63dyw3joZFn7a-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/zHJ63dyw3joZFn7a-image.png)

为什么导出的是 SAM 与 SYSTEM 呢？SAM 用于存储本地账户的凭证，而SYSTEM 包含了用于解密 SAM 与 LSA 机密 (稍后会说) 的信息。

在这之后，我们可以通过多种工具来解密，例如 mimikatz，impacket 等。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/OxWNNsJGkPGBJEEz-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/OxWNNsJGkPGBJEEz-image.png)

#####  

##### **拷贝 SAM 数据库文件**

SAM 数据库的文件地址是 **C:\\Windows\\System32\\config\\SAM**，对应的 SYSTEM 则也在同目录下。我们是否可以直接复制/下载该文件，然后通过工具来解密呢？

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/KsEWnSQRuKJiTpJq-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/KsEWnSQRuKJiTpJq-image.png)

实际上是不可行的，因为该文件被锁定了，无法对其进行读和写。但我们可以通过**卷影复制**实现。在提升特权的命令行中，使用 **wmic** 创建一个新的卷影并且指定来源磁盘，这样可以创建一个 C 盘的快照。我们可以用 **vssadmin** 命令来验证我们的操作。接着，我们可以从影拷贝中拷贝出 SAM 数据库 以及 SYSTEM 文件。之后用工具来解密 SAM 数据库。

```powershell
wmic shadowcopy call create Volume='C:\'
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/TUVN01FJShwACT8X-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/TUVN01FJShwACT8X-image.png)

列举当前的所有卷影拷贝：

```powershell
vssadmin list shadows
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/NtleQGIKBQJKu2Ef-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/NtleQGIKBQJKu2Ef-image.png)

可被复制与下载的 **SAM** 与 **SYSTEM** 在如下位置：

```
\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\Config\SAM
\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\Config\SYSTEM
```

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-05/scaled-1680-/VlYOZSotxTwlKUfP-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-05/VlYOZSotxTwlKUfP-image.png)