起因 朋友在群里发了个智能XX锁的段子 于是感觉好玩 就去淘宝上搜了下 看见还真有这玩意 而且还可以远程控制 于是想着是不是有啥漏洞 可以越权玩玩 · · · · ·
由于没找到小程序以及远程控制的网站,于是本次直接去官网下载了app
安装好app 对其抓包时才发现 所有的请求参数 以及返回参数均为加密状态的
一般面对这种情况 除了对安卓app进行逆向 已经别无他法了。于是我们进行了逆向,apk逆向工具JEB Decompiler 3.19.1破解版(下载链接:https://www.52pojie.cn/thread-1192412-1-1.html)或者 jadx-1.4.6(下载链接:https://github.com/skylot/jadx/releases/download/v1.4.6/jadx-1.4.6.zip) ,此处我选用的apk逆向工具是jadx-1.4.6
双击jadx-gui 打开(windows可双击底下的 jadx-gui.bat 文件)
将我们下载好的安卓app安装包拖入至 打开的 jadx-gui 界面 我们就能看到左边是一堆文件夹以及文件列表,点击相关文件选择后,右边界面就会出现相应的反编译出来的代码
点击中间的放大镜按钮 就是搜索按钮
在搜索框内输入decry
然后我们双击进去查看相关代码,看代码大概是不是相关的函数调用过程,感觉像的时候就进行hook相关代码进行验证 ,比如我觉得XXXXX.XXXXXX.com.util.EncryptUtil 里的f函数过程比较像
那么我们就新建一个txt文本,然后将文件名后缀改为 .js
之后写入我们的hook代码
Ctrl+s 保存一下,这样 我们的hook脚本就做好了 我们运行下试试 使用 frida -U -f 安卓包名 -l hook脚本文件路径名 --no-pause 语句运行 frida 这里的语句就是
frida -U -f XXXXXXXX.com -l /路径/1.js --no-pause
运行后我们发现 得到了几行数据 EncryptUtil.f is called: 后面跟着的就是返回的加密数据
EncryptUtil.f result 就是我们得到的明文数据 这里我用了console.warn 黄色来显示
一般情况下 这里只要在Hook得到加密结果,如果实在找不到加解密函数的过程,按照这个也是可以进行渗透测试的,但是会比较麻烦。这里我们选择继续分析
我们可以看见f返回的解密结果是调用了 e10.toString() 这个过程 那么这个e10 又是个什么东西呢?我们继续往上翻 同样在 XXXXXXXX.com.util.EncryptUtil 这个文件里 我们发现了e函数
这里应该就是我们要找的加解密方式 是aes cbc pkcs5 的模式 但是这里的秘钥key 以及偏移iv值 我们不知道,只能继续看代码。我们可以看到这个e函数过程的第一句就是
SecretKeySpec secretKeySpec = new SecretKeySpec(bArr2, "AES"); |
这里的bArr2就是e函数调用过程中传递过来的第二个参数,那么我们直接hook这段代码 应该就能获取到加密的秘钥key值了,我们直接hook下这个e函数过程,这里的步骤跟前面一样,我们直接在脚本里更改为e函数
之后 我们直接调用
到这里我们发现 他的bArr2值都是一样的 都是 56,55,100,81,95,80,53,70,35,57,38,75,42,71,54,98,57,38,102,37,56,33,100,38,48,54,64,40,99,95,42,97 应该就是秘钥key无疑,但是需要注意,我们这里是byte字节型,所以我们需要转成字符串string型
这里我们用python写了个小脚本来转字符串
def byte_to_string(byte_array): string = "" for byte in byte_array: string += chr(byte) return string # Example usage h = [56,55,100,81,95,80,53,70,35,57,38,75,42,71,54,98,57,38,102,37,56,33,100,38,48,54,64,40,99,95,42,97] print(byte_to_string(h)) |
运行后我们得到了我们最终的秘钥key:87dQ_P5F#9&K*G6b9&f%8!d&06@(c_*a
然后我们继续分析偏移iv值
IvParameterSpec ivParameterSpec = new IvParameterSpec(f10971a.getBytes("UTF-8")); |
这里的iv值为 f10971a.getBytes 那么f10971a 又是什么呢?我们直接双击他,然后我们就跳到了这个加密函数的开头第一句
public static final String f10971a = b.a() + "_8"; |
这里的意思就是f10971a 是由 b.a()过程 拼接 _8 字符串得到的,那么b.a()又是什么呢?我们继续双击b.a 然后跳到了b文件的a函数过程内
然后我们可以看到 他最后返回的return 是个字符串 3*1&f6O%6&Pa5d ,拼接前面的_8,于是我们就得到偏移iv值为 3*1&f6O%6&Pa5d_8
现在加密方式知道了是AES CBC PKCS5 模式,秘钥key也得到了:87dQ_P5F#9&K*G6b9&f%8!d&06@(c_*a 偏移iv值也得到了:3*1&f6O%6&Pa5d_8
下面我们就是抓包后,使用这些得到的信息对数据包进行解密,看看是否正确
我们找到在线加解密网站,依次填入key值和iv值,数据格式选择 文本 填充模式选择pkcs7
之后我们把请求数据包内的密文zLBTNJivGBiLw5E9kSTPbM6iE7LMu3TkE7zEEVQAJMVwk+k7N6ogR5xnC+Fz1POA
填入到第一个加密/解密的内容格子内 点击解密 我们就得到了明文数据了
再将返回数据包内的密文vyQ6GPwiJqTHYVRE7s6d3P3+aEhcENSRYL0XCc2mzrb3db7Wsh+6OY573QF3RloUZ4vgU5d67DtkBl34Y7eGtQ== 填入进去 点击解密,我们就得到了返回数据的明文数据
至此,整个过程到此就结束了,我们也可以愉快的进行渗透测试了