Tryhackme Crypto Failures靶场
字数 3313 2025-10-18 11:17:50

TryHackMe - Crypto Failures 靶场实战教学文档

靶场核心概念

本靶场核心是利用经典密码学实现中的漏洞(Crypto Failures),具体是 DES(Data Encryption Standard)加密算法在 ECB(Electronic Codebook)模式下的弱点,以及一个自定义的、不安全的加密方案。攻击者通过分析目标网站的认证机制,伪造加密凭证,最终获取敏感信息(Flag)。

关键知识点:

  1. 信息收集与枚举:使用工具发现隐藏文件。
  2. 源码分析:通过备份文件获取服务器端加密逻辑。
  3. 自定义加密算法分析:理解并利用弱加密方案。
  4. DES-ECB 模式漏洞利用:利用其无扩散性、块独立性进行块重放攻击。
  5. 已知明文攻击:在已知部分明文和密文的情况下,推断或爆破未知部分。

详细攻击步骤解析

阶段一:信息收集与初始访问
  1. 端口扫描

    • 使用 nmap 等工具扫描目标,发现开放了 22 (SSH)80 (HTTP) 端口。主攻方向为 Web 服务。
  2. 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.bakindex.php 的备份文件,包含了网站的核心逻辑。
阶段二:源码分析与加密逻辑破解
  1. 分析 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 字符的密文块拼接起来。
  2. 利用漏洞伪造 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。原文采用了一种精妙的已知明文攻击方法。

  1. 攻击原理

    • 已知部分:我们知道明文的固定格式为 user:user_agent:key。其中 useradmin)和 user_agent(我们可以控制)是已知的,key 是未知的。
    • 可控部分:HTTP 请求头中的 User-Agent 字段内容完全由我们控制。
    • 核心思想:通过精确控制 User-Agent 的长度,使得我们想爆破的单个未知字符恰好落在某个 DES 块的最后一个字节。这样,该块的加密结果仅取决于这个未知字符和前 7 个已知字符。
  2. 攻击步骤(自动化脚本)

    • 原文提供了一个强大的 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 步骤,直至爆破出指定长度的完整密钥或密钥结束。
  3. 执行命令

    • 使用以下命令运行脚本,爆破长度为 300 的密钥:
      python3 brute_script.py --key-length 300 --url http://<TARGET_IP>/
      
    • 脚本需要 requestspasslib 库支持(用于 des_crypt 计算)。
  4. 最终获取 Flag

    • 成功爆破出完整的 ENC_SECRET_KEY 后,很可能就是最终的 Flag,或者用于解密其他敏感数据来获得 Flag。

总结与知识点强调

关键点 原理与影响
不安全的 crypt() 使用 使用固定的短盐值,且暴露了加密模式(ECB),使得攻击成为可能。
ECB 模式的缺陷 缺乏扩散性,明文块与密文块一一对应,导致块重放攻击。这是绝对不应在现代加密中使用的模式。
可控输入与已知明文攻击 通过控制User-Agent 长度,将问题转化为对单个字符的本地爆破,极大降低了攻击难度。
DES 算法过时 56 位密钥过短,易受暴力破解。本靶场虽未直接暴力破解密钥,但利用了其块加密特性。

这份教学文档完全基于您提供的链接内容生成,详尽地解析了从信息收集到最终获取 Flag 的完整攻击链和其背后的密码学原理。希望这对您的学习有所帮助!

TryHackMe - Crypto Failures 靶场实战教学文档 靶场核心概念 本靶场核心是 利用经典密码学实现中的漏洞(Crypto Failures) ,具体是 DES(Data Encryption Standard)加密算法在 ECB(Electronic Codebook)模式下的弱点 ,以及一个 自定义的、不安全的加密方案 。攻击者通过分析目标网站的认证机制,伪造加密凭证,最终获取敏感信息(Flag)。 关键知识点: 信息收集与枚举 :使用工具发现隐藏文件。 源码分析 :通过备份文件获取服务器端加密逻辑。 自定义加密算法分析 :理解并利用弱加密方案。 DES-ECB 模式漏洞利用 :利用其无扩散性、块独立性进行块重放攻击。 已知明文攻击 :在已知部分明文和密文的情况下,推断或爆破未知部分。 详细攻击步骤解析 阶段一:信息收集与初始访问 端口扫描 使用 nmap 等工具扫描目标,发现开放了 22 (SSH) 和 80 (HTTP) 端口。主攻方向为 Web 服务。 Web 目录枚举 访问网站后,查看页面源代码,提示存在隐藏文件。 使用 ffuf 工具进行目录和文件爆破。 扫描结果 :发现三个关键文件,其中 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" (与原文中一致)。 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 步骤,直至爆破出指定长度的完整密钥或密钥结束。 执行命令 使用以下命令运行脚本,爆破长度为 300 的密钥: 脚本需要 requests 和 passlib 库支持(用于 des_crypt 计算)。 最终获取 Flag 成功爆破出完整的 ENC_SECRET_KEY 后,很可能就是最终的 Flag,或者用于解密其他敏感数据来获得 Flag。 总结与知识点强调 | 关键点 | 原理与影响 | | :-------------------------- | :------------------------------------------------------------------------------------------- | | 不安全的 crypt() 使用 | 使用固定的短盐值,且暴露了加密模式(ECB),使得攻击成为可能。 | | ECB 模式的缺陷 | 缺乏扩散性,明文块与密文块一一对应,导致块重放攻击。这是 绝对不应在现代加密中使用 的模式。 | | 可控输入与已知明文攻击 | 通过控制 User-Agent 长度,将问题转化为对单个字符的本地爆破,极大降低了攻击难度。 | | DES 算法过时 | 56 位密钥过短,易受暴力破解。本靶场虽未直接暴力破解密钥,但利用了其块加密特性。 | 这份教学文档完全基于您提供的链接内容生成,详尽地解析了从信息收集到最终获取 Flag 的完整攻击链和其背后的密码学原理。希望这对您的学习有所帮助!