前端JS加密与Buspsuite的坦诚相待

6c6fb63106d7d93f5fef2246d577addb.jpeg


前端JS加密测试场景下的困惑


在渗透测试过程中经常会遇到JS前端加密的场景,假如不借助任何工具的情况下,我们一般是把JS代码进行扣取,本地进行加解密生成Payload,然后在Burpsuite里进行Payload替换。这种方式就存在一个很明显的问题,那就是在大量的Fuzz测试过程中,本地生成再手工替换会消耗大量的时间,这个时候我们就会想,能不能直接在Burpsuite前后利用脚本的形式进行加解密操作,让数据在Burpsuie里展示的时候已经是加解密后的数据呢?




代理的理解



先来看看平常我们渗透场景下Burpsuite代理转发数据包的原理

不挂Burpsuite代理,客户端浏览器直接访问服务器的流程

097a50f7bff762b0d4ce835f2561f1e8.jpeg

挂上Burpsuite代理之后

cd087b03a02f4583d5922084f32f4100.jpeg

现在想要在Burpsuite代理转发前后添加脚本进行加解密操作,那分别在客户端浏览器与Burpsuite之间、Burpsuite与服务端服务器之间添加一个代理即可实现。

a9cfcbf2cc59c5c7a1aed2bb6b28d045.jpeg

接下来就是分别实现这些代理功能了。市面上已经有很多优秀的类似代理工具,我们可以使用Python脚本进行编写加解密代码然后完成代理实现如上功能,但这样做每次进行不同的网站测试就需要每次都要修改自己的Python脚本,扩展性非常差。这里我们可以使用mitmproxy 来实现我们的需求。




mitmproxy简介


mitmproxy 是一个免费的 和开源 交互式 HTTPS 代理,可为 HTTP/1、HTTP/2 和 WebSocket 提供支持 SSL/TLS 的交互式拦截代理。相比于其他代理工具其优势有:

● 相对于fiddle代理工具,它可以跨平台
● 相对于跨平台charles代理工具,它开源免费
● 它支持使用Python进行二次开发,可以结合业务进行灵活拓展了

mitmproxy下载地址如下:

https://mitmproxy.org/

mitmproxy安装完成后有如下三个工具:

● mitmproxy命令行交互工具
● mitmdump命令行非交互工具
● mitmweb基于Web的用户界面

在客户端浏览器与Burpsuite之间、Burpsuite与服务端服务器之间的代理也分别有他们名词,分别为下游代理、上游代理。

1542165ace249b40163a8d88439bc8e8.jpeg

mitmproxy一大优势是支持Python的二次开发的,而在代理原理图中的请求和响应也依次对应着,mitmproxy提供Python中API的request和response。

from mitmproxy import ctxfrom mitmproxy.http import HTTPFlow

class MyAddon: def request(self, flow: HTTPFlow): # 这里可以处理请求,比如打印请求信息 ctx.log.info(f"Handling request: {flow.request.pretty_url}")
def response(self, flow: HTTPFlow): # 这里可以处理响应,比如修改响应内容 ctx.log.info(f"Handling response for: {flow.request.pretty_url}")
addons = [ MyAddon(), ]



mitmproxy实战使用


启动一个服务器,模拟口令登陆功能

edb7baae8346ab50e7e1aa1ff267ea3d.jpeg

在只配置Burpsuite代理下登陆抓包

65f226791945039ca867facd6709e195.jpeg

可以看到password字段是被加密的,当然这里只是一个简单的Base64加密,Burpsuite也支持直接在Burpsuite中直接解密数据,为了演示和后面编写Python脚本方便,这里就先假设Burpsuite上是不可对Password这个字段直接进行解密的。

在浏览器客户端到Burpsuite之前,我们最常做的处理就是把前端JS加密的数据解密到Burpsuite里,在Burpsuite里直接看到明文的数据。所以在客户端到Burpsuite我们走的一条流程就如下

c5d9b09da80f888aee43364a414c0a09.jpeg

那么我们可以进行编写如下脚本

de.py

from mitmproxy import ctximport base64

class MyAddon():
def request(self,flow): # 服务端host if flow.request.host=="www.xj.com": # 获取客户端浏览器发送的数据 req = flow.request.get_text() #截取password字段的加密字段值 result = req.split("&")[2].split("=")[1] #打印password字段的加密字段值 ctx.log.info("浏览器请求数据 => "+result) #对password字段的加密字段值进行解密 missing_padding = len(result) % 4 if missing_padding: result += '=' * (4 - missing_padding) data = base64.b64decode(str(result).encode()).decode() #打印解密后的数据 ctx.log.info("解密后的数据 => " + data) #重组Payload new_req = req.split("password")[0]+"password="+data #发送Payload flow.request.set_text((new_req))
addons = [MyAddon(),]

编写好脚本之后,需要配置好代理,代理配置如下

客户端浏览器代理转发给下游代理  代理端口为7070
下游代理代理转发给Burpsuite   代理端口为8080

浏览器代理配置

50f36f0ccebdd063f263edf6951b2c58.jpeg

mitmdump代理配置

mitmdump -p 7070 -s de.py --mode upstream:http://127.0.0.1:8080 --ssl-insecure

7bb826087af1916a54c7d0220488dac6.jpeg

Burpsuite代理配置

2f2e6db3763febfbaecb951079d88bb2.jpeg

配置好,我们重新进行抓包,可以看到已经可以成功解密数据,直接在Burpsuite里进行明文显示了

7c7e11dd986a0acee63d57d9dd8a779a.jpeg

f637c2798d0dd584471d20ebc76f2731.jpeg

提交之后,会提示Login failed!

2a5dcfb305ff6de81aa862d6030bf7bd.jpeg

其实口令admin、admin是正确的,只不过我们提交password已经是明文的admin了,后面还会对这个admin进行解密,导致解密后的口令就不再正确了,所以我们还需要在Burpsuite把数据提交给服务端服务器之前,重新把数据给加密回来。

所以在Burpsuite到服务端我们走的一条流程就如下

10d51ef055b1ca5f88cc24f1787eca71.jpeg

那么我们可以进行编写如下脚本

en.py

from mitmproxy import ctximport base64

class MyAddon(): def request(self,flow): # 服务端host if flow.request.host=="www.xj.com": req = flow.request.get_text() ctx.log.info("浏览器请求数据 => " + req) result = req.split("&")[2].split("=")[1] ctx.log.info("匹配前 => " + result) data = base64.b64encode(result.encode('utf-8')).decode('utf-8') ctx.log.info("加密后数据 => " + data) #重新组合payload new_req = req.split("password")[0]+"password="+data ctx.log.info("最终payload => " + new_req) flow.request.set_text(new_req)

addons = [MyAddon(),]

编写好脚本之后,之前的代理配置不需要改变,额外在Burpsuite里配置一个上游代理

Burpsuite代理配置

b1de095e3386a5c366cdf2ed925ea6ce.jpeg

mitmdump代理配置

mitmdump -p 9090 -s en.py --ssl-insecure

eb568771ccf85e4bd614423ff4544714.jpeg

配置好后,抓包提交

26cadc82843c60593b138acd3b5c1c03.jpeg

至此,整个测试流程就跑通了。

当然我们这里的只演示了上面请求流程

d4b983015c6cb45b4888e55a91a56a77.jpeg

下面的响应流程我们也可以更具业务需求在脚本的response方法里编写相应流程代码即可。




总结



本文结合渗透测试JS前端加密情况下的实战场景,利用mitmproxy解决了本地加解密测试繁琐的痛点,达到了编写完加解密脚本之后与Burpsuite前后建立代理直接在Burpsuite进行测试的效果。




本文作者


易安联玄影实验室(原高级攻防实验室),是易安联https://www.enlink.top/为落实公司发展战略,促进网络空间安全生态建设,孵化下一代安全能力,进行高级别的攻防对抗研究而组建的专业性安全实验室。推出的威胁情报和天织DNS威胁分析平台,可以为用户提供高效的威胁防护能力,帮助用户更好地应对各类网络威胁。



https://mp.weixin.qq.com/s/aZ-QZJIfYLJ1T5bputUfYw



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习:什么是监督学习和无监督学习

目录 一、监督学习 (一)回归 (二)分类 二、无监督学习 聚类 一、监督学习 介绍:监督学习是指学习输入到输出(x->y)映射的机器学习算法,监督即理解为:已知正确答案…

【Web前端开发基础】CSS的定位和装饰

CSS的定位和装饰 目录 CSS的定位和装饰一、学习目标二、文章内容2.1 定位2.1.1 定位的基本介绍2.1.2 定位的基本使用2.1.3 静态定位2.1.4 相对定位2.1.5 绝对定位2.1.6 子绝父相2.1.7 固定定位2.1.8元素的层级关系 2.2 装饰2.2.1 垂直对齐方式2.2.2 光标类型2.2.3 边框圆角2.2.…

Keepalived + Nginx双主架构

Keepalived Nginx双主架构 环境准备: keepalived_master1服务器nginx:172.20.26.167 keepalived_master2服务器nginx:172.20.26.198 各服务器关闭selinux、防火墙等服务。 开机安装部署nginx 在172.20.26.167服务器上 yum install ngi…

基于ADAS的车道线检测算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 图像预处理 4.2 车道线特征提取 4.3 车道线跟踪 5.完整工程文件 1.课题概述 基于ADAS的车道线检测算法,通过hough变换和边缘检测方法提取视频样板中的车道线,然后根据车道线的弯曲情况…

在Excel中批量添加前后缀的三种方法,总有一种适合 你

你可以使用高级Excel函数将前缀和后缀快速应用于列。在使用大型电子表格时,为每个单元格添加后缀或前缀可能会花费很长时间,并使你疲惫不堪。 在这里,你可以通过几种快速简单的方式添加后缀或前缀,从而减少所需的手动操作。​我们将通过三种不同的方法向Excel电子表格添加…

互联网盲盒小程序,解锁了盲盒全新模式!

随着潮流玩具的兴起,盲盒因此产生,在时间的推移下,盲盒的发展正处于鼎盛时期。在今年,盲盒市场也将迎来300亿元的市场规模,而盲盒的受众群体也在收入能力较高的年轻人中。 盲盒具有独特的购买方式,它能够让…

硬件监测和系统诊断 -- TechTool Pro 18 中文

TechTool Pro 18是一款功能强大的硬件和软件诊断工具,它提供了多种功能来帮助用户维护和优化Mac电脑的性能。这些功能包括:硬盘检测和修复、内存测试、驱动器克隆、数据恢复、网络和连接测试、系统健康检查以及定期维护等。 TechTool Pro 18还具有直观的…

k8s--helm

什么是helm?在没有这个helm之前,deployment service ingress helm的作用 通过打包的方式,把deployment service ingress等打包在一块,一键式的部署服务,类似yum安装 官方提供的一个类似与安装仓库额功能,…

写着玩的程序:pycharm实现无限弹窗程序(非病毒程序,仅整蛊使用)

运行环境 PyCharm 2023.2.1 python3.11 具体内容 源代码 import tkinter as tk from tkinter import messagebox import threadingclass PopupGenerator:def __init__(self):self.root tk.Tk()self.root.geometry("200x120")self.root.title("无限弹窗&qu…

C# CefSharp 根据输入日期段自动选择日期

1,前言 搞这个Demo整整搞几天通宵,爆肝了。后做的效果出来,还是不错的。给小伙伴看看效果图。 2, 遇到的问题 日期之间相差多少个月数。开始时间框点击对应月份要点击多少次,结束时间框点击对应月份要点击多少次Xpath获取问题。…

理解LSTM一种递归神经网络(RNN)

1 递归神经网络结构 一个简单的传统神经网络结构如下图所示: 给他一些输入x0,x1,x2 … xt, 经过神经元作用之后得到一些对应的输出h0,h1,h2 … ht。每次的训练,神经元和神经元之间不需要传递任何信息。 递归神经网络和传统神经网络不同的一个点在于&am…

智能配电监控系统

摘要:利用微机综合保护测控装置 、控制单元、电力监测仪 、摄像机 ,设计开发出一套智能配电远程监控系统 ,实现配电室的无人值守 ,从而提高变配电运行现代化管理水平。 关键词:智能配电;现场监控&#xff…

IMX6ULL|GPIO子系统

一.GPIO子系统 GPIO是General Purpose I/O的缩写,即通用输入输出端口,简单来说就是MCU/CPU可控制的引脚,这些引脚通常有多种功能,最基本的是高低电平输入检测和输出,部分引脚还会与主控器的片上外设绑定,如…

性能篇:解密Stream,提升集合遍历效率的秘诀!

大家好,我是小米,一个热爱技术分享的小伙伴。今天我们来聊一聊 Java 中的 Stream,以及如何通过 Stream 来提高遍历集合的效率。 什么是Stream? 在开始深入讨论之前,我们先来了解一下什么是 Stream。 Stream 是 Java…

微信如何批量自动加好友?用它就对了!

你还在手动逐一输入号码,再搜索添加好友吗?这样实在是太麻烦了,还很费时间,稍不注意就会出错。不妨试试这个微信批量自动添加好友工具,解放双手,提高加人效率! 下面一起来看看如何操作吧&#…

(十一)Head first design patterns状态模式(c++)

状态模式 如何去描述状态机? 假设你需要实例化一台电梯,并模仿出电梯的四个状态:开启、关闭、运行、停止。也许你会这么写 class ILift{ public:virtual void open(){}virtual void close(){}virtual void run(){}virtual void stop(){} }…

机器学习实验1——朴素贝叶斯和逻辑回归分类Adult数据集

文章目录 🧡🧡实验内容🧡🧡🧡🧡数据预处理🧡🧡认识数据填充缺失值(“ ?”)将income属性替换为0-1变量筛除无效属性编码和缩放 🧡&…

GC6208 5V摄像机镜头驱动芯片,为什么可以替代AN41908,适用于摄像机镜头上

GC6208是一个镜头电机驱动IC摄像机和安全摄像机。该装置集成了一个由PID控制的可变光圈直流电机驱动器和两个通道的扫描隧道显微镜电机驱动器,用于变焦和聚焦控制。AN41908A是一款用于摄像机和安全摄像机的镜头马达驱动IC,具有lris控制功能。电压驱动系统…

基于springboot+vue新能源汽车充电管理系统

摘要 新能源汽车充电管理系统是基于Spring Boot和Vue.js技术栈构建的一款先进而高效的系统,旨在满足不断增长的新能源汽车市场对充电服务的需求。该系统通过整合前后端技术,实现了用户注册、充电桩管理、充电订单管理等核心功能,为用户提供便…

bxCAN 工作模式

bxCAN 工作模式 bxCAN 有三种主要的工作模式:初始化、正常和睡眠。硬件复位后,bxCAN 进入睡眠模式以降低功耗,同时 CANTX 上的内部上拉电阻激活。软件将主控制寄存器(CAN_MCR---CAN master control register)的初始化…