Kenobi - TryHackMe
Hoy vamos a resolver la máquina Kenobi de TryHackMe. Esta es una máquina fácil tanto en la intrusión como en la escalada de privilegios, por lo que no supondrá ninguna complicación a la hora de realizarla.
Fase De Reconocimiento
Primeramente, vamos a utilizar la herramienta Nmap para determinar que puertos están abiertos, así como identificar la versión y servicios que corren en el activo.
Para determinar que puertos están abiertos podemos realizar lo siguiente:
nmap -p- --open -T5 -v -n <dirección IP>
En caso de que el escaneo tarde demasiado en completar, tenemos esta otra alternativa:
sudo nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn <dirección IP>
A continuación se explican los parámetros utilizados en el escaneo de puertos con Nmap:
Parámetro | Explicación |
---|---|
-p- | Escanea todo el rango de puertos (65535 en total) |
--open | Nos indica todos aquellos puertos que están abiertos (o posiblemente abiertos) |
-T5 | La plantilla de temporizado nos permite agilizar nuestro escaneo, este valor puede ir desde 0 hasta 5, cabe aclarar que a mayor sea el valor de la plantilla, “generaremos más ruido”, pero no pasa nada ¿no? Al fin y al cabo estamos practicando en un entorno controlado y aquí somos todos White Hat |
-v | Verbose, reporta lo encontrado por consola |
-n | No aplicar resolución DNS |
-sS | Escaneo TCP SYN |
-min-rate | Emitir paquetes no más lentos que <valor> por segundo |
-vvv | Triple verbose, para obtener mayor información por consola |
-Pn | No aplicar host discovery |
nmap -sC -sV -p 21,22,80,111,139,445,2049,35049,41843,47869,50933 <dirección IP>
A continuación se explican los parámetros utilizados en el escaneo de versiones y servicios con Nmap:
Parámetro | Explicación |
---|---|
-sC | Scripts básicos de enumeración |
-sV | Versión y servicios que corren bajo los puertos encontrados |
-p | Especificamos que puertos queremos analizar (los que encontramos abiertos en el paso anterior) |
Con estos dos escaneos bastaría para responder a dos de las preguntas planteadas:
- ¿Cuántos puertos abiertos existen?
- ¿En qué puerto está corriendo el protocolo FTP?
- ¿Cuál es la versión del servicio ProFTPD que se está corriendo?
Para responder a estas dos últimas preguntas solo tenemos que revisar el escaneo de versiones y servicios que realizamos con Nmap; por otra parte, la primera pregunta tiene algo de trampa, ya que la respuesta correcta es 7
puertos abiertos, mientras que con nuestro escaneo detectamos 11
, ¿qué hicimos mal?
Nada, lo que sucede es que nosotros al indicar el parámetro -p-
, estamos escaneando todo el rango de puertos, si no indicáramos este parámetro, Nmap escanearía únicamente los 1000
puertos más comunes, por lo que vemos que TryHackMe no se dio la molestia de escanearlo todo por completo.
Habiendo aclarado esto, los puertos abiertos más relevantes que encontramos son el 139
y el 445
, ambos relacionados con el protocolo SMB
(Server Message Block), el puerto 111
relacionado con el servicio rpcbind
, relacionado a su vez con RPC
(Remote Procedure Call), y el puerto 21
relacionado con el protocolo FTP
(File Transfer Protocol).
En este punto, TryHackMe nos sugiere usar el propio Nmap para enumerar los recursos compartidos a través de Samba
, que si bien podemos hacerlo, optaremos por usar SMBMap
y smbclient
.
SMBMap
Para poder listar los recursos compartidos haciendo uso de SMBMap
, bastará con indicar la direción IP de la máquina víctima.
smbmap -H <dirección IP>
Lo primero que podemos darnos cuenta es que existen 3
recursos compartidos, de los cuales solo tenemos acceso a uno, anonymous
.
Si decidimos listar de manera recursiva el recurso anonymous
, encontraremos un archivo que lleva por nombre log.txt
, el cual ya levanta nuestras sospechas.
smbmap -H <dirección IP> -R anonymous
Para poder descargar el archivo log.txt
, podremos hacerlo usando tanto su ruta absoluta con el parámetro --download
, o bien creando patrones mediante expresiones regulares con el parámetro -A
.
smbmap -H <dirección IP> --download anonymous/log.txt
smbmap -H <dirección IP> -R anonymous -A log.txt
smbclient
Para poder listar los recursos compartidos haciendo uso de smbclient
tendremos que especificar el parámetro -L
, adicional a ello tendremos que indicar que queremos hacer uso de un null session
con el parámetro -N
, ya que no conocemos credenciales con las cuales autenticarnos; esto con SMBMap
no ocurría ya que por defecto hace uso de un null session
, a no ser que le indiquemos un usuario y contraseña.
smbclient -N -L <dirección IP>
En este caso, no se nos indica los permisos que tenemos sobre los recursos, no obstante, podemos intuir a que recursos tenemos acceso, por ejemplo, el recurso print$ se relaciona con impresoras que se están compartiendo a nivel de red, por otra parte, tenemos el recurso IPC$ el cual crea el propio Windows para poder hacer uso de los null sessions; de modo que, de los 3
recursos compartidos existentes, solo nos queda anonymous
.
Lo siguiente que haremos será listar el contenido que se encuentra dentro del recurso anonymous
.
smbclient -N //dirección IP/anonymous
ls
Podemos observar que dentro existe un archivo llamado log.txt
, el cual procederemos a descargar.
smbclient -N //dirección IP/anonymous
get log.txt
Independientemente de como hayamos descargado el archivo log.txt
, al leerlo, lo más importante que encontraremos será la ubicación del par de claves RSA
, ubicadas en /home/kenobi/.ssh
.
Adicionalmente, encontraremos información tanto del servicio ProFTPD
, como del Samba
, pero nada realmente interesante, por lo que estamos omitiendo algo.
Si recordamos, el puerto 111
, relacionado con rpcbind
, estaba abierto, y lo que nos mostraba nuestro escaneo de versiones y servicios con Nmap, es que en este puerto está corriendo a su vez el protocolo NFS
(Network File System) en el puerto 2049
.
El protocolo NFS
se utiliza principalmente para acceder a archivos compartidos a nivel de red, de manera local. Comprobemos si se está compartiendo algún recurso que podamos montar en nuestro equipo.
sudo showmount -e <dirección IP>
La ruta /var
está siendo compartida a nivel de red, de modo que si lográramos mover algún archivo potencial dentro de esta ruta, y luego la montásemos en nuestro equipo, podríamos visualizar dicho archivo de manera local.
Fase De Explotación
Lo primero que podemos pensar es buscar alguna vulnerabilidad en el servicio ProFTPD
, basado en FTP
(File Transfer Protocol), moviendo así archivos desde el lado del cliente, hacia el servidor.
Para explotar el servicio ProFTPD
, empezaremos buscando algún exploit que se encuentre en Exploit Database, para ello utilizaremos SearchSploit para poder seguir trabajando desde nuestra terminal.
searchsploit ProFTPD 1.3.5
De los 4
exploits que encontramos, nos quedaremos con el último
Concretamente con las líneas 12, 13 y 14.
Las cuales nos permiten hacer justamente lo que nos interesa, copiar un archivo de una ruta (CPFR), a otra (CPTO).
De este modo, si nos conectamos a la máquina víctima a través del puerto 21
, podremos ejecutar estos comandos.
nc <direción IP> 21
SITE CPFR /home/kenobi/.ssh/id_rsa
SITE CPTO /var/tmp/id_rsa
Ya con todo esto, podemos montar la ruta /var
en nuestro equipo, para ello haremos lo siguiente:
sudo mount <dirección IP>:/var /mnt/kenobiNFS
En caso de que tengamos un error similar a este:
Simplemente tendremos que instalar lo siguiente:
sudo apt install nfs-common
Y ya que estamos, podemos también instalar la utilidad para montar archivo de tipo CIFS
, que puede resultarnos de utilidad en algún momento.
sudo apt install cifs-utils
Una vez tenemos montada la ruta /var
en nuestro equipo, procederemos a copiarnos el archivo id_rsa
que movimos con anterioridad haciendo uso de ProFTPD
.
Finalmente, podemos conectarnos a la máquina víctima a través de SSH
sin proporcionar contraseña, ya que tenemos en nuestro poder la clave privada del usuario Kenobi
, no obstante, antes de hacerlo, vamos a asignar los permisos correspondientes al archivo id_rsa
.
sudo chmod 600 id_rsa
ssh -i id_rsa kenobi@<dirección IP>
Escalada De Privilegios
Para realizar esta última fase, la misma plataforma de TryHackMe nos sugiere aprovecharnos de algún binario con permisos mal asignados, concretamente permisos SUID
.
Para listar todos aquellos binarios con permisos SUID
asignados, tenemos varias opciones, no obstante, estas son las que yo utilizo:
find / -perm -4000 -type f -exec ls -la {} 2>/dev/null \;
find / -uid 0 -perm -4000 -type f 2>/dev/null
La forma más sencilla para abusar de algún binario con permisos mal asignados sería recurrir a GTFOBins, sin embargo, el binario que llama nuestra atención no es propio del sistema, por lo que GTFOBins
, no nos será de utilidad.
Si comprobamos en nuestra máquina de atacantes, no existe ningún binario /usr/bin/menu
, por lo que este debe haber sido creado, de modo que puede tener alguna falla de seguridad, vamos a revisarlo.
Vemos que el binario es lo que dice ser, un menú que nos presenta tres únicas posibilidades, vamos a echar un vistazo más a fondo.
strings /usr/bin/menu
Podemos observar los binarios que utiliza este menú dependiendo de la opción que seleccionemos, lo más interesante aquí es que no se está empleando la ruta completa de estos comandos, tan solo se los está mencionando, por lo que, al no hacer esta verificación, podemos suplantarlos.
Antes de que el binario /usr/bin/menu
encuentre los binarios legítimos dentro de la variable de entorno PATH
, nosotros añadiremos nuestros propios binarios en el inicio, los cuales serán igual en nombre, pero ejecutarán el código que nos interese, en este caso una consola con máximos privilegios.
Este proceso podemos realizarlo para cualquiera de los tres binarios, curl, uname o ifconfig, eso si, debemos de encontrarnos en una ruta donde tengamos permisos de escritura, el directorio del usuario Kenobi
, o la ruta /tmp
por ejemplo.
echo '/bin/sh' > uname
export PATH=/home/kenobi:$PATH
chmod +x uname