TryHackMe - Crypto Failures 靶场实战教学文档
靶场核心概念
本靶场核心是利用经典密码学实现中的漏洞(Crypto Failures),具体是 DES(Data Encryption Standard)加密算法在 ECB(Electronic Codebook)模式下的弱点,以及一个自定义的、不安全的加密方案。攻击者通过分析目标网站的认证机制,伪造加密凭证,最终获取敏感信息(Flag)。
关键知识点:
- 信息收集与枚举:使用工具发现隐藏文件。
- 源码分析:通过备份文件获取服务器端加密逻辑。
- 自定义加密算法分析:理解并利用弱加密方案。
- DES-ECB 模式漏洞利用:利用其无扩散性、块独立性进行块重放攻击。
- 已知明文攻击:在已知部分明文和密文的情况下,推断或爆破未知部分。
详细攻击步骤解析
阶段一:信息收集与初始访问
-
端口扫描
- 使用
nmap等工具扫描目标,发现开放了 22 (SSH) 和 80 (HTTP) 端口。主攻方向为 Web 服务。
- 使用
-
Web 目录枚举
- 访问网站后,查看页面源代码,提示存在隐藏文件。
- 使用
ffuf工具进行目录和文件爆破。ffuf -u 'http://<TARGET_IP>/FUZZ' -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-small.txt -e .php,.php.bak -t 100 -mc all -ic -fc 404 - 扫描结果:发现三个关键文件,其中
index.php.bak是index.php的备份文件,包含了网站的核心逻辑。
阶段二:源码分析与加密逻辑破解
-
分析
index.php.bak- 下载并分析该备份文件,得知网站的认证机制基于一个名为
secure_cookie的 Cookie。 - 加密流程:
- 明文格式:
user:user_agent:ENC_SECRET_KEY(例如:guest:Mozilla/5.0...:ENC_SECRET_KEY)。 - 加密方式:使用 PHP 的
crypt()函数,但采用了一种不安全的使用方式。 - 关键漏洞:
crypt()函数在使用DES算法时,仅使用盐值(salt)的前两位。- 加密后的密文格式为:
盐值(2字符) + 加密后的密文(11字符),总长 13 字符。 - 明文被分成 8字节(64位) 的块进行加密,这正是 DES 的块大小。加密模式实际上是 ECB,因为
crypt()的 DES 实现是单块加密。 - 对于长明文,加密方式是将每个 8 字节块独立进行 DES 加密,然后将这些 13 字符的密文块拼接起来。
- 明文格式:
- 下载并分析该备份文件,得知网站的认证机制基于一个名为
-
利用漏洞伪造 Cookie
-
目标:将默认的
guest用户提升为admin用户。 -
攻击原理(ECB 块重放):
- ECB 模式下,相同的明文块总是生成相同的密文块。
- 原始明文(示例):
guest:Mo(前 8 个字节)。 - 目标明文:
admin:Mo(前 8 个字节)。 - 由于只有第一个 8 字节块不同,我们只需要重新加密
admin:Mo这个块,然后用得到的新密文块替换掉原secure_cookie的第一个密文块即可。
-
操作步骤:
a. 使用 PHP 脚本加密字符串"admin:Mo",并指定盐值为"ac"(与原文中一致)。<?php $string = "admin:Mo"; $salt = "ac"; $encrypted = crypt($string, $salt); echo "加密结果: " . $encrypted . "\n"; // 输出类似 acCv6DpniHDDM ?>b. 获取浏览器中的原始
secure_cookie值(例如:acCv6DpniHDDMxLk4K0BfRfO...)。
c. 将原始 Cookie 的第一个 13 字符密文块(acCv6DpniHDDM)替换为刚生成的新密文块(acCv6DpniHDDM,这里仅为示例,实际值不同)。
d. 将修改后的完整 Cookie 值通过浏览器开发者工具设置回secure_cookie,然后刷新页面。 -
结果:网站认证逻辑会使用新 Cookie 解密,第一个块解密后变为
admin:Mo,从而成功以admin身份登录,并可能直接获得第一个 Flag 或进入下一阶段。
-
阶段三:爆破密钥(ENC_SECRET_KEY)
在成为 admin 后,下一个目标是获取完整的 ENC_SECRET_KEY。原文采用了一种精妙的已知明文攻击方法。
-
攻击原理
- 已知部分:我们知道明文的固定格式为
user:user_agent:key。其中user(admin)和user_agent(我们可以控制)是已知的,key是未知的。 - 可控部分:HTTP 请求头中的
User-Agent字段内容完全由我们控制。 - 核心思想:通过精确控制
User-Agent的长度,使得我们想爆破的单个未知字符恰好落在某个 DES 块的最后一个字节。这样,该块的加密结果仅取决于这个未知字符和前 7 个已知字符。
- 已知部分:我们知道明文的固定格式为
-
攻击步骤(自动化脚本)
- 原文提供了一个强大的 Python 脚本来自动化此过程。脚本的核心逻辑如下:
a. 计算 UA 长度:对于当前已爆破出的密钥前缀(known_key),脚本会计算一个特定的User-Agent长度,使得"admin:" + UA + ":" + known_key + "?"的总长度满足:?(待爆破字符)位于某个 8 字节块的末尾。
b. 发送请求:使用计算好长度的User-Agent(通常用a填充)向目标发送 HTTP 请求,服务器会生成并返回对应的secure_cookie。
c. 块比对:脚本提取响应的secure_cookie,并找到对应目标块的 13 字符密文段。
d. 本地爆破:脚本在本地遍历所有候选字符(如可打印 ASCII 字符),将已知的7字节 + 候选字符组合成一个 8 字节块,用相同的盐值进行 DES 加密。
e. 匹配判断:如果本地加密结果与目标密文块匹配,则说明爆破成功,该候选字符就是密钥的下一位。
f. 迭代循环:将新爆破出的字符追加到known_key中,重复 a-e 步骤,直至爆破出指定长度的完整密钥或密钥结束。
- 原文提供了一个强大的 Python 脚本来自动化此过程。脚本的核心逻辑如下:
-
执行命令
- 使用以下命令运行脚本,爆破长度为 300 的密钥:
python3 brute_script.py --key-length 300 --url http://<TARGET_IP>/ - 脚本需要
requests和passlib库支持(用于des_crypt计算)。
- 使用以下命令运行脚本,爆破长度为 300 的密钥:
-
最终获取 Flag
- 成功爆破出完整的
ENC_SECRET_KEY后,很可能就是最终的 Flag,或者用于解密其他敏感数据来获得 Flag。
- 成功爆破出完整的
总结与知识点强调
| 关键点 | 原理与影响 |
|---|---|
不安全的 crypt() 使用 |
使用固定的短盐值,且暴露了加密模式(ECB),使得攻击成为可能。 |
| ECB 模式的缺陷 | 缺乏扩散性,明文块与密文块一一对应,导致块重放攻击。这是绝对不应在现代加密中使用的模式。 |
| 可控输入与已知明文攻击 | 通过控制User-Agent 长度,将问题转化为对单个字符的本地爆破,极大降低了攻击难度。 |
| DES 算法过时 | 56 位密钥过短,易受暴力破解。本靶场虽未直接暴力破解密钥,但利用了其块加密特性。 |
这份教学文档完全基于您提供的链接内容生成,详尽地解析了从信息收集到最终获取 Flag 的完整攻击链和其背后的密码学原理。希望这对您的学习有所帮助!