Symmetric Crypto
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
在 CTFs 中要注意的事项
- 模式滥用: ECB patterns, CBC malleability, CTR/GCM nonce reuse.
- Padding oracles: 不同的错误/时序差异会暴露 bad padding。
- MAC confusion: 在可变长度消息中使用 CBC-MAC,或 MAC-then-encrypt 的错误。
- XOR everywhere: stream ciphers 和自定义构造常常归结为与 keystream 的 XOR。
AES 模式与误用
ECB: Electronic Codebook
ECB leaks patterns: equal plaintext blocks → equal ciphertext blocks。这样会导致:
- Cut-and-paste / block reordering
- Block deletion(如果格式仍然有效)
如果你能控制 plaintext 并观察 ciphertext(或 cookies),尝试制造重复块(例如许多 As)并寻找重复。
CBC: Cipher Block Chaining
- CBC 是 可篡改的:翻转
C[i-1]的比特会在P[i]中翻转可预测的比特。 - 如果系统区分有效 padding 与无效 padding,你可能遇到 padding oracle。
CTR
CTR 将 AES 变为流密码:C = P XOR keystream。
如果 nonce/IV 在相同密钥下被重用:
C1 XOR C2 = P1 XOR P2(经典 keystream 重用)- 如果有 known plaintext,你可以恢复 keystream 并解密其他数据。
GCM
GCM 在 nonce 重用下也会严重崩坏。如果相同的 key+nonce 被多次使用,通常会出现:
- 加密的 keystream 重用(像 CTR),当任一 plaintext 已知时可恢复明文。
- 失去完整性保证。取决于暴露内容(在相同 nonce 下的多个 message/tag 对),攻击者可能能够 forge tags。
操作性建议:
- 将 AEAD 中的 “nonce reuse” 视为严重漏洞。
- 如果你有多个在相同 nonce 下的 ciphertext,先检查
C1 XOR C2 = P1 XOR P2这类关系。
Tools
- CyberChef 用于快速实验: https://gchq.github.io/CyberChef/
- Python:
pycryptodome用于脚本化
ECB exploitation patterns
ECB (Electronic Code Book) 对每个块独立加密:
- equal plaintext blocks → equal ciphertext blocks
- this leaks 结构并允许 cut-and-paste 风格的攻击
![]()
检测思路:token/cookie 模式
如果你多次登录并且 总是得到相同的 cookie,则 ciphertext 可能是确定性的(ECB 或固定 IV)。
如果你创建两个用户,具有几乎相同的 plaintext 布局(例如长的重复字符),并在相同偏移处看到重复的 ciphertext 块,则 ECB 是主要嫌疑。
利用模式
Removing entire blocks
如果 token 格式类似 <username>|<password> 且块边界对齐,你有时可以构造一个用户使 admin 块对齐,然后移除前面的块以获得有效的 admin token。
Moving blocks
如果后端容忍填充/额外空格(admin vs admin ),你可以:
- 对齐包含
admin的块 - 将该 ciphertext 块交换/重用到另一个 token 中
Padding Oracle
它是什么
在 CBC 模式中,如果服务器(直接或间接地)泄露解密后的 plaintext 是否具有 valid PKCS#7 padding,你通常可以:
- 在没有密钥的情况下 decrypt ciphertext
- encrypt 选定的 plaintext(forge ciphertext)
该 oracle 可以是:
- 一个特定的错误消息
- 不同的 HTTP 状态 / 响应大小
- 一个时序差异
实际利用
PadBuster 是经典工具:
GitHub - strozfriedberg/PadBuster: Automated script for performing Padding Oracle attacks
示例:
perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 16 \
-encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA=="
注意:
- Block size is often
16for AES. -encoding 0means Base64.- Use
-errorif the oracle is a specific string.
为什么能行
CBC 解密计算 P[i] = D(C[i]) XOR C[i-1]。通过修改 C[i-1] 中的字节并观察填充是否有效,可以逐字节恢复 P[i]。
CBC 中的位翻转
即使没有 padding oracle,CBC 也是可塑的。如果你能修改密文块并且应用将解密后的明文作为结构化数据使用(例如 role=user),你可以翻转特定位以改变下一块中选定位置的明文字节。
典型 CTF 模式:
- Token =
IV || C1 || C2 || ... - 你能控制
C[i]中的字节 - 你针对
P[i+1]中的明文字节,因为P[i+1] = D(C[i+1]) XOR C[i]
这本身不是泄露机密的漏洞,但在缺乏完整性保护时常被用作权限提升的原语。
CBC-MAC
CBC-MAC 仅在特定条件下安全(尤其是 固定长度的消息 和正确的域分离)。
经典的可变长度伪造模式
CBC-MAC 通常按如下方式计算:
- IV = 0
tag = last_block( CBC_encrypt(key, message, IV=0) )
如果你能为选择的消息获取 tag,通常可以利用 CBC 的链式特性在不知道密钥的情况下为拼接(或相关构造)伪造一个 tag。
这在对 username 或 role 使用 CBC-MAC 的 CTF cookie/token 中经常出现。
更安全的替代方案
- Use HMAC (SHA-256/512)
- Use CMAC (AES-CMAC) correctly
- Include message length / domain separation
流密码:XOR 和 RC4
思维模型
大多数流密码情形可简化为:
ciphertext = plaintext XOR keystream
因此:
- 如果你知道明文,就能恢复 keystream。
- 如果 keystream 被重用(相同 key+nonce),
C1 XOR C2 = P1 XOR P2。
基于 XOR 的加密
如果你在位置 i 知道任一明文段,就可以恢复 keystream 字节并解密那些位置上的其它密文。
Autosolvers:
RC4
RC4 是流密码;加密/解密是相同的操作。
如果你能在相同密钥下获得已知明文的 RC4 加密,你可以恢复 keystream 并解密其它相同长度/偏移的消息。
Reference writeup (HTB Kryptos):
Hack The Box - Kryptos - 0xRick\xe2\x80\x99s Blog
Tip
学习和实践 AWS 黑客技术:
HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
学习和实践 Azure 黑客技术:
HackTricks Training Azure Red Team Expert (AzRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
HackTricks

