声明

本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

目标

目标网站

aHR0cHM6Ly9iai5rZS5jb20v

目标

获取登录列表中的 passwordloginTicketIdsrcId

抓包分析

我们对比两次抓包 (建议都使用无痕浏览器 或者是使用抓包软件)来看看这个请求参数



可以看到 如上图所示。有区别的分别是

  1. password
  2. context 字典中的值
  3. loginTicketId

这个context本文不做研究。我们把我们需要逆向的两组值拿出来。

// ==== 第一次请求 ====
"password": "FtvyGhja3uFP+aVoKUuUntFybn8/O4BoDGoNdfrfm2BAbZo3NXw0VliAhSE39jBiYbXH7kEMetiXEmSsO4WZEtU51uSkV3rrsPDYjuGk2SzEDzvTZ2iLpC8ghY0Na8xqZqA/CvFOrNR8DTdjeuPNur9+y4KQ5U1S+yQ08+38cng=",
"loginTicketId": "N33YL74DgakMzd3UDU2xml3OLxypILHf",
"srcId": "eyJ0Ijoie1wiZGF0YVwiOlwiMmFmNDE2MGViODlmZjY5MzYyYzhhYjYwZjk2M2U4OTVmNWY0YmZjN2U1NTE3NThlZGI3MDYzZDY2Y2JlZWVmYTRhZDJmZWVmYzgyZWQxMDg1ODJlODk1OGIzNDNmNDAxYTRjMzk5MzhlNmU1YThlZjc3YjhmY2E1MDU4ZGQ2ZTdmMGUyYjljMzViMTcxYTA4NzE5M2M4MmVkMjZmOTEwMWMyMjYxOTQ1ZGY1MWE0NDAxOGUyZDJiZWJlYTg3NDU4NGE0ZWVjZWRlZWFhZmZlNWU3NmU2ZjQ2YWFiMzgxODJjMzFmMDA3ZDFkODUxM2VmMmFhODBlZGZhN2ZlMzkyNVwiLFwia2V5X2lkXCI6XCIxXCIsXCJzaWduXCI6XCIwOTMzYjdiN1wifSIsInIiOiJodHRwczovL2JqLmtlLmNvbS8iLCJvcyI6IndlYiIsInYiOiIwLjEifQ==", // ==== 第二次请求
"password": "MCHQCwLmp3O22OmWoIv1qvkRfTkkzGiZmHZnEDaTdgY0mLwD9Ve+XcsZYiT/i+8V4rB2j3JCF5kWUp8Hx/YNkiL6FuBO4MWujradjYkkv8WN92creehj+RnvXUKkLNe4vMXUWKSMxVM9kbq+OFOOWJAtc3tocLjqJlN7apvYtKs=",
"loginTicketId": "dagM7n2Hn8NNUJLemfLanH7MCk4wYYNz",
"srcId": "eyJ0Ijoie1wiZGF0YVwiOlwiMmFmNDE2MGViODlmZjY5MzYyYzhhYjYwZjk2M2U4OTVmNWY0YmZjN2U1NTE3NThlZGI3MDYzZDY2Y2JlZWVmYTRhZDJmZWVmYzgyZWQxMDg1ODJlODk1OGIzNDNmNDAxYTRjMzk5MzhlNmU1YThlZjc3YjhmY2E1MDU4ZGQ2ZTdmMGUyYjljMzViMTcxYTA4NzE5M2M4MmVkMjZmOTEwMWMyMjYxOTQ1ZGY1MWE0NDAxOGUyZDJiZWJlYTg3NDU4NGE0ZWVjZWRlZWFhZmZlNWU3NmU2ZjQ2YWFiMzgxODJjMzFmMDA3ZDFkODUxM2VmMmFhODBlZGZhN2ZlMzkyNVwiLFwia2V5X2lkXCI6XCIxXCIsXCJzaWduXCI6XCIwOTMzYjdiN1wifSIsInIiOiJodHRwczovL2JqLmtlLmNvbS8iLCJvcyI6IndlYiIsInYiOiIwLjEifQ==",

ps: 原值密码都是一样。

我们本文目标之一是弄出来这个srcId 由于有点像一个定值。看上去好欺负一点。所以我们先去搜这个srcId


srcId

直接搜索srcid即可



然后找到了这个生成的地方。是用base64 生成的。也确实这个值很像base64。我们执行下看看。



可以看到 和我们刚刚请求的值一模一样。

从第一张图我们看到

  • t 有点像一个接口的返回值。
  • n是当前页面的 URL 地址
  • os和v是定值。

t的话。我们先跟栈看看



好的 跟了两个栈之后得到这个responseURL的值。那我们就可以通过请求这个地址得到这个t的值。那么这样的话所有的值都得到了。

我们可以改下一下JS 封装一下函数

window= global;
function get_srcID(t) { srcId = window.btoa(JSON.stringify({
t: t, r: "https://bj.ke.com/", os: "web", v: "0.1"
})
)
return srcId }

ps: 这个t值 所请求的连接为:https://miao.baidu.com/abdr 请求的请求负载加密为百度喵星人跟踪URL指纹加密。请看后续单独段落介绍


loginTicketId

搜索loginTicketID。发现这个值等于某个请求里的值。



很简单了。伪造请求,查看URL的值和t的值



请求就能得到loginTicketID


password

搜索跟栈 找到密码加密处



然后点击下一步



发现这里套了两层函数



第一层this.getKey().encrypt(t) 得到了一个hex的值。

得到最终加密的值

然后我们进函数看



发现都是给t这个原型链赋值函数

然后我们就发现这是个webpack。那其实这样就简单了。不需要扣太多代码。把加载器搞出来。后面按照webpack的方式扣。直接调用最外层的o.ec.encrypt(t.password)这个函数即可。

步骤如下:

  1. 定义全局变量
  2. 把这个o.ec赋值给全局变量
  3. 最下面调用这个全局变量.encrypt

那现在的目标就很明确了 找一下这个o.ec 在哪里开始定义的。

搜索**.ec**** 找到new 声明函数的位置**



然后我们就可以进行改写了

既然得到了大体流程。我们就可以進行調試了 再次之前 需要找到加密的模块在哪个函数里。方便我们在结果中调用。

我们直接在随便一个调用n的地方打上断点。然后输入 n.m



这样所有的模块下标与模块就都显示出来了。

然后我们用查询模糊字符串索引的方式 返回函数下标

代码如下:

n.m.forEach(function(func,index) {
if (func.toString().indexOf('o.ec.encrypt(t.password)')!=-1){
console.log(index)
} })

结果如下:



然后我们输入



去复制这个函数。然后丢到webpack的模块中。然后一个一个顺着补就可以了

扣代码

复制加载器。把索引为53的模块 复制到文件中就可以开始补了

window = global;

!function(n) {
var r = {};
function i(t) {
if (r[t])
return r[t].exports;
var e = r[t] = {
i: t,
l: !1,
exports: {}
};
console.log(t)
return n[t].call(e.exports, e, e.exports, i),
e.l = !0,
e.exports
}
...
window.bk = i
}(
{
53:...
....
}
); window.bk(53).default()

报错 : window is not defined



补上

window = global;

报错:navigator is not defined



补上

navigator = {
appName:"Netscape"
}

补到51位会跳出个 window.location.href未定义



补上

window.location= {
href:'https://bj.ke.com/'
}

这里补环境的参数基本只有这些。

后面就是扣webpack 。篇幅问题就不讲了。

等扣到最后 会报一个 t.services 未定义。

不用管。直接把这些未定义的全部注释掉就可以了。

然后我们定义一个全局变量复制给this.ec



如下图所示。

然后我们调用这个函数即可。

window.bk(53).default()
console.log(window.zx.encrypt("admin*123"))

结果



最后成功出值。我们放到代码中运行下看看



可以看到 这里返回给我们的值是密码校验失败。说明直接调用这个还是不对。我们重新去网站中跟着栈走一遍 看看。

然后我们跟栈 初始化——密码加密 发现有这么一段代码。



在请求xxx/authentication/authenticate 的函数的时候。还返回了一个公钥。需要传给js。所以才执行不成功。

**PS: 其实这里公钥可以写死,但是为了防止公钥改变。我这里用的请求里的公钥。

然后重新请求。发现请求成功了。

百度miao URL 指纹加密

上文留了个小坑: srcId这个值。我们最后用的其实是一串定值。

而这串值怎么来的呢? 是请求https://miao.baidu.com/abdr这个地址得来。

那我们去找这个请求。



然后一看。这玩意好像是百度做广告用的推广URL。把这个请求负载有点像base64.我们进行base64解码看看。

这个token用base64解码后,有两个字段,分别是"key_id"和“data”。


好 这个我们暂且不管。直接去看栈,然后跟栈去请求。

一步一步跟栈(真的跟的很辛苦)得到下文这个参数的地方



然后继续往下走



得到了这些提交的参数。可以看到。这些提交的参数。就是一些浏览器指纹。还有一些乱七八糟的信息。然后搅和在一起做的计算。

这里我使用的是补环境的方式。直接用挂上proxy代理。然后把T的值传进去就行了。

也可以用扣代码,也算是相对简单的。感兴趣可以自己扣一下

结果



依然能请求成功!!

对了 感兴趣的小伙伴 可以关注下我的微信公众号

JS逆向实战25——某壳找房模拟登录+百度喵星人指纹加密破解.的更多相关文章

  1. JS逆向实战5--JWT TOKEN x_sign参数

    什么是JWT JWT(JSON WEB TOKEN):JSON网络令牌,JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式在不同实体之间安全传输信息(JSON格式).它是在Web环境下 ...

  2. JS逆向实战4--cookie——__jsl_clearance_s 生成

    分析 网站返回状态码521,从浏览器抓包来看,浏览器一共对此地址请求了三次(中间是设置cookie的过程): 第一次请求:网站返回的响应状态码为 521,响应返回的为经过 混淆的 JS 代码:但是这些 ...

  3. JS逆向实战3——AESCBC 模式解密

    爬取某省公共资源交易中心 通过抓包数据可知 这个data是我们所需要的数据,但是已经通过加密隐藏起来了 分析 首先这是个json文件,我们可以用请求参数一个一个搜 但是由于我们已经知道了这是个json ...

  4. JS逆向实战11——某金属集团动态cookie加密

    本文来自:来自: https://www.cnblogs.com/zichliang/ 目标网站 aHR0cDovL3d3dy50bm1nLmNvbS5jbi9pbmZvcm1hdGlvbi9pbmZ ...

  5. JS逆向实战8——某网实战(基于golang-colly)

    其实本章算不上逆向教程 只是介绍golang的colly框架而已 列表页分析 根据关键字搜索 通过抓包分析可知 下一页所请求的参数如下 上图标红的代表所需参数 所以其实我们真正需要的也就是Search ...

  6. JS逆向实战7-- 某省在线审批网站params 随机生成

    参数分析 我们首先通过抓包 发现这个就是我们所需要的数据 然后我们通过fidder 发起请求 结果: 通过我们反复测试 发现这个params的参数是每次请求中都会变化的 断点查找 我们通过 这个t参数 ...

  7. JS逆向实战6-- x轴 y轴 过点触验证码

    点触验证码是一种常见的反爬手段 解决方案有两种:一种是直接解决,这需要深度学习机器学习等图像处理技术,以大量的数据训练识别模型,最终达到模型足矣识别图片中的文字提示和应该点击的区域之间的对应关系. 这 ...

  8. JS逆向实战2--cookie-AcwScV2加密—某招标信息网

    cookies的获取 首先拿到第一次访问原链接 拿到acw_tc的值,然后放到session中去 再用这个session再次访问原链接拿到js加载的加密的真实数据.用了一些反混淆. 最后获取这个数据中 ...

  9. JS逆向实战1——某省阳光采购服务平台

    分析 其实这个网站基本没有用到过什么逆向,就是简单的图片base64加密 然后把连接变成2进制存成文件 然后用ocr去识别即可 !! 注意 在获取图片连接 和对列表页发起请求时一定要用一个请求,也就是 ...

  10. JS逆向实战9——cookies DES加密混淆

    cookie加密 DES 混淆 目标网站:aHR0cHM6Ly90bGNoZW1zaG9wLnlvdXpoaWNhaS5jb20vbWFpbi90ZW5kP05vdGljZUNhdGVJZD0xJk5 ...

随机推荐

  1. 从0开发WebGPU渲染引擎:实现路径追踪

    大家好,本文基于WebGPU的计算着色器实现了基础的路径追踪器,支持Middle BVH和No BVH两种加速结构 我主要是将离线渲染零基础实战开发培训班(一期)->第二十九节课的代码移植到We ...

  2. 防缓存穿透利器-布隆滤器(BloomFilter)

    布隆过滤器 1.布隆过滤器原理 1.1 什么是布隆过滤器 1.2 使用场景 1.3 原理 1.4 布隆过滤器的优缺点 2.实现方式 2.1 初始化skuId的布隆过滤器 2.1.1 RedisCons ...

  3. 简单解决jsp中文乱码问题

    简单解决jsp中文乱码问题 初学jsp制作一个简单的响应页面 具体代码如下: <form action="test.jsp"> username : <input ...

  4. Smali语言

    什么是Smali smali语言是Davlik的寄存器语言,语法上和汇编语言相似,DalvikVM与JVM的最大的区别之一就是DalvikVM是基于寄存器的.基于寄存器的意思是,在smali里的所有操 ...

  5. 如何在 Ubuntu 20.04 上安装 KVM

    如何在 Ubuntu 20.04 上安装 KVM 遇到两个问题: 没有创建 /etc/qemu/bridge.conf 文件 ERROR internal error: /usr/lib/qemu/q ...

  6. 2021-7-12 VUE的组件认识

    VUE组件简单实例 <!DOCTYPE html> <html> <head> <title> </title> </head> ...

  7. appium环境搭建python

    python appium环境搭建   appium是什么? 1,appium是开源的移动端自动化测试框架:2,appium可以测试原生的.混合的.以及移动端的web项目:3,appium可以测试io ...

  8. 《高级程序员 面试攻略 》RocketMQ 如何保证顺序性

    RocketMQ 提供了一种称为顺序消息的机制来确保消息的顺序性.下面是一些关键的方法和概念: 1. 顺序消息:顺序消息是指在发送和消费过程中,消息按照特定的顺序进行处理.RocketMQ 通过将消息 ...

  9. 在 Visual Studio 2022 中使用文件对比

    在最新版本的 Visual Studio 2022 中,加入了新的功能特性--"文件对比". 在开发过程中,开发人员有时会需要比对文件差异,特别是代码文件,之前很多时候是借助版本控 ...

  10. Facade Pattern and Encapsulation—— Structure Class

    如果只看代码的话,应该可以说Facade pattern(门面设计模式)是一种最简单的代码结构,不就封装吗!这玩意谁不会! 还是看它背后所蕴含的思想吧,看了之后发现背后的思想也很简单,非常好理解. - ...