/ / No obtener shell de root cuando se hace una explotación de desbordamiento de búfer - linux, bash, desbordamiento de búfer

No se obtiene el shell raíz cuando se realiza la explotación de desbordamiento de búfer - linux, bash, buffer-overflow

Estoy aprendiendo explotaciones de desbordamiento de búfer en Linuxbinarios x86. Estoy haciendo un aplastamiento clásico de la pila para generar un shell raíz en una máquina virtual de Ubuntu 12.04 al deshabilitar ASLR y compilar el binario al deshabilitar los bits NX y apilar los canarios.

Durante mi ejecución, la dirección de retorno se sobrescribe y el código de shell se ejecuta, pero no obtengo el shell de root, en lugar de eso, se genera un shell de bash.

Para mitigar la protección de bash, estoy usando la shell zsh y he eliminado el enlace simbólico sh-> bash y he creado un enlace simbólico de sh con la shell zsh en el directorio / bin

He intentado con un binario habilitado para setuid propiedad de root (permiso de ejecución para otro usuario), pero aún no estoy obteniendo el shell de root

He verificado mi código de shell con el programa C ymientras compilé el programa de prueba (de mi código de shell) y lo ejecuté después de habilitarlo. por lo que el programa de prueba está dando root shell. Pero no puedo obtener el shell raíz cuando se utiliza el mismo shellcode con el desbordamiento del búfer.

Cuando estoy depurando este escenario en gdb, durante el desbordamiento / bin / zsh4 se ejecuta, pero resulta en un shell bash.

Incluso no soy capaz de obtener root shell con unvolver al ataque libc también. Eso también resulta en un shell bash. He intentado estos pasos en Ubuntu 12.04, Ubuntu 11.04 y Ubuntu9, pero el resultado es el mismo.

Soy principiante en esta área. Así que puede haber algunos errores que he cometido en cualquiera de los pasos anteriores. Entonces, ¿podría alguno de ustedes asesorar cuál podría ser el posible problema y cómo resolverlo?

Respuestas

3 para la respuesta № 1

Finalmente descubrí la razón de este error.

Durante mi ejecución mi privilegio de raíz fue abandonadoporque había deshabilitado el seguimiento del nivel del sistema de proceso para trabajar en otra herramienta. Había sobrescrito el valor de / proc / sys / kernel / yama / ptrace_scope a 0. Esta fue la razón por la que no obtuve el shell de root.

Encontré esta información en la página man de execve (que estaba usando para crear shellcode):

Si el bit de ID de usuario establecido se establece en el programaarchivo apuntado por nombre de archivo, y el sistema de archivos subyacente no está montado nosuid (el indicador MS_NOSUID para mount (2)), y el proceso de llamada no es se está procesando, entonces el ID de usuario efectivo del proceso de llamada es cambiado a la del propietario del archivo de programa. Del mismo modo, cuando el bit set-group-ID del archivo de programa se establece como el ID de grupo efectivo del proceso de llamada se establece en el grupo del archivo de programa.

Así que ahora, cuando no estoy deshabilitando ptrace_scope, estoy obteniendo un shell de root.

Gracias a Merlin2011 y Naab por ser parte de esta discusión.