SOC Prime Bias: Crítico

07 Abr 2026 18:30

Mustang Panda e PlugX: Uma Análise Detalhada das Operações de Carregadores Lideradas por Phishing

Author Photo
Ruslan Mikhalov Chefe de Pesquisa de Ameaças na SOC Prime linkedin icon Seguir
Mustang Panda e PlugX: Uma Análise Detalhada das Operações de Carregadores Lideradas por Phishing
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumo

O relatório descreve uma intrusão em várias etapas atribuída ao grupo Mustang Panda com ligação à China. A cadeia começa com um atalho do Windows (LNK) armado que inicia um carregador PowerShell. Esse carregador solta um arquivo ZIP de isca, extrai um DLL criptografado e, por fim, implanta o trojan de acesso remoto PlugX usando carregamento reflexivo e injeção de pool de threads. O tráfego de comando e controle é enviado via HTTPS para infraestrutura associada ao domínio coastallasercompany.com. O implante também implementa técnicas evasivas como hashing de API, caminhada no PEB e obfuscation pesada de strings para reduzir a detecção estática.

Investigação

Os analistas reconstruíram o caminho de execução de ponta a ponta: ativação inicial do LNK, estágio PowerShell, DLL side-loading, decriptação em memória e execução final do PlugX. As ferramentas utilizam hashing API semelhante ao DJB2 e hashing ROL-13 para resolução de importações, além de um blob de configuração criptografado com RC4. Foi observada persistência através da modificação da chave de registro HKCU Run. A investigação extraiu indicadores preparados para detecção, incluindo nomes de arquivos, hashes e o domínio C2 usado para comunicação via HTTPS.

Mitigação

Bloquear ou colocar em quarentena arquivos .lnk não confiáveis e restringir a execução de PowerShell, especialmente scripts que leem ou escrevem em locais graváveis pelo usuário. Monitorar a criação suspeita de arquivos em %LocalAppData%, particularmente nomes de GUID gerados aleatoriamente, e reforçar o comportamento de pesquisa de ordem de DLL para reduzir oportunidades de side-loading. Aplicar controles DNS/proxy para negar acesso ao domínio C2 identificado e usar inspeção TLS onde apropriado para evidenciar padrões anômalos de beaconing HTTPS.

Resposta

Se atividades suspeitas forem detectadas, isolar o host, capturar a memória volátil e preservar a configuração criptografada para análise mais profunda. Cobrir o ambiente em busca dos IOCs extraídos, remover artefatos deixados e deletar a entrada persistente maliciosa HKCU Run. Trocar senhas conforme o escopo e procurar por sinais de movimento lateral consistente com as técnicas de operação do PlugX.

"graph TB %% Class definitions classDef technique fill:#ffcc99 classDef artifact fill:#ccffcc classDef process fill:#ccccff classDef registry fill:#ffe599 %% Initial Access initial_zip["<b>Artifact</b> – Arquivo ZIP malicioso contendo .lnk"] class initial_zip artifact lnk_shortcut["<b>Artifact</b> – Atalho (.lnk) com ícone oculto"] class lnk_shortcut artifact tech_lnk_smack["<b>Technique</b> – T1027.012 Escondendo ícone LNK<br/><b>Descrição</b>: Uso de ícone LNK para ocultar uma carga maliciosa"] class tech_lnk_smack technique tech_user_exec["<b>Technique</b> – T1204.002 Execução de Usuário: Arquivo Malicioso<br/><b>Descrição</b>: Vítima abre arquivo malicioso"] class tech_user_exec technique %% Execution psh_stage["<b>Process</b> – Estágio PowerShell executado por .lnk"] class psh_stage process tech_psh["<b>Technique</b> – T1059.001 PowerShell<br/><b>Descrição</b>: Interpretador de comandos e scripts"] class tech_psh technique tech_archive_custom["<b>Technique</b> – T1560.003 Arquivo via Método Personalizado<br/><b>Descrição</b>: Lê ZIP como bytes crus"] class tech_archive_custom technique extracted_exe["<b>Artifact</b> – Executável extraído com aparência legítimau2011"] class extracted_exe artifact malicious_dll["<b>Artifact</b> – Eraser.dll (malicioso)"] class malicious_dll artifact encrypted_dat["<b>Artifact</b> – Payload .dat criptografado"] class encrypted_dat artifact %% Persistence run_key["<b>Registry</b> – Entrada HKCUSoftwareMicrosoftWindowsCurrentVersionRun"] class run_key registry tech_run_key["<b>Technique</b> – T1037.001 Script de Logon (Boot ou Script de Inicialização de Logon)<br/><b>Descrição</b>: Persistência da chave Run"] class tech_run_key technique shortcut_mod["<b>Technique</b> – T1547.009 Modificação de Atalhos<br/><b>Descrição</b>: Modifica atalhos para autoinício"] class shortcut_mod technique active_setup["<b>Technique</b> – T1547.014 Configuração Ativa<br/><b>Descrição</b>: Entrada de registro para autoinício via Configuração Ativa"] class active_setup technique psh_profile["<b>Technique</b> – T1546.013 Perfil do PowerShell<br/><b>Descrição</b>: Conecta perfil do PowerShell para execução"] class psh_profile technique %% Defense Evasion tech_compress["<b>Technique</b> – T1027.015 Compressão<br/><b>Descrição</b>: Comprime carga dentro do ZIP"] class tech_compress technique tech_dynamic_api["<b>Technique</b> – T1027.007 Resolução Dinâmica de API<br/><b>Descrição</b>: Resolve APIs em tempo de execução usando hash"] class tech_dynamic_api technique tech_embedded["<b>Technique</b> – T1027.009 Cargas Embutidas<br/><b>Descrição</b>: Embute cargas criptografadas"] class tech_embedded technique tech_deobfuscate["<b>Technique</b> – T1140 Desofuscar/Decodificar Arquivos ou Informações<br/><b>Descrição</b>: Decriptação RC4/XOR em tempo de execução"] class tech_deobfuscate technique tech_masquerade["<b>Technique</b> – T1036.008 Mascaramento: Tipo de Arquivo de Mascaramento<br/><b>Descrição</b>: Sobreposição de PDF de isca"] class tech_masquerade technique %% Privilege Escalation / Execution tech_reflective["<b>Technique</b> – T1620 Carregamento de Código Reflexivo<br/><b>Descrição</b>: Carrega DLL na memória sem tocar no disco"] class tech_reflective technique tech_injection["<b>Technique</b> – T1055.001 Injeção de Processo: Injeção de DLL<br/><b>Descrição</b>: Injeta DLL via caminhada PEB e callbacks de pool de threads"] class tech_injection technique %% Command and Control c2_https["<b>Process</b> – Comunicação C2 HTTPS (porta 443)"] class c2_https process tech_nonstd_port["<b>Technique</b> – T1571 Porta Nonu2011Standard<br/><b>Descrição</b>: Usa porta comum para misturar tráfego"] class tech_nonstd_port technique tech_dead_drop["<b>Technique</b> – T1102.001 Resolvedor Dead Drop<br/><b>Descrição</b>: Recupera endereço de servidor do serviço web"] class tech_dead_drop technique tech_proxy["<b>Technique</b> – T1090.002 Proxy: Proxy Externo<br/><b>Descrição</b>: Redireciona tráfego através de proxy externo"] class tech_proxy technique %% Connections initial_zip –>|contains| lnk_shortcut lnk_shortcut –>|uses| tech_lnk_smack lnk_shortcut –>|triggers| tech_user_exec tech_user_exec –>|leads to| psh_stage psh_stage –>|executes| tech_psh psh_stage –>|reads| tech_archive_custom tech_archive_custom –>|extracts| extracted_exe tech_archive_custom –>|extracts| malicious_dll tech_archive_custom –>|extracts| encrypted_dat psh_stage –>|writes| run_key run_key –>|implements| tech_run_key psh_stage –>|creates| shortcut_mod psh_stage –>|creates| active_setup psh_stage –>|hooks| psh_profile psh_stage –>|applies| tech_compress psh_stage –>|applies| tech_dynamic_api psh_stage –>|applies| tech_embedded psh_stage –>|applies| tech_deobfuscate psh_stage –>|applies| tech_masquerade malicious_dll –>|acts as| tech_reflective malicious_dll –>|performs| tech_injection tech_injection –>|enables| c2_https c2_https –>|uses| tech_nonstd_port c2_https –>|uses| tech_dead_drop c2_https –>|may route through| tech_proxy %% Class assignments class initial_zip,lnk_shortcut,extracted_exe,malicious_dll,encrypted_dat artifact class psh_stage,c2_https process class run_key registry class tech_lnk_smack,tech_user_exec,tech_psh,tech_archive_custom,tech_run_key,shortcut_mod,active_setup,psh_profile,tech_compress,tech_dynamic_api,tech_embedded,tech_deobfuscate,tech_masquerade,tech_reflective,tech_injection,tech_nonstd_port,tech_dead_drop,tech_proxy technique "

Fluxo de Ataque

Execução de Simulação

Pré-requisito: O Teste Pré-voo de Telemetria e Linha de Base deve ter sido aprovado.

Justificativa: Esta seção detalha a execução precisa da técnica de adversário (TTP) projetada para acionar a regra de detecção. Os comandos e narrativas refletem diretamente os TTPs identificados e visam gerar a telemetria exata esperada pela lógica de detecção.

  • Narrativa & Comandos do Ataque:
    Um atacante ganhou acesso a uma estação de trabalho comprometida e quer organizar cargas maliciosas enquanto permanece invisível para o usuário. Eles lançam o PowerShell em modo oculto (-w hidden) para evitar pop-ups de UI. Dentro da mesma sessão PowerShell eles usam o utilitário incorporado tar (disponível nas versões modernas do Windows) para extrair um arquivo de isca que contém as cargas de próxima etapa diretamente em %LocalAppData%, um local gravável que muitas vezes é ignorado pelas defesas.

    Passos:

    1. Criar um pequeno arquivo tar (payloads.tar) contendo um arquivo falso benigno (simulando a carga maliciosa).
    2. Armazenar o arquivo em um local temporário (C:Temp).
    3. Executar PowerShell em janela oculta que executa o comando de extração visando tar Script de Teste de Regressão: %LocalAppData%.
  • # ——————————————————— # Passo 1 – Preparar um arquivo tar de exemplo (simula cargas) # ——————————————————— $tempDir = “C:Temp” $archive = “$tempDirpayloads.tar” $payload = “$tempDirdummy.txt” $destDir = “$Env:LocalAppDataStagedPayloads” # Garantir que a pasta temporária exista New-Item -ItemType Directory -Path $tempDir -Force | Out-Null # Criar um arquivo falso para arquivar “Este é um arquivo de carga falsificada.” | Set-Content -Path $payload -Encoding UTF8 # Criar o arquivo tar (requer tar do Windows) tar -cf $archive -C $tempDir dummy.txt # ——————————————————— # Passo 2 – Executar PowerShell oculto que extrai o arquivo # ——————————————————— $extractCmd = “tar -xvf `”$archive`” -C `”$Env:LocalAppData`”” $psArgs = “-NoProfile -WindowStyle Hidden -Command `$extractCmd” Start-Process -FilePath “powershell.exe” -ArgumentList $psArgs -WindowStyle Hidden # ——————————————————— # Passo 3 – Opcional: Verificar extração (para validação manual) # ——————————————————— Write-Host “Extração completa. Os arquivos agora devem existir em $Env:LocalAppData”

    # ---------------------------------------------------------
    # Step 1 – Prepare a sample tar archive (simulates payloads)
    # ---------------------------------------------------------
    $tempDir   = "C:Temp"
    $archive   = "$tempDirpayloads.tar"
    $payload   = "$tempDirdummy.txt"
    $destDir   = "$Env:LocalAppDataStagedPayloads"
    
    # Ensure temp folder exists
    New-Item -ItemType Directory -Path $tempDir -Force | Out-Null
    
    # Create a dummy file to archive
    "This is a dummy payload file." | Set-Content -Path $payload -Encoding UTF8
    
    # Create the tar archive (requires Windows tar)
    tar -cf $archive -C $tempDir dummy.txt
    
    # ---------------------------------------------------------
    # Step 2 – Execute hidden PowerShell that extracts the archive
    # ---------------------------------------------------------
    $extractCmd = "tar -xvf `"$archive`" -C `"$Env:LocalAppData`""
    $psArgs     = "-NoProfile -WindowStyle Hidden -Command `$extractCmd"
    
    Start-Process -FilePath "powershell.exe" -ArgumentList $psArgs -WindowStyle Hidden
    
    # ---------------------------------------------------------
    # Step 3 – Optional: Verify extraction (for manual validation)
    # ---------------------------------------------------------
    Write-Host "Extraction complete. Files should now exist in $Env:LocalAppData"
  • Comandos de Limpeza:

    # Remover arquivos temporários e cargas organizadas
    Remove-Item -Path "C:Temppayloads.tar" -Force -ErrorAction SilentlyContinue
    Remove-Item -Path "C:Tempdummy.txt"   -Force -ErrorAction SilentlyContinue
    Remove-Item -Path "$Env:LocalAppDatadummy.txt" -Force -ErrorAction SilentlyContinue
    # Opcionalmente remover toda a pasta de organização, se criada
    Remove-Item -Path "$Env:LocalAppDataStagedPayloads" -Recurse -Force -ErrorAction SilentlyContinue