
For nylig rapporterede Group-IB om aktiviteten af den mobile Android-trojaner Gustuff. Den opererer udelukkende på internationale markeder, og angriber kunder hos 100 af de største udenlandske banker, brugere af 32 mobilkrypto-wallets, samt store e-commerce ressourcer. Udvikleren af Gustuff er en russisktalende cyberkriminel ved navn Bestoffer. For nylig roste han sin trojaner som et 'seriøst produkt for folk med viden og erfaring'.
Specialisten i malware-analyse hos Group-IB Ivan Pisarev i sin undersøgelse detaljeret beskriver, hvordan Gustuff fungerer og hvad dens fare er.
Hvem jagter Gustuff
Gustuff tilhører en ny generation af malware med fuldt automatiserede funktioner. Ifølge udvikleren er trojaneren blevet en ny og forbedret version af malware-programmet AndyBot, som siden november 2017 har angrebet telefoner med Android OS og stjålet penge gennem phishing-webformularer, der udgiver sig for at være mobilapps fra kendte internationale banker og betalingssystemer. Bestoffer har oplyst, at prisen for leje af 'Gustuff Bot' var $800 om måneden.
Analyse af Gustuff-prøven viste, at trojaneren potentielt retter sig mod kunder, der bruger mobilapplikationer fra de største banker, såsom Bank of America, Bank of Scotland, J.P. Morgan, Wells Fargo, Capital One, TD Bank, PNC Bank, samt Bitcoin Wallet, BitPay, Cryptopay, Coinbase og flere.
Oprindeligt skabt som en klassisk banktrojaner, har Gustuff i den nuværende version betydeligt udvidet listen over potentielle angrebsmål. Udover Android-apps til banker, fintech-virksomheder og kryptoservices, retter Gustuff sig også mod brugere af applikationer fra markedspladser, onlinebutikker, betalingssystemer og messengere. Specifikt PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut og andre.
Indgangspunkt: sigter mod massiv infektion
Gustuff er kendetegnet ved en "klassisk" vektor for indtrængen på Android-smartphones gennem SMS-udsendelser med links til APK. Når et Android-enhed bliver inficeret med trojaneren, kan Gustuff gennem serverkommandoer sprede sig til kontaktlisten på den inficerede telefon eller til serverens database. Gustuffs funktionaliteter er designet til masseinfektion og maksimal kapitalisering af sine operatørers forretninger - den indeholder en unik "autoupload"-funktion til legitime mobile bankapplikationer og kryptovaluta-punge, hvilket muliggør en hurtigere og større tyveri af penge.
Undersøgelsen af trojaneren viste, at autoupload-funktionen er implementeret ved hjælp af Accessibility Service - en tjeneste for mennesker med handicap. Gustuff er ikke den første trojaner, der effektivt omgår beskyttelsen mod interaktion med elementer fra andre applikationsvinduer ved hjælp af denne Android-tjeneste. Dog forbliver brugen af Accessibility Service sammen med autoupload relativt sjælden.
Efter download til offrets telefon får Gustuff, ved hjælp af Accessibility Service, mulighed for at interagere med elementer fra vinduerne i andre applikationer (bank-, kryptovaluta- samt online shopping-apps, beskedudveksling mv.), udførende de nødvendige handlinger for angriberen. For eksempel, på serverens kommando kan trojaneren trykke på knapper og ændre værdier i tekstfelterne i bankapplikationer. Brugen af Accessibility Service-mekanismen tillader trojaneren at omgå de beskyttelsesmekanismer, som bankerne anvender for at modvirke mobil-trojanere fra tidligere generationer, samt ændringer i sikkerhedspolitikken, som Google har indført i nye versioner af Android. Så Gustuff "kan" deaktivere beskyttelsen fra Google Protect: ifølge forfatteren aktiveres denne funktion i 70% af tilfældene.

Gustuff kan også vise falske PUSH-notifikationer med ikoner fra legitime mobilapplikationer. Brugeren klikker på PUSH-notifikationen og ser et phishing-vindue, der er indlæst fra serveren, hvor han selv indtaster de anmodede oplysninger om kreditkort eller kryptovaluta. I et andet scenarie åbner Gustuff en app, under hvilket navn PUSH-notifikationen blev vist. I dette tilfælde kan malware via serverens kommando gennem Accessibility Service udfylde felterne i bankappens formular til en svigagtig transaktion.
Gustuff har også funktioner som at sende information om den inficerede enhed til serveren, læse/ sende SMS-beskeder, sende USSD-forespørgsler, starte SOCKS5 Proxy, følge links, sende filer (herunder fotoscanninger af dokumenter, screenshots, billeder) til serveren, og nulstille enheden til fabriksindstillinger.
Analyse af malware
Før installationen af malwareapplikationen viser Android OS en dialogboks til brugeren, der indeholder en liste over de tilladelser, som Gustuff anmoder om:

Installationen af applikationen vil kun finde sted efter at brugeren har givet samtykke. Efter opstart af applikationen vil trojaneren vise brugeren et vindue:

Derefter vil den fjerne sit ikon.
Ifølge forfatteren er Gustuff pakket med en pakker fra FTT. Efter opstart forbindes applikationen periodisk til CnC-serveren for at modtage kommandoer. I flere af de undersøgte filer blev IP-adressen anvendt som kontrolserver 88.99.171[.]105 (herefter vil vi betegne den som <%CnC%>).
Efter opstart begynder programmet at sende meddelelser til serveren http:///api/v1/get.php.
Som svar forventes JSON i følgende format:
{
"results" : "OK",
"command":{
"id": "",
"command":"",
"timestamp":"",
"params":{
},
},
}Ved hver anmodning sender applikationen information om den inficerede enhed. Formatet for meddelelsen er vist nedenfor. Det er værd at bemærke, at felterne full, extra, apps og permission – er valgfrie og vil kun blive sendt i tilfælde af en anmodningskommando fra CnC.
{
"info":
{
"info":
{
"cell":,
"country":,
"imei":,
"number":,
"line1Number":,
"advertisementId":
},
"state":
{
"admin":,
"source":,
"needPermissions":,
"accesByName":,
"accesByService":,
"safetyNet":,
"defaultSmsApp":,
"isDefaultSmsApp":,
"dateTime":,
"batteryLevel":
},
"socks":
{
"id":,
"enabled":,
"active":
},
"version":
{
"versionName":,
"versionCode":,
"lastUpdateTime":,
"tag":,
"targetSdkVersion":,
"buildConfigTimestamp":1541309066721
},
},
"full":
{
"model":,
"localeCountry":,
"localeLang":,
"accounts":,
"lockType":
},
"extra":
{
"serial":,
"board":,
"brand":,
"user":,
"device":,
"display":,
"id":,
"manufacturer":,
"model":,
"product":,
"tags":,
"type":,
"imei":,
"imsi":,
"line1number":,
"iccid":,
"mcc":,
"mnc":,
"cellid":,
"lac":,
"androidid":,
"ssid":
},
"apps":{},
"permission":
} Opbevaring af konfigurationsdata
Gustuff gemmer vigtig information i en preference-fil. Filnavnet samt parameternavne i den er resultatet af MD5-hash af strengen 15413090667214.6.1, hvor <%name%> — den oprindelige navn-værdi. Python-funktion til at generere navnet:
nameGenerator(input):
output = md5("15413090667214.6.1" + input) Fremover betegner vi som nameGenerator(input).
Således er navnet på den første fil: nameGenerator(«API_SERVER_LIST»), den indeholder værdier med følgende navne:
| Variabelnavn | Værdi |
|---|---|
| nameGenerator(«API_SERVER_LIST») | Indeholder en liste over CnC-adresser som et array. |
| nameGenerator(«API_SERVER_URL») | Indeholder CnC-adressen. |
| nameGenerator(«SMS_UPLOAD») | Standardflaget er indstillet. Hvis flaget er indstillet – sender SMS-beskeder til CnC. |
| nameGenerator(«SMS_ROOT_NUMBER») | Telefonnummeren, som SMS-beskederne vil blive sendt til fra det inficerede apparat. Som standard null. |
| nameGenerator(«SMS_ROOT_NUMBER_RESEND») | Standardflaget er nulstillet. Hvis det er aktiveret, når et inficeret apparat modtager et SMS, sendes det til root-nummeret. |
| nameGenerator(«DEFAULT_APP_SMS») | Standardflaget er nulstillet. Hvis dette flag er aktiveret, vil appen behandle indgående SMS-beskeder. |
| nameGenerator(«DEFAULT_ADMIN») | Standardflaget er nulstillet. Hvis flaget er aktiveret, har appen administratorrettigheder. |
| nameGenerator(«DEFAULT_ACCESSIBILITY») | Standardflaget er nulstillet. Hvis flaget er aktiveret, kører en service, der bruger Accessibility Service. |
| nameGenerator(«APPS_CONFIG») | JSON-objekt, der indeholder en liste over handlinger, der skal udføres, når en Accessibility-begivenhed relateret til en bestemt app udløses. |
| nameGenerator(«APPS_INSTALLED») | Opbevarer en liste over installerede apps på apparatet. |
| nameGenerator(«IS_FIST_RUN») | Flaget nulstilles ved første opstart. |
| nameGenerator(«UNIQUE_ID») | Indeholder en unik identifikator. Genereres ved første opstart af botten. |
Modul til behandling af kommandoer fra serveren
Appen gemmer adresserne på CnC-servere som et array af koded Base85 strenge. Listen over CnC - servere kan ændres ved modtagelse af den relevante kommando, i så fald vil adresserne blive gemt i preferens-filen.
Som svar på anmodningen sender serveren en kommando til appen. Det er værd at bemærke, at kommandoer og parametre er præsenteret i JSON-format. Appen kan behandle følgende kommandoer:
| Kommandoen | Description |
|---|---|
| forwardStart | Begynd at sende de modtagne SMS-beskeder fra det inficerede apparat til CnC-serveren. |
| forwardStop | Stop sending the received SMS messages from the infected device to the CnC server. |
| ussdRun | Udfør en USSD-forespørgsel. Nummeret, som USSD-forespørgslen skal foretages til, findes i JSON-feltet «number». |
| sendSms | Send en SMS-besked (hvis nødvendigt opdeles beskeden i dele). Som parameter modtager kommandoen et JSON-objekt, der indeholder felterne «to» - destinationsnummeret og «body» - beskedens indhold. |
| sendSmsAb | Send SMS-beskeder (hvis nødvendigt opdeles beskeden i dele) til alle på listen over kontakter på det inficerede apparat. Intervallet mellem sendingerne er 10 sekunder. Beskedens indhold findes i JSON-feltet «body». |
| sendSmsMass | Send SMS messages (if necessary, the message is "broken" into parts) to the contacts specified in the command parameters. The interval between messages is 10 seconds. The command accepts a JSON array (field "sms") as a parameter, with elements containing the fields "to" — destination number and "body" — message body. |
| changeServer | This command can accept a parameter with the key "url" — then the bot will change the value of nameGenerator("SERVER_URL"), or "array" — then the bot will write the array to nameGenerator("API_SERVER_LIST"). Thus, the application changes the address of CnC servers. |
| adminNumber | The command is intended for working with the root number. The command accepts a JSON object with the following parameters: "number" — change nameGenerator("ROOT_NUMBER") to the received value, "resend" — change nameGenerator("SMS_ROOT_NUMBER_RESEND"), "sendId" — send uniqueID to nameGenerator("ROOT_NUMBER"). |
| updateInfo | Send information about the infected device to the server. |
| wipeData | The command is designed to delete user data. Depending on which name the application was started under, it either completely wipes data with device reboot (primary user) or only deletes user data (secondary user). |
| socksStart | Start the Proxy module. The module's operation is described in a separate section. |
| socksStop | Stop the Proxy module. |
| openLink | Follow the link. The link is found in the JSON parameter under the key "url". The link is opened using "android.intent.action.VIEW". |
| uploadAllSms | Send all SMS messages received by the device to the server. |
| uploadAllPhotos | Send a photo URL from the infected device. The URL comes as a parameter. |
| uploadFile | Send a file URL from the infected device. The URL comes as a parameter. |
| uploadPhoneNumbers | Send phone numbers from the contacts list to the server. If a JSON object with the key "ab" is received as a parameter, the application retrieves the contact list from the phonebook. If a JSON object with the key "sms" is received as a parameter, the application reads the contact list from SMS senders. |
| changeArchive | Applikationen downloader en fil fra den adresse, der kommer som parameter via nøgle "url". Den downloadede fil gemmes som "archive.zip". Derefter udpakkes filen, om nødvendigt med brug af adgangskoden til arkivet "b5jXh37gxgHBrZhQ4j3D". De udpakkede filer gemmes i mappen [external storage]/hgps. I denne mappe gemmer applikationen web-fakes (beskrevet nedenfor). |
| handlinger | Denne kommando er designet til at arbejde med Action Service, som er beskrevet i et separat afsnit. |
| test | Gør ingenting. |
| download | Denne kommando er designet til at downloade en fil fra en fjernserver og gemme den i mappen "Downloads". URL og filnavn kommer som parametre, felterne i JSON-objektet er henholdsvis: "url" og "fileName". |
| remove | Fjerner en fil fra mappen "Downloads". Filnavnet kommer i JSON-parameteren med nøglen "fileName". Standard filnavn er "tmp.apk". |
| notification | Vis en meddelelse med beskrivelser og titler, der defineres af kontrolserveren. |
Kommandoformat notification:
{
"results" : "OK",
"command":{
"id": ,
"command":"notification",
"timestamp":,
"params":{
"openApp":,
"array":[
{"title":,
"desc":,
"app":}
]
},
},
}Meddelelsen, der genereres af den undersøgte fil, ser identisk ud med de meddelelser, der genereres af applikationen angivet i feltet app. Hvis værdien i feltet openApp — True, når meddelelsen åbnes, starter applikationen angivet i feltet app. Hvis værdien i feltet openApp — False, så:
- åbnes et phishingvindue, hvis indhold hentes fra mappen /hgps/
- åbnes et phishingvindue, hvis indhold hentes fra serveren ?id=&app=
- åbnes et phishingvindue, der er maskerede som Google Play Card, med mulighed for at indtaste kortoplysninger.
Resultatet af udførelsen af enhver kommando sendes til set_state.php i form af et JSON-objekt af følgende format:
{
"command":
{
"command":,
"id":,
"state":
}
"id":
} ActionsService
Listen over kommandoer, som applikationen håndterer, omfatter action. Ved modtagelse af en kommando kontakter kommandobehandlingsmodulet denne service for at udføre en udvidet kommando. Som parameter modtager servicen et JSON-objekt. Servicen kan udføre følgende kommandoer:
1. PARAMS_ACTION — når denne kommando modtages, får tjenesten først værdien af nøgleparameteren Type fra JSON, som kan være følgende:
- serviceInfo – underkommandoen får værdien af nøgleparameteren fra JSON includeNotImportant. Hvis flaget er lig med True, indstiller applikationen flaget FLAG_ISOLATED_PROCESS til tjenesten, der bruger Accessibility Service. Dermed vil tjenesten blive startet i en separat proces.
- root — få og sende information om det vindue, der i øjeblikket har fokus, til serveren. Applikationen får informationen ved hjælp af klassen AccessibilityNodeInfo.
- admin — anmode om administratorrettigheder.
- delay — pause ActionsService i det antal millisekunder, der er angivet i parameteren ved nøgle "data".
- windows — sende listen over synlige vinduer til brugeren.
- installation — installere applikationen på det inficerede device. Navnet på pakken findes i nøgle "fileName". Selve arkivet findes i mappen Downloads.
- global – underkommandoen er beregnet til at skifte fra det aktuelt aktive vindue:
- til menuen Hurtige indstillinger
- tilbage
- hjem
- til meddelelser
- til vinduet med nyligt åbnede applikationer
- launch — starte applikationen. Navnet på applikationen kommer som parameter ved nøgle data.
- sounds — ændre lydtilstanden til stilhed.
- unlock — tænder skærmens og tastaturets bagbelysning på fuld lysstyrke. Applikationen udfører denne handling ved hjælp af WakeLock og angiver strengen [Application lable]:INFO som tag.
- permissionOverlay — funktionen er ikke implementeret (svaret på kommandoens udførelse er {"message":"Not support"} eller {"message":"low sdk"})
- gesture — funktionen er ikke implementeret (svaret på kommandoens udførelse er {"message":"Not support"} eller {"message":"Low API"})
- permissions — denne kommando er nødvendig for at anmode om rettigheder til applikationen. Dog er funktionen til at anmode ikke implementeret, så kommandoen giver ikke mening. Listen over anmodede rettigheder kommer som et JSON-array med nøgle "permissions." Standardlisten:
- 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 — vise et phishing-vindue. Afhængigt af parameteren sendt fra serveren kan applikationen vise følgende phishing-vinduer:
- Vis phishing-vindue, hvis indhold er beskrevet i filen i mappen /hgps/Resultatet af brugerens interaktion med vinduet vil blive sendt til adressen /records.php
- Vis phishing-vinduet, hvis indhold indlæses fra adressen ?id=&app=Resultatet af brugerens interaktion med vinduet vil blive sendt til adressen /records.php
- Vis phishing-vinduet, der er maskeret som Google Play Card.
- interaktiv — kommandoen er beregnet til interaktion med vinduelementer i andre applikationer ved hjælp af AccessibilityService. Der er implementeret en særlig service til interaktion i programmet. Den undersøgte applikation kan interagere med vinduer:
- Aktiv på det nuværende tidspunkt. I så fald indeholder parameteren id eller tekst (navnet) på objektet, som skal interageres med.
- Synlige for brugeren på tidspunktet for udførelsen af kommandoen. Applikationen vælger vinduer efter id.
Efter at have fået objekterne AccessibilityNodeInfo for de relevante vindueselementer, kan applikationen, afhængigt af parametrene, udføre handlinger:
- focus — sætte fokus på objektet.
- click — klikke på objektet.
- actionId — udføre handling efter ID.
- setText — ændre teksten på objektet. Ændring af tekst kan ske på to måder: ved at udføre handlingen ACTION_SET_TEXT (hvis versionen af Android på den inficerede enhed er lig med eller lavere end LOLLIPOP), eller ved at placere en streng i udklipsholderen og indsætte den i objektet (for versioner der er nyere). Denne kommando kan bruges til at ændre data i bankapplikationen.
2. PARAMS_ACTIONS — det samme som PARAMS_ACTION, kun det kommer som et JSON-array af kommandoer.
Det ser ud til, at mange vil være interesserede i, hvordan funktionen til interaktion med elementer fra et andet applikationsvindue ser ud. Sådan er denne funktionalitet implementeret i 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));
}Funktion til at erstatte tekst:
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); // ACTION_SET_TEXT
}
else {
Object clipboard = context.getSystemService("clipboard");
if(clipboard != null) {
((ClipboardManager)clipboard).setPrimaryClip(ClipData.newPlainText("autofill_pm", ((CharSequence)text)));
result = ani.performAction(0x8000); // ACTION_PASTE
}
else {
result = false;
}
}
return result;
}Således, med den rigtige konfiguration kan controllervirksomheden Gustuff udfylde tekstfelter i bankapplikationen og trykke på de nødvendige knapper for at gennemføre transaktionen. Trojansk hest behøver faktisk ikke at logge ind i applikationen — det er tilstrækkeligt at sende en kommando til at demonstrere PUSH-notifikationer, hvorefter den tidligere installerede bankapplikation åbnes. Brugeren vil selv logge ind, hvorefter Gustuff kan udføre automatisk indsendelse.
Modul til behandling af SMS-beskeder
Applikationen registrerer en hændelsesbehandler til modtagelse af SMS-beskeder på den inficerede enhed. Den undersøgte applikation kan modtage kommandoer fra operatøren, der kommer i teksten til SMS-beskeden. Kommandoerne modtages i formatet:
7!5=
Applikationen søger i alle indkommende SMS-beskeder efter strengen 7!5=, når en streng opdages – dekoder den en Base64-streng med en forskydning på 4 og udfører kommandoen. Kommandoerne ligner dem fra CnC. Resultatet af udførelsen sendes til det samme nummer, som kommandoen kom fra. Format for svar:
7*5=
Valgfrit kan applikationen sende alle modtagne beskeder til Root-nummeret. For dette skal Root-nummeret angives i preference-filen, og flaget for videresendelse af beskeder skal være aktiveret. SMS-beskeden sendes til angriberens nummer i formatet:
—
Applikationen kan også valgfrit sende beskeder til CnC. SMS-beskeden sendes til serveren i JSON-format:
{
"id":,
"sms":
{
"text":,
"number":,
"date":
}
}Hvis flaget er aktiveret nameGenerator(«DEFAULT_APP_SMS») – stopper applikationen behandlingen af SMS-beskeden og rydder op i listen over indkommende beskeder.
Proxy-modul
I den undersøgte applikation er der en Backconnect Proxy-modul (herefter Proxy-modul), som har en separat klasse, der indeholder statiske felter med konfigurationen. Konfigurationsdataene gemmes i et sample i åbent format:

Alle handlinger, der udføres af Proxy-modulet, logges i filer. For dette opretter applikationen i External Storage et bibliotek kaldet «logs» (feltet ProxyConfigClass.logsDir i konfigurationsklassen), hvor logfilerne opbevares. Logningen sker i filer med navnene:
- main.txt – i denne fil logges arbejdet af klassen med navnet CommandServer. Fremover vil logningen af strengen str i denne fil blive betegnet som mainLog(str).
- session-.txt – i denne fil gemmes logdata, der er relateret til en bestemt proxy-session. Fremover vil logningen af strengen str i denne fil blive betegnet som sessionLog (str).
- server.txt – i denne fil logges alle data, der skrives i de ovenfor nævnte filer.
Format for logdata:
[Thread[], id[]]: log-string
Undtagelser, der opstår under arbejdet med Proxy-modulet, logges også i filen. For dette danner applikationen et JSON-objekt i formatet:
{
"uncaughtException":
"thread":
"message":
"trace": //Stack trace info
[
{
"ClassName":
"FileName":
"LineNumber":
"MethodName":
},
{
"ClassName":
"FileName":
"LineNumber":
"MethodName":
}
]
}Derefter konverteres det til en strengrepræsentation og logges.
Start af Proxy-modulet sker efter modtagelse af den relevante kommando. Ved modtagelse af kommandoen til at starte Proxy-modulet, starter applikationen tjenesten med navnet MainService, som er ansvarlig for at styre driften af Proxy-modulet - dets start og stop.
Faser ved opstart af tjenesten:
1. Starter en timer, der aktiveres hvert minut og kontrollerer aktiviteten i Proxy-modulet. Hvis modulet ikke er aktivt, starter det det.
Desuden, når hændelsen android.net.conn.CONNECTIVITY_CHANGE udløses, startes Proxy-modulet.
2. Applikationen opretter en wake-lock med parameteren PARTIAL_WAKE_LOCK og tager fat i den. På den måde forhindrer den CPU'en i at gå i dvale.
3. Starter klassen til behandling af kommandoer til Proxy-modulet, efter først at have logget strengen mainLog("start server") og
Server::start() host[], commandPort[], proxyPort[]
hvor proxy_cnc, command_port og proxy_port er parametre hentet fra Proxy-serverens konfiguration.
Klassen til behandling af kommandoer hedder CommandConnection. Lige efter opstart udfører den følgende handlinger:
4. Opretter forbindelse til ProxyConfigClass.host: ProxyConfigClass.commandPort og sender data om den inficerede enhed i JSON-format:
{
"id":,
"imei":,
"imsi":,
"model":,
"manufacturer":,
"androidVersion":,
"country":,
"partnerId":,
"packageName":,
"networkType":,
"hasGsmSupport":,
"simReady":,
"simCountry":,
"networkOperator":,
"simOperator":,
"version":
}Hvor:
- id – identifikatoren, forsøger at hente værdien med feltet "id" fra Shared Preference-fil med navnet "x". Hvis denne værdi ikke kan hentes, genereres en ny. Således har Proxy-modulet sin egen identifikator, der genereres på samme måde som Bot ID.
- imei – IMEI for enheden. Hvis der opstår en fejl under hentningen af værdien, vil en tekstbesked om fejlen blive indsat i stedet for dette felt.
- imsi — International Mobile Subscriber Identity for enheden. Hvis der opstod en fejl under hentning af værdien, vil der i stedet for dette felt blive indtastet en fejlsmeddelelse.
- model — Det navn, som brugeren kan se for det endelige produkt.
- manufacturer — Producenten af produktet/hardware (Build.MANUFACTURER).
- androidVersion — strengen i formatet " (),"
- country — den nuværende placering af enheden.
- partnerId – tom streng.
- packageName – pakkenavn.
- networkType — typen af den aktuelle netværksforbindelse (for eksempel: "WIFI", "MOBILE"). Ved fejl returneres null.
- hasGsmSupport – true – hvis telefonen understøtter GSM, ellers false.
- simReady – tilstanden for SIM-kortet.
- simCountry — ISO-koden for landet (baseret på SIM-kortudbyderen).
- networkOperator — navnet på udbyderen. Hvis der opstod en fejl under hentning af værdien, vil der i stedet for dette felt blive indtastet en fejlsmeddelelse.
- simOperator — Service Provider Name (SPN). Hvis der opstod en fejl under hentning af værdien, vil der i stedet for dette felt blive indtastet en fejlsmeddelelse.
- version — dette felt opbevares i konfigurationsklassen, for de undersøgte versioner af botten var det lig med "1.6".
5. Skifter til ventetilstand for kommandoer fra serveren. Kommandoer fra serveren modtages i formatet:
- 0 offset – kommando
- 1 offset – sessionId
- 2 offset – længde
- 4 offset — data
Ved modtagelse af kommando registrerer applikationen:
mainLog("Header { sessionId, type[], length[] }")
Følgende kommandoer fra serveren kan være mulige:
| Navn | Command | Data | Beskrivelse |
|---|---|---|---|
| connectionId | 0 | Connection ID | Opret en ny forbindelse |
| SLEEP | 3 | Tid | Suspendere Proxy-modulets drift |
| PING_PONG | 4 | — | Send PONG-besked |
PONG-beskeden består af 4 bytes og ser således ud: 0x04000000.
Ved modtagelse af kommandoen connectionId (for oprettelse af en ny forbindelse) CommandConnection opretter en instans af klassen ProxyConnection.
- To klasser deltager i proxyeringen: ProxyConnection og end. Ved oprettelse af klassen ProxyConnection etableres der forbindelse til adressen ProxyConfigClass.host: ProxyConfigClass.proxyPort og overføres et JSON-objekt:
{
"id":
}I svaret sender serveren et SOCKS5-besked, der indeholder adressen på den eksterne server, som der skal etableres forbindelse til. Interaktionen med denne server sker via klassen end. Skematisk kan oprettelsen af forbindelsen repræsenteres som følger:

Netværksinteraktioner
For preventing traffic analysis by network sniffers, the interaction between the CnC server and the application can be protected using the SSL protocol. All transmitted data, both to and from the server, is presented in JSON format. The application performs the following requests during its operation:
- http:///api/v1/set_state.php — the result of the command execution.
- http:///api/v1/get.php — retrieving the command.
- http:///api/v1/load_sms.php — unloading SMS messages from the infected device.
- http:///api/v1/load_ab.php — unloading the contact list from the infected device.
- http:///api/v1/aevents.php – the request is made when updating parameters in the preference file.
- http:///api/v1/set_card.php — unloading data obtained through a phishing window masquerading as the Google Play Market.
- http:///api/v1/logs.php – unloading log data.
- http:///api/v1/records.php – unloading data obtained via phishing windows.
- http:///api/v1/set_error.php – notification of an occurred error.
Anbefalinger
To protect their clients from the threat of mobile Trojans, companies must implement comprehensive solutions that enable monitoring and warning of malicious activity without requiring additional software installation on user devices.
To do this, signature detection methods for mobile Trojans need to be enhanced with behavioral analysis technologies for both the client and the application itself. Additionally, protection should include device identification using digital fingerprinting technology, which helps to understand when an account is being accessed from an atypical device and may have fallen into the hands of fraudsters.
A crucial point is the availability of cross-channel analysis, allowing companies to control risks arising on both the internet and mobile channels, for example, in mobile banking applications, for cryptocurrency transactions, and any others where financial transactions may occur.
Security rules for users:
- do not install mobile device applications with the Android OS from any sources other than Google Play, pay special attention to the permissions requested by the application;
- regularly install updates for the Android OS;
- være opmærksom på filudvidelserne af de uploaderede filer;
- undgå at besøge mistænkelige ressourcer;
- undgå at klikke på links modtaget i SMS-beskeder.
Ved deltagelse Semena Rogacheva, junior specialist i malware forskning ved Group-IB's Computer Forensics Laboratory.
Kilde: habr.com
