Wéi den Android Trojanesche Gustuff d'Crème (Fiat a Krypto) vun Äre Konten schmaacht

Wéi den Android Trojanesche Gustuff d'Crème (Fiat a Krypto) vun Äre Konten schmaacht

Just den aneren Dag Group-IB informéiert iwwer d'Aktivitéit vum mobilen Android Trojan Gustuff. Et funktionnéiert exklusiv op internationale Mäert, attackéiert Cliente vun den 100 gréissten auslännesche Banken, Benotzer vu mobilen 32 Krypto Portemonnaien, wéi och grouss E-Commerce Ressourcen. Awer den Entwéckler vu Gustuff ass e russeschsproochege Cyberkriminell ënner dem Spëtznumm Bestoffer. Bis viru kuerzem huet hien säin Trojaner als "e seriöse Produkt fir Leit mat Wëssen an Erfarung gelueft."

Béiswëlleg Code Analyse Spezialist bei Group-IB Ivan Pisarev a senger Fuerschung schwätzt hien am Detail iwwer wéi de Gustuff funktionnéiert a wat seng Gefore sinn.

Wien ass de Gustuff op d'Juegd?

Gustuff gehéiert zu enger neier Generatioun vu Malware mat voll automatiséierte Funktiounen. Laut dem Entwéckler ass den Trojaner eng nei a verbessert Versioun vun der AndyBot Malware ginn, déi zanter November 2017 Android Telefone attackéiert a Suen duerch Phishing Webformen geklaut hunn, déi sech als mobil Applikatioune vu bekannten internationale Banken a Bezuelsystemer vermëschen. De Bestoffer huet gemellt datt de Gustuff Bot Locatiounspräis $ 800 pro Mount war.

D'Analyse vun der Gustuff Probe huet gewisen datt den Trojaner potenziell Cliente zielt mat mobilen Uwendungen vun de gréisste Banken, wéi Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, souwéi Krypto Portemonnaien. Bitcoin Portemonnaie, BitPay, Cryptopay, Coinbase, etc.

Ursprénglech als klassesche Banken Trojaner erstallt, an der aktueller Versioun huet Gustuff d'Lëscht vu potenziellen Ziler fir Attack wesentlech erweidert. Nieft Android Uwendungen fir Banken, Fintech Firmen a Krypto-Servicer riicht sech Gustuff u Benotzer vu Maartplazapplikatiounen, Online Geschäfter, Bezuelsystemer an Instant Messenger. Besonnesch PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut an anerer.

Entrée Punkt: Berechnung fir Mass Infektioun

Gustuff ass charakteriséiert duerch de "klassesche" Vektor vun der Pénétratioun an Android Smartphones duerch SMS Mailings mat Linken op APKs. Wann en Android-Apparat mat engem Trojaner op Kommando vum Server infizéiert ass, kann de Gustuff weider duerch d'Kontaktdatenbank vum infizéierte Telefon oder duerch d'Server-Datebank verbreet ginn. D'Funktionalitéit vum Gustuff ass fir d'Massinfektioun an d'maximal Kapitaliséierung vum Geschäft vu senge Betreiber entworf - et huet eng eenzegaarteg "Auto-Laden" Funktioun an legitime mobil Bankapplikatiounen a Krypto Portemonnaie, wat Iech erlaabt den Déifstall vu Suen ze beschleunegen an ze skaléieren.

Eng Etude vum Trojanesche weist datt d'Autofill-Funktioun dran ëmgesat gouf mam Accessibility Service, e Service fir Leit mat enger Behënnerung. Gustuff ass net deen éischten Trojaner deen erfollegräich de Schutz géint Interaktioun mat Fënsterelementer vun aneren Uwendungen ëmgoe mat dësem Android Service. Wéi och ëmmer, d'Benotzung vum Accessibility Service a Kombinatioun mat engem Autosfiller ass nach ëmmer zimlech seelen.

Nom Download op den Telefon vum Affer, Gustuff, mam Accessibilitéitsservice benotzt, ass fäeg mat Fënsterelementer vun aneren Uwendungen (Banken, Krypto-Währungen, souwéi Uwendungen fir Online Shopping, Messagerie, etc.) ze interagéieren, déi néideg Aktiounen auszeféieren fir den Ugräifer. . Zum Beispill, um Kommando vum Server, kann en Trojaner Knäppercher drécken an d'Wäerter vun Textfelder an Bankapplikatiounen änneren. D'Benotzung vum Accessibility Service Mechanismus erlaabt den Trojaner d'Sécherheetsmechanismen ze ëmgoen, déi vu Banken benotzt gi fir mobil Trojaner vun der viregter Generatioun z'entgoen, souwéi Ännerungen an der Sécherheetspolitik, déi vu Google an nei Versioune vum Android OS ëmgesat goufen. Also, Gustuff "wësst wéi" de Google Protect Schutz auszeschalten: laut dem Auteur funktionnéiert dës Funktioun a 70% vun de Fäll.

Wéi den Android Trojanesche Gustuff d'Crème (Fiat a Krypto) vun Äre Konten schmaacht

Gustuff kann och gefälschte PUSH Notifikatiounen mat Ikonen vu legitimen mobilen Uwendungen weisen. De Benotzer klickt op d'PUSH Notifikatioun a gesäit eng Phishing-Fënster déi vum Server erofgeluede gëtt, wou hien déi ugefrote Bankkaart oder Krypto Portemonnaie Donnéeën aginn. An engem anere Gustuff Szenario gëtt d'Applikatioun op Numm vun där d'PUSH Notifikatioun ugewisen gouf opgemaach. An dësem Fall kann d'Malware, op Kommando vum Server iwwer den Accessibility Service, d'Formfelder vun enger Bankapplikatioun fir eng betrügeresch Transaktioun ausfëllen.

D'Funktionalitéit vum Gustuff enthält och d'Informatioun iwwer en infizéierten Apparat op de Server ze schécken, d'Fäegkeet SMS Messagen ze liesen / ze schécken, USSD Ufroen ze schécken, SOCKS5 Proxy lancéieren, e Link verfollegen, Dateien (och Fotoscannen vun Dokumenter, Screenshots, Fotoen) un de Server , den Apparat op d'Fabrécksastellungen zrécksetzen.

Malware Analyse

Ier Dir eng béiswëlleg Applikatioun installéiert, weist d'Android OS dem Benotzer eng Fënster mat enger Lëscht vu Rechter, déi vum Gustuff ugefrot sinn:

Wéi den Android Trojanesche Gustuff d'Crème (Fiat a Krypto) vun Äre Konten schmaacht
D'Applikatioun gëtt installéiert nëmmen no der Zoustëmmung vum Benotzer. Nom Start vun der Applikatioun weist den Trojaner dem Benotzer eng Fënster:

Wéi den Android Trojanesche Gustuff d'Crème (Fiat a Krypto) vun Äre Konten schmaacht
Duerno wäert et seng Ikon ewechhuelen.

Gustuff gëtt, laut dem Auteur, vun engem Packer vun der FTT gepackt. Nom Startup kontaktéiert d'Applikatioun periodesch den CnC Server fir Kommandoen ze kréien. Verschidde Dateien, déi mir iwwerpréift hunn, hunn eng IP Adress als Kontrollserver benotzt 88.99.171[.]105 (nodréiglech wäerte mir et als <%CnC%>).

Nom Start, fänkt de Programm Messagen un de Server ze schécken http://<%CnC%>/api/v1/get.php.

D'Äntwert gëtt erwaart JSON am folgende Format ze sinn:

{
    "results" : "OK",
    "command":{
        "id": "<%id%>",
        "command":"<%command%>",
        "timestamp":"<%Server Timestamp%>",
        "params":{
		<%Command parameters as JSON%>
        },
    },
}

All Kéier wann d'Applikatioun Zougang gëtt, schéckt se Informatioun iwwer dat infizéiert Apparat. De Message Format gëtt ënnendrënner gewisen. Et ass derwäert opgeschriwwen, datt d'Felder voll, extra, Apps и erlaabt - fakultativ a gëtt nëmmen am Fall vun engem Ufro Kommando aus CnC geschéckt.

{
    "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%>
} 

Konfiguratiounsdaten späicheren

Gustuff späichert operationell wichteg Informatioun an enger Preferenzdatei. Den Dateinumm, wéi och d'Nimm vun de Parameteren dran, sinn d'Resultat vun der Berechnung vun der MD5 Zomm aus der String 15413090667214.6.1<%name%>wou <%name%> - initial Numm-Wäert. Python Interpretatioun vun der Numm Generatioun Funktioun:

 nameGenerator(input):
    output = md5("15413090667214.6.1" + input) 

An deem folgenden wäerte mir et als nameGenerator (Input).
Also den éischte Dateinumm ass: nameGenerator("API_SERVER_LIST"), et enthält Wäerter mat de folgenden Nimm:

Variabel Numm Wäert
nameGenerator("API_SERVER_LIST") Enthält eng Lëscht vun CnC Adressen a Form vun engem Array.
nameGenerator("API_SERVER_URL") Enthält d'CnC Adress.
nameGenerator("SMS_UPLOAD") De Fändel ass standardiséiert. Wann de Fändel gesat ass, schéckt SMSen op CnC.
nameGenerator("SMS_ROOT_NUMBER") D'Telefonsnummer, op déi d'SMS-Messagen, déi vum infizéierten Apparat kritt goufen, geschéckt ginn. Default ass null.
nameGenerator("SMS_ROOT_NUMBER_RESEND") De Fändel gëtt par défaut geläscht. Wann installéiert, wann en infizéierte Apparat eng SMS kritt, gëtt se op d'Rootnummer geschéckt.
nameGenerator("DEFAULT_APP_SMS") De Fändel gëtt par défaut geläscht. Wann dëse Fändel agestallt ass, veraarbecht d'Applikatioun erakommen SMS Messagen.
nameGenerator("DEFAULT_ADMIN") De Fändel gëtt par défaut geläscht. Wann de Fändel gesat ass, huet d'Applikatioun Administrator Rechter.
nameGenerator("DEFAULT_ACCESSIBILITY") De Fändel gëtt par défaut geläscht. Wann de Fändel gesat ass, leeft e Service deen den Accessibility Service benotzt.
nameGenerator("APPS_CONFIG") En JSON-Objet deen eng Lëscht vun Aktiounen enthält, déi musse gemaach ginn, wann en Accessibilitéitsevenement mat enger spezifescher Applikatioun ausgeléist gëtt.
nameGenerator("APPS_INSTALLED") Späichert eng Lëscht vun Uwendungen déi um Apparat installéiert sinn.
nameGenerator("IS_FIST_RUN") De Fändel gëtt um éischte Start zréckgesat.
nameGenerator("UNIQUE_ID") Enthält en eenzegaartegen Identifizéierer. Generéiert wann de Bot fir d'éischte Kéier lancéiert gëtt.

Modul fir Befehle vum Server ze veraarbecht

D'Applikatioun späichert d'Adressen vun CnC Serveren a Form vun engem Array kodéiert vun Basis 85 Linnen. D'Lëscht vun de CnC-Server kann nom Empfang vum passenden Kommando geännert ginn, an deem Fall d'Adressen an enger Präferenzdatei gespäichert ginn.

Als Äntwert op d'Ufro schéckt de Server e Kommando un d'Applikatioun. Et ass derwäert ze notéieren datt Kommandoen a Parameteren am JSON Format presentéiert ginn. D'Applikatioun kann déi folgend Kommandoen veraarbecht:

Equipe Beschreiwung
fortStart Fänkt un d'SMS-Messagen ze schécken, déi vum infizéierten Apparat op den CnC-Server kritt goufen.
fortstoppen Stop schéckt SMS Messagen, déi vum infizéierten Apparat op den CnC Server empfaange ginn.
ussdRun Ausféieren USSD Ufro. D'Nummer op déi Dir eng USSD Ufro maache musst ass am JSON Feld "Nummer".
schéckenSms Schéckt eng SMS (wann néideg, ass de Message "opgedeelt" an Deeler). Als Parameter hëlt de Kommando en JSON Objet mat de Felder "zu" - d'Zielnummer an "Kierper" - de Kierper vum Message.
sendSmsAb Schéckt SMS Messagen (wann néideg, ass de Message "opgedeelt" an Deeler) un jiddereen an der Kontakt Lëscht vun der infizéiert Apparat. Den Intervall tëscht de Messagen ass 10 Sekonnen. De Kierper vun der Noriicht ass am JSON Feld "Kierper"
sendSmsMass Schéckt SMS Messagen (wann néideg ass de Message "opgedeelt" an Deeler) un d'Kontakter, déi an de Kommandoparameter spezifizéiert sinn. Den Intervall tëscht de Messagen ass 10 Sekonnen. Als Parameter hëlt de Kommando e JSON-Array (de "Sms" Feld), d'Elementer vun deenen d'Felder "zu" enthalen - d'Zielnummer an "Kierper" - de Kierper vum Message.
changeServer Dëse Kommando kann e Wäert mam Schlëssel "URL" als Parameter huelen - da wäert de Bot de Wäert vum nameGenerator ("SERVER_URL") oder "Array" änneren - da schreift de Bot d'Array op nameGenerator ("API_SERVER_LIST") Also ännert d'Applikatioun d'Adress vun den CnC Serveren.
Admin Nummer De Kommando ass entwéckelt fir mat enger Rootnummer ze schaffen. De Kommando akzeptéiert e JSON-Objet mat de folgende Parameteren: "Nummer" - ännert den NummGenerator ("ROOT_NUMBER") op den erhalene Wäert, "nidderschéckt" - ännert den NummGenerator ("SMS_ROOT_NUMBER_RESEND"), "sendId" - schéckt op den NummGenerator ("ROOT_NUMBER" ) eenzegaarteg ID.
updateInfo Schéckt Informatioun iwwer den infizéierten Apparat op de Server.
wipeData De Kommando soll Benotzerdaten läschen. Ofhängeg vu wéi engem Numm d'Applikatioun gestart gouf, ginn entweder d'Donnéeën komplett geläscht mat engem Gerät Neistart (primär Benotzer), oder nëmmen Benotzerdaten ginn geläscht (sekundär Benotzer).
socksStart Start de Proxy Modul. D'Operatioun vum Modul gëtt an enger separater Rubrik beschriwwen.
socksStop Stop de Proxy Modul.
openLink Follegt de Link. De Link ass am JSON Parameter ënner dem "URL" Schlëssel. "android.intent.action.VIEW" gëtt benotzt fir de Link opzemaachen.
uploadAllSms Schéckt all SMS Messagen, déi vum Apparat op de Server kritt goufen.
uploadAllPhotos Schéckt Biller vun engem infizéierten Apparat op eng URL. D'URL kënnt als Parameter.
eropluede Datei Schéckt eng Datei op eng URL vun engem infizéierten Apparat. D'URL kënnt als Parameter.
eropluede Telefonnummeren Schéckt Telefonsnummeren aus Ärer Kontaktlëscht op de Server. Wann e JSON Objektwäert mam Schlëssel "ab" als Parameter kritt gëtt, kritt d'Applikatioun eng Lëscht vu Kontakter aus dem Telefonsbuch. Wann e JSON-Objet mam Schlëssel "Sms" als Parameter kritt gëtt, liest d'Applikatioun d'Lëscht vun de Kontakter vun de Sender vun SMSen.
änneren Archiv D'Applikatioun luet d'Datei vun der Adress erof déi als Parameter kënnt mam "URL" Schlëssel. Déi erofgeluede Datei gëtt mam Numm "archive.zip" gespäichert. D'Applikatioun wäert dann d'Datei auspacken, optional mam Archivpasswuert "b5jXh37gxgHBrZhQ4j3D" benotzt. Déi unzipped Dateien ginn am [extern Späicheren]/hgps Verzeichnis gespäichert. An dësem Verzeechnes späichert d'Applikatioun Web-Fälschungen (ënner beschriwwen).
Stock De Kommando ass entwéckelt fir mat Action Service ze schaffen, deen an enger separater Sektioun beschriwwe gëtt.
Test Näischt maachen.
download De Kommando ass virgesinn fir eng Datei vun engem Fernserver erofzelueden an an den "Downloads" Verzeichnis ze späicheren. D'URL an den Dateinumm kommen als Parameter, Felder am JSON Parameterobjekt, respektiv: "URL" an "FileName".
ewechhuelen Ewechzehuelen eng Datei aus dem "Downloads" Verzeechnes. De Dateinumm kënnt an engem JSON Parameter mam "FileName" Schlëssel. De Standard Dateinumm ass "tmp.apk".
Notifikatioun Weist eng Notifikatioun mat Beschreiwung an Titeltexter definéiert vum Managementserver.

Kommando Format Notifikatioun:

{
    "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%>}
                   ]
                   },
        },
}

D'Notifikatioun generéiert vum Fichier ënner der Enquête gesäit identesch aus wéi den Notifikatiounen generéiert vun der Applikatioun déi am Feld spezifizéiert ass App. Wann den Terrain Wäert oppenApp - Richteg, wann eng Notifikatioun opgemaach gëtt, gëtt d'Applikatioun, déi am Feld spezifizéiert ass, gestart App. Wann den Terrain Wäert oppenApp — Falsch, dann:

  • Eng Phishing-Fënster gëtt op, den Inhalt vun deem aus dem Verzeechnes erofgeluede gëtt <%external storage%>/hgps/<%filename%>
  • Eng Phishing-Fënster gëtt op, den Inhalt vun deem vum Server erofgeluede gëtt <%url%>?id=<%Bot id%>&app=<%App Numm%>
  • Eng Phishing-Fënster mécht op, verkleed als Google Play Card, mat der Méiglechkeet fir Kaartdetailer anzeginn.

D'Applikatioun schéckt d'Resultat vun all Kommando un <%CnC%>set_state.php als JSON Objet am folgenden Format:

{
    "command":
    {
        "command":<%command%>,
        "id":<%command_id%>,
        "state":<%command_state%>
    }
    "id":<%bot_id%>
}

AktiounenService
D'Lëscht vun de Kommandoen déi d'Applikatioun veraarbecht enthält Aktiounen. Wann e Kommando kritt gëtt, kritt de Kommandoveraarbechtungsmodul Zougang zu dësem Service fir de erweiderten Kommando auszeféieren. De Service akzeptéiert en JSON Objet als Parameter. De Service kann déi folgend Kommandoen ausféieren:

1. PARAMS_ACTION - wann Dir esou e Kommando kritt, kritt de Service fir d'éischt vum JSON Parameter de Wäert vum Type Schlëssel, dee kann wéi follegt sinn:

  • serviceInfo - den Ënnerkommando kritt de Wäert per Schlëssel vum JSON Parameter includeNotImportant. Wann de Fändel richteg ass, setzt d'Applikatioun de Fändel FLAG_ISOLATED_PROCESS zu engem Service deen den Accessibilitéitsservice benotzt. Op dës Manéier gëtt de Service an engem separaten Prozess lancéiert.
  • root - kritt a schéckt un de Server Informatioun iwwer d'Fënster déi am Moment am Fokus ass. D'Applikatioun kritt Informatioun mat der AccessibilityNodeInfo Klass.
  • Administrator - Ufro Administrator Rechter.
  • Retard - suspendéiert den ActionsService fir d'Zuel vun de Millisekonnen am Parameter fir den "Daten" Schlëssel spezifizéiert.
  • Fënsteren - schéckt eng Lëscht vu Fënstere siichtbar fir de Benotzer.
  • installéieren - installéiert d'Applikatioun op dem infizéierten Apparat. Den Numm vum Archivpaket ass am "DateiName" Schlëssel. Den Archiv selwer ass am Downloads Verzeichnis.
  • global - den Ënnerkommando ass geduecht fir aus der aktueller Fënster ze navigéieren:
    • am Quick Settings Menu
    • zréck
    • doheem
    • zu Notifikatiounen
    • op déi kierzlech opgemaach Uwendungsfenster

  • lancéiere - lancéiert d'Applikatioun. Den Numm vun der Applikatioun kënnt als Parameter mam Schlëssel Donnéeën.
  • Kläng - ännert den Tounmodus op Rou.
  • Spär - schalt d'Beleuchtung vum Écran an d'Tastatur op voll Hellegkeet un. D'Applikatioun fiert dës Aktioun mat WakeLock aus, spezifizéiert d'String [Applikatioun Label]:INFO als Tag
  • permissionOverlay - d'Funktioun ass net ëmgesat (d'Äntwert op d'Ausféierung vum Kommando ass {"message":"Net ënnerstëtzt"} oder {"message":"low sdk"})
  • Geste - d'Funktioun ass net implementéiert (d'Äntwert op d'Ausféierung vum Kommando ass {"message":"Net ënnerstëtzt"}oder {"message":"Low API"})
  • Permissiounen - Dëse Kommando ass néideg fir Permissiounen fir d'Applikatioun ze froen. Wéi och ëmmer, d'Ufrofunktioun ass net implementéiert, sou datt de Kommando sënnlos ass. D'Lëscht vun ugefrote Rechter kënnt als JSON-Array mat dem "Permissiounen" Schlëssel. Standard Lëscht:
    • 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 - weist eng Phishingfenster. Ofhängeg vum Parameter, deen vum Server kënnt, kann d'Applikatioun déi folgend Phishing-Fensteren weisen:
    • Weist eng Phishing-Fënster, deem säin Inhalt an engem Fichier an engem Verzeichnis geschriwwe gëtt <%external directory%>/hgps/<%param_filename%>. D'Resultat vun der Benotzerinteraktioun mat der Fënster gëtt geschéckt <%CnC%>/records.php
    • Weist eng Phishing-Fënster, deem säin Inhalt vun der Adress virgelueden ass <%url_param%>?id=<%bot_id%>&app=<%packagename%>. D'Resultat vun der Benotzerinteraktioun mat der Fënster gëtt geschéckt <%CnC%>/records.php
    • Weist eng Phishing-Fënster verkleed als Google Play Card.

  • interaktiv - de Kommando ass entwéckelt fir mat Fënsterelementer vun aneren Uwendungen ze interagéieren déi AcessibilityService benotzen. E spezielle Service gouf am Programm fir Interaktioun ëmgesat. D'Uwendung ënner Enquête ka mat Windows interagéieren:
    • Aktuell aktiv. An dësem Fall enthält de Parameter d'ID oder den Text (Numm) vum Objet mat deem Dir interagéiere musst.
    • Siichtbar fir de Benotzer zur Zäit wou de Kommando ausgefouert gëtt. D'Applikatioun wielt Fënsteren no ID.

    Objekter ze kréien AccessibilityNodeInfo Fir Fënsterelementer vun Interesse kann d'Applikatioun, ofhängeg vun de Parameteren, déi folgend Aktiounen ausféieren:

    • fokusséieren - konzentréieren op den Objet.
    • klickt - klickt op en Objet.
    • actionId - eng Aktioun duerch ID ausféieren.
    • setText - den Text vun engem Objet änneren. Den Text änneren ass méiglech op zwou Méiglechkeeten: eng Aktioun ausféieren ACTION_SET_TEXT (wann d'Android Versioun vum infizéierten Apparat méi jonk ass wéi oder gläich wéi LOLLIPOP), oder andeems Dir e String op de Clipboard setzt an en an en Objet setzt (fir méi al Versiounen). Dëse Kommando kann benotzt ginn fir Daten an enger Bankapplikatioun z'änneren.

2. PARAMS_ACTIONS - selwecht wéi PARAMS_ACTION, nëmmen eng JSON-Array vu Kommandoen kënnt.

Et schéngt, datt vill Leit interesséiert sinn wéi d'Funktioun vum Interaktioun mat Fënsterelementer vun enger anerer Applikatioun ausgesäit. Dëst ass wéi dës Funktionalitéit am Gustuff ëmgesat gëtt:

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

Text Ersatzfunktioun:

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

Also, mat der korrekter Konfiguratioun vum Kontrollserver, ass Gustuff fäeg Textfelder an der Bankapplikatioun auszefëllen a klickt op d'Knäppercher déi néideg sinn fir d'Transaktioun ofzeschléissen. Den Trojaner brauch net emol op d'Applikatioun aloggen - et ass genuch fir e Kommando ze schécken fir eng PUSH Notifikatioun ze weisen an dann déi virdru installéiert Bankapplikatioun opzemaachen. De Benotzer authentifizéiere sech, duerno kann de Gustuff den Auto fëllen.

SMS Message Veraarbechtung Modul

D'Applikatioun installéiert en Event Handler fir den infizéierten Apparat fir SMS Messagen ze akzeptéieren. D'Uwendung ënner Studie kann Befehle vum Bedreiwer kréien, déi am Kierper vun der SMS kommen. Kommandoen kommen am Format:

7!5=<%Base64 kodéiert Kommando%>

D'Applikatioun sicht no der String an all erakomm SMS Messagen 7! 5 =, wann e String erkannt gëtt, decodéiert de String aus Base64 am Offset 4 an fiert de Kommando aus. D'Befehle sinn ähnlech wéi déi mat CnC. D'Ausféierungsresultat gëtt op déiselwecht Nummer geschéckt, aus där de Kommando koum. Äntwert Format:

7*5=<%Base64 Kodéierung vum "Resultat_code Kommando"%>

Optional kann d'Applikatioun all kritt Messagen un d'Root Nummer schécken. Fir dëst ze maachen, muss d'Root Nummer an der Präferenzdatei spezifizéiert ginn an de Message Redirection Fändel muss gesat ginn. Eng SMS gëtt un d'Nummer vum Ugräifer am Format geschéckt:

<%Vun Nummer%> - <%Zäit, Format: dd/MM/jjjj HH:mm:ss%> <%SMS Kierper%>

Och optional kann d'Applikatioun Messagen op CnC schécken. D'SMS Message gëtt op de Server am JSON Format geschéckt:

{
    "id":<%BotID%>,
    "sms":
    {
        "text":<%SMS body%>,
        "number":<%From number%>,
        "date":<%Timestamp%>
    }
}

Wann de Fändel gesat ass nameGenerator("DEFAULT_APP_SMS") - d'Applikatioun stoppt d'SMS-Message ze veraarbecht a läscht d'Lëscht vun erakommen Messagen.

Proxy Modul

D'Applikatioun déi studéiert enthält enthält e Backconnect Proxy Modul (nodréiglech als Proxy Modul bezeechent), deen eng separat Klass huet déi statesch Felder mat Konfiguratioun enthält. Konfiguratiounsdaten ginn an der Probe a kloer Form gespäichert:

Wéi den Android Trojanesche Gustuff d'Crème (Fiat a Krypto) vun Äre Konten schmaacht

All Aktiounen, déi vum Proxy-Modul ausgeführt ginn, ginn op Dateien ageloggt. Fir dëst ze maachen, erstellt d'Applikatioun an der externer Späichere e Verzeichnis mam Numm "Logbicher" (de Feld ProxyConfigClass.logsDir an der Konfiguratiounsklass), an deem Logdateien gespäichert ginn. Logged geschitt a Dateien mat Nimm:

  1. main.txt - d'Aarbecht vun der Klass genannt CommandServer ass an dëser Datei ageloggt. An deem wat duerno ass, gëtt d'Aloggen vun der String str an dës Datei als mainLog (str) bezeechent.
  2. session-<%id%>.txt - Dës Datei späichert Logdaten verbonne mat enger spezifescher Proxy Sessioun. An deem nächste gëtt d'Protokolléierung vun der String str op dës Datei als sessionLog (str) bezeechent.
  3. server.txt - Dës Datei gëtt benotzt fir all Daten, déi op déi uewe beschriwwe Dateie geschriwwe sinn, ze protokolléieren.

Logdatenformat:

<%Date%> [Thread[<%thread id%>], id[]]: log-string

Ausnamen, déi während der Operatioun vum Proxy-Modul optrieden, ginn och op eng Datei protokolléiert. Fir dëst ze maachen, generéiert d'Applikatioun en JSON Objet am folgenden 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":
            }
        ]
}

Da konvertéiert et an eng String Representatioun a protokolléiert se.

De Proxy Modul gëtt gestart nodeems de entspriechende Kommando kritt. Wann e Kommando fir de Proxy Modul ze lancéieren kritt gëtt, fänkt d'Applikatioun e Service genannt MainService, déi verantwortlech ass fir d'Operatioun vum Proxy Modul ze managen - et ze starten an ze stoppen.

Etappe vum Start vum Service:

1. Fänkt en Timer un deen eemol pro Minutt leeft a kontrolléiert d'Aktivitéit vum Proxy Modul. Wann de Modul net aktiv ass, fänkt et un.
Och wann d'Evenement ausgeléist gëtt android.net.conn.CONNECTIVITY_CHANGE De Proxy Modul gëtt gestart.

2. D'Applikatioun erstellt e Wake-Lock mam Parameter PARTIAL_WAKE_LOCK an erfaasst hien. Dëst verhënnert datt den Apparat CPU an de Schlofmodus geet.

3. Lancéiert d'Kommandoveraarbechtungsklasse vum Proxy Modul, fir d'éischt d'Linn ze protokolléieren mainLog ("Start Server") и

Server::start() Host[<%proxy_cnc%>], commandPort[<%command_port%>], proxyPort[<%proxy_port%>]

wou proxy_cnc, command_port an proxy_port - Parameter kritt vun der Proxy Server Konfiguratioun.

D'Kommandoveraarbechtungsklass gëtt genannt CommandConnection. Direkt nom Start, mécht déi folgend Aktiounen:

4. Verbënnt mat ProxyConfigClass.host: ProxyConfigClass.commandPort a schéckt Daten iwwer den infizéierten Apparat do am JSON Format:

{
    "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%>
}

Wou:

  • id - Identifizéierer, probéiert e Wäert mam "id" Feld aus der Shared Preference Datei mam Numm "x" ze kréien. Wann dëse Wäert net kritt ka ginn, generéiert en neien. Also huet de Proxy Modul säin eegene Identifizéierer, deen ähnlech wéi d'Bot ID generéiert gëtt.
  • imei - IMEI vum Apparat. Wann e Feeler während dem Prozess vun der Erhaalung vum Wäert geschitt ass, gëtt e Feeler Textmeldung amplaz vun dësem Feld geschriwwe ginn.
  • imsi - International Mobile Abonnent Identitéit vum Apparat. Wann e Feeler während dem Prozess vun der Erhaalung vum Wäert geschitt ass, gëtt e Feeler Textmeldung amplaz vun dësem Feld geschriwwe ginn.
  • Modell - Den Endverbraucher-sichtbare Numm fir d'Ennprodukt.
  • Fabrikant - Den Hiersteller vum Produkt/Hardware (Build.MANUFACTURER).
  • androidVersion - eng String am Format "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • Land - aktuell Positioun vum Apparat.
  • partnerId ass eng eidel String.
  • PackageName - Package Numm.
  • networkType - Typ vun der aktueller Netzwierkverbindung (Beispill: "WIFI", "MOBILE"). Am Fall vu Feeler, gëtt null zréck.
  • hasGsmSupport - richteg - wann den Telefon GSM ënnerstëtzt, soss falsch.
  • simReady - SIM Kaart Staat.
  • simCountry - ISO Land Code (baséiert op SIM Kaart Provider).
  • NetworkOperator - Numm vum Bedreiwer. Wann e Feeler während dem Prozess vun der Erhaalung vum Wäert geschitt ass, gëtt e Feeler Textmeldung amplaz vun dësem Feld geschriwwe ginn.
  • simOperator - De Service Provider Numm (SPN). Wann e Feeler während dem Prozess vun der Erhaalung vum Wäert geschitt ass, gëtt e Feeler Textmeldung amplaz vun dësem Feld geschriwwe ginn.
  • Versioun - dëst Feld ass an der Configuratiounsklass gespäichert; fir déi getest Versioune vum Bot war et gläich wéi "1.6".

5. Wiesselt op de Modus fir op Kommandoen vum Server ze waarden. Kommandoen vum Server kommen am Format:

  • 0 Offset - Kommando
  • 1 Offset - sessionId
  • 2 Offset - Längt
  • 4 Offset - Daten

Wann e Kommando ukomm ass, protokolléiert d'Applikatioun:
mainLog("Header { sessionId<%id%>], Typ[<%command%>], Längt[<%length%>] }")

Déi folgend Kommandoen vum Server sinn méiglech:

Numm Kommando Daten description
connectId 0 Verbindung ID Schafen eng nei Verbindung
SLÉIEREN 3 Zäit Paus de Proxy Modul
DËSCHTENNIS 4 - Schécken PONG Message

E PONG Message besteet aus 4 Bytes a gesäit esou aus: 0x04000000.

Wann de connectionId Kommando kritt ass (fir eng nei Verbindung ze kreéieren) CommandConnection erstellt eng Instanz vun enger Klass ProxyConnection.

  • Zwee Klassen huelen un der Proxy deel: ProxyConnection и Enn. Wann Dir eng Klass erstellt ProxyConnection Verbindung mat der Adress ProxyConfigClass.host: ProxyConfigClass.proxyPort a passéiert de JSON Objet:

 {
    "id":<%connectionId%>
}

Als Äntwert schéckt de Server e SOCKS5 Message deen d'Adress vum Remote Server enthält, mat deem d'Verbindung muss etabléiert ginn. Interaktioun mat dësem Server geschitt duerch d'Klass Enn. De Verbindungsopbau kann schematesch wéi follegt duergestallt ginn:

Wéi den Android Trojanesche Gustuff d'Crème (Fiat a Krypto) vun Äre Konten schmaacht

Netzwierk Interaktiounen

Fir Verkéiersanalyse duerch Netzschniffer ze verhënneren, kann d'Interaktioun tëscht dem CnC Server an der Applikatioun mat dem SSL Protokoll geschützt ginn. All iwwerdroen Daten souwuel vum an op de Server ginn am JSON-Format presentéiert. D'Applikatioun féiert déi folgend Ufroe wärend der Operatioun aus:

  • http://<%CnC%>/api/v1/set_state.php - d'Resultat vun der Ausféierung vum Kommando.
  • http://<%CnC%>/api/v1/get.php - e Kommando kréien.
  • http://<%CnC%>/api/v1/load_sms.php - SMS Messagen vun engem infizéierten Apparat eroflueden.
  • http://<%CnC%>/api/v1/load_ab.php - Eroplueden vun enger Lëscht vu Kontakter vun engem infizéierte Apparat.
  • http://<%CnC%>/api/v1/aevents.php - d'Ufro gëtt gemaach wann d'Parameteren an der Präferenzdatei aktualiséiert ginn.
  • http://<%CnC%>/api/v1/set_card.php - Eroplueden vun Donnéeën, déi mat enger Phishing-Fënster kritt goufen, déi sech als de Google Play Market verkleeden.
  • http://<%CnC%>/api/v1/logs.php - Logdaten eropluede.
  • http://<%CnC%>/api/v1/records.php - Eroplueden vun Daten, déi duerch Phishingfenster kritt goufen.
  • http://<%CnC%>/api/v1/set_error.php - Notifikatioun vun engem Feeler dee geschitt ass.

Recommandatiounen

Fir hir Clienten virun der Bedrohung vu mobilen Trojaner ze schützen, mussen d'Firmen ëmfaassend Léisunge benotzen, déi et erlaben, béiswëlleg Aktivitéit ze iwwerwaachen an ze vermeiden ouni zousätzlech Software op Benotzergeräter z'installéieren.

Fir dëst ze maachen, mussen Ënnerschrëftmethoden fir mobil Trojaner z'entdecken mat Technologien verstäerkt ginn fir d'Verhalen vum Client an d'Applikatioun selwer ze analyséieren. De Schutz soll och eng Apparat Identifikatiounsfunktioun mat digitaler Fangerofdrocktechnologie enthalen, déi et méiglech mécht ze verstoen wann e Kont vun engem atypeschen Apparat benotzt gëtt a schonn an d'Hänn vun engem Bedruch gefall ass.

E grondsätzlech wichtege Punkt ass d'Disponibilitéit vun der Cross-Channel Analyse, déi d'Firmen erlaabt d'Risiken ze kontrolléieren, déi net nëmmen um Internet entstinn, awer och um mobilen Kanal, zum Beispill an Uwendungen fir mobil Banking, fir Transaktioune mat Krypto-Währungen an all aner wou finanziell Transaktioun.

Sécherheetsregele fir Benotzer:

  • Installéiert keng Uwendungen fir e mobilen Apparat mat Android OS vun anere Quellen wéi Google Play, bezuelt speziell Opmierksamkeet op d'Rechter, déi vun der Applikatioun gefrot ginn;
  • regelméisseg Android OS Updates installéieren;
  • oppassen op d'Extensiounen vun den erofgeluede Dateien;
  • besicht net verdächteg Ressourcen;
  • Klickt net op Linken, déi an SMS Messagen kritt goufen.

Haaptroll Semyon Rogacheva, Junior Spezialist an der Malwarefuerschung am Group-IB Computer Forensics Laboratory.

Source: will.com

Setzt e Commentaire