Malgré des restrictions réseau strictes, l’entreprise a été victime d’une fuite de données sensibles.
Un tunnel de communication non détecté aurait permis à l’attaquant d’exfiltrer les informations sans déclencher d’alerte.
## Objectif de la mission :
- Déterminer lequel des deux exécutables suspects a servi à l’exfiltration de données
- Reconstituer le mécanisme de tunnel de sortie utilisé
- Identifier l’auteur de l’attaque
## Documents mis à votre disposition :
- Binaire svc_updater
- Binaire data_handler
## Votre rôle :
- Analyser en profondeur les deux exécutables
- Identifier les éléments indiquant un comportement d’exfiltration
- Reconstituer le canal de communication employé par l’attaquant
- Relier les indices collectés à un acteur ou à une méthodologie connue
Pour répondre à la première question, il faut décompiler et analyser le binaire svc_updater.
Pour ce faire, nous allons utiliser un outil tel que Ghidra.
Une fois le binaire chargé dans Ghidra, nous pouvons commencer à explorer sa structure et son fonctionnement. On remarque rapidement que quasiment l’intégralité du code se trouve dans la fonction main.
Après analyse et lecture du code, on observe que plusieurs fonctions permettant de binder un socket sont utilisées.
Après avoir consulté la documentation afin de comprendre comment fonctionne le bind d’un socket, on s’intéresse plus particulièrement à la fonction getaddrinfo() et à ses paramètres.
D’après la documentation, le troisième argument de la fonction getaddrinfo() est un pointeur vers une structure addrinfo, qui contient des informations sur l’adresse à laquelle le socket doit être liée.
Notamment, le protocole utilisé pour le socket est spécifié dans le champ ai_protocol de cette structure

La variable local_138 est un pointeur vers une structure addrinfo qui contient des informations sur l’adresse de liaison du socket.
Grâce à la documentation de la structure addrinfo, on peut identifier les valeurs suivantes :
3 correspond à SOCK_RAW
1 correspond au protocole Internet Control Message Protocol
10 correspond à AF_INET6, ce qui signifie que le socket est de type IPv6
0x3a correspond à 58, la valeur associée à Internet Control Message Protocol v6
Cela nous permet de déterminer avec précision le protocole utilisé par le socket.
Dans un premier temps, nous allons exécuter le binaire data_handler avec un argument pour observer son comportement

On observe que le binaire réagit et affiche un message d’erreur "Incorrect password".
On va donc décompiler le binaire avec Ghidra pour trouver cette chaine de caractères et essayer de trouver le mot de passe.
Une fois la chaine de caractères localisée, on remonte le code et on observe que la fonction is_correct_password est appelée

En analysant cette fonction, on remarque 4 fonctions qui attirent notre attention :

En analysant la première fonction on observe plusieurs valeurs qui sont stockées dans un tableau

Quand on regarde la correspondance des valeurs dans la table ASCII on remarque que seuls les éléments stockés dans la variable
local_78 sont des caractères ASCII qui correspondent à _event
Nous allons donc analyser les autres fonctions pour comprendre comment récuperer les valeurs.
Dans la première fonction, on observe un XOR avec la valeur 0x42

Nous observons une loop qui va de 0 à 4, on peut donc déduire que un caractère ascii xoré avec 0x42 donne les premiers caractères du mot de passe.
En reprenant les valeurs du tableau, on trouve les 4 premiers caractères du mot de passe : F1C_.
Dans la deuxième fonction, on observe un XOR avec la valeur 0x39

Dans cette fonction, la loop va de 4 à 19, on peut donc déduire qu'un caractère ascii xoré avec 0x39 donne les caractères du mot de passe de la 5ᵉ à la 19ᵉ position.
En reprenant les valeurs du tableau, on trouve les caractères du mot de passe de la 5ᵉ à la 19ᵉ position : What_an_amazing.
Plus loin de la fonction main on peut apercevoir une fonction qui s'appelle send_data

En examinant la fonction send_data, on peut observer une commande curl effectuée

On sait que curl nous permet de faire des requêtes HTTP ou des requêtes HTTP secure, ce qui nous laisse le choix.
Il suffit donc de déterminer vers quelle URL est envoyée la donnée.
Plus haut dans la fonction on peut voir une variable se nommant url_xor qui se fait xorée avec la valeur 0x5a

En déchiffrant le xor, on peut obtenir l'url complète.
Grâce au déchiffrement de l'url à l'étape 3, cela nous permet de voir dans l'url le nom de l'attaque.
Car l'api github est composée de https://api.github.com/repos/