Le Timonier Fantôme d'EXE

Bilal-Rayane M., Nolan D., Louca G., Rayan C., Gabin R., Robin V.

← Le Timonier Fantôme d'EXE · Arrête-moi si tu peux / Import-ant Binaire suspect / Souvenirs Suspects / Orchestration Diabolique

Import-ant Binaire suspect

Un binaire inconnu a été exécuté, probablement transféré depuis le périphérique précédent, et son rôle exact reste à déterminer.

Un binaire suspect a été identifié lors de l’analyse du poste de l’employé. Vous devez déterminer son rôle exact et évaluer s’il a provoqué des actions inhabituelles ou non autorisées sur le système.

Cote 23 pts

Indices

Mince, j’ai oublié ma carte Navigo… je vais devoir prendre un ticket pour passer incognito.

Faire son rapport

Résolution

Étape 1 - Identification du binaire

Quel type d'exécutable ?

La première étape quand on a un binaire qu'on ne connait pas on regarde son type, ELF, PE, striped etc...

$ file my_exploit.exe

myexploit.exe: PE32+ executable (console) x86-64, for MS Windows, 7 sections

Puis on regarde si on peut obtenir des informations supplémentaires.

$ strings my_exploit.exe

!This program cannot be run in DOS mode.
Rich
...
9python313.dll

On retrouve des informations propres à python, on en conclut que c'est un script python qui a été compilé.

Étape 2 - La décompilation

Partie assez anecdotique où il faut juste récupérer le script python qui a été compilé. Avec l'utilisation de PyInstxtractor ou autre outils.

Alt PyInstxtractor

Nous téléchargeons ainsi le fichier zip contenant le contenu extrait du binaire.

Étape 3 - Compréhension des événements

Il faut comprendre quelles actions ont été menées sur un pc qui avait un accès au système d'informations, avec l'aide des bibliothèques utilisées et les actions effectuées par le script.

Grâce à l'étape précédente, nous avons pu récupérer le script python qui a été compilé dans le binaire.

Nous utilisons un outil comme PyLingual pour décompiler le code python extrait.

Pour ce faire, nous analysons les bibliothèques importées dans le script.

Alt Kerberoasting

On remarque l'utilisation de la bibliothèque impacket, qui est une bibliothèque python très utilisée pour les pentests. De plus de par les importations comme :
- from impacket.krbƼ.asn1 import TGS_REP as IllllllIIIllll, AS_REP as IIIIIllIlIIIII
- from impacket.krbƼ.kerberosvƼ import getKerberosTGT

Nous comprenons donc compte que c'est une attaque Kerberoast qui a été menée, en utilisant la bibliothèque impacket.

Dernière étape - Trouver le nombre d'utilisateurs confirmés compromis

Nous savons qu'une attaque Kerberoast a été menée, mais combien d'utilisateurs ont été compromis ?

Pour le savoir, nous pouvons nous référer au fichier de logs qui nous a été fourni précédemment.

Voici un script python qui permet d'extraire les utilisateurs compromis en fonction de l'EventRecordID (ERID) des événements de connexion réussie à partir du n-ème événement.

Ainsi il faut d'abord identifier l'EventRecordID (ERID) du branchement de la clé USB (2625) puis exécuter le script en fournissant une fenêtre autour de cet ERID pour extraire les utilisateurs compromis.

#!/usr/bin/env python3
import sys
from xml.etree import ElementTree as ET
from collections import OrderedDict

# Usage:
#   python3 extract_users_erid.py EXE_logs.xml MIN_EVENTID MAX_EVENTID
#   or python3 extract_users_erid.py --around EXE_logs.xml CENTER_ERID [WINDOW]
# If WINDOW is omitted, defaults to 10.

if len(sys.argv) < 2:
    print("Usage:")
    print("  python3 extract_users_erid.py EXE_logs.xml MIN_EVENTID MAX_EVENTID")
    print("  or python3 extract_users_erid.py --around EXE_logs.xml CENTER_ERID [WINDOW]")
    sys.exit(2)

if sys.argv[1] == "--around":
    if len(sys.argv) < 4:
        print("Usage for --around: python3 extract_users_erid.py --around EXE_logs.xml CENTER_ERID [WINDOW]")
        sys.exit(2)
    xmlpath = sys.argv[2]
    center = int(sys.argv[3])
    window = int(sys.argv[4]) if len(sys.argv) >= 5 else 10
    MIN = center - window
    MAX = center + window
else:
    if len(sys.argv) < 4:
        print("Usage: python3 extract_users_erid.py EXE_logs.xml MIN_EVENTID MAX_EVENTID")
        sys.exit(2)
    xmlpath = sys.argv[1]
    MIN = int(sys.argv[2])
    MAX = int(sys.argv[3])

NS = {'e': 'http://schemas.microsoft.com/win/2004/08/events/event'}
tree = ET.parse(xmlpath)
root = tree.getroot()

users = OrderedDict()
for ev in root.findall('.//e:Event', NS):
    erid_el = ev.find('e:System/e:EventRecordID', NS)
    if erid_el is None or not erid_el.text:
        continue
    try:
        erid = int(erid_el.text.strip())
    except:
        continue
    if erid < MIN or erid > MAX:
        continue
    for data in ev.findall('.//e:Data', NS):
        text = (data.text or '').strip()
        if not text:
            continue
        parts = text.split()
        if len(parts) >= 2 and parts[1].lower().startswith('success'):
            users[parts[0]] = None

print("\n".join(users.keys()))

On exécute le script ainsi:

$ python3 extract_users_erid.py --around EXE_logs.xml 2635 10

Alt UsersId

Dans le fichier de logs on remarque que trois minutes après le branchement de la clé USB, de nombreuses connexions à des comptes de l'entreprise ont été effectuées. On constate qu'il y a cinq comptes utilisateurs qui se sont connectés et déconnectés dans un temps très court (dizaines de secondes les uns des autres) . On en déduit donc les cinq utilisateurs qui ont été compromis.

Alt UsersId1
Alt UsersId2
Alt UsersId3
Alt UsersId4

Indice

Mince, j’ai oublié ma carte Navigo… je vais devoir prendre un ticket pour passer incognito.

Cela a pour but d'orienter le joueur vers le ticket Kerberos.