Saltar al contenido
Portada » Blog – Laprovittera Carlos » TryHackMe CompTIA Pentest+ Linux Privilege Escalation

TryHackMe CompTIA Pentest+ Linux Privilege Escalation

Hola hacketones! Bienvenidos a un nuevo CTF veremos: TryHackMe CompTIA Pentest+ Linux Privilege Escalation

Aprende los fundamentos de la escalada de privilegios en Linux. Desde la enumeración hasta la explotación, practica con más de 8 técnicas diferentes de escalada de privilegios.

Tarea 1 Introducción

La escalada de privilegios es un proceso complejo. No existen soluciones mágicas y depende en gran medida de la configuración específica del sistema objetivo. La versión del kernel, las aplicaciones instaladas, los lenguajes de programación compatibles y las contraseñas de otros usuarios son algunos de los elementos clave que influirán en el acceso a la shell de root.

Esta sala se diseñó para cubrir los principales vectores de escalada de privilegios y brindar una mejor comprensión del proceso. Esta nueva habilidad será fundamental, ya sea que participe en CTF, realice exámenes de certificación o trabaje como probador de penetración.

Tarea 2 ¿Qué es la escalada de privilegios?

¿Qué significa «escalada de privilegios»?

En esencia, la escalada de privilegios suele implicar pasar de una cuenta con permisos inferiores a una con permisos superiores. En términos más técnicos, se trata de la explotación de una vulnerabilidad, un fallo de diseño o un error de configuración en un sistema operativo o aplicación para obtener acceso no autorizado a recursos que normalmente están restringidos para los usuarios.

¿Por qué es importante?

En una prueba de penetración real, es raro lograr un acceso inicial que otorgue acceso administrativo directo. La escalada de privilegios es crucial porque permite obtener niveles de acceso de administrador del sistema, lo que posibilita realizar acciones como:

  • Restablecer contraseñas
  • Eludir los controles de acceso para comprometer datos protegidos
  • Configuraciones de software de edición
  • Habilitar la persistencia
  • Modificar los privilegios de los usuarios existentes (o nuevos)
  • Ejecutar cualquier comando administrativo

Tarea 3 Enumeración

Arrancar la máquina

Nota: Inicie la máquina de destino asociada a esta tarea para seguir los pasos.

Puedes iniciar la máquina de destino y acceder a ella directamente desde tu navegador.

Alternativamente, puede acceder a él a través de SSH con las credenciales de usuario de bajos privilegios que se indican a continuación:

Nombre de usuario: karen

Contraseña: Password1

La enumeración es el primer paso que debes dar una vez que accedas a un sistema. Es posible que hayas accedido al sistema explotando una vulnerabilidad crítica que te otorgó acceso de administrador o simplemente encontrando una manera de enviar comandos usando una cuenta con pocos privilegios. A diferencia de las máquinas CTF, las pruebas de penetración no terminan una vez que accedes a un sistema o nivel de privilegios de usuario específico. Como verás, la enumeración es tan importante durante la fase posterior a la intrusión como antes.

hostname

El hostname comando devolverá el nombre de host de la máquina de destino. Si bien este valor se puede modificar fácilmente o puede contener una cadena de texto sin sentido (por ejemplo, Ubuntu-3487340239), en algunos casos puede proporcionar información sobre la función del sistema de destino dentro de la red corporativa (por ejemplo, SQL-PROD-01 para un servidor SQL de producción).

uname -a

Imprimirá información del sistema que nos brindará detalles adicionales sobre el núcleo utilizado. Esto será útil al buscar posibles vulnerabilidades del núcleo que podrían conducir a una escalada de privilegios.

/proc/version

El sistema de archivos proc (procfs) proporciona información sobre los procesos del sistema de destino. Encontrarás proc en muchas distribuciones de Linux, lo que lo convierte en una herramienta esencial.

Al consultar esta información, /proc/versionpodrá obtener datos sobre la versión del kernel y otros datos adicionales, como si hay un compilador instalado (por ejemplo, GCC).

/etc/issue

Los sistemas también pueden identificarse examinando el /etc/issuearchivo. Este archivo suele contener información sobre el sistema operativo, pero puede personalizarse o modificarse fácilmente. De hecho, cualquier archivo que contenga información del sistema puede personalizarse o modificarse. Para comprender mejor el sistema, siempre es recomendable revisar todos estos archivos.

Comando ps

Este ps comando es una forma eficaz de ver los procesos en ejecución en un sistema Linux. Al escribirlo ps en la terminal, se mostrarán los procesos de la sesión actual.

La salida del ps (Estado del proceso) mostrará lo siguiente:

  • PID: El identificador del proceso (único para cada proceso)
  • TTY: Tipo de terminal utilizado por el usuario
  • Tiempo: Cantidad de tiempo de CPU utilizado por el proceso (este NO es el tiempo que el proceso ha estado en ejecución).
  • CMD: El comando o ejecutable en ejecución (NO mostrará ningún parámetro de línea de comandos)

El comando “ps” ofrece algunas opciones útiles.

  • ps -A: Ver todos los procesos en ejecución
  • ps axjf: Ver árbol de procesos (vea la formación del árbol hasta que ps axjfse ejecute a continuación)
  • ps auxEsta aux opción mostrará los procesos de todos los usuarios (a), el usuario que inició el proceso (u) y los procesos que no están conectados a una terminal (x). Al analizar la salida del comando `ps aux`, podemos comprender mejor el sistema y sus posibles vulnerabilidades.

Entorno

El env comando mostrará las variables de entorno.

La variable PATH puede contener un compilador o un lenguaje de scripting (por ejemplo, Python) que podría utilizarse para ejecutar código en el sistema de destino o aprovecharse para la escalada de privilegios.

sudo -l

El sistema de destino puede estar configurado para permitir a los usuarios ejecutar algunos (o todos) los comandos con privilegios de root. El sudo -l comando se puede usar para listar todos los comandos que su usuario puede ejecutar usando sudo.

ls

Uno de los comandos comunes utilizados en Linux es probablemente ls.

Al buscar posibles vectores de escalada de privilegios, recuerde usar siempre el ls comando con el -la parámetro. El siguiente ejemplo muestra cómo el archivo “secret.txt” puede pasarse por alto fácilmente usando los  comandos ls o .ls -l

Id

Este id comando proporcionará una visión general del nivel de privilegios del usuario y de su pertenencia a grupos.

Conviene recordar que el id comando también puede utilizarse para obtener la misma información para otro usuario, como se muestra a continuación.

/etc/passwd

Leer el /etc/passwd archivo puede ser una forma sencilla de descubrir usuarios en el sistema.

Si bien el resultado puede ser extenso y un tanto intimidante, se puede recortar fácilmente y convertir en una lista útil para ataques de fuerza bruta.

Recuerda que esto devolverá todos los usuarios, algunos de los cuales son usuarios del sistema o de servicios que no serían muy útiles. Otra opción sería buscar «home» con grep, ya que lo más probable es que los usuarios reales tengan sus carpetas en el directorio «home».

history 

Analizar comandos anteriores con este  history comando puede darnos una idea del sistema objetivo y, aunque rara vez, puede contener información almacenada como contraseñas o nombres de usuario.

ifconfig

El sistema objetivo puede servir como punto de acceso a otra red. El ifconfig comando nos proporcionará información sobre las interfaces de red del sistema. El siguiente ejemplo muestra que el sistema objetivo tiene tres interfaces (eth0, tun0 y tun1). Nuestra máquina atacante puede acceder a la interfaz eth0, pero no puede acceder directamente a las otras dos redes.

Esto se puede confirmar utilizando el ip route comando para ver qué rutas de red existen.

netstat 

Tras una comprobación inicial de las interfaces y rutas de red existentes, conviene analizar las comunicaciones actuales. El netstatcomando puede utilizarse con diversas opciones para obtener información sobre las conexiones existentes.

  • netstat -a: muestra todos los puertos de escucha y las conexiones establecidas.
  • netstat -ato netstat -autambién se puede utilizar para listar los protocolos TCP o UDP, respectivamente.
  • netstat -l: lista los puertos en modo de escucha. Estos puertos están abiertos y listos para aceptar conexiones entrantes. Esto se puede usar con la opción «t» para listar solo los puertos que están escuchando mediante el protocolo TCP (ver más abajo).
  • netstat -s: listar estadísticas de uso de red por protocolo (abajo) Esto también se puede usar con las  opciones -t o para limitar la salida a un protocolo específico.-u
  • netstat -tp: lista las conexiones con el nombre del servicio y la información del PID.

Esto también se puede usar con la -l opción de listar los puertos de escucha (abajo).

Podemos observar que la columna » PID / Nombre del programa» está vacía, ya que este proceso pertenece a otro usuario.

A continuación se muestra el mismo comando ejecutado con privilegios de root y revela esta información como 2641/nc (netcat).

  • netstat -i: Muestra estadísticas de la interfaz. Vemos a continuación que “eth0” y “tun0” están más activas que “tun1”.

El netstat uso que probablemente verá con más frecuencia en publicaciones de blogs, artículos y cursos es netstat -ano el que se puede desglosar de la siguiente manera;

  • -a: Mostrar todos los enchufes
  • -n: No resolver nombres
  • -o: Temporizadores de visualización

Comando de búsqueda

Buscar información importante y posibles vectores de escalada de privilegios en el sistema objetivo puede resultar muy útil. El comando integrado «find» es práctico y conviene tenerlo a mano.

A continuación se muestran algunos ejemplos útiles del comando «find».

Buscar archivos:

  • find . -name flag1.txt: encuentra el archivo llamado “flag1.txt” en el directorio actual.
  • find /home -name flag1.txt: encuentra el archivo llamado “flag1.txt” en el directorio /home
  • find / -type d -name config: encuentra el directorio llamado config en “/”
  • find / -type f -perm 0777: encontrar archivos con permisos 777 (archivos legibles, escribibles y ejecutables por todos los usuarios)
  • find / -perm a=x: buscar archivos ejecutables
  • find /home -user frank: buscar todos los archivos del usuario “frank” en “/home”
  • find / -mtime 10: encontrar archivos que fueron modificados en los últimos 10 días
  • find / -atime 10: encontrar archivos a los que se accedió en los últimos 10 días
  • find / -cmin -60: buscar archivos modificados en la última hora (60 minutos)
  • find / -amin -60: buscar archivos a los que se ha accedido en la última hora (60 minutos)
  • find / -size 50M: encontrar archivos con un tamaño de 50 MB

Este comando también se puede usar con los signos (+) y (-) para especificar un archivo que sea mayor o menor que el tamaño dado.

El ejemplo anterior devuelve archivos de más de 100 MB. Es importante tener en cuenta que el comando «find» suele generar errores, lo que a veces dificulta la lectura de la salida. Por ello, conviene usar el comando «find» con «-type f 2>/dev/null» para redirigir los errores a «/dev/null» y obtener una salida más clara (ver más abajo).

Carpetas y archivos en los que se puede escribir o desde los que se puede ejecutar:

  • find / -writable -type d 2>/dev/null: Buscar carpetas con permisos de escritura para todos los usuarios
  • find / -perm -222 -type d 2>/dev/null: Buscar carpetas con permisos de escritura para todos los usuarios
  • find / -perm -o w -type d 2>/dev/null: Buscar carpetas con permisos de escritura para todos los usuarios

La razón por la que vemos tres comandos «find» diferentes que podrían conducir al mismo resultado se explica en el manual. Como se puede observar a continuación, el parámetro perm afecta al funcionamiento de «find».

  • find / -perm -o x -type d 2>/dev/null : Buscar carpetas ejecutables para todos los usuarios

Encuentra herramientas de desarrollo y lenguajes compatibles:

  • find / -name perl*
  • find / -name python*
  • find / -name gcc*

Encontrar permisos de archivo específicos:

A continuación se muestra un breve ejemplo para encontrar archivos con el bit SUID activado. El bit SUID permite que el archivo se ejecute con el nivel de privilegios de la cuenta propietaria, en lugar de la cuenta que lo ejecuta. Esto abre una interesante vía de escalada de privilegios, que veremos con más detalle en la tarea 6. El siguiente ejemplo se proporciona para completar el tema del comando «find».

  • find / -perm -u=s -type f 2>/dev/null: Busca archivos con el bit SUID, que nos permite ejecutar el archivo con un nivel de privilegios superior al del usuario actual.

Comandos generales de Linux

Dado que nos encontramos en el entorno Linux, familiarizarse con los comandos de Linux en general será muy útil. Por favor, dedique algo de tiempo a familiarizarse con comandos como find, locate, grep, cut, sort, etc.

Responda las siguientes preguntas

¿Cuál es el nombre de host del sistema de destino?

wade7363

¿Cuál es la versión del kernel de Linux del sistema de destino?

3.13.0-24-generic

¿Qué versión de Linux es esta?

Ubuntu 14.04 LTS

¿Qué versión del lenguaje Python está instalada en el sistema?

2.7.6

¿Qué vulnerabilidad parece afectar al núcleo del sistema objetivo? (Introduzca un número CVE)

CVE-2015-1328

Tarea 4Herramientas de enumeración automatizadas

Varias herramientas pueden ayudarte a ahorrar tiempo durante el proceso de enumeración. Estas herramientas solo deben usarse para ahorrar tiempo, teniendo en cuenta que podrían pasar por alto algunos vectores de escalada de privilegios. A continuación, se presenta una lista de herramientas populares de enumeración de Linux con enlaces a sus respectivos repositorios de GitHub.

El entorno del sistema de destino influirá en la herramienta que podrás usar. Por ejemplo, no podrás ejecutar una herramienta escrita en Python si no está instalada en el sistema de destino. Por eso, es mejor familiarizarse con varias herramientas en lugar de usar solo una.

Tarea 5 Escalada de privilegios: Exploits del kernel

Nota: Inicie la máquina de destino asociada a esta tarea para seguir los pasos.

Puedes iniciar la máquina de destino y acceder a ella directamente desde tu navegador.

Alternativamente, puede acceder a él a través de SSH con las credenciales de usuario de bajos privilegios que se indican a continuación:

Nombre de usuario: karen

Contraseña: Password1

Idealmente, la escalada de privilegios conduce a obtener privilegios de administrador. Esto a veces se puede lograr simplemente explotando una vulnerabilidad existente o, en algunos casos, accediendo a otra cuenta de usuario que tenga más privilegios, información o acceso.

A menos que una sola vulnerabilidad conduzca a una shell de root, el proceso de escalada de privilegios dependerá de configuraciones incorrectas y permisos laxos.

El núcleo de los sistemas Linux gestiona la comunicación entre componentes como la memoria del sistema y las aplicaciones. Esta función crítica requiere que el núcleo tenga privilegios específicos; por lo tanto, una vulnerabilidad explotada con éxito podría otorgar privilegios de administrador.

La metodología de explotación del kernel es sencilla;

  1. Identifique la versión del kernel
  2. Busca y encuentra un código de explotación para la versión del kernel del sistema objetivo.
  3. Ejecuta el exploit

Aunque parezca sencillo, recuerde que un ataque fallido al kernel puede provocar un fallo del sistema. Asegúrese de que este posible resultado sea aceptable dentro del alcance de su prueba de penetración antes de intentar un ataque al kernel.

Fuentes de investigación:

  1. En función de tus hallazgos, puedes usar Google para buscar un código de explotación existente.
  2. También pueden resultar útiles fuentes como https://www.cvedetails.com/ .
  3. Otra alternativa sería utilizar un script como LES ( Linux Exploit Suggester), pero recuerde que estas herramientas pueden generar falsos positivos (informar sobre una vulnerabilidad del kernel que no afecta al sistema objetivo) o falsos negativos (no informar sobre ninguna vulnerabilidad del kernel aunque este sea vulnerable).

Sugerencias/Notas:

  1. Ser demasiado específico sobre la versión del kernel al buscar exploits en Google, Exploit-db o searchsploit.
  2. Asegúrate de comprender cómo funciona el código de explotación ANTES de ejecutarlo. Algunos códigos de explotación pueden modificar el sistema operativo, lo que los haría vulnerables o provocaría cambios irreversibles que generarían problemas posteriormente. Si bien esto puede no ser un gran problema en un entorno de laboratorio o CTF, es absolutamente inaceptable durante una prueba de penetración real.
  3. Algunos exploits pueden requerir interacción adicional una vez ejecutados. Lea todos los comentarios e instrucciones que acompañan al código del exploit.
  4. Puedes transferir el código de explotación desde tu máquina al sistema objetivo utilizando el SimpleHTTPServer módulo de Python y wget respectivamente.

Responda las siguientes preguntas

Encontrar y utilizar la vulnerabilidad del kernel adecuada para obtener privilegios de administrador en el sistema objetivo.

Respuesta correcta

¿Cuál es el contenido del archivo flag1.txt?

THM-28392872729920

Tarea 6 Escalada de privilegios: Sudo

Arrancar la máquina

Nota: Inicie la máquina de destino asociada a esta tarea para seguir los pasos.

Puedes iniciar la máquina de destino y acceder a ella directamente desde tu navegador.

Alternativamente, puede acceder a él a través de SSH con las credenciales de usuario de bajos privilegios que se indican a continuación:

Nombre de usuario: karen

Contraseña: Contraseña1

El comando sudo, por defecto, permite ejecutar un programa con privilegios de administrador. En ciertas circunstancias, los administradores del sistema pueden necesitar otorgar cierta flexibilidad a los usuarios habituales en cuanto a sus privilegios. Por ejemplo, un analista junior del SOC podría necesitar usar Nmap con frecuencia, pero no tendría acceso completo como administrador. En este caso, el administrador del sistema puede permitir que este usuario ejecute Nmap únicamente con privilegios de administrador, manteniendo su nivel de privilegios habitual en el resto del sistema.

Cualquier usuario puede comprobar su situación actual en relación con los privilegios de root mediante el sudo -lcomando.

https://gtfobins.github.io/ es una valiosa fuente que proporciona información sobre cómo se puede utilizar cualquier programa en el que tengas permisos de superusuario (sudo).

Aprovechar las funciones de la aplicación

Algunas aplicaciones no tendrán ninguna vulnerabilidad conocida en este contexto. Un ejemplo de ello es el servidor Apache2.

En este caso, podemos usar un «truco» para filtrar información aprovechando una función de la aplicación. Como puede ver a continuación, Apache2 tiene una opción que admite la carga de archivos de configuración alternativos ( -f: especifique un ServerConfigFile alternativo).

Si se carga el /etc/shadow  utilizando esta opción, aparecerá un mensaje de error que incluirá la primera línea del /etc/shadow

Aprovechar LD_PRELOAD

En algunos sistemas, es posible que vea la opción de entorno LD_PRELOAD.

LD_PRELOAD es una función que permite a cualquier programa usar bibliotecas compartidas. Esta entrada de blog le dará una idea de las capacidades de LD_PRELOAD. Si la opción «env_keep» está habilitada, podemos generar una biblioteca compartida que se cargará y ejecutará antes de que se ejecute el programa. Tenga en cuenta que la opción LD_PRELOAD se ignorará si el ID de usuario real es diferente del ID de usuario efectivo.

Los pasos de este vector de escalada de privilegios se pueden resumir de la siguiente manera:

  1. Comprobar LD_PRELOAD (con la opción env_keep)
  2. Escribe un código C sencillo compilado como un archivo de objeto compartido (.so).
  3. Ejecute el programa con permisos de superusuario y la opción LD_PRELOAD apuntando a nuestro archivo .so.

El código C simplemente generará una consola de root y se puede escribir de la siguiente manera:

#include <stdio.h>

#include <sys/types.h>

#include <stdlib.h>

void _init() {

unsetenv(«LD_PRELOAD»);

setgid(0);

setuid(0);

system(«/bin/bash»);

}

Podemos guardar este código como shell.c y compilarlo usando gcc en un archivo de objeto compartido usando los siguientes parámetros;

gcc -fPIC -shared -o shell.so shell.c -nostartfiles

Ahora podemos usar este archivo de objeto compartido al ejecutar cualquier programa que nuestro usuario pueda ejecutar con sudo. En nuestro caso, podemos usar Apache2, find o casi cualquier programa que podamos ejecutar con sudo.

Necesitamos ejecutar el programa especificando la opción LD_PRELOAD, como sigue:

sudo LD_PRELOAD=/home/user/ldpreload/shell.so find

Esto dará como resultado la apertura de una consola con privilegios de root.

Responda las siguientes preguntas

¿Cuántos programas puede ejecutar el usuario «karen» en el sistema de destino con permisos de sudo?

¿Cuál es el contenido del archivo flag2.txt?

THM-402028394

¿Cómo usarías Nmap para generar una consola de root si tu usuario tuviera permisos de sudo en nmap?

sudo nmap –interactive

¿Cuál es el hash de la contraseña de Frank?

$6$2.sUUDsOLIpXKxcr$eImtgFExyr2ls4jsghdD3DHLHHP9X50Iv.jNmwo/BJpphrPRJWjelWEz2HH.joV14aDEwW1c3CahzB1uaqeLR1:18796:0:99999:7:::

Tarea 7 Escalada de privilegios: SUID

Arranque la máquina

Nota: Inicie la máquina de destino asociada a esta tarea para seguir los pasos.

Puedes iniciar la máquina de destino y acceder a ella directamente desde tu navegador.

Alternativamente, puede acceder a él a través de SSH con las credenciales de usuario de bajos privilegios que se indican a continuación:

Nombre de usuario: karen

Contraseña: Contraseña1

Gran parte del control de privilegios de Linux se basa en controlar las interacciones entre usuarios y archivos. Esto se hace con permisos. A estas alturas, ya sabes que los archivos pueden tener permisos de lectura, escritura y ejecución. Estos se otorgan a los usuarios según sus niveles de privilegio. Esto cambia con SUID (Set-user Identification) y SGID (Set-group Identification). Estos permiten que los archivos se ejecuten con el nivel de permiso del propietario del archivo o del propietario del grupo, respectivamente.

Observarás que estos archivos tienen un bit «s» activado que indica su nivel de permiso especial.

find / -type f -perm -04000 -ls 2>/dev/nullmostrará los archivos que tienen los bits SUID o SGID activados.

Una buena práctica sería comparar los ejecutables de esta lista con GTFOBins ( https://gtfobins.github.io ). Al hacer clic en el botón SUID, se filtrarán los binarios que se sabe que son vulnerables cuando el bit SUID está activado (también puede usar este enlace para obtener una lista prefiltrada:   https://gtfobins.github.io/#+suid ).

La lista anterior muestra que nano tiene el bit SUID activado. Desafortunadamente, GTFObins no nos ofrece una solución fácil. Como suele ocurrir en los escenarios reales de escalada de privilegios, necesitaremos encontrar pasos intermedios que nos permitan aprovechar cualquier hallazgo, por mínimo que sea.

Nota : La máquina virtual adjunta tiene otro binario con SUID distinto de nano.

El bit SUID establecido para el editor de texto nano nos permite crear, editar y leer archivos usando el privilegio del propietario del archivo. Nano es propiedad de root, lo que probablemente significa que podemos leer y editar archivos con un nivel de privilegio superior al de nuestro usuario actual. En esta etapa, tenemos dos opciones básicas para la escalada de privilegios: leer el /etc/shadowarchivo o agregar nuestro usuario a /etc/passwd.

A continuación se muestran pasos sencillos utilizando ambos vectores.

leyendo el /etc/shadowarchivo

Vemos que el editor de texto nano tiene el bit SUID establecido ejecutando el find / -type f -perm -04000 -ls 2>/dev/nullcomando.

nano /etc/shadowimprimirá el contenido del /etc/shadowarchivo. Ahora podemos usar la herramienta unshadow para crear un archivo que John the Ripper pueda descifrar. Para lograr esto, unshadow necesita los archivos /etc/shadowy ./etc/passwd

A continuación se muestra cómo usar la herramienta para eliminar sombras;

unshadow passwd.txt shadow.txt > passwords.txt

Con la lista de palabras correcta y un poco de suerte, John the Ripper puede devolver una o varias contraseñas en texto plano. Para obtener información más detallada sobre John the Ripper, visite   https://tryhackme.com/room/johntheripperbasics .

La otra opción sería añadir un nuevo usuario con privilegios de administrador. Esto nos ayudaría a evitar el tedioso proceso de descifrado de contraseñas. A continuación, se muestra una forma sencilla de hacerlo:

Necesitaremos el valor hash de la contraseña que queremos que tenga el nuevo usuario. Esto se puede hacer rápidamente usando la herramienta openssl en Kali Linux.

A continuación, añadiremos esta contraseña junto con el nombre de usuario al /etc/passwd archivo.

Una vez que se agregue nuestro usuario (tenga en cuenta cómo root:/bin/bashse utilizó para proporcionar una shell de root), necesitaremos cambiar a este usuario y, con suerte, tendremos privilegios de root.

Ahora te toca a ti usar las habilidades que acabas de aprender para encontrar un binario vulnerable.

Responda las siguientes preguntas

¿Qué usuario comparte el nombre de un gran escritor de cómics?

gerryconway:

¿Cuál es la contraseña del usuario2?

Password1

¿Cuál es el contenido del archivo flag3.txt?

THM-3847834

Tarea 8 Escalada de privilegios: Capacidades

Nota: Inicie la máquina de destino asociada a esta tarea para seguir los pasos.

Puedes iniciar la máquina de destino y acceder a ella directamente desde tu navegador.

Alternativamente, puede acceder a él a través de SSH con las credenciales de usuario de bajos privilegios que se indican a continuación:

Nombre de usuario: karen

Contraseña: Contraseña1

Otro método que los administradores de sistemas pueden usar para aumentar el nivel de privilegios de un proceso o binario son las «Capacidades». Las capacidades ayudan a gestionar los privilegios a un nivel más granular. Por ejemplo, si el analista del SOC necesita usar una herramienta que requiere iniciar conexiones de socket, un usuario normal no podría hacerlo. Si el administrador del sistema no quiere otorgar privilegios superiores a este usuario, puede cambiar las capacidades del binario. Como resultado, el binario podrá completar su tarea sin necesidad de un usuario con privilegios superiores.

La página man de capacidades proporciona información detallada sobre su uso y opciones.

Podemos usar la getcap herramienta para listar las capacidades habilitadas.

Al ejecutarse como un usuario sin privilegios, getcap -r /se generarán muchísimos errores, por lo que es recomendable redirigir los mensajes de error a /dev/null.

Tenga en cuenta que ni vim ni su copia tienen el bit SUID activado. Por lo tanto, este vector de escalada de privilegios no se detecta al enumerar archivos buscando SUID.

GTFObins tiene una buena lista de binarios que se pueden aprovechar para la escalada de privilegios si encontramos alguna capacidad predefinida.

Observamos que vim se puede usar con el siguiente comando y carga útil:

Esto iniciará una consola de administrador como se muestra a continuación;

Responda las siguientes preguntas


¿Cuántos binarios tienen capacidades definidas?

6

¿Qué otro binario se puede utilizar a través de sus capacidades?

view

¿Cuál es el contenido del archivo flag4.txt?

THM-9349843

Tarea 9 Escalada de privilegios: Tareas programadas (Cron Jobs)

Arranque la máquina

Nota: Inicie la máquina de destino asociada a esta tarea para seguir los pasos.

Puedes iniciar la máquina de destino y acceder a ella directamente desde tu navegador.

Alternativamente, puede acceder a él a través de SSH con las credenciales de usuario de bajos privilegios que se indican a continuación:

Nombre de usuario: karen

Contraseña: Contraseña1

Los trabajos cron se utilizan para ejecutar scripts o binarios en momentos específicos. Por defecto, se ejecutan con los privilegios de sus propietarios y no del usuario actual. Si bien los trabajos cron correctamente configurados no son inherentemente vulnerables, pueden proporcionar un vector de escalada de privilegios en algunas condiciones.

La idea es bastante simple: si hay una tarea programada que se ejecuta con privilegios de root y podemos cambiar el script que se ejecutará, entonces nuestro script se ejecutará con privilegios de root.

Las configuraciones de los trabajos cron se almacenan como crontabs (tablas cron) para ver la próxima hora y fecha en que se ejecutará la tarea.

Cada usuario en el sistema tiene su archivo crontab y puede ejecutar tareas específicas tanto si ha iniciado sesión como si no. Como puede esperar, nuestro objetivo será encontrar un trabajo cron establecido por root y hacer que ejecute nuestro script, idealmente un shell.

Cualquier usuario puede leer el archivo que mantiene los trabajos cron de todo el sistema en /etc/crontab

Si bien las máquinas CTF pueden tener trabajos cron ejecutándose cada minuto o cada 5 minutos, es más común ver tareas que se ejecutan diaria, semanal o mensualmente en los ejercicios de pruebas de penetración.

Como puede ver, el backup.shscript se configuró para ejecutarse cada minuto. El contenido del archivo muestra un script sencillo que crea una copia de seguridad del archivo prices.xls.

Como nuestro usuario actual puede acceder a este script, podemos modificarlo fácilmente para crear una shell inversa, idealmente con privilegios de root.

El script utilizará las herramientas disponibles en el sistema objetivo para iniciar una shell inversa.

Dos puntos a tener en cuenta:

  1. La sintaxis del comando variará según las herramientas disponibles. (Por ejemplo, ncprobablemente no admita la -eopción que haya visto en otros casos).
  2. Siempre debemos optar por iniciar con shells inversas, ya que no queremos comprometer la integridad del sistema durante una prueba de penetración real.

El archivo debería tener este aspecto;

Ahora pondremos en marcha un programa de escucha en nuestra máquina atacante para recibir la conexión entrante.

Siempre conviene revisar Crontab, ya que a veces puede facilitar la escalada de privilegios. El siguiente escenario es frecuente en empresas que no cuentan con un cierto nivel de madurez en ciberseguridad:

  1. Los administradores de sistemas necesitan ejecutar un script a intervalos regulares.
  2. Crean una tarea programada (cron job) para hacer esto.
  3. Después de un tiempo, el script se vuelve inútil y lo eliminan.
  4. No limpian la tarea programada correspondiente.

Este problema de gestión de cambios conlleva una posible vulnerabilidad que aprovecha las tareas programadas (cron jobs).

El ejemplo anterior muestra una situación similar en la que se eliminó el script antivirus.sh, pero la tarea programada (cron job) aún existe.

Si no se define la ruta completa del script (como ocurrió con el script backup.sh), cron utilizará las rutas especificadas en la variable PATH del archivo /etc/crontab. En este caso, deberíamos poder crear un script llamado “antivirus.sh” en la carpeta de inicio del usuario y este debería ejecutarse mediante la tarea programada.

El archivo en el sistema de destino debería resultarle familiar:

La conexión entrante de shell inversa tiene privilegios de root:

En el improbable caso de que encuentres un script o tarea existente asociada a una tarea programada (cron job), siempre vale la pena dedicar tiempo a comprender la función del script y cómo se utiliza cada herramienta en ese contexto. Por ejemplo, herramientas como tar, 7z y rsync pueden ser explotadas mediante su función de comodines.

Responda las siguientes preguntas

¿Cuántas tareas programadas (cron jobs) definidas por el usuario puede ver en el sistema de destino?

4

¿Cuál es el contenido del archivo flag5.txt?

THM-383000283

¿Cuál es la contraseña de Matt?

123456

Tarea 10 Escalada de privilegios: PATH

Nota: Inicie la máquina de destino asociada a esta tarea para seguir los pasos.

Puedes iniciar la máquina de destino y acceder a ella directamente desde tu navegador.

Alternativamente, puede acceder a él a través de SSH con las credenciales de usuario de bajos privilegios que se indican a continuación:

Nombre de usuario: karen

Contraseña: Contraseña1

Si una carpeta para la que su usuario tiene permisos de escritura se encuentra en la ruta, podría potencialmente secuestrar una aplicación para ejecutar un script. En Linux, PATH es una variable de entorno que le indica al sistema operativo dónde buscar archivos ejecutables. Para cualquier comando que no esté integrado en el intérprete de comandos o que no esté definido con una ruta absoluta, Linux comenzará a buscar en las carpetas definidas en PATH. (PATH es la variable de entorno a la que nos referimos aquí, ruta es la ubicación de un archivo).

Normalmente, la variable PATH tendrá este aspecto:

Si escribimos “ thm ” en la línea de comandos, Linux buscará un ejecutable llamado thm en las siguientes ubicaciones . El siguiente ejemplo ilustra cómo se puede aprovechar esto para aumentar nuestro nivel de privilegios. Como verá, esto depende completamente de la configuración del sistema, así que asegúrese de poder responder las preguntas a continuación antes de intentarlo.

  1. ¿Qué carpetas se encuentran en $PATH?
  2. ¿Tiene su usuario actual permisos de escritura para alguna de estas carpetas?
  3. ¿Puedes modificar $PATH?
  4. ¿Existe algún script o aplicación que se vea afectada por esta vulnerabilidad?

Para fines de demostración, utilizaremos el siguiente script:

Este script intenta ejecutar un binario del sistema llamado “ thm ”, pero el ejemplo se puede replicar fácilmente con cualquier binario.

Compilamos esto en un archivo ejecutable y activamos el bit SUID.

Nuestro usuario ahora tiene acceso al script «path» con el bit SUID activado.

Una vez ejecutado, “path” buscará un archivo ejecutable llamado “ thm ” dentro de las carpetas listadas en PATH.

Si alguna carpeta con permisos de escritura aparece en PATH, podríamos crear un binario llamado thm en ese directorio y ejecutarlo con nuestro script «path». Como el bit SUID está activado, este binario se ejecutará con privilegios de root.

Se puede realizar una búsqueda sencilla de carpetas con permisos de escritura mediante el find / -writable 2>/dev/nullcomando “ ”. El resultado de este comando se puede limpiar mediante una sencilla secuencia de corte y ordenación.

Algunos escenarios CTF pueden presentar carpetas diferentes, pero un sistema normal generaría algo como lo que vemos arriba.

Comparar esto con la variable PATH nos ayudará a encontrar carpetas que podríamos utilizar.

Observamos varias carpetas en /usr, por lo que podría ser más sencillo ejecutar nuestra búsqueda de carpetas con permisos de escritura una vez más para abarcar las subcarpetas.

Una alternativa podría ser el comando que aparece a continuación.

find / -writable 2>/dev/null | cut -d «/» -f 2,3 | grep -v proc | sort -u

Hemos añadido “grep -v proc” para eliminar los numerosos resultados relacionados con los procesos en ejecución.

Lamentablemente, las subcarpetas dentro de /usr no son modificables.

La carpeta en la que será más fácil escribir es probablemente /tmp. En este punto, como /tmp no está presente en PATH, tendremos que agregarla. Como podemos ver a continuación, el export PATH=/tmp:$PATHcomando “ ” logra esto.

En este punto, el script de ruta también buscará en la carpeta /tmp un ejecutable llamado “ thm ”.

Crear este comando es bastante fácil copiando /bin/bash como “ thm ” dentro de la carpeta /tmp.

Hemos otorgado permisos de ejecución a nuestra copia de /bin/bash; tenga en cuenta que, a partir de ahora, se ejecutará con los permisos de nuestro usuario. Lo que posibilita una escalada de privilegios en este contexto es que el script path se ejecuta con privilegios de root.

Responda las siguientes preguntas

¿Cuál es la carpeta inusual para la que tienes permisos de escritura?

/home/murdoch

¿Cuál es el contenido del archivo flag6.txt?

THM-736628929

Tarea 11 Escalada de privilegios: NFS

Nota: Inicie la máquina de destino asociada a esta tarea para seguir los pasos.

Puedes iniciar la máquina de destino y acceder a ella directamente desde tu navegador.

Alternativamente, puede acceder a él a través de SSH con las credenciales de usuario de bajos privilegios que se indican a continuación:

Nombre de usuario: karen

Contraseña: Contraseña1

Los vectores de escalada de privilegios no se limitan al acceso interno. Las carpetas compartidas y las interfaces de administración remota como SSH y Telnet también pueden ayudar a obtener acceso de root en el sistema objetivo. Algunos casos requerirán el uso de ambos vectores, por ejemplo, encontrar una clave privada SSH de root en el sistema objetivo y conectarse a través de SSH con privilegios de root en lugar de intentar aumentar el nivel de privilegios del usuario actual.

Otro vector más relevante para los CTF y los exámenes es una shell de red mal configurada. Este vector a veces se puede observar durante las pruebas de penetración cuando hay un sistema de respaldo de red presente.

La configuración de NFS (Network File Sharing) se guarda en el archivo /etc/exports. Este archivo se crea durante la instalación del servidor NFS y normalmente puede ser leído por los usuarios.

El elemento clave para este vector de escalada de privilegios es la opción «no_root_squash» que se muestra arriba. Por defecto, NFS cambia el usuario root a nfsnobody y elimina cualquier archivo que opere con privilegios de root. Si la opción «no_root_squash» está presente en un recurso compartido con permisos de escritura, podemos crear un ejecutable con el bit SUID activado y ejecutarlo en el sistema objetivo.

Comenzaremos enumerando los recursos compartidos montables desde nuestra máquina atacante.

Montaremos uno de los recursos compartidos «no_root_squash» en nuestra máquina atacante y comenzaremos a compilar nuestro ejecutable.

Como podemos configurar los bits SUID, un simple ejecutable que ejecute /bin/bash en el sistema de destino será suficiente.

Una vez compilado el código, activaremos el bit SUID.

Como se puede observar a continuación, ambos archivos (nfs.c y nfs) están presentes en el sistema de destino. Hemos trabajado con el recurso compartido montado, por lo que no fue necesario transferirlos.

Observe que el ejecutable nfs tiene el bit SUID activado en el sistema de destino y se ejecuta con privilegios de root.

Responda las siguientes preguntas

¿Cuántos recursos compartidos montables puede identificar en el sistema de destino?

3

¿Cuántas acciones tienen habilitada la opción «no_root_squash»?

3

¿Cuál es el contenido del archivo flag7.txt?

THM-89384012

Tarea 12 Desafío final

Arranque la máquina

A estas alturas ya tienes un conocimiento bastante bueno de los principales vectores de escalada de privilegios en Linux y este desafío debería ser bastante fácil.

Has obtenido acceso SSH a una gran instalación científica. Intenta elevar tus privilegios hasta convertirte en root.

Hemos diseñado esta sala para ayudarte a desarrollar una metodología completa para la escalada de privilegios en Linux , que te será muy útil en exámenes como el OSCP y en tus pruebas de penetración.

No deje sin explorar ningún vector de escalada de privilegios; la escalada de privilegios suele ser más un arte que una ciencia.

Puedes acceder a la máquina de destino a través de tu navegador o usar las credenciales SSH que se indican a continuación.

  • Nombre de usuario: Leonard
  • Contraseña: Penny123

Responda las siguientes preguntas

¿Cuál es el contenido del archivo flag1.txt?

THM-42828719920544

¿Cuál es el contenido del archivo flag2.txt?

THM-168824782390238

Sigan entrenando, Hacketones, Nos vemos en el próximo laboratorio!!!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *