Stellar Wars

Thomas C., Matthieu H., Aurelien K.

← Stellar Wars · L'appel du Site / Le Réveil du VPN / Le Réseau Contre-Attaque / Le Dernier Défi

Pour préserver l'intégrité des données après l'attaque, les journaux critiques du serveur de lancement ont été chiffrés par le protocole d'urgence.

L'enjeu est de neutraliser cette mesure de défense en les déchiffrant afin d'avoir une vue globale de cette phase de l'attaque. L'équipe ForenSith devra ensuite traiter le volume massif des journaux pour identifier l'entité ayant obtenu le droit suprême d'initier le tir, bouclant ainsi l'attribution complète de l'attaque.

Suite à l'incident critique, les journaux du serveur de lancement ont été chiffrés, suivant le protocole d'urgence, pour garantir leur intégrité.

Votre mission est de retrouver la clef de déchiffrement des journaux et de remonter la piste de l'attaquant afin de compléter la chaine de la plus grosse attaque qui n'ait jamais touché la Nécropole Stellaire.

Cote 95 pts

Faire son rapport

Résolution Scénario 1 "Stellar Wars" - Exercice 4 “Le Dernier Défi”

Emplacement des fichiers importants pour la résolution.

Alt resolution1

Contexte de l'Investigation

Le scénario simule une attaque par élévation de privilèges réussie visant à exécuter une action critique (le lancement de missile). Le joueur dispose de l'intégralité du corpus de logs nécessaire pour remonter la chaîne d'attaque :

  • Contrôleurs de Domaine (DC) : Preuve des activités Kerberos et des élévations de privilèges.
  • Serveur de Lancement : Logs chiffrés, altérés avec des leurres contenant la preuve de l'exécution finale.

  • Serveur FreeIPA : Logs servant de leurre et de bruit pour détourner l'attention.

L'objectif est de lier l'exécution réussie dans les logs du serveur de lancement à la méthode de compromission observée dans les logs DC.

Démarche d’Investigation

L'investigation est décomposée en deux phases principales : l'analyse des logs serveurs et l'analyse de la méthode de compromission.

Phase A : Confirmation de l'Exécution et Identification de l'Attaquant

Le joueur doit commencer par les logs du serveur de lancement (Nginx et Flask) car ils contiennent l'indice le plus direct de l'attaque finale.

Étape 1 : Déchiffrement Hybride et levé d'obscurcissement

L'attaquant a chiffré les logs avec une approche hybride (RSA pour la clé, AES-256-ECB pour le contenu).

Localisation de la Clé Maîtresse RSA : L'analyste doit fouiller l'arborescence (launching-console/) pour trouver la Clé Privée Maîtresse RSA (la seule .key commençant par deux points).

Déchiffrement des Clés Symétriques : Utiliser la Clé Privée RSA (via openssl pkeyutl -decrypt ou script python) pour déchiffrer les clés AES chiffrées (fichiers *.key.enc dans newchaos/sys/run/temp_keys).

Déchiffrement du Contenu : Utiliser la clé AES obtenue pour déchiffrer le contenu des fichiers access.log.enc et flask.log.enc (via openssl enc -d -aes-256-ecb ou script python).

Étape 2 : Normalisation et Corrélation

Les logs déchiffrés sont dans des formats illisibles (semi-binaire Nginx, JSON malformé Flask). Le joueur doit normaliser ces données pour les analyser (via le script decoder.py (fourni dans le dossier resources) ou une pile ELK).

Approche ELK / Grok : Pour traiter les milliers d'entrées efficacement, l'utilisation d'un filtre Grok est recommandée :
| Log Cible | Format Déchiffré Brut | Pattern Grok |
|-----------|------------------------|---------------|
| NGINX | Semi-binaire : \#X1<epoch>\x1Fip=<ip>\x1Fusr=... | ^#X1%{NUMBER:timestamp:long}\x1Fip=%{IPV4:source_ip}\x1Fusr=%{DATA:user_masked}\x1Fsz=%{NUMBER:size:int}\x1Fag=%{DATA:user_agent}$ |
| FLASK | JSON malformé : {"st":200,"t":164807,"rq":"GET /api/status"} | ^{"t":%{NUMBER:timestamp:long},"rq":"%{DATA:request_type} %{URIHOST:endpoint}","st":%{NUMBER:http_status:int}}$ |

Corrélation Finale :

Recherche du Succès : Filtrer les logs Flask normalisés pour trouver l'entrée /api/launch avec statut 200. Cela donne l'horodatage précis de l'exécution.

Identification de l'Attaquant : Utiliser cet horodatage pour trouver la ligne Nginx correspondante, révélant l'identité masquée (ex: *Doe@STELLARNEC.LOCAL).

Identification Finale : Corréler le suffixe (ex : Doe) avec le fichier des utilisateurs AD fourni pour identifier l'attaquant final : ex. johnDoe.

N.B. : Possibilité de corréler les fichiers Flask / Nginx avec l'IP du lancement réussi pour trouver les autres comptes compromis.

Phase B : Remontée de la Piste de Privilèges (Logs DC)

Une fois le compte johnDoe confirmé comme exécutant l'attaque, le joueur doit analyser les logs des contrôleurs de domaine pour identifier la méthode par laquelle l'attaquant a obtenu ce compte.


Attaque Détectée - Tableau de Synthèse

Attaque Rôle Événements Clés à Rechercher Commandes Forensiques
Tentative d'Énumération AS-REP Roastable Étape préliminaire pour détecter les comptes Kerberos vulnérables (sans pré-authentification). EventID 4768 (TGT Request) - Échec + Pre-Authentication Type = 2 grep -RFi "4768" DC*-logs/
Kerberoasting de svc-Gonkdroid Extraction du hachage du mot de passe du compte service. EventID 4769 (TGS Request) - EncryptionType = 0x17 (RC4-HMAC) grep -RFi "4769" DC*-logs/
abus d'Active Directory Certificate Services / Certiforging Pivot d’élévation : obtention d’un TGT élevé pour sPalpatine. EventID 4768/4771 - PreAuthType = 16 (PKINIT/certificat) associé à sPalpatine grep -RFi "sPalpatine" DC*-logs/

Note : Les logs FreeIPA servent uniquement de leurre. La piste est centrée sur Windows / Active Directory.


Enchaînement Final de l’Attaque Observé

Horodatage Utilisateur Technique & But Confirmation (Logs)
Début johnDoe1 Tentative échouée de lancement (droits insuffisants) Flask/Nginx : statut 403
Milieu johnDoe1 Kerberoasting de johnDoe2 (réussi) DC : EventID 4769, EncryptionType 0x17
Milieu johnDoe2 Tentative échouée d’exploitation du compte compromis Flask/Nginx : 403
Milieu / Fin johnDoe2johnDoe abus d'Active Directory Certificate Services / Certiforging (TGT élevé) DC : PreAuthType 16 \& Modèle de Certificat (ex: CertIdentity)
Final johnDoe Action finale exécutée Flask/Nginx : /api/launch - statut 200