Ghetto Escalada de privilegios con. bashrc
TurboBorland (Tyler Borland)
Lo común no es más
El título es un play off de «Lo que es viejo es nuevo otra vez.» Un dicho que generalmente golpea a los que han estado haciendo trabajo de seguridad por un tiempo y comenzar a ver redescubrimientos de técnicas antiguas. Sin embargo, creo que esto no es aplicable al tema que nos ocupa. Empecé a darse cuenta de que algunos de los fundamentos están verdaderamente muriendo por tanto la seguridad «profesionales» y los que se llaman a sí mismos hackers. Tomé una encuesta en todo el que sabía cómo utilizar bashrc maliciosamente y nadie realmente sabía. Parece que de fácil acceso exploits de escalada de privilegios han acabado con la creatividad y todas las viejas técnicas fáciles que todavía se utilizan hoy en día. Este blog es una de esas técnicas que parecen demasiado evidente (si sabes Linux) después de que usted lo ha leído.
¿Por qué utilizar bash (rc | _profile).
Con la multitud de exploits de escalada de privilegios públicos y negociados y la mayor atención a las vulnerabilidades supervisados en la lista de correo de Linux y publicado en las listas de seguridad, ¿por qué usaríamos bashrc? Bueno, es un plan de copia de seguridad fácil. Cuando no hay nada disponible, los permisos de alguna manera los problemas no están disponibles / útil, el cuadro está usando los parches más recientes, y Kees de Cook acaba de matar el último error que tenía, usted todavía necesita alguna opción para seguir adelante. Aquí es donde el entorno del terminal y la manipulación del usuario entra en juego. Hoy vamos a estar abusando de bash.
Qué es bash.. (rc | _profile)
Para los nuevos en el mundo linux, ~ / bashrc se utiliza para definir el comportamiento de una nueva ventana de terminal cuando ya se ha autentificado Esto puede controlar la apariencia, sensación y la interacción de la terminal. De colores para las variables de entorno. Hay, por supuesto, una distinción única entre estos dos archivos. Si un usuario conectado se abre una nueva terminal o se ejecuta / bin / bash,. Bashrc será aprovechada. Donde como. Bash_profile es un poco más interesante. Cuando bash se presentó como un intérprete interactivo de ingreso, se utilizará. Bash_profile. Podemos encontrar que mediante la lectura de manual de bash:
«Cuando bash se llama como un shell de entrada interactivo o como un shell no interactivo con la opción – login, primero lee y ejecuta comandos desde el archivo / etc / profile, si existe ese archivo. Después de leer ese archivo, busca ~ /. bash_profile, ~ /. bash_login y ~ / profile., en ese orden, y lee y ejecuta órdenes desde el primero que existe y es legible «.
«Cuando se inicia un shell interactivo que no es un shell de entrada, bash lee y ejecuta órdenes desde ~ /. bashrc, si existe ese archivo.»
La parte interesante de estos archivos es que se puede configurar cómo sus comandos operan. Un ejemplo sencillo de esto es el alias que le da la capacidad de crear y reemplazar los nombres de comandos y sus valores asociados. Por ejemplo, al escribir en el terminal Sudo entiende donde este binario es en realidad y apuntará a la misma. Pero con alias podemos simplemente hacer alias sudo = / bin / ls y ahora al escribir Sudo terminal realmente le a / bin / ls puntos. Esto permite una fácil secuestro de los comandos más comunes que se utilizan para obtener privilegios.
Abusar bash. (rc | _profile)
Cuando estás en un sistema, normalmente más altos privilegios son buscados por un mayor nivel de control . Tal vez para soltar un rootkit para vigilar / controlar en un sistema. Asumiendo nuestra premisa inicial, la manipulación del usuario podría ser la vía adecuada para continuar. Alias se utilizarán para el vector de ataque. Lo que haremos es objetivo Sudo y crear un simple envoltorio en bash. A continuación vamos a señalar sudo para este contenedor en. Bashrc. Esto se utiliza para agarrar la contraseña para que podamos escalar apropiadamente en una fecha posterior. La razón y sólo la usamos. Bashrc es porque. Bash_profile se carga. Bashrc. . Usted puede ser que desee comprobar si este es el caso con su bash_profile, se vería como:
small;"> style="font-size: # Obtener los alias y las funciones
if [-f ~ / bashrc.], luego
. ~ /. Bashrc />
Wrap It antes de tocar It mientras test $ #-gt 0; no />
turno;
hecho $ string
Vamos a caminar a través de este. En primer lugar, comprobar si existe el archivo de contraseñas. Un simple archivo chak. Fue creado para esto. Sería mejor para ocultar a la basura fuera del directorio actual y apropiado ~ /. Eso es más de una enumeración correspondiente del sistema en donde un buen lugar para esconderse que sería. A continuación, seguimos el ejemplo Sudo pedirá exactamente como se vería a través de una llamada sudo normal. Sólo hacemos esto una vez para este contenedor particular. Cuando hemos encargarían la contraseña en algún archivo oculto, vamos a recorrer todos los argumentos dados y añadirlos a una cadena. La cadena se ejecuta con $ string con todos los argumentos pertinentes que estaban destinados originalmente para Sudo. La próxima vez que se ejecute sudo, se pasa la comprobación de archivos y descendemos a un sudo normal. Esto anula el billete ventana época posible.
Ahora todo lo que hay que hacer es esto alias en ~ /. bashrc como «alias sudo =» / lugar / a / wrap.sh «. Entonces usted puede esperar o intento de ingeniero social (es decir: estrellar un servicio) que el usuario realice un comando sudo. Por supuesto, puede ser que utilicen su, pero usted puede tomar el mismo proceso que con sudo para envolver que apropiadamente. Este ejemplo no viene sin fallas, sin embargo.
Cuestiones Wrapper
Esto es más que un reto para el lector a hacer si quieren. El principal problema es que esto permite 4 intentos de contraseña porque estamos emulando un intento contraseña y luego llamar sudo real. Para derrotar a este querríamos emular como si la contraseña ha fallado 3 veces, a continuación, sólo decir apropiadamente el usuario fallaron 3 veces y salir fuera. La próxima vez que se corrió sudo, existe el archivo, por lo que se rompe el lazo de inmediato va a sudo con argumentos dados apropiadamente. La otra cuestión es si los comandos irregulares se están utilizando como-A para envolturas sudo personalizado. Sería más apropiado para descubrir cómo el usuario está haciendo sudo antes de envolverlo para que no caigan en la trampa. Sin embargo, esto sólo ocurre en situaciones irregulares y, ciertamente, no es común.
El usuario no puede usar sudo y podría usar su. Se toma el mismo proceso al envolver cualquier comando, por lo que podría ser una buena idea crear sólo dos envoltorios y ponerlos en. Bashrc.
La última cosa es que podría haber otras cuestiones basándose en la forma en que el usuario utiliza su sistema. Apropiadamente enumerar cómo funciona el usuario y lo que hacen es importante para no ser atrapado. Plantar impagos sin por lo menos intentar hacer la investigación no es realmente en su mejor interés. A veces, sin embargo, simplemente no se puede evitar.
Conclusión />
me gustaría terminar esto con una gran cita de la Zero Para 0wned zine 0x5:
«¿Estás tipos profesionales realmente esta fuera de contacto? veo todos estos artículos sobre cómo protegerse de estas técnicas de super-fucking-avanzadas y exploits que muy pocas personas pueden desarrollar realmente, y la mayoría de los hackers se NUNCA USE. Son las cosas simples que funciona ahora, y continuará trabajando años en el futuro. No sólo es manera más fácil de dev para errores simples, pero son más fáciles de encontrar y son más abundantes. »
Addendum />
Alguien dijo sobre el acaparamiento de las aportaciones de Sudo directamente con el truco LD_PRELOAD. Pensé que esto era una buena pregunta suficiente para elaborar en. Al utilizar cualquier cosa que es setuid / setgid, variables de entorno «peligrosos» consiguen despojados con SELinux. Significado del secuestro LD_PRELOAD conseguiría despojado. Así, mientras que LD_PRELOAD sería más atractivo (y no tan fácil como un pequeño script bash), no sería tan estable debido a la cantidad de sabores utilizando SELinux por defecto.
http://sourceware.org/git/?p=glibc.git; a = blob_plain; f = sysdeps / generic / unsecvars.h; mp = CABEZA