0x0.前言

APP版本:V8.2.4.2961

工具:burpsuite,xposed,frida,儿童手表

0x1.接口分析

这里我们设置好burp和模拟器的代理

但是当我们通过短信验证码登录时会一直卡死登录不上,当关闭代理后成功登录,猜测这里肯定有问题。

2.png

3.png

登录成功后,我们再开启代理看看如何!

4.png

这里我们之间点开了计步,可以看到显示网络连接异常,猜测这里进行代理的防护等保护。我们使用xposed的JustTrustMe模块成功突破SSL Pinning!

5.png

这时可以看到我们已经成功抓取到流量!

6.png

0x2.数据解密

通过上面的分析我们已经可以成功抓取数据包了,但是通过分析request和response,我们可以看出报文及逆行了加密

7.png

8.png

这里我们猜测使用了AES对报文进行了加密,可以使用hook的方式获得AES加解密使用的key和iv。我们这里使用frida hook框架完成对java中aes加解密的函数的hook,获得加解密使用的key和iv。frida的hook代码如下:

#coding: utf-8 
from __future__ import print_function
import frida
import sys
import json
import time

# 对结果进行输出
def on_message(message, payload):
 if(message['type'] == 'send'):
  rec_data = json.loads(message['payload'])
  if rec_data['my_type'] == 'IV':
   print("偏移 :: {}".format(payload.decode('utf-8')))
   print(" ")
  elif rec_data['my_type'] == 'KEY':
   print("密钥 :: {}".format(payload.decode('utf-8')))
  else:
   print(message)
 else:
  print(message)

# 使用js hook key和iv相关的代码
js_code = """
Java.perform(function x() {
    var secret_key_spec = Java.use("javax.crypto.spec.SecretKeySpec");
    secret_key_spec.$init.overload("[B", "java.lang.String").implementation = function (x, y) {
        send('{"my_type" : "KEY"}', new Uint8Array(x));
        return this.$init(x, y);
    }
    var iv_parameter_spec = Java.use("javax.crypto.spec.IvParameterSpec");
    iv_parameter_spec.$init.overload("[B").implementation = function (x) {
        send('{"my_type" : "IV"}', new Uint8Array(x));
        return this.$init(x);
    }
});
"""
giao= frida.get_usb_device().attach('com.qihoo360.antilostwatch') # 这里attach要进行hook的应用
script = giao.create_script(js_code)
script.on("message", on_message)
script.load()
sys.stdin.read()

android开启frida的服务端

adb connect 127.0.0.1:21503
adb shell
cd data/local/
./frida-server-14.1.3 # 成功开启frida的服务端程序

电脑端开启frida hook代码

adb forward tcp:27042 tcp:27042
python3 aes.py

9.png

这时我们运行应用就可以hook出当前接口的aes的iv和key

10.png

10.png

可以看到我们每次请求都能获得对应的key和iv

接下来我们使用aes相关解密脚本进行解密,解密脚本如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import base64
from Crypto.Cipher import AES
from urllib import parse
 
AES_SECRET_KEY = '408584e272555742c389c757adf88c83' #此处16|24|32个字符
IV = "3eaba802a4759002"
 
# padding算法
BS = len(AES_SECRET_KEY)
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
unpad = lambda s: s[0:-ord(s[-1:])]
 
 
class AES_ENCRYPT(object):
    def __init__(self):
        self.key = AES_SECRET_KEY
        self.mode = AES.MODE_CBC
 
    #加密函数
    def encrypt(self, text):
        cryptor = AES.new(self.key.encode("utf8"), self.mode, IV.encode("utf8"))
        self.ciphertext = cryptor.encrypt(bytes(pad(text), encoding="utf8"))
        return base64.b64encode(self.ciphertext)
 
    #解密函数
    def decrypt(self, text):
        decode = base64.b64decode(text)
        cryptor = AES.new(self.key.encode("utf8"), self.mode, IV.encode("utf8"))
        plain_text = cryptor.decrypt(decode)
        return unpad(plain_text)
 
if __name__ == '__main__':
    aes_encrypt = AES_ENCRYPT()
    e = "cvlbCumK/20nwRugGDDRaNI5TbdViSbx7ap47BdfeYAAYxsIMcPNAYF8FkJvsHG04a7DlWaqar6Y1wV5enxlFOonM5JHRZMRAFSMkD7K+4FAIRK7VO7RRSCOa+b3cPG2izB/5AS2jqEuZht1Zcbh0I5FR0U8WuOHCYxps3eg8mEUTRN72bbJqys26mg5zFroVyBYPeZjKUmgvSx9I4tZqKiBywnsY/canmlyuYw8A0k="
    d = bytes.decode(aes_encrypt.decrypt(e))
    print("decrypt data: {0}".format(d))

运行解密脚本进行解密,解密结果如下:

(sec) PS E:\sec-code> python .\aes-cbc-pkcs5padding.py
decrypt data: ts=1608172163734&m2=4f557a3814d4d5b709b2e6786dc5596d&operation=install&device_id=1c6be70cfe6d089b&seed=2073b5a480e26ab18be355a7a371fffc&package=cn.kuwo.wearkwbook

可以看到我们已经成功将数据解密!




0431实验室组建于2019年,是吉林省信睿网络信息安全有限公司的核心安全研究团队,专注于物联网和互联网的前沿安全攻防技术研究,拥有丰富漏洞挖掘经验,曾向小米、百度等国内知名企业多次提交安全漏洞方案,拥有业界优秀的安全分析团队,核心成员均有多年从事安全研究的经验。始终以“技术创新发展”为核心,以“维护网络安全”为目标,不断提高专业技术造诣,解读前沿安全技术,抵御更多的未知网络安全威胁。

本文作者:0431实验室

本文为安全脉搏专栏作者发布,转自:https://www.secpulse.com/archives/149795.html