开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6348|回复: 2
收起左侧

[技术专题] 【JS逆向】咪咕视频登录RSA | 每日JS

[复制链接]
结帖率:100% (4/4)
发表于 2019-12-11 14:00:11 | 显示全部楼层 |阅读模式   安徽省亳州市

[第二天]
[img=1240,698]https://upload-images.jianshu.io/upload_images/17021407-1f4f19b92533d0a4.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240[/img])

JavaScript逆向练习2

0x01 目标网址

http://www.miguvideo.com/

抓包或者右键查看框架源代码可以看到,弹出的登录框URL为:

https://passport.migu.cn/login?sourceid=203021&apptype=2&forceAuthn=true&isPassive=false&authType=&display=&nodeId=70027513&relayState=login&weibo=1&callbackURL=http%3A%2F%2Fwww.miguvideo.com%2Fmgs%2Fwebsite%2Fprd%2Findex.html%3FisIframe%3Dweb

0x02 定位JS

1. 随便输入账号密码验证码,,有验证码要输入正确的验证码,点击登录,查看提交的参数

[img=1240,573]https://upload-images.jianshu.io/upload_images/17021407-6ee6373c4fa3375b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240[/img]

可以看到,发出了两个请求,第一个是获取key,第二个是登录,在登录包里有加密过 的参数,密码enpassword、伪指纹fingerPrintfingerPrintDetail

2. Ctrl+Shift+F调出搜索面板,搜索enpassword,看到只要一个结果,而且是网页源码。

[img=1129,849]https://upload-images.jianshu.io/upload_images/17021407-58bcb8acfcfe6c58.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240[/img]

乍一看没有头绪,其实这里是通过Class来定位取值的,也就是说,这里可以试试再搜索一次Class的值:J_RsaPsd,可以看到有两条结果,第二个是我们上一次搜索的结果,肯定不是加密点,所以应该是在第一个结果里。

[img=1143,885]https://upload-images.jianshu.io/upload_images/17021407-677a6a82ede249b2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240[/img]

点进第一个结果,点花括号格式化一下,Ctrl+F搜索J_RsaPsd,发现有三个结果,稍作分析,在每一个可疑的地方都下断点。

[img=1240,694]https://upload-images.jianshu.io/upload_images/17021407-7f60b6e087f0ec81.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240[/img]

3. 重新输入账号密码验证码,点击登录,JS被断了下来,我们要的加密点是在328-338行的位置,代码扣下来备用。

success: function(a) {
    if (a.status = g.ajax.SUCCESS) {
        c.each(function() {
            var b = $(this),
                c = new j.RSAKey;
            c.setPublic(a.result.modulus, a.result.publicExponent);
            var d = c.encrypt(b.val());
            b.siblings(".J_RsaPsd").val(d)
        });
        var b = i.page.rsaFingerprint(a.result.modulus, a.result.publicExponent);
        d.filter(".J_FingerPrint").val(b.result).end().filter(".J_FingerPrintDetail").val(b.details)
    }

这段代码就是当异步请求Key(就是1中抓包看到的两条请求中的第一个)成功后,根据Key进行加密操作。

其中b.val()是明文密码,a.result.modulus, a.result.publicExponent是第一条请求得到的Key,直接固定,i.page.rsaFingerprint是计算另外两个加密参数。

鼠标悬停在j.RSAKey上(这里是new出来的对象,先要找到来源),点击弹出的内容,直接跳转进去。

[img=1113,628]https://upload-images.jianshu.io/upload_images/17021407-c688f307bc50bd55.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240[/img]

4. 进入对象的定义函数中,发现全是this,那就直接把整个上一层全拿走,一直翻,找出的上层代码是3916行开始,到4521行结束。

define("lib/rsa/rsa", [], function(a, b, c) {
    function d(a, b, c) {
        null != a && ("number" == typeof a ? this.fromNumber(a, b, c) : null == b && "string" != typeof a ? this.fromString(a, 256) : this.fromString(a, b))
    }
***
省略
***
    ab.prototype.nextBytes = _,
    db.prototype.doPublic = fb,
    db.prototype.setPublic = eb,
    db.prototype.encrypt = gb,
    c.exports = {
        RSAKey: db
    }
}),

5. 到这里已经可以开始改写密码加密部分的内容了,但是还有两个参数也有加密,我还是一起扣出来再改写。

同上,在337行下个断点,再运行到这里。鼠标悬停在rsaFingerprint上,点击弹出的内容,直接跳转进去。

https://upload-images.jianshu.io/upload_images/17021407-53bd3ffb2ab720c9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

直接把定义函数扣出来就可以。

        rsaFingerprint: function(a, b) {
            if (!$.fingerprint)
                return {
                    details: "",
                    result: ""
                };
            var c = $.fingerprint.details
              , d = $.fingerprint.result
              , e = c.length
              , f = ""
              , g = new l.RSAKey;
            g.setPublic(a, b);
            for (var h = g.encrypt(d), i = 0; e > i; i += 117)
                f += g.encrypt(c.substr(i, 117));
            return {
                details: f,
                result: h
            }
        }

这其中参数a,b是第一条请求的Key,可以直接固定;$.fingerprint可以到console输出看一下,是浏览器、请求头相关的信息,可以说是伪指纹,暂且固定,最后return的是个对象,正好是登录包里的另外两个参数。

0x03 改写JS

1. 先写一个调用函数。

var p1 = "00833c4af965ff7a8409f8b5d5a83d87f2f19d7c1eb40dc59a98d2346cbb145046b2c6facc25b5cc363443f0f7ebd9524b7c1e1917bf7d849212339f6c1d3711b115ecb20f0c89fc2182a985ea28cbb4adf6a321ff7e715ba9b8d7261d1c140485df3b705247a70c28c9068caabbedbf9510dada6d13d99e57642b853a73406817",
    p2 = "010001";//因为另一个加密也要调用这两个值,所以定义在函数外面,作为全局变量用。

function getP(pass) {//密码加密计算函数,仿照加密点代码写的。
    var c = new RSAKey;
    c.setPublic(p1, p2);
    var d = c.encrypt(pass);
    return d;
}

2. 改写RSAKey对象定义处

window = this;
navigator = {}; //把需要用到的值先定义空对象

//把第一行删掉,把内部的函数暴露出来(对应的结尾部分的括号也删掉)
//define("lib/rsa/rsa", [], function(a, b, c) {
    function d(a, b, c) {
        null != a && ("number" == typeof a ? this.fromNumber(a, b, c) : null == b && "string" != typeof a ? this.fromString(a, 256) : this.fromString(a, b))
    }
***
省略
***
    ab.prototype.nextBytes = _,
    db.prototype.doPublic = fb,
    db.prototype.setPublic = eb,
    db.prototype.encrypt = gb;
    //把原来的逗号换成分号结束掉语句。

    //,
    //c.exports = {
    //    RSAKey: db
    //}
    //本来是用exports来对外导出,现在直接定义对象就可以。
    var RSAKey = db;
//}),

现在就可以通过getP(pass)来加密明文密码了。

3. 改写rsaFingerprint定义

先把之前console里输出的浏览器信息定义成变量,再把函数部分改成正常的定义就可以了。

把开始的if判断给删除,另外这里还要把对应的值都给换一下,如*.RSAKey换成RSAKey。

var details = '{"user_agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safa","language":"zh-CN","color_depth":"24","pixel_ratio":"1.25","hardware_concurrency":"4","resolution":"1536,864","available_resolution":"1536,824","timezone_offset":"-480","session_storage":"1","local_storage":"1","indexed_db":"1","open_database":"1","cpu_class":"unknown","navigator_platform":"Win32","do_not_track":"unknown","regular_plugins":"Chromium PDF Plugin::Portable Document Format::application/x-google-chrome-pdf~pdf,Chromium PDF View","webgl_vendor":"Google Inc.~ANGLE (Intel(R) HD Graphics 530 Direct3D9Ex vs_3_0 ps_3_0)","adblock":"true","has_lied_languages":"false","has_lied_resolution":"false","has_lied_os":"false","has_lied_browser":"false","touch_support":"0,false,false","js_fonts":"Arial,Arial Black,Arial Narrow,Book Antiqua,Bookman Old Style,Calibri,Cambria,Cambria Math,Century,C"}',
    result = "2754353484e6bed2ec7cf41dddba8bce"
rsaFingerprint = function() {
    var c = details,
        d = result,
        e = c.length,
        f = "",
        g = new RSAKey;
    g.setPublic(aaaa, "010001");
    for (var h = g.encrypt(d), i = 0; e > i; i += 117)
    f += g.encrypt(c.substr(i, 117));
    return {
        details: f,
        result: h
    }
}

此时就可以运行了。

0x04 代码

省略

PS

如果在加密后的登陆过程中出现异常,那可能是浏览器信息的问题,仔细对照看看哪里不一样就知道了。


评分

参与人数 2好评 +1 精币 +3 收起 理由
wwl12250 + 1 有视频教程嘛?
qq137547401 + 1 + 2 感谢分享,很给力!~

查看全部评分


结帖率:100% (4/4)

签到天数: 20 天

发表于 2021-6-27 01:34:29 | 显示全部楼层   四川省成都市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (12/12)
发表于 2019-12-11 23:32:49 | 显示全部楼层   四川省南充市
谢谢,很详细
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表