Catégories
P'Hack CTF Write-ups

P’Hack CTF – Agent Secrétariat

Aujourd’hui nous allons voir le write-up d’un challenge très sympa de Social Engineering (ou ingénierie sociale en français) que j’ai first blood lors de ma participation au P’Hack CTF avec la team Arn’Hack.

Description du challenge

Agent Q,

Voici le brief que nous avons reçu du haut commandement. 
Effectuez votre mission dans les plus brefs délais et indiquez-nous les informations compromises.

Cible
* Mlle NICHE Jessica

Moyens
* Tous

Autorisations
* Utilisation de la force (si nécessaire) : Oui
* Permis de tuer : Non
* Dommages collatéraux : Acceptables

Dates possibles pour l'attaque
* Du 02 avril 2021 au 11 avril 2021

Votre pays compte sur vous,

Secrètement,

Agent ❤️

Auteurs du challenge :
@Eagleslam
@Vayne (alias Jessica)

Information gathering

La première étape de ce challenge est plutôt simple : on doit trouver un point d’entrée pour contacter Jessica NICHE et lui exfiltrer des informations…

Après avoir tappé “Jessica Niche” dans google, le premier résultat est un compte LinkedIn d’une certaine Jessica qui serait directrice et fondatrice du P’Hack CTF. Nice !

Profil de Jessica NICHE sur LinkedIn

On a donc 3 informations capitales :
– Elle est directrice / fondatrice du P’Hack CTF
– Elle cherche un travail
– Son adresse mail est nichejessica27@gmail.com

Idée de phishing

On comprends alors ici rapidement que le but du challenge est d’envoyer un mail de phishing à Jessica lui proposant une offre d’emploi (ou quelque chose du genre, en rapport avec sa recherche d’emploi).

MAIS, parce que j̶e̶ ̶n̶’̶a̶i̶ ̶p̶a̶s̶ ̶v̶u̶ ̶q̶u̶’̶e̶l̶l̶e̶ ̶c̶h̶e̶r̶c̶h̶a̶i̶t̶ ̶u̶n̶ ̶t̶r̶a̶v̶a̶i̶l j’ai eu envie d’être original, j’ai eu l’idée de tenter une autre approche : je vais exploiter le fait qu’elle travaille pour le P’Hack CTF plutôt que le fait qu’elle cherche un travail.

On peut remarquer l’utilisation d’un (très sympa) thème CTFd sur le site du CTF (https://ctf.phack.fr/) : je vais me servir de ça et me faire passer pour l’équipe de CTFd.

Mail de phishing

Pour un peu plus de réalisme, j’ai créé l’adresse mail “noreply.ctfd@gmail.com” qui me servira à envoyer un splendide mail à Jessica.

Je commence par ajouter une signature au mail de cette façon (sur Gmail) : Paramètres > Voir tous les paramètres > Signature.

Signature de mail pour plus de réalisme

J’écris ensuite un mail en anglais prétextant le nécessité d’effectuer un patch de sécurité existant dans CTFd (CVE-2020-7245) avec une option directement intégrée dans le panel admin du CTFd du P’Hack CTF.

Mail de phishing envoyé à Jessica

Il ne reste donc plus qu’à faire un clone du login du CTFd du P’Hack CTF et remplacer l’adresse du dernier lien du mail par notre lien à nous.

Création d’un clone du site du P’Hack CTF

Clonage du site web

Pour créer et host ce clone du site officiel, on commence par ramener le site web en local via un logiciel comme Site Sucker sur mac (vous pouvez trouver beaucoup d’alternatives). Je choisis de cloner le site entier (jusqu’à l’étape du login) et non seulement la page /login.html.

Clonage du site officiel avec Site Sucker
Tous les fichiers du site ramenés en local

Déploiement du site web en local avec MAMP

Je déplace ensuite tout le contenu vers /Users/Julien/Sites/localhost et monte un serveur web en local avec MAMP avec un Apache sur le port 4444.

Serveur web en local avec MAMP

On peut alors vérifier que tout fonctionne bien en local en tapant notre IP locale (ou “localhost”, ou encore “127.0.0.1”) suivie du port 4444 dans notre barre de navigation.

Page “index.html” de notre clone
Page “login.html” de notre clone

Tout fonctionne, c’est top !

Mise en ligne du site web avec ngrok et flag

Dernière étape : on va setup ngrok, toujours sur le port 4444, pour mettre notre site web local en ligne (indirectement) et pouvoir récupérer les identifiants entré dans la page de login !

┬─[SoEasY@MacBook:~/Downloads]─[14:28:11]
 ╰─>$ ./ngrok http --log=stdout -host-header=localhost 4444
 INFO[04-04|15:33:19] no configuration paths supplied 
 INFO[04-04|15:33:19] using configuration at default config path path=/Users/Julien/.ngrok2/ngrok.yml
 INFO[04-04|15:33:19] open config file                         path=/Users/Julien/.ngrok2/ngrok.yml err=nil
 t=2021-04-04T15:33:19+0200 lvl=info msg="starting web service" obj=web addr=127.0.0.1:4040
 t=2021-04-04T15:33:19+0200 lvl=info msg="tunnel session started" obj=tunnels.session
 t=2021-04-04T15:33:19+0200 lvl=info msg="client session established" obj=csess id=47cfd709d2bf
 t=2021-04-04T15:33:19+0200 lvl=info msg="started tunnel" obj=tunnels name="command_line (http)" addr=http://localhost:4444 url=http://e85aaa29635b.ngrok.io
 t=2021-04-04T15:33:19+0200 lvl=info msg="started tunnel" obj=tunnels name=command_line addr=http://localhost:4444 url=https://e85aaa29635b.ngrok.io

Nice. On a donc notre clone accessible à l’adresse https://e85aaa29635b.ngrok.io (elle sera down à la publication de cet article, inutile d’essayer d’y accéder :D).

Il ne nous reste plus qu’a mettre cette adresse (ou plutôt “https://e85aaa29635b.ngrok.io/login.html”) comme pointeur du dernier lien hypertexte de notre mail et surveiller les requêtes effectuées depuis le panel ngrok à l’adresse suivante : http://127.0.0.1:4040/inspect/http.

En effet, on voit dans le code du login.html que le formulaire de login est envoyé via une requête HTTP de type POST.

<form method="post" accept-charset="utf-8" autocomplete="off">
    <div class="form-group">
        <b><label for="name">User Name or Email</label></b>
        <input class="form-control" id="name" name="name" required type="text" value="">
    </div>
    <div class="form-group">
        <b><label for="password">Password</label></b>
        <input class="form-control" id="password" name="password" required type="password" value="">
    </div>
    <div class="row pt-3">
        <div class="col-md-6">
            <a class="float-left align-text-to-button" href="reset_password.html">
                Forgot your password?
            </a>
        </div>
        <div class="col-md-6">
            <input class="btn btn-md btn-primary-junkbtn-outlined float-right" id="_submit" name="_submit" type="submit" value="Submit">
        </div>
    </div>
    <input id="nonce" name="nonce" type="hidden" value="211682b6c90618c6bd4e91ec8debec0f07e0c3dbe0ea08ba102fe21a4a68a694">
</form>

On envoie donc notre mail, on filtre l’affichage des requêtes sur la page de login et après un peu d’attente Jessica finit par tomber dans notre piège.

Jessica tombe dans le piège, le flag est dans le mot de passe

On récupère donc le flag : PHACK{U_gOt_mY_P4sswOrD_wi7h_s0ci4l_3ngin33ring} !

Améliorations possibles et warning

Même si cette solution a fonctionné pour le cas de Jessica qui n’était visiblement pas très informée sur les risques et attaques par phishing, certains points auraient pu être améliorés.

Pour commencer, l’adresse mail noreply.ctfd@gmail.com n’est pas très crédible et il est possible d’usurper des noms de domaine, des emails en manipulant le protocole SMTP via des scripts custom par exemple.

Ensuite, le fait d’afficher un lien qui redirige vers un autre lien est mis en avant par certains client mail comme Thunderbird et le mail peut donc directement être identifié comme spam.

De plus, une fois le lien malicieux cliqué, on se rend vite compte que l’adresse web n’est visiblement pas l’adresse du site officiel : des moyens que je ne détaillerais pas ici peuvent permettre de faire paraître le site plus, voir complètement légitime.

Je profite du coup de cet article pour sensibiliser aux bonnes pratiques quant au phishing : vérifiez bien les liens, les mails suspicieux, les adresses des sites web qui vous demandent de rentrer des informations personnelles, les documents suspicieux attaché aux mails etc…