社会监控应用:流量分析

一切始于抵达莫斯科。不出所料,我通过了covid所需的PCR测试,等待结果否定,然后将其上传到国家服务局,然后……决定这就是我莫斯科冒险之旅的终点。但是事实证明并非如此简单。一位医生突然来找我。他还下达了一​​项法令,规定我必须在隔离区呆两周,因为一个受感染的人正与我一起在飞机上飞行。我听到了很多有关Social Monitoring应用程序的信息,甚至阅读了有关Habré的文章,人们在其中挖掘了其Beta版本。那么,什么样的研究人员不会被诱惑去研究如此有趣的应用程序?



我将立即说,我的目标不是欺骗系统或逃脱隔离。老实说,我在家里呆了两个星期。好吧,我几次去最近的商店买啤酒。目的是了解该系统对我们的了解以及其作者的某些陈述是多么真实。首先,我开始收集初步信息。我发现类似以下内容:



  1. 该应用程序是根据垃圾车跟踪程序编写的。我没有找到理智的确认,并且深入研究程序的内部也没有确认任何此类内容。
  2. Beta版本未受到任何保护,已反编译并上传到github。但是,应版权所有者的要求将其从github中删除。
  3. 测试版将图片传输到爱沙尼亚的服务器以使用人脸识别服务。
  4. 然后,我读了DIT负责人爱德华·利森科(Eduard Lysenko)的声明,他说:“莫斯科DIT负责人明确拒绝了该应用程序将照片传输到第三方服务器的信息:“实际上,什么都没有转移到任何地方,”他说。-首先,原则上不传输照片。其次,出现的生物特征识别码将专用于DIT服务器。” 在这里,我已经想知道这些图像原则上是如何传输的。它们会直接在您的智能手机上转换为生物识别代码吗?
  5. 该程序的新版本非常混乱,现在几乎无法对其进行分析。


然后,我从朋友和熟人那里收集了谣言:



  1. 实际上,不是传送一张照片,而是传送一系列照片。这样做是为了使您无法拍摄纸质照片。甚至视频正在传输。
  2. , .


老实说,我将“实时”应用程序放在iPhone上,根本不打算使用它。我没有iPhone可以越狱,但我拥有扎根的Android。我从他开始。顺便说一句,在根植的Android上,应用程序无法启动。混淆Java代码看起来很有趣。所有变量和函数名称均已重命名。但是,遍历整个链,我们发现自己处在完全可读的代码段中。大约在惊奇的结尾,大约如何遍历反汇编程序清单。我至少要花几天的时间来研究这段代码,但是突然我想到了一个更简单的解决方案。但是,如果...他们信任操作系统检查SSL证书怎么办?在工作中,有时我不得不颠倒Apple,Google,Whatsapp和许多其他协议。在几乎所有系统中,根证书都被缝合在程序内部,这使得分析流量非常困难。



我将mitmproxy放在MacBook上,这是一款非常便捷的流量分析器,只需最少的设置。我下载了他们的根证书,将配置文件添加到iPhone-就是这样!我们一目了然地看到了该程序的所有流量。



申请注册



您需要在隔离开始后的24小时内安装并注册该应用程序。在这种情况下,会收到一条短信。以前,这样做是没有意义的,只是在数据库中找不到电话。这是注册请求的样子:



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


作为回应,我们总是得到“ 200 OK”,仅此而已。如果电话在数据库中,您将收到一条SMS,其中包含必须输入到应用程序中的代码。如果数据库中没有电话,则什么也不会发生。deviceId包含iPhone的UDID。一切都与该标识符相关。如果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?

充电-手机是否正在充电。还不清楚为什么它被传输。

datetime-当前日期和时间。也许使用它是为了不可能“拉紧”设备上的时间。

device_model-手机型号。好吧,如果DIT对此有所了解,我不会感到遗憾。

室内导航非常有趣。这是已知无线网络的列表,您可以通过它们确定坐标。但是,没有发送BSSID,这使得该信息完全无用。坐标不能由网络名称确定。

install_datetime-可用于防止模拟这些请求。尽管可以根据需要获得此信息,而且非常简单。

lat,lon(实际上是

location_status坐标)-是否启用了GPS,以及是否允许程序在后台使用它。如果没有,将被罚款。

os_version-iOS版本

version_ext-无法理解,也许是应用程序本身的版本



自拍转移



有趣的开始。在传输已拍摄的自拍照时嗅探流量。那么我们的生物识别哈希和视频在哪里?这是实际发生的情况:



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


好吧,一切都清楚了吧?这部分的保护要强一些,请求还包含承载令牌,通过该令牌组织授权。我没有嗅到接收令牌的时刻,也许令牌是在请求自拍照时出现的。恰好一张照片离开。里森科先生,您的生物识别哈希值在哪里?



状态请求和隔离释放



除了发送坐标外,应用程序还会定期发出状态请求。顺便说一句,当您请求状态时,可能会发出拍摄自拍照的请求。当应用程序停止要求我提供自拍照时,出于兴趣的缘故,我嗅到了状态请求:



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


服务器响应中最有趣的是“隔离:空”。这意味着隔离已结束。但是该应用程序不会告诉您。此外,他们在邮件中仍然承诺要求自拍照。并且状态仍处于活动状态。和坐标...好吧,当然,应用程序会继续将设备坐标发送到DIT服务器!因此,隔离结束后,请立即卸载应用程序。



可以做什么



根据已编写的内容,很明显,您可以编写一个脚本来模拟应用程序的操作并发送所有必要的数据。由于在测试过程中很容易受到惩罚,因此使编写变得困难。首先,您需要将整个注册过程嗅探到最后,包括在收到带有代码的SMS时。处理承载认证和其他琐事。他们有可能分析照片的EXIF记录。其中有确切的时间和坐标。因此,解决方案将是预先制作许多不同的照片,并在发送之前即时编辑EXIF。



好吧,总而言之,我想说的是,我绝不敦促任何人违反隔离规定,尤其是对冠状病毒进行阳性检测时。这只是对系统的分析和DIT花园中的小卵石,他们喜欢发表奇怪的公开声明。不要生病!



All Articles