当前位置:安全客 >> 知识详情

安卓 HackingPart 16:脆弱的加密

2015-01-04 10:41:17 阅读:0次 收藏 来源: 360安全播报

背景介绍

本文介绍Android应用开发中一些脆弱的加密方式,程序员希望通过加密来提升程序的安全性性,但却缺乏专业的密码学背景知识,使得应用对数据的保护非常薄弱。本文会介绍可能出现在Android应用中的一些脆弱的加密方式,以及对应的攻击方法。

造成脆弱加密的主要原因

Android应用中造成弱加密的原因多种多样,OWASP Mobile Top 10 Projects 中提及了其中主要的两原因:

使用了脆弱的加密算法

使用了强健的加密算法,但加密的实现存在漏洞。

使用弱密码算法实现加解密

我们先来看看如果如果一个应用使用弱加密算法会遭受怎样的攻击。

例如使用MD5作为Hash算法,MD5已经认为不安全了。如果应用使用了MD5这样的脆弱算法,而攻击者又能读取到Hash,攻击者就有相当大的机会能破解加密。假设应用使用MD5生成了这样一段Hash:

9a618248b64db62d15b300a07b00580b

攻击者可以使用john之类的工具或在线的彩虹表破解服务:

t0191b99452563df3ff.png

如上图,hash被成功破解。

除此之外,有的开发者也会使用编码来保护敏感信息。编码不是加密,可以很容易就解码还原出明文。例如我们在反编译了一个应用之后发现了如下的一段Base64编码字符:

c3VwZXJzZWNyZXQ=

找一个提供在线base64解码的网站就能还原出明文:

t01717410eca08ee594.png

强密码算法的不安全实现

另一种情况是使用了较强的加密,但使用方法不够安全,例如使用了AES这样的对称加密算法,尽管该算法足够强壮,但当其实现不当的时候也一样容易受到攻击。例如对AES来说,秘钥管理就是一个巨大的挑战。下一节中我们就会看到攻击者如何利用糟糕的秘钥管理进行攻击。

实例:SQLCipher Library的误用

Android应用以多种方式存储数据,使用内置的SQLite库进行数据的存储和管理非常普遍。

本例中,我们使用SQLCipher 库来加密数据库。

从黑盒测试的角度,要解密应用数据库,数据文件地址和其加密方式等信息是必须的。

环境准备:

1、一台运行Ubuntu的主机

2、SQLCipher 命令行工具-可以在以下地址中下载到:

https://www.zetetic.net/sqlcipher/open-source/

3、安装好AndroidSDK

4、Dex2jar 和jd-gui ,可以在以下地址中下到:

https://code.google.com/p/dex2jar/

http://jd.benow.ca/

下载APK文件,在模拟器中运行,应用会自动创建加密的数据库:

(下载链接)

检查SQLite数据库-通常用的方式

我们先看看我们能不能查看模拟器中的数据内容,先将数据库下载到本地:

adb pull /data/data/[packagename]/databases/filename.db

http://p9.qhimg.com/t017e1204bfc92039c2.png

使用SQLite3命令查看数据库表名:

t019e71192841ca6f8b.png

如图,报错说文件被加密了,现在我们需要加密算法使用的秘钥来解密文件。

从应用的代码中找出加密的详细过程

首先需要知道整个加密的过程,我们可以使用dex2jar和JD-GUI来反编译java代码。

解压apk文件

Android应用以apk文件格式发布,该文件可以直接使用unzip解压出其中的内容。

unzip SecureSQLite.apk

该命令会在当前目录下解压出apk文件中的内容。

其中的“classes.dex”就是我们要的文件。

反编译

“classes.dex”文件中保护了应用的代码,该文件被编译成了Android的二进制格式,我们首先要将其装换为jar文件,可以使用dex2jar:

dex2jar classes.dex –o classes.jar

该命令会在同一目录下创建一个classes.jar文件。

我们可以进一步使用JD-GUI这样的工具反编译出java代码

查看代码

简单查看下代码就能知道数据库使用了何种加密:

t01ebdee139a8e9e294.png

如上图,代码中引入了一个第三方库:“sqlcipher”来对数据库进行加密,应用的包名为包名为”com.androidpentesting.secreqlite”。

t014b8a517f2bf0ad88.png

尽管不是很常见,有些加密用的秘钥能直接在代码中找到。

如上图,代码中使用”password”作为秘钥。

注:由于是实例程序,所以我们插入到数据库中的数据也是硬编码到代码中的。

解密数据库

解密数据库可以使用同名的Unix/Linux命令行工具:”SQLCipher Core Command Line”。

下载地址:http://sqlcipher.net/open-source/

选择并解压后,会产生一个名为sqlcipher的文件夹。

在终端中打开该目录,并按照文章中的方法编译:

http://sqlcipher.net/introduction/

该工具的用法:http://sqlcipher.net/sqlcipher-api/

比如解密数据库”secure.db”的命令如下:

t012f853d535fefcd4e.png

首先使用sqlcipher工具打开数据库,然后设置我们刚才在代码中找到的秘钥:

PRAGMA key = ‘password’;

现在就可以向普通数据库一样对其进行访问了。

我们也能导出未加密的数据库。

最后,使用”.exit”命令退出。

扩展

使用自定义的加密算法也会造成应用易受到攻击。

本文介绍了Android应用中脆弱的加密方式如何被攻破,对此加密算法的秘钥管理很重要,所以最好不要在代码中硬编码秘钥,如果真的需要使用对称加密,基于密码的加密可能更合适,应为秘钥需要基于用户输入的密码生成。

相关阅读

https://www.owasp.org/index.php/Mobile_Top_10_2014

https://www.zetetic.net/sqlcipher/

目录

安卓Hacking Part 1: 应用组件攻防(连载) 

安卓Hacking Part 2: Content Provider攻防(连载)

安卓Hacking Part 3:Broadcast Receivers攻防(连载) 

安卓Hacking Part 4:非预期的信息泄露(边信道信息泄露)

安卓Hacking:Part 5:使用JDB调试Java应用 

安卓Hacking Part 6:调试Android应用 

安卓 Hacking Part7:攻击WebView

安卓Hacking Part 8:Root的检测和绕过

安卓hacking Part9: 不安全的本地存储:Shared Preferences 

安卓Hacking Part 10:不安全的本地存储

安卓Hacking Part 11:使用Introspy进行黑盒测试 

安卓Hacking Part 12: 使用第三方库加固Shared Preferences 

安卓Hacking Part 13:使用Drozer进行安全测试 

安卓Hacking Part 14:在没有root的设备上检测并导出app特定的数据

安卓hacking Part 15: 使用备份技术黑掉安卓应用

安卓 HackingPart 16:脆弱的加密


本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:http://resources.infosecinstitute.com/android-hacking-security-part-16-broken-cryptography/

参与讨论,请先 | 注册 | 匿名评论
发布
用户评论
无任何评论