遇到个需求,网站如下,是一个手机号验证码登录,现在的需求是看看这个验证码有没有锁定策略,很简单只要把发送验证码的包用爆破模块,设置单线程并且每过 60秒
发送一次就可以
但是发现这个包有校验,这里请求头中多了四个参数,Custappid
,Timestamp
,Signature
,Nonce
,发现改动任何一个响应就会失败
接下来去浏览器中,定位相关 js
代码逻辑,其实定位这里有很多方式,常用的两种方式就是全局搜索关键字或看流量堆栈,我习惯第二种,不过依据这次的环境全局搜索来的快一些
逻辑在此,其实那个 signature
我也分析了一波,就是一些值,先 sha256
然后再 md5
,不过这次主要是讲 rpc
,所以这里不深入展开了,继续,可以看到我们需要的对应函数为 _()
不过这个时候我们去控制台去执行它是不会执行成功的
因为函数作用域问题,所以我们这个时候需要再刚才的 js
代码处打个断点,然后点击发送验证码,触发断点
这个时候我们去控制台调用该函数就可以正常调用了
为了方便实用这个时候我们需要将这个函数设置成全局函数,这样不在 debug
的时候,我们也可以正常调用了
window._ = _
然后我们放行断点后也可以正常调用了
RPC调用
项目地址:https://github.com/jxhczhl/JsRpc
下载编译好的 exe
,以及 resource
里面的注入代码 jsEnv.js
第一步现将 jsEnv.js
的代码粘贴到控制台执行
然后打开 exe
,然后在浏览器控制台先连接通信,记住 group
和 name
的值
var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=group1&name=code");
然后我们注册我们之前的函数 _()
demo.regAction("getinfo", function (resolve) {
var infos = _();
resolve(JSON.stringify(infos));
})
然后我们直接访问接口看一下
http://localhost:12080/go?group=group1&name=code&action=getinfo
可以正常调用,然后我们可以用 python
代码获取值
import requests
def get_rpc():
url = "http://127.0.0.1:12080/go"
data = {
"group": "group1",
"name": "code",
"action": "getinfo"
}
result = requests.post(url, data=data)
return result.json()['data']
print(get_rpc())
Mitmproxy
接下来就是我们联动 Burp
了,我想让 Burp
发包的时候默认将这些参数给我带上,让我能够正常发包,这里我们可以使用 mitmproxy
来开一个上游代理,然后我们就可以自定义经过的请求包了,注意要 python3.10
以上,用 pip
安装即可
pip install mitmproxy
然后记得装一下 mitmproxy
的证书,先运行一下,然后在用户目录的 .mitmproxy
文件夹下会生成
然后创建 python
脚本
#encrypt.js
import requests
from mitmproxy import ctx
def get_rpc():
url = "http://127.0.0.1:12080/go"
data = {
"group": "group1",
"name": "code",
"action": "getinfo"
}
result = requests.post(url, data=data)
return result.json()['data']
def request(flow):
result = eval(get_rpc())
flow.request.headers['Nonce'] = result['nonce']
flow.request.headers['Custappid'] = result['custAppId']
flow.request.headers['Timestamp'] = str(result['timestamp'])
flow.request.headers['Signature'] = result['signature']
之后运行 mitmproxy
(需要注意的是存在三个程序,我们运行的 mitmproxy
是其中的一个,它的优点就是控制台输出信息较为明朗,但是如果存在 bug
的情况下建议调试使用 mitmdump
)
mitmproxy.exe -p 8081 -s .rpc.py
设置 Burp
的上游代理
成功,要注意我们用 burp
发包,burp
上的值没有变是正常的,因为请求经过 mitmproxy
才会被修改
我们可以对比一下,实际上,值已经被修改了
本文作者:小惜渗透
原文地址:https://xz.aliyun.com/t/13232
原文始发于微信公众号(刨洞安全团队):JS逆向实战:RPC + Mitmproxy
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论