将安全君呀设为"星标⭐️"
第一时间收到文章更新
声明: 安全君呀 公众号文章中的技术只做研究之用,禁止用来从事非法用途,如有使用文章中的技术从事非法活动,一切后果由使用者自负,与本公众号无关。
文章声明:本篇文章内容部分选取网络,如有侵权,请告知删除。
前言
强烈推荐学习网安的小伙伴关注一下大佬的公众号:隐雾安全,下面开启正文。
加密、登录的 password、查询的时候的 sign、一些接口的 cookie 字段,都是通过前端加密之后发到后端的,还有一些后端传递过来的数据本身就是加密的,然后放到前端来解密成明文,这样加密的数据我们直接通过 burp 几乎是不可能进行顺利的测试的,JSRPC 可以快速的帮助我们实现直接调用网站环境当中的加密或者解密函数的效果,免去扣代码和补环境,简直就是一大神器。
远程过程调用概述
RPC(Remote Procedure Call,远程过程调用)最初是为C语言设计的,但后来扩展到了其他语言。它是一种通过网络让程序调用另一台计算机上的服务或程序的技术。它允许程序在不同的地址空间(通常是不同的计算机)之间调用函数或方法,并且可以基于多种协议实现。而JSRPC则属于在JavaScript环境中的RPC技术实现。RPC的技术本质虽然复杂,但我们只需要会使用即可。
在前端开发中,经常遇到 JS 加密的情况。如果我们使用JSRPC技术,则不需要关心加密函数的具体实现方式,就能直接调用加密函数得到结果。
简单举个例子说明:比如请求中的加密参数sign由加密函数A通过一系列信息(如搜索内容、时间戳等)生成。一般情况下,我们可能需要通过扣代码、补环境、还原加解密算法等方式来解决这个问题。这样处理起来,如果加密逻辑非常复杂,同时又有很多的环境检测或者调用的情况下就比较费时间或者难以完成。这时候如果我们使用isrpc技术可以使我们直接调用加密函数a来实现请求的加密,就像是本地函数调用一样,而 a 是我们写好的函数只需我们传个参数就可以有返回值。
协议介绍
因为 JSRPC 一般都是基于 WebSocket或者 WebSocket Secure协议实现的,在这里介绍一下这俩协议:
WebSocket是基于 TCP 的应用层协议,WSS(websocketsecure)是WebSocket的加密版本,ws和wssb 的关系类似与http和https,他们采用的是双向通信模式,类似一根两端开口的管道,当客户端和服务器之间建立连接后,不论是客户端还是服务端都可以随时发送数据给对方,WebSocket协议请求url为ws://开头。
WebSocket Secure 请求协议则为 wss://开头,并且通常每隔一段时间需要发送心跳包维持长连接(心跳包可以是一个简单的ping消息),一般在社交聊天室,股票实时报价,直播间信息流等场景中会存在。
大致步骤
这里再通份的解释一下服务端和客户端是哈情况:其实就是将加密的教原先在测览器自身调用的情况变为了接口调用,也就是从内到外了,这使得我们可以直接从外部调用内部环境的加密函数。通过接口调用肯定需要服务端和客户端,所以我们需要先构建好客户端和服务端,服务瑞用来做流量转发,客户端用来做执行参数加密函数和运回结果。
案例实战
这次我们拿某团登录的来举例,大家练练手,地址:aHR0cHM6Ly9wYXNzcG9ydC5tZWl0dWFuLmNvbS9hY2NvdW50L3VuaXRpdmVsb2dpbg==(Base64加密)
ctrl + Shift + N 打开无痕模式(谷歌浏览器)
查看 password 的加密字符串长度:
RSA1024是指公钥及私钥分别是1024bit,也就是1024/8bytes,RSA 算法密钥长度的选择是安全性和程序性能平衡的结果,密钥长度越长,安全性越好,加密解密所需时间越长。
密文长度就是对给定符合条件的明文加密出来的结果位长,这个是可以确定的,加鹤后的感文长度眼密钥长度是相同的,也就是模数的长度。
Base64
base64等号问题:原数据总字节数除以3余1是补两个等号 余2是补一个等号 。等号可以理解为用来补全字节总数使得原数据字节其是3的倍数。
结合我每次输入的密码都是不变的情况下,password的值每次都在变且都固定为1024位,说明很可能是密钥长度为1024位的rsa加密,又因为最后结果是base64编码形式所以大概率是 PKCS#1的填充模式,同时单纯的rsa算法无法加密大量文本,当我们在密码框输入很多的数据抓包如下:
可以看到在输入大量的数据情况下,请求正常发送但是password直接变为了false,说明加密方式几乎确定为rsa加密。
验证猜测
我们直接搜索setpublickey(rsa加密的关键字),可以看到以下结果:
然后我们点进去倒数第二个很容易发现 h5Fingerprint 和 password 的加密函数,如下所示。
开始加入断点,刷新,查看 password 的值:
第二种查找方法:(函数调用次序)
从上面第三个函数开始依次点进去查看,(前面几个是库的底层调用方法)
有的网站只支持wss怎么办?如果有csp策路怎么办?如果有多个加密函数需要提供rpc买现怎么办?...
这时候向大家推荐两款来解决这些问题,如下所示。
JsRpc 工具的使用
部署方法
JsRpc是一款十分优秀的go语言工具,在21年的时候发布,如今已经1.2k的star,为js速向和渗透测试的 JsRpc 调用提供了很大的便捷。
项目地址:https://github.com/jxhczhl/jsrpc
我们下载编译的版本,同时讲配置文件config.yaml放到同一目录下面
下方的目录是默认设置,如果需要https/wss服务则需要从阿里云,腾讯云等申请免费的https证书。
在目录中双击 exe 文件,复制 .yal 文件中的全部代码,放到浏览器控制台粘贴,执行
搜索:encrypt,找到加密的代码部分,在上面加上代码:
//下面是接口注册代码,md说明中有其他情况的代码,可参考
var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=mt");
demo.regAction("pass",function(resolve,param){
resolve(encrypt.encrypt(param));
})
// http://127.0.0.1:12080/go?group=mt&action=pass¶m=123456
然后在浏览器上直接访问:
http://127.0.0.1:12080/go?group=mt&action=pass¶m=123456
Sekiro 框架的使用
框架介绍
JsRpc是用 go 语言写的专门为 JS 逆向做的项目,而sekiro是由邓维佳(渣总)写的一个基于长链接和代码注入的 API 服务暴露框架,通用性更强,功能也更加强大,它可以在app逆向,JS 逆向,Android 群控,app 爬虫等场景使用,同时提供了市面上主流编程语言的客户端demo以及十分完善的中文使用文档。
官方文档:https://sekiro.iinti.cn/sekiro-doc/
部署方法
首先先在以下的url下载服务端程序
https://oss.iinti.cn/sekiro/sekiro-demo
步骤同上,分客户端和服务端两部分。
最后结果比对:
原文始发于微信公众号(安全君呀):【js逆向渗透系列01】利用JSRPC秒杀JS加密
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论