🔑Credential Hunting - Linux
La búsqueda de credenciales es uno de los primeros pasos una vez que tenemos acceso al sistema. Estas credenciales pueden otorgarnos privilegios elevados en cuestión de segundos o minutos. Entre otras cosas, esto es parte del proceso de escalada de privilegios locales que cubriremos aquí. Sin embargo, es importante señalar aquí que estamos lejos de cubrir todas las situaciones posibles y, por lo tanto, nos centramos en los diferentes enfoques.
Podemos imaginar que hemos logrado acceder a un sistema a través de una aplicación web vulnerable y, por lo tanto, hemos obtenido, por ejemplo, un shell inverso. Por lo tanto, para escalar nuestros privilegios de manera más eficiente, podemos buscar contraseñas o incluso credenciales completas que podamos usar para iniciar sesión en nuestro objetivo. Existen varias fuentes que pueden proporcionarnos credenciales que ubicamos en cuatro categorías. Estos incluyen, entre otros:
|
|
|
|
Configuraciones | Registros | Cache | Credenciales almacenadas en el navegador |
Bases de datos | Historial de línea de comandos | Procesamiento en memoria | |
Notas | |||
Scripts | |||
Códigos fuente | |||
cronjobs | |||
Claves SSH |
Enumerar todas estas categorías nos permitirá aumentar la probabilidad de encontrar con cierta facilidad las credenciales de los usuarios existentes en el sistema. Existen innumerables situaciones diferentes en las que siempre veremos resultados diferentes. Por lo tanto, debemos adaptar nuestro enfoque a las circunstancias del entorno y tener presente el panorama general. Sobre todo, es fundamental tener en cuenta cómo funciona el sistema, su enfoque, para qué existe y qué papel desempeña en la lógica empresarial y la red general. Por ejemplo, supongamos que es un servidor de base de datos aislado. En ese caso, no necesariamente encontraremos allí a usuarios normales, ya que se trata de una interfaz sensible en la gestión de datos a la que sólo se concede acceso a unas pocas personas.
Archivos
Un principio fundamental de Linux es que todo es un archivo. Por ello, es fundamental tener presente este concepto y buscar, encontrar y filtrar los archivos adecuados según nuestros requerimientos. Deberíamos buscar, encontrar e inspeccionar varias categorías de archivos uno por uno. Estas categorías son las siguientes:
Archivos de configuración | Bases de datos | Notas |
Scripts | cronjobs | Claves SSH |
Los archivos de configuración son el núcleo de la funcionalidad de los servicios en las distribuciones de Linux. A menudo incluso contienen credenciales que podremos leer. Su conocimiento también nos permite comprender con precisión cómo funciona el servicio y sus requisitos. Normalmente, los archivos de configuración están marcados con las siguientes tres extensiones de archivo (.conf
,.cnf
y .config
) . Sin embargo, se puede cambiar el nombre de estos archivos de configuración o los archivos de extensión asociados, lo que significa que estas extensiones de archivo no son necesariamente necesarias. Además, incluso al recompilar un servicio, se puede cambiar el nombre de archivo requerido para la configuración básica, lo que produciría el mismo efecto. Sin embargo, este es un caso raro que no nos encontraremos con frecuencia, pero esta posibilidad no debe quedar fuera de nuestra búsqueda.
La parte más crucial de cualquier enumeración de un sistema es obtener una descripción general del mismo. Por tanto, el primer paso debería ser encontrar todos los archivos de configuración posibles en el sistema, que luego podremos examinar y analizar individualmente con más detalle. Hay muchos métodos para encontrar estos archivos de configuración, y con el siguiente método veremos que hemos reducido nuestra búsqueda a estas tres extensiones de archivo.
Archivos de configuración
Opcionalmente, podemos guardar el resultado en un archivo de texto y usarlo para examinar los archivos individuales uno tras otro. Otra opción es ejecutar el análisis directamente para cada archivo encontrado con la extensión de archivo especificada y generar el contenido. En este ejemplo, buscamos tres palabras ( user
, password
, pass
) en cada archivo con la extensión de archivo .cnf
.
Credenciales en archivos de configuración
También podemos aplicar esta búsqueda simple a otras extensiones de archivo. Además, podemos aplicar este tipo de búsqueda a bases de datos almacenadas en archivos con diferentes extensiones de archivo, y luego podemos leerlas.
Bases de datos
Dependiendo del entorno en el que nos encontremos y del propósito del host en el que nos encontremos, a menudo podemos encontrar notas sobre procesos específicos en el sistema. A menudo incluyen listas de muchos puntos de acceso diferentes o incluso sus credenciales. Sin embargo, a menudo resulta complicado encontrar notas inmediatamente si están almacenadas en algún lugar del sistema y no en el escritorio o en sus subcarpetas. Esto se debe a que pueden tener cualquier nombre y no es necesario que tengan una extensión de archivo específica, como .txt
. Por lo tanto, en este caso, debemos buscar archivos que incluyan la extensión .txt
del archivo y archivos que no tengan ninguna extensión de archivo.
Notas
Los scripts son archivos que a menudo contienen información y procesos muy confidenciales. Estos también contienen, entre otras cosas, las credenciales necesarias para poder llamar y ejecutar los procesos automáticamente. De lo contrario, el administrador o desarrollador tendría que introducir la contraseña correspondiente cada vez que se llame al script o al programa compilado.
Scripts
Cronjobs
Los cronjobs son la ejecución independiente de comandos, programas y scripts. Estos se dividen en el área de todo el sistema ( /etc/crontab
) y ejecuciones dependientes del usuario. Algunas aplicaciones y scripts requieren credenciales para ejecutarse y, por lo tanto, se ingresan incorrectamente en los cronjobs.
Además, están las zonas que se dividen en diferentes rangos horarios ( /etc/cron.daily
, /etc/cron.hourly
, /etc/cron.monthly
, /etc/cron.weekly
). Los scripts y archivos utilizados cron
también se pueden encontrar en /etc/cron.d/
distribuciones basadas en Debian.
Claves SSH
Las claves SSH pueden considerarse "tarjetas de acceso" para el protocolo SSH utilizado para el mecanismo de autenticación de clave pública. Se genera un archivo para el cliente ( Private key
) y uno correspondiente para el servidor ( Public key
). Sin embargo, no son lo mismo, por lo que conocer una public key
no es suficiente para encontrar una private key
. Una public key
puede verificar las firmas generadas por la clave SSH privada y, por lo tanto, permite el inicio de sesión automático en el servidor. Incluso si personas no autorizadas consiguen la clave pública, es casi imposible calcular la clave privada correspondiente a partir de ella. Al conectarse al servidor utilizando la clave SSH privada, el servidor verifica si la clave privada es válida y permite que el cliente inicie sesión en consecuencia. Por lo tanto, ya no se necesitan contraseñas para conectarse vía SSH.
Dado que las claves SSH pueden tener nombres arbitrarios, no podemos buscar nombres específicos en ellas. Sin embargo, su formato nos permite identificarlas de forma única porque, ya sea de clave pública o privada, ambas tienen primeras líneas únicas para distinguirlas.
Claves privadas SSH
Claves públicas SSH
Historial
Todos los archivos históricos proporcionan información crucial sobre el curso actual y pasado/histórico de los procesos. Estamos interesados en los archivos que almacenan el historial de comandos de los usuarios y los registros que almacenan información sobre los procesos del sistema.
En el historial de los comandos introducidos en las distribuciones Linux que utilizan Bash como shell estándar encontramos los archivos asociados en formato .bash_history
. Sin embargo, otros archivos gustan .bashrc
o .bash_profile
pueden contener información importante.
Bash History
Registros
Un concepto esencial de los sistemas Linux son los archivos de registro que se almacenan en archivos de texto. Muchos programas, especialmente todos los servicios y el propio sistema, escriben este tipo de archivos. En ellos encontramos errores del sistema, detectamos problemas relacionados con los servicios o seguimos lo que hace el sistema en segundo plano. La totalidad de los archivos de registro se pueden dividir en cuatro categorías:
Registros de aplicaciones | Registros de eventos | Registros de servicio | Registros del sistema |
Existen muchos registros diferentes en el sistema. Estos pueden variar dependiendo de las aplicaciones instaladas, pero estas son algunas de las más importantes:
Archivo de registro | Descripción |
| Registros genéricos de actividad del sistema. |
| Registros genéricos de actividad del sistema. |
| (Debian) Todos los registros relacionados con la autenticación. |
| (RedHat/CentOS) Todos los registros relacionados con la autenticación. |
| Información de arranque. |
| Información y registros relacionados con hardware y controladores. |
| Advertencias, errores y registros relacionados con el kernel. |
| Intentos fallidos de inicio de sesión. |
| Información relacionada con trabajos cron. |
| Todos los registros relacionados con el servidor de correo. |
| Todos los registros relacionados con Apache. |
| Todos los registros relacionados con el servidor MySQL. |
Cubrir el análisis de estos archivos de registro en detalle sería ineficiente en este caso. Entonces, en este punto, debemos familiarizarnos con los registros individuales, primero examinándolos manualmente y entendiendo sus formatos. Sin embargo, aquí hay algunas cadenas que podemos usar para encontrar contenido interesante en los registros:
Memoria y caché
Muchas aplicaciones y procesos funcionan con las credenciales necesarias para la autenticación y las almacenan en la memoria o en archivos para poder reutilizarlas. Por ejemplo, pueden ser las credenciales requeridas por el sistema para los usuarios que iniciaron sesión. Otro ejemplo son las credenciales almacenadas en los navegadores, que también se pueden leer. Para poder recuperar este tipo de información de las distribuciones Linux existe una herramienta llamada mimipenguin que facilita todo el proceso. Sin embargo, esta herramienta requiere permisos de administrador/root.
Mimipenguin
Una herramienta aún más poderosa que podemos usar y que se mencionó anteriormente en la sección Búsqueda de credenciales en Windows es LaZagne
. Esta herramienta nos permite acceder a muchos más recursos y extraer las credenciales. Las contraseñas y hashes que podemos obtener provienen de las siguientes fuentes pero no se limitan a:
Wifi | Wpa_supplicant | Libsecret | Kwallet |
Chromium-based | CLI | Mozilla | Thunderbird |
Git | Env_variable | Grub | Fstab |
AWS | Filezilla | Gftp | SSH |
Apache | Shadow | Docker | KeePass |
Mimipy | Sessions | Keyrings |
Por ejemplo, Keyrings
se utilizan para el almacenamiento seguro y la gestión de contraseñas en distribuciones de Linux. Las contraseñas se almacenan cifradas y protegidas con una contraseña maestra. Es un administrador de contraseñas basado en sistema operativo, que analizaremos más adelante en otra sección. De esta manera, no necesitamos recordar todas las contraseñas y podemos guardar entradas repetidas de contraseñas.
LaZagne
Navegadores
Los navegadores almacenan las contraseñas guardadas por el usuario de forma cifrada localmente en el sistema para su reutilización. Por ejemplo, el navegador Mozilla Firefox
almacena las credenciales cifradas en una carpeta oculta para el usuario respectivo. Estos suelen incluir los nombres de los campos asociados, las URL y otra información valiosa.
Por ejemplo, cuando almacenamos las credenciales de una página web en el navegador Firefox, se cifran y se almacenan en logins.json
. Sin embargo, esto no significa que estén seguros allí. Muchos empleados almacenan dichos datos de inicio de sesión en su navegador sin sospechar que pueden ser descifrados fácilmente y utilizados contra la empresa.
Credenciales almacenadas de Firefox
Firefox Decrypt
La herramienta Firefox Decrypt es excelente para descifrar estas credenciales y se actualiza periódicamente. Requiere Python 3.9 para ejecutar la última versión. De lo contrario, Firefox Decrypt 0.7.0
se debe utilizar Python 2.
Alternativamente, LaZagne
también puede devolver resultados si el usuario ha utilizado el navegador compatible.
Navegadores - LaZagne
Ejemplo práctico
Examina el objetivo y descubre la contraseña del usuario Will. Luego, envíe la contraseña como respuesta.
A veces, no tendremos ninguna credencial inicial disponible y, como último paso, necesitaremos aplicar fuerza bruta a las credenciales de los servicios disponibles para obtener acceso. Desde otros hosts de la red, nuestros compañeros pudieron identificar al usuario "Kira", que en la mayoría de los casos tenía acceso SSH a otros sistemas con la contraseña "LoveYou1"
Escaneo de puertos
Conexión por SSH
Al intentar conectarnos con las credenciales proporcionadas no podemos entrar, por lo que necesitaremos aplicar técnicas de mutación de contraseñas.
Password Mutation
Vamos a mutar el password LoveYou1
con el objetivo de acceder por SSH. Para ello vamos a usar hashcat de la siguiente manera:
Brute Force
Nos encuentra la contraseña correcta: L0vey0u1!
. Probamos a conectarnos por SSH y conseguimos acceder sin problema:
Enumeración
Encontramos una herramienta interesante en el .bash_history
: firefox_decrypt.git.
Está eliminada por lo que vamos a descargarla en nuestro Kali y enviarla para ejecutarla en el servidor.
Descargamos la herramienta: https://github.com/unode/firefox_decrypt
Vamos a la ruta /home/kira/.mozilla/firefox
, enviamos el script y lo ejecutamos de la siguiente manera:
Y finalmente obtenemos el password del usuario Will: TUqr7QfLTLhruhVbCP
Última actualización