- Você trabalha em uma **empresa de segurança cibernética**? 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)
- **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)**.
**O conteúdo deste post foi extraído de** [**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/)
Normalmente, é possível **executar código em um servidor web onde um ViewState válido pode ser forjado**. Isso pode ser feito quando a funcionalidade de **validação MAC** foi **desativada** ou conhecendo:
Para evitar ataques de manipulação, o .NET Framework pode **assinar e criptografar** o ViewState que foi serializado usando a classe `LosFormatter`. Em seguida, verifica a assinatura usando o mecanismo de validação de código de autenticação de mensagem (MAC). A classe `ObjectStateFormatter` realiza as tarefas de assinatura, criptografia e verificação. As **chaves necessárias para executar o mecanismo de assinatura e/ou criptografia** podem ser armazenadas na seção `machineKey` dos arquivos **`web.config`** (nível de aplicativo) ou **`machine.config`** (nível de máquina). Isso é normalmente o caso quando vários servidores web são usados para servir a mesma aplicação, muitas vezes atrás de um balanceador de carga em uma fazenda ou cluster da Web. O seguinte mostra o formato da seção `machineKey` em um arquivo de configuração de uma aplicação ASP.NET que usa a versão do .NET Framework 2.0 ou superior:
É importante notar que quando a seção `machineKey` não foi definida nos arquivos de configuração ou quando os atributos `validationKey` e `decryptionKey` foram definidos como `AutoGenerate`, **a aplicação gera os valores necessários dinamicamente** com base em um segredo criptograficamente aleatório. Os algoritmos também podem ser selecionados automaticamente. Atualmente, na versão mais recente do .NET Framework, o algoritmo de validação padrão é `HMACSHA256` e o algoritmo de descriptografia padrão é `AES`. Consulte [\[13\]](https://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.machinekeysection) para mais detalhes.
No passado, era possível **desativar a validação do MAC** simplesmente definindo a propriedade `enableViewStateMac` como `False`. A Microsoft lançou um patch em setembro de 2014 [\[3\]](https://devblogs.microsoft.com/aspnet/farewell-enableviewstatemac/) para impor a validação do MAC, ignorando essa propriedade em todas as versões do .NET Framework. Embora alguns de nós possam acreditar que "_o ViewState MAC não pode mais ser desativado_" [\[4\]](https://www.owasp.org/index.php/Anti\_CSRF\_Tokens\_ASP.NET), ainda é possível desativar a função de validação do MAC definindo a chave do registro `AspNetEnforceViewStateMac` como zero em:
Quando a validação MAC do ViewState foi **desativada**, o projeto [YSoSerial.Net](https://github.com/pwntester/ysoserial.net) pode ser usado para gerar payloads `LosFormatter` como o ViewState para executar código arbitrário no servidor.
**Antes** da versão do .NET Framework **4.5**, o parâmetro `__VIEWSTATE` poderia ser **criptografado enquanto a validação MAC estava desativada**. Deve-se notar que **a maioria** dos **scanners****não tenta** enviar um parâmetro ViewState não criptografado para identificar essa vulnerabilidade. Como resultado, é necessário fazer **testes manuais** para verificar se a validação MAC está desativada quando o parâmetro `__VIEWSTATE` foi criptografado. Isso pode ser verificado enviando uma pequena string aleatória em base64 no parâmetro `__VIEWSTATE`. A URL a seguir mostra um exemplo:
Os scanners automatizados devem usar uma **carga útil que cause um curto atraso** no lado do servidor. Isso pode ser alcançado executando o seguinte código ASP.NET, por exemplo, para criar um atraso de 10 segundos:
Em versões mais antigas (**anteriores à 4.5**), o Framework .NET usa a propriedade **`TemplateSourceDirectory`** [\[15\]](https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.control.templatesourcedirectory) ao **assinar** um objeto serializado. **Desde** a versão **4.5**, no entanto, ele usa as strings **`Purpose`** para criar o hash. Ambos os mecanismos **exigem o caminho de destino a partir do diretório raiz do aplicativo** e o **nome da página**. Esses parâmetros podem ser **extraídos da URL**.
Aplicações que usam um **framework mais antigo** e impõem a criptografia do ViewState ainda podem **aceitar um ViewState assinado sem criptografia**. Isso significa que **conhecer a chave de validação e seu algoritmo é suficiente** para explorar um site. Parece que o ViewState é criptografado por padrão **desde a versão 4.5**, mesmo quando a propriedade `viewStateEncryptionMode` foi definida como `Never`. Isso significa que nas últimas versões do Framework .NET, a **chave de descriptografia e seu algoritmo também são necessários** para criar um payload.
O ViewState ASP.NET contém uma propriedade chamada `ViewStateUserKey` [\[16\]](https://docs.microsoft.com/en-us/previous-versions/dotnet/articles/ms972969\(v=msdn.10\)) que pode ser usada para mitigar os riscos de ataques de falsificação de solicitação entre sites (CSRF) [\[4\]](https://www.owasp.org/index.php/Anti\_CSRF\_Tokens\_ASP.NET). O valor da propriedade **`ViewStateUserKey`** (quando não é `null`**) também é usado durante o processo de assinatura do ViewState**. Embora não conhecer o valor desse parâmetro possa interromper nosso ataque, **seu valor geralmente pode ser encontrado nos cookies ou em um parâmetro de entrada oculto** ([\[17\]](https://software-security.sans.org/developer-how-to/developer-guide-csrf) mostra um exemplo implementado).
No YSoSerial.Net master e no YSoSerial.Netv2, você pode encontrar um plugin ([**este**](https://github.com/pwntester/ysoserial.net/blob/master/ysoserial/Plugins/ViewStatePlugin.cs) e [**este**](https://github.com/pwntester/ysoserial.net/blob/v2/ysoserial/Plugins/ViewStatePlugin.cs)) para explorar essa técnica quando todas as informações são conhecidas.
Por padrão, ele usa o gadget ActivitySurrogateSelector que requer a compilação da classe ExploitClass.cs no projeto YSoSerial.Net. A carga útil do ViewState também pode ser **criptografada** para evitar os WAFs quando o valor decryptionKey é conhecido:
**Nota:** Devido à natureza dos gadgets usados no YSoSerial.Net, a página ASP.NET alvo sempre responde com um erro, mesmo quando um exploit foi executado com sucesso no lado do servidor.
Você pode verificar [\[20\]](https://docs.microsoft.com/en-us/iis/get-started/planning-your-iis-architecture/understanding-sites-applications-and-virtual-directories-on-iis) se não estiver familiarizado com os termos de diretório virtual e aplicação no IIS.
Se não soubéssemos que "app2" era um nome de aplicativo, poderíamos usar **tentativa e erro para testar todos os nomes de diretório** na URL um por um até encontrar um ViewState que possa executar código no servidor (talvez obtendo uma solicitação DNS ou causando um atraso).
Nesse caso, o argumento `--generator` pode ser usado. O argumento `--isdebug` pode ser usado para verificar se o plugin também calcula o mesmo parâmetro `__VIEWSTATEGENERATOR` quando os argumentos `--path` e `--apppath` foram fornecidos.
Para explorar aplicativos que usam o .NET Framework v4.0 ou abaixo, pode ser usado o ramo YSoSerial.Net v2.0 [\[21\]](https://github.com/nccgroup/VulnerableDotNetHTTPRemoting/tree/master/ysoserial.net-v2) (originalmente desenvolvido como parte de outra pesquisa [\[22\]](https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2019/march/finding-and-exploiting-.net-remoting-over-http-using-deserialisation/)). No entanto, este projeto suporta apenas um número limitado de gadgets e também requer que a caixa de destino tenha o .NET Framework 3.5 ou superior instalado.
Parece que o Immunity Canvas suporta a criação do parâmetro ViewState quando as chaves de validação e criptografia são conhecidas [\[29\]](https://vimeopro.com/user18478112/canvas/video/260982761). As seguintes ferramentas também foram lançadas coincidentemente na mesma época em que eu estava prestes a publicar meu trabalho, o que foi bastante surpreendente:
Acredito que essas ferramentas atualmente **não diferenciam entre diferentes versões do** Framework .NET e visam a criptografia legada. Além disso, eles **não usam o parâmetro `ViewStateUserKey`** que pode estar em uso para impedir ataques CSRF.
Também é possível enviar o parâmetro `__VIEWSTATE` na URL por meio de uma solicitação GET. O único fator limitante é o comprimento da URL que limita o tipo de gadgets que podem ser usados aqui.
Como mencionado anteriormente, o parâmetro `__VIEWSTATE` não precisa ser criptografado ao explorar o Framework .NET 4.0 e abaixo (testado na versão 2.0 até a versão 4.0), mesmo quando a propriedade `ViewStateEncryptionMode` foi definida como `Always`. O ASP.NET decide se o ViewState foi criptografado ou não, encontrando o parâmetro `__VIEWSTATEENCRYPTED` na solicitação (não precisa ter nenhum valor). Portanto, é possível enviar um ViewState não criptografado removendo o parâmetro `__VIEWSTATEENCRYPTED` da solicitação.
Isso também significa que a alteração da chave de descriptografia ou seu algoritmo não pode impedir os ataques quando a chave de validação e seu algoritmo foram roubados.
Uma página ASP.NET produz um erro quando um parâmetro `__VIEWSTATE` inválido é usado. No entanto, a página ainda pode receber suas entradas quando `Request.Form` é usado diretamente no código, por exemplo, usando `Request.Form["txtMyInput"]` em vez de `txtMyInput.Text`. **O ataque CSRF pode ser realizado removendo o parâmetro `__VIEWSTATE` da solicitação ou adicionando o parâmetro `__PREVIOUSPAGE` com um valor inválido**. Como o parâmetro `__PREVIOUSPAGE` é criptografado e formatado em base64 por padrão, mesmo fornecer um único caractere como seu valor deve causar um erro.
Quando o parâmetro `__VIEWSTATEGENERATOR` é conhecido, ele pode ser usado para os aplicativos ASP.NET que usam a versão 4.0 ou abaixo do Framework .NET para assinar um objeto serializado sem conhecer o caminho do aplicativo.
É possível dividir o parâmetro `__VIEWSTATE` em várias partes quando a propriedade **`MaxPageStateFieldLength`** foi definida como um **valor positivo**. Seu valor **padrão** é **negativo** e significa que o parâmetro **`__VIEWSTATE`** **não pode ser dividido em várias partes**.
O parâmetro `__EVENTVALIDATION` e alguns outros parâmetros também são serializados de forma semelhante ao parâmetro `__VIEWSTATE` e podem ser direcionados da mesma forma. Explorar um problema de desserialização via `__EVENTVALIDATION` é mais restrito e requer:
A string `Purpose` usada pelo .NET Framework 4.5 e superior para criar uma assinatura válida é diferente com base no parâmetro usado. A tabela a seguir mostra as strings `Purpose` definidas no .NET Framework:
Quando o parâmetro **`__PREVIOUSPAGE`** existe na solicitação com dados **inválidos**, a **aplicação****não****desserializa** o parâmetro **`__VIEWSTATE`**. Fornecer o parâmetro `__CALLBACKID` impede esse comportamento.
Como explicado anteriormente, às vezes usamos erros para verificar se um ViewState gerado é válido. O ASP.NET não mostra o erro de validação MAC por padrão quando um parâmetro `__VIEWSTATEGENERATOR` inválido é usado. Esse comportamento muda quando a propriedade `ViewStateUserKey` é usada, pois o ASP.NET não suprime mais os erros de validação MAC.
Além disso, as aplicações web ASP.NET podem ignorar os erros de validação MAC com a seguinte configuração, mesmo quando a propriedade `ViewStateUserKey` é usada:
Se os atacantes puderem **alterar** o arquivo **`web.config`** na raiz de uma aplicação, eles podem **executar facilmente código** no servidor. No entanto, incorporar uma porta dos fundos furtiva na aplicação pode ser uma boa escolha para um atacante. Isso pode ser feito **desabilitando a validação MAC** e definindo a propriedade `viewStateEncryptionMode` como `Always`. Isso significa que todas as páginas ASP.NET que não definem a propriedade `ViewStateEncryptionMode` como `Auto` ou `Never` sempre usam parâmetros ViewState criptografados. No entanto, como o **ViewState não usa o recurso de validação MAC, eles agora estão vulneráveis à execução remota de código por meio da desserialização de dados não confiáveis**. O seguinte mostra um exemplo:
- 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**? 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)
- **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 [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.