Las posibilidades que ofrece un sistema Linux son bien conocidas, existe documentación abundante en internet y saber moverse por este tipo de entornos es un “must” cuando se trata de aprender seguridad informática. En el proceso de post-explotación es importante conocer la estructura del sistema y qué cosas se pueden hacer. Hace algunas semanas he escrito una serie de artículos compuesta por 6 posts sobre enumeración en Windows para Post-Explotación y ahora es el turno de Linux, este será el primer post. La post-explotación es un proceso en el que se debe recolectar la mayor cantidad de información y separar el grano de la paja. Obtener dicha información puede que no resulte tan difícil pero el proceso de análisis y detectar qué es útil y qué no lo es requiere cierta pericia y habilidad.
Esto es lo primero que hay que mirar, reconocer el entorno y extraer información básica del mismo. Para ello hay varios comandos y ficheros que son accesibles para todos los usuarios. Algunos de los detalles a tener en cuenta son los siguientes.
- Versión del sistema operativo, nivel de compilación y distribución de Linux concreta.
- Usuarios existentes en el sistema y sus directorios home.
- Gestores de paquetes instalados y sus versiones (dpkg/rpm/pacman/apt/yum/otro).
- Nombre de host y detalles básicos de la red.
En Linux consultar dicha información es muy simple y se puede hacer rápidamente con los comandos disponibles en el propio sistema operativo.
Los servicios y programas que se encuentran en ejecución pueden ser un buen inicio en la búsqueda de vulnerabilidades en el sistema. Es posible que algún proceso se esté ejecutando con los privilegios de root y que incluya alguna vulnerabilidad que se puede explotar localmente, esta situación es de las más deseables para la elevación de privilegios. También es común encontrar servicios que inicialmente no se han descubierto en el proceso de reconocimiento con herramientas como NMap, ya que se trata de servicios de red que únicamente aceptan conexiones en la interfaz de loopback (localhost). Un ejemplo típico de esto son servicios de bases de datos como PostgreSQL o MySQL. En este punto del proceso se toma nota de los servicios encontrados para posteriormente, centrarse en buscar directorios y ficheros comunes en donde probablemente se podrá encontrar información sensible. Por ejemplo, en el caso de un servidor web Apache HTTPD, se probará si el directorio “/var/www/html” se encuentra creado y si se puede acceder al fichero de configuración del servidor.
Las variables de entorno representan uno de los elementos más importantes en cualquier sistema operativo ya que permiten asignar valores a nombres globales para la sesión de cada usuario. Esto a efectos prácticos significa que aplicaciones, servicios y utilidades en el sistema pueden leer dichas variables para su correcto funcionamiento. Por ejemplo, es muy común que en proyectos basados en Java se tenga que configurar las variables de entorno “JAVA_HOME” y “PATH” para indicar la ubicación de la JVM y las utilidades core de Java (como javac, jar, jarsigner, jinfo, etc) respectivamente. Lo que se busca es precisamente aquellas variables de entorno menos comunes que no vienen definidas por defecto en el sistema y que son susceptibles de ser modificadas o que pueden aportar información interesante. En cualquier distribución basada en Linux el comando “env” permite ver las variables de entorno y comprobar su contenido.
Una de las variables de entorno más importantes tanto en Linux como en Windows es “PATH”. Se trata de una variable que permite definir cuáles son las rutas en donde se encuentran los ejecutables que se pueden lanzar desde cualquier ubicación en la terminal. Por este motivo es posible ejecutar comandos como “ls” sin especificar la ruta completa “/bin/ls”, por defecto la variable de entorno PATH incluye ubicaciones comunes como “/bin/”, “/usr/local/sbin”, entre otras. Es muy habitual que el usuario tenga que editar esta variable para especificar la ubicación de otras aplicaciones comunes en el sistema, tal y como se ha mencionado antes para las utilidades del JDK (Java Development Kit). Para editar esta variable de entorno o cualquier otra, se puede hacer de forma temporal o permanente. Para hacerlo de forma temporal es tan simple como ejecutar el comando “export” y para hacerlo de forma permanente se editan ficheros como el “~/.bashrc” o “~/.bash_profile”. Sabiendo esto resulta interesante comprobar el contenido de dichos ficheros y ver qué variables se han creado manualmente por parte del usuario, por ejemplo:
Si se cuenta con los privilegios necesarios para editar alguno de estos ficheros o los directorios a los que apunta la variable, es posible que se consiga elevación de privilegios horizontal cuando el usuario ejecute un comando común, el cual en realidad estará apuntando a otro binario que ha puesto el atacante en una ruta accesible en la variable PATH.
En los siguientes posts se profundizará bastante más sobre el procedimiento completo para enumerar sistemas Linux, orientado concretamente a la post-explotación.
Un saludo y Happy Hack!
Adastra.