CTF Write-Up

entièrement en français et réalisé par ThaySan.

View on GitHub

[web] DoctoLeak - 100pts

titre: DoctoLeak

categorie: Web

difficulté: Moyen

points: 100

description: Je dois trouver le numéro de sécurité sociale du Patient 0 ! </br> C'est une question de vie ou de mort...

connection: http://doctoleak3.chall.malicecyber.com/

Solution

En se rendant tout en bas du site, on trouve un lien vers une api GraphQL.

Lien vers l'API

Pour exploiter cette API, j’utilise ici Postman et sa fonctionnalité GraphQL.

Lien vers l'API

En copiant collant le lien de l’API dans le champ d’URL de Postman, la récupération du schéma est faite automatiquement et l’on trouve les différentes query et mutations disponibles.

Lien vers l'API

On ne peux évidemment pas simplement lister les patients pour trouver notre Patient 0. Si l’on essaie toutes les query et mutations :

On est donc très limité pour explorer. La seule query utilisable est doctors, qui sert à lister les docteurs.

Lien vers l'API

Puisque options attend un JSON, commençons par en mettre un vide, on récupère alors la liste des docteurs mais on ne peut pas récupérer leurs mails ou leur mot de passe, une erreur apparaît s’il on essaie.

L’erreur en question est : Cannot return null for non-nullable field Doctor.email. Cela signifie qu’il y a probablement un filtre empêchant de renvoyer les mails, leur valeur est alors définie à null et comme cela ne correspond pas au schéma attendu, GraphQL génère une erreur.

On peut aussi lister leurs patients mais ceux-ci sont toujours null, cependant comme dans le schéma ce champ est nullable, aucune erreur n’est générée.

En essayant de jouer avec options, on peut voir que si l’on met {"email": "test"}, on pourra cette fois-ci lister tous les docteurs avec leur mails, mais ceux-ci auront la valeur "test". On vient de définir une valeur par défaut. C’est ce qu’on appelle de la projection.

Options avec les emails ayant pour valeur "test"

En tentant quelques modifications, on peut essayer {"email": true} (ou {"email": 1}, cela fonctionne aussi), pour une raison assez obscure, cette projection va bypasser le filtre et récupérer la vraie valeur du champ :

Options en projetant les emails

On peut alors récupérer les mails et mot de passe des docteurs, se connecter à leur place et lister les patients.

Ou alors simplement lister directement tous leurs patients avec la même technique et chercher le Patient 0 à l’intérieur, l’options est alors :

{
  "patients": {
    "ssn": 1,
    "firstName": 1,
    "lastName": 1
  }
}

Liste des patients par docteurs

Tout en bas on trouve notre Patient 0 et son numéro de sécurité sociale.

FLAG : b16cff8b-4a5a-41c8-8545-d9880fd7aae5