IRBF attack

Charpentier A., De-Pontac C., Le Bohec R. , Miralves T., Naulin A., Rataud Q.

← IRBF attack · Conversation fatale / Mais d'ou?! / 3e étape : Exfiltration / Un furet dans le labo?

Mais d'ou?!

Après avoir découvert que le PC de Thomas était infecté, une question persiste : comment l'attaquant a-t-il eu accès aux données du labo?

L'infiltration du laboratoire IRBF a franchi une nouvelle étape. L'assaillant, après avoir réussi à pénétrer notre Active Directory grâce à un document Excel piégé et à établir une tête de pont avec un reverse shell HTTP, détient désormais un accès sur l'une de nos machines. La question cruciale demeure : comment a-t-il, à partir de là, **escaladé ses privilèges** pour finalement compromettre notre **base de données** ?

Chaque log, chaque enregistrement de notre AD est devenu une pièce du puzzle. Nous devons reconstituer le chemin parcouru par l'attaquant : les mouvements latéraux, les tentatives de reconnaissance, l'exploitation de failles, les exfiltrations potentielles d'identifiants... Tout ce qui a pu lui permettre de passer d'un simple accès machine à la mainmise sur nos données les plus sensibles doit être mis en lumière. Les moindres traces de son passage sont notre seule chance de comprendre et, espérons-le, de sécuriser notre infrastructure.

Cote 23 pts

Faire son rapport

Détection de l'attaque

En analysant les logs, on peut voir un nombre important d'événements 4769
signifiant de nombreuses requêtes de tickets Kerberos.

Recherche dans les fichiers d'évènements Windows

Un outil tel que hayabusa permet de trouver des indices sur l'attaque utilisée.

# Ici sur les logs du DC
$ hayabusa json-timeline -d Log_DC/ -L -o Log_DC/timeline.jsonl -w -U -p super-verbose

infos générales

Les logs Kerberos sont stockés sur le contrôleur de domaine.

Voici une façon de chercher:

$ hayabusa search -d Log_DC --keyword 4769 --keyword ticket

[!IMPORTANT]
Le format de la date est en UTC,
La conversion peut se faire avec hayabusa: hayabusa search ... --UTC

Ce qui donne, entre autres, une série de requêtes de tickets de service Kerberos :
tickets de service
On remarque une fréquence très élevée de ces tickets, typique de l'attaque
cherchée.

Heure de l'attaque

Les logs sont horodatés et on peut voir qu'un nombre important d'événements 4769
a eu lieu le 11 juin à 00h03.

Compte usurpé

À la suite de cette attaque, on peut voir sur les logs du PC
qu'un utilisateur inhabituel s'est connecté depuis le PC du stagiaire. On peut
donc en déduire l'utilisateur usurpé.

L'outil takajo donne les connexions au PC du stagiaire, à partir du fichier
timeline.jsonl généré par hayabusa:

$ ./takajo timeline-logon -t Log_PC/timeline.jsonl -o logon_timeline_pc.csv                         

new logon


Identification du type de l'exécutable

Nous devons ouvrir l'exécutable dans un décompilateur comme Ghidra.

Ghidra 1
Ghidra 2
Ghidra 3

Nous sommes maintenant dans le programme principal de l'exécutable. Nous pouvons voir qu'il y a des appels aux fonctions socket et closesocket, ainsi qu'à la fonction qui permet de s'y [FLAG]. Ces fonctions sont typiques d'un reverse shell.

Identification de l'appel système de connexion

Ghidra 3

Comme nous l'avons vu précédemment, nous avons identifié l'appel système pour se [FLAG] à un socket.

Identification de l'exécutable appelé

Ghidra 4
Ghidra 5

On peut voir la fonction CreateProcessA qui est utilisée avec la variable local_10.
Cette variable est une chaîne de caractères qui contient le nom de l'exécutable à exécuter.

On voit plusieurs caractères de la chaîne qui sont remplacés par des valeurs.
En la reconstruisant, on peut voir que l'exécutable est le cmd de Windows.

Analyse du code pour trouver l'IP et le port

Ci-dessous, des valeurs sont stockées dans une structure qui sera donnée en paramètre. D'après les décalages d'adresse, les valeurs ne sont pas dans l'ordre mémoire de la structure.
Ghidra Reg

Ensuite, 2 appels de fonctions sont réalisés pour préparer l'IP et le port de l'appel à socket.
Ghidra Reg2

Ghidra IP

En analysant le code assembleur de la fonction qui génère l'adresse IP, on observe la séquence suivante :

  1. Récupération des valeurs de la structure à l'adresse EAX = EBP + Stack[0x4] et application de transformations :
  2. EAX + 0xc : C'est le 4ème entier de la structure.
  3. EAX + 0x8 : Récupère la valeur du 3ème entier et soustrait 5.
  4. EAX + 0x4 : C'est la seconde valeur de la structure.
  5. EAX : Récupère la première valeur de la structure et soustrait 30.

  6. Les valeurs sont ensuite formatées dans une chaîne "%u.%u.%u.%u" pour construire l'adresse IP.

  7. D'après les valeurs initiales, l'adresse IP résultante est 203.0.113.12.

La fonction ci-dessous calcule le port :
Ghidra Port

Cette fonction :
1. Accède à deux valeurs à partir d'un paramètre :
- L'offset 0x10 (16 en décimal) : correspond à la 5ème valeur de la structure.
- L'offset 0x14 (20 en décimal) : correspond à la 6ème valeur.

  1. Retourne la somme de ces valeurs.

  2. Dans le code source, 80 et 9, donc le port calculé est 91

  3. Le port final est 8000 + 89 = 8089.