A equipe de pesquisa da ESET identificou duas variantes para Windows até então não documentadas do SprySOCKS, um backdoor anteriormente exclusivo para Linux que, segundo relatos, é utilizado pelo FishMonger, grupo que se acredita ser operado por uma empresa contratada pelo governo chinês chamada I SOON. Embora tenhamos descoberto inicialmente as amostras de malware no VirusTotal, a telemetria da ESET mostra atividade real entre 2023 e 2024, com diversas vítimas em Honduras, Taiwan, Tailândia e Paquistão, tendo como alvo principalmente organizações governamentais.

As variantes para Windows descobertas são identificadas internamente como WIN_DRV e WIN_PLUS. Ambas incluem uma configuração de C&C (comando e controle) embutida no código e oferecem suporte à comunicação por meio dos protocolos TCP, UDP e WebSocket. A funcionalidade principal do backdoor em ambas as versões inclui suporte a mais de 30 comandos de C&C, abrangendo diversas capacidades, como coleta de informações do sistema, enumeração de processos, gerenciamento de serviços e operações de gerenciamento de arquivos, como listar, criar, excluir e transferir arquivos.

Além da funcionalidade principal do backdoor, a versão WIN_DRV utiliza drivers de kernel para ocultar conexões de rede, processos, arquivos e chaves de registro do malware, além de permitir o redirecionamento de tráfego TCP. Esse recurso possibilita que os operadores do malware enviem comandos ao backdoor por meio de uma porta TCP aleatória no dispositivo da vítima, sem expor a porta real utilizada pelo backdoor para escuta dentro do tráfego de rede.

De acordo com a telemetria da ESET, há indícios limitados de que alguns cenários de ataque envolvendo o SprySOCKS possam incluir um componente do tipo bootkit UEFI, possivelmente explorando a vulnerabilidade CVE-2023-24932.

A análise apresentada neste relatório nos leva a atribuir essas novas variantes para Windows ao FishMonger com alto grau de confiança.

Pontos-chave desta publicação

  • Descobrimos duas variantes do backdoor SprySOCKS do FishMonger para Windows, até então não documentadas.
  • A telemetria da ESET mostra atividade entre 2023 e 2024, tendo como alvo principalmente organizações governamentais em Honduras, Taiwan, Tailândia e Paquistão.
  • Ambas as variantes para Windows oferecem suporte à comunicação por meio dos protocolos TCP, UDP e WebSocket, e implementam mais de 30 comandos.
  • A variante WIN_DRV cria um backdoor TCP passivo e furtivo, apoiando-se em um driver de kernel para redirecionar o tráfego para a porta TCP oculta do backdoor quando dados especialmente projetados são detectados dentro de um pacote TCP recebido.

Perfil do FishMonger

O FishMonger, que se acredita ser operado por um contratado chinês chamado I SOON (veja nosso Q4 2023–Q1 2024 APT Activity Reportv), é um grupo de ciberespionagem que faz parte do guarda-chuva do Winnti Group e que muito provavelmente opera a partir da China, especificamente da cidade de Chengdu. Também é conhecido como Earth Lusca, TAG-22, Aquatic Panda ou Red Dev 10. Publicamos uma análise do FishMonger no início de 2020, quando o grupo tinha como alvo principal universidades em Hong Kong durante os protestos civis iniciados em junho de 2019. O grupo também é conhecido por realizar ataques do tipo watering hole, conforme relatado pela Trend Micro. O conjunto de ferramentas do FishMonger inclui ShadowPad, Spyder, Cobalt Strike, FunnySwitch, SprySOCKS e o BIOPASS RAT.

Análise técnica

Nesta seção, apresentamos uma análise técnica dessas novas variantes para Windows do backdoor SprySOCKS do FishMonger.

O arquivo que levou a essa descoberta foi carregado no VirusTotal em abril de 2024 com o nome klelam00007.zip; seu conteúdo é mostrado na Figura 1.

Figure 1. Contents of klelam00007.zip as displayed on VirusTotal
Figura 1. Conteúdo de klelam00007.zip conforme exibido no VirusTotal.

Esse arquivo contém diversos componentes, incluindo alguns arquivos legítimos utilizados para hospedar ataques de DLL side-loading, além de três arquivos criptografados com a extensão .dat que despertaram suspeitas. Nossa análise posterior revelou que esses arquivos criptografados contêm uma nova variante para Windows do backdoor SprySOCKS do FishMonger, até então não documentada, identificada por seus desenvolvedores como WIN_DRV. Investigações adicionais também revelaram outra versão do backdoor, denominada WIN_PLUS, na telemetria da ESET.

Acesso inicial

O FishMonger é conhecido por ter como alvo servidores expostos à internet (public-facing servers) de suas vítimas, explorando com frequência vulnerabilidades N-day baseadas em servidor para obter acesso inicial. Embora não tenhamos conseguido confirmar o método exato utilizado pelo FishMonger para comprometer os sistemas das vítimas nesta campanha, a presença de sistemas operacionais de servidor em alguns dos dispositivos afetados, juntamente com o modus operandi característico do grupo, sugere que os invasores possam ter obtido acesso por meio de aplicações expostas à internet configuradas incorretamente ou sem as correções de segurança necessárias.

SprySOCKS para Windows

Em setembro de 2023, a Trend Micro publicou um relatório sobre um novo backdoor para Linux do FishMonger, que seus analistas denominaram SprySOCKS. O código desse backdoor é baseado em um remote access trojan (RAT) de código aberto para Windows chamado Trochilus e compartilha diversas características com o backdoor RedLeaves. No entanto, ele foi expandido e modificado a ponto de ser considerado um novo backdoor. Neste relatório, analisamos duas variantes para Windows da versão 1.8 do SprySOCKS que ainda não haviam sido divulgadas:

  • Uma delas, denominada WIN_DRV por seus desenvolvedores, utiliza um driver de kernel para alcançar um nível mais elevado de furtividade.
  • A outra, sem o driver, é denominada WIN_PLUS.

Como mostrado na Figura 2, o tipo e o número da versão do backdoor estão codificados de forma fixa (hardcoded) no binário.

Figure 2. Version type and number hardcoded in WIN_DRV and WIN_PLUS
Figura 2. Tipo e número da versão codificados de forma fixa nas variantes do backdoor SprySOCKS para Windows WIN_DRV (à esquerda) e WIN_PLUS (à direita).

A grande maioria dos artefatos e funcionalidades presentes na versão Linux do backdoor SprySOCKS apresentada no relatório da Trend Micro também está presente nas novas variantes para Windows descritas neste relatório. Entre elas estão:

  • O mesmo formato de mensagens de C&C;
  • Comandos de C&C muito semelhantes, além de alguns adicionais;
  • As mesmas chaves e algoritmos de criptografia; 
  • O uso da mesma biblioteca de rede vinculada estaticamente (statically linked networking library), HP-Socket.

Para ambas as novas variantes do SprySOCKS, a funcionalidade principal do backdoor relacionada à comunicação com o servidor de C&C e aos comandos disponíveis é muito semelhante. As diferenças mais notáveis estão na forma como o backdoor final é carregado, nos aprimoramentos de furtividade (stealthiness) e nos nomes e caminhos dos componentes utilizados.

Nas subseções a seguir, analisamos primeiro os componentes envolvidos na cadeia de execução (execution chain) de cada variante do SprySOCKS e, em seguida, descrevemos o componente do backdoor, que é praticamente o mesmo em ambas as variantes.

Componentes do WIN_DRV

Em um arquivo carregado no VirusTotal, descobrimos a versão WIN_DRV do SprySOCKS, que inclui uma configuração de C&C vazia. Como resultado, essa versão não entra em contato ativamente com endereços remotos; no entanto, continua sendo capaz de iniciar um servidor TCP em uma porta aleatória no dispositivo da vítima, atuando assim como um backdoor passivo. Curiosamente, os invasores não precisam conhecer o número da porta TCP desse servidor, pois, conforme explicado mais adiante, o driver RawWNPF utilizado pela versão WIN_DRV permite o desvio silencioso (silent diversion) do tráfego TCP recebido em qualquer porta aberta diretamente para o backdoor (mais detalhes na seção sobre o driver RawWNPF).

Como mostrado na Figura 1, o arquivo que contém a versão WIN_DRV do SprySOCKS inclui vários componentes:

  • klelam00007.bat: um script em lote responsável pela persistência do backdoor que, conforme mostrado na Figura 3:
    • copia todos os arquivos do diretório de trabalho atual para o diretório SystemRoot%\Fonts (para funcionar corretamente, o arquivo em lote deve ser implantado no mesmo diretório que os demais arquivos do arquivo compactado);
    • cria uma tarefa agendada denominada ApphostRagistreationVerifier, configurada para executar ApphostRagistreationVerifier.exe (um executável legítimo, devidamente assinado, renomeado pelos invasores para imitar o AppHostRegistrationVerifier.exe assinado pela Microsoft) com privilégios NT AUTHORITY\SYSTEM a cada inicialização do sistema. Os invasores utilizam a conhecida técnica de DLL side-loading, explorando a forma como o Windows carrega DLLs para carregar sua própria DLL maliciosa (neste caso, tpsvcloc.dll) por meio de uma aplicação legítima assinada. Mais especificamente, utilizam a técnica de malware sideloading por meio de DLL satélite do MFC (observe a cadeia de caracteres «loc» no nome do arquivo tpsvcloc.dll ).
  • ApphostRagistreationVerifier.exe: executável legítimo e assinado do serviço de criação de impressoras AutoConnect da ThinPrint (SHA-1: FFC3AA7909D4E72C360D65A1F45260DFFE5C99B7), que carrega a biblioteca tpsvc.dll.
  • tpsvc.dll: biblioteca legítima e assinada que carrega a biblioteca tpsvcloc.dll.
  • tpsvcloc.dll: carregador (loader) do backdoor SprySOCKS.
  • X1B5206BDC1743DD.dat: contêiner criptografado que inclui o backdoor SprySOCKS e cópias dos dois arquivos a seguir.
  • KX1B5206BDC1743DD.dat: DriverLoader, um driver de kernel criptografado responsável por carregar outro driver de kernel a partir de KW1B5206BDC1743FP.dat.
  • KW1B5206BDC1743FP.dat: RawWNPF, um driver de kernel responsável por ocultar os arquivos e a atividade de rede do backdoor.
Figure 3. klelam00007.bat setting up persistence for the SprySOCKS backdoor
Figura 3. klelam00007.bat  configurando a persistência do backdoor SprySOCKS (quebras de linha adicionadas para facilitar a leitura).

A Figura 4 mostra a cadeia de execução da variante WIN_DRV do SprySOCKS.

Figure 4. Execution chain of the SprySOCKS WIN_DRV variant
Figura 4. Cadeia de execução da variante WIN_DRV do SprySOCKS.

As três subseções a seguir apresentam análises técnicas dos componentes mencionados anteriormente: o carregador (loader) do SprySOCKS, o driver DriverLoader e o driver RawWNPF.

Loader do SprySOCKS

O loader começa com verificações iniciais para detectar a presença de um ambiente virtual e de alguns produtos de segurança. Ele procura bibliotecas específicas (em particular: snxhk.dllSxWrapper.dllSxIn.dllSXIn64.dll e SbieDll.dll) dentro do processo do loader e encerra sua execução caso encontre qualquer uma delas.

Como etapa seguinte, verifica se a persistência foi configurada corretamente pelo script klelam00007.bat, mostrado na Figura 3. Para isso, verifica se a imagem atual do loader foi carregada a partir do diretório %SystemRoot%\Fonts\ e tenta acessar os arquivos %SystemRoot%\Fonts\X1B5206BDC1743DD.dat, %SystemRoot%\Fonts\tpsvc.dll e %SystemRoot%\Fonts\tpsvcloc.dll. Caso detecte que algum desses arquivos não está no local esperado, ele configura a persistência por conta própria por meio de:

cópia de X1B5206BDC1743DD.dat, tpsvc.dll, tpsvcloc.dll e ApphostRagistreationVerifier.exe do diretório de trabalho atual para o diretório %SystemRoot%\Fonts\;

registro da aplicação %SystemRoot%\Fonts\ApphostRagistreationVerifier.exe como debugger de vds.exe (um serviço de disco virtual que pode ser executado automaticamente na inicialização do sistema), gravando o caminho da aplicação no valor de registro HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\vds.exe\debugger; e

criação do arquivo affair-build.bat no diretório %SystemRoot%\Fonts\ e sua posterior execução por meio do cmd.exe. Esse script, mostrado na Figura 5, remove os rastros desse processo apagando os arquivos do diretório de implantação e executando novamente o malware (agora a partir de %SystemRoot%\Fonts\) por meio da reinicialização do serviço vds.

Figure 5. affair-build.bat executed by the SprySOCKS loader
Figura 5. Affair-build.bat executado pelo loader do SprySOCKS.

Quando a persistência está estabelecida, o loader continua carregando os payloads a partir de um contêiner criptografado localizado em %SystemRoot%\Fonts\X1B5206BDC1743DD.dat. O algoritmo e a chave de descriptografia são AES de 128 bits no modo ECB, utilizando a chave codificada de forma fixa (hardcoded) uXQLESMXGaRMs6BL.

Isso produz um shellcode gerado pela ferramenta de código aberto DllToShellCode. Antes de executar o shellcode, o loader extrai os demais payloads criptografados do contêiner para arquivos separados:

  • %SystemRoot%\Fonts\KX1B5206BDC1743DD.dat
  • %SystemRoot%\Fonts\KW1B5206BDC1743FP.dat

Após concluir essa etapa, o loader cria um novo processo svchost.exe utilizando CreateProcessAsUserW com um token obtido de spoolsv.exe e injeta o shellcode do backdoor nesse processo utilizando a técnica de process doppelgänging. Durante o processo de injeção, o shellcode é gravado em um arquivo temporário com o prefixo TH em seu nome, dentro do diretório %TEMP%.

Como etapa final, o loader descriptografa e executa o DriverLoader, um driver de kernel oculto dentro do arquivo previamente implantado KX1B5206BDC1743DD.dat. O DriverLoader é primeiro descriptografado e, em seguida, seu conteúdo é salvo em C:\Windows\System32\drivers\fsdiskbit.sys.

Para executá-lo, o loader instala esse driver como um minifilter driver, criando manualmente uma nova chave de serviço no Registro chamada msidiskserver, com um valor ImagePath apontando para o driver implantado (como mostrado na Figura 6), e invoca a função da API do Windows NtLoadDrive com essa chave de registro como parâmetro para carregá-lo. Caso nenhum erro seja detectado, o loader remove tanto a chave de registro msidiskserver quanto o arquivo fsdiskbit.sys. Após isso, o loader encerra sua execução.

Figure 6. Service registry key created by the SprySOCKS WIN_DRV loader
Figura 6. Chave de registro de serviço criada pelo loader WIN_DRV do SprySOCKS.
Driver DriverLoader

Antes de abordar a funcionalidade do DriverLoader, é importante destacar um ponto: com o lançamento do Windows Vista, a Microsoft introduziu a imposição de assinatura de drivers (Driver Signature Enforcement – DSE), um recurso que garante que apenas componentes em modo kernel devidamente assinados possam ser executados no kernel do Windows. Isso significa que, para executar o driver fsdiskbit.sys (DriverLoader), os invasores precisam assiná-lo com um certificado confiável.

Para fazer com que o driver funcione ao menos em alguns sistemas desatualizados ou configurados incorretamente, os invasores utilizaram um certificado vazado (leaked certificate) disponível no GitHub, no repositório do projeto PastDSE, e assinaram o driver fsdiskbit.sys com esse certificado. As informações sobre o certificado utilizado podem ser vistas na Figura 7.

Figure 7. DriverLoader’s code-signing certificate
Figura 7. Certificado de assinatura de código do DriverLoader.

Agora, quanto à funcionalidade. O propósito desse componente é bastante direto: carregar outro driver inteiramente em memória (in-memory). Primeiro, ele lê e descriptografa o conteúdo do arquivo C:\Windows\Fonts\KW1B5206BDC1743FP.dat, previamente criado pelo loader. Para isso, utiliza o mesmo algoritmo e a mesma chave empregados pelo loader: AES de 128 bits em modo ECB com a chave uXQLESMXGaRMs6BL.

Os dados descriptografados contêm um binário PE nativo (descrito na seção do driver RawWNPF), que é então mapeado manualmente (manually mapped) e tem seu ponto de entrada executado.

O binário do DriverLoader contém o seguinte caminho PDB incorporado:

C:\Users\xdd\Desktop\今天\2023-4-11\2023‑04‑10__注册表驱动加载功能__集成到内测3中-未完成\DriverMemoryLoadDriver\x64\Release\DriverMemoryLoadDriver.pdb

As partes em chinês simplificado podem ser traduzidas como:

  • 今天: Hoje.
  • 注册表驱动加载功能__集成到内测3中-未完成: Função de carregamento de driver via Registro integrada à versão beta interna 3, não concluída.

Como pode ser observado no caminho dos símbolos, esse componente parece estar em desenvolvimento desde, pelo menos, abril de 2023, o que coincide com o timestamp de compilação do DriverLoader. Da mesma forma, as cadeias de caracteres presentes no caminho sugerem que o projeto do qual esse driver faz parte provavelmente ainda estava em desenvolvimento no momento de sua compilação.

Driver RawWNPF

O driver RawWNPF é o componente que torna a variante WIN_DRV do backdoor SprySOCKS significativamente mais furtiva em comparação com a variante WIN_PLUS. Ele permite ocultar a atividade maliciosa do backdoor no sistema comprometido e pode ser configurado por meio da chamada de códigos de controle de E/S personalizados do driver (custom I/O control codes, IOCTLs).

O driver cria um dispositivo chamado \Device\RawWNPF; a lista de IOCTLs disponíveis, juntamente com breves descrições, é apresentada na Tabela 1.

Tabela 1. Lista de IOCTLs gerenciados pelo driver RawWNPF.

IOCTL Description
0x220200 Configure the driver to hide active network connections to and from the specified local TCP port.
0x220300 Unhide the network connections configured with 0x220200.
0x220340 Insert an entry into the hidden connections list.
0x220344 Remove an entry from the hidden connections list.
0x220348 Wipe the whole hidden connections list.
0x22034C Read the hidden connections list.
0x220350 Insert a process with a specified PID into the hidden processes list.
0x220354 Remove a process with a specified PID from the hidden processes list.
0x220358 Wipe the whole hidden processes list.
0x22035C Read the hidden processes list.
0x222000 Initialize the driver’s main functions (hiding network connections, hiding processes, hiding malware components, network filters, persistence protection). After this initialization, other IOCTLs can be used to configure what exactly should be hidden.
0x222004 Returns two hardcoded DWORD values: 1 and 2. This possibly could be the driver’s version.
0x222008 Delete the driver’s binary (if it exists).

Ocultação de processos específicos

O driver RawWNPF pode ser configurado para ocultar processos com base em seus IDs de processo (process IDs), e a lista de processos ocultos pode ser gerenciada por meio da chamada dos IOCTLs do driver 0x220358, 0x22035C, 0x220354 e 0x220350. Para ocultar um processo, o driver intercepta (hooks) a execução da chamada de sistema (system call) NtQuerySystemInformation e modifica sua saída quando são consultadas informações sobre os processos em execução (ou seja, quando SystemProcessInformation é passado no parâmetro SystemInformationClass). Se algum dos processos retornados por essa função da API corresponder a um processo presente na lista de processos ocultos do driver, ele é removido da saída da função. A forma como o driver de kernel implementa o hook sobre a chamada de sistema NtQuerySystemInformation parece ser fortemente baseada no código-fonte do projeto InfinityHookPro.

Ocultação da atividade de rede

O driver pode ser configurado para ocultar conexões ativas específicas (com um IP, uma porta ou uma combinação de ambos definidos), de modo que elas não apareçam na saída de ferramentas comuns de administração de rede, como o netstat.exe. Isso é obtido por meio de uma técnica conhecida (por exemplo, [1][2][3], …), na qual os invasores interceptam (hook) a IoCompletionRoutine para o IOCTL 0x12001B  dentro da função DeviceIoControl do driver de kernel do Windows nsiproxy.sys. O código dentro do manipulador do IOCTL 0x12001B no nsiproxy é responsável por recuperar a lista de conexões ativas e, ao interceptar sua IoCompletionRoutine, os invasores podem percorrer a lista obtida, verificar a presença de portas, endereços ou ambos, e ocultar a conexão específica quando encontram uma correspondência.

A Figura 8 mostra a função de hook responsável por ocultar as conexões de rede.

Figure 8. Hex-Rays decompilation of nsiproxy’s IoCompletionRoutine hook
Figura 8. Descompilação do Hex-Rays do hook IoCompletionRoutine do nsiproxy, responsável por ocultar as conexões de rede.

Além de ocultar conexões de rede ativas, o driver inclui uma funcionalidade interessante que permite redirecionar pacotes TCP recebidos em qualquer porta TCP aberta para uma porta TCP específica configurada por meio do IOCTL 0x220200 (que, na prática, corresponde à porta do servidor TCP do backdoor SprySOCKS), mas apenas quando os dados TCP recebidos contêm informações especialmente elaboradas (specially crafted data).

Para realizar isso, o driver registra seus próprios objetos de filtragem de pacotes utilizando funções da API Windows Filtering Platform (WFP), analisa manualmente o conteúdo dos pacotes IPv4 transferidos (tanto o tráfego de entrada quanto o de saída é inspecionado) e redireciona o tráfego caso detecte esses dados especialmente elaborados dentro de um pacote TCP recebido.

O objetivo dessa funcionalidade parece ser principalmente permitir a comunicação com o backdoor malicioso sem a necessidade de incluir um endereço de C&C dentro do binário. Além disso, embora esse tráfego redirecionado possa ser analisado com ferramentas como o Wireshark, a porta real (para a qual o tráfego é redirecionado) não é revelada; portanto, pode ser difícil investigar o destino real desse tráfego malicioso.

Os filtros de pacotes instalados, juntamente com suas informações de identificação, estão listados na Tabela 2.

Tabela 2. Objetos de filtragem WFP registrados pelo driver RawWNPF.

Filter layer name Filter object name and GUID Filter object callout name and GUID
Inbound IP Packet v4 Layer Delivery Optimization (TCP-In)
{E980088D-BE44-4057-8E5C-C7FDF8968795}
COInbound
{DE0D7F67-94ED-4DDB-8215-9C028B54661B}
Outbound IP Packer v4 Layer Delivery Optimization (TCP-Out)
{33F76397-DBCB-445E-8EC3-AA51ED302D15}
COOutbound
{8280DDF3-7489‑4402-B9D8-96B50912346B}
ALE Connect v4 Layer Delivery Optimization (TCP-In)
{5746AF70-2917‑4861-97E6-D5E4DD569F2D}
COAuthConnect
{A33E1AA8-9B0F-44A3-B24A-AEB04CA54C3B}
ALE Listen v4 Layer Delivery Optimization (TCP-In)
{7CB4DFB4-0D20-402D-A49D-BA9660D026E6}
COAuthListen
{40045FAF-6BAE-4B48-9119‑31B48FFEA629}
ALE Receive/Accept v4 Layer Delivery Optimization (TCP-In)
{2C1AB6EF-0B65-4634‑8666-BCB2CF9C72E9}
COAuthAccept
{DDFE5189‑389F-437F-9B92-59495ED2181A}
ALE ResourceAssignment v4 Layer Delivery Optimization (TCP-In)
{B4AE248F-98D5-446F-88EB-14CF605AE722}
COAuthResAssignment
{FE570356-A1A9-413C-94CC-BD6C448E9969}

Ocultação dos arquivos do backdoor

O driver oculta/protege os arquivos do backdoor SprySOCKS registrando-se como um minifilter driver e instalando os seguintes callbacks:

  • Callback de pré-operação (pre-operation callback), ativado em cada solicitação de E/S IRP_MJ_CREATE, responsável por retornar STATUS_NO_SUCH_FILE diante de qualquer tentativa de criar ou abrir um arquivo ou diretório que faça parte da lista de arquivos ocultos/protegidos pelo driver.
  • Callback de pré-operação (pre-operation callback), ativado em cada solicitação de E/S IRP_MJ_DIRECTORY_CONTROL , responsável por filtrar solicitações não relacionadas à enumeração de diretórios, de modo que apenas aquelas vinculadas a essa tarefa sejam encaminhadas ao callback de pós-operação.
  • Callback de pós-operação (post-operation callback), ativado em solicitações de E/S IRP_MJ_DIRECTORY_CONTROL que passaram pelas verificações do callback de pré-operação. Esse callback é responsável por remover as entradas correspondentes aos arquivos ocultos/protegidos de qualquer tentativa de listagem de diretórios.

A seguinte lista de nomes de arquivos codificados de forma fixa (hardcoded) é protegida pelo driver:

  • \SystemRoot\Fonts\tpsvc.dll
  • \SystemRoot\Fonts\tpsvcloc.dll
  • \SystemRoot\Fonts\ApphostRagistreationVerifier.exe
  • \SystemRoot\Fonts\X1B5206BDC1743DD.dat
  • \SystemRoot\Fonts\KX1B5206BDC1743DD.dat
  • \SystemRoot\Fonts\KW1B5206BDC1743FP.dat
Proteção da persistência

O driver invoca CmRegisterCallbackEx para instalar uma rotina RegistryCallback responsável por ocultar a chave de registro utilizada para a persistência do loader do SprySOCKS: HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\vds.exe.Como resultado, qualquer tentativa de abrir ou enumerar essa chave é filtrada pelo driver.

Componentes do WIN_PLUS

Na versão WIN_PLUS do SprySOCKS, primeiro descobrimos o contêiner criptografado malicioso em nossa telemetria, com a primeira detecção registrada em julho de 2024 no dispositivo de uma vítima no Paquistão. Esse contêiner continha o backdoor SprySOCKS e o loader do SprySOCKS.

A configuração de C&C estava presente e é mostrada na Figura 9.

Figure 9. C&C configuration from the WIN_PLUS version of SprySOCKS
Figura 9. Configuração de C&C da versão WIN_PLUS do SprySOCKS.

O contêiner criptografado estava localizado no seguinte caminho do sistema comprometido:

C:\Windows\System32\spool\drivers\color\config.dat

Após ser descriptografado, o contêiner contém o loader do SprySOCKS e o próprio backdoor SprySOCKS. Uma análise posterior do backdoor contido nesse arquivo mostrou que, neste caso, parecia existir um componente adicional responsável por carregar o loader do SprySOCKS a partir do contêiner criptografado.

Esse componente, denominado first-stage loader nesta análise, deve ser instalado como um print processor por meio da seguinte chave de registro:

HKLM\SYSTEM\ControlSet001\Control\Print\Environments\Windows x64\Print Processors\VSPMsg

Curiosamente, ao pesquisar em nossa telemetria por qualquer elemento relacionado à cadeia VSPMsg, descobrimos um arquivo implantado em dois dispositivos de vítimas em Honduras, localizado em: C:\Windows\System32\spool\prtprocs\x64\VSPMsg.dll.Esse arquivo revelou ser o first-stage loader responsável por executar o loader do SprySOCKS a partir do arquivo config.dat mencionado anteriormente.

A Figura 10 ilustra um diagrama de execução da variante WIN_PLUS do SprySOCKS.

Figure 10. SprySOCKS WIN_PLUS variant execution scheme
Figura 10. Esquema de execução da variante WIN_PLUS do SprySOCKS.
Loader de primeira etapa

Esse loader começa verificando se foi executado pelo spoolsv.exe  e encerra sua execução caso contrário. Isso oculta seu comportamento de sandboxes automatizadas de análise de malware, já que ele foi desenvolvido para ser executado como um print processor.

Em seguida, ele continua descriptografando o loader do SprySOCKS a partir do contêiner criptografado localizado em: \Windows\System32\spool\drivers\‌color\config.dat. Primeiro, descriptografa o loader utilizando AES de 128 bits no modo ECB com a chave codificada de forma fixa (hardcoded) uXQLESMXGaRMs6BL. Posteriormente, injeta o loader em um novo processo svchost.exe por meio da técnica de process doppelgänging. Enquanto isso, o loader do SprySOCKS é gravado em um arquivo temporário, cujo nome começa com o prefixo TH, dentro do diretório %TEMP%.

A amostra exporta duas funções:

  • GetErrorMessageModule
  • SetErrorMessageModule

Embora a função SetErrorMessageModule não execute nenhuma ação, a função GetErrorMessageModule foi projetada para estabelecer a persistência do próprio loader. Ao ser executada, ela registra o loader como um print processor criando a chave de registro:HKLM\SYSTEM\ControlSet001\Control\Print\Environments\Windows x64\Print Processors\VSPMsg e define o valor de registro Driver como VSPMsg.dll. Em seguida, copia o arquivo C:\ProgramData\Microsoft Event\PFs\VSPMsg.dll, cujo caminho está codificado de forma fixa, para o diretório: C:\Windows\System32\spool\prtprocs\x64\.Depois, copia o contêiner criptografado de: C:\ProgramData\Microsoft Event\PFs\config.dat para: C:\Windows\System32\spool\drivers\color\config.dat.Após essa etapa, gera e posiciona o script em lote (batch script) affair-build.bat no diretório: C:\Windows\System32\spool\drivers\color\ e o executa. Como mostrado na Figura 11, o objetivo desse script é remover rastros do loader, apagando os arquivos do diretório original de implantação e acionando a execução do print processor recém-instalado ao reiniciar o serviço de print spooler.

Figure 11. affair-build.bat batch script used by the first-stage SprySOCKS WIN_PLUS loader
Figura 11. Script em lote affair-build.bat utilizado pelo loader de primeira etapa do SprySOCKS WIN_PLUS.
Loader do SprySOCKS

Esse loader começa criando um mutex com o nome codificado de forma fixa (hardcoded) fqwhi2d1qaz2 e, em seguida, prossegue com o carregamento do backdoor SprySOCKS a partir do contêiner criptografado localizado em: C:\Windows\System32\spool\drivers\color\‌config.dat.Ele descriptografa o backdoor utilizando AES de 128 bits no modo ECB com a chave codificada de forma fixa (hardcoded) uXQLESMXGaRMs6BL e, posteriormente, injeta o backdoor em um novo processo svchost.exe por meio da técnica de process doppelgänging. Enquanto isso, o loader do SprySOCKS é gravado em um arquivo temporário cujo nome começa com o prefixo TH, dentro do diretório %TEMP%.

Backdoor SprySOCKS

Por fim, passamos à análise do próprio backdoor SprySOCKS. Em ambas as variantes, WIN_DRV e WIN_PLUS, a funcionalidade do backdoor é praticamente idêntica, e as diferenças estão limitadas aos caminhos específicos de arquivos utilizados, às chaves de registro empregadas e, conforme mencionado anteriormente, ao fato de que a versão WIN_PLUS não utiliza o driver RawWNPF para alcançar um nível mais elevado de furtividade.

Ambas as variantes analisadas neste relatório são DLLs com o nome original PrcsServer.dll, que exportam uma função chamada Stop. Inicialmente, elas criam um mutex chamado prcs-server-run e, em seguida, inicializam a funcionalidade principal do backdoor, que inclui a inicialização e execução dos canais de comunicação com o C&C (baseados na configuração codificada de forma fixa) e a ativação do keylogger. Além disso, a versão WIN_DRV do backdoor inicializa o driver RawWNPF invocando seu IOCTL 0x222000 e, em seguida, oculta seu próprio processo chamando o IOCTL 0x220350.

O keylogging é ativado somente se existir um arquivo INI em %appdata%\Microsoft\Vault\lgf.dat que contenha uma seção config com uma propriedade chamada key definida como 1. Caso essas condições sejam atendidas, ambas as variantes criam um mutex chamado Global\{DCAA7ED8-521B-4EAB-BE21-65254CF59239}e registram periodicamente dados da área de transferência, juntamente com o título da janela ativa e as teclas pressionadas, no arquivo %appdata%\Microsoft\Vault\lg.dat. Os dados desse arquivo são criptografados utilizando uma cifra XOR de um único byte com a chave 0x44.

Comunicação C&C

O backdoor oferece suporte a três protocolos para se comunicar com o C&C: TCP, UDP e WebSocket, e pode atuar tanto como cliente quanto como servidor. A funcionalidade de rede é amplamente baseada no framework HP-Socket, e algumas funções criptográficas foram implementadas utilizando a biblioteca Crypto++.

A configuração de C&C está incorporada ao backdoor e pode incluir:

  • Até três endereços IP com suas respectivas portas, cada um especificando um endereço de C&C e sua porta para um dos canais de comunicação (TCP, UDP ou WebSocket); e
  • Até três números de porta que indicam em quais portas o backdoor deve escutar para novas conexões (uma para o servidor TCP, uma para o servidor UDP e uma para o servidor WebSocket).

A Figura 9 mostra um exemplo de configuração da versão WIN_PLUS, que contém:

  • O endereço e a porta C&C para o canal de comunicação TCP: 207.148.78[.]36:443;
  • O endereço e a porta C&C para o canal de comunicação UDP: 207.148.78[.]36:53;
  • O endereço e a porta C&C para o canal de comunicação WebSocket: 207.148.78[.]36:80;
  • A porta de escuta do servidor TCP do backdoor: 53781.

Antes de iniciar qualquer conexão ou servidor, a versão WIN_DRV do SprySOCKS oculta as conexões de/para os endereços ou portas definidos na configuração, invocando os IOCTLs 0x220340 e 0x220200 do driver RawWNPF. Como resultado, essas conexões não aparecem na saída de ferramentas como o netstat.exe, mesmo quando estão ativas.

Além disso, ambas as versões do backdoor executam o utilitário netsh.exe duas vezes:

netsh.exe netsh advfirewall firewall delete rule name="Core Networking - Packet Too Big(ICMPv6 - In)"

netsh advfirewall firewall add rule name="Core Networking - Packet Too Big(ICMPv6 - In)" dir=in action=allow protocol=tcp localport=53781

O primeiro comando remove uma regra específica do firewall, e o segundo adiciona uma nova regra com o mesmo nome, permitindo todo o tráfego TCP de entrada direcionado à porta do servidor TCP do backdoor definida na configuração.

Se a configuração de C&C estiver vazia (como no caso da versão WIN_DRV detectada no VirusTotal), o backdoor inicia um servidor TCP que escuta em uma porta aleatória no sistema comprometido e oculta essa porta invocando o IOCTL 0x220200 do driver RawWNPF. Essa chamada não apenas impede que o servidor TCP apareça em ferramentas padrão de monitoramento, como também ativa a funcionalidade de redirecionamento TCP fornecida pelo driver. Esse recurso permite que os invasores enviem comandos ao backdoor sem conhecer a porta real em que ele está escutando, simplesmente enviando dados TCP especialmente elaborados para qualquer porta TCP aberta na máquina da vítima.

Para o canal de comunicação TCP, o protocolo C&C parece ser o mesmo da versão Linux analisada no relatório da Trend Micro. Antes do envio dos dados reais, é enviado um cabeçalho de 12 bytes contendo o CRC de 32 bits do restante do cabeçalho, um valor mágico DWORD 0xACACBCBC e um DWORD que especifica o tamanho dos dados que seguem o cabeçalho.

Para os canais UDP e WebSocket, os valores mágicos são diferentes, assim como o formato e o tamanho do cabeçalho das mensagens. No canal UDP, o valor mágico é 0xACACBFBC e está localizado no deslocamento 0x1C dentro de um cabeçalho de 36 bytes, seguido por um DWORD que indica o tamanho dos dados. No canal WebSocket, o valor mágico 0x1BDCCBAA é utilizado como MaskingKey dentro do cabeçalho WebSocket. A Figura 12 mostra uma captura de tráfego de rede com os valores mágicos utilizados em cada canal de comunicação.

Figure 12. SprySOCKS network-traffic capture showing the magic values
Figura 12. Captura de tráfego de rede do SprySOCKS mostrando os valores mágicos utilizados nos canais de comunicação C&C TCP, UDP e WebSocket (de cima para baixo, respectivamente).

Após o cabeçalho (header), encontra-se novamente um CRC de 32 bits, seguido pelo valor WORD 0x0003 (provavelmente indicando o método de criptografia) e, então, dados criptografados com AES de 128 bits no modo ECB (utilizando a chave codificada de forma fixa (hardcoded) QFTHEYjzX3RBOMgZ) que foram codificados em Base64.

A Figura 13 mostra um exemplo de uma mensagem C&C antes e depois da decodificação e descriptografia.

Figure 13. Example SprySOCKS C&C message
Figura 13. Exemplo de uma mensagem C&C do SprySOCKS conforme exibida no Wireshark (à esquerda) e seu conteúdo após a decodificação e descriptografia (à direita).

O valor __msgid dentro da mensagem C&C descriptografada é utilizado para especificar um comando, identificado por um ID de mensagem (message ID), que deve ser executado pelo backdoor.

A lista de IDs de mensagem suportados pelo backdoor, juntamente com suas descrições, pode ser encontrada na Tabela 3. Vale destacar que nem todos esses comandos foram analisados em profundidade; portanto, algumas descrições representam apenas uma visão geral aproximada da parte do código ou funcionalidade relacionada a cada ID de mensagem.

Tabela 3. Comandos C&C do SprySOCKS; as descrições marcadas com * são avaliações preliminares.

Message ID Description
0x09 Collect client (victim) system information, including: computer name, OS version, network adapter information, information about memory, CPU information, current privileges, system language and version, current time, and the backdoor version (1.8) and version type (WIN_DRV or WIN_PLUS).
0x0A Start an interactive console.
0x0B Write into the interactive console.
0x0D Stop the interactive console.
0x0E Specify an additional communication channel (do not start the channel). Likely to specify an additional backup C&C.
0x0F Send C&C message to a different target.*
0x11 Enumerate all processes.
0x12 Enumerate modules of a process specified by a PID.
0x13 Terminate a process specified by a PID.
0x14 Close all connections.
0x16 Get current communication channel information.
0x17 Specify additional communication channels (TCP, UDP, or WebSocket) and start them.
0x19 Uninstall the backdoor and exit.
0x1E Enumerate all services.
0x1F Configure StartType for a specified service.
0x20 Start services with a specified name.
0x21 Invoke the ControlService function with a specified dwControl parameter.
0x22 Delete a specified service from the service manager. This does not stop the service if it’s running.
0x23 Initialize SOCKS proxy.
0x24 Terminate SOCKS proxy.*
0x25 Send data through SOCKS proxy.
0x26 SOCKS proxy-related command.*
0x2A Upload a specified file.*
0x2B File-transfer-related helper command.*
0x2C Download a specified file.*
0x2D File-transfer-related helper command.*
0x3C Enumerate free disk space.
0x3D List files in the specified directory.
0x3E Delete a specified file.
0x3F Create a specified directory.
0x40 Rename a specified file.
0x41 Execute an existing file.
0x42 Copy a specified file.
0x43 List files from the Recent Windows directories for the logged-in user:
%APPDATA%\Microsoft\Windows\Recent\
%APPDATA%\Microsoft\Office\Recent\

Infraestrutura de rede

Nesta campanha, foi identificado um único endereço de C&C: 207.148.78[.]36. Esse endereço está codificado de forma fixa na configuração (mostrada na Figura 9) da variante WIN_PLUS  do backdoor SprySOCKS.

As portas definidas na configuração que o backdoor deve utilizar para se comunicar com o C&C são:

  • TCP: 443
  • UDP: 53
  • WebSocket: 80

Conforme mencionado no relatório da Trend Micro, o endereço IP 207.148.75[.]122, pertencente ao mesmo intervalo de IP 207.148.64.0/20 do C&C anterior, foi utilizado pelos operadores do FishMonger como servidor de entrega do SprySOCKS em junho de 2023. Esse intervalo de IP pertence ao provedor de hospedagem em nuvem Vultr.

A variante representa uma expansão

A descoberta de uma variante para Windows do SprySOCKS, anteriormente conhecido como um backdoor exclusivo para Linux, representa uma expansão significativa das capacidades multiplataforma do FishMonger.

Nossa análise mostra que a versão para Windows mantém grande parte da arquitetura principal de sua contraparte para Linux, incluindo o protocolo de C&C, a criptografia utilizada e a lógica geral de gerenciamento de comandos, ao mesmo tempo em que incorpora mecanismos nativos do Windows quando necessário e aprimora o nível de furtividade do backdoor por meio do uso de drivers de kernel.

Considerando os indícios limitados sobre uma possível participação de um UEFI bootkit, recomendamos monitorar de perto as atividades desse grupo.

Para qualquer dúvida sobre nossa pesquisa publicada no WeLiveSecurity, entre em contato conosco pelo e-mail threatintel@eset.com.

Indicadores de Comprometimento

Arquivos

SHA‑1 Filename Detection Description
955BFC3DCC867256F9F46A606DEB0779FA3416D8 KX1B5206BDC1743DD.dat Win64/SprySOCKS.A Encrypted SprySOCKS DriverLoader driver.
44DC4A08C5EB0972C8E18B0E01284E06F09006BB bthcam.sys Win64/Agent.ESB SprySOCKS DriverLoader driver.
AB87B29B6F79487C75CA08D102E79001E536F083 KW1B5206BDC1743FP.dat Win64/SprySOCKS.A Encrypted SprySOCKS RawWNPF driver.
6490B8E4AADE25A3EE2DA9A47F312DB2122470BC X1B5206BDC1743DD.dat Win64/SprySOCKS.A Encrypted container of the encrypted WIN_DRV variant of SprySOCKS backdoor, encrypted SprySOCKS RawWNPF and SprySOCKS DriverLoader drivers.
E7484C24B88A1A2407A8F09D734F9A993670285B klelam00007.zip Win64/Agent.CXZ
Win64/SprySOCKS.A
BAT/Runner.KS
ZIP archive from VirusTotal containing the WIN_DRV variant of SprySOCKS, along with all the backdoor's components; clean binaries used for side-loading are included.
621D1952839BE4B0A1B0E66E87BCE5062CA368ED tpsvcloc.dll Win64/Agent.CXZ SprySOCKS loader.
2457EED2AB28E37741F10914EF929DAD2C8079D4 VSPMsg.dll Win64/Agent.CXZ First-stage loader responsible for launching the SprySOCKS loader.
D2C706B1EAF662BF0CE124B5032F73ED84BDA24A N/A Win64/SprySOCKS.A WIN_PLUS variant of the SprySOCKS backdoor.
5F3B87CEF56683D9A9E19186E0FD0D8019B559C4 N/A Win64/Agent.CXZ SprySOCKS loader.
C793CA31E3F6628B5C8986146953BF66232E9A30 config.dat Win64/SprySOCKS.A Encrypted container of the WIN_PLUS variant of the SprySOCKS backdoor and its loader.
037DB2445F3D72388CB2CF8510563148E5A184BE N/A BAT/Runner.KS Batch script that persists the WIN_DRV variant of SprySOCKS.

Rede

IP Domain Hosting provider First seen Details
207.148.78[.]36 N/A IRT‑CHOOPALLC‑AP N/A C&C IP hardcoded in the SprySOCKS backdoor (WIN_PLUS variant).

Técnicas MITRE ATT&CK

Esta tabela foi elaborada utilizando a versão 19 do framework MITRE ATT&CK.

Tactic ID Name Description
Reconnaissance T1592.004 Gather Victim Host Information: Client Configurations SprySOCKS can collect information about the compromised device, including: computer name, OS version, information about memory and CPU, current privileges, system language and version, current time, and more.
T1590.005 Gather Victim Network Information: IP Addresses SprySOCKS can collect information about the compromised device, including information about network interfaces and assigned IP addresses.
Resource Development T1587.001 Develop Capabilities: Malware FishMonger has developed custom malware for its operations, including the SprySOCKS backdoor.
Execution T1059.003 Command and Scripting Interpreter: Windows Command Shell SprySOCKS can launch an interactive cmd.exe command shell, which allows the attackers to execute commands remotely on the compromised machine.
T1053.005 Scheduled Task/Job: Scheduled Task SprySOCKS uses a scheduled task to execute its loader on system start.
T1569.002 System Services: Service Execution SprySOCKS abuses system services for both one-time and persistent execution.
T1106 Native API FishMonger has used Windows APIs to execute code within a victim’s system.
Persistence T1547.012 Boot or Logon Autostart Execution: Print Processors To achieve persistence, FishMonger installs its malicious loader as a print processor.
Privilege Escalation T1546.012 Event Triggered Execution: Image File Execution Options Injection SprySOCKS can install itself as a debugger for the Virtual Disk Service by modifying HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\vds.exe\debugger.
Stealth T1205.002 Traffic Signaling: Socket Filters SprySOCKS uses the RawWNPF kernel driver to install packet filters capable of redirecting any inbound TCP traffic to the configured local port if a special magic value is detected in the packet.
T1134.002 Access Token Manipulation: Create Process with Token FishMonger uses CreateProcessAsUser to execute a new process with a token obtained from the print spooler service.
T1622 Debugger Evasion SprySOCK’s RawWNPF driver uses the KdDisableDebugger function to disable the kernel debugger, if active.
T1140 Deobfuscate/Decode Files or Information SprySOCKS loader decrypts the SprySOCKS backdoor from an encrypted file. Additionally, most of the strings in the SprySOCKS components are encrypted.
T1070.004 Indicator Removal: File Deletion The SprySOCKS loader removes original files from the deployment directory after copying them and setting up persistence.
T1070.009 Indicator Removal: Clear Persistence SprySOCKS loader removes a service registry value associated with the previously installed malicious minifilter driver after executing the driver.
T1027.007 Obfuscated Files or Information: Dynamic API Resolution SprySOCKS components use dynamic API resolution.
T1027.013 Obfuscated Files or Information: Encrypted/Encoded File SprySOCKS components are stored in an AES-encrypted file on the victim’s drive.
T1055.013 Process Injection: Process Doppelgänging The SprySOCKS loader uses process doppelgänging to inject the backdoor into the svchost.exe process.
T1014 Rootkit FishMonger uses the RawWNPF kernel driver, which serves as a rootkit responsible for hiding the SprySOCKS malicious activity.
T1497 Virtualization/Sandbox Evasion SprySOCKS uses several anti-emulation techniques to prevent automated analysis by emulators or sandboxes.
T1574.002 Hijack Execution Flow: DLL Side-Loading FishMonger uses DLL side-loading to execute the SprySOCKS backdoor.
Defense Impairment T1562.004 Disable or Modify System Firewall SprySOCKS adds a firewall rule allowing any inbound traffic sent to the backdoor’s listening port.
Discovery T1010 Application Window Discovery SprySOCKS retrieves the active foreground window name as a part of its keylogging functionality.
T1083 File and Directory Discovery SprySOCKS can obtain file and directory listings from the compromised system.
T1518.001 Software Discovery: Security Software Discovery SprySOCKS components check for the presence of security and sandboxing product libraries (snxhk.dll, SxWrapper.dll, SxIn.dll, SXIn64.dll, SbieDll.dll, and cmdvrt32.dll) in their own processes.
T1082 System Information Discovery SprySOCKS can collect information about the compromised device, including: computer name, OS version, information about memory and CPU, current privileges, system language and version, current time, and more.
T1614.001 System Location Discovery: System Language Discovery SprySOCKS can collect information about the compromised device, including system language.
T1007 System Service Discovery SprySOCKS can enumerate all services on the system.
T1124 System Time Discovery SprySOCKS can collect information about the compromised device, including current system time.
Collection T1056.001 Input Capture: Keylogging SprySOCKS implements a keylogger.
T1115 Clipboard Data SprySOCKS logs clipboard data, along with the captured keystrokes, as a part of its keylogging functionality.
Command and Control T1132.001 Data Encoding: Standard Encoding SprySOCKS uses base64 encoding in its custom C&C communication protocol.
T1573.001 Encrypted Channel: Symmetric Cryptography SprySOCKS encrypts data sent to, and decrypts data received from, the C&C with 128-bit AES.
T1008 Fallback Channels In addition to the TCP communication channel, SprySOCKS can contact its C&C using UDP and WebSocket channels.
T1665 Hide Infrastructure SprySOCKS’s RawWNPF driver hides the backdoor’s active connections from being enumerated when using network tools such as netstat.exe.
T1571 Non-Standard Port SprySOCKS uses nonstandard ports to communicate with the C&C.
T1095 Non-Application Layer Protocol SprySOCKS uses nonstandard protocols to communicate with the C&C.
Exfiltration T1041 Exfiltration Over C2 Channel SprySOCKS can upload various files from the compromised system to the C&C.