私の目標は、システムをだましたり、検疫から逃れたりすることではなかったとすぐに言います。私は正直に2週間家で過ごしました。さて、私はビールを求めて最寄りの店に数回行きました。目標は、このシステムが私たちについて何を知っているか、そしてその作者の声明のいくつかがどれほど真実であるかを見ることでした。最初は予備情報の収集を始めました。私は次のようなものを見つけました:
- このアプリケーションは、ガベージトラックトラッカープログラムに基づいて作成されています。私が正気の確認を見つけられなかったこと、そしてプログラムの内部を掘り下げたこともそのようなことを確認しませんでした。
- ベータ版はいかなる方法でも保護されておらず、逆コンパイルされてgithubにアップロードされました。ただし、著作権所有者の要請によりgithubから削除されました。
- ベータ版は、顔認識サービスを使用するために写真をエストニアのサーバーに送信しました。
- 次に、DIT Eduard Lysenkoの責任者の声明を読みました。「モスクワのDITの責任者は、アプリケーションがサードパーティのサーバーに写真を送信するという情報を断固として否定しました。「実際、どこにも何も転送されません」と彼は言いました。-まず、原則として写真は転送されません。第二に、表示されるバイオメトリックコードは、DITサーバーにのみ送信されます。」ここで私はすでにこれらの写真が原則としてどのように送信されないのか疑問に思いました。それらはスマートフォンでバイオメトリックコードに変換されていますか?
- プログラムの新しいバージョンは非常に難解であり、今ではそれを分析することはほとんど不可能です。
それから私は友人や知人から噂を集めました:
- 実際、1枚の写真ではなく、一連の写真が送信されます。これは、紙の写真を撮ることができないようにするためです。または、ビデオも送信されています。
- , .
私は正直に「ライブ」アプリケーションをiPhoneに配置しましたが、まったく使用する予定はありませんでした。私はジェイルブレイクをすることができるiPhoneを持っていませんでしたが、私は根付いたAndroidを持っていました。私は彼から始めました。ちなみに、ルート化されたAndroidでは、アプリケーションは起動しません。 Javaコードをわかりにくくするのは面白そうです。すべての変数と関数名の名前が変更されました。しかし、チェーンをたどると、完全に読み取り可能なコードにたどり着きます。サプライズの最後にのみ、ディスアセンブラーのリストをどのようにウォークスルーするか。このコードを掘り下げるのに少なくとも数日は費やしましたが、突然、より簡単な解決策を思いつきました。しかし、もし...彼らがSSL証明書をチェックするためにOSを信頼しているとしたらどうでしょうか?職場では、Apple、Google、Whatsapp、その他多くのプロトコルを逆にする必要がある場合があります。ほとんどすべてのシステムで、ルート証明書はプログラム内でステッチされているため、トラフィックの分析は非常に困難です。
最小限の設定で非常に便利なトラフィックアナライザであるMacBookにmitmproxyを配置しました。私は彼らのルート証明書をダウンロードし、iPhoneにプロファイルを追加します-そしてそれだけです!プログラムのすべてのトラフィックが一目でわかります。
アプリケーション登録
検疫開始から24時間以内にアプリケーションをインストールして登録する必要があります。この際、SMSが入ります。以前は、これを行うことは意味がありません。電話だけがデータベースに見つかりません。登録リクエストは次のようになります。
<b>2020-09-12 17:48:03 POST https://sm-a-a90ae4b5a.mos.ru/api/covid/device/password HTTP/2.0
← 200 application/json 82b 156ms
{
"deviceId": "2FFA9DB6-4900-4973-B1AE-BA5874BEXXXX",
"phone": "7925xxxyyzz"
}</b>
それに応じて、私たちは常に「200OK」を取得します。電話がデータベースにある場合は、アプリケーションに入力する必要のあるコードが記載されたSMSを受信します。データベースに電話がない場合、何も起こりません。deviceIdには、iPhoneのUDIDが含まれています。すべてがこの識別子に関連付けられています。iPhoneが壊れて、バックアップから新しいiPhoneを取得した場合、アプリケーションは機能しません。そして、どのように対処するかが明確でない罰金があります。以下、個人データの全部または一部を「XXYYZZ」に置き換えます。
送信を調整する
それから私は勇気を振り絞って、mitmproxyを介して「ライブ」電話を接続しました。5〜10分ごと、およびアプリケーションの起動時に、次の要求が行われます。
2020-09-12 17:56:32 POST https://sm-a-a90ae4b5a.mos.ru/api/covid/device/60B1A8A1-2AD9-447C-BB25-91YYYYY19C6E/message
HTTP/2.0
← 200 application/json 83b 84ms
[
{
"accuracy": 65,
"battery_level": 68,
"charge": false,
"datetime": "2020-09-12T14:56:32Z",
"device_model": "iPhone 11 Pro",
"indoorNavigation": {
"bluetoothDevices": [],
"wifiDevices": [
{
"name": "wifi-XXX",
"rssi": 0
}
]
},
"install_datetime": "2020-09-08T07:57:11Z",
"lat": 55.XXZZZ732239728,
"locationDatetime": "2020-09-12T14:56:31Z",
"locationStatus": {
"gps": true,
"isPermissionGranted": true,
"network": true,
"passive": true
},
"lon": 37.YYZZZ270607305,
"os_version": "iOS 13.7.0",
"version_ext": "1.7 (127)"
}
]
ここでもdeviceIdが表示されますが、これは異なります。iPadから最初にリクエストしたものです。
精度-座標を決定する精度、どの単位で
バッテリーレベルかわかりません-バッテリー充電レベル。なぜ彼はDITなのかしら?
Charge-電話が充電されているかどうか。なぜ送信されるのかも不明です。
datetime-現在の日付と時刻。おそらく、デバイスの時間を「ねじる」ことが不可能になるように使用されます。
device_model-電話モデル。さて、DITがこれを知ったとしても申し訳ありません。
IndoorNavigationはかなり興味深いものです。これは、座標を決定できる既知のWi-Fiネットワークのリストです。ただし、BSSIDは送信されないため、この情報はまったく役に立ちません。ネットワークの名前で座標を決定することはできません。
install_datetime-これらの要求のエミュレートから保護するために使用できます。この情報は必要に応じて取得でき、非常に簡単ですが。
lat、lon-実際には
location_status座標-GPSが有効になっているかどうか、およびプログラムがバックグラウンドでGPSを使用できるかどうか。そうでない場合は、罰金が科せられます。
os_version-iOSバージョン
version_ext-は理解していませんでした。おそらくアプリケーション自体のバージョンです。
Selfie転送
楽しみが始まります。撮影したセルフを転送する瞬間にトラフィックをスニッフィングします。では、バイオメトリックハッシュとビデオはどこにありますか?実際に起こることは次のとおりです。
<b>2020-09-12 18:00:15 POST https://sm-a-a90ae4b5a.mos.ru/api/covid/device/60B1A8A1-2AD9-447C-BB25-91YYYYY9C6E/photo
HTTP/2.0
← 200 application/json 39b 301ms
Request Response Detail
:authority: sm-a-a90ae4b5a.mos.ru
content-type: multipart/form-data; boundary=alamofire.boundary.04b478f466f0605d
accept: */*
shard: 6
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTk1NjYzMjl9.iq-noX2tu13tr4ut7sBWpgWl77sELkT
kXCdODK9yvL8
֞ostype: iOS
accept-language: en-RU;q=1.0, ru-RU;q=0.9, cs-RU;q=0.8
accept-encoding: br;q=1.0, gzip;q=0.9, deflate;q=0.8
versionext: 1.7 (127)
content-length: 378238
֘user-agent:
cookie: session-cookie=163402e73a984c296450ad1fdcb1815835321af39172a2bef8658e48071941dc73acdb9d1d976170d2ef9
70da45f5c87
Multipart form [m:auto]
҅Form data:
photo: ..JFIF..... . .. . Exif..MM.*.............................J...........R.(.......... i.........Z....... .....</b>
さて、すべてが明確ですよね?この部分はもう少し強力に保護されています。リクエストには、承認を整理するためのベアラートークンも含まれています。盗聴しなかったトークンを受け取った瞬間、おそらくトークンはセルフをリクエストしたときに来ます。ちょうど1枚の写真が残ります。リセンコさん、あなたのバイオメトリックハッシュはどこにありますか?
ステータスリクエストと検疫リリース
アプリケーションは、座標の送信に加えて、定期的にステータス要求も行います。ちなみに、ステータスをリクエストすると、セルフ撮影のリクエストが来る可能性があります。アプリケーションが自分自身を要求するのをやめたとき、私は興味のためにステータス要求を盗聴しました:
<b>2020-09-18 13:28:13 GET https://sm-a-a90ae4b5a.mos.ru/api/covid/device/60B1A8A1-2AD9-447C-BB25-91XXXXX19C6E/status
HTTP/2.0
← 200 application/json 317b 181ms
{
"code": 0,
"io": " .",
"last_android_version": "1.1.1",
"last_ios_version": "1.0",
"message": " ! -",
"quarantine": null,
"status": "active"
}</b>
サーバーの応答で最も興味深いのは、「quarantine:null」です。これは、検疫が終了したことを意味します。しかし、アプリはあなたにそれを教えてくれません。さらに、メッセージの中で彼らはまだ自分自身を要求することを約束します。そして、ステータスはまだアクティブです。そして座標...まあ、もちろん、アプリケーションはデバイスの座標をDITサーバーに送信し続けます!したがって、検疫が終了したらすぐにアプリケーションをアンインストールしてください。
何ができるか
書かれていることから、アプリケーションの操作をエミュレートし、必要なすべてのデータを送信するスクリプトを記述できることは明らかです。テスト中にペナルティを簡単に拾うことができるため、書き込みが困難になります。まず、コード付きのSMSを受信するときを含め、登録プロセス全体を最後までスニッフィングする必要があります。ベアラー認証やその他の雑用に対処します。彼らが写真のEXIF記録を分析する可能性があります。正確な時間と座標があります。したがって、解決策は、事前に多くの異なる写真を作成し、送信する前にその場でEXIFを編集することです。
結論として、特にコロナウイルスの陽性検査で、検疫に違反するように誰にも促さないことを言いたいと思います。これは、システムの分析と、奇妙な公の声明を出すのが好きなDITの庭にある小さな小石です。病気にならないでください!