# Nivel 0-7

### NIVEL 0

Ingresa las credenciales para el Nivel 0:

* **Usuario:** `leviathan0`
* **Contraseña:** `leviathan0`

<figure><img src="/files/BwIUP6DuMP5FgaJvIt43" alt=""><figcaption></figcaption></figure>

A partir de aquí, los niveles no proporcionan instrucciones ni detalles sobre qué hacer o cómo hacerlo. Por lo tanto, solo se verán soluciones.

Al ejecutar `ls`, no se muestra ningún archivo ni directorio. Para visualizar archivos ocultos, usamos el comando `ls -la`. Observamos la presencia del directorio `.backup` y revisamos su contenido. Es probable que este directorio contenga información relevante sobre contraseñas, así que filtramos el contenido en busca de la palabra "password" utilizando `grep`.

<figure><img src="/files/qIkIRMmpg1vjaEnqrCGo" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/I23Aj9ACPK18lmT2opty" alt=""><figcaption></figcaption></figure>

### NIVEL 1

Ingresa las credenciales para el Nivel 1:

* **Usuario:** `leviathan1`
* **Contraseña:** `3QJ3TgzHDq`

<figure><img src="/files/2y0L2VzijvDV7HKRGqz3" alt=""><figcaption></figcaption></figure>

Después de ejecutar el comando `ls`, encontramos un directorio llamado `check`. Procedemos a ejecutar `ltrace ./check`, que muestra las llamadas a librerías y las llamadas al sistema realizadas por el programa.

Al analizar la salida de `ltrace`, observamos que el programa solicita una contraseña con el prompt `"password: "` y compara la entrada con la cadena `"sex"`. Por lo tanto, la contraseña para que nos proporcionen la contraseña del siguiente nivel es `sex`.

<figure><img src="/files/n7GFe3biKRoZt5JG4JgY" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/1utme3xm3pr9tI9CEzEH" alt=""><figcaption></figcaption></figure>

**Nota:** Al realizar el análisis del código, notarás que hay varias palabras aleatorias incluidas intencionadamente para confundir. Estas palabras no son relevantes para la solución del desafío.

### NIVEL 2

Ingresa las credenciales para el Nivel 2:

* **Usuario:** `leviathan2`
* **Contraseña:** `NsN1HwFoyN`

<figure><img src="/files/xAExKXmLxvUzqcfw8SVz" alt=""><figcaption></figcaption></figure>

Al listar los archivos, encontramos un directorio llamado `printfile`. Procedemos a ejecutar el comando `./printfile`.

<figure><img src="/files/bS30iZaCJ4zycafWStpr" alt=""><figcaption></figcaption></figure>

Vamos a crear un directorio temporal y un nuevo archivo de texto que podamos usar para probar el programa con `ltrace`.

<figure><img src="/files/IUti1rTneOBicOwISQmH" alt=""><figcaption></figcaption></figure>

A partir de la salida, podemos identificar una pequeña vulnerabilidad en la manera en que funciona este programa. Si observas detenidamente, notarás que se llaman las funciones `access()` y `/bin/cat` en el archivo de entrada. La función `access()` verifica los permisos basándose en el ID de usuario real del proceso, en lugar del ID de usuario efectivo.

> **Nota:** El ID de usuario real es el propietario del proceso (quién eres realmente), mientras que el ID de usuario efectivo es lo que el sistema operativo utiliza para decidir si tienes permiso para realizar ciertas acciones. Aunque hay algunas excepciones a esta regla.

Al revisar la salida de `ls -la`, vemos que el archivo `printfile` es propiedad de `leviathan3`. Esto significa que `access()` ejecutará el proceso con los privilegios de `leviathan3`.

Además, en el código podemos ver que se utiliza `/bin/cat` para mostrar el contenido del archivo. Mientras que `access()` utiliza la ruta completa del archivo, `/bin/cat` solo utiliza la primera parte del nombre del archivo (esto se debe a la forma en que están configuradas las comillas en el programa). Podemos intentar agregar un espacio en el nombre del archivo, y si nuestra suposición es correcta, `/bin/cat` interpretará el nombre como dos archivos separados.

<figure><img src="/files/dtqkOnjFhlvNdyOxrReY" alt=""><figcaption></figcaption></figure>

Como puedes observar, `/bin/cat` interpreta `"pass file.txt"` como dos archivos separados: `"pass"` y `"file.txt"`. ¡Podemos aprovechar esto! Vamos a crear un enlace simbólico para la parte `"pass"` en `"pass file.txt"` y lo vincularemos a `/etc/leviathan_pass/leviathan3`.

<figure><img src="/files/BwnxTe7xlXGW53Q3Ef0d" alt=""><figcaption></figcaption></figure>

### NIVEL 3

Ingresa las credenciales para el Nivel 3:

* **Usuario:** `leviathan3`
* **Contraseña:** `f0n8h2iWLP`

<figure><img src="/files/eiILWFg6uXk5bAEOI0Wy" alt=""><figcaption></figcaption></figure>

Vemos que tenemos a nuestra disposición.

<figure><img src="/files/QtPOYhFiiohrHSJUVxFO" alt=""><figcaption></figcaption></figure>

Como en el anterior nivel tenemos un ejecutable por lo que vamos a ejecutarlo a ver qué nos sale.

<figure><img src="/files/0q9uZCmEHFuaFIJSP7nG" alt=""><figcaption></figcaption></figure>

Paso lo mismo en el anterior nos requiere una contraseña por lo que ahora ejecutamos `ltrace` para ver que librerías llama este programa.

<figure><img src="/files/XfhmwIKUQsAVDfR3oxiz" alt=""><figcaption></figcaption></figure>

Al revisar la salida de `ltrace`, podemos ver que `strcmp` se llama dos veces. Esto intenta ocultarnos la contraseña principal, pero centrémonos en la que compara nuestra entrada. Vemos que intenta comparar la entrada con `"snlprintf"`; probemos usar esto como la contraseña.

<figure><img src="/files/IxW3JUpwUMjb4ujN4Z5l" alt=""><figcaption></figcaption></figure>

### NIVEL 4

Ingresa las credenciales para el Nivel 4:

* **Usuario:** `leviathan4`
* **Contraseña:** `WG1egElCvO`

<figure><img src="/files/rj2BiAmCZ6PBi9WDm628" alt=""><figcaption></figcaption></figure>

Vemos que tenemos a nuestra disposición.

<figure><img src="/files/DwQipa45gy6nbHMCGFGF" alt=""><figcaption></figcaption></figure>

Tenemos un directorio `.trash` por lo que accedemos a él para ver que contiene.

<figure><img src="/files/x8IasGd6kVTfYpr2CvKj" alt=""><figcaption></figcaption></figure>

Es una salida en binario. Vamos a usar un conversor de binario a ASCII en línea. Yo utilicé esta página para hacer la conversión: [CalculadoraConversor](https://www.calculadoraconversor.com/binario-a-ascii/#google_vignette).&#x20;

<figure><img src="/files/3VdZFocPshtYgWir8L06" alt=""><figcaption></figcaption></figure>

### NIVEL 5

Ingresa las credenciales para el Nivel 5:

* **Usuario:** `leviathan5`
* **Contraseña:** `0dyxT7F4QD`

<figure><img src="/files/PP8nuS21TeEKdLFMfQqx" alt=""><figcaption></figcaption></figure>

Vemos que tenemos a nuestra disposición.

<figure><img src="/files/rD0ZEddAAMpH7Hlba9dy" alt=""><figcaption></figcaption></figure>

Como podemos ver en los niveles anteriores encontramos un ejecutable llamado `leviathan5`.

<figure><img src="/files/YF9upvVKKbqdFgF0hnjq" alt=""><figcaption></figcaption></figure>

Parece que el ejecutable está intentando acceder a un archivo que no existe. Vamos a ejecutar `ltrace` para ver qué se está llamando.

<figure><img src="/files/TOEN5nJ6NuB44WZznnL9" alt=""><figcaption></figcaption></figure>

Parece que el ejecutable está utilizando `fopen` en `/tmp/file.log`. Vamos a crear un enlace simbólico a `/etc/leviathan_pass/leviathan6` y enlazarlo a `/tmp/file.log`.

<figure><img src="/files/pB2LFqjnQgwABSRU3Zr2" alt=""><figcaption></figcaption></figure>

### NIVEL 6

Ingresa las credenciales para el Nivel 6:

* **Usuario:** `leviathan6`
* **Contraseña:** `szo7HDB88w`

<figure><img src="/files/h9lIwY73ZOMn6hvtijFg" alt=""><figcaption></figcaption></figure>

Vemos que tenemos a nuestra disposición.

<figure><img src="/files/IhAZjAvzWDf3gW8abicp" alt=""><figcaption></figcaption></figure>

Como podemos ver en los niveles anteriores encontramos un ejecutable llamado `leviathan6`.

<figure><img src="/files/61r1YNriLGoAB7unZpDG" alt=""><figcaption></figcaption></figure>

Este en particular nos pide ingresar un **PIN** de 4 dígitos. ¡Vamos a intentar hacer un ataque de fuerza bruta! Comenzaremos creando un directorio temporal y abriendo `nano` para escribir un script en **bash**.

<figure><img src="/files/KBwGXGuEuQNphdtrPAnR" alt=""><figcaption></figcaption></figure>

```bash
#!/bin/bash

# Ejecuta un bucle para probar todas las combinaciones de un PIN de 4 dígitos
for pin in {0000..9999}
do
    ~/leviathan6 "$pin"
done
```

Tras esperar un tiempo nos aparece la `shell`.

<figure><img src="/files/pkP8c30hXSDpjQJV0Z1V" alt=""><figcaption></figcaption></figure>

### NIVEL 7

Ingresa las credenciales para el Nivel 7:

* **Usuario:** `leviathan7`
* **Contraseña:** `qEs5Io5yM8`

<figure><img src="/files/54bMHvTahZqosv9PazrB" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ernrXbATgEjTS921EZbM" alt=""><figcaption></figcaption></figure>

### 🎉✨ ¡Misión Cumplida! ✨🎉

¡Hemos conquistado todos los niveles con **éxito rotundo**! 🚀💻


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://beafn28.gitbook.io/beafn28/writeups/overthewire/leviathan/nivel-0-7.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
