【js逆向实战】RPC+mitm
2024-1-10 11:15:17 Author: WIN哥学安全(查看原文) 阅读量:10 收藏

本公众号技术文章仅供参考!
文章仅用于学习交流,请勿利用文章中的技术对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。

文章首发先知,觉得公众号观看不方便可移步:https://xz.aliyun.com/t/13232

这年头标记个原创都费劲啊,之前在吾爱看到正几用自己的休息时间为大家讲解安卓逆向课,自己写教案,做Demo,录视频,结果被某个臭名昭著的培训机构直接扒来用,连教案都没变,demo标题都没改,收费200一节的价格,这还不算后续推销直接少则上千,多则上万的后续呢。

我这篇文章发送的时候,告诉我重复率高,标记不了原创,我一看是别人转的我在先知上的文章,也没跟我说,然后简单看了一眼,那个号几乎所有文章都是转的而且阅读量都很高,不做评论。

日常挖洞的时候,较为浅显的漏洞肯定是非常容易发现,除了这些,容易忽视的是那些在动态防护或一些JS防护机制下存在的漏洞,所以JS逆向是挖漏洞的大势所趋,JS逆向中RPC调用是一个降本增效的方法,此文属于在正式环境中的存在的需求用到了RPC技术,复述了整个利用流程。

【js逆向实战】RPC+mitm1. JS分析2. rpc调用3. mitmproxy

1. JS分析

遇到个需求,网站如下,是一个手机号验证码登录,现在的需求是看看这个验证码有没有锁定策略,很简单只要把发送验证码的包用爆破模块,设置单线程并且每过60秒发送一次就可以

image-20231229095245906

但是发现这个包有校验,这里请求头中多了四个参数,CustappidTimestampSignature,Nonce,发现改动任何一个响应就会失败

image-20231229112555213
image-20231229095336695

接下来去浏览器中,定位相关js代码逻辑,其实定位这里有很多方式,常用的两种方式就是全局搜索关键字或看流量堆栈,我习惯第二种,不过依据这次的环境全局搜索来的快一些

image-20231229101540276

逻辑在此,其实那个signature我也分析了一波,就是一些值,先sha256然后再md5,不过这次主要是讲rpc,所以这里不深入展开了,继续,可以看到我们需要的对应函数为_()

image-20231229101611941

不过这个时候我们去控制台去执行它是不会执行成功的

image-20231229101802793

因为函数作用域问题,所以我们这个时候需要在刚才的js代码处打个断点,然后点击发送验证码,触发断点

image-20240108102750612

这个时候我们去控制台调用该函数就可以正常调用了

image-20231229101933086

为了方便实用这个时候我们需要将这个函数设置成全局函数,这样不在debug的时候,我们也可以正常调用了

window._ = _

然后我们放行断点后也可以正常调用了

image-20231229102136830

2. 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");

image-20231229104510542

然后我们注册我们之前的函数_()

demo.regAction("getinfo"function (resolve{
    var infos = _();
    resolve(JSON.stringify(infos));
})
image-20231229105244424

然后我们直接访问接口看一下

http://localhost:12080/go?group=group1&name=code&action=getinfo
image-20231229105350353

可以正常调用,然后我们可以用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())

image-20231229110245156

3. mitmproxy

接下来就是我们联动Burp了,我想让Burp发包的时候默认将这些参数给我带上,让我能够正常发包,这里我们可以使用mitmproxy来开一个上游代理,然后我们就可以自定义经过的请求包了,!!注意要python3.10以上,用pip安装即可

pip install mitmproxy

然后记得装一下mitmproxy的证书,先运行一下,然后在用户目录的.mitmproxy文件夹下会生成

image-20231229111138419

然后创建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的上游代理

image-20231229111545175

成功,要注意我们用burp发包,bp上的值没有变是正常的,因为请求经过mitmproxy才会被修改

image-20231229125123805

我们可以对比一下,实际上,值已经被修改了

image-20231229130106661

文章来源: http://mp.weixin.qq.com/s?__biz=MzkwODM3NjIxOQ==&mid=2247496435&idx=2&sn=a5ad51c401e8e2809e27241a3dbe318f&chksm=c1523b74b343e0cff23b6ef8ed4dc9d79dfc5583f3aadcd8ad5ec28d732779e8e3b01cced7e9&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh