SOC Prime Bias: Alto

14 Apr 2026 18:38

VIPERTUNNEL Backdoor Python: Un’Analisi Approfondita

Author Photo
SOC Prime Team linkedin icon Segui
VIPERTUNNEL Backdoor Python: Un’Analisi Approfondita
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Sommario

Il rapporto dettaglia l’analisi di VIPERTUNNEL, una backdoor basata su Python che ottiene la persistenza tramite un’attività pianificata e sfrutta un sito sitecustomize.py malevolo per caricare una DLL offuscata. La DLL decodifica ed esegue un payload a più stadi che stabilisce un proxy SOCKS5 a un server C2 codificato su porta 443. L’infrastruttura è collegata a UNC2165 ed EvilCorp e condivide tecniche di offuscamento con il credential-stealer ShadowCoil.

Indagine

I ricercatori hanno esaminato l’output di Autoruns, identificato l’attività pianificata 523135538 e tracciato l’esecuzione fino a C:ProgramDatacp49spythonw.exe e al suo modulo sitecustomize.py. L’analisi inversa di b5yogiiy3c.dll ha rivelato offuscamento a strati, routine di decrittazione e una fase finale che crea un tunnel SOCKS5 utilizzando credenziali codificate. L’analisi dell’infrastruttura ha collegato più domini e IP alla campagna e ha evidenziato l’uso del framework Pyramid C2.

Mitigazione

Distribuire la rilevazione degli endpoint che monitora l’esecuzione di pythonw.exe senza argomenti, la creazione di attività pianificate con nomi numerici e la presenza di sitecustomize.py in posizioni inaspettate. Bloccare il traffico in uscita verso domini C2 conosciuti e le porte 443/8000 con risposte HTTP 401 anomale. Implementare un rigoroso controllo delle applicazioni per prevenire il caricamento di moduli Python non autorizzati.

Risposta

Avvisare sulla creazione dell’attività pianificata sospetta e l’esecuzione di pythonw.exe senza uno script. Quarantena degli host compromessi, raccolta di dump di memoria, e ricerca dei nomi di classi caratteristiche e delle credenziali codificate. Invalida le credenziali compromesse e interrompi l’infrastruttura C2 identificata nel rapporto.

graph TB %% Class definitions classDef technique fill:#ffcc99 classDef process fill:#c2f0c2 classDef tool fill:#ffeb99 classDef file fill:#d9d9d9 classDef component fill:#cce5ff classDef c2 fill:#f4b084 classDef credential fill:#ffe6e6 %% Technique nodes tech_persistence[“<b>Tecnica</b> – T1053.005 Attività pianificata : persistenza<br/><b>Descrizione</b>: crea/modifica task pianificati per esecuzione automatica”] class tech_persistence technique tech_obfuscation[“<b>Tecnica</b> – T1027 Offuscamento file o informazioni<br/><b>Descrizione</b>: usa encoding e crittografia per nascondere codice”] class tech_obfuscation technique tech_deobfuscate[“<b>Tecnica</b> – T1140 Decodifica/deoffuscamento<br/><b>Descrizione</b>: decodifica Base85 per recuperare codice”] class tech_deobfuscate technique tech_compile[“<b>Tecnica</b> – T1027.004 Compilazione dopo consegna<br/><b>Descrizione</b>: compile()/exec() in memoria”] class tech_compile technique tech_reflect[“<b>Tecnica</b> – T1620 Caricamento riflessivo<br/><b>Descrizione</b>: esecuzione in memoria senza disco”] class tech_reflect technique tech_proxy_ext[“<b>Tecnica</b> – T1090.002 Proxy esterno<br/><b>Descrizione</b>: SOCKS5 proxy esterno”] class tech_proxy_ext technique tech_proxy_int[“<b>Tecnica</b> – T1090.001 Proxy interno<br/><b>Descrizione</b>: relay interno”] class tech_proxy_int technique tech_tunnel[“<b>Tecnica</b> – T1572 Tunneling protocollo<br/><b>Descrizione</b>: incapsulamento traffico SOCKS5”] class tech_tunnel technique tech_encrypted[“<b>Tecnica</b> – T1573 Canale crittografato<br/><b>Descrizione</b>: crittografia ChaCha20/XOR”] class tech_encrypted technique tech_webc2[“<b>Tecnica</b> – T1102 Web service<br/><b>Descrizione</b>: comunicazione HTTPS con C2”] class tech_webc2 technique tech_nonstd[“<b>Tecnica</b> – T1571 Porta non standard<br/><b>Descrizione</b>: uso porta 443 per mascheramento”] class tech_nonstd technique %% Process and tool nodes process_task[“<b>Processo</b> – Task pianificato 523135538<br/><b>Comando</b>: C:\\ProgramData\\cp49s\\pythonw.exe”] class process_task process tool_pythonw[“<b>Tool</b> – pythonw.exe<br/><b>Ruolo</b>: esecuzione Python senza console”] class tool_pythonw tool %% File nodes file_sitecustomize[“<b>File</b> – sitecustomize.py<br/><b>Scopo</b>: auto-import e esecuzione DLL”] class file_sitecustomize file file_dll[“<b>File</b> – b5yogiiy3c.dll<br/><b>Tipo</b>: payload Python offuscato”] class file_dll file %% Component nodes component_wire[“<b>Componente</b> – classe Wire<br/><b>Funzione</b>: client SOCKS5”] class component_wire component component_relay[“<b>Componente</b> – classe Relay<br/><b>Funzione</b>: inoltro traffico”] class component_relay component component_commander[“<b>Componente</b> – classe Commander<br/><b>Funzione</b>: controllo C2”] class component_commander component %% C2 and credential nodes c2_server[“<b>C2 Server</b> – servizio Pyramid<br/><b>Risposta</b>: HTTP 401 Basic realm=Proxy”] class c2_server c2 credentials[“<b>Credenziali</b> – AnyUser / AnyPassword<br/><b>Uso</b>: autenticazione proxy”] class credentials credential %% Connections tech_persistence –>|creates| process_task process_task –>|launches| tool_pythonw tool_pythonw –>|imports| file_sitecustomize file_sitecustomize –>|loads| file_dll file_dll –>|uses| tech_obfuscation file_dll –>|triggers| tech_deobfuscate tech_deobfuscate –>|leads to| tech_compile tech_compile –>|leads to| tech_reflect tech_reflect –>|executes| component_wire component_wire –>|works with| component_relay component_relay –>|controls| component_commander component_commander –>|contacts| c2_server c2_server –>|uses| tech_proxy_ext c2_server –>|uses| tech_proxy_int c2_server –>|tunnels via| tech_tunnel c2_server –>|encrypts channel| tech_encrypted c2_server –>|communicates over| tech_webc2 c2_server –>|uses port| tech_nonstd component_commander –>|auth with| credentials %% Apply classes class tech_persistence,tech_obfuscation,tech_deobfuscate,tech_compile,tech_reflect,tech_proxy_ext,tech_proxy_int,tech_tunnel,tech_encrypted,tech_webc2,tech_nonstd technique class process_task process class tool_pythonw tool class file_sitecustomize,file_dll file class component_wire,component_relay,component_commander component class c2_server c2 class credentials credential

Flusso de Attacco

Esecuzione della Simulazione

Pre-requisito: Il Controllo Pre-Volante di Telemetria e Baseline deve essere passato.

Motivazione: Questa sezione dettaglia l’esecuzione precisa della tecnica avversaria (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrazione DEVONO riflettere direttamente le TTP identificate e mirare a generare telemetria esattamente come previsto dalla logica di rilevamento.

  • Narrazione dell’Attacco e Comandi:

    L’avversario prima lascia cadere un file sitecustomize.py dannoso nella stessa directory di pythonw.exe. Python importa automaticamente sitecustomize.py all’avvio dell’interprete, permettendo all’attaccante di eseguire codice arbitrario senza passare un percorso di script sulla linea di comando. Avviando pythonw.exe senza argomenti, l’evento di creazione del processo contiene una linea di comando vuota, soddisfacendo le condizioni della regola Sigma. Il payload stabilisce un’attività pianificata per la persistenza, assicurando che l’interprete venga eseguito all’avvio del sistema, mantenendo così una presenza a lungo termine. CommandLine field, satisfying the Sigma rule’s conditions. The payload establishes a scheduled task for persistence, ensuring the interpreter runs at system startup, thereby maintaining long‑term foothold.

  • Script di Test di Regressione:

    # -------------------------------------------------
    # Setup sito malevolo sitecustomize.py
    # -------------------------------------------------
    $payloadPath = 'C:ProgramDatacp49ssitecustomize.py'
    $exePath     = 'C:ProgramDatacp49spythonw.exe'
    
    # Assicurarsi che la cartella di destinazione esista
    New-Item -ItemType Directory -Path (Split-Path $exePath) -Force | Out-Null
    
    # Distribuire una copia benigna di pythonw.exe per il test (se non già presente)
    # In uno scenario di red team reale questo sarebbe l'interprete legittimo
    if (-Not (Test-Path $exePath)) {
        # Copia dall'installazione di Python di sistema (modificare il percorso come necessario)
        Copy-Item 'C:Python39pythonw.exe' $exePath
    }
    
    # Creare un sito malevolo sitecustomize.py (crea un'attività pianificata come prova del concetto)
    @"
    import subprocess, sys
    # Creare un'attività pianificata che esegue pythonw.exe ogni minuto (persistenza)
    subprocess.run(['schtasks', '/Create', '/SC', 'MINUTE', '/MO', '1',
                '/TN', 'UpdateTask', '/TR', sys.executable])
    "@ | Set-Content -Path $payloadPath -Encoding UTF8
    
    # -------------------------------------------------
    # Attivare il rilevamento (esecuzione malevola)
    # -------------------------------------------------
    Write-Host '[+] Avvio di pythonw.exe con linea di comando vuota...'
    Start-Process -FilePath $exePath -ArgumentList '' -WindowStyle Hidden
    
    # Attendere un breve periodo per la creazione dell'attività pianificata (opzionale)
    Start-Sleep -Seconds 5
    
    Write-Host '[+] Payload eseguito. Controlla il tuo SIEM per l'allerta.'
    # -------------------------------------------------
    # Fine dello script
    # -------------------------------------------------
  • Comandi di Pulizia:

    # Rimuovere il sito malevolo sitecustomize.py
    Remove-Item -Path 'C:ProgramDatacp49ssitecustomize.py' -Force -ErrorAction SilentlyContinue
    
    # Eliminare l'attività pianificata creata dal payload
    schtasks /Delete /TN UpdateTask /F
    
    # Rimuovere facoltativamente la copia di pythonw.exe (se era una copia di test)
    # Remove-Item -Path 'C:ProgramDatacp49spythonw.exe' -Force
    
    Write-Host '[+] Pulizia completata.'