
Kalim backdooe Malware Report





Il campione importa un gran numero di API di Windows, indicando che non è packed. In totale, importa funzioni da sei DLL: KERNEL32.dll, USER32.dll, ADVAPI32.dll, SHELL32.dll, ole32.dll e WININET.dll.
Sebbene siano importate più API da ogni DLL, diverse funzioni sono particolarmente degne di nota per il loro ruolo nel comportamento del malware.
Nello specifico, il campione importa API relative alla rete da WININET.dll per stabilire la comunicazione con il server di comando e controllo (C2). Sfrutta anche funzioni relative a COM da ole32.dll per creare e interagire con oggetti del Component Object Model (COM). Inoltre, il malware usa SHGetFolderPathW da SHELL32.dll per recuperare i percorsi delle directory di sistema identificati dai valori CSIDL.



Il malware implementa la sua logica di comunicazione di rete attraverso tre funzioni distinte e genera due thread separati. Un thread è responsabile della creazione e gestione di una shell dei comandi, mentre il secondo thread gestisce il caricamento dei dati raccolti dopo che il malware ha completato la sua esecuzione.
Le tre funzioni gestiscono collettivamente la comunicazione tra l'host infetto e il server di comando e controllo (C2) e sono organizzate in tre livelli logici.
Il primo livello è responsabile della raccolta di informazioni di fingerprinting basate sull'host dal sistema compromesso. Il secondo livello elabora questi dati eseguendo crittografia e ulteriori manipolazioni per prepararli alla trasmissione. Il terzo livello stabilisce la comunicazione di rete con il dominio C2 moodleuni[.]com e trasmette i dati elaborati.
Le prime due funzioni relative alla rete sono specificamente responsabili dell'autenticazione e della costruzione di richieste HTTP POST, consentendo la trasmissione autenticata dei dati al server remoto.

La terza funzione è responsabile della ricezione dei comandi dal server C2. In base alla risposta del server, il malware determina la sua azione successiva: generare una shell dei comandi nascosta o caricare i dati raccolti in base al comando ricevuto dal C2.

Nel primo thread, il malware crea un oggetto job insieme ad altri due pipe e poi imposta una certa proprietà su di essi.
Poi crea un CMD con alcune proprietà:
Il valore 1 nel quarto argomento significa che il CMD può ereditare dagli handle dei pipe
Il valore 0x1000200u nel quinto argomento significa che il CMD ha quanto segue:
CREATE_NO_WINDOW = 0x0000000u
CREATE_NEW_PROCESS_GROUP = 0x0000200u
CREATE_UNICODE_ENVIRONMENT = 0x0000400u
E alcune informazioni di avvio: {dimensione della struttura = 104 byte, hStdError = hWritePipe, hStdOutput = hWritePipe, hStdInput = hReadPipe2, dwFlags |= 0x100u = STARTF_USESTDHANDLES}.
Il primo pipe è responsabile di leggere l'output dalla shell e il secondo di scrivere nella shell.
E un puntatore a PROCESS_INFORMATION
E dopo aver creato la shell, la assegna all'oggetto job e la mette in stato di attesa in attesa di comandi dal C2.

La shell controlla i comandi di controllo inviati tramite memoria condivisa:
Pending: Esecuzione normale.
Terminate: Uccidi la shell e pulisci. Shell completamente distrutta e resettata
Ctrlc: Forza l'uccisione di eventuali processi figli rimanenti.

In funzionamento normale, se esiste un comando, lo scrive nel CMD e poi controlla un output usando PeekNamedPipe e lo memorizza nel buffer.

Il secondo thread. Il thread inizia creando un nuovo file nel percorso specificato. Questo file viene utilizzato per archiviare temporaneamente i dati prima di caricarli sul server C2. Se il file non può essere creato o si verifica un errore durante l'inizializzazione, la funzione imposta una stringa di stato "error" nella memoria condivisa ed esce. Il file viene trasmesso tramite HTTPS al server di comando e controllo del malware (moodleuni[.]com) utilizzando intestazioni personalizzate e identificatori di sessione per imitare il traffico legittimo. Dopo il completamento del caricamento, la funzione aggiorna la memoria condivisa per indicare successo o fallimento:
Il malware backdoor Kalim si concentra prima sull'instaurazione della persistenza per garantire una presenza a lungo termine sul sistema vittima. Raggiunge questo obiettivo creando un collegamento dannoso nella directory di avvio (CSIDL_STARTUP):
C:\Users<User>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Questo meccanismo garantisce che il malware venga eseguito automaticamente ogni volta che il sistema si avvia.
Una volta stabilita la persistenza, il malware avvia la comunicazione con il suo server di comando e controllo (C2), moodleuni[.]com. Esegue una fase iniziale di autenticazione e fingerprinting del sistema, durante la quale vengono raccolte, elaborate e crittografate informazioni basate sull'host. Il malware entra quindi in uno stato di attesa dei comandi, interrogando continuamente il C2 per istruzioni.
In base ai comandi ricevuti, il malware può decidere dinamicamente le sue azioni successive, inclusa la generazione di una shell dei comandi nascosta per il controllo interattivo o il caricamento dei dati raccolti al server C2. Questo design modulare consente sia l'esecuzione remota di comandi che l'esfiltrazione di dati, rendendo Kalim un backdoor flessibile e persistente.

| Tattica | ID Tecnica | Nome |
|---|---|---|
| Persistenza | T1547.001 | Cartella di Avvio |
| Evasione della Difesa | T1036.005 | Masquerading |
| Esecuzione | T1204.002 | Esecuzione da parte dell'utente |
| Comando e Controllo / Staging | T1105 | Trasferimento di strumenti in ingresso |
| Evasione della Difesa | T1559.001 | Abuso di COM |
- Nome famiglia: Kalim
- TA: MuddyWater
- SHA256 = 0c8071494bc155c96f2cee998200f63efffcb5a064c021de0925504271806229
- C2 = moodleuni[.]com
- MicrosoftUpdateSerice.lnk
- 150.171.27.12 (Da VirusTotal)
rule kalim{
meta:
description = "Rileva il malware Kalim"
author = "SalahEldin Fikri"
strings:
$m1 = "kalim.pdb" wide ascii
$s1 = "UPLOAD"
$s2 = "isHidden"
$s3 = "/command"
$s4 = "sleepTime"
$s5 = "hardwareId"
$s6 = "pending"
$s7 = "ctrlc"
$s8 = "terminate"
$s9 = { 8D 01 02 04 08 10 20 40 80 1B 36 }
$s10 = "KifHsNH6Xhgyebsr"
condition:
uint16(0) == 0x5A4D and
filesize < 500KB and
($m1) and
7 of ($s*)
}