某易邮箱CK提取分析
声明:本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关.本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责。
0x01 简介
简单分析下某邮箱的登录协议以及登录后CK提取。
0x02 请求包观察
打开登录页面,将Cookie清空,重新刷新下页面,打开F12监听请求报文。
当点击输入框时,看到发了一个请求包xxx/powGetP,这个包属于登录协议的一部分下面分析。
点击登录可以看到连着发了两个包,然后请求静态页面登录成功进行跳转,在xxx/l的响应头中可以看到返回了Cookie,但不是全部的Cookie,后续请求的静态页面也返回了Cookie,两个Cookie拼接就是完整的Cookie
0x03 参数加密分析
上面提到的几个请求报文参数都有加密,一个一个看加密前参数构造以及加密算法
直接全局搜索encParams,在可疑的代码上打上断点,最终定位到如下代码,之前没看函数名直接跟进去,然后复制整个函数丢给AI分析的,gpt分析的不太对,claude给出了正确答案,但是其实函数名已经给出了答案SM4,这个加密之前还没接触过。
这边前两个报文xx/powGetP和xx/gt的明文参数是一致的,唯一有一个变量rtid是随机取了一个32位的字符串,这个变量导致了每次请求加密参数不一样。
0x04 登录报文分析
重点分析xx/l这个报文,因为这个报文在明文参数中也存在一些未知的变量,并且这个报文会返回一些Cookie,后续的请求会用到这个Cookie。
观察明文参数,参数中的pVParam和pw这两个参数中包含一些未知的密文,从变量名推断pw应该是密码经过加密后生成的密文,报文中还包括一个tk变量,这个变量来源于前一个/gt的请求响应。
pw密码加密
先搜索pw看看密码在哪里被加密。将可疑的位置都打下断点,最终在以下代码处停住,其中的i就是我们输入的明文密码。
t.pw = MP.encrypt2(i);
直接跟进去看是什么加密,可以发现是一个RSA加密,这边的f就是加密的公钥
pVParam
然后看pVParam是怎么来的,到现在我们还没用到/powGetP这个请求,其实这个参数就和他有关。puzzle这个变量完全来源于这个包的响应,其他参数也用通过其中的内容计算而来。
全局搜索pVParam,同样在可能是赋值的代码处都打上断点。最终停在了如下代码
e.pVParam = this.__powerData;
再全局搜索__powerData看是在什么地方进行的赋值操作,停下如下代码
this.__powerData = e;
其中e来源于参数传递,跟栈看他的生成位置,然后跟到如下代码,我们需要的值来源于参数e中的data值。并且上面的postMessage也在调用栈里面,我们给他打上断点。
打上断点后刷新页面,重新触发/powGetP的调用进入断点。这个传入的参数e还是这个报文的响应内容,和我们想要的参数有差别,所以在这个函数里面肯定有变化,继续跟这个postMessage的函数。最终在下面的函数中对参数进行了计算生成了我们想要的值。
这个函数有一个循环,循环中经过模幂运算生成了x的值,循环的次数,由/powGetP响应的t值即最小循环次数和minTime控制,当循环次数小于t或者运行时间小于最小时间时会继续模幂运算。
他的意义在于控制客户端的请求时间,当使用一些自动化的手段快速填入账户密码并提交时很可能会触发拦截。
0x05 cookies提取
到这里所有的加密内容都分析完毕了,构造请求xx/l后即可在响应头发现服务器返回的Cookie信息
其中有几个关键的参数NTES_P_UTID、NTES_SESS、S_INFO、P_INFO。我们前面说过这个请求返回的Cookie 还不是全部,因此我们就用这几个Cookie是不能形成登录的状态的,还需要请求后续的一个静态请求,这个静态请求就需要用到上面返回的几个Cookie,然后拼接这个静态请求的Cookie就是一个完整的ck内容了。
0x06 CK提取测试
将提取到的CK信息,使用CookieEditor导入到浏览器,成功登录