当前位置:   article > 正文

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

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

然后放到数据库里。
好多

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/460988
推荐阅读
相关标签