Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CRIME-poc — :hocho: CRIME 攻击 PoC:一种针对 CVE-2012-4929 的压缩预言机攻击 :hocho: | Kitploit
工具/GitHubGitHub/mpgn/crime-poc
漏洞分析漏洞利用Web安全密码学论文与研究学习与教育
GitHubmpgn/crime-poc

CRIME-poc

🔪 CRIME 攻击 PoC:一种针对 CVE-2012-4929 的压缩预言机攻击 🔪

查看仓库
31107年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CRIME-poc

CRIME 攻击:一种压缩预言攻击,由 Juliano Rizzo 和 Thai Duong 发现,编号为 CVE-2012-4929。

在压缩预言攻击中,对选定明文和未知明文的混合体使用自适应数据压缩,会导致压缩文本的长度发生内容敏感的变化,即使压缩文本本身随后被加密,这种变化也能被检测到。这可用于协议攻击,以检测注入的已知明文与消息秘密部分中的未知内容是否甚至部分相似,从而大大降低搜索秘密文本匹配项的复杂度。CRIME 和 BREACH 攻击就是利用这一现象的协议攻击示例。

CRIME 攻击允许你利用加密数据的长度,恢复客户端发送给服务器的加密数据。它不允许你恢复用于加密消息或 HTTP 请求的私钥。

目录

  1. 解释
  2. 概念验证
    1. RC4 流密码
    2. CBC 密码模式
  3. 漏洞利用

解释

许多文章解释了 CRIME 攻击的工作原理,但以下是我在互联网上找到的最佳解释:

  1. 这个回答:如何击败 Beast 继任者的 Crime
  2. NCC Group 的 SSL 攻击调查

这种攻击其实并不复杂,真正有趣的部分在于其实现与“理论”略有不同。

让我们看看文章中描述的朴素方法,这是理解其工作原理的好方法:

攻击者可以控制客户端发送的请求(例如使用 JavaScript)。目标是从秘密 Cookie 中获取信息。攻击者发送多个类似这样的请求,并检查加密数据长度:

请求长度
GET /cookie= DATA cookie=quokkalight80
GET /cookie=a DATA cookie=quokkalight81
GET /cookie=b DATA cookie=quokkalight81
GET /cookie=. DATA cookie=quokkalight81
GET /cookie=q DATA cookie=quokkalight80

由于 cookie=q 与秘密 Cookie 中的 cookie=quokkalight 匹配,加密数据的长度将相同,攻击者得知他已找到一个字节。

但这种方法有时会失败,并不可靠,因此我们将改用另一种方法。 首先,我们发送一个请求,其中包含我们要查找的字符,后跟一些在初始请求中不可能出现的字符,比如一些特殊字符:chr(i) + "#:/[@/&"。然后,我们再发送第二个请求,但将有效载荷反转,如下所示:"#:/[@/&" + chr(i),并比较两者的长度。如果 len(enc(req1)) < len(enc(req2)),则找到了一个字节。这种方法称为 two_tries,而且可靠得多:

攻击者找到了一个字节!

root@kitploit:~
if len(enc(request1)) < len(enc(request2)):
    print("found byte")

我实现的 two_tries 方法完全是递归的,但为什么呢?有时,因为压缩会匹配多个模式,所以可能会找到多个字节。

以秘密值 cookie=quokkalight 为例,如果我们运行 two_tries 算法,将得到以下结果:

root@kitploit:~
result 1: cookie=quokie=quokie=quokie=quokie=quokie=
result 2: cookie=quokkalight

该算法需要遍历树中的所有路径,才能找到所有可能的解。 我们可以将所有结果看作一棵树,如下所示:

img

概念验证

RC4 流密码

针对流密码模式的 CRIME 攻击概念验证代码位于文件 CRIME-RC4-poc.py 中。这是对先前解释的 Python 实现。

root@kitploit:~
python3 CRIME-RC4-poc.py

完整演示和结果:

asciicast

CBC 密码模式

当 CBC 密码模式与 AES 或 DES 一起使用时,攻击不像 RC4 那样简单。由于所有内容都被分成块,攻击会稍微棘手一些(但不会太复杂)。

cbc

例如,假设我们使用带 CBC 密码模式的 AES,块将被分成 16 字节长度,如果 len(data)%16 != 0,则会在末尾添加填充。 在 CBC 模式下,务必注意,有效载荷 payload=rand 将产生 16 的长度而不是 12,因为填充会在加密之前添加到数据末尾。因此,我们之前的攻击无法奏效。

示例:

在此示例中,长度将始终相同,因为如果我们添加或删除一个字节,长度将始终相同,只有填充会改变。攻击者只能看到加密数据,他无法通过加密数据得知填充。

解决方案:利用 CBC 模式的规范,通过在 GARB 变量(位于 GET 参数中,因为攻击者控制 GET 和 POST 数据)中添加随机值,使填充长度为 1。

如果字节匹配某个模式,长度将相同;如果不匹配,长度将不同。

接下来,我们只需使用 RC4 部分中介绍的相同方法,只需在前面增加一步。

  1. 我们调用 adjust_padding() 函数,以便得到长度为 1 的填充。
  2. 我们调用 two_tries_recursive() 函数,就能找到秘密 FLAG!
root@kitploit:~
python3 CRIME-cbc-poc.py

asciicast

漏洞利用

即将推出…

root@kitploit:~
                \     /
                 \ _ /
              ----/_\----
  x--------------( . )--------------x
       x|x   | |_|\_/|_| |   x|x
        x    x           x    x     

参考资料

https://www.nccgroup.trust/globalassets/our-research/us/whitepapers/ssl_attacks_survey.pdf https://github.com/cloudflare/cf-nocompress https://www.ekoparty.org/archive/2012/CRIME_ekoparty2012.pdf https://security.stackexchange.com/questions/19911/crime-how-to-beat-the-beast-successor/19914#19914

下载工具
检索字节 q 的请求长度
GET /cookie=a~#:/[@/& DATA cookie=quokkalight81
GET /cookie=~#:/[@/&a DATA cookie=quokkalight81
GET /cookie=b~#:/[@/& DATA cookie=quokkalight81
GET /cookie=~#:/[@/&b DATA cookie=quokkalight81
GET /cookie=q~#:/[@/& DATA cookie=quokkalight80
GET /cookie=~#:/[@/&q DATA cookie=quokkalight81
块1块2块3长度
GET /cookie= DATA cookie=quokkalight + PAD(11)48
GET /cookie=a DATA cookie=quokkalight + PAD(10)48
GET /cookie=b DATA cookie=quokkalight + PAD(10)48
GET /cookie=. DATA cookie=quokkalight + PAD(10)48
GET /cookie=q DATA cookie=quokkalight + PAD(11)48
块1块2块3块4长度
GET /GARBcookie= DATA cookie=quokkalight + PAD(1)48
GET /GARBcookie=a DATA cookie=quokkalightPAD(16)64
GET /GARBcookie=b DATA cookie=quokkalightPAD(16)64
GET /GARBcookie=. DATA cookie=quokkalightPAD(16)64
GET /GARBcookie=q DATA cookie=quokkalight + PAD(1)48