SHA1: e2432fa6c53dfb62aeba242cd28fc4d51a70dbe3 (backdoor)
de5cc2779b9519bc3bbbda084f0b4cb858d2f890 (dropper)
Un trojan backdoor ciblant Linux consistant en un injecteur et une charge utile effectuant plusieurs actions malveillantes.
L’injecteur a été créé en utilisant Lazarus, un IDE multi plateforme gratuit pour le compilateur Free Pascal. Une fois lancé, il affiche la fenêtre de dialogue suivante invitant un utilisateur à entrer ses login et mot de passe :
Après avoir entré des données arbitraires, exceptées celles qui sont codées en dur (hard-coded) dans le corps du Trojan, des boîtes de dialogue comme "Initializing", "Connecting”, et "Signing in” s’affichent sur l’écran les unes à la suite des autres. Ensuite, le message d’erreur suivant s’affiche : "Incorrect user ID or password. Please try again”. Si l’utilisateur entre un des identifiants suivants :
- j****/g***********
- m*****/f*********
- c****/j********
la réponse du Trojan sera la suivante : "An error occurred while attempting to login: invalid user token".
Le second composant du Trojan –la porte dérobée elle-même- est sauvegardée dans le dossier /tmp/.ltmp/ après le lancement de l’injecteur. Une fois que la backdoor est lancée, elle décrypte les lignes de configuration cryptées via l’algorithme RC4. La clé de déchiffrement est codée en dur dans le corps du Trojan. La configuration possède la structure suivante :
serversList: liste de serveurs C&C utilisés pour établir une connexion ;
proxyList: liste de serveurs proxy via lesquels une connexion peut être établie ;
Salt: ligne utilisée pour générer un mot de passe ;
bitMask: nombre qui vérifie les bits indiqués. S’ils sont paramétrés sur “1”, des actions spécifiques seront effectuées Durant l’initialisation.
Valeurs des bits:
bit | Valeur |
---|---|
0x1 | Se copie lui-même dans un endroit spécifié par une valeur du champ pathToExe dans la configuration |
0x2 | Traite le paramètre -m : -m file supprime un fichier ou le dossier du file |
0x4 | Débloque son fichier exécutable pour Read/Write |
0x8 | Paramètre l’autorun via $HOME/.config/autostart |
0x10 | Paramètre l’autorun via crontab |
0x20 | Ouvre /tmp/$tmpLockFileName et le protège en écriture |
0x40 | Lance un thread avec un keyloggerм |
0x80 | Exécute la commande fork/chdir |
0x100 | Ajoute les proxies système à la liste des serveurs proxy |
0x400 | Tente de se connecter d’abord via un proxy lors de la connexion au serveur |
0x800 | Se connecte uniquement via un proxy |
Le fichier .default.conf est créé dans le dossier du fichier exécutable et possède la structure suivante :
struct conf{
int32 magic; //0DE03C44h
char hostid[32];
char group[32];
}
Une fois que la procédure d’initialisation et que le déchiffrement du fichier de configuration sont terminées, la backdoor se connecte à un serveur, lui envoie la clé et commence à exécuter les commandes. Toutes les commandes, exceptée la commande id=5, sont chiffrées.
Liste des commandes :
id | Actions à exécuter |
---|---|
5 | Obtient la clé pour le déchiffrement des futures commandes du serveur. C’est le seul message qui arrive déchiffré et contient non seulement la clé mais également un tampon envoyé par la backdoor lors de la connexion et chiffré en utilisant la clé reçue. |
7 | Ferme tous les fichiers en cours d’exécution et réinitialise les clés de chiffrement. En fait, il s’agit d’une commande pour clore la connexion. |
8 | Se supprime lui-même de l’autorun et s’arrête. |
9 | Paramètre le champ HostId field dans le fichier de configuration. |
10 | Paramètre le champ group dans le fichier de configuration. |
11 | Envoie une requête HTTP, sauvegarde le fichier reçu dans le dossier /tmp/ et l’exécute. |
12 | Lance un fichier, dont le chemin et les arguments sont reçus du serveur, qui stoppe le fonctionnement de la backdoor. |
13 | Termine une connexion et s’arrête. |
14 | Envoie une requête HTTP et sauvegarde le fichier reçu dans le dossier /tmp/. Le serveur détermine si le fichier sera lancé ou non. |
17 | Envoie une liste de fichiers et dossiers dans un répertoire spécifique (sans ouvrir les dossiers). |
19 | Lance un thread qui vérifiera un dossier en particulier pour que les fichiers correspondent à un masque transféré et les envoie au serveur jusqu’à ce qu’une commande pour arrêter ce thread soit reçue. |
21 | Arrête un thread utilisé pour le téléchargement de fichiers. |
22 | Ouvre un fichier, sauvegarde le handle sous le numéro index et envoie le contenu du fichier sur le serveur. |
23 | Writes to a file, whose handle is under the index number. |
25 | Copie un fichier. |
26 | Exécute un appel système pour un nouveau processus de création et lance ce processus. |
27 | Renomme un fichier. |
28 | Supprime un fichier |
29 | Créé un dossier. |
30 | Supprime un dossier. |
31 | Créé un nouveau dossier ou envoie une liste de fichiers dans un dossier (de manière récursive), en fonction de la valeur des 4 premiers octets. |
33 | Créé une archive zip avec un dossier en particulier. |
35 | Lance un thread utilisé pour exécuter les commandes bash. |
36 | Envoie une commande à un thread utilisé pour exécuter les commandes bash. |
37 | Arrête un thread utilisé pour l’exécution des commandes bash. |
39 | Envoie des données sur un dispositif et le fichier .default.conf. |
41 | Lit des données depuis utmp. |
45 | Tue le processus par son pid. |
46 | Reçoit l’en-tête de la fenêtre courante. |
47 | Ferme une fenêtre spécifiée en lui envoyant un événement comme ClientMessage : _NET_CLOSE_WINDOW. |
48 | Envoie les fichiers autorun depuis le dossier /usr/share/applications/ au serveur. |
50 | Envoie une requête HTTP et sauvegarde le fichier dans le dossier /tmp/. Le serveur détermine si le fichier sera lancé ou non. |
52-53 | Génère l’événement KeyPressed. |
54 | Génère l’événement ButtonRelease. |
56 | Prend une capture d’écran et l’envoie au serveur. |
59 | Envoie une liste de fichiers créés par un keylogger s’il est activé. |
61 | Reçoit la taille du fichier créé par le keylogger. |
62 | Supprime un fichier créé par un keylogger. |
63 | Envoie les contenus d’un fichier créé par un keylogger au serveur. |
67 | Reçoit des données sur des sockets ouverts depuis /proc et les envoie au serveur. |