TomatoTools 一款CTF杂项利器 | 您所在的位置:网站首页 › 一键解密工具 › TomatoTools 一款CTF杂项利器 |
0x00 背景 以往在解MISC题时会遇到了编码或者是加密后的字符串,只能凭借个人对各种编码和密码学的熟悉程度去判断密文的类型, 以base16/32/64编码为例,区分这三种base系列的编码常常是与其密码(字母)表的范围去判断识别,base16是0-9a-f,base32是2-7A-Z,base64是A-Za-z0-9+/ 若假设密文是 MZWGCZ33GEZDGNBVGZ6Q====,根据前面说的内容可以很轻松的得知这段密文是base32编码后的结果,解码可以得到明文为 flag{123456} 如果是在自身知识储备不足的情况下,没有系统地学习过各种编码解码和密码学的理论和知识,在遇到那些多重嵌套加密的密文就容易傻眼,到了关键部分不会分析密文,判断不了密文类型,也没办法解密得到flag。 那能不能根据前面说的,用判断字母表的方式去做个自动分析密文类型的工具呢? 于是,TomatoTools来了! 0x01 能做什么TomatoTools 拥有CTF杂项中常见的编码密码算法的加密和解密方式,还具有自动提取flag的能力,以及异常灵活的插件模块。 目前支持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编码 0x02 密文分析密文分析过程可看下面的流程图 在密文分析时先从配置文件中加载各种密文类型的配置信息,包括函数名、密码表的正则范围,密码表的字符总个数等,然后进入密文类型筛选流程,判断该种密文类型的密码表的字符总个数和密文去重后的总个数之间谁更大些,若前者小于后者 的话,则将前者除去,其余的密文类型则进入下一轮的正则匹配阶段, 密文分析的核心是对经过某种加密/编码方式后密文的密码表进行正则匹配分析,对那些只针对密文中特定字符进行编码/加密的密文类型并没有很好的识别能力,以ROT5为例,ROT5的原理是明文中的数字向后移动5位,明文为 flag{a123bcd45ef},则ROT5编码过后的密文为 flag{a678bcd90ef},此时变化的只有数字,那么在密文分析中,ROT5的密码表正则范围该如何确定? *[0-9]*肯定是不合适的,在正则匹配的第一个阶段,遇到 f后就将ROT5拉入黑名单了,那么只剩下一个办法了,使用 *[\w]*去匹配所有的字符,乍一看可行,也确实是能匹配到了,因为只要密文中存在数字,ROT5也就能被成功解密输出到密文分析的结果里,但ROT5也因此成了常客,而在后面的自动化提取flag中,由于密码表正则范围 *[\w]*过大,反复调用ROT5将会使其陷入一个永远也跳不出去的死循环。 0x03 自动提取flag在解题时用TomatoTools去做密文分析,然后再加以手工解密的话,虽然和以往的人脑分析相比是快了一些,但是感觉还是不够快, 没有那种一秒出flag的惊喜与快感,既然已经有了密文分析和对应的解密算法,那么为什么不尝试做个“一键日(拿)卫星(flag)”呢?2333333 于是在密文分析的基础上追加了个“自动提flag”的功能,大致流程图如下 在自动提flag中增加“导出分析日志”是为了方便后期写WP,在无法解密的情况下,也可以根据日志来判断是哪一步出了问题,能给后面的手动分析带来一定的帮助, 以 *ZmxhZ3thNjc4YmNkOTBlZn0=*为例,这是一个经过base64编码后的密文,在这里使用自动提flag功能来尝试获得flag, 可见导出的日志如下 flag关键词:flag 密钥: 初始密文:ZmxhZ3thNjc4YmNkOTBlZn0= 解析树: Path └── Base64 └── flag{a678bcd90ef} 最长解密链: Path -> Base64 -> flag{a678bcd90ef} 最终密文: flag{a678bcd90ef} 最终解密结果: flag{a678bcd90ef} 0x04 插件编写规范插件的功能给TomatoTools带来了很强的灵活性,可以在插件管理页面去添加或删除自定义的插件, 这里有一点很重要,用户添加的解密插件是会同步到密文分析模块的,所以添加的解密插件在写法和定义上必须要严谨些,也要更慎重些,因为一旦添加了一个前面说的ROT5这样的插件,又或者是一个存在语法错误的插件,将有可能导致密文分析出错或者无法运行。 插件里的 dicts是要添加到 config.json中的,而下边定义的函数 abcdefg则是在加解密时调用的函数 编写插件必须遵守以下几点: 1.文件名、dicts里的 crypto_name和 定义的 函数名,三者必须一致 2.函数只能 return**bytes类型的结果 在自定义的插件函数里,如果需要传入密钥的话,插件函数需接收 cryptostr和 key两个值,否则只需接收 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 # (这里的key可以直接删掉,删掉后默认为False,也可以直接写 False) # 针对某些需要输入密钥的才能解密的密文,比如rabbit,此时key的值需为 TrueDemo1: 需要输入密钥 key的插件, 若用户不输入密钥,则调用该函数时,函数接收到的密钥 key为空字符串 # filename: abcdefg.py dicts={ "name":"abcdefg加密", "crypto_name":"abcdefg", "range":"[1-8]", "alphabet_num":"8", "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" } def test(cryptostr): aa = "12345678" return aa.encode() 0x05 Challenges1. BugKu Crypto 贝斯家族题目为: @iH |
CopyRight 2018-2019 实验室设备网 版权所有 |