2008-10-31 15 views
8

actualizaciónchroot + + execvp fiesta

Lo tienes! Ver mi solución (quinta comentario)

Aquí está mi problema:

He creado un pequeño binario llamado "cárcel" y en/etc/password han convertido en la consola del sistema para un usuario de prueba.

Aquí es el - simplificado - código fuente:

#define HOME "/home/user" 
#define SHELL "/bin/bash" 
... 
if(chdir(HOME) || chroot(HOME)) return -1; 
... 
char *shellargv[] = { SHELL, "-login", "-rcfile", "/bin/myscript", 0 }; 
execvp(SHELL, shellargv); 

Bueno, no importa cuánto lo intente, parece que, cuando mis registros de usuario de prueba en, /bin/miscript nunca lo hará ser originario Del mismo modo, si dejo caer un archivo .bashrc en el directorio de inicio del usuario, también se ignorará.

¿Por qué bash snob estos chicos?

-

Algunas precisiones, no necesariamente relevante, pero para aclarar algunos de los puntos planteados en los comentarios:

  • El binario 'cárcel' es en realidad suid, lo que le permite chroot() exitosamente.
  • He usado 'ln' para hacer que los binarios apropiados estén disponibles - mi celda de la cárcel está bien acolchada :)
  • El problema no parece estar en el usuario ... algo más es negligente.

Respuesta

2

El shell no es interactivo. Intente agregar -i a la lista de argumentos.

4

Como dice Jason C, el intérprete ejecutado no es interactivo.

Su solución obligará a la cáscara de ser interactivo, si acepta -i el sentido de que (y lo hace bash):

char *shellargv[] = { SHELL, "-i", "-login", ... }; 
execvp(SHELL, shellargv); 

Quiero añadir, sin embargo, que tradicionalmente una cáscara actuará como un intérprete de ingreso si ARGV[0] comienza con un guion.

char *shellargv[] = {"-"SHELL, "-i", ...}; 
execvp(SHELL, shellargv); 

Por lo general, Bash detectará automáticamente si se debe ejecutar de forma interactiva o no. Su falla en su caso puede deberse a la falta de /dev/* nodos.

1

Para cuando su usuario inicie sesión y su shell intente obtener este archivo, se está ejecutando bajo su UID. La llamada al sistema chroot() solo es utilizable por root; deberá ser más inteligente que esto.

Además, el acceso al directorio de inicio de un usuario hará que su shell sea inútil, ya que (a menos que tengan muchas cosas allí) no tendrán acceso a ningún archivo binario. Cosas útiles como ls, por ejemplo.

2

Me identifico con querer hacerlo usted mismo, pero si aún no lo ha hecho, revise jail chroot project y jailkit para ver algunas herramientas para crear una concha.

1

Gracias por su ayuda, chicos,

lo he descubierto:

que se olvidó de setuid()/setgid(), chroot(), setuid()/setgid() de nuevo, a continuación, pasar a un ambiente adecuado usando execve()

Ah, y, si me pasa ningún argumento para golpear, que se usa como fuente ~/.bashrc

Si paso "l" si se usa como fuente /etc/profile

¡Salud!

+0

Ah, había asumido (falsamente) que tu chroot tenía todo en los mismos lugares que el sistema típico, o que arreglabas primero el entorno. La falta de setuid/gid back no debería romper esto (aunque eliminaría el beneficio de seguridad del chrooting). – ephemient