简介

    渗透测试过程中,很多场景需要我们自己生成字典,例如对网站目录的猜解、弱口令的破解、文件名的猜解等等。工欲善其事,必先利其器,有一个好的规则的字典,一定能起到事半功倍的效果。

    本文仅仅抛转引玉,介绍我们实际渗透测试过程中,常用的Fuzzing字典生成的工具和方法,挑选出高速、快效的、有用的方案,供大家一起学习交流和参考。

Crunch

    首先是Crunch工具,这是一款基于线上和线下可以同时使用的工具,非常方便,可以根据实际要求生成不同的词组字典,你可以指定生成字符的最大长度和最小长度,也可以为其提供一个字符集,方便在创建字典时使用。然后Crunch将指定要求的字典,同时将我们的要求放在第一优先级,通过不同的组合和排列去创建所有可能的字典字符。

    kali 中自带 Crunch,如果在其他 Linux 机器上我们也可以自己下载安装,下载地址:

https://sourceforge.net/projects/crunch-wordlist/

    安装:

# tar zxvf crunch-3.6.tgz
# cd crunch-3.6
# gcc -Wall -lm -pthread -std=c99 -m64 -D_LARGEFILE_SOURCE -# D_FILE_OFFSET_BITS=64 crunch.c -o crunch -lm
# make install

    我们首先来看下Crunch的基本使用方法和参数:

crunch <min-len> <max-len> [<charset string>] [options]

    其中 options 可以指定字符集,可以指定字符和保存目录等等

<min-len> – 要开始的最小长度字符串。即使不使用参数的值,也需要此选项

<max-len> – 要开始的最大长度字符串。即使不使用参数的值,也需要此选项

<character-set> – 创建字典时指定的字符集

<charset string> – 指定字符集设置,否则将使用缺省的字符集设置。缺省的设置为小写字符集,大写字符集,数字和特殊字符(符号)。

-c <num> - 指定写入输出文件的行数,也即包含密码的个数

-d <char> - 限制出现相同元素的个数(至少出现元素个数)

-e <string> - 定义停止生成密码,即End
-t <pattern>- 表达式模式

-p <string1,string2> - 以排列组合的方式来生成字典

-o <path> – 指定保存字典文件

    生成一个6位数字的字典,并保存到本地:

root@kali:~# crunch 6 6 0123456789 -o number.txt

    看下生成的字典文件,显示前100行:

root@kali:~# sed -n '1,100p' number.txt
000000
000001
000002
000003
000004
000005
000006
000007
000008
000009
000010
000011
000012
000013
000014
000015
000016
000017
000018
000019
000020
000021
000022
000023
000024
000025
000026
000027
000028
000029
000030
000031
000032
000033
000034
000035
000036
000037
000038
000039
000040
000041
000042
000043
000044
000045
000046
000047
000048
000049
000050
000051
000052
000053
000054
000055
000056
000057
000058
000059
000060
000061
000062
000063
000064
000065
000066
000067
000068
000069
000070
000071
000072
000073
000074
000075
000076
000077
000078
000079
000080
000081
000082
000083
000084
000085
000086
000087
000088
000089
000090
000091
000092
000093
000094
000095
000096
000097
000098
000099

    看下实际生成字典耗时:

real    0m3.174s
user    0m0.082s
sys    0m0.074s

    可以看到,生成10W字典实际CPU只占用了0.074s,磁盘I/O读写占用了3.1s,我们再生成100W数据看看

real    0m4.603s
user    0m1.158s
sys    0m0.431s

    100W数据生成也仅仅只用了4.6s,实际测试中Fuzzing前的字典准备将会非常的快速和高效。

    -t 参数可以指定我们生成的字典的字符的模式,用表达式符号来输入

@ 插入小写字母
, 插入大写字母
% 插入数字
^ 插入特殊符号

    下面我们来看一道ctf题,实际运用下:

    题目提供了一个cap包,给了信息妹子今年(2014年)上大三,说明妹子应该是21岁,那么出生年份应该是1993年或者1994年,具体的我算不出来,感觉自己对年份计算完全一窍不通,不过没事,反正就这两年,都试试就好了,我们生成两个字典:

root@kali:~# crunch 8 8 -t 1993%%%% -o date1.txt

root@kali:~# crunch 8 8 -t 1994%%%% -o date2.txt

    使用 -t 参数和 % 来占位生成数字组合

    然后拿 aircrack-ng 和我们生成的两个字典跑一下

root@kali:~# aircrack-ng -w date2.txt wifi-crack.cap

    可以看到,跑date2.txt的时候,成功跑出了wifi密码,解密了CTF题目:

    正确的Flag是:19940808,不过记得md5()一下再提交,根据题目要求。

Cewl

    Cewl是一款用ruby开发的基于爬行URL来获取信息生成字典的工具,它使用指定URL并爬取2个链接的深度(默认情况下),我们也可以自己指定增加或减少爬行深度,并且cewl将自动化查询有可能成为密码字典的每个词组,生成一个词组表,用作fuzzing测试。

    我们来看一下cewl的基本用法和参数:

cewl [OPTION] <url>

[OPTION]:

-d:蜘蛛爬行深度,默认为2

-m:最小单词长度,默认为3

-w:将输出写入文件

-u:指定User-agent

-a:包含元(meta)数据

-e:包含电子邮件地址

-c:统计爬取的每个单词的计数

-o:爬行其他网站

    对网址 www.baidu.com 进行爬取生成字典:

root@kali:~# cewl www.baidu.com -e -c -v -d 2 -w dict.txt

    如图cwel会自动对我们提供的网站进行深度为2的信息爬取,然后生成dict.txt字典文件,查看一下:

    后面的数字就是我们的 -c 参数实际效果,统计词组出现的次数,实战的fuzzing测试中,包括社会工程学攻击中,这是我们常常用到的。

CUPP

    CUPP是基于python开发的跨平台交互式字典生成工具,它在密码破解方面提供了非常个性化的方案,人们通常会表现出倾向于通过添加生日、周年纪念日、宠物的名字等等来使密码个性化,而CUPP则专注于此弱点来破解密码。在创建字典之前,CUPP会询问我们有关测试目标的一些必要信息,通过参数 -i 与CUPP人机交互,传递生成字典的信息。

    CUPP会根据输入的信息自动化智能生成相关性词组组合的社会工程学字典。在实际渗透测试的时候,我们常常碰见fuzzing的局限,但是生成泛字典来进行测试量又太大,此时就需要生成binding具体目标的关联性社会工程的信息库,来极大的提升fuzzing测试的效率和速度。

    CUPP需要我们自己下载安装,Kali系统并不自带:

    Github

root@kali:~# git clone https://github.com/Mebus/cupp.git

    Apt

root@kali:~# apt-get install cupp

    Yum

root@kali:~# yum install cupp

    安装完成后查看CUPP:

    基本语法很简单,我们先来看下参数:

cupp [options]

-v   查看cupp版本号

-l    从线上下载词组

-i    使用交互式的提问创建用户密码字典

-w   导入自定义字典

    主要使用到的就是 -i 参数,进行人机交互:

root@kali:~# cupp -i

[+] Insert the informations about the victim to make a dictionary
[+] If you don't know all the info, just hit enter when asked! ;)

> First Name: zhangsan
> Surname: li
> Nickname: han
> Birthdate (DDMMYYYY): 02051996


> Partners) name: zhangwu
> Partners) nickname: li
> Partners) birthdate (DDMMYYYY): 02061965


> Child's name:
> Child's nickname:
> Child's birthdate (DDMMYYYY):


> Pet's name: milky
> Company name:


> Do you want to add some key words about the victim? Y/[N]: Y
> Please enter the words, separated by comma. [i.e. hacker,juice,black], spaces will be removed: kali,linux
> Do you want to add special chars at the end of words? Y/[N]: Y
> Do you want to add some random numbers at the end of words? Y/[N]:N
> Leet mode? (i.e. leet = 1337) Y/[N]: n

    如图我们可以看到,CUPP交互会问你的姓名、家庭姓名、、父母姓名、父母生日、宠物姓名、孩子姓名和生日、公司名称等等信息

    一步步输入,如果没有就跳过

Do you want to add some key words about the victim

    这里是添加自定义的攻击向量,提供自己搜集来的特定的关键词

Do you want to add special chars at the end of words

    这里是问我们是否添加特殊符号词组

Do you want to add some random numbers at the end of words

    这里是问我们是否添加随机的数字词组

Leet mode? (i.e. leet = 1337)

Leet mode是问我们是否使用黑客语,黑客语通常是把拉丁字母转变成数字或是特殊符号,例如E写成3、A写成@等。或是将单字写成同音的字母或数字,如to写成2、for写成4等等。

    看下我们如图交互下生成的字典文件信息:

Pydictor

    Pydictor是一款跨平台的轻量级字典爆破生成工具,基于python开发,支持python2、python3,对于快速建立密码字典有很大作用,快速高效,非常强大实用。

    并且Pydictor可以合并密码字典,词频统计,去重,枚举数字字典。支持高度自定制,支持base64加密,我们可以通过修改配置文件、添加自己的字典、使用黑客语模式、按长度选择等方式生成高度自定义和复杂的字典词组列表,日常可以帮助我们更有效的进行测试。

    Pydictor是第三方工具,需要我们自己下载安装,Kali系统并不自带:

    Github

root@kali:~# git clone https://github.com/LandGrey/pydictor.git

    Apt

root@kali:~# apt-get install pydictor

    Yum

root@kali:~# yum install pydictor

    安装完成后运行Pydictor:

    基本参数:

pydictor.py [options]
           -base        [type]
           -char        [custom_char]
           -chunk       [chunk1] [chunk2] ...
           -extend      [string_or_file]
           -plug        [birthday,pid6,scratch,pid4,pid8,ftp]
           --conf       [expression_or_file]
           --sedb
           -o,--output  [directory]
           -tool        [shredder,combiner,counter,uniqifer,uniqbiner,handler,comparer,hybrider]
           --len        [minlen] [maxlen]
           --head       [prefix_string]
           --tail       [suffix_string]
           --encode     [none,sha1,b64,url,sha512,des,rsa,b32,b16,test,sha256,execjs,hmac,md516,md5]
           --occur      [letter] [digital] [special]
           --types      [letter] [digital] [special]
           --repeat     [letter] [digital] [special]
           --regex      [regex]
           --level      [code]
           --leet       [code]
           --dmy


-base 基本类型

-char 字符型

-chunk 块

-extend 延伸

-plug 插件

--conf 基于配置文件的词汇表

-sedb 社会工程学

-o 指定生成的txt的文件路径

-tool 使用工具 如·:组合,比较器,计数器,处理器,uniqbiner,uniqifer

--len 长度范围

--head 添加头文件

--tail 添加尾部文件

--encode 加密功能模块

--occur 发生功能模块

--types 类型功能模块

--regex 正则表达式函数

--level 等级

--leet 黑客语表

    输入以下命令生成一个6位的数字组合字典:

root@kali:~/pentest/pydictor# ./pydictor.py --len 6 6 -base d -o dict.txt

-base     参数表示基于生成的类型,Pydictor的base主要有:

base含义范围
d数字[0 - 9]
L小写字母[a - z]
c大写字母[A - Z]
dL数字+小写字母[0-9 a-z]
dc数字+大写字母[0-9 A-Z]
Lc小写字母+大写字母[a-z A-Z]
dLc数字+小写字母+大写字母[0-9 a-z A-Z]

    查看生成的字典:

    Pydictor强大的地方在于支持自定义多种encode编码:

Encode内容
none默认方式, 不进行任何编码
b16base16 编码
b32base32 编码
b64base64 编码
desdes 算法
execjs执行本地或远程js函数
hmachmac 算法
md5md5 算法输出32位
md516md5 算法输出16位
rsarsa 算法
sha1sha-1 算法
sha256sha-256 算法
sha512sha-512 算法
urlurl 编码
test自定义编码方法

    让我们用指定rsa算法,对刚才的字典重新生成:

root@kali:~/pentest/pydictor# ./pydictor.py --len 6 6 -base d --encode rsa -o dict_rsa.txt

    看下生成的dict:


    以上几种是我们测试中经常需要用到的,非常高效快速实用的字典生成工具和方案,下面再介绍下Dymerge,这是一款字典集合工具,可以将我们之前生成的任意数量的字典合并到一起。

    Dymerge也是第三方工具,我们先git一下:

root@kali:# git clone https://github.com/k4m4/dymerge.git

    运行:

    使用方法:

root@kali:# ./dymerge.py [dict_file] [dict_file] [dict_file]... -o [dict_file_save]

<dict_file> – 提供要合并的第一个字典的路径
<dict_file> – 提供要合并的第二个字典的路径
<dict_file> – 提供要合并的第三个字典的路径
-o – 表示将保存字典的路径
<dict_file_save> – 合并后字典保存的路径

    合并前面我们生成的两个字典,保存为dict3.txt:

root@kali:~/pentest/pydictor/dymerge# ./dymerge.py /root/pentest/dict/dict1.txt /root/pentest/dict/dict2.txt -o dict3.txt
DyMerge 0.2 Nikolaos Kamarinakis (nikolaskama.me)
  ____                                                  
/\  _`\           /'\_/`\
\ \ \/\ \  __  __/\      \     __   _ __    __      __
  \ \ \ \ \/\ \/\ \ \ \__\ \  /'__`\/\` __\/'_ `\  /'__`\
   \ \ \_\ \ \ \_\ \ \ \_/\ \/\  __/\ \ \//\ \_\ \/\  __/
    \ \____/\/`____ \ \_\\ \_\ \____\\ \_\\ \____ \ \____\
     \/___/  `/___/  \/_/ \/_/\/____/ \/_/ \/____\ \/____/
                /\___/                       /\____/
                \/__/  Made with <3 by k4m4  \_/__/

[+] Starting Dictionary Merge Task
[+] Reading Dictionaries
[+] Merging Dictionaries
[+] Task Successfully Complete
[+] Final Dictionary Saved As --> dict3.txt
Comp/tional Time Elapsed: 0.017565


码字不易,感谢阅读。