android判断密码字符串,逆向分析苏宁易购安卓客户端加密到解密获取明文密码(附demo验证) | WooYun...

第一次花这么长时间测一个漏洞(主要时间都花在写demo上了。。。),求加精

1.苏宁易购Android最新版客户端使用的是通过本地xml文件和db方式存储用户登录凭证的。

(1)/data/data/com.suning.mobile.ebuy/shared_prefs/EbuyPerferences.xml

其中的

xxxx

xxxxxxxxxxxxx(16位密文)

分别保存了用户的明文用户名与加密过后的密码

65290191_3.png

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

65290191_4.png

2.在正常情况下这样保存用户凭证问题不大,因为就算木马(读取应用私有文件需ROOT权限)获取了相关文件也不知道用户密码是多少。但经过分析,由于设计缺陷,用户密码可被逆向分析进行解密。

(1)使用JEB反编绎其APK安装包,以logonPassword为关键词进行初步查找,分析其调用的加/解密方法;

(2)当跟踪到package com.suning.mobile.ebuy.login.login.ui;下的类p(被混淆过的类名)时,发现调用了如下方法:

65290191_5.png

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

(3)继续分析getPreferencesPassword方法:

65290191_6.png

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

(4)继续跟踪分析PBECoder类decrypty方法:

65290191_7.png

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

65290191_8.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应用,改了多少报错就不说了。。。)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值