JS逆向入门案例-瑞树3(cookie值)- 16

文章目录

    • 概要
    • 整体架构流程
    • 技术细节
    • 小结

概要

提示:仅供学习,不得用做商业交易,如有侵权请及时联系

逆向:瑞树3 - cookie值

URL:aHR0cDovL3d3dy5jaGluYWRydWd0cmlhbHMub3JnLmNuL2luZGV4Lmh0bWw=

目标:

在这里插入图片描述

整体架构流程

提示:大致步骤跟瑞树4差不多

一、加载步骤(生成):
1、打开无痕浏览器窗口 - 输入网址 - 事件监听器打开脚本直接断住
在这里插入图片描述

ts文件

2、跟栈往后面走,到html文件
在这里插入图片描述

这里分别是content和js组成,content后面会取值,js会生成cookie

注意:我们不能直接去复制到本地的js文件中,不然会出现js的转义问题
3、python获取对应的content、ts、js代码

headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0',
}

response = requests.get('http://xxx/index.html', headers=headers, verify=False)
print('第一次访问状态:',response.status_code)

tree = etree.HTML(response.text)
content =tree.xpath('//meta[2]/@content')[0]
content = 'content = "{}";'.format(content)
content = content.replace('\\',"\\\\")

with open('./cont.js','w') as f:
    f.write(content)

cd = tree.xpath('//script[2]/text()')[0]
with open('./cd.js','w') as f:
    f.write(cd.replace('\\',"\\\\"))

tsUrl = 'http://www.xxxx.org.cn' + tree.xpath('//script[1]/@src')[0]
with open('./ts.js','w') as f:
    f.write(requests.get(url = tsUrl,headers=headers,verify=False).text)

4、挂代理补环境:

function proxy(obj,name){
    return new Proxy(obj,{
        get:function (target, p, receiver) {
            console.table([{'method':'get',target:name,p:p,receiver:receiver,value:Reflect.get(target, p, receiver)}])
            return Reflect.get(target, p, receiver)
        },
        set:function (target, p, value,receiver){
            console.table([{'method':'set',target:name, p:p, value:value, receiver:receiver}])
            return Reflect.set(target, p, value, receiver)
        },
    })
};

注意:补着补着会发现,会检测nodejs,出现变量没有定义或者方法没有的情况
5、不能直接挂代理补,得使用vm2,纯v8环境

二、使用vm2,首先要下载,还有就是浏览器联调:

npm install -g vm2
npm install -g node-inspect

const {VM,VMScript} = require("vm2");
const fs = require('fs');
var code = fs.readFileSync('./env.js') + '\n'   // 环境代码
code += fs.readFileSync('./cont.js') + '\n'     // content代码
code += fs.readFileSync('./ts.js') + '\n'       // ts代码
code += fs.readFileSync('./cd.js') + '\n';      // js代码

const vm = new VM();
vm.run(code);

vscode联调:调试配置

在这里插入图片描述

pycharm联调:–inspect-brk

在这里插入图片描述

这里我使用的是vscode

在这里插入图片描述
三、在env.js加上代理直接开补,缺啥补啥:
在这里插入图片描述

document:getElementById 9DhefwqGPrzGxEp9hPaoag

在这里插入图片描述

document = {
    getElementById:function (res){
        if(res === '9DhefwqGPrzGxEp9hPaoag'){
            return proxy({
                content:content,
                parentNode:{
                    removeChild:function (){}
                }
            },'meta1')
        }
    },
    createElement:function (res){
        if(res === 'div'){
            return proxy({
                getElementsByTagName:function (res){
                    if(res === 'i'){
                        return {length:0}
                    }
                },
                innerHTML:''
            },'div')
        }
    },
    characterSet:'UTF-8',
    exitFullscreen:function (){

    },
    documentElement:proxy({
        style:proxy({},'documentElement-style'),
        getAttribute:function (){
            return null
        }
    },'documentElement'),
    addEventListener:function (){},
    cookie:'',
    getElementsByTagName:function (res){
        if(res === 'script'){
            return proxy(script,'script')
        }
    }
}

navigator:直接补Navigator

在这里插入图片描述

Promise2 = {
    then: function () {
        return this;
    },
    catch: function (){},
};
Navigator = function Navigator(){};
Navigator.prototype.toString = function (){
    return '[object Navigator]'
}
Navigator.prototype.getBattery = function (){
    return proxy(Promise2,'Promise2'); // 电源状态信息
}
PluginArray = function PluginArray(){}
PluginArray.prototype.toString = function (){return '[object PluginArray]'}
PluginArray.toString = function (){return 'function PluginArray() { [native code] }'}
Object.defineProperties(PluginArray.prototype,{[Symbol.toStringTag]:{value:'PluginArray'}})

plugins = proxy({
    length: 5,
    '0': proxy({
        name: 'PDF Viewer',
        filename: 'internal-pdf-viewer',
        length: 2,
        '0': proxy({
            type:'application/pdf'
        }, 'plugins00'),
        '1': proxy({
            type:'text/pdf'
        },'plugins01')
    },'plugins0'),
    '1': proxy({
        name: 'Chrome PDF Viewer',
        filename: 'internal-pdf-viewer',
        length: 2,
        '0': proxy({
            type:'application/pdf'
        }, 'plugins10'),
        '1': proxy({
            type:'text/pdf'
        },'plugins11')
    },'plugins1'),
    '2': proxy({
        name: 'Chromium PDF Viewer',
        filename: 'internal-pdf-viewer',
        length: 2,
        '0': proxy({
            type:'application/pdf'
        }, 'plugins20'),
        '1': proxy({
            type:'text/pdf'
        },'plugins21')
    },'plugins2'),
    '3': proxy({
        name: 'Microsoft Edge PDF Viewer',
        filename: 'internal-pdf-viewer',
        length: 2,
        '0': proxy({
            type:'application/pdf'
        }, 'plugins30'),
        '1': proxy({
            type:'text/pdf'
        },'plugins31')
    },'plugins3'),
    '4': proxy({
        name: 'WebKit built-in PDF',
        filename: 'internal-pdf-viewer',
        length: 2,
        '0': proxy({
            type:'application/pdf'
        }, 'plugins40'),
        '1': proxy({
            type:'text/pdf'
        },'plugins41')
    },'plugins4')
}, 'plugins')
plugins.__proto__ = PluginArray.prototype;
Navigator.prototype.plugins = plugins
Navigator.prototype.mimeTypes = proxy({
    length:2,
    '0':{
        type:'application/pdf',
        description:'Portable Document Format'
    },
    '1':{
        type:'application/pdf',
        description:'Portable Document Format'
    }
},'mimeTypes')
Navigator.prototype.webdriver = false;
Navigator.prototype.connection = {
    downlink: 4.7,
    effectiveType: "4g",
    onchange: null,
    rtt: 50,
    saveData: false
}
Navigator.prototype.platform = 'Win32'
Navigator.prototype.appCodeName = 'Mozilla'
Navigator.prototype.appName = 'Netscape'
Navigator.prototype.appVersion = "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
Navigator.prototype.deviceMemory = 8
Navigator.prototype.hardwareConcurrency = 8
Navigator.prototype.webkitPersistentStorage = proxy({},'webkitPersistentStorage')
Navigator.prototype.language = "zh-CN"
Navigator.prototype.languages = ['zh-CN', 'zh']
Navigator.prototype.userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
Navigator.toString = function (){
    return 'function Navigator() { [native code] }'
}
Object.defineProperties(Navigator.prototype,{
    [Symbol.toStringTag]:{
        value:'Navigator'
    }
})

screen:到这里吧,慢慢补,没什么检测,代码补通了就可以

在这里插入图片描述

最后看结果:

在这里插入图片描述
提示:关于怎么调出值,上面写了那个注释就是

//func_name :方法名称
function result(func_name) {
    let lwVm_module = {
        exports:{}
    }
    let export_func = `\r\nlwVm_module.exports = {
        ${func_name}: ${func_name},
    }`;
    const vm = new VM({ sandbox: { lwVm_module } });
    
    var code = fs.readFileSync('./env.js') + '\n'
    code += fs.readFileSync('./cont.js') + '\n'
    code += fs.readFileSync('./ts.js') + '\n'
    code += fs.readFileSync('./cd.js') + '\n';
    code += fs.readFileSync('./getcookie.js') + '\n';
    code += export_func;
    const script = new VMScript(code);
    return vm.run(script)['getCookie']();
}

console.log(result('getCookie'));

技术细节

在这里插入图片描述

小结

提示:学习交流+v主页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值