Mustang Panda e PlugX: Uma Análise Detalhada das Operações de Carregadores Lideradas por Phishing
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
Detecções
Possível Tentativa de Side-Loading de DLL Eraser (via image_load)
Visualizar
A Possibilidade de Execução Através de Linhas de Comando PowerShell Ocultas (via cmdline)
Visualizar
Chamar Métodos Suspiciosos .NET a partir do PowerShell (via powershell)
Visualizar
Chamar Classes/Métodos Suspiciosos .NET a partir da Linha de Comando PowerShell (via criação de processo)
Visualizar
IOCs (HashSha256) para detectar: PlugX: Mustang Panda APT Dentro do Mustang Panda: Das Correntes de Spear-Phishing ao PlugX — Um Mergulho Profundo na Infraestrutura de Carregamento
Visualizar
IOCs (HashSha1) para detectar: PlugX: Mustang Panda APT Dentro do Mustang Panda: Das Correntes de Spear-Phishing ao PlugX — Um Mergulho Profundo na Infraestrutura de Carregamento
Visualizar
IOCs (HashMd5) para detectar: PlugX: Mustang Panda APT Dentro do Mustang Panda: Das Correntes de Spear-Phishing ao PlugX — Um Mergulho Profundo na Infraestrutura de Carregamento
Visualizar
Execução Oculta de Janela de PowerShell e Descompactação de Arquivo de Isca [Windows PowerShell]
Visualizar
Detecção de Side-Loading Malicioso de DLL por ErsChk.exe [Criação de Processo do Windows]
Visualizar
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 incorporadotar(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:
- Criar um pequeno arquivo tar (
payloads.tar) contendo um arquivo falso benigno (simulando a carga maliciosa). - Armazenar o arquivo em um local temporário (
C:Temp). - Executar PowerShell em janela oculta que executa o comando de extração visando
tarScript de Teste de Regressão:%LocalAppData%.
- Criar um pequeno arquivo tar (
-
# ——————————————————— # 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