soy root Comprender la escalada de privilegios del sistema operativo Linux

Pasé el primer trimestre de 2020 preparándome para el examen OSCP. La búsqueda de información en Google y muchos intentos "a ciegas" ocuparon todo mi tiempo libre. Resultó especialmente difícil comprender los mecanismos de escalada de privilegios. El curso PWK presta mucha atención a este tema, pero los materiales metodológicos siempre no son suficientes. Hay muchos manuales en Internet con comandos útiles, pero no soy partidario de seguir ciegamente las recomendaciones sin entender a dónde llevará esto.

Me gustaría compartir con ustedes lo que logré aprender durante la preparación y la aprobación exitosa del examen (incluidas las incursiones periódicas en Hack The Box). Sentí un profundo sentimiento de gratitud por cada bit de información que me ayudó a recorrer el camino de Try Harder de manera más consciente, ahora es mi momento de retribuir a la comunidad.

Quiero brindarle una guía para la escalada de privilegios en OS Linux, que incluye un análisis de los vectores más comunes y las características relacionadas que definitivamente necesitará. A menudo, los mecanismos de escalada de privilegios en sí mismos son bastante simples, surgen dificultades al estructurar y analizar la información. Por lo tanto, decidí comenzar con un "recorrido turístico" y luego considerar cada vector en un artículo separado. Espero ahorrarte tiempo para estudiar el tema.

soy root Comprender la escalada de privilegios del sistema operativo Linux

Entonces, ¿por qué es posible la escalada de privilegios en 2020 si los métodos se conocen desde hace mucho tiempo? De hecho, si el usuario maneja correctamente el sistema, realmente no será posible aumentar los privilegios en él. El principal problema global que da lugar a tales oportunidades es configuración insegura. La presencia de versiones de software desactualizadas que contienen vulnerabilidades en el sistema también es un caso especial de una configuración insegura.

Escalada de privilegios a través de una configuración insegura

En primer lugar, tratemos la configuración insegura. empecemos con Los profesionales de TI a menudo usan manuales y recursos como stackoverflow, muchos de los cuales contienen configuraciones y comandos no seguros. Un ejemplo llamativo es noticias que el código más copiado de stackoverflow contenía un error. Un administrador experimentado verá la jamba, pero esto es en un mundo ideal. Incluso profesionales competentes mayor carga de trabajo capaz de cometer errores. Imagine que el administrador está preparando y aprobando la documentación para la próxima licitación, al mismo tiempo que profundiza en la nueva tecnología que se presentará en el próximo trimestre, mientras resuelve periódicamente las tareas de soporte al usuario. Y luego se le asigna la tarea de levantar rápidamente un par de máquinas virtuales y desplegar servicios en ellas. ¿Qué piensas, cuál es la probabilidad de que el administrador simplemente no se dé cuenta de la jamba? Luego cambian los especialistas, pero quedan las muletas, mientras que las empresas siempre se esfuerzan por minimizar los costos, incluidos los de los especialistas en TI.

Pseudo shell y jailbreak

El shell del sistema obtenido durante la fase de producción a menudo es limitado, especialmente si lo obtuvo pirateando a un usuario del servidor web. Por ejemplo, las restricciones de shell pueden impedirle usar el comando sudo con un error:

sudo: no tty present and no askpass program specified

Después de obtener un shell, recomiendo crear un terminal completo, por ejemplo, con Python.

python -c 'import pty;pty.spawn("/bin/bash")'

Usted pregunta: "¿Por qué necesito mil comandos, si puedo usar uno, por ejemplo, para transferir archivos?" El hecho es que los sistemas están configurados de manera diferente, en el próximo host es posible que Python no esté instalado, pero Perl puede estar disponible. La habilidad es poder hacer cosas familiares en el sistema sin herramientas familiares. Se puede encontrar una lista completa de características aquí.

Se puede obtener un shell de privilegios bajos usando equipos 1 и equipos 2 (sorprendentemente incluso GIMP).

Ver historial de comandos

Linux recopila un historial de todos los comandos ejecutados en un archivo ~ / .bash_history. Si el servidor está en uso activo y su historial no se borra, es muy probable que las credenciales se encuentren en este archivo. Limpiar el historial es banalmente inconveniente. Si el administrador se ve obligado a seleccionar comandos de diez niveles a través de, por supuesto, será más conveniente para él llamar a este comando desde el historial que ingresarlo nuevamente. Además, muchos no conocen este "truco". Si hay shells alternativos como Zsh o Fish en el sistema, tienen su propia historia. Para mostrar el historial de comandos en cualquier shell, simplemente escriba el historial de comandos.

cat ~/.bash_history
cat ~/.mysql_history
cat ~/.nano_history
cat ~/.php_history
cat ~/.atftp_history

Existe el alojamiento compartido, en el que el servidor se utiliza para alojar varios sitios. Normalmente, con esta configuración, cada recurso tiene su propio usuario con un directorio de inicio independiente y un host virtual. Entonces, si está configurado incorrectamente, puede encontrar el archivo .bash_history en el directorio raíz del recurso web.

Búsqueda de contraseñas en el sistema de archivos y ataques a sistemas adyacentes

Los archivos de configuración para varios servicios pueden ser leídos por su usuario actual. En ellos, puede encontrar credenciales en texto claro: contraseñas para acceder a la base de datos o servicios relacionados. La misma contraseña se puede utilizar tanto para acceder a la base de datos como para autorizar al usuario root (credencial de personal).
Sucede que las credenciales encontradas pertenecen a servicios en otros hosts. El desarrollo de un ataque a la infraestructura a través de un host comprometido no es peor que la explotación de otros hosts. Los sistemas adyacentes también se pueden encontrar buscando direcciones IP en el sistema de archivos.

grep -lRi "password" /home /var/www /var/log 2>/dev/null | sort | uniq #Find string password (no cs) in those directories
grep -a -R -o '[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}' /var/log/ 2>/dev/null | sort -u | uniq #IPs inside logs

Si el host comprometido tiene una aplicación web accesible desde Internet, es mejor excluir sus registros de la búsqueda de direcciones IP. Es poco probable que las direcciones de los usuarios de recursos de Internet nos sean útiles, pero las direcciones de la red interna (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) y dónde van, a juzgar por el registros, puede ser de su interés.

Sudo

El comando sudo le permite al usuario ejecutar un comando en el contexto de root con su propia contraseña o sin usarla. Muchas operaciones en Linux requieren privilegios de root, pero ejecutarse como root se considera una práctica muy mala. En su lugar, es mejor aplicar un permiso selectivo para ejecutar comandos en el contexto raíz. Sin embargo, muchas herramientas de Linux, incluidas las estándar como vi, se pueden usar para aumentar los privilegios de manera legítima. Para encontrar el camino correcto, recomiendo mirar aquí.

Lo primero que debe hacer después de obtener acceso al sistema es ejecutar el comando sudo -l. Mostrará permiso para usar el comando sudo. Si se obtiene un usuario sin contraseña (como apache o www-data), es poco probable que se produzca un vector de escalada de privilegios sudo. Al usar sudo, el sistema le pedirá una contraseña. Usar el comando passwd para establecer una contraseña tampoco funcionará, le pedirá la contraseña de usuario actual. Pero si sudo todavía está disponible, entonces, de hecho, debe buscar:

  • cualquier intérprete, cualquiera puede generar un shell (PHP, Python, Perl);
  • cualquier editor de texto (vim, vi, nano);
  • cualquier espectador (menos, más);
  • cualquier posibilidad de trabajar con el sistema de archivos (cp, mv);
  • herramientas que tienen salida en bash, ya sea de forma interactiva o como un comando ejecutable (awk, find, nmap, tcpdump, man, vi, vim, ansible).

suid/sgid

Hay muchos manuales en Internet que aconsejan compilar todos los comandos suid / sgid, pero un artículo poco común brinda información específica sobre qué hacer con estos programas. Se pueden encontrar opciones de escalada de privilegios que no tienen en cuenta el uso de exploits aquí. Además, varios archivos ejecutables tienen vulnerabilidades específicas para la versión del sistema operativo, por ejemplo.

En un mundo ideal, debería ejecutar todos los paquetes instalados a través de al menos searchsploit. En la práctica, esto debería hacerse con los programas más populares como sudo. También es siempre una opción usar y admitir el desarrollo de herramientas automatizadas que resaltarán ejecutables interesantes, desde el punto de vista de escalamiento de privilegios, con bits suid/sgid establecidos. Daré una lista de tales herramientas en la sección correspondiente del artículo.

Scripts grabables ejecutados por Cron o Init en contexto raíz

Los trabajos cron pueden ejecutarse en el contexto de diferentes usuarios, incluido el root. Si hay una tarea en cron con un enlace a un archivo ejecutable y está disponible para que la escriba, puede reemplazarla fácilmente con una maliciosa y realizar una escalada de privilegios. Al mismo tiempo, de forma predeterminada, los archivos con tareas cron están disponibles para leer a cualquier usuario.

ls -la /etc/cron.d  # show cron jobs 

Similar es el caso con init. La diferencia es que las tareas en cron se ejecutan periódicamente y en init, al iniciar el sistema. Para la operación, deberá reiniciar el sistema, mientras que algunos de los servicios pueden no subir (si no se registraron en la carga automática).

ls -la /etc/init.d/  # show init scripts 

También puede buscar archivos en los que pueda escribir cualquier usuario.

find / -perm -2 -type f 2>/dev/null # find world writable files

El método es bastante conocido, los administradores de sistemas experimentados usan cuidadosamente el comando chmod. Sin embargo, en la Web, la gran mayoría de los manuales describen cómo configurar los derechos máximos. El enfoque de "simplemente haz que funcione" de los administradores de sistemas sin experiencia crea oportunidades para la escalada de privilegios en principio. Si es posible, es mejor buscar en el historial de comandos usos inseguros de chmod.

chmod +w /path 
chmod 777 /path

Obtener acceso de shell para otros usuarios

Miramos la lista de usuarios en /etc/passwd. Prestamos atención a aquellos que tienen un caparazón. Puede eliminar a estos usuarios; es posible que a través del usuario resultante eventualmente pueda aumentar los privilegios.

Para mejorar la seguridad, le recomiendo que siempre se adhiera al principio de privilegio mínimo. También tiene sentido tomarse el tiempo para verificar las configuraciones inseguras que podrían quedar después de la resolución de problemas; este es el "deber técnico" del administrador del sistema.

Código escrito por uno mismo

Vale la pena echar un vistazo de cerca a los ejecutables en el directorio de inicio del servidor web y del usuario (/var/www/ a menos que se especifique lo contrario). Estos archivos pueden resultar una solución completamente insegura y contener muletas increíbles. Por supuesto, si tiene algún framework en el directorio de su servidor web, no tiene sentido buscar zero-day en él como parte de un pentest, pero se recomienda encontrar y estudiar modificaciones, complementos y componentes personalizados.

Para aumentar la seguridad, es mejor evitar el uso de credenciales en scripts escritos por uno mismo, así como funcionalidades potencialmente peligrosas, como leer /etc/shadow o manipular id_rsa, si es posible.

Elevación de privilegios a través de la explotación de vulnerabilidades

Antes de intentar elevar los privilegios a través de la explotación, es importante entender el transferir archivos al host de destino. Además de las herramientas habituales como ssh, ftp, http (wget, curl), existe toda una "zoológico" de posibilidades.

Para mejorar la seguridad de su sistema, actualícelo regularmente a la última estable versiones, y también trate de usar distribuciones diseñadas para Enterprise. De lo contrario, rara vez, pero hay situaciones en las que la actualización apt hace que el sistema quede inutilizable.

Explotación de servicios que se ejecutan en el contexto del usuario raíz

Algunos servicios de Linux se ejecutan como usuario raíz privilegiado. Se pueden encontrar usando ps aux | raíz de grep. En este caso, es posible que el servicio no se anuncie en la Web y esté disponible localmente. Si tiene exploits públicos, se pueden usar de manera segura: un bloqueo del servicio en caso de falla es mucho menos crítico que un bloqueo del sistema operativo.

ps -aux | grep root # Linux

El caso más exitoso puede considerarse la operación de un servicio pirateado en el contexto del usuario raíz. Operar el servicio SMB otorga a SYSTEM acceso privilegiado en sistemas Windows (por ejemplo, a través de ms17-010). Sin embargo, esto no es común en los sistemas Linux, por lo que puede dedicar mucho tiempo a la escalada de privilegios.

Explotación de vulnerabilidades del kernel de Linux

Este es el último camino a tomar. La operación fallida puede provocar un bloqueo del sistema y, en caso de reinicio, es posible que algunos servicios (incluidos aquellos a través de los cuales fue posible obtener el shell original) no se activen. Sucede que el administrador simplemente olvidó usar el comando systemctl enable. Además, causará mucha insatisfacción con su trabajo si no se ha acordado la explotación.
Si decide utilizar las fuentes de exploitdb, asegúrese de leer los comentarios al principio del script. Entre otras cosas, suele decir cómo compilar correctamente este exploit. Si fue demasiado perezoso o necesitaba "ayer" debido a los plazos, puede buscar repositorios con exploits ya compilados, por ejemplo. Sin embargo, debe entenderse que en este caso obtendrá un cerdo en un empujón. En cambio, si un programador entendiera al pie de la letra cómo funciona un ordenador y el software que utiliza, no habría escrito una línea de código en toda su vida.

cat /proc/version
uname -a
searchsploit "Linux Kernel" 

Metasploit

Para capturar y manejar una conexión, siempre es mejor usar el módulo exploit/multi/handler. Lo principal es establecer la carga útil correcta, por ejemplo, generic/shell/reverce_tcp o generic/shell/bind_tcp. El shell obtenido en Metasploit se puede actualizar a Meterpreter usando el módulo post/multi/manage/shell_to_meterpreter. Con Meterpreter, puede automatizar el proceso posterior a la explotación. Por ejemplo, el módulo post/multi/recon/local_exploit_suggester comprueba la plataforma, la arquitectura y las entidades explotables y sugiere módulos de Metasploit para la escalada de privilegios en el sistema de destino. Gracias a Meterpreter, la escalada de privilegios a veces se reduce a ejecutar el módulo correcto, pero piratear sin comprender lo que sucede debajo del capó no es cierto (aún debe escribir un informe).

Herramientas

Las herramientas para automatizar la recopilación local de información le ahorrarán mucho esfuerzo y tiempo, pero por sí solas no pueden identificar completamente la ruta de escalada de privilegios, especialmente en el caso de explotar las vulnerabilidades del kernel. Las herramientas de automatización ejecutarán todos los comandos necesarios para recopilar información sobre el sistema, pero también es importante poder para analizar datos recibidos. Espero que mi artículo te sea útil en esto. Por supuesto, hay muchas más herramientas de las que enumeraré a continuación, pero todas hacen más o menos lo mismo: es más una cuestión de gusto.

guisantes

Una herramienta bastante nueva, la primera confirmación data de enero de 2019. Actualmente mi instrumento favorito. La conclusión es que destaca los vectores de escalada de privilegios más interesantes. De acuerdo, es más conveniente obtener una evaluación experta en este nivel que analizar datos sin procesar monolíticos.

LinEnum

Mi segunda herramienta favorita, también recopila y organiza los datos recibidos como resultado de la enumeración local.

linux-exploit-sugester(1,2)

Este exploit analizará el sistema en busca de condiciones adecuadas para exploits. De hecho, hará un trabajo idéntico al del módulo local_exploit_suggester de Metasploit, pero ofrecerá enlaces a códigos fuente de exploit-db en lugar de módulos de Metasploit.

Linuxprivchecker

Este script recopilará y organizará por secciones una gran cantidad de información que puede ser útil para la formación de un vector de escalada de privilegios.

En otra ocasión elaboraré Escalada de privilegios de Linux a través de suid/sgid.

Fuente: habr.com

Añadir un comentario