• Android移动安全攻防实战 第四章 MobSF移动安全框架


    1.MobSF可以对Android进行快速高效的移动分析。分析漏洞或者恶意代码非常好,而且还有很多其他功能。用python写的 使用Django开发的。
    虽然下载挺麻烦。但是找到官网就可以比较顺利。
    github上的release版
    下载MobSF的环境
    官网介绍 也是环境。

    官网有个翻译不对劲
    在这里插入图片描述
    在这里插入图片描述
    (本来是Ubuntu/Debian based Linux是Ubuntu或者是基于Linux的设备,直接翻译成操作指南就很怪。)
    2. 因为我就用了Upload并且静态分析所以就分析Upload吧。
    在mobsf\MobSF\views\home.py里面
    输入的分析request,扫描request,拿到内容类型,对应类型去扫描

     def upload(self):
            request = self.request
            scanning = Scanning(request)
            content_type = self.file.content_type
            file_name = self.file.name
            logger.info('MIME Type: %s FILE: %s', content_type, file_name)
            if self.file_type.is_apk():
                return scanning.scan_apk()
            elif self.file_type.is_xapk():
                return scanning.scan_xapk()
            elif self.file_type.is_apks():
                return scanning.scan_apks()
            elif self.file_type.is_zip():
                return scanning.scan_zip()
            elif self.file_type.is_ipa():
                return scanning.scan_ipa()
            elif self.file_type.is_appx():
                return scanning.scan_appx()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    转到下面这个apk

        def scan_apk(self):
            """Android APK."""
            md5 = handle_uploaded_file(self.file, '.apk')
            data = {
                'analyzer': 'static_analyzer',
                'status': 'success',
                'hash': md5,
                'scan_type': 'apk',
                'file_name': self.file_name,
            }
            add_to_recent_scan(data)
            logger.info('Performing Static Analysis of Android APK')
            return data
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    取了md5,然后把数据放到data里面,添加最近扫描然后返回data数据

    接下来是静态分析。
    Mobile-Security-Framework-MobSFmaster\mobsf\StaticAnalyzer\views\android\static_analyzer.py

     if typ == 'apk':
                    app_dic['app_file'] = app_dic['md5'] + '.apk'  # NEW FILENAME
                    app_dic['app_path'] = (
                        app_dic['app_dir'] / app_dic['app_file']).as_posix()
                    app_dic['app_dir'] = app_dic['app_dir'].as_posix() + '/'
                    # Check if in DB
                    # pylint: disable=E1101
                    db_entry = StaticAnalyzerAndroid.objects.filter(
                        MD5=app_dic['md5'])
                    if db_entry.exists() and not rescan:
                        context = get_context_from_db_entry(db_entry)
     else:
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    如果文件类型是apkname就先把信息放好,然后检查数据库里有没有之前存过。
    如果是第一次那就接着

          app_dic['size'] = str(file_size(app_dic['app_path'])) + 'MB'  # FILE SIZE
                        app_dic['sha1'], app_dic[
                            'sha256'] = hash_gen(app_dic['app_path'])
                        app_dic['files'] = unzip(
                            app_dic['app_path'], app_dic['app_dir'])
                        logger.info('APK Extracted')
                         app_dic['certz'] = get_hardcoded_cert_keystore(app_dic[
                                                                       'files'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    提取Path,然后解压。得到硬编码证书库(大概)
    解析Manifest.xml文件

     # Manifest XML
                        mani_file, mani_xml = get_manifest(
                            app_dic['app_path'],
                            app_dic['app_dir'],
                            app_dic['tools_dir'],
                            '',
                            True,
                        )
                        app_dic['manifest_file'] = mani_file
                        app_dic['parsed_xml'] = mani_xml
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    得到app名字

        # get app_name
                        app_dic['real_name'] = get_app_name(
                            app_dic['app_path'],
                            app_dic['app_dir'],
                            app_dic['tools_dir'],
                            True,
                        )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    拿到icon图标

         # Get icon
                        res_path = os.path.join(app_dic['app_dir'], 'res')
                        app_dic['icon_hidden'] = True
    
    • 1
    • 2
    • 3

    manifest_analysis是对Manifest解析比如权限啥的。
    get_app_details是知道app在应用商店的细节。

    
                        # Set Manifest link
                        app_dic['mani'] = ('../manifest_view/?md5='
                                           + app_dic['md5']
                                           + '&type=apk&bin=1')
                        man_data_dic = manifest_data(app_dic['parsed_xml'])
                        app_dic['playstore'] = get_app_details(
                            man_data_dic['packagename'])
                        man_an_dic = manifest_analysis(
                            app_dic['parsed_xml'],
                            man_data_dic,
                            '',
                            app_dic['app_dir'],
                        )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    分析elf和证书

       elf_dict = elf_analysis(app_dic['app_dir'])
                        cert_dic = cert_info(
                            app_dic['app_dir'],
                            app_dic['app_file'])
    
    • 1
    • 2
    • 3
    • 4

    使用了apkid来检测用了啥混淆封装编译器。

      apkid_results = apkid_analysis(app_dic[
                            'app_dir'], app_dic['app_path'], app_dic['app_name'])
    
    • 1
    • 2

    检测跟踪器

    tracker = Trackers.Trackers(
                            app_dic['app_dir'], app_dic['tools_dir'])
    
    • 1
    • 2

    apk转java,java转smali,分析代码

       apk_2_java(app_dic['app_path'], app_dic['app_dir'],
                                   app_dic['tools_dir'])
    
                        dex_2_smali(app_dic['app_dir'], app_dic['tools_dir'])
    
                        code_an_dic = code_analysis(
                            app_dic['app_dir'],
                            'apk',
                            app_dic['manifest_file'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    得到string

    
                        # Get the strings from android resource and shared objects
                        string_res = strings_from_apk(
                            app_dic['app_file'],
                            app_dic['app_dir'],
                            elf_dict['elf_strings'])
                        if string_res:
                            app_dic['strings'] = string_res['strings']
                            app_dic['secrets'] = string_res['secrets']
                            code_an_dic['urls_list'].extend(
                                string_res['urls_list'])
                            code_an_dic['urls'].extend(string_res['url_nf'])
                            code_an_dic['emails'].extend(string_res['emails_nf'])
                        else:
                            app_dic['strings'] = []
                            app_dic['secrets'] = []
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    检查有没有用FireBase
    提升app功能的工具库

      # Firebase DB Check
                        code_an_dic['firebase'] = firebase_analysis(
                            list(set(code_an_dic['urls_list'])))
    
    • 1
    • 2
    • 3

    检查存在的域名并且检查恶意软件

      # Domain Extraction and Malware Check
                        logger.info(
                            'Performing Malware Check on extracted Domains')
                        code_an_dic['domains'] = MalwareDomainCheck().scan(
                            list(set(code_an_dic['urls_list'])))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    复制图标

     # Copy App icon
                        copy_icon(app_dic['md5'], app_dic['icon_path'])
                        app_dic['zipped'] = 'apk'
    
    
    • 1
    • 2
    • 3
    • 4

    然后放到数据库里。
    好多😅

    在这里插入图片描述
    简单分析了下43某9。
    有反虚拟机
    在这里插入图片描述
    在这里插入图片描述
    ollvm
    在这里插入图片描述
    竟然在河南有服务器。
    使用的sdk?和检测出来的字符串
    在这里插入图片描述

  • 相关阅读:
    JavaScript设计模式之责任链模式
    阿里云r8i内存型服务器ECS实例介绍_CPU性能_网络存储测评
    mac中安装Homebrew
    牛客网国庆赛day3
    ffplay使用dxva2实现硬解渲染
    map、reduce、filter等常与lambda配合使用的函数【Python】
    Eclipse - Text Editors (文本编辑器)
    Pyspider 使用带认证redis集群作为消息队列
    Linux下将驱动编译进内核
    vue3使用less与scss
  • 原文地址:https://blog.csdn.net/v_3483608762/article/details/126708868