Werkzeug / Flask Debug
Last updated
Last updated
Configuration instantanément disponible pour l'évaluation des vulnérabilités et les tests de pénétration. Lancez un pentest complet de n'importe où avec plus de 20 outils et fonctionnalités allant de la reconnaissance au reporting. Nous ne remplaçons pas les pentesteurs - nous développons des outils personnalisés, des modules de détection et d'exploitation pour leur donner du temps pour creuser plus profondément, ouvrir des shells et s'amuser.
Si le débogage est actif, vous pourriez essayer d'accéder à /console
et obtenir une RCE.
Il existe également plusieurs exploits sur Internet comme celui-ci ou un dans metasploit.
Dans certains cas, le point de terminaison /console
sera protégé par un code PIN. Si vous avez une vulnérabilité de traversée de fichier, vous pouvez divulguer toutes les informations nécessaires pour générer ce code PIN.
Forcer une page d'erreur de débogage dans l'application pour voir ceci:
Un message concernant le scénario "console verrouillée" est rencontré lors de la tentative d'accès à l'interface de débogage de Werkzeug, indiquant la nécessité d'un NIP pour déverrouiller la console. La suggestion est de exploiter le NIP de la console en analysant l'algorithme de génération du NIP dans le fichier d'initialisation du débogueur de Werkzeug (__init__.py
). Le mécanisme de génération du NIP peut être étudié à partir du dépôt de code source de Werkzeug, bien qu'il soit conseillé de se procurer le code serveur réel via une vulnérabilité de traversée de fichiers en raison de potentielles divergences de version.
Pour exploiter le NIP de la console, deux ensembles de variables, probably_public_bits
et private_bits
, sont nécessaires :
probably_public_bits
username
: Fait référence à l'utilisateur qui a initié la session Flask.
modname
: Généralement désigné comme flask.app
.
getattr(app, '__name__', getattr(app.__class__, '__name__'))
: Résout généralement à Flask.
getattr(mod, '__file__', None)
: Représente le chemin complet vers app.py
dans le répertoire Flask (par exemple, /usr/local/lib/python3.5/dist-packages/flask/app.py
). Si app.py
n'est pas applicable, essayez app.pyc
.
private_bits
uuid.getnode()
: Récupère l'adresse MAC de la machine actuelle, avec str(uuid.getnode())
la traduisant en format décimal.
Pour déterminer l'adresse MAC du serveur, il faut identifier l'interface réseau active utilisée par l'application (par exemple, ens3
). En cas d'incertitude, fuite /proc/net/arp
pour trouver l'identifiant du périphérique, puis extraire l'adresse MAC de /sys/class/net/<identifiant du périphérique>/address
.
La conversion d'une adresse MAC hexadécimale en décimal peut être effectuée comme indiqué ci-dessous :
get_machine_id()
: Concatène les données de /etc/machine-id
ou /proc/sys/kernel/random/boot_id
avec la première ligne de /proc/self/cgroup
après le dernier slash (/
).