某Websocket反爬逆向分析+请求加解密+还原html

网址

aHR0cHM6Ly93d3cueWR4Zi5nb3YuY24vTmV3cy9zaG93TGlzdC80L3BhZ2VfMS5odG1s

前言

工作中遇到的某websocket反爬,比混淆网站还恶心,看到也有其他人在问这个

之前看到其他大佬也弄过这个websocket反爬,但是只是说了下加解密,个人觉得最重要的还是还原最终的html,所以来分享一下过程

目标

  • 过无限debugger
  • session请求加解密
  • websocket通信
  • 消息结构解析还原成html
  • 使用Python还原算法

分析过程

无限debugger

  1. 首先打开F12,刷新页面发现会被断住
  2. 右键js文件替换内容
  3. 看堆栈往上先随便点几个看看

  1. 可以直接找到通过正则检测代码格式化的检测点,这里是个自执行函数,我们需要把整个函数干掉,然后保存刷新页面
  2. 发现还是会被断住,老套路直接看堆栈往上找检测点

  1. 可以清楚看到定时器在不断检测,直接干掉就行了
  2. 刷新页面,到此为止无限debugger就过了,这个站的检测还是很简单的对吧

session请求加解密

  • XHR

  • Payload

  • Response

Payload加密

直接看xhr的堆栈

这个比较简单我就不废话了,看截图就行

跟进去函数后可以看到用到了iv,iv生成就在上面一个函数

往下继续跟,进入这个解密函数,这个解密函数计算iv的时候也用到这个函数

直接跟到下图这个位置可以看到是个AES加密,差不多就结束了,这个是个标准AES-128-CBC,直接引库就行了

Response解密

跟加密算法一致,用同一个key解密就行,这里就不再写具体流程了

Python实现

  • AES-128-CBC

代码抄了晨哥的 😛

  • 构造请求&加解密

  • 运行结果

Websocket

wss链接分析

wss://www.xxxx.cn/1ywuKELSO2ahQuWZ/pr/rSakD15JVxHzfnpXyZpkf4J5HNjv_CSciPJFAMMxKE0%3D/c/ws/zpgffq9z89/a0c20283-d62c-411a-820b-33e42f1c6082

  • 1ywuKELSO2ahQuWZ:固定值
  • rSakD15JVxHzfnpXyZpkf4J5HNjv_CSciPJFAMMxKE0%3D:session返回的token值
  • zpgffq9z89:网站tab_id,与请求时保持一致,随机字符串(可固定)
  • a0c20283-d62c-411a-820b-33e42f1c6082:uuid,可固定

Python连接Websocket

  • 第三方库:websocket-clientmsgpack
  • 代码

  • 结果

这里返回的结果通过msgpack进行解包了,这里就不再赘述了,有兴趣的可以看我晨哥的分析文章讲到了这个https://mp.weixin.qq.com/s/o5UCJFhBg-4JFdS0aEwDuw

消息结构解析

重点来了,这个网站最难的不是session的加解密和websocket连接,而是websocket收发的消息,页面的内容均是通过websocket返回的特殊指令渲染出来的,因此我们从websocket中取想要的数据可能会比较复杂,并且不能通用,我们这里会讲到如何将收到的指令还原成原本的html,从而通过pyquery或者bs4等html解析库来提取数据

定位websocket接收消息函数

找到ws连接请求,进入第一个调用堆栈

在连接下面找到消息回调函数,直接下断点后跟进去

这样我们就找到了ws消息回调函数了

分析接收到的数据

单步跟着走一遍

可以直接把指令表拿出来,这样比较清晰,也可以根据对应名称来猜指令的作用

CommandCodes = {"TAB_OPS": 0,"DOM_EVENT": 4,"DOM_METHOD": 5,"RESET_DOM": 6,"ADD_DOC_TYPE": 7,"ADD_HTML_ELEMENT": 8,"ADD_SVG_ELEMENT": 9,"ADD_NS_ELEMENT": 10,"MOVE_ELEMENT": 11,"SHUFFLE_CHILDREN": 12,"EDIT_ELEMENT": 13,"DELETE_ELEMENT": 14,"ADD_STYLE": 15,"ADD_TEXT": 16,"MODIFY_TEXT": 17,"MODIFY_PROPERTY": 18,"MODIFY_ATTRIBUTES": 19,"SET_SELECTIONS": 20,"INSERT_RULE": 21,"DELETE_RULE": 22,"DISABLED_STYLE": 24,"SET_CANVAS_DATA": 23,"REPLACE_SYNC": 25,"WEBRTC": 30,"NAVIGATE": 31,"SYNC": 32,"SYNC_COOKIE": 34,"FILE": 35,"TAB_ACTIVE": 42,"NATIVE_METHOD": 44,"MODIFY_DOC_TYPE": 47,"CHANGE_BLOCK": 48,"RELOAD": 49,"SYNC_ALL_COOKIE": 50,"SYNC_WRITE_COOKIE": 51,"MEDIA_STATE": 52,"DOM_READY": 53,"AUGMENT_CSS": 54,"MULTI_CMD": 55,"REDIRECT_REQUEST": 56,"TEXTAREA_RESIZE": 57,"SIMPLE_HTML": 58,"RENDER_STATE": 59,"SYNC_CONFIG_TO_CLIENT_WIC": 60,"SYNC_CONFIG_TO_CLIENT_AIC": 61,"SYNC_CONFIG_TO_CLIENT_EIC": 62,"FRAME_PUSH_STATE": 63
}

断到一个53指令码,根据码表来看应该是dom相关的指令,继续单步跟

这里将数据传送到其他回调函数了,继续跟进去

大概跟了几个函数就跟到这里了,这里比较重要,我们慢慢看

这个应该是将数组形式的消息转换为对象形式,这个消息太短了,看不出效果,我们多接收几个消息看一下

这个55指令码对应的指令名是"MULTI_CMD": 55 ,应该是多条指令的集合,我们还需要对content的多条指令进行转换,才能拿到最终的对象

单步跟了一下后发现会进入到另外一个接收函数

这里就是根据不同指令码来执行不同操作的地方了

可以看到这个55指令码实际上会进行递归执行指令

后面会根据不同指令码来走不同的分支,我这里就直接给结果吧,"ADD_DOC_TYPE": 7

这个指令操作会给在html中添加一个dom元素,它这里实际上是将这个指令都放到一个指令队列里面,然后再根据指令队列循环操作dom树来渲染页面元素

将websocket消息转换为对象

单步跟进之前那个转换指令的函数

这里会根据e的指令码映射拿到对应的指令处理器,再执行转换命令

不同的指令对应不同的转换器,所以这里如果要还原得一个一个抠下来才行

使用Python还原指令解析算法

基本上只要对照js来还原就行了

  • 指令转换器

  • 消息解析

  • 运行结果

使用Pyquery还原HTML

我们需要将上一步转换后的指令队列转换为HTML代码

  • 转换代码

  • 运行结果

  • 列表页

  • 详情页

有了html代码后就可以用xpath大法来拿内容了

微信公众号

公众号更新比较快,欢迎关注!
image

完整源代码

欢迎各位大佬一起完善,有问题可以一起讨论,希望有更好的方案能带俺一手😁
https://github.com/Meteo-Pig/CommandSpider

码字不易,动起你的发财的小手点个赞吧~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/872368.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vulnhub DC-2

dc2Vulnhub DC-2 与DC1同样的思路,但是输ip跳转到dc-2,改host文件解决。 发现cms是WordPress。 得到flag1 Your usual wordlists probably won’t work, so instead, maybe you just need to be cewl.More passwords is always better, but sometimes you just can’t win th…

【PyTorch】使用回调和日志记录来监控模型训练

就像船长依赖仪器来保持航向一样,数据科学家需要回调和日志记录系统来监控和指导他们在PyTorch中的模型训练。 在本教程中,我们将指导您实现回调和日志记录功能,以成功训练模型。 一、理解回调和日志记录 回调和日志记录是PyTorch中有效管理和监控机器学习模型训练过程的基本…

TBtools的使用

转录本:由一条基因通过转录,由于可变剪切形成的一种或多种可供编码蛋白质的成熟mRNA。另外非编码RNA也可能有转录本的说法。 最长转录本:可变剪切一个基因得到多个序列长度不同的转录本,应选序列最长的进行数据分析。 CDS:蛋白质编码区,是与蛋白序列一一对应的DNA序列,不…

finalshell远程连接Centos虚拟机配置固定ip地址

为虚拟机Centos的远程连接软件Finalshell或者xshell等软件配置固定ip地址提示:然后全点确定,就好了,这里就不演示了输入指令vim /etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTO=static #将ip设置为静态IPADDR="192.168.142.130" #静态ip地址,这个130是在0…

【scikit-opt库】智能算法开源库

这个开源库包含以下7个优化算法:网址:https://scikit-opt.github.io/ 使用文档:文档链接:https://scikit-opt.github.io/scikit-opt/#/en/README

【模拟电子技术】07-BJT特性曲线共射

【模拟电子技术】07-BJT特性曲线共射 我们要用三极管,那么就必须考虑输入和输出,即考虑输入特性曲线和输出特性曲线UCE固定,考虑UBE和IB的关系,就相当于一个PN结了!考虑多个变量的关系时,我们往往固定其他变量,然后看其中两个变量的关系,然后两两拿出来观察。三极管有三…

ssm日记04

发现springboot实在是太方便了,虽然还没有具体写过案例,不过直接免去一大堆配置真的太舒服了,明天会接着写案例,掌握是ssm整合springboot 这是学习一个小时的视频

ssm日记01

大前天 即2025.1.15-17学习了spring的前后台联合案例 就是springmvc的ssm整合包括异常处理的方法跟着敲了一边代码,不知道之后会不会使用或者说自己敲一遍,或许到自己跟着视频写案例才会使用到,或者说自己写一个小项目的时候才会用到 写这个异常处理受益匪浅,知道了从系统异…

ssm日记

前天即1.18号学习了springmvc的拦截器知识 但是好像用的不多 拦截器是相对于过滤器 是在请求进入web容器之后拦截和审核的其中主要是实现一个接口的三个方法分别是preHandle postHandle afterCompletion有相关执行顺序 这是代码和注释

学习ssm日记

补发一下前几次的学习日记 这是前两天在学maven高级的代码 都是自己敲得跟着视频 学习了分模块开发和父工程的创建以及关于依赖和pom文件相关知识

OpenWRT配置旁路由/中继模式,同时配置作为NAS必备的IPv6公网IP

1. 环境和要达成的目标 1.1 目标 主路由已配置好拨号,DHCP,IPv6 已刷OpenWRT路由B70作为中继路由,提高覆盖,解决一些老旧只能设备接入问题。 OpenWRT路由同时插入移动硬盘,配置WebDAV和smba作为NAS使用,所以此路自身要能获取到IPv6地址。 我的OpenWRT路由是极路由4,刷的…

【网关系统】通用设计

本文准备围绕七个点来讲网关,分别是网关的基本概念、网关设计思路、网关设计重点、流量网关、业务网关、常见网关对比,对基础概念熟悉的朋友可以根据目录查看自己感兴趣的部分。 一、什么是网关 网关,很多地方将网关比如成门, 没什么问题, 但是需要区分网关与网桥的区别,…