sans sec 565 Red Team Operations and Adversary Emulation - 红队运营和对手仿真 之 565.1 Lab 1.3:侦察和密码攻击

发布时间 2023-12-20 16:20:07作者: sec875

sans sec 565 Red Team Operations and Adversary Emulation - 红队运营和对手仿真 之 565.1 Lab 1.3:侦察和密码攻击

  • 目标

通过分析 Draconem.io 网站进行侦察
确定密码攻击的目标对象
通过收集电子邮件地址发现有效的用户名
使用 CeWL 创建自定义单词列表
使用 John 和 Hashcat 来改变自定义单词列表
从命令行进行密码暴力攻击
奖励:继续用户名枚举以发现其他有效用户

本实验室将重点关注红队对手模拟活动的执行阶段,红队将在该阶段执行侦察并为密码攻击做好准备。 在这个实验室中,您将像对手一样创造性地思考,进行侦察并了解目标组织。 您需要在 draconem.io 目标网站上执行侦察,以了解有关目标的更多信息。 该信息可用于社会工程、网络钓鱼和/或密码攻击。

需要配置openvpn到它们内部然后访问 draconem.io

  • 本实验室模拟的 TTP

T1594 - Search Victim-Owned Websites
T1592 - Gather Victim Host Information
T1592.002 - Gather Victim Host Information: Software
T1589 - Gather Victim Identity Information
T1589.002 - Gather Victim Identity Information: Email Addresses
T1589.003 - Gather Victim Identity Information: Employee Names
T1590 - Gather Victim Network Information
T1591 - Gather Victim Org Information
T1591.004 - Gather Victim Org Information: Identify Roles:
T1078 - Valid Accounts
T1087.003 - Account Discovery: Email Account
T1110.001 - Brute Force: Password Guessing

sudo openvpn ~/Desktop/sec565-labs-range.ovpn

Ctrl+Shift+t 打开一个新的终端选项卡,然后运行以下命令创建四个 ICMP 数据包:
ping -c 4 draconem.io

如果 ping 成功,则卷曲网站。 ping 测试 icmp,而curl 测试 dns、tcp 和 http。
curl draconem.io | head
image

对 draconem.io 执行侦察和密码攻击:

公司高管有哪些?


他们的电子邮件地址是什么?


draconem.io 电子邮件地址格式/语法是什么?


您能猜出其他可能的电子邮件地址吗?


您发现了什么凭据?


公司运行的是哪个版本的 Microsoft Exchange?

演练内容如下:

  1. 首先,我们访问目标公司的公共网站:http://www.draconem.io,花点时间浏览一下,以了解该公司并记下重要信息。

image

  1. 在“职业”下,我们看到了许多职位空缺,这可能是一个有价值的信息来源,可以揭示 Draconem 使用的软件。

确定空缺职位。
确定发送简历的电子邮件地址。
确定职位发布中的 Exchange 版本。
image

  1. 在“领导力”下,我们看到公司的四位主要管理人员,我们应该跟踪他们的姓名和电子邮件。 请注意,电子邮件格式为first.last@draconem.io。 了解这种格式将为我们的密码攻击提供信息。

记下领导团队的姓名、角色和电子邮件地址。
image

  1. 让我们对目标网站进行一些枚举。 我们可以使用数十种工具来蜘蛛或暴力破解目录以查找其他资源。 在本实验中,我们将使用 FFUF 或 Fuzz Faster U Fool。 FFUF 是一个用 go 编写的工具,可以轻松选择单词列表和模糊点。

我们需要一个常见 Web 服务器目录的单词列表,我们可以从 github 托管的 SecLists 项目下载 raft-small-words.txt。

curl https://raw.githubusercontent.com/danielmiessler/SecLists/master/Discovery/Web-Content/raft-small-words.txt -o directories.txt

现在我们将使用 ffuf 来请求单词列表中的每个目录。 我们使用 -mc 200,301 来指示我们只需要 HTTP 状态代码 200(正常)和 301(永久移动)。 我们用 -wdirectories.txt 来标识我们的单词列表,然后我们指向 http://www.draconem.io/FUZZ,字符串 FUZZ 将被单词列表中的每一行替换。

ffuf -mc 200,301 -w directories.txt -u http://www.draconem.io/FUZZ

image

  1. 让我们研究一下 onboarding 目录。

image

成功了,我们发现了一个未从网站上的任何其他页面链接的资源,这只是通过目录暴力破解发现的,蜘蛛不会将我们引导到这里。

下一步是看看这个表单是如何设置的并探索可能的漏洞。 尝试使用随机用户名和密码进行身份验证。 您应该看到来自网络服务器的响应,指出:“找不到使用该用户名的帐户。” 这是一种糟糕的做法,因为它仅根据用户名就给我们提供了积极和消极的响应。 这意味着我们可以由于唯一的响应而进行用户名枚举。 我们的首要目标是识别网站上公开的一些用户名,请记住“领导力”部分。 我们了解到电子邮件地址是first.last@draconem.io。

笔记
该站点不应该容易受到命令注入或 SQL 注入的攻击,我们用它来演示密码攻击。

  1. 从网站获取数据的另一种方法是使用名为 CeWL 的工具,发音为“cool”。 CeWL 通过抓取网站并根据设定的标准解析每个单词来创建自定义单词列表。 我们将使用这种技术从网站收集关键词,然后改变该单词列表以进行密码暴力攻击。

https://github.com/digininja/CeWL (狗都不用)

让我们分解下一个命令。 我们使用 CeWL 定位 draconem.io,使用 -v 启用详细程度,使用 -d 1 将深度设置为 1。深度表示 CeWL 将抓取多少级别,较大的值意味着 CeWL 将继续跟踪链接。 默认情况下,CeWL 不会跟踪异地链接,它将保留在目标域内。 我们使用 -m 9 来声明我们只对 9 个或更多字符的单词感兴趣。 我们使用 -w Words.txt 标识单词的输出文件,最后,我们希望 CeWL 解析它找到的任何电子邮件,并使用 -e --email_file emails.txt 将它们写入 emails.txt。 最后,我们将输出文件复制到我们的工作目录。[不是有个长度参数吗?各种什么牛逼泄露填进来]

sudo cewl http://www.draconem.io/ -v -d 1 -m 9 -w words.txt -e --email_file emails.txt
cp /opt/cewl/*.txt .
  1. 您会注意到我们从网站上收集了 6 封电子邮件,但如果您返回主页,就会看到 Draconem.io 发出欢迎新成员加入团队的声音。 让我们使用之前发现的用户名格式将它们添加到我们的电子邮件列表中。

image

wc -l *
cat emails.txt
echo "seth.duncan@draconem.io" >> emails.txt
cat emails.txt

image

  1. 下一步是改变网站上的关键字列表。 我们将使用 John 和 Hashcat 来创建这些突变。

首先,对于 John,我们可以通过使用 --wordlist=words.txt 提供单词列表并使用 --rules 标识规则来使用默认规则集。 我们将把突变转到 --stdout 并将其重定向到名为 john-mutations.txt 的文件

john --wordlist=words.txt --rules --stdout > john-mutations.txt

然后我们将使用 Hashcat,通过使用 --force Words.txt 设置单词列表并使用 -r /opt/hashcat/rules/leetspeak.rule 设置规则文件,然后再次发送到 --stdout 并将其重定向到名为 hashcat-mutations.txt的文件

hashcat --force words.txt -r /opt/hashcat/rules/leetspeak.rule --stdout > hashcat-mutations.txt

创建这两个单词列表后,请查看突变以了解它们有何不同。 你可以使用 cat、head、tail、less、more、vim 甚至 gedit 来查看这些单词列表。 在屏幕截图中,我们使用 shuf -n 4 john-mutations.txt 从文件中打印 4 个随机行。 我们从 296 个单词开始,与 John 一起创建了 14,405 个突变。 你应该看到约翰的突变主要是在原始单词的前面和后面添加字符。 同时,我们选择了 leetspeak 规则集,通过用数字和特殊字符替换字母字符,将原始单词表突变为 5,032 个单词。

image

  1. 现在我们已经知道了用户名和一些单词列表,我们将使用 bash 和 curl 制作一个暴力破解qi。 有许多工具可以使这个过程变得更容易,但了解如何自己编写脚本会很有帮助。 我们将逐步完成此过程的每一步。

我们希望能够通过命令行与网站交互,以便我们可以自动执行攻击。 我们将使用curl 将带有一组凭据的HTTP POST 发送到网站。 我们可以使用 Web 代理或 Burp Suite 等工具,或者我们可以简单地尝试进行身份验证并使用浏览器的开发人员工具来检查 Web 请求。 打开 Firefox 浏览器,访问 http://www.draconem.io/onboarding/ 并按 F12 或使用右上角的汉堡菜单 -> 更多工具 -> Web 开发人员工具。

image

然后导航到网络选项卡。 现在提交用户名和密码并检查 Web 请求。
image

您可以继续使用 Firefox 来检查 Web 请求,但我们希望将其带到命令行。 右键单击 post 请求,然后选择复制为 -> 复制为 cURL。

image

  1. 单击顶部 Slingshot 菜单打开文本编辑器:应用程序 -> 附件 -> 文本编辑器。 在文本编辑器中,右键单击 -> 粘贴或 CTRL+V 粘贴您的curl 语句。
curl 'http://www.draconem.io/onboarding/' -X POST -H 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.83 Safari/537.1' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Origin: http://www.draconem.io' -H 'Connection: keep-alive' -H 'Referer: http://www.draconem.io/onboarding/' -H 'Cookie: PHPSESSID=f72968120e2acf1c4d9fcfa881c3e416' -H 'Upgrade-Insecure-Requests: 1' --data-raw 'username=seth.duncan&password=test&submit='

由于所有 HTTP 标头,这里发生了很多事情,为了本实验的目的,我们将通过仅保留 URL、HTTP 方法和数据负载来简化请求。 我们还将数据负载中的单引号更改为双引号,以便利用 shell 变量。 例如,我们想用变量替换硬编码文本。 我们还添加了命令行开关 -s 表示静默,-k 表示不安全(忽略 ssl 问题),以及 -i 来包含 HTTP 响应标头。 在创建暴力循环之前,我们首先测试一下。

-X POST 有点多余,因为 cURL 会自动将请求作为 POST 发送,因为存在数据负载。

删除额外的标头并运行以下简短的命令:

curl -ski 'http://www.draconem.io/onboarding/' --data-raw "username=seth.duncan&password=test&submit="

image

  1. 接下来我们要创建一个子目录来存储 mkdir 尝试的响应。 使用 u="seth.duncan" 为我们的用户名分配一个 shell 变量,并使用 count=0 分配一个用于保持计数的变量。
mkdir attempts
u="seth.duncan"
count=0

我们将使用 while 循环来迭代我们的密码,我们将收集响应并使用 grep 解析出 <h4> 标签。 当我们测试这个网站时,我们注意到 <h4> 标签用于 Web 服务器对我们的身份验证请求的响应。 我们的 while 循环将读取输入文件的每一行,并将该字符串分配给我们选择的变量。 为了测试语法,让我们设置循环来回显或打印出 hashcat-mutations.txt 中包含的前 1000 个密码。 首先让我们减少这个列表。

head -n 1000 hashcat-mutations.txt > hashcat-mutations-1000.txt

您应该复制以下三行并将它们全部粘贴到终端窗口中。

while read p; do
  echo $p
done < hashcat-mutations-1000.txt

image

  1. 通过工作循环,我们现在可以设置结构的其余部分,以使用用户名 seth.duncan 和自定义单词列表中的密码发送 Web 请求。 我们使用用户名和计数变量 filename="attempts/$u-$count" 创建一个唯一的文件名。 我们不使用密码,因为特殊字符会干扰文件系统。 我们将密码回显到文件中以进行跟踪,然后发送请求,解析 <h4> 标记并将结果附加到文件中。 在执行循环的下一次迭代之前,我们使用 ((count+=1)) 将计数增加 1。 在发起此攻击之前,让我们启动 Wireshark,以便可以看到我们正在生成的网络流量。
sudo wireshark &
count=0
while read p; do
  filename="attempts/$u-$count"
  echo $p > $filename
  curl -ski 'http://www.draconem.io/onboarding/' --data-raw "username=$u&password=$p&submit=" | grep "<h4>" >> $filename
  ((count+=1))
done < hashcat-mutations-1000.txt
echo $count

image

  1. 我们刚刚向目标发送了 1000 次身份验证尝试。 每个响应的片段应该在 attempts 文件夹中可用。

我们可以使用 ls -alS attempts/ | head 按大小对文件进行排序 看看某个特定的请求是否突出。 看起来请求号 866 是第二大请求的两倍多。 如果我们查看该尝试的结果,我们可以看到我们能够成功通过 seth.duncan 和 SeaSerpent 的 leet talk 版本进行身份验证:S3@S3rp3nt。

wc -l hashcat-mutations-1000.txt
ls -alS attempts/ | head

image

14.您还可以在wireshark中检查每个Web请求,以查看网络流量的情况。 这有助于长时间运行的脚本查看是否仍然存在网络活动。 使用wireshark来解析流量以确保您的网络流量符合RFC也是一个好主意。
image

image

  1. 我们刚刚发现了目标的有效凭据。 记下您在此过程中收集的所有凭据。 这是密码暴力或密码猜测攻击。 我们使用了一些用户名和大量可能的密码来查找有效的凭据。 请注意,这仅在某些情况下才可能实现。

我们没有注意到帐户锁定机制
我们收集了有效的用户名,并可以使用网站的错误消息来验证它们
我们能够按照网站处理的速度发送任意数量的尝试,因为它不会对我们的源 IP 实施速率限制或阻止。
最后一点,我们可以通过使用线程或分叉来提高这种暴力破解的速度。