Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
EasyTokens — Kali365 - Réplique EvilTokens | Kitploit
Outils/GitHubGitHub/secdev02/easytokens
OSINT pour l'Ingénierie SocialeCollecte d'InformationsPost-ExploitationHameçonnageTests d'IntrusionSécurité CloudCommandement et ContrôleAuthentificationRed TeamingAttaque Adversariale
GitHubsecdev02/easytokens
721240il y a 2 moisVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

EasyTokens

Kali365 - Réplique EvilTokens

Voir le dépôt

EasyTokens

Un serveur de phishing par code d'appareil pour l'émulation d'adversaires. Capture les jetons OAuth Microsoft 365 via le flux Device Authorization Grant. Inspiré par GraphSpy.

Avertissement — Utilisation autorisée uniquement. Cet outil est destiné aux testeurs d'intrusion et aux red teamers opérant sous autorisation écrite explicite. Une mauvaise utilisation peut violer les lois sur la fraude informatique.


Comment ça fonctionne

  1. L'opérateur crée une campagne de code d'appareil via l'interface opérateur.
  2. Une page d'inscription côté victime (thème Dunder Mifflin) affiche le code utilisateur et invite la cible à s'authentifier sur microsoft.com/devicelogin.
  3. Un poller en arrière-plan détecte lorsque la cible termine l'authentification et stocke le jeton d'accès/rafraîchissement capturé dans SQLite.
  4. Le navigateur de la victime est redirigé vers une page de recherche post-authentification.
  5. L'opérateur peut rechercher le OneDrive et les e-mails de la victime via Microsoft Graph en utilisant le jeton capturé.

Architecture

Backend Python (un port par campagne) + front-end nginx + persistance SQLite.

root@kitploit:~
main_server.py          ← unified entry point (run this)
db.py                   ← SQLite persistence layer
html_enroll.py          ← victim enrollment page builder
html_search.py          ← victim post-auth search page builder
css_shared.py           ← shared CSS for operator UI
nginx_helper.py         ← auto-generates and reloads nginx reverse-proxy config
nginx.conf              ← base nginx config (includes /etc/nginx/conf.d/*.conf)

Routes


Nginx — Campagnes par domaine

Lorsqu'une campagne est créée avec un domaine défini, nginx_helper.py écrit automatiquement un bloc serveur par domaine dans NGINX_CONF (/etc/nginx/conf.d/easytokens.conf par défaut) et recharge nginx. Le trafic des victimes arrivant sur le port 80 pour ce domaine est proxyfié vers l'instance Python correcte.

  • Les campagnes sans domaine sont servies directement sur le port Python (3000 par défaut).
  • Les campagnes avec domaine sont servies via nginx sur le port 80.
  • Le nginx.conf de base rejette toute requête dont l'en-tête Host ne correspond pas à une campagne connue (return 444), empêchant l'exposition accidentelle du backend Python.
  • Définissez NGINX_CONF='' ou NGINX_RELOAD_CMD='' pour désactiver la gestion automatique de nginx.

Démarrage rapide (Docker)

root@kitploit:~
docker compose up --build

Ports exposés par Docker :

PortObjectif
80nginx — trafic victime basé sur le domaine
3000Python — interface opérateur + accès direct victime
  • Page victime (directe) : http://localhost:3000/
  • Interface opérateur : http://localhost:3000/app
  • Campagnes par domaine : http://<campaign-domain>/ (routées via nginx sur le port 80)

Les jetons capturés et les journaux sont persistés dans des volumes Docker :

VolumeChemin dans le conteneurObjectif
easytokens-data/data/easytokens.dbBase de données SQLite
./logs/logs/Fichiers de log par requête

Installation manuelle

Prérequis : Python 3.12+, aucun paquet tiers.

root@kitploit:~
python main_server.py

Variables d'environnement


Nœud relais PHP

Le répertoire php-relay/ contient un conteneur Apache/PHP autonome qui agit comme un nœud distribué côté victime. Il sert la même page d'inscription par code d'appareil que le serveur principal, interroge Microsoft directement et transmet les jetons capturés au panneau principal via POST /webhook.

Comment ça fonctionne

  1. Au démarrage, checkin.php envoie une requête POST à POST /relay/checkin sur le panneau principal, en s'authentifiant avec RELAY_SECRET. Le panneau enregistre le nœud et retourne un node_id.
  2. Les victimes naviguent vers la page d'inscription du relais (index.php), qui initie un nouveau flux de code d'appareil.
  3. Le JS côté navigateur interroge poll.php. Lorsqu'un jeton est capturé, poll.php le transmet à POST /webhook sur le panneau principal, étiqueté avec le node_id.

Variables d'environnement du relais

Configurer dans php-relay/.env :

Démarrage rapide

Les deux conteneurs simultanément (recommandé) :

root@kitploit:~
# from EasyTokens/
docker compose -f docker-compose.yml -f php-relay/docker-compose.yml up --build

L'exécution des deux avec une seule fusion -f les place sur le même réseau Docker, donc MAIN_SERVER_URL=http://easytokens:3000 se résout correctement.

Accès :

URLObjectif
http://localhost:8082/Page d'inscription victime du relais
http://localhost:3000/app/nodesVue opérateur des nœuds relais enregistrés

Relais uniquement (panneau distant) :

root@kitploit:~
cd php-relay
# Set MAIN_SERVER_URL to the public panel URL in .env
docker compose up --build

Configuration du secret partagé

  1. Générer un secret : openssl rand -hex 32
  2. Définir RELAY_SECRET=<secret> dans EasyTokens/.env (pris en compte par le panneau principal via docker-compose.yml)
  3. Définir la même valeur dans php-relay/.env

Base de données

Deux tables dans la base de données SQLite :

  • tokens — chaque jeton d'accès/rafraîchissement capturé (UPN, jeton d'accès, jeton de rafraîchissement, jeton d'ID, portée, source, horodatage de capture)
  • device_codes — campagnes initiées par l'opérateur (code utilisateur, code d'appareil, URL de vérification, statut, ID de jeton lié, port, domaine)

Détails OAuth Microsoft


Licence

MIT — Copyright (c) 2026 Casey Smith

Télécharger l’outil
MéthodeCheminAudienceDescription
GET/VictimePage d'inscription par code d'appareil (thème Dunder Mifflin)
POST/pollVictime (JS)Interroge le point de terminaison du jeton MS ; stocke le jeton en cas de succès
GET/search?s=<id>VictimePage de recherche OneDrive/e-mail post-authentification
GET/appOpérateurTableau de bord — statistiques + captures récentes
GET/app/device-codesOpérateurToutes les campagnes avec statut de sondage en direct
POST/app/device-codes/newOpérateurCréer une nouvelle campagne de code d'appareil
GET/app/tokensOpérateurTous les jetons capturés
GET/app/search?id=<id>OpérateurRecherche OneDrive + e-mail pour un jeton spécifique
POST/webhookNœud relaisIngérer un jeton depuis un nœud relais authentifié
POST/relay/checkinNœud relaisEnregistrer un nœud relais ; retourne node_id
VariablePar défautDescription
PORT3000Port d'écoute du serveur Python
PORT_MAX3010Limite supérieure de la plage de ports exposée par Docker
DB_PATH/data/easytokens.dbChemin de la base de données SQLite
LOG_DIR/logsRépertoire des logs par requête
NGINX_CONF/etc/nginx/conf.d/easytokens.confChemin où nginx_helper écrit la configuration générée ; définir sur '' pour désactiver
NGINX_RELOAD_CMDnginx -s reloadCommande shell pour recharger nginx après les modifications de configuration ; définir sur '' pour désactiver
RELAY_SECRET(non défini)Secret partagé pour l'authentification du nœud relais. Générer avec openssl rand -hex 32. Doit correspondre à RELAY_SECRET dans php-relay/.env. Laisser non défini pour désactiver le support du relais.
VariablePar défautDescription
MAIN_SERVER_URLhttp://easytokens:3000URL du panneau principal accessible depuis l'intérieur du conteneur relais
RELAY_SECRET(requis)Doit correspondre à RELAY_SECRET sur le panneau principal
RELAY_PORT8082Port hôte pour exposer le relais
RELAY_LABELnom d'hôteNom lisible affiché dans le panneau pour ce nœud
CHECKIN_RETRIES10Tentatives de réinscription avant d'abandonner
CHECKIN_DELAY5Secondes entre les tentatives de réinscription
NODE_ID_FILE/tmp/relay_node_idChemin où le node_id est mis en cache après l'inscription
ChampValeur
ID clientd3590ed6-52b3-4102-aeff-aad2292ab01c (Microsoft Office)
Ressourcehttps://graph.microsoft.com
Portéesopenid profile email offline_access Mail.Read Files.Read
URL du code d'appareilhttps://login.microsoftonline.com/common/oauth2/devicecode
URL du jetonhttps://login.microsoftonline.com/Common/oauth2/token