¿Quieres obtener acceso de superusuario a un sistema Linux? Estas son algunas de las mejores formas de enumerar una máquina Linux.
La enumeración es una de las etapas clave de las pruebas de penetración. Es lo primero que hay que hacer cuando se ha comprometido un sistema objetivo como probador de penetración. Aunque existe una gran cantidad de herramientas para automatizar este proceso, siempre es recomendable revisar manualmente el sistema en busca de posibles vectores de escalada de privilegios.
Veamos las diferentes formas de enumerar manualmente un sistema Linux para la escalada de privilegios.
¿Por qué es importante la enumeración para la escalada de privilegios?
La escalada de privilegios, también conocida como Escalada de Privilegios (EOP) es un componente central de las pruebas de penetración y de la metodología de las pruebas de penetración. Como su nombre indica, se trata de una etapa en la que se intentan elevar los privilegios a administrador o, en sistemas Linux, a usuario root.
Para obtener privilegios de root, primero hay que encontrar una vulnerabilidad en el sistema. Aquí es donde entra en juego la enumeración. Aunque existen herramientas para automatizar la enumeración, la mayoría de las veces, una enumeración manual y minuciosa puede descubrir errores de configuración y otras vulnerabilidades que las herramientas no detectan.
1. Enumeración del sistema
Lo primero que debes hacer después de conseguir un punto de apoyo inicial es aprender sobre el sistema al que has establecido el acceso. Esto le ayudará a optimizar sus cargas útiles para que coincidan con la arquitectura y garantizar la máxima compatibilidad de sus cargas útiles con el sistema de destino.
Por ejemplo, si tienes un exploit de 64 bits, tendrás que modificarlo si el sistema de destino sólo admite software de 32 bits, ya que hay diferencias entre los sistemas de 32 y 64 bits.
Además, conocer la versión del kernel te ayudará a buscar exploits en la web en caso de que descubras que la versión está desactualizada y es vulnerable a un exploit público. Aquí tienes algunos comandos que te ayudarán a obtener información del sistema:
Para encontrar información del sistema como la versión del kernel, la versión del sistema operativo, etc., escriba:
cat /etc/cpuinfo
uname -a
Si desea obtener más información sobre la arquitectura de la CPU, utilice el comando lscpu:
lscpu
2. Enumeración de procesos
Los procesos son programas en ejecución. Conocer la lista completa de procesos en un sistema Linux, junto con algunas otras tácticas de enumeración mencionadas en esta guía le ayudará a identificar procesos potencialmente vulnerables y aprovecharlos para elevar privilegios.
Por ejemplo, si encuentras un proceso ejecutándose con privilegios de root, podrías ser capaz de inyectar código arbitrario en él, lo que podría conducir a una exitosa elevación de privilegios.
Puedes usar el comando ps con las banderas aux para listar todos los procesos en el sistema:
ps aux
3. Enumeración de usuarios y grupos
La enumeración de usuarios y grupos es importante para averiguar quién tiene acceso a qué parte del sistema. Sabiendo eso te permite alcanzar tus objetivos eficientemente y construir una estrategia de ataque efectiva. Además, podrás crear asignaciones adecuadas y comprender en profundidad los roles y privilegios de cada cuenta.
Tener visibilidad de las cuentas privilegiadas te permite probar combinaciones conocidas de nombre de usuario-contraseña. Puedes imprimir el contenido de los archivos /etc/passwd y /etc/group para acceder a la lista de usuarios. Alternativamente, también puedes utilizar el comando getent.
Para obtener la lista de usuarios en Linux:
getent passwd
Para obtener la lista de grupos:
getent group
4. Búsqueda de archivos sensibles
Archivos sensibles como /etc/passwd y /etc/shadow pueden potencialmente filtrar mucha información. Desde /etc/shadow puedes encontrar los hashes de las contraseñas de los usuarios e intentar descifrarlos con una herramienta de descifrado de hashes como Hashcat o John the Ripper.
También está el archivo /etc/sudoers, que, si puedes editarlo de alguna manera, permitirá modificar los permisos sudo de usuarios y grupos.
5. Comprobación de los permisos sudo
La correcta gestión de los permisos sudo es crucial para la seguridad de un sistema Linux. El análisis de los permisos sudo le dará una idea de los vectores potenciales para la escalada de privilegios. Si hay errores de configuración como que ciertos programas tengan un nivel de privilegio alarmante, podrías ser capaz de explotarlos para obtener acceso root.
Este es sólo un ejemplo de las muchas vías de ataque que pueden abrirse una vez que se tienen claros los permisos sudo en el sistema Linux. Otro ejemplo sería abusar del mecanismo de precarga de bibliotecas LD_PRELOAD, que puedes enumerar mirando los permisos sudo.
6. Encontrar exploits del núcleo de Linux
Los exploits del kernel de Linux son mortales porque atacan el núcleo del sistema operativo que se ejecuta en el sistema comprometido. Con un fallo crítico del kernel, serás capaz de hacer casi cualquier cosa con el sistema.
Para encontrar exploits del kernel, primero, averigua la versión del kernel y luego, utilizando una herramienta como searchsploit o, utilizando Google Dorks, encuentra un exploit adecuado que afecte a la versión exacta del kernel que se ejecuta en el sistema.
7. Explotación de binarios SUID
SUID es la abreviatura de Set Owner User ID upon execution. Es un tipo especial de permiso de archivo que, cuando se establece, ejecuta un programa con los privilegios de su propietario.
Si un programa fue creado por el usuario root y el bit SUID fue establecido para él, el programa, cuando se ejecute, poseerá privilegios de root. ¿Cómo se puede abusar del SUID? Es muy sencillo.
Enumera todos los binarios con el bit SUID activado, recorre la lista, encuentra un binario para el que tengas acceso de escritura y edita su código fuente para añadir tu carga útil. Puedes usar el comando find para buscar binarios SUID y redirigir la salida estándar a /dev/null:
find / -perm -4000 2>/dev/null
8. Secuestro de bibliotecas
A veces puede haber programas ejecutándose en el sistema que utilizan bibliotecas que no están protegidas contra escritura. En tal caso, puedes sobrescribir fácilmente la biblioteca en uso y tomar el control de la funcionalidad del programa.
Si tienes suerte y encuentras un programa ejecutándose como root, podrías secuestrar la biblioteca de la que depende y potencialmente obtener acceso shell de root.
9. Investigando y Secuestrando Variables de Entorno
Las variables de entorno son tipos especiales de variables que, hasta cierto punto, definen cómo funcionan el sistema y los programas. Una variable de entorno importante es la variable PATH.
Almacena la ubicación de todos los binarios ejecutables en el sistema. Se puede manipular la variable PATH y encadenarla con otras vulnerabilidades como el secuestro de bibliotecas para obtener acceso de root.
Por ejemplo, supongamos que hay un ejecutable con un bit SUID activado. Para funcionar correctamente, está llamando a un binario sin definir su ruta completa.
Puedes aprovecharte de esto creando una versión duplicada y maliciosa del binario, y actualizando la variable PATH con la ubicación del binario malicioso para que cuando se ejecute el ejecutable SUID, tu binario malicioso se ejecute como root, y puedas generar un shell root.
Además, también hay una buena oportunidad de encontrar claves secretas y contraseñas simplemente mirando a través de las variables de entorno. Puedes imprimir todas las variables de entorno utilizando el comando env:
env
10. Encontrar artefactos en el historial de Bash
A menudo, el historial del usuario actual no se borra. Se puede abusar de esto para obtener potencialmente acceso a información sensible o volver a ejecutar comandos anteriores con parámetros modificados.
Aunque esto probablemente no conduzca a una escalada de privilegios, es una buena fuente de fugas de información para tener claro lo que el usuario suele hacer en el sistema.
11. Secuestrar Cron Jobs Vulnerables
Los Cron jobs son una característica incorporada y altamente ingeniosa de Linux. Si ha migrado desde Windows, un cron job puede compararse directamente con una tarea programada en Windows.
Se ejecuta periódicamente y ejecuta comandos. Tanto el momento en que se ejecutará como los comandos que ejecutará están predefinidos por el usuario. En ocasiones, es posible que algunas tareas cron sean vulnerables a ataques como la inyección de comodines o que puedan ser escritas por el usuario con el que se ha iniciado sesión.
Puedes abusar de estas vulnerabilidades para obtener acceso root al sistema. Para explotar un cron job, primero tienes que encontrar uno vulnerable. Aquí están los comandos para listar los trabajos cron que se están ejecutando actualmente y otros datos relevantes:
ls /etc/cron.d/
crontab -l -u <nombredeusuario>
12. Listado de paquetes obsoletos
Cuando haya establecido el acceso a un sistema, uno de los primeros pasos que debe dar es listar todos los paquetes de software instalados y cotejar sus versiones instaladas con su última versión.
Existe la posibilidad de que haya algún paquete oscuro instalado que no se use mucho pero que sea críticamente vulnerable a un ataque de escalada de privilegios. Entonces puedes explotar ese paquete para obtener acceso de root.
Utilice el comando dpkg con la etiqueta -l para listar los paquetes instalados en sistemas basados en Debian y Ubuntu:
dpkg -l
Para sistemas RHEL/CentOS/Fedora, utilice este comando para listar los paquetes instalados:
rpm -qa
Ahora ya sabe cómo enumerar manualmente Linux para la escalada de privilegios
La escalada de privilegios depende únicamente de la enumeración. Cuanta más información tengas a tu alcance, mejor podrás planificar tus estrategias de ataque.
Una enumeración eficiente es clave para establecer un punto de apoyo, escalar privilegios y persistir con éxito en el sistema objetivo. Aunque hacer las cosas manualmente ayuda, algunas de las tareas pueden asignarse a herramientas automatizadas para ahorrar tiempo y esfuerzo. Debes conocer las mejores herramientas de seguridad para escanear un sistema en busca de vulnerabilidades.