El primer trimestre de 2020 lo dediqué a prepararme para el examen OSCP. Buscar información en Google y hacer muchos intentos «a ciegas» me ocupaban todo mi tiempo libre. Especialmente complicado fue entender los mecanismos de elevación de privilegios. El curso PWK pone un gran énfasis en este tema, pero siempre faltan materiales didácticos. Hay una gran cantidad de manuales en Internet con comandos útiles, pero no soy partidario de seguir ciegamente las recomendaciones sin entender a dónde conducirá esto.
Quiero compartir con ustedes lo que logré aprender durante el tiempo de preparación y la exitosa presentación del examen (incluyendo las incursiones periódicas en Hack The Box). Sentí una profunda gratitud por cada fragmento de información que me ayudó a transitar el camino Try Harder de manera más consciente, ahora es mi momento de rendir homenaje a la comunidad.
Quiero ofrecerte un manual sobre elevación de privilegios en OS Linux, que incluye un análisis de los vectores más comunes y trucos relacionados que te serán de utilidad. A menudo, los propios mecanismos de elevación de privilegios son bastante simples, y las dificultades surgen al estructurar y analizar la información. Por eso decidí comenzar con una «excursión general» y luego tratar cada vector en un artículo separado. Espero ahorrarte tiempo en el estudio del tema.

Entonces, ¿por qué la elevación de privilegios es posible en 2020, si los métodos han sido bien conocidos desde hace mucho tiempo? En realidad, con un manejo adecuado por parte del usuario, no debería ser posible elevar privilegios en el sistema. El principal problema global que genera tales posibilidades radica en una configuración insegura. La presencia en el sistema de versiones de software obsoletas que contienen vulnerabilidades también es un caso particular de configuración insegura.
Elevación de privilegios a través de configuración insegura
Primero que nada, analicemos la configuración insegura. Comencemos con el hecho de que los especialistas en TI a menudo utilizan manuales y recursos como stackoverflow, muchos de los cuales contienen comandos y configuraciones inseguras. Un ejemplo destacado es el hecho de que el código más copiado de stackoverflow contenía un error. Un administrador experimentado notará el fallo, pero esto ocurre en un mundo ideal. Incluso los especialistas capacitados bajo una carga de trabajo elevada pueden cometer errores. Imaginen que un administrador está preparando y acordando la documentación para una nueva licitación, se familiariza al mismo tiempo con una nueva tecnología que se implementará el próximo trimestre, y además, resuelve periódicamente problemas de soporte a usuarios. Y de repente, le asignan la tarea rápida de levantar un par de máquinas virtuales y desplegar servicios en ellas. ¿Qué piensan, cuál es la probabilidad de que el administrador simplemente no note un error? Luego los especialistas cambian, pero los parches quedan, y las empresas siempre buscan minimizar costos, incluyendo los de personal de TI.
Shell pseudo y jailbreak
Una shell del sistema obtenida en fase de explotación suele estar limitada, especialmente si la has conseguido a través de un acceso no autorizado al servidor web. Por ejemplo, las limitaciones de la shell pueden impedir que uses el comando sudo mostrando el siguiente error:
sudo: no hay tty presente y no hay un programa askpass especificadoDespués de obtener la shell, recomiendo crear un terminal completo, por ejemplo, usando Python.
python -c 'import pty;pty.spawn("/bin/bash")'Podrían preguntarse: «¿Para qué necesito mil comandos, si puedo usar uno, por ejemplo, para transferir archivos?» La cuestión es que los sistemas pueden estar configurados de diferentes maneras; en el host puede no estar instalado Python, pero sí Perl. La habilidad radica en poder realizar tareas habituales en el sistema sin las herramientas a las que estás acostumbrado. Se puede encontrar una lista completa de posibilidades .
Puedes obtener una shell de bajo privilegio usando y (sorprendentemente, incluso GIMP).
Ver el historial de comandos
Linux compila el historial de todos los comandos ejecutados en el archivo ~/.bash_history. Si el servidor se utiliza activamente y su historial no se limpia, hay una gran probabilidad de encontrar credenciales en este archivo. Limpiar el historial es simplemente incómodo. Si un administrador se ve obligado a elegir entre comandos de diez líneas, por supuesto, le será más conveniente llamar a este comando desde el historial que volver a escribirlo. Además, muchos no conocen este «hack». Si en el sistema hay shells alternativas como Zsh o Fish, mantienen su propio historial. Para mostrar el historial de comandos en cualquier shell, basta con escribir el comando history.
cat ~/.bash_history
cat ~/.mysql_history
cat ~/.nano_history
cat ~/.php_history
cat ~/.atftp_historyExisten servicios de hosting compartido donde el servidor se utiliza para alojar varios sitios. Normalmente, en esta configuración, se crea un usuario separado para cada recurso con su propio directorio home y un host virtual. Así, si hay una configuración incorrecta, se puede encontrar un 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 relacionados.
Los archivos de configuración de varios servicios pueden ser accesibles para el usuario actual. En ellos se pueden encontrar credenciales en texto claro, como contraseñas para acceder a la base de datos o servicios relacionados. La misma contraseña puede ser utilizada tanto para acceder a la base de datos como para la autorización del usuario root (credential staffing).
A veces, las credenciales encontradas pertenecen a servicios en otros hosts. La evolución de un ataque a la infraestructura a través de un host comprometido es tan dañina como la explotación de otros hosts. Los sistemas relacionados 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 #Buscar cadena password (sin cs) en esos directorios
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 dentro de los logsEn caso de que haya una aplicación web en el host comprometido accesible desde Internet, es mejor excluir sus registros de la búsqueda de direcciones IP. Las direcciones de los usuarios de recursos en Internet probablemente no serán útiles, pero las direcciones de la red interna (172.16.0.0/12, 192.168.0.0/16, 10.0.0.0/8) y los lugares a los que acceden, según los registros, pueden ser de interés.
Sudo
El comando sudo permite a un usuario ejecutar comandos en el contexto de root utilizando su propia contraseña o incluso sin ella. Muchas operaciones en Linux requieren privilegios de root, sin embargo, trabajar directamente como root se considera muy mala práctica. En su lugar, es mejor aplicar permisos selectivos para ejecutar comandos en el contexto de root. Sin embargo, muchas herramientas de Linux, incluidos los tipos estándar como vi, se pueden utilizar para elevar privilegios de manera completamente legítima. Para buscar una forma adecuada, recomiendo investigar. .
Lo primero que hay que hacer al obtener acceso al sistema es ejecutar el comando sudo -l. Esto mostrará los permisos de uso del comando sudo. Si se obtiene un usuario sin contraseña (por ejemplo, apache o www-data), el vector de escalada de privilegios a través de sudo es poco probable. Al usar sudo, el sistema solicitará una contraseña. No se podrá establecer una contraseña a través del comando passwd, ya que pedirá la contraseña actual del usuario. Pero si sudo está disponible, esencialmente se debe buscar:
- cualquier intérprete, donde cualquiera puede generar una shell (PHP, Python, Perl);
- cualquier editor de texto (vim, vi, nano);
- cualquier visor (less, more);
- cualquier capacidad para trabajar con el sistema de archivos (cp, mv);
- herramientas que tienen salida a bash, de forma interactiva o como comando ejecutable (awk, find, nmap, tcpdump, man, vi, vim, ansible).
Suid/Sgid
En Internet hay muchos manuales que aconsejan recopilar todos los comandos suid/sgid; sin embargo, pocos artículos ofrecen detalles específicos sobre qué hacer con estos programas. Se pueden encontrar opciones de escalada de privilegios que no consideran el uso de exploits. Además, varios archivos ejecutables tienen vulnerabilidades específicas para la versión del sistema operativo. .
En un mundo ideal, se deberían examinar todos los paquetes instalados al menos a través de searchsploit. Sin embargo, en la práctica, esto se debe hacer con los programas más populares como sudo. También siempre existe la opción de utilizar y mantener el desarrollo de herramientas automatizadas que destaquen los archivos ejecutables interesantes en términos de escalada de privilegios con bits suid/sgid establecidos. Presentaré una lista de tales herramientas en la sección correspondiente del artículo.
Scripts accesibles para escritura, ejecutados por Cron o Init, en el contexto de Root
Las tareas cron pueden ejecutarse en el contexto de varios usuarios, incluido root. Si hay una tarea en cron que apunta a un archivo ejecutable y este es accesible para escritura, puede ser fácilmente reemplazado por uno malicioso y ejecutar la escalada de privilegios. Además, por defecto, los archivos de las tareas cron son accesibles para lectura por cualquier usuario.
ls -la /etc/cron.d # mostrar trabajos cron Las cosas son similares con init. La diferencia es que las tareas en cron se ejecutan periódicamente, mientras que en init se ejecutan al iniciar el sistema. Para la explotación, se requerirá reiniciar el sistema, y algunos servicios pueden no levantarse (si no se han registrado para autoload).
ls -la /etc/init.d/ # mostrar scripts de inicio También se pueden buscar archivos que estén disponibles para que cualquier usuario los escriba.
find / -perm -2 -type f 2>/dev/null # encontrar archivos que se pueden escribir mundialmenteEl método es bastante conocido, los administradores de sistemas experimentados utilizan con cuidado el comando chmod. Sin embargo, en la vasta red, la mayoría de los manuales describen la concesión de los máximos permisos. El enfoque de los administradores de sistemas inexpertos de 'solo que funcione' crea oportunidades para el incremento de privilegios. Si es posible, es mejor buscar en el historial de comandos el uso inseguro de chmod.
chmod +w /path
chmod 777 /pathObtener acceso a la shell de otros usuarios
Miramos la lista de usuarios en /etc/passwd. Presten atención a aquellos que tienen shell. Se puede intentar atacar a estos usuarios; no es descartable que a través del usuario adquirido eventualmente se logre un incremento de privilegios.
Para aumentar la seguridad, recomiendo siempre adherirse al principio de privilegios mínimos. También tiene sentido dedicar tiempo a verificar configuraciones inseguras que podrían haber quedado después de resolver problemas; este es el 'deuda técnica' del administrador de sistemas.
Código propio
Es recomendable observar detenidamente los archivos ejecutables en el directorio home del usuario y del servidor web (/var/www/, si no se ha especificado otro). Estos archivos pueden resultar una solución completamente insegura y contener increíbles parches. Por supuesto, si tienes algún framework en el directorio del servidor web, no tiene sentido buscar en él una vulnerabilidad de día cero en el marco de un pentest, sin embargo, se recomienda encontrar y estudiar las personalizaciones, plugins y componentes a medida.
Para aumentar la seguridad, es mejor evitar, en la medida de lo posible, el uso de credenciales en scripts propios, así como funcionalidades potencialmente peligrosas, como la lectura de /etc/shadow o manipulaciones con id_rsa.
Incremento de privilegios a través de la explotación de vulnerabilidades
Antes de intentar aumentar privilegios a través de la explotación, es importante comprender la transferencia de archivos al host objetivo. Además de los medios habituales como ssh, ftp, http (wget, curl), hay todo un .
Para aumentar la seguridad del sistema, actualízalo regularmente a las versiones estables actuales versiones, y también intenten utilizar distribuciones diseñadas para Enterprise. De lo contrario, rara vez, pero existen situaciones en las que apt upgrade puede hacer que el sistema sea inoperante.
Explotación de servicios ejecutados en el contexto del usuario root
Algunos servicios de Linux funcionan bajo el usuario privilegiado root. Se pueden encontrar usando el comando ps aux | grep root. Sin embargo, el servicio puede no estar anunciado en la Red y estar disponible localmente. Si tiene exploits públicos, se pueden aplicar sin problemas: la caída del servicio en caso de fallo es mucho menos crítica que la caída del SO.
ps -aux | grep root # LinuxEl caso más exitoso puede considerarse la ejecución de un servicio comprometido en el contexto del usuario root. La explotación del servicio SMB otorga acceso privilegiado SYSTEM en sistemas Windows (por ejemplo, a través de ms17-010). Sin embargo, en sistemas Linux esto no es común, por lo que se puede dedicar mucho tiempo a elevar privilegios.
Explotación de vulnerabilidades del núcleo de Linux
Este es el camino que se debe seguir en última instancia. Una explotación fallida puede llevar a la caída del sistema, y en caso de un reinicio, algunos servicios (incluidos aquellos a través de los cuales se logró obtener el shell inicial) pueden no iniciarse. A veces, el administrador simplemente olvidó aplicar el comando systemctl enable. Además, esto generará muchas quejas sobre su trabajo, si la explotación no fue aprobada.
Si decidiste usar los códigos de exploitdb, asegúrate de leer los comentarios al principio del script. Además de todo, generalmente se indica cómo compilar correctamente este exploit. Si tienes pereza o debido a plazos necesitas hacerlo "ayer", puedes buscar repositorios con exploits ya compilados, . Sin embargo, debe entenderse que en ese caso recibirás un gato en una bolsa. Por otro lado, si un programador comprendiera hasta el byte cómo funciona la computadora y el software que utiliza, no habría escrito ni una línea de código en toda su vida.
cat /proc/version
uname -a
searchsploit "Linux Kernel" Metasploit
Para capturar y procesar una conexión, siempre es mejor usar el módulo exploit/multi/handler. Lo principal es establecer el payload correcto, como generic/shell/reverse_tcp o generic/shell/bind_tcp. La shell obtenida en Metasploit se puede mejorar a Meterpreter utilizando el módulo post/multi/manage/shell_to_meterpreter. Con Meterpreter, puedes automatizar el proceso de post-explotación. Por ejemplo, el módulo post/multi/recon/local_exploit_suggester verifica la plataforma, arquitectura y entidades necesarias para la explotación, y sugiere módulos de Metasploit para escalar privilegios en el sistema objetivo. Gracias a Meterpreter, a veces escalar privilegios se reduce a ejecutar el módulo necesario, sin embargo, hackear sin entender lo que sucede bajo el capó no es 'real' (tienes que escribir un informe).
Ejecución local (preparar pruebas de demostración web / android y ejecutarlas localmente)
Las herramientas de automatización para la recopilación local de información te ahorrarán un gran esfuerzo y tiempo, pero por sí solas no son capaces de identificar completamente el camino para escalar privilegios, especialmente en el caso de la explotación de vulnerabilidades del núcleo. Las herramientas de automatización ejecutarán todos los comandos necesarios para recopilar información sobre el sistema, pero también es importante saber analizar los datos obtenidos. Espero que mi artículo te sea útil en esto. Por supuesto, existen muchas más herramientas de las que voy a enumerar a continuación, pero todas hacen más o menos lo mismo; aquí, más bien, se trata de preferencias.
Una herramienta bastante reciente, el primer commit data de enero de 2019. Actualmente, es mi herramienta favorita. La idea es que destaca los vectores de escalada de privilegios más interesantes. Estarás de acuerdo en que es más conveniente recibir una evaluación experta a ese nivel que desglosar datos brutos y monolíticos.
Mi segunda herramienta favorita, también reúne y organiza los datos obtenidos como resultado de la enumeración local.
Este exploit analizará el sistema en busca de condiciones adecuadas para exploits. En esencia, hará el mismo trabajo que el módulo local_exploit_suggester de Metasploit, pero ofrecerá no módulos de Metasploit, sino enlaces a los códigos fuente en exploit-db.
Este script recopilará y organizará gran cantidad de información por secciones, que puede ser útil para formar un vector de escalada de privilegios.
En otra ocasión, analizaré en detalle .
Fuente: habr.com
