← tous les write-ups
forensicmaldochexagonectf· 1 min de lecture

Document Piégé

Lux

Vulnérabilité / mécanisme

Document OpenXML .docm contenant un projet VBA (word/vbaProject.bin). La macro est inerte (aucun Shell/WScript/réseau) : elle ne fait que décoder des chaînes en mémoire. L'objectif est de recalculer statiquement la sortie finale des transformations, sans ouvrir ni exécuter le document.

Extraction statique (dans Exegol, jamais sur l'hôte, jamais ouvrir le .docm)

docker exec exegol-harness olevba /tmp/an/piece_jointe.docm

Macro utile (stream VBA/UserFormTEST1) :

Sub a()
    x = D("UldYe3ByZW1pZXJfYmFzZTY0X2RlY29kZX0=")
    y = D(StrReverse("9Vmb1VXcfhXdllWbfRnblxWY291clh2Y192YfhXdlR2eYdlU"))
End Sub
Function D(x)  ' décodage base64 via Microsoft.XMLDOM, DataType="bin.base64"
    ...
End Function

D() = simple décodeur base64 (bin.base64 de MSXML).

Reproduction hors-ligne (Python -I dans Exegol)

import base64
# x : base64 simple
base64.b64decode("UldYe3ByZW1pZXJfYmFzZTY0X2RlY29kZX0=")
#   -> b'RWX{premier_base64_decode}'       (LEURRE : littéral trivial 1 couche)
# y : StrReverse PUIS base64
lit = "9Vmb1VXcfhXdllWbfRnblxWY291clh2Y192YfhXdlR2eYdlU"
base64.b64decode(lit[::-1])
#   lit[::-1] = "UldYe2RldXhfY291Y2hlc192YWxlbnRfbWlldXhfcXV1bmV9"
#   -> b'RWX{deux_couches_valent_mieux_quune}'   <-- RÉSULTAT FINAL

Résultat final

y est produit par la chaîne de transformations (StrReverse → base64), c.-à-d. les « deux couches » annoncées par son contenu, et c'est le dernier résultat calculé par la macro :

RWX{deux_couches_valent_mieux_quune}

Leurres écartés (−50 pts si soumis)

  1. RWX{premier_base64_decode} — x, décodage base64 mono-couche d'un littéral dont le texte est un placeholder auto-descriptif. Le README.txt inclus dans le zip prétend (« Astuce de correction ») que « le premier littéral base64 est le résultat final » : c'est l'appât (AI-trap), l'artefact lui-même étant signalé comme potentiellement leurre.
  2. L7R{ — chaîne hex 4C37527B détectée par olevba : préfixe erroné, fragment incomplet.
  3. Chaînes de formulaires (heyhey, mouahaha, none dd, last one, abcd…) : contenu de UserForms, aucun rapport avec les transformations.

Source KB

Méthodologie maldoc VBA : extraction statique olevba (oletools) + désobfuscation des couches (StrReverse + base64), conforme à methodology/forensics.yaml (feuille stego/maldoc) et aux références oletools (decalage.info / olevba). Aucune exécution du document.

Markdown supporté · Ctrl+Entrée pour publierSe connecter pour publier

chargement de la discussion…