
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.
Partes pasadas:
parte 1 ,
parte 2 y
parte 3 .
Información organizacionalEspecialmente 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 22
Después de analizar el código fuente, queda claro que veremos la contraseña si el parámetro GET revelio no está vacío.

Pero en la primera comprobación, si la sesión de administración no está instalada, se nos redirige a esta página sin parámetros.

Solo necesita usar el agente web, no un navegador, por ejemplo curl.


Le quitamos la contraseña.
nivel 23
Analizamos el código fuente. La función strstr (s1, s2) devuelve una subcadena de s1 que comienza con s2. También php automáticamente arroja tipos. Es decir, al compararlo, conducirá la cadena a un número y descartará caracteres adicionales.

La cadena "11iloveyou" será adecuada para nuestra condición. En la primera comprobación, devuelve "iloveyou", es decir, True. En la segunda comprobación, 11> 10, es decir, Verdadero.

nivel 24
Este nivel también contiene un error lógico. La condición es verdadera de todos modos si strcmp devuelve FALSE. Pero strcmp devolverá FALSE incluso en caso de error.

Aunque php convierte tipos automáticamente, no puede convertir una matriz en una cadena. Para hacer esto, abra el código fuente de la página y cambie el nombre del campo de "passwd" a "passwd []".

Enviamos cualquier línea.

Le quitamos la contraseña.
nivel 25
Al analizar el código fuente, lo más interesante es la función logRequest (), que procesa los campos que el usuario puede controlar. Este es el encabezado HTTP de User_Agent y cookie session_id.



Cabe señalar que todas las secuencias "../" se eliminan de la cadena, pero esto se puede hacer mediante: "... /. /" => "../".
Idea de la solución: dado que la ruta para grabar registros depende de session_id, que podemos controlar, y al elegir el idioma de visualización se selecciona la ruta en el servidor, debido a LFI podemos leer el archivo de registro.




Ahora queda escribir la contraseña de / etc / natas_webpass / natas26 en nuestro archivo de registro. Como nuestro Web-Agent primero se graba y luego se genera desde el archivo, agregaremos el código php a este campo.


Obtenemos la contraseña.
nivel 26
En este ejemplo, existe una vulnerabilidad muy grave: la deserialización sin filtro de los objetos. La función unserialize () toma una variable serializada y la convierte de nuevo en un objeto PHP.

Se devuelve el valor convertido, que puede ser entero, flotante, cadena, matriz u objeto. Es decir Puedes ejecutar cualquier código. La clase Logger, cuando se crea, escribe cierta información en el archivo.

La idea es la siguiente:
- Vuelva a escribir la clase Logger, donde en lugar de uno de los mensajes se incluirá un código php que generará una contraseña.
- Codifíquelo en Base64.
- Pegar en galleta.
- Acceda al archivo de registro.
- Quitar contraseña
<?php class Logger{ private $logFile; private $initMsg; private $exitMsg; function __construct($file){ $this->initMsg="<? passthru('cat /etc/natas_webpass/natas27'); ?>"; $this->exitMsg="<? passthru('cat /etc/natas_webpass/natas27'); ?>"; $this->logFile = "img/phpobjinj.php"; } function log($msg){ ; } function __destruct(){ ; } } $obj = new Logger("obj"); echo urlencode(base64_encode(serialize($obj))); ?>



Obtenemos la contraseña.
nivel 27
Este servicio proporciona datos del usuario. Pero si el usuario no existe, lo crea con el nombre de usuario y contraseña especificados.

El problema es que después de crear el usuario, el servicio no verifica su contraseña al iniciar sesión. Al mismo tiempo, solo los primeros 64 caracteres del inicio de sesión y la contraseña después del filtrado caen en la base de datos. No solo eso, sabemos el nombre de usuario: natas28.

Cree un usuario con una contraseña y un nombre vacíos: "natas28_60-spaces_ any-character". (Por lo tanto, durante la verificación, no habrá coincidencia con el usuario natas28, pero durante la creación se filtrará y se agregará a la base de datos. Es decir, la contraseña no se comprobará en la próxima llamada).


Vamos bajo el nombre de natas28 y una contraseña vacía. Obtenemos los datos del usuario natas28.
Continuará Puedes unirte a nosotros en
Telegram .