/TomatoTools

TomatoTools 一款CTF杂项利器,支持36种常见编码和密码算法的加密和解密,31种密文的分析和识别,支持自动提取flag,自定义插件等。

Primary LanguagePythonGNU General Public License v2.0GPL-2.0

TomatoTools

GitHub stars GitHub forks GitHub release GitHub issues

TomatoTools 拥有CTF杂项中常见的编码密码算法的加密和解密方式,还具有自动提取flag的能力,以及异常灵活的插件模块。

TomatoTools 原理和实战案例 TomatoTools 一款CTF杂项利器 - FreeBuf网络安全行业门户

目前支持36种编码和密码算法的加密和解密,包括

  • Base16/32/36/58/62/64/85/91/92
  • ROT5/13/18/47
  • AAencode / XXencode / UUencode / JJencode
  • Brainfuck / JSFuck / Jother
  • Emoji
  • 核心价值观编码 / 与佛论禅
  • 莫斯密码 / 培根密码 / 云影密码 / 埃特巴什码 / 波利比奥斯方阵密码 / 凯撒密码 / 栅栏密码
  • Shellcode / Handycode / URL
  • 敲击码 / A1z26密码 / Quoted-printable编码
  • 二进制010编码

其中支持31种密文的分析

  • Base16/32/36/58/62/64/85/91/92
  • XXencode/UUencode/JJencode
  • Brainfuck/JSFuck/Jother
  • Emoji
  • 核心价值观编码/与佛论禅(佛曰)/与佛论禅(如是我闻)
  • 莫斯密码(空格)/莫斯密码(斜杠)/培根密码/云影密码/波利比奥斯方阵密码
  • Shellcode/Handycode/URL
  • 敲击码/A1z26密码/Quoted-printable编码
  • 二进制010编码

更新说明

v1.0.2

  • 自动提flag 支持设定深度
  • 关于 里增加三个功能开关
  • 插件dicts新增replace替换参数
  • 新增解密插件 斜杠ASCII码转换HTML实体编码
  • 修复bug

v1.0.1

  • 新增加密插件 全部大写全部小写字符倒序
  • 修复bug

安装与使用

1.克隆项目及安装TomatoTools所需依赖包

git clone https://github.com/ht0Ruial/TomatoTools.git
cd TomatoTools
pip3 install -r requirements.txt

2.在TomatoTools源码目录下执行

python ./TomatoTools.py

插件编写规范

插件的功能给TomatoTools带来了很强的灵活性,可以在插件管理页面去添加或删除自定义的插件,

这里有一点很重要,用户添加的解密插件是会同步到密文分析模块的,所以添加的解密插件在写法和定义上必须要严谨些,也要更慎重些,因为一旦添加了一个存在语法错误的插件,将可能导致密文分析出错或者无法运行。

插件里的 dicts 是要添加到 config.json 中的,而下边定义的函数 abcdefg 则是在加解密时调用的函数

编写插件必须遵守以下几点:

  1. 文件名 、dicts里的 crypto_name 和 定义的 函数名 ,三者必须一致
  2. 函数只能 return bytes 类型的结果

在自定义的插件函数里,如果需要传入密钥的话,插件函数需接收 cryptostrkey 两个值,否则只需接收 cryptostr 一个值,而在函数返回值时,不能返回 str 类型的值,需用 str.encode() 变成 bytes 类型后再return结果。

以下为 dicts 内各个键的详解,

name #(必需) 添加的插件名称
crypto_name #(必需) 函数的名称
range #(解密插件必需) 密码表范围,必须用正则来表示,base16是[0-9a-f] 
alphabet_num #(解密插件必需)密码表的字符个数,base32[A-Z2-7=]是33个,rot5[0-9]是10个 
key #(默认False)针对某些需要输入密钥的才能加解密的密文,比如rabbit,此时key的值需为 True
replace #(默认False)当启用全局替换后,若插件中存在参数,密文将会被替换

Demo1:

需要输入密钥 key 的插件,

若用户不输入密钥,则调用该函数时,函数接收到的密钥 key 为空字符串

# filename: abcdefg.py

dicts={
    "name":"abcdefg加密",
    "crypto_name":"abcdefg",
    "key":True
}

def abcdefg(cryptostr,key):
    #key= ''
    aa = "12345678"
    return aa.encode()

Demo2:

不需要输入密钥 key 的插件,但支持密文替换。

# filename: test.py

dicts={
    "name":"test解密",
    "crypto_name":"test",
    "range":"[1-8]",
    "alphabet_num":8,
    "key":False,
    "replace":True
}

def test(cryptostr):
    aa = "12345678"
    return aa.encode()