当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0108500

漏洞标题:逆向分析苏宁易购安卓客户端加密到解密获取明文密码(附demo验证)

相关厂商:江苏苏宁易购电子商务有限公司

漏洞作者: Nicky

提交时间:2015-04-17 18:43

修复时间:2015-07-18 16:14

公开时间:2015-07-18 16:14

漏洞类型:用户敏感数据泄漏

危害等级:中

自评Rank:10

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-04-17: 细节已通知厂商并且等待厂商处理中
2015-04-19: 厂商已经确认,细节仅向厂商公开
2015-04-22: 细节向第三方安全合作伙伴开放
2015-06-13: 细节向核心白帽子及相关领域专家公开
2015-06-23: 细节向普通白帽子公开
2015-07-03: 细节向实习白帽子公开
2015-07-18: 细节向公众公开

简要描述:

苏宁易购安卓客户端使用了有缺陷的加密方式,经过逆向分析后搞定了其加密解密方法,能成功读取用户明文用户名与密码,可导致用户帐号被盗。

详细说明:

第一次花这么长时间测一个漏洞(主要时间都花在写demo上了。。。),求加精
1.苏宁易购Android最新版客户端使用的是通过本地xml文件和db方式存储用户登录凭证的。
(1)/data/data/com.suning.mobile.ebuy/shared_prefs/EbuyPerferences.xml
其中的
<string name=“logonAccount”>xxxx</string>
<string name=“logonPassword">xxxxxxxxxxxxx(16位密文)</string>
分别保存了用户的明文用户名与加密过后的密码

S50416-214048.png


(2)/data/data/com.suning.mobile.ebuy/databases/SUNINGEBUY.DB中的table_login_history表同样保存着明文的username与加密过后的password

S50416-214317.png


2.在正常情况下这样保存用户凭证问题不大,因为就算木马(读取应用私有文件需ROOT权限)获取了相关文件也不知道用户密码是多少。但经过分析,由于设计缺陷,用户密码可被逆向分析进行解密。
(1)使用JEB反编绎其APK安装包,以logonPassword为关键词进行初步查找,分析其调用的加/解密方法;
(2)当跟踪到package com.suning.mobile.ebuy.login.login.ui;下的类p(被混淆过的类名)时,发现调用了如下方法:

11.png


看包名这应该是个和登录相关的方法,先是通过getPreferencesVal方法读取了xml文件中的logonPassword值赋值给v2,然后通过getPreferencesPassword(v1, v2)来解密出明文密码进行登录,其中的v1是通过getTop5LoginHistory()方法取了登录历史中最后一次登录的用户名。
(3)继续分析getPreferencesPassword方法:

22.png


这里直接将传入的两个参数(明文用户名,加密后的密码)传递到了PBECoder类的decrypty方法,然后返回一个字符串值,看这个名字就能猜到是用来解密的~
(4)继续跟踪分析PBECoder类decrypty方法:

33.png


调用了decrypt方法,这里decrypt方法传入的三个参数值的第一参数值是PBECoder.hex2byte(arg3)是指将传入arg3(加密后的密码)从hex转换成了byte值,arg2为明文用户名,PBECoder.salt为salt值。继续跟踪调用的decrypt方法

44.png


发现这里用的是PBE算法加密,PBE——Password-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;采用随机数(这里我们叫做盐)杂凑多重加密等方法保证数据的安全性。如上就混杂了MD5与DES加密,是一种简便的加密方式。看着很安全?
(5)继续分析发现此其salt取值方法是直接设置为sn201209:
static {
PBECoder.salt = "sn201209".getBytes();
}
而正确的生成salt的方法是取随机值:
public static byte[] initSalt() throws Exception {
byte[] salt = new byte[8];
Random random = new Random();
random.nextBytes(salt);
return salt;
}
这样产生了一个问题,我们能获取解密要用的用户名与加密后的密码又逆向出来了salt值与其解密方法,我们完全可以自己写个相同的解密方法。
最后。。。经过三天的编写。。。demo终于出炉了(第一次写完整的android应用,改了多少报错就不说了。。。)

漏洞证明:

demo下载地址:链接: http://pan.baidu.com/s/1hq08FJY 密码: 27kc
demo使用方法:
1.用户只要是登录过了苏宁易购安卓客户端且没退出登录就行
2.需要ROOT权限(就是读个xml文件无其它操作)
3.点击解密就能获取当前登录的用户的苏宁易购明文用户名与密码

S50416-182634.png


漏洞利用:
用户手机中了木马,木马可以继续获取ROOT权限并盗得明文帐号密码

修复方案:

使用随机生成的salt

版权声明:转载请注明来源 Nicky@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2015-04-19 16:13

厂商回复:

感谢提交,移动客户端问题较多,一并处理,谢谢。

最新状态:

2015-05-27:稍后送上苏宁易购1000元礼品卡