☰
CTF学习/crypto/重放攻击与中间人攻击
2026/11/4 7:08:18 网站建设 项目流程

重放攻击与中间人攻击

考点概念

重放攻击:截获合法消息原样重发,服务端若不做新鲜性校验即接受,可造成重复扣款/重复登录/越权。

防御:时间戳、nonce、序列号、一次性令牌、挑战应答。

中间人攻击:攻击者插入通信双方中间,各自协商密钥/伪造身份,

裸 DH 无签名时 MITM 可直接分别与两端握手,两端以为在跟对方通信。

识别特征

重放:服务端对相同请求幂等处理可复现;题目提示"重放、replay、重复提交"。 MITM:题目给出 Alice/Bob/中间人三角色,或 pcap 中有两套协商参数。 交互题:服务端返回可被原样回发的挑战-应答。

靶场题目

Parameter Injection(CryptoHack) Export-grade(CryptoHack) Static Client(CryptoHack) Static Client 2(CryptoHack)

Writeup

题目:Parameter Injection(CryptoHack) 识别:中间人可改写转发内容,且对端不验证收到的元素——向 Alice 注入低阶元素 B=1 即让共享密钥完全可控。 解题:把转发给 Alice 的 B 替换为 1(1 阶元素),Alice 计算 shared = 1^a = 1;攻击者以 shared=1 派生密钥解密。把 g 改 1 或注入弱 p 同理。

脚本:

from Crypto.Cipher import AES import hashlib ​ iv = "ffcfddfb14556d0dae9c5b1ac3fcf86c" ct = "761fa22d677a0172903201261e39ba5fd024c16313f13f060ad1f5eaf883c80e" shared = 1 key = hashlib.sha1(str(shared).encode()).digest()[:16] pt = AES.new(key, AES.MODE_CBC, bytes.fromhex(iv)).decrypt(bytes.fromhex(ct)) print(pt[:-pt[-1]])

工具:https://cryptohack.org/challenges/diffie-hellman/

题目:Export-grade(CryptoHack) 识别:参数协商无认证且由攻击者提供

FREAK/Logjam 式出口降级

解题:协商阶段给双方注入自选弱参数组:构造 p−1 为小素因子乘积的素数 p 与生成元 g;双方在其上交换 A、B;攻击者在弱群中以 Pohlig-Hellman 解出对方私钥 b,再算 shared = A^b 解密被动截获的密文。

脚本:

import random ​ SMALL_PRIMES = [] sieve = bytearray([1]) * 5000 sieve[0:2] = b"\x00\x00" for i in range(2, 5000): if sieve[i]: SMALL_PRIMES.append(i) for k in range(i * i, 5000, i): sieve[k] = 0 ​ def is_prime(n): for pp in (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37): if n % pp == 0: return n == pp d, r = n - 1, 0 while d % 2 == 0: d //= 2 r += 1 for a in (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37): x = pow(a, d, n) if x in (1, n - 1): continue for _ in range(r - 1): x = x * x % n if x == n - 1: break else: return False return True ​ def gen_smooth_prime(): rnd = random.Random(11) while True: sel = sorted(rnd.sample(SMALL_PRIMES, 31)) prod = 1 for v in sel: prod *= v if 150 <= prod.bit_length() <= 300 and is_prime(prod + 1): return prod + 1, sel ​ def pohlig_hellman(g, h, p, factors): residues = [] for r in factors: g_r = pow(g, (p - 1) // r, p) h_r = pow(h, (p - 1) // r, p) t = next(e for e in range(r) if pow(g_r, e, p) == h_r) residues.append((r, t)) x, M = 0, 1 for r, t in residues: x += ((t - x) * pow(M, -1, r)) % r * M M *= r return x ​ p, facs = gen_smooth_prime() print("injected p =", p) g = random.Random(3).randrange(2, p) while any(pow(g, (p - 1) // r, p) == 1 for r in facs): g += 1 b = random.randrange(2, p - 1) B = pow(g, b, p) print("recovered bob key:", pohlig_hellman(g, B, p, facs) == b)

工具:CryptoHack – Diffie-Hellman challenges

题目:Static Client(CryptoHack) 识别:Bob 公钥静态复用、会话无认证;你是新的"客户端",Bob 会用与你派生的共享密钥加密 flag 回传。

解题:发 A=1(1 阶元素),Bob 计算 shared = 1^b = 1,攻击者以 shared=1 派生密钥解密回包。与 Parameter Injection 同源的低阶元素注入,只是注入点换成了客户端方向。 脚本:

from Crypto.Cipher import AES import hashlib ​ iv = "" ct = "" shared = 1 key = hashlib.sha1(str(shared).encode()).digest()[:16] pt = AES.new(key, AES.MODE_CBC, bytes.fromhex(iv)).decrypt(bytes.fromhex(ct)) print(pt[:-pt[-1]])

工具:https://cryptohack.org/challenges/diffie-hellman/

题目:Static Client 2(CryptoHack) 识别:元素注入被挡

解题:自选平滑素数 p 与生成元 g 注入协商;Bob 在你的群上生成 B=g^b 后,用 Pohlig-Hellman 解出其静态私钥 b,再用任意合法 A 计算 shared = A^b 解密。弱参数构造与 PH 求解代码与 Export-grade 题一样

工具:CryptoHack – Diffie-Hellman challenges

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询