retornar retornar

Ataque à extensão do código VS

No mundo da segurança de computadores, as extensões do Visual Studio Code (VS Code) surgiram como um novo vetor de ataque para os criminosos cibernéticos. Visual Studio Code, publicado pela Microsoft, é um editor de código-fonte usado por muitos desenvolvedores profissionais em todo o mundo. Microsoft também opera um mercado de extensões para o IDE, chamado Visual Studio Code Marketplace, que oferece complementos que ampliam a funcionalidade do aplicativo e oferecem mais opções de personalização.

Há vários relatórios que indicam violações na segurança VS Code, permitindo a falsificação de extensões, bem como extensões que roubam tokens de autenticação dos desenvolvedores. Pesquisas recentes realizadas por um grupo israelense revelam números alarmantes, em que uma ferramenta personalizada chamada "ExtensionTotal" foi desenvolvida para localizar extensões de alto risco, descompactá-las e examinar trechos de código suspeitos.

Por meio desse processo, eles descobriram o seguinte:

 • 1,283 extensões com código malicioso conhecido (229 milhões de instalações).

 • 8,161 extensões que se comunicam com dendereços IP criptografados.

 • 1,452 extensões usando o repositório GitHub de outro editor, indicando que são imitações.

 • 2,304 extensiones que utilizan el repositorio de GitHub de otro editor, lo que indica que son imitaciones.

Este artigo tem como objetivo replicar o desenvolvimento de uma extensão mal-intencionada para entender os riscos associados, alertar sobre seu possível impacto e demonstrar um exemplo das técnicas usadas para obter acesso e persistência por meio dessas extensões. Exploraremos como configurar um ambiente seguro, desenvolver a extensão mal-intencionada e, por fim, garantir a persistência pós-exploração.

Pré-requisitos

Para desenvolver uma extensão mal-intencionada no VS Code, precisamos configurar um ambiente de desenvolvimento adequado. Ele deve ter os seguintes elementos:

 • Node.js
 • Visual Studio Code
 • Git
 • Gerador de extensão do Visual Studio Code

Depois de concluir essas etapas, você terá um ambiente de desenvolvimento configurado e pronto para começar a desenvolver a extensão.

Desenvolvimento da extensão maliciosa

Com o ambiente de desenvolvimento configurado, a próxima etapa é desenvolver a extensão mal-intencionada. Todo o código da nossa extensão estará no arquivo extension.ts, que contém a base de código gerada pelo assistente de criação de extensão do VS Code. Inicialmente, esse arquivo inclui um exemplo simples que exibe uma mensagem "Hello World from color-picker!" quando o comando helloWorld é chamado.


Para transformar essa extensão em uma ferramenta mal-intencionada, faremos algumas modificações importantes. A ideia é executar um shell reverso quando o usuário invocar um comando específico no VS Code. Isso é feito modificando dois arquivos principais: package.json e extension.ts.

No package.json, configuraremos um comando que se comporta como uma extensão legítima, semelhante a uma ferramenta comumente usada por desenvolvedores e designers, como um "selecionador de cores". Essa configuração nos permitirá executar nosso código malicioso sem levantar suspeitas.


Em seguida, em extension.ts, adicionaremos o código necessário para executar um shell reverso. Esse código será executado quando o comando malicioso for invocado. Para testar se tudo funciona corretamente, usaremos as ferramentas de depuração do VS Code, que nos permitem executar e testar a extensão diretamente do ambiente de desenvolvimento.


Antes de implementar o código malicioso, é essencial garantir que a configuração básica da extensão funcione corretamente. Para isso, primeiro testaremos a extensão com a base de código fornecida pelo assistente. Essa etapa de verificação é fundamental, pois garantimos que o básico esteja funcionando; caso contrário, poderemos encontrar problemas mais tarde e presumir incorretamente que o bug se deve ao código adicionado, quando na verdade pode ser um problema com a configuração inicial.

Para realizar essa verificação, devemos executar a extensão com as pequenas modificações aplicadas. Isso é feito no ambiente de desenvolvimento do VS Code usando as ferramentas de depuração integradas. Vá até a opção de menu "Run" (Executar) e selecione "Start Debugging" (Iniciar depuração) . Esse processo abrirá uma nova instância do VS Code, na qual poderemos testar a extensão.


Nessa nova instância, pressionaremos o atalho de teclado ctrl+shift+p para abrir a paleta de comandos e selecionar nosso comando de extensão. Se tudo funcionar corretamente, veremos a mensagem "Hello World!" exibida na interface do VS Code. Essa etapa confirma que a configuração básica está operacional e fornece um ponto de verificação antes de inserir o código malicioso.

Depois de verificarmos que a configuração básica funciona, podemos inserir o código de shell reverso em extension.ts e modificar o comando padrão. Esse código se encarregará de estabelecer uma conexão remota com nosso sistema de ataque sempre que o comando malicioso for executado.


Por fim, para garantir que a conexão remota seja bem-sucedida, ouviremos nosso sistema remoto (neste caso, uma máquina com Kali Linux) e executaremos a extensão na máquina da vítima (Windows 11). O IP da máquina atacante é 192.168.1.135 e corresponde ao nosso Kali na rede local que receberá a conexão:


Escutamos nosso Kali na porta 4444 e executamos a extensão novamente em nossa vítima do Windows 11:


Pressione F5 para iniciar uma nova instância de depuração no VS Code. Nessa nova instância, usamos o atalho de teclado ctrl+shift+p para abrir a paleta de comandos e executar o comando de extensão malicioso. Ao fazer isso, a conexão é estabelecida com sucesso, o que nos permite obter acesso ao sistema Windows 11 a partir de nossa máquina Kali Linux. Isso é possível graças à execução do código de shell reverso que incorporamos na extensão maliciosa, o que demonstra a eficácia da técnica e ressalta a importância de compreender e mitigar esses riscos em ambientes corporativos.


Pós-exploração e persistência

Depois de obtermos acesso ao sistema de destino por meio de nossa extensão mal-intencionada, a próxima etapa é garantir a persistência e realizar atividades pós-exploração. Isso nos permitirá manter o acesso mesmo que a máquina seja reinicializada e realizar ações adicionais para explorar e comprometer ainda mais o sistema.

Para a pós-exploração, usaremos o powershell-empire, uma ferramenta avançada de post-explotación que permite que os invasores executem comandos e scripts em sistemas comprometidos remotamente. Primeiro, configuramos o servidor powershell-empire no computador do atacante, o que nos permitirá gerenciar e controlar os agentes em execução nos sistemas comprometidos. Em outro terminal, executamos o cliente, que usaremos para interagir com o servidor e configurar nossos listeners e stagers.


A próxima etapa é criar um novo ouvinte no cliente powershell-empire. Esse ouvinte é um componente que aguarda as conexões de entrada dos agentes. Configuramos o listener com os parâmetros necessários, como host e porta, para que ele esteja pronto para receber conexões. Com o ouvinte configurado, prosseguimos com a criação de uma carga útil do PowerShell. Essa carga, uma vez executada no sistema Windows 11 comprometido, estabelecerá uma conexão com o listener, registrando-se como um novo agente e permitindo o controle remoto do sistema.



Agora, continuaremos a criar a carga útil do PowerShell que será executada no sistema Windows 11 já comprometido pela extensão maliciosa. Geramos essa carga útil seguindo uma série de comandos específicos que nos permitirão configurar o stager que se comunicará com o listener que configuramos anteriormente.

Primeiro, na interface do cliente powershell-empire, acesse o menu principal e selecione o stager multi/launcher. Esse stager é uma opção versátil que nos permite configurar vários parâmetros para estabelecer a conexão de volta ao listener. Configuramos o ouvinte especificando o tipo que criamos anteriormente, nesse caso, http, e definimos as propriedades necessárias, como o host e a porta em que o ouvinte está aguardando conexões.

Depois de configurado, executamos o comando para gerar a carga útil. Esse será um script do PowerShell que, quando executado no sistema Windows comprometido, estabelecerá uma conexão com o ouvinte e registrará um novo agente no powershell-empire. Esse agente nos fornecerá controle remoto sobre o sistema comprometido, o que nos permitirá executar uma ampla gama de ações pós-exploração.


Depois de gerar a carga útil, nós a executamos no sistema Windows 11 comprometido, aproveitando a sessão de shell reverso que estabelecemos com nossa extensão maliciosa. Ao executar o payload, verificamos se o agente está registrado corretamente no listener e aparece na interface do cliente powershell-empire Essa etapa é crucial para garantir que nossa configuração esteja correta e que o sistema comprometido esteja agora sob nosso controle remoto.


Mensagem de observação: Novo agente 4ADCSV6Z fez o check-in

Com o agente registrado e ativo, podemos continuar a usar os módulos de pós-exploração disponíveis para realizar atividades adicionais, garantindo que nosso acesso ao sistema comprometido seja durável e estável.


Como você pode ver abaixo, no sistema Windows 11, o VS Code não está em execução. Isso é possível porque, uma vez que o agente tenha sido registrado com sucesso por meio da estrutura pós-exploração, não precisamos mais manter o editor aberto. O acesso e o controle sobre o sistema comprometido são mantidos independentemente do estado do aplicativo.


Isso mostra que, uma vez que o agente tenha sido registrado com sucesso, não é necessário manter o VS Code aberto para manter a conexão. No entanto, é importante observar que, se a máquina for reinicializada, perderemos a conexão, pois o agente não persistirá, a menos que configuremos uma técnica de persistência adequada.

Em seguida, prosseguimos com o estabelecimento da persistência no sistema comprometido. Usamos o módulo powershell_persistence_userland_registryque nos permite definir a persistência no registro do Windows. Esse módulo cria uma entrada de registro que executará nossa carga útil sempre que o usuário fizer login. Configuramos e executamos o módulo de persistência, certificando-nos de que a carga útil seja executada automaticamente a cada reinicialização do sistema.


Podemos confirmar que a persistência foi estabelecida com êxito quando virmos a mensagem: "Registry persistence established using listener http stored in HKCU\Microsoft\Windows\CurrentVersion\Debug". Essa mensagem indica que o módulo de persistência foi criado com êxito em uma entrada de registro do Windows

Essa técnica de persistência envolve o armazenamento da carga útil em uma chave de registro localizada em HKCU:Software\Microsoft\Windows\CurrentVersion\Debug, o que garante que o script do PowerShell seja executado automaticamente sempre que o usuário fizer logon no sistema. Ao definir essa chave de registro, garantimos que o agente se registre novamente com o ouvinte mesmo depois que o computador for reinicializado, mantendo assim o acesso remoto ao sistema comprometido de forma persistente.


Tente reiniciar o Windows comprometido para confirmar a persistência. Depois que o sistema for reinicializado, verificaremos se um novo agente está automaticamente conectado ao powershell-empire. Essa etapa é crucial para garantir que a técnica de persistência implementada esteja funcionando corretamente e que nosso acesso remoto ao sistema comprometido seja durável.

Sempre que reiniciarmos, um novo agente será registrado, indicando que a carga útil do PowerShell armazenada no registro do Windows é executada automaticamente no logon do usuário, reconectando o sistema comprometido ao nosso ouvinte.


Com a confirmação da persistência, podemos começar a brincar com alguns comandos powershell-empire para explorar e obter mais informações do sistema comprometido. Por exemplo, podemos usar o módulo powershell/situational_awareness/host/computerdetails para coletar detalhes do sistema. Esse módulo nos fornecerá informações valiosas sobre o hardware e o software do sistema comprometido, incluindo o nome do computador, a versão do sistema operacional e muito mais.


Podemos realizar uma varredura de portas na rede usando o módulo powershell/situational_awareness/network/portscan. Esse módulo nos permite fazer a varredura de portas abertas em dispositivos específicos dentro da rede do sistema comprometido. Configuramos o módulo para fazer a varredura em um host específico, por exemplo, raspberrypi.local, o módulo para fazer a varredura em um host específico, por exemplo, raspberrypi.local, e executamos o comando scan. Esse tipo de análise nos ajuda a identificar outros dispositivos e serviços acessíveis na rede, que podem ser alvos em potencial para ataques futuros ou pontos de entrada para movimentação lateral dentro da infraestrutura.


Essas etapas pós-exploração, juntamente com a verificação de persistência, não só nos permitem manter o acesso contínuo ao sistema comprometido, mas também ampliar nosso conhecimento e controle sobre o ambiente, facilitando uma exploração mais ampla e eficaz.

Conclusão

A exploração e a demonstração de como desenvolver uma extensão mal-intencionada para o VS Code nos permite entender melhor os riscos associados à instalação de extensões e destaca a importância da segurança em ambientes de desenvolvimento. Por meio da configuração do ambiente, do desenvolvimento da extensão, da pós-exploração e das técnicas de persistência, destacamos as possíveis vulnerabilidades que podem ser exploradas por agentes mal-intencionados.

O uso de ferramentas como o powershell-empire para pós-exploração destaca a facilidade com que um invasor pode manter acesso contínuo e duradouro a um sistema comprometido, mesmo após uma reinicialização. A técnica de persistência baseada no registro do Windows garante que o invasor possa se reconectar automaticamente ao sistema comprometido, tornando a atenuação dessas ameaças mais desafiadora.

É essencial que os desenvolvedores e os profissionais de segurança estejam cientes desses vetores de ataque e tomem medidas proativas para proteger seus ambientes. Isso inclui a verificação cuidadosa das extensões instaladas, a implementação de políticas de segurança rigorosas e o uso de ferramentas de monitoramento e análise para detectar comportamentos suspeitos.

Em resumo, esse exercício não apenas demonstra uma técnica de exploração, mas também destaca a necessidade de vigilância constante e de uma abordagem rigorosa à segurança no desenvolvimento de software. Ao compreender e antecipar essas ameaças, podemos fortalecer nossas defesas e garantir um ambiente de desenvolvimento mais seguro e resiliente.