App - Système

vendredi 19 juillet 2019, 15:18  #1
annonce [FAQ] dash droppe ses privilèges !
das
das
  • 57 posts

"Lors de l’exploitation d’un binaire setuid, je récupère un shell mais avec les mêmes permissions qui étaient les miennes au lancement ?"

Pour des raisons de sécurité et depuis environ 15 ans (https://unix.stackexchange.com/questions/451048/from-which-version-does-bash-drop-privileges) bash droppe ses privilèges si le UID effectif n’est pas le même que le UID réel. En conséquence, dash, qui est visé par un lien symbolique depuis /bin/sh sur nos machines, a reçu un patch début 2018 et a maintenant le même comportement (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=734869).

De la manpage bash (https://linux.die.net/man/1/bash) : Si l’interpréteur est lancé avec un identifiant (de groupe) d’utilisateur effectif différent de l’identifiant (de groupe) d’utilisateur réel et si l’option -p n’est pas fournie [...] l’identifiant de l’utilisateur effectif est configuré à celui de l’utilisateur réel. Si l’option -p est fournie à l’appel, le comportement au démarrage est le même mais l’identifiant d’utilisateur effectif n’est pas modifié.

Il existe plusieurs moyens de contournement :
* l’utilisation d’un shellcode qui modifie uid/gid voulu
* l’utilisation d’un shellcode qui passe l’option ’-p’ option pour ne pas changer le UID effectif
* l’utilisation d’un shellcode qui pointe vers un wrapper qui va d’abord appeler setreuid() puis system()

Voilà un exemple de wrapper que l’on peut placer dans un répertoire disponible en écriture, typiquement /tmp/ :

#include <stdlib.h>
#include <unistd.h>

int main(void)
{
   setreuid(0, 0); // 0 correspond à root, peut être amené à changer suivant votre utilisation
   system("/bin/bash");

   return 0;
}