本文共1495字,预计阅读需要8分钟

今日阅读:

今日软件:

今天没看啥软件,补觉时间居多。

今日代码:

关于公司某平台下子应用的单点登录逆向,因为涉及到系统安全不会附带图片和实际代码,简单说一下思路和心得。

鉴权部分,公司的大部分新建的系统,用的都是JWT形式,而老的系统用JSESSIONID比较多。

第零步:破解传参加密

该平台的传参有加密,给登录请求加上XHR断点,可以定位到加密的JS,里面写明了就是AES-CBC-PKCS7。

那下一步找IV偏移量跟KEY秘钥就OK了,跟着混淆后的JS追踪了半天搞得头晕脑胀,突然想起我直接拿调用堆栈里面的值不就好了吗。

筛了下16位字符,秒速拿下。

第一步:拿到CAS的TGT

第一步是我一开始尝试逆向中遗漏的部分,以为拿到JWT就万事大吉,结果发现后面登陆了平台后的子应用系统还有一层JWT,而之前拿到的根本不认!

仔细观察抓包发现之前遗漏了一条非常隐蔽的请求,会获取到一个指向以TGT命名的链接。看了下请求的path名里包含tickets,很明显就是认证相关的数据。

拿了再说。

第二步:拿到该平台的accesstoken

这一步反而是简单的,因为前面都解决了传参加密算法,把账号密码和MFA用逆向出来的算法过一遍就OK了。

也是因为该平台使用了TOTP作为MFA方式之一,才让我能够使用程序完全模拟全部登录流程。

邮箱验证码涉及到怎么处理异地登录审核,还有短信转发,被我直接pass。

突然想起还有一个小坑,这一步拿accesstoken传参方式是json,而其他的接口都是表单。

第三步:获取ST凭证

ST凭证跟上面的TGT有关,传参指向的就是我们要访问的子服务的链接地址。

这一步会拿到一个ST开头的认证字段,不知道为何浏览器是显示不出来的,我用POSTMAN调用的时候可以正常看到。是Chrome解析的问题?

第四步:处理两个302拿到最后的token

这里提到的302就跟我上面说到的文章有关系了,也是我为什么要坚持做纯请求模拟登录的原因,因为我觉得是可行的。

首先第一个302就是用获取到的ST凭证来构造访问地址,会产生一个附带jsessionid的链接返回,注意不是返回值而是写在相应标头的location,

用python去构建的时候要设置allow_redirects=False在这里先断一下,再单独的去访问返回的链接,不然容易拿不到。

之后访问带jsessionid的链接的时候,这链接还整一次302重定向,这次给到的就是我之前在浏览器中捕获到的,附带token的访问链接,而这个token就是服务器传回的JWT。

小结:后续回去查关于TGT和ST的资料,才发现这些都是经常听到的Kerberos和CAS。

咋说呢,学而不思则罔,思而不学就要die了呀。

今日见闻:

z-lib的telegram频道被封禁。

今日废话:

周六值班+周六夜班+周日早上起来继续蹲公司破解,差不多24小时内只睡了两小时。

在破解单点登录的第三层的时候我一直在旁边无人的会议室踱步,这是我思考时候的癖好,终于在胡思乱想了快一个小时后坐定开始写代码,终于是一口气拿下。

在下午泡完图书馆之后终于累到在床上,眼睛一睁已经到了11号。

image1