只有我看到DIVA的时候想到的是D.VA嘛?!滑稽脸

I. 什么是DIVA


DIVA(Damn insecure and vulnerable App)是一个故意设计的存在很多漏洞的Android app,目的是为了让开发、安全工程师、QA等了解Android app常见的一些安全问题,类似dvwa,也可以把它当成一个漏洞演练系统。

为了使用DIVA熟悉各种常见的app安全问题,需要做一些准备工作。

准备工作:

1,安装JDK,很多工具需要用到java环境;

2,安装Android开发工具(ADT,Android studio),下载地址:

https://developer.android.com/studio/index.html

主要包括SDK管理器,安卓虚拟设备管理器(Android Virtual Device,AVD)等,并且集成了adb、emulator等常用工具。dex2Jar、adb是Android app测试常用到的工具,emulator是ADT自带的模拟器,可以模拟Android环境。

3,安装APKtool、Drozer、dex2jar、JD-GUI

Apktoolss下载地址:https://bitbucket.org/iBotPeaches/apktool/downloads

Drozer下载地址:https://labs.mwrinfosecurity.com/tools/drozer/

Dex2jar下载地址:https://sourceforge.net/projects/dex2jar/?source=typ_redirect

JD-GUI下载地址:http://jd.benow.ca/

首先运行Android模拟器,可以使用如下命令:

1
2
3
4
5
6
7
#列出已经建立好的AVD,也就是模拟器
her0ma@localhost:~/software/SDK/tools$ ./emulator -list-avds
Nexus_4
Nexus_5X_API_19
Nexus_6
#启动模拟器,-avd参数指定模拟器的名称
her0ma@localhost:~/software/SDK/tools$ ./emulator -avd Nexus_4

4,下载并安装DIVA,下载地址: http://www.payatu.com/wp-content/uploads/2016/01/diva-beta.tar.gz

使用adb安装DIVA app到模拟器,命令如下:

1
2
3
4
her0ma@localhost:~/software/SDK/platform-tools$ ./adb install /Users/her0ma/software/diva-beta.apk
[100%] /data/local/tmp/diva-beta.apk
    pkg: /data/local/tmp/diva-beta.apk
Success

如果开启了多个模拟器,可以用-s参数来指定具体要安装到那台模拟器。

5,打开已经安装好的DIVA app,如图所示:

II. 反编译App


对Android app进行静态分析是一种常见的漏洞查找方式,可以使用Dex2Jar获取app的.java文件。命令如下:

1
2
her0ma@localhost:~/software/dex2jar$ sudo ./d2j-dex2jar.sh /Users/her0ma/software/diva-beta.apk
dex2jar /Users/her0ma/software/diva-beta.apk -> ./diva-beta-dex2jar.jar

会在工具同目录下生成一个.jar文件,可以用JD-GUI工具直接打开diva-beta-dex2jar.jar文件

III. 使用apktool获取smail代码


Android app静态分析的时候,可以通过AndroidManifest.xml文件来了解app及其内部结构的一些信息,可以使用apktool获取这个文件以及smali代码,如图:

使用到的命令:

1
2
3
4
5
6
7
8
9
10
11
12
her0ma@localhost:~/software/SDK/tools$ java -jar apktool_2.2.0.jar d /Users/her0ma/software/diva-beta.apk -o 360bobao
I: Using Apktool 2.2.0 on diva-beta.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /Users/her0ma/Library/apktool/framework/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...

会将提取出来的xml以及smali文件输出到360bobao这个目录。

IV. 问题1:不安全的日志输出


该问题主要是由于app代码中将敏感信息输出到app的logcat中,查看app记录的logcat,可以使用如下命令:

1
her0ma@localhost:~/software/SDK/platform-tools$ ./adb logcat

然后在app的表单中输入内容,check out就可以看到相关的日志输出:

1
2
3
4
09-20 20:09:16.631  1538  1598 D ConnectivityService: NetworkAgentInfo [MOBILE (UMTS) - 101] validation failed
09-20 20:09:43.466  2557  2557 E diva-log: Error while processing transaction with credit card: 6225880111111111
09-20 20:09:43.613  1198  1583 D AudioFlinger: mixer(0xf4580000) throttle end: throttle time(154)
09-20 20:09:45.474  2557  2570 E Surface : getSlotFromBufferLocked: unknown buffer: 0x7f18601fd050

可以看出用户输入的内容被输出到了日志中,看看具体的漏洞代码,用JD-GUI打开LogActivity.class文件,相关代码如图:

下面这行代码就是将用户输入的内容记录到了logcat中。

1
Log.e("diva-log", "Error while processing transaction with credit card: " + paramView.getText().toString());

V. 问题2:硬编码问题


很多开发小伙伴在开发app的时候,明明是可以用可变变量的,但是由于没有相关安全开发意识,使用了硬编码的方式,导致存在一定的安全风险。具体有关硬编码的定义可以参考百度,开发人员在开发的过程中应该尽量避免使用硬编码。先看看问题2涉及到的代码HardcodeActivity.class,JD-GUI打开,相关代码如下:

1
2
3
4
5
6
7
8
9
public void access(View paramView)
  {
    if (((EditText)findViewById(2131492987)).getText().toString().equals("vendorsecretkey"))
    {
      Toast.makeText(this, "Access granted! See you on the other side :)", 0).show();
      return;
    }
    Toast.makeText(this, "Access denied! See you in hell :D", 0).show();
  }

秘钥被明文写在了代码中,通过判断用户的输入是否和代码中的明文秘钥相同,来确定是否允许访问,对应代码:

1
if (((EditText)findViewById(2131492987)).getText().toString().equals("vendorsecretkey"))

攻击者只需要在app中输入秘钥就可以访问成功,如图:

后文中会继续讨论有关硬编码的问题。

VI. 问题3:不安全的数据存储


不安全的数据存储也是App常见的安全问题之一,主要有三种方式:

1,将敏感数据保存到配置文件中;

2,将敏感数据保存在本地的sqlite3数据库中;

3,将敏感数据保存在临时文件或者sd卡中。

在DIVA中关于此项问题的案例主要是3、4、5、6,首先看敏感数据存储在配置文件中的情况,对应的漏洞代码文件InsecureDataStorage1Activity.class,继续用JG-GUI打开,漏洞代码片段如下:

1
2
3
4
5
6
7
8
9
10
public void saveCredentials(View paramView)
  {
    paramView = PreferenceManager.getDefaultSharedPreferences(this).edit();
    EditText localEditText1 = (EditText)findViewById(2131493000);
    EditText localEditText2 = (EditText)findViewById(2131493001);
    paramView.putString("user", localEditText1.getText().toString());
    paramView.putString("password", localEditText2.getText().toString());
    paramView.commit();
    Toast.makeText(this, "3rd party credentials saved successfully!", 0).show();
  }

上面问题代码中,使用了SharedPreferences类,该类是Android平台上一个轻量级的存储类,主要是用来保存一些常用的配置,本例中是用该类存储了用户名和密码,因此是具有风险的。SharedPreferences类存储的数据会以.xml的形式存储在/data/data/apppackagename/shared_prefs目录下。如图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#adb shell进入到模拟器的shell模式下
her0ma@localhost:~/software/SDK/platform-tools$ ./adb shell
#app安装之后会在/data/data下有相关的数据目录,保存缓存、配置文件等。
root@generic_x86_64:/ # cd /data/data/
root@generic_x86_64:/data/data # ls |grep diva
jakhar.aseem.diva
root@generic_x86_64:/data/data/jakhar.aseem.diva # ls
cache
code_cache
databases
shared_prefs
root@generic_x86_64:/data/data/jakhar.aseem.diva/shared_prefs # ls
jakhar.aseem.diva_preferences.xml
#在配置文件中看到了app中用户输入的账号和密码。
root@generic_x86_64:/data/data/jakhar.aseem.diva/shared_prefs # cat jakhar.aseem.diva_preferences.xml                                  
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <string name="user">admin</string>
    <string name="password">admin</string>
</map>

另外一种不安全的数据库存储,是将用户的敏感信息存储到本地的数据库中,一般app对应的数据库目录:

/data/data/apppackagename/databases,本例中是: /data/data/jakhar.aseem.diva/databases,如图先在4中保存一下数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
adb pull将模拟器中的文件拉倒本地
her0ma@localhost:~/software/SDK/platform-tools$ ./adb pull /data/data/jakhar.aseem.diva/databases/ids2 /Users/her0ma/software/
[100%] /data/data/jakhar.aseem.diva/databases/ids2
用sqlite3数据库打开,可以查看到用户存储的敏感数据
her0ma@localhost:~/software$ file ids2
ids2: SQLite 3.x database
her0ma@localhost:~/software$ sqlite3 ids2
SQLite version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for usage hints.
sqlite> .tables
android_metadata  myuser
sqlite> select * from myuser;
zhangsan|p@ssw0rd

对应的漏洞文件InsecureDataStorage2Activity.class代码片段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void saveCredentials(View paramView)
  {
    paramView = (EditText)findViewById(2131493003);
    EditText localEditText = (EditText)findViewById(2131493004);
    //将用户提交的数据保存在了数据库中
    try
    {
      this.mDB.execSQL("INSERT INTO myuser VALUES ('" + paramView.getText().toString() + "', '" + localEditText.getText().toString() + "');");
      this.mDB.close();
      Toast.makeText(this, "3rd party credentials saved successfully!", 0).show();
      return;
    }
    catch (Exception paramView)
    {
      for (;;)
      {
        Log.d("Diva", "Error occurred while inserting into database: " + paramView.getMessage());
      }
    }
  }

还有一种不安全的数据存储,是将数据存储在临时文件或者sd卡中,看对应的漏洞文件分别是InsecureDataStorage3Activity.class、InsecureDataStorage3Activity.class的相关代码片段如图:

存储在临时文件中,

存储在sd卡中,漏洞代码片段:

本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:http://resources.infosecinstitute.com/cracking-damn-insecure-and-vulnerable-app-diva-part-1/#article

【技术分享】Android App常见安全问题演练分析系统-DIVA-Part1相关推荐

  1. android系统性能优化(63)---Android APP 卡顿问题分析及解决方案

    Android APP 卡顿问题分析及解决方案 用户对卡顿的感知, 主要来源于界面的刷新. 而界面的性能主要是依赖于设备的UI渲染性能. 如果我们的UI设计过于复杂, 或是实现不够友好,计算绘制算法不 ...

  2. c++builder启动了怎么停止_App 竟然是这样跑起来的 —— Android App/Activity 启动流程分析...

    在我的上一篇文章: AJie:按下电源键后竟然发生了这一幕 -- Android 系统启动流程分析​zhuanlan.zhihu.com 我们分析了系统在开机以后的一系列行为,其中最后一阶段 AMS( ...

  3. Android app security安全问题总结

    数据泄漏 本地文件敏感数据不能明文保存,不能伪加密(Base64,自定义算法等) android:allowbackup=false. 防止 adb backup 导出数据 Activity inte ...

  4. Android APP常见的5类内存泄露及解决方法

    Android APP常见的5类内存泄露及解决方法 参考文章: (1)Android APP常见的5类内存泄露及解决方法 (2)https://www.cnblogs.com/genggeng/p/7 ...

  5. 【23年1月17日】基于Flask技术的全国气象数据采集及可视化分析系统,支持城市定制服务

    基于Flask技术的全国气象数据采集及可视化分析系统 项目获取 项目简介 项目功能 项目技术 运行截图 特别说明 项目源码 项目获取 项目下载地址:是云猿实战 项目经过多人测试运行,可以确保100%成 ...

  6. Android之常见安全问题

    Android 常见安全问题 组件安全 Activity访问权限的控制(可能会导致恶意调用页面,接收恶意数据) 1.私有Activity不应被其他应用启动且应该确保相对是安全的 2.关于Intent的 ...

  7. android声纹识别技术,基于Android平台的声纹识别系统的研究与实现

    摘要: 社会的发展越来越快,计算机技术的应用也愈来愈广,已经渗透到生活的各个方面.在快节奏.信息化的时代,需要识别和交互的应用日益广泛,要求验证身份的场合越来越多,迅速判定一个人的身份是一个非常重要的 ...

  8. Android内核开发:学会分析系统的启动log

    本文是<Android内核开发>系列的第八篇文章,本文主要关注如何分析Android系统的启动log,学会通过搜索重要的TAG标签,找到Android启动过程中的重要节点. 要学会分析系统 ...

  9. Android APP 卡顿问题分析及解决方案

    用户对卡顿的感知, 主要来源于界面的刷新. 而界面的性能主要是依赖于设备的UI渲染性能. 如果我们的UI设计过于复杂, 或是实现不够友好,计算绘制算法不够优化, 设备又不给力, 界面就会像卡住了一样, ...

最新文章

  1. 543. 二叉树的直径
  2. Thread.join(), CountDownLatch、CyclicBarrier和 Semaphore区别,联系及应用
  3. 上下两个x轴_工业机器人到底有多少个“轴”?
  4. 最大概率法分词及性能測试
  5. Android之使用Http协议实现文件上传功能
  6. python opengl_从Python开始,学习OpenGL(一)
  7. 8分频verilog线_解密POE交换机供电秘密,8芯网线断芯不再害怕!
  8. Windows RPC Demo实现
  9. 4.2 优化数据访问
  10. 如何使用CleanMyMac彻底擦除文件?
  11. 微信小程序开发--【初体验】(一)
  12. 用ping IP的方法测试网卡
  13. 怎么在小芭比Puppy Linux中文版中集成软件
  14. 超详细SPSS主成分分析计算指标权重(二:权重计算及极差法标准化)
  15. CI框架url模式及获得参数
  16. ByteDance字节跳动张一鸣:如何阅读、如何了解自己、如何与人沟通沟通、如何安排时间、如何正确的看待别人意见、如何激励自己、如何写作、如何坚持锻炼身体、如何耐心?...
  17. C语言实现简单的图书馆小程序(练习指针和结构体的基本使用)
  18. RDKit分子的3D结构
  19. juju如何让控制器高可用
  20. day61——自我检讨

热门文章

  1. c语言调色板5个参数,R语言中的颜色以及色板
  2. HDU2604Queuing
  3. 8. spark学习之旅(二)
  4. C语言编程>第十三周 ⑧ 已知学生的记录由学号和学习成绩组成,M名学生的数据已存入stu结构体数组中。请编写函数fun,该函数的功能是:
  5. c语言常数-ox6a是什么意思,C语言第2讲-数据类型运算符和表达式.pdf
  6. 《Python基础教程》第2章读书笔记(1)
  7. 浪潮云ERP到底属于什么水平?
  8. android 识别中文字体,在 Android 上高效准确的进行 OCR 识别,白描帮你实现
  9. 怎么查看无线路由器连接的设备连接服务器,手机如何查看无线wifi连接人数 手机查看无线wifi连接人数方法【介绍】...
  10. Swift中的类和结构体(2)