1s,精准定位加密算法。
2024-3-5 20:17:28 Author: mp.weixin.qq.com(查看原文) 阅读量:15 收藏

啰啰嗦嗦

北京时间2023-03-12 07:05:32,天刚蒙蒙亮。窗外传来工地哒哒的"马蹄声",懒觉是睡不成了。脑子里闪过上次开源的前端Url抓取插件,没有考虑到实际生产问题,翻车了!而后我对脚本进行了二次优化,css排版已得到一定的改良,这次附上gayhub地址:

https://github.com/Captain0X/HunterUrls

正文

作为一名命途多舛的脚本小子,时常面临着满脑子骚操作,洞却挖不到的尴尬局面,是人性的扭曲还是道德的沦丧?欢迎收看今晚20点走近科学之––《脚本小子の疑惑》

噢,扯远了!

既然都挖不到洞,干脆把挖洞姿势公布出来,让师傅们去把挖洞姿势发扬光大,那么结局就是这样:

我  →  公开姿势  →  师傅们  →  拿下漏洞

等于

我  →  拿下漏洞

嗯~~~~~~骚话打住,开工!

在安全测试过程中,时常遇到js加密数据,这是一件令人掉头发的事情。面对诸多出洞的不确定性和追求挖洞的效率问题,许多人会只直接放弃逆向加密算法,转战下一个突破点。但是,挖洞本身不就是在不确定性中寻找确定性吗?我的想法是,别人无法到达的地方,便是突破的最优选择。

这次推荐的是整套爆破装备,从js逆向到验证码ocr识别一把嗦!

js加密定位

1.安装谷歌油猴插件
插件下载地址:

https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo

2.新建脚本

3.把github的js代码粘贴进去,代码地址:
https://github.com/Captain0X/hacker_tools/blob/main/crack_encrypt.js

这些代码来自于一名我不认识的大佬,是我同事发给我的,非常感谢这位不知名的大佬,如涉及侵权,请私信联系我删除,谢谢。

4.启动脚本

5.打开目标:https://login.captainxu.repl.co/
这是我随便敲的一个简约登录页面,密码使用AES ECB模式进行加密,打开F12调试器,注意观察console的输出,输入账号密码

6.此时看到console输出了加密算法名称和密钥,是不是1秒出结果?是不是很丝滑?

Tips:平时不需要用到这个脚本时请关闭脚本,否则会干扰正常的登录请求。

这就完了?且慢!既然把登录都搞了,这不顺带爆淬(cui第四声)一顿验证码?

可拷,非常可拷~

作为脚本小子,只有站在巨人的肩膀上,才能看得更远。这次使用鼎鼎大名的验证码识别依赖库:ddddocr。此前已经有师傅把它封装成burpsuite插件,我就开新路子吧。

进阶

首先使用python Flask快速封装加密算法和图片验证模块,做一个小型的爆破接口,高度自定义的模块,灵活运用,如有条件的师傅可搭配代理Ip,开挂模式,专治各种水土不服的登录页面!在此我只写爆破接口雏形代码,由于加密算法种类和模式较多,考虑到灵活性问题,我就不展开了。大家要是不懂如何将js的算法转换成python的算法,我给大家安排了私人助手。

助手领取地址→

https://chat.openai.com(需要科学上网才能访问)

脚本思路

以下内容属于python代码部分,需要具备基本的代码能力方能看懂。

首先你要自己实现python加密算法,然后返回加密结果给登录请求函数。

分析测试页面的登录请求流程:

1.创建请求会话

2.获取验证码,识别验证码

3.对密码参数进行加密

4.发起登录请求,将请求结果返回给burpsuite,在Intruder中筛选你的菜

上~~!python代码flask_api.py:

# -*- coding: utf-8 -*-''' @author : Captain0X @time : 2023/3/7 8:54 '''import base64import ddddocrfrom requests import Sessionfrom Crypto.Cipher import AES
'''环境要求:python 3.7以上请安装以下依赖库pip install pycryptodome==3.9.9pip install ddddocr'''
#初始化验证码识别模型dcr=ddddocr.DdddOcr()
def pkcs7padding(text): """明文使用PKCS7填充,padding:凑篇幅的文字 """ need_size = 16 text_length = len(text) bytes_length = len(text.encode('utf-8')) padding_size = text_length if (bytes_length == text_length) else bytes_length padding = need_size - padding_size % need_size padding_text = chr(padding) * padding return text + padding_text

def AES_Encryption(secret_key=None,text=None): if (secret_key is None) or len(secret_key) == 0: secret_key = "1234567812345678" text = pkcs7padding(text) aes = AES.new(secret_key.encode("utf-8"), AES.MODE_ECB) en_text = aes.encrypt(text.encode('utf-8')) result = str(base64.b64encode(en_text), encoding='utf-8') return result

def get_code(sec): '''获取并识别验证码''' api="https://login.captainxu.repl.co/code?0.43988416665399943" img_bytes=sec.get(api).content code_text=dcr.classification(img_bytes=img_bytes) print("验证码识别结果:",code_text) return code_text,sec
def login_encrypt(user, pwd):
# 设置 http和https访问都是用HTTP代理 proxy_url = "http://127.0.0.1:10809" proxies = { "http": proxy_url, "https": proxy_url, } sec=Session() #用代理就开启下面这个代码 # sec.proxies=proxies sec.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', 'sec-ch-ua': '"Chromium";v="110", "Not A(Brand";v="24", "Google Chrome";v="110"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'same-origin', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36'}
#获取验证码识别结果 code_text,sec=get_code(sec) #登录接口 api="https://login.captainxu.repl.co/login" password = AES_Encryption(secret_key="passw00dpassw00d", text=pwd) data={"username":user,"password":password,"auth_code":code_text} print(data) #发起登录请求 resp=sec.post(api,data=data) #返回请求结果和响应头到burpsuite return str(resp.headers)+"\n"+resp.text

from flask import Flask, requestapp = Flask(__name__)
#定义一个登录接口@app.route("/login", methods=['GET'])def call_login(): user = request.args.get("user") pwd = request.args.get("pwd") result=login_encrypt(user, pwd) return result
if __name__ == '__main__': #本地服务 ip 端口 app.run('127.0.0.1', 5666)

粗略审计整套流程,不过几十行代码。现在在burpsuite构造本地验证码识别接口请求包,参数只有用户名和密码,验证码和加密都封装在本地接口中,无须再做处理,接下来运行一下butpsuite爆破!

  1. 启动本地接口服务

2.测试前Repeater发送下数据包是否正常返回

3.启动Intruder

成功登陆!

(完)

如果你是一个长期主义者,欢迎加入我的知识星球,我们一起往前走,每日都会更新,精细化运营,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款
前面有同学问我有没优惠券,这里发放100张100元的优惠券,用完今年不再发放

往期回顾

dom-xss精选文章

年度精选文章

Nuclei权威指南-如何躺赚

漏洞赏金猎人系列-如何测试设置功能IV

漏洞赏金猎人系列-如何测试注册功能以及相关Tips


文章来源: https://mp.weixin.qq.com/s?__biz=MzIzMTIzNTM0MA==&mid=2247493784&idx=1&sn=13f577416e9d6fe7041f422ecec172ed&chksm=e8a5e2fbdfd26bed9f5834d3295c1a7f4b685c0fb0d436b99a4b905f05ac26c4af4df0a72285&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh