Hogyan csapolja meg az Android Gusftuff trójai a fiat és kripto pénzeket a fiókjaidból

Hogyan csapolja meg az Android Gusftuff trójai a fiat és kripto pénzeket a fiókjaidból

Csak pár napja a Group-IB jelentette az Android mobil trojanyang Gustuff aktivitásáról. Ez a trójai kizárólag a nemzetközi piacokon működik, megcélozva a 100 legnagyobb külföldi bank ügyfeleit, 32 mobil kriptopénztárca felhasználóit, valamint nagy e-kereskedelmi platformokat. A Gustuff fejlesztője egy orosz nyelvű kiberbűnöző, aki Bestoffer néven ismert. Nemrégiben dicsérte a trojánt, mint "komoly terméket a tudással és tapasztalattal rendelkező emberek számára".

A Group-IB kártevőelemzője Ivan Piszarev részletesen beszámol arról, hogyan működik a Gustuff és mi a veszélye.

Kire vadászik a Gustuff

A Gustuff a teljesen automatizált funkciókkal rendelkező kártevők új generációjába tartozik. A fejlesztője szerint ez a trójai a 2017 novemberében megjelent AndyBot kártevő új, fejlettebb verziója, amely Android operációs rendszerű telefonokat támad, és pénzt lop el phishing webformákon keresztül, amelyek ismert nemzetközi bankok és fizetési rendszerek mobilalkalmazásaiként álcázzák magukat. A Bestoffer korábban arról számolt be, hogy a "Gustuff Bot" bérleti díja havi 800 dollár volt.

A Gustuff mintája azt mutatta, hogy potenciálisan a legnagyobb bankok mobilalkalmazásait használó ügyfelek ellen irányul, mint például a Bank of America, Bank of Scotland, J.P. Morgan, Wells Fargo, Capital One, TD Bank, PNC Bank, valamint a Bitcoin Wallet, BitPay, Cryptopay, Coinbase és más kriptopénztárcák.

Eredetileg klasszikus banki trójainak tervezve, a Gustuff jelenlegi verziója jelentősen kibővítette a potenciális támadási célpontok listáját. Az Android-alkalmazásokon kívül, amelyek bankok, fintech cégek és kriptoszolgáltatások, a Gustuff célba veszi a piacterek, online boltok, fizetési rendszerek és üzenetküldő alkalmazások felhasználóit. Különösen a PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut és mások.

Belépési pont: tömeges fertőzésre való számítás

A Gustuff jellemzője a "klasszikus" behatolási vektor az Android okostelefonokra SMS-küldésekkel, amelyek APK-linkeket tartalmaznak. Ha egy Android eszközt trójan fertőz meg, a szerver utasítására a Gustuff további terjedése történhet meg az érintett telefon kapcsolatainak adatbázisában vagy a szerver adatbázisában. A Gustuff funkciói a tömeges fertőzésre és az operátorai üzleti lehetőségeinek maximális kihasználására lettek optimalizálva – egyedi "autofeltöltési" funkciója révén legális mobilbanki alkalmazásokba és kriptovállatokba képes bejuttatni, ami felgyorsítja és skálázza a pénzkifosztást.

A trója kutatás során kiderült, hogy az autofeltöltési funkciót az Accessibility Service – a mozgáskorlátozottaknak szánt szolgáltatás – révén valósították meg. A Gustuff nem az első trója, amely sikeresen megkerüli a többi alkalmazás ablakának elemeivel való interakciót védő rendszereket ezen Android-szolgáltatás segítségével. Azonban az Accessibility Service és az autofeltöltés kombinációjának használata még mindig meglehetősen ritka jelenség.

Miután a Gustuff letöltődik az áldozat telefonjára, az Accessibility Service segítségével lehetősége nyílik más alkalmazások (banki, kriptovaluta, online vásárlás, üzenetküldés stb.) ablakainak elemeivel való interakcióra, végrehajtva a szükséges tevékenységeket a támadók számára. Például a trójan parancsára az autoritás nyomja a gombokat és módosítja a szöveges mezők értékeit a banki alkalmazásokban. Az Accessibility Service mechanizmus használata lehetővé teszi a trójan számára, hogy megkerülje a bankok által a korábbi generációs mobiltrójai ellen alkalmazott védelmi mechanizmusokat, valamint azokat a biztonsági politikai változtatásokat, amelyeket a Google az Android operációs rendszerek új verzióiba bevezetett. Így a Gustuff "tudja" letiltani a Google Protect védelmét: a szerző állítása szerint ez a funkció 70%-ban bekapcsol magát.

Hogyan csapolja meg az Android Gusftuff trójai a fiat és kripto pénzeket a fiókjaidból

A Gustuff hamis PUSH-értesítéseket is tud megjeleníteni, amelyek jogszerű mobilalkalmazások ikonjaival bírnak. A felhasználó rákattint a PUSH-értesítésre, és egy, a szerverről betöltött, adathalász ablakot lát, ahová saját bankkártya vagy kriptovaluta tárca adatait kell beírnia. Egy másik forgatókönyvben, amikor a Gustuff működik, megnyílik a PUSH-értesítéssel bemutatott alkalmazás. Ekkor a rosszindulatú program a szerver utasítása alapján, az Accessibility Service-en keresztül kitölti a banki alkalmazás űrlapjának mezőit csalásra szánt tranzakcióhoz.

A Gustuff funkciói közé tartozik az információk küldése a fertőzött eszközről a szerverre, SMS üzenetek olvasása/küldése, USSD lekérdezések küldése, SOCKS5 Proxy indítása, linkre kattintás, fájlok (beleértve a dokumentumok fotómásolatait, képernyőképeit, fényképeit) küldése a szerverre, valamint az eszköz gyári alapbeállításokra való visszaállítása.

A rosszindulatú program elemzése

A rosszindulatú alkalmazás telepítése előtt az Android operációs rendszer egy ablakot mutat be, amely a Gustuff által kért jogosultságok listáját tartalmazza:

Hogyan csapolja meg az Android Gusftuff trójai a fiat és kripto pénzeket a fiókjaidból
Az alkalmazás telepítése csak a felhasználó beleegyezése után történik. Az alkalmazás elindítása után a trójai egy ablakot fog mutatni a felhasználónak:

Hogyan csapolja meg az Android Gusftuff trójai a fiat és kripto pénzeket a fiókjaidból
Ezután eltávolítja az ikonját.

A Gustuff, az író állítása szerint, az FTT csomagolóval van becsomagolva. A program elindítása után időszakonként kapcsolatba lép a CnC szerverrel parancsok beszerzése céljából. Az általunk vizsgált fájlok közül néhány esetében a vezérlő szerver IP-címe a következő volt: 88.99.171[.]105 (a továbbiakban jelöljük így: <%CnC%>).

A program elindítása után elkezdi az üzenetek küldését a szerver felé http://<%CnC%>/api/v1/get.php.

A válaszként a következő formátumú JSON-ra számítunk:

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

Minden egyes lekérdezéskor az alkalmazás információt küld a fertőzött eszközről. Az üzenet formátuma alább látható. Érdemes megjegyezni, hogy a full, extra, apps és permission opcionális mezők, és csak a CnC-től érkező kérés parancs esetén lesznek elküldve.

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

Konfigurációs adatok tárolása

A Gustuff fontos információkat tárol a preference-fájlban. A fájl neve, akárcsak a benne lévő paraméterek nevei, az MD5 hash értékének eredménye. 15413090667214.6.1<%name%>, ahol <%name%> — az eredeti név-érték. A névgeneráló funkció Python értelmezése:

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

A jövőben így fogjuk jelölni nameGenerator(input).
Így az első fájl neve: nameGenerator(«API_SERVER_LIST»), tartalmazza a következő nevekkel rendelkező értékeket:

Változó névValue
nameGenerator(«API_SERVER_LIST»)Tartalmaz egy CnC címek listáját tömb formájában.
nameGenerator(«API_SERVER_URL»)Tartalmazza a CnC címet.
nameGenerator(«SMS_UPLOAD»)Az alapértelmezett zászló be van állítva. Ha a zászló be van állítva – SMS üzeneteket küld a CnC-re.
nameGenerator(«SMS_ROOT_NUMBER»)A telefonszám, ahová az SMS-üzeneteket küldik, ha a fertőzött eszköz elfogta őket. Alapértelmezés szerint null.
nameGenerator(«SMS_ROOT_NUMBER_RESEND»)Az alapértelmezett jelző törölve van. Ha be van állítva - a fertőzött eszközhöz érkező SMS-t a root-számra küldik.
nameGenerator(«DEFAULT_APP_SMS»)Az alapértelmezett jelző törölve van. Ha ez a jelző be van állítva - az alkalmazás feldolgozza a bejövő SMS-üzeneteket.
nameGenerator(«DEFAULT_ADMIN»)Az alapértelmezett jelző törölve van. Ha a jelző be van állítva - az alkalmazás rendszergazdai jogokkal rendelkezik.
nameGenerator(«DEFAULT_ACCESSIBILITY»)Az alapértelmezett jelző törölve van. Ha a jelző be van állítva - elindul egy szolgáltatás, amely az Accessibility Service-t használja.
nameGenerator(«APPS_CONFIG»)JSON-objektum, amely tartalmazza a teendők listáját, amelyeket végre kell hajtani egy adott alkalmazáshoz kapcsolódó Accessibility-esemény bekövetkeztekor.
nameGenerator(«APPS_INSTALLED»)Tartalmazza az eszközön telepített alkalmazások listáját.
nameGenerator(«IS_FIST_RUN»)A jelző az első indításkor visszaállításra kerül.
nameGenerator(«UNIQUE_ID»)Egyedi azonosítót tartalmaz. A bot első indításakor generálódik.

Parancsfeldolgozó modul a szervertől

Az alkalmazás a CnC-szerverek címét tömbként tárolja, amelyeket a Base85 láncok kódolásával tárol. szerverek A CnC lista -

a megfelelő parancs megérkezésekor módosítható, ilyenkor a címeket a preference-fájlban tárolják.

A parancsLeírás
A szerver válaszát az alkalmazás parancsa követi. Érdemes megjegyezni, hogy a parancsok és paraméterek JSON-formátumban kerülnek bemutatásra. Az alkalmazás a következő parancsokat képes feldolgozni:forwardStart
Az érkező fertőzött eszköz SMS-üzeneteinek továbbítása a CnC-szerverre.forwardStop
A fertőzött eszköz SMS-üzeneteinek továbbításának leállítása a CnC-szerverre.ussdRun
USSD-kérelem végrehajtása. A USSD-kérdéshez kapcsolódó szám a JSON-mezőben található «number».sendSms
Egy SMS-üzenet küldése (szükség esetén az üzenet 'darabokra’ szakad). A parancs egy JSON-objektumot fogad, amely a 'to' - címzett számot és a 'body' - az üzenet szövegét tartalmazza.sendSmsAb
SMS-üzenetek küldése (szükség esetén az üzenet 'darabokra' szakad) a fertőzött eszköz névjegyek listájának minden tagjának. Az üzenetek küldése közötti időintervallum 10 másodperc. Az üzenet szövege a JSON-mező 'body' -jában található.SMS-üzenetek küldése (ha szükséges, az üzenet részekre bontható) a parancsparaméterekben megadott kapcsolattartóknak. Az üzenetek küldése közötti intervallum – 10 másodperc. A parancs egy JSON-tömböt (a „sms” mező) vár, amelynek elemei a „to” – cél telefonszám és a „body” – üzenet tartalma mezőket tartalmazzák.
changeServerEz a parancs paraméterként elfogadhat egy „url” kulccsal rendelkező értéket – ekkor a bot megváltoztatja a nameGenerator(“SERVER_URL”) értékét, vagy „array” – ekkor a bot egy tömböt ír a nameGenerator(“API_SERVER_LIST”) néven. Így az alkalmazás megváltoztatja a CnC-szerverek címét.
adminNumberEz a parancs a root telefonszámmal való munkára szolgál. A parancs egy JSON-objektumot vár a következő paraméterekkel: „number” – módosítja a nameGenerator(“ROOT_NUMBER”) értékét a kapott értékre, „resend” – módosítja a nameGenerator(“SMS_ROOT_NUMBER_RESEND”) értékét, „sendId” – küldje a nameGenerator(“ROOT_NUMBER”) számára a uniqueID-t.
updateInfoInformációt küldeni a szerverre a megfertőzött eszközről.
wipeDataEz a parancs a felhasználói adatok törlésére szolgál. Attól függően, hogy milyen néven indult az alkalmazás, vagy teljes adateltávolítást végez a készülék újraindításával (primary user), vagy csak a felhasználói adatokat törli (secondary user).
socksStartProxy-modul elindítása. A modul működése egy külön szakaszban van leírva.
socksStopA Proxy-modul működésének leállítása.
openLinkLink megnyitása. A link a JSON-paraméterben a „url” kulcs alatt található. A link megnyitásához „android.intent.action.VIEW” használatos.
uploadAllSmsAz összes eszköz által fogadott SMS-üzenet küldése a szerverre.
uploadAllPhotosKép URL-jének küldése a megfertőzött eszközről. Az URL paraméterként érkezik.
uploadFileFájl URL-jének küldése a megfertőzött eszközről. Az URL paraméterként érkezik.
uploadPhoneNumbersTelefonszámok küldése a szerverre a névjegyzékből. Ha a paraméterként egy JSON-objektum érkezik „ab” kulccsal, az alkalmazás a telefonkönyvből kapja a névjegyek listáját. Ha a paraméterként egy JSON-objektum érkezik „sms” kulccsal, az alkalmazás a SMS-üzenetek küldőitől olvassa a névjegyek listáját.
changeArchiveAz alkalmazás fájlt tölt le egy címről, amely paraméterként a "url" kulcs alatt érkezik. A letöltött fájlt "archive.zip" néven menti el. Ezt követően az alkalmazás kicsomagolja a fájlt, szükség esetén a "b5jXh37gxgHBrZhQ4j3D" jelszó használatával. A kicsomagolt fájlokat az [external storage]\/hgps könyvtárba menti. Ebben a könyvtárban az alkalmazás webhamisítványokat tárol (a továbbiakban részletezve).
actionsA parancs az Action Service használatára szolgál, amelyet külön szakaszban írunk le.
tesztNem csinál semmit.
downloadA parancs fájl letöltésére szolgál egy távoli szerverről, majd menti azt a "Downloads" könyvtárba. Az URL és a fájl nevét paraméterként kapja meg, a JSON-objektumban a "url" és "fileName" mezők alatt.
removeEltávolítja a fájlt a "Downloads" könyvtárból. A fájl neve a JSON-paraméterben a "fileName" kulccsal érkezik. Alapértelmezett fájlneve: "tmp.apk".
notificationMegjelenít egy értesítést a leíró szöveggel és címmel, amelyet a vezérlő szerver határoz meg.

A parancs formátuma notification:

{
 "results" : "OK",
 "command":{
 "id": ,
 "command":"notification",
 "timestamp":,
 "params":{
 "openApp":,
 "array":[
 {"title":,
 "desc":,
 "app":}
 ]
 },
 },
}

Az értesítés, amelyet a vizsgált fájl hoz létre, azonos a megadott alkalmazás által létrehozott értesítésekkel, amelyek a mezőben szerepelnek. app. Ha a mező értéke openApp — True, akkor az értesítés megnyitásakor elindul a mezőben megadott alkalmazás. app. Ha a mező értéke openApp — False, esetén:

  • hamisító ablak jelenik meg, amelynek tartalma az alábbi könyvtárból töltődik le: \/hgps\/
  • hamisító ablak jelenik meg, amelynek tartalma a szerverről töltődik le: ?id=&app=
  • hamisító ablak jelenik meg, amely a Google Play Kártya álcáját öltötte, lehetőséget biztosítva a kártyaadatok megadására.

Bármely parancs végrehajtásának eredményét az alkalmazás az alábbi címre küldi: set_state.php a következő formátumú JSON-objektumként:

{
    "command":
    {
        "command":,
        "id":,
        "state":
    }
    "id":
}

ActionsService
A parancsok listájában, amelyeket az alkalmazás kezeli, szerepel action. A parancs fogadása esetén a parancsok feldolgozó modulja kapcsolatba lép ezzel a szolgáltatással a kiterjesztett parancs végrehajtása érdekében. A szolgáltatás egy JSON-objektumot fogad paraméterként. A szolgáltatás az alábbi parancsokat képes végrehajtani:

1. PARAMS_ACTION — a parancs megadásakor a szolgáltatás első lépésként a JSON-paraméterből lekéri a Type kulcs alatti értéket, amely a következő lehet:

  • serviceInfo – a parancs a JSON-paraméterből lekéri az értéket a kulcs alapján includeNotImportant. Ha a jelző értéke True, az alkalmazás beállítja a jelzőt FLAG_ISOLATED_PROCESS az Accessibility Service használó szolgáltatásra. Így a szolgáltatás külön folyamatban fog futni.
  • , felhasználó nevében fut, mivel alapvető rendszerbeállításokat módosítanak, de a WordPress közvetlenül egy normál felhasználóként működik. — lekéri és elküldi a szervernek azt az ablakot, amely éppen fókuszban van. Az alkalmazás az AccessibilityNodeInfo osztály segítségével nyeri el az információt.
  • admin — adminisztrátori jogok igénylése.
  • delay — felfüggeszti az ActionsService működését a «data» kulcs szerint megadott millimásodpercre.
  • windows — elküldi a felhasználónak látható ablakok listáját.
  • install — telepíti az alkalmazást a fertőzött eszközre. A csomag neve az «fileName» kulcs alatt található. Maga az archívum a Letöltések mappában található.
  • global – a parancs célja a jelenlegi ablakból való átmenet:
    • a Gyors Beállítások menübe
    • vissza
    • a kezdőlapra
    • az értesítésekhez
    • a legutóbb megnyitott alkalmazások ablakához

  • launch — elindítja az alkalmazást. Az alkalmazás neve a kulcs alapján érkezik data.
  • sounds — a hangmódot néma üzemmódra váltja.
  • unlock — bekapcsolja a képernyő és a billentyűzet teljes fényerőt. Az alkalmazás ezt a műveletet WakeLock segítségével hajtja végre, tagként megadva a [Application lable]:INFO szöveget
  • permissionOverlay — a funkció nem valósult meg (a parancs végrehajtásának válasza — {«message»:«Not support»} vagy {«message»:«low sdk»})
  • gesture — a funkció nem valósult meg (a parancs végrehajtásának válasza — {«message»:«Not support»} vagy {«message»:«Low API»})
  • A végcél az, hogy a szolgáltatásai bármilyen kérést elfogadjanak, magabiztosan feltételezve, hogy megbízható forrásból származnak — ez a parancs szükséges az alkalmazás jogainak kérelmezéséhez. A kérés funkciója azonban nem valósult meg, így a parancsnak nincs értelme. A kért jogok listája JSON-tömbként érkezik a «permissions» kulcs alatt. Az alapértelmezett lista:
    • 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 — megjelenít egy adathalász ablakot. A szervertől érkező paramétertől függően az alkalmazás az alábbi adathalász ablakokat jelenítheti meg:
    • Megjelenít egy adathalász ablakot, amelynek tartalma a következő mappában található: /hgps/. A felhasználó interakcióinak eredménye a következő címre kerül elküldésre /records.php
    • Phishing ablak megjelenítése, amelynek tartalmát előre betöltik a címről ?id=&app=. A felhasználó interakcióinak eredménye a következő címre kerül elküldésre /records.php
    • Phishing ablak megjelenítése, amely Google Play Card-ra van álcázva.

  • interaktív — a parancs az AcessibilityService segítségével más alkalmazások ablakainak elemeivel való interakcióra szolgál. Az interakcióhoz a program egy speciális szolgáltatást valósít meg. Az érintett alkalmazás interakciót folytathat az ablakokkal:
    • Jelenleg aktívan. Ebben az esetben a paraméter az azonosítót vagy a szöveget (a tárgy neve) tartalmazza, amellyel interakcióba kell lépni.
    • A parancs végrehajtási idején a felhasználó számára látható ablakok. Az alkalmazás az ablakokat az azonosító alapján választja ki.

    A objektumok AccessibilityNodeInfo megfelelő elemek kapcsán az alkalmazás a paraméterek függvényében a következő műveleteket hajthatja végre:

    • focus — fókuszt állít a tárgyra.
    • click — rákattint a tárgyra.
    • actionId — művelet végrehajtása az azonosító alapján.
    • setText — a tárgy szövegének megváltoztatása. A szöveg módosítása kétféleképpen lehetséges: a ACTION_SET_TEXT végrehajtása (ha az Android verzió a megfertőzött eszközön legfeljebb LOLLIPOP), vagy a szöveg a vágólapra helyezése és a tárgyba való beillesztése (újabb verziók esetén). Ezen parancsot a banki alkalmazás adataiban történő módosításhoz használják.

2. PARAMS_ACTIONS — ugyanaz, mint PARAMS_ACTION, csak JSON tömb parancsokat fogad.

Úgy tűnik, sokakat érdekel, hogyan néz ki a más alkalmazás ablakának elemeivel való interakciós funkció. Így valósult meg ez a funkcionális lehetőség a Gustuff-ben:

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

Szövegcsere funkció:

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

Így, megfelelő beállításokkal a Gustuff vezérlőszervere képes kitölteni a szöveges mezőket a banki alkalmazásban és megnyomni a szükséges gombokat a tranzakció végrehajtásához. A trójnak még az alkalmazásban való hitelesítésre sincs szüksége — elég küldeni egy parancsot a PUSH-értesítések demonstrálására, majd megnyitni a korábban telepített banki alkalmazást. A felhasználónak magának kell végrehajtania a hitelesítést, ezután a Gustuff el tudja végezni az automatikus adatbevitelt.

SMS-üzenetek feldolgozó modul

Az alkalmazás eseménykezelőt állít be a fertőzött eszközön érkező SMS-üzenetek fogadására. A vizsgált alkalmazás parancsokat kaphat az operátortól, amelyek az SMS-üzenet törzsében érkeznek. A parancsok a következő formátumban érkeznek:

7!5=

Az alkalmazás keres minden bejövő SMS-üzenetben egy adott szöveget. 7!5=, ha észlelnek egy sort - a Base64 stringet dekódolja 4-es eltolással és végrehajt egy parancsot. A parancsok hasonlóak a CnC parancsokhoz. A végrehajtás eredményét ugyanarra a számra küldi vissza, ahonnan a parancs érkezett. A válasz formátuma:

7*5=

Opcionálisan az alkalmazás küldheti az összes fogadott üzenetet egy Root-számra. Ehhez a preference-fájlban meg kell adni a Root-számot és be kell állítani az üzenetek átirányításának jelzőjét. Az SMS-üzenetet a támadó számára küldik a következő formátumban:

<%From number%> — <%Time, format: dd/M/yyyy HH:mm:ss%> <%SMS body%>

Ezen kívül opcionálisan az alkalmazás üzeneteket küldhet a CnC-nek. Az SMS-üzenetet JSON-formátumban küldik a szerverre:

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

Ha a jelző be van állítva nameGenerator(«DEFAULT_APP_SMS») – az alkalmazás leállítja az SMS-üzenet feldolgozását és törli a bejövő üzenetek listáját.

Proxy-modul

A vizsgált alkalmazásban van egy Backconnect Proxy modul (továbbiakban Proxy-modul), amely külön osztályba tartozik, statikus mezőkkel a konfigurációval. A konfigurációs adatokat a sample-ben nyíltan tárolják:

Hogyan csapolja meg az Android Gusftuff trójai a fiat és kripto pénzeket a fiókjaidból

Minden Proxy-modul által végzett tevékenység naplózásra kerül fájlokba. Ehhez az alkalmazás az External Storage-ban létrehoz egy "logs" nevű könyvtárat (ProxyConfigClass.logsDir mező a konfigurációs osztályban), amelyben a naplófájlokat tárolja. A naplózás a következő nevekkel rendelkező fájlokba történik:

  1. main.txt – ebbe a fájlba kerül naplózásra a CommandServer nevű osztály működése. A továbbiakban a str string naplózását ebbe a fájlba mainLog(str) néven fogjuk hivatkozni.
  2. session-<%id%>.txt — ebbe a fájlba kerülnek a meghatározott proxysession-höz kapcsolódó naplóadatok. A továbbiakban a str string naplózását ebbe a fájlba sessionLog(str) néven fogjuk hivatkozni.
  3. server.txt – ebbe a fájlba kerül naplózásra minden adat, amely a fent említett fájlokba kerül.

A naplóadatok formátuma:

[Thread[], id[]]: log-string

A Proxy-modul működése során felmerülő kivételek szintén naplózásra kerülnek egy fájlba. Ehhez az alkalmazás JSON-objektumot hoz létre a következő formátumban:

{
 "uncaughtException":,
 "thread":,
 "message":,
 "trace": //Stack trace info
 [
 {
 "ClassName":
 "FileName":
 "LineNumber":
 "MethodName":
 },
 {
 "ClassName":
 "FileName":
 "LineNumber":
 "MethodName":
 }
 ]
}

Ezután átkonvertálja karakterlánc reprezentációra és naplózza.

A Proxy-modul indítása a megfelelő parancs beérkezése után történik. Amikor a Proxy-modul indítására vonatkozó parancsot kap, az alkalmazás elindítja a nevén lévő szolgáltatást . Az első indításakor a konfigurációs paraméterek alapértelmezett értékekkel történő inicializálása zajlik (a konfigurációs adatok tárolásának formátumáról és jelentéséről később lesz szó), és a fertőzött eszköz regisztrálása a vezérlő szerveren. A szerverhez HTTP POST-kérelmet küldenek a, amely a Proxy-modul működésének kezeléséért felelős – annak indításáért és leállításáért.

A szolgáltatás indításának lépései:

1. Elindít egy időzítőt, amely percenként egyszer ellenőrzi a Proxy-modul aktivitását. Ha a modul nem aktív – elindítja azt.
Ezen kívül a esemény bekövetkezésekor android.net.conn.CONNECTIVITY_CHANGE a Proxy-modul elindul.

2. Az alkalmazás létrehoz egy wake-lock-ot a következő paraméterrel PARTIAL_WAKE_LOCK és megszerezza azt. Így megakadályozza, hogy a készülék CPU-ja alvó állapotba kerüljön.

3. Elindítja a Proxy-modul parancsainak feldolgozásáért felelős osztályt, mielőtt naplózza a következő karakterláncot mainLog("start server") és

Server::start() host[], commandPort[], proxyPort[]

ahol proxy_cnc, command_port és proxy_port – paraméterek, amelyeket a Proxy-szerver konfigurációjából nyernek.

A parancsok feldolgozására szolgáló osztály neve CommandConnection. Az indítás után a következő műveleteket hajtja végre:

4. Csatlakozik a ProxyConfigClass.host: ProxyConfigClass.commandPort és oda JSON-formátumban elküldi a fertőzött készülékről szóló adatokat:

{
    "id":,
    "imei":,
    "imsi":,
    "model":,
    "manufacturer":,
    "androidVersion":,
    "country":,
    "partnerId":,
    "packageName":,
    "networkType":,
    "hasGsmSupport":,
    "simReady":,
    "simCountry":,
    "networkOperator":,
    "simOperator":,
    "version":
}

Ahol:

  • id – azonosító, próbálja meg megszerezni a "x" nevű Shared Preference fájlból az "id" mező értékét. Ha ezt az értéket nem sikerül megszerezni – új értéket generál. Így a Proxy-modul saját azonosítóval rendelkezik, amely a Bot ID-hez hasonlóan generálódik.
  • imei – a készülék IMEI-je. Ha az érték megszerzése során hiba történt – e mező helyett egy hibaüzenet szövege kerül beírásra.
  • imsi — Nemzetközi Mobil Előfizetői Azonosító. Ha az érték megszerzése során hiba lépett fel, akkor a mező helyett egy hibaüzenet szövege kerül rögzítésre.
  • model — A végfelhasználó által látható név a végtermékre vonatkozóan.
  • manufacturer — A termék/hardver gyártója (Build.MANUFACTURER).
  • androidVersion — szöveg formátumban, mint „ (),”.
  • country — az eszköz aktuális helyzete.
  • partnerId – üres string.
  • packageName – a csomag neve.
  • networkType — a jelenlegi hálózati kapcsolat típusa (például: „WIFI”, „MOBILE”). Hiba esetén null értéket ad vissza.
  • hasGsmSupport – true – ha a telefon támogatja a GSM-t, különben false.
  • simReady – a SIM-kártya állapota.
  • simCountry — az ISO kód az országhoz (a SIM-kártya szolgáltatója alapján).
  • networkOperator — az operátor neve. Ha az érték megszerzése során hiba lépett fel, akkor a mező helyett egy hibaüzenet szövege kerül rögzítésre.
  • simOperator — A Szolgáltató Neve (SPN). Ha az érték megszerzése során hiba lépett fel, akkor a mező helyett egy hibaüzenet szövege kerül rögzítésre.
  • version — ez a mező a konfigurációs osztályban tárolódik, a vizsgált bot verzió esetében értéke „1.6” volt.

5. Átáll a parancsok várakozási módjára a szervertől. A parancsok a következő formátumban érkeznek:

  • 0 offset – parancs
  • 1 offset – sessionId
  • 2 offset – hossz
  • 4 offset — adatok

A parancs érkezésekor az alkalmazás naplózza:
mainLog(„Fejléc { sessionId, type[], length[] }”)

A következő parancsok lehetségesek a szervertől:

NévParancsDataLeírás
connectionId0Kapcsolódási azonosítóÚj kapcsolat létrehozása
SLEEP3IdőFélbehagyja a Proxy-modul működését
PING_PONG4—Küldjön PONG üzenetet

A PONG üzenet 4 bájt hosszú és a következőképpen néz ki: 0x04000000.

A connectionId parancs befogadásakor (új kapcsolat létrehozására) CommandConnection példányt hoz létre az osztályból ProxyConnection.

  • A proxyzással két osztály vesz részt: ProxyConnection és end. Az osztály létrehozásakor ProxyConnection összekapcsolódik a címmel ProxyConfigClass.host: ProxyConfigClass.proxyPort és JSON objektumot küld:

 {
    "id":
}

A szerver válaszul egy SOCKS5 üzenetet küld, amely tartalmazza a távoli szerver címét, amellyel kapcsolatot kell létesíteni. A kapcsolat létrehozása a következő módon történik az osztállyal: end. Sémában a kapcsolat létrehozása így ábrázolható:

Hogyan csapolja meg az Android Gusftuff trójai a fiat és kripto pénzeket a fiókjaidból

Hálózati interakciók

A forgalom hálózati lehallgatók általi elemzésének megelőzése érdekében a CnC-szerver és az alkalmazás közötti interakció SSL protokoll segítségével védhető. Az összes továbbított adat, mind a szerverről, mind a szerverre JSON formátumban van. Az alkalmazás működése során a következő kéréseket hajtja végre:

  • http:///api/v1/set_state.php — a parancs végrehajtásának eredménye.
  • http://<%CnC%>/api/v1/get.php — a parancs lekérése.
  • http:///api/v1/load_sms.php — SMS-üzenetek letöltése a fertőzött eszközről.
  • http:///api/v1/load_ab.php — kapcsolatok listájának letöltése a fertőzött eszközről.
  • http:///api/v1/aevents.php – a lekérdezés a preference fájlban található paraméterek frissítésekor történik.
  • http:///api/v1/set_card.php — adatok letöltése a Google Play Marketnek álcázott phishing-ablakon keresztül szerzett információkról.
  • http:///api/v1/logs.php – naplóadatok letöltése.
  • http:///api/v1/records.php – phishing ablakokon keresztül szerzett adatok letöltése.
  • http:///api/v1/set_error.php – hibaértesítő.

Ajánlások

A mobil trójai fenyegetések elleni védelem érdekében a vállalatoknak átfogó megoldásokat kell használniuk, amelyek lehetővé teszik a felhasználói eszközök további szoftvertelepítése nélkül a káros tevékenységek nyomon követését és figyelmeztetések küldését.

Ehhez a mobil trójaiak észlelésére vonatkozó aláírási módszereket a kliens és az alkalmazás viselkedéselemző technológiákkal kell kiegészíteni. A védelemnek magában kell foglalnia az eszközök azonosítását digitális lenyomat technológiával, amely lehetővé teszi, hogy megértsük, mikor használják a fiókot szokatlan eszközről, és már a csalók kezébe került.

Különösen fontos, hogy lehetőség legyen a többcsatornás elemzésre, mivel ez lehetővé teszi a cégek számára, hogy ellenőrizzék a kockázatokat, amelyek nemcsak az interneten, hanem a mobil csatornán is felmerülnek, például a mobilbanki alkalmazásokban, kriptovaluta ügyletek során és bármilyen más esetben, ahol pénzügyi tranzakció történhet.

Biztonsági szabályok a felhasználók számára:

  • ne telepítsenek Android OS-t futtató mobilalkalmazásokat olyan forrásokból, amelyek nem a Google Play, és figyeljenek a kérésre vonatkozó alkalmazásjogosultságokra;
  • rendszeresen telepítsék az Android OS frissítéseit;
  • figyeljen a feltöltött fájlok kiterjesztésére;
  • ne látogasson gyanús webhelyeket;
  • ne kattintson az SMS-üzenetekben kapott linkekre.

Részvétel Rogachev Magok, a Group-IB Számítástechnikai Kriminalisztikai Laboratóriumának kártevő kutatója.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster