当前位置: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元礼品卡


漏洞评价:

评论

  1. 2015-04-17 18:44 | 疯狗 认证白帽子 ( 实习白帽子 | Rank:44 漏洞数:2 | 阅尽天下漏洞,心中自然无码。)

    漂漂

  2. 2015-04-17 18:52 | BMa ( 普通白帽子 | Rank:1776 漏洞数:200 )

    我的膝盖都碎了 @Nicky 都不带我装逼,带我飞

  3. 2015-04-17 19:35 | 袋鼠妈妈 ( 普通白帽子 | Rank:449 漏洞数:61 | 故乡的原风景.MP3)

    @Nicky 好熟悉的id

  4. 2015-04-17 19:39 | Taro ( 普通白帽子 | Rank:178 漏洞数:48 | 走向最远的方向,哪怕前路迷茫;抱着最大的...)

    求手下膝盖

  5. 2015-04-17 20:32 | izy ( 普通白帽子 | Rank:111 漏洞数:22 | http://1zy.pw/)

    nice

  6. 2015-04-17 20:46 | Nicky ( 普通白帽子 | Rank:477 漏洞数:69 | http://www.droidsec.cn 安卓安全中文站)

    @疯狗 来个闪电呗

  7. 2015-04-17 21:30 | 瘦蛟舞 认证白帽子 ( 普通白帽子 | Rank:687 漏洞数:78 | 铁甲依然在)

    加解密/签名的文章快写完了.

  8. 2015-04-17 22:00 | Nicky ( 普通白帽子 | Rank:477 漏洞数:69 | http://www.droidsec.cn 安卓安全中文站)

    @瘦蛟舞 哈哈 期待

  9. 2015-04-17 22:34 | gainover 认证白帽子 ( 核心白帽子 | Rank:1710 漏洞数:93 | PKAV技术宅社区! -- gainover| 工具猫网络-...)

    今天刚被苏宁卖东西的大叔大妈气到了。。

  10. 2015-04-19 16:40 | Me_Fortune ( 普通白帽子 | Rank:209 漏洞数:71 | I'm Me_Fortune)

    6666666666666

  11. 2015-04-20 09:27 | 大亮 ( 普通白帽子 | Rank:306 漏洞数:65 | 慢慢挖洞)

    看到二哥的评论,我估计苏宁要倒霉了

  12. 2015-04-22 23:20 | Mr.R ( 实习白帽子 | Rank:52 漏洞数:14 | 求大神带我飞 qq2584110147)

    好叼

  13. 2015-07-03 17:13 | 冰海 ( 实习白帽子 | Rank:70 漏洞数:7 | I can do better , why not ?)

    稍后送上苏宁易购1000元礼品卡

  14. 2015-07-12 21:21 | 小红猪 ( 普通白帽子 | Rank:194 漏洞数:30 | Wow~~~哈哈~~~)

    点赞

  15. 2015-07-18 19:48 | hack2012 ( 实习白帽子 | Rank:31 漏洞数:3 | 关注信息安全 http://www.waitalone.cn/)

    不错。。。

  16. 2015-07-20 00:15 | 小胖胖要减肥 认证白帽子 ( 普通白帽子 | Rank:686 漏洞数:101 )

    @瘦蛟舞 @Nicky app其实根本没必要存 账号密码,还有对于中木马的话已经不是账号密码的问题了

  17. 2015-07-20 11:39 | 瘦蛟舞 认证白帽子 ( 普通白帽子 | Rank:687 漏洞数:78 | 铁甲依然在)

    @小胖胖要减肥 要看本质~ 必然会存用户凭证来简化登录操作~不管是 session 还是帐号密码. 还有前端问题大多在触发上显得比后端鸡肋~

  18. 2015-07-20 23:42 | 小胖胖要减肥 认证白帽子 ( 普通白帽子 | Rank:686 漏洞数:101 )

    @瘦蛟舞 app的登陆凭证可以根据多种算法计算,传输数据拦截可以让他没有意义,如果说到木马就没意思了,数据安全这块做到破解app也不能破解拦截到的传输加密就行了吧

  19. 2015-07-21 08:25 | 小荷才露尖尖角 ( 实习白帽子 | Rank:91 漏洞数:13 | less is more)

    赞深入分析

  20. 2015-07-21 10:28 | 瘦蛟舞 认证白帽子 ( 普通白帽子 | Rank:687 漏洞数:78 | 铁甲依然在)

    @Nicky 骚年去大公司上班都不说话了呀.出来冒冒泡,哈哈

  21. 2015-07-21 10:32 | 瘦蛟舞 认证白帽子 ( 普通白帽子 | Rank:687 漏洞数:78 | 铁甲依然在)

    @小胖胖要减肥 此漏洞不光你说的"木马",还需要 root,只看这两个利用条件漏洞就十分鸡肋~

  22. 2015-07-21 12:10 | Nicky ( 普通白帽子 | Rank:477 漏洞数:69 | http://www.droidsec.cn 安卓安全中文站)

    @瘦蛟舞 哈哈 这漏洞考虑利用条件确实鸡肋,但在目前移动客户端上可远程利用的高危太少了。。。

  23. 2015-07-21 12:53 | Me_Fortune ( 普通白帽子 | Rank:209 漏洞数:71 | I'm Me_Fortune)

    @瘦蛟舞 大牛去哪了 - -

  24. 2015-07-21 15:11 | 瘦蛟舞 认证白帽子 ( 普通白帽子 | Rank:687 漏洞数:78 | 铁甲依然在)

    @Me_Fortune 额,创业团队额. 有兴趣可以私聊

  25. 2015-07-21 18:30 | 小胖胖要减肥 认证白帽子 ( 普通白帽子 | Rank:686 漏洞数:101 )

    @Nicky 确实 20分 hah 移动安全对于甲方来说现在很多都比较鸡肋,除了一些大洞,服务端漏洞接口设计都能避免