Kripto Hujumlar va CTF Toolbox
Chastota tahlili, Padding Oracle, Birthday Attack, Known/Chosen Plaintext, Length Extension — kriptografik zaifliklarni tushunish va CTF musobaqalarida qo'llash.
1 Kriptografik Hujum Turlari
2 Padding Oracle Hujumi
Padding Oracle — AES-CBC'da server padding xatosini oshkor qilsa, butun ciphertext deshifrlanishi mumkin. POODLE (2014), BEAST (2011) hujumlari shu zaiflikdan foydalangan. TLS 1.3 ushbu hujumni butunlay yo'q qildi (CBC ishlatilmaydi).
Hujum Bosqichlari
Oxirgi baytni topish
C[i-1] ning oxirgi baytini o'zgartira borib server 'valid padding' qaytarguncha kutish. Bu I[i] ning oxirgi baytini beradi.
Plaintext baytini hisoblash
P[i][j] = I[i][j] ⊕ C[i-1][j]
Keyingi baytga o'tish
\x02 padding uchun oxirgi 2 baytni to'g'irlash, yangi baytni topish.
Blokni to'liq deshifrlash
16 bayt uchun 16×256 = 4096 so'rov maksimal (odatda kamroq).
# Padding Oracle konseptual misol
def padding_oracle_attack(ciphertext, oracle):
# oracle(c) → True agar padding to'g'ri
blocks = [ciphertext[i:i+16]
for i in range(0, len(ciphertext), 16)]
plaintext = b""
for block_idx in range(1, len(blocks)):
C_prev = bytearray(blocks[block_idx - 1])
C_curr = blocks[block_idx]
intermediate = bytearray(16)
plain_block = bytearray(16)
for byte_idx in range(15, -1, -1):
pad_val = 16 - byte_idx
modified = bytearray(C_prev)
# Avvalgi topilgan baytlarni to'g'rilash
for k in range(byte_idx + 1, 16):
modified[k] = intermediate[k] ^ pad_val
# Joriy baytni qidirish
for guess in range(256):
modified[byte_idx] = guess
if oracle(bytes(modified) + C_curr):
intermediate[byte_idx] = guess ^ pad_val
plain_block[byte_idx] = intermediate[byte_idx] ^ C_prev[byte_idx]
break
plaintext += bytes(plain_block)
return plaintext # PKCS7 padding olib tashlanadi
# Himoya: AES-GCM ishlatish (AEAD)
# Yoki: Encrypt-then-MAC sxemasi
3 Birthday Attack (Tug'ilgan kun paradoksi)
Matematik Asosi
n-bitli hash funksiyada koliziya topish uchun faqat 2^(n/2) ta urinish yetarli (brute force kabi 2^n emas). Bu hash uzunligini samarali "yarmiga" kamaytiradi.
Ehtimollik formulasi:
P(koliziya) ≈ 1 - e^(-k²/2n)
k = sinov soni, n = hash fazosi o'lchami
50% koliziya ehtimoli uchun:
k ≈ 1.177 × √n
Haqiqiy Hayotdagi Misol
MD5 koliziyasi (2004, Wang Xiaoyun)
Ikki xil matn bilan bir xil MD5 hash hosil qilindi. Raqamli sertifikatlarni soxtalashtirish imkoni yaratildi.
SHAttered (2017, Google)
Bir xil SHA-1 hashga ega 2 ta turli PDF yaratildi. 6500 CPU-yil hisoblash resursi sarflandi.
Flame zararli dasturi (2012)
MD5 koliziyasidan foydalanib, soxta Microsoft sertifikati bilan imzolangan. Windows Update orqali tarqaldi.
CTFda Birthday Attack
Kichik hash o'lchamli (16-32 bit) funksiyalar CTF'da koliziya topish orqali buzilishi mumkin.
import hashlib, random, string
# Kichik hash uchun birthday attack demo (CTF misol)
def small_hash(data: bytes, bits: int = 24) -> bytes:
# Faqat n-bit ishlatadigan zaif hash
h = hashlib.sha256(data).digest()
mask = (1 << bits) - 1
val = int.from_bytes(h[:4], 'big') & mask
return val.to_bytes(4, 'big')
def birthday_attack(bits: int = 24):
seen = {}
attempts = 0
while True:
msg = ''.join(random.choices(string.ascii_letters, k=8)).encode()
h = small_hash(msg, bits)
if h in seen and seen[h] != msg:
print(f"Koliziya! '{seen[h].decode()}' == '{msg.decode()}'")
print(f"Hash: {h.hex()}, Urinishlar: {attempts}")
return
seen[h] = msg
attempts += 1
# 24-bit hash uchun ~2^12 ≈ 4096 urinish kutiladi
birthday_attack(24)
# Himoya: Etarli uzunlikdagi hash (≥256-bit), SHA-256, SHA-3
4 Hash Length Extension Hujumi
SHA-1, SHA-256, MD5 da agar H(secret || message) ma'lum bo'lsa,
secret bilmagan holda H(secret || message || padding || extra) hisoblab bo'ladi.
Bu API autentifikatsiyasida keng tarqalgan zaiflik.
Hujum Qanday Ishlaydi?
Holat:
Server tekshiradi: mac == SHA256(secret + query)
URL: ?data=user&mac=abc123
Hujumchi (secret bilmaydi):
SHA-256 ichki holati uzluksiz — qayta ishga tushirish mumkin.
SHA256(secret + "user" + padding + "&admin=true")
— eski MAC va qo'shimcha ma'lumotdan hisoblanadi.
Zaif API misol:
mac = sha256(SECRET + data)
# Hujumchi: data + padding + "&admin=true"
# Yangi to'g'ri MAC hisoblanadi!
# hashpump yoki hlextend bilan
# pip install hashpumpy
import hashpumpy
original_data = b"user=alice&role=user"
original_mac = "known_hash_value"
secret_len = 16 # Taxminiy, brute force qilinadi
append_data = b"&role=admin"
new_mac, new_data = hashpumpy.hashpump(
original_mac,
original_data,
append_data,
secret_len
)
print(f"Yangi MAC: {new_mac}")
print(f"Yangi data: {new_data}")
# ============================================
# HIMOYA: HMAC ishlatish!
# ============================================
import hmac, hashlib
# To'g'ri: HMAC-SHA256
def safe_mac(secret, data):
return hmac.new(secret, data, hashlib.sha256).hexdigest()
# HMAC length extension hujumiga chidamli!
# HMAC(K, M) = H(K⊕opad || H(K⊕ipad || M))
# Ichki hash holati hujumchi uchun yopiq
5 Known/Chosen Plaintext Hujumlari
Known Plaintext Attack (KPA)
Hujumchi ba'zi plaintext–ciphertext juftlarini biladi va kalit yoki shifrni tiklashga harakat qiladi.
WW2 Enigma mashinasi
Nemis xabarlari "WETTER" (ob-havo) so'zi bilan boshlanganligi Alan Turing va Bletchley Park ga Enigma ni buzishda yordam berdi.
CTF: XOR Shifr
# Agar: C = P XOR K
# Va P bitta bayt ma'lum:
key_byte = cipher[i] ^ known_plain[i]
# Takrorlanuvchi kalit uchun:
for key_len in range(1, 40):
key = [c[i] ^ p[i]
for i in range(key_len)]
Chosen Plaintext Attack (CPA)
Hujumchi ixtiyoriy plaintextni shifrlata oladi. Bu kuchliroq model — ECB Oracle hujumi bunga misol.
ECB Byte-at-a-time Oracle
# Server: AES-ECB(your_input + secret)
# 1. Blok o'lchamini topish
for i in range(1, 64):
c = oracle('A' * i)
if len(c) > prev_len:
block_size = len(c) - prev_len
break
# 2. Har bir baytni topish
# oracle('A'*15) == oracle('A'*15 + secret[0])?
for byte in range(256):
if oracle(prefix + chr(byte)) == target:
secret_byte = byte; break
6 CTF Kripto Toolbox
Muhim Kutubxonalar (Python)
pycryptodome
pip install pycryptodome
AES, RSA, DES, hashing, PKCS padding — to'liq kripto kutubxona
pwntools
pip install pwntools
CTF uchun Swiss Army knife: netcat, number theory, encoding
from pwn import *
n = number.getPrime(512)
log.info(hex(n))
gmpy2
pip install gmpy2
Katta sonlar arifmetikasi: iroot, is_prime, powmod
import gmpy2
root, exact = gmpy2.iroot(C, 3) # cube root
sympy
pip install sympy
CRT, factorint, mod inverse, nthroot
from sympy import factorint, mod_inverse
from sympy.ntheory.modular import crt
Online Vositalar
CyberChef
gchq.github.io/CyberChef
400+ operatsiya: Base64, AES, XOR, ROT, Vigenere, hash, GZIP...
dcode.fr
dcode.fr/cipher-identifier
Shifr turid avtomatik aniqlash, 200+ klassik shifr yechish
factordb.com
RSA n ni faktorlashtirish ma'lumotlar bazasi
Millionlab faktorlashtirilgan sonlar — CTFda tez tekshirish
RsaCtfTool
github.com/RsaCtfTool/RsaCtfTool
Avtomatik RSA hujumlar: Wiener, Fermat, small e, ROCA...
crackstation.net
15 milliard hashdan parol topish
# ============================================
# CTF Kripto: Universal Starter Template
# ============================================
from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
from Crypto.Util.number import long_to_bytes, bytes_to_long
from Crypto.Util.Padding import unpad
import gmpy2, hashlib, base64
from sympy import factorint, mod_inverse
# RSA kalitdan n, e, d, p, q olish
def rsa_from_pem(pem_str):
key = RSA.import_key(pem_str)
return key.n, key.e, key.d, key.p, key.q
# RSA: n ni faktorlashtirish (kichik n uchun)
def factor_n(n):
factors = factorint(n)
if len(factors) == 2:
p, q = list(factors.keys())
return p, q
raise ValueError("n ikki omilga ajralmadi")
# RSA: d ni tiklash
def recover_d(e, p, q):
phi = (p - 1) * (q - 1)
return int(mod_inverse(e, phi))
# RSA: deshifrlash
def rsa_decrypt(c, d, n):
return long_to_bytes(pow(c, d, n))
# AES-ECB deshifrlash
def aes_ecb_decrypt(ct_hex, key_hex):
ct = bytes.fromhex(ct_hex)
key = bytes.fromhex(key_hex)
cipher = AES.new(key, AES.MODE_ECB)
pt = cipher.decrypt(ct)
try:
return unpad(pt, 16).decode()
except:
return pt
# XOR brute force
def xor_brute(ciphertext: bytes):
for key in range(256):
pt = bytes(b ^ key for b in ciphertext)
if b"CTF{" in pt or b"flag{" in pt:
print(f"Key={key}: {pt}")
# Multi-byte XOR crack (chastota tahlili bilan)
def xor_multi_crack(ct: bytes, key_len: int):
key = []
for i in range(key_len):
block = bytes(ct[j] for j in range(i, len(ct), key_len))
# E harfi (0x65) eng ko'p → XOR key byte
freq = sorted(range(256), key=lambda k: block.count(k), reverse=True)
key.append(freq[0] ^ 0x65)
return bytes(key)
7 CTF Kripto Masalasi Checklist
Aniqlash
- □Encoding? (Base64, Hex, ASCII)
- □Klassik shifr? (dcode.fr)
- □Hash? (uzunlikni tekshirish)
- □RSA parametrlari? (n, e, c)
- □AES kalit va IV?
- □XOR? (bir xil uzunlik?)
Tez Tekshirish
- □CyberChef — Magic recipe
- □factordb.com — RSA n
- □crackstation.net — hash
- □ROT1-25 brute force
- □Atbash dekodlash
- □Base64/32/16 decode
Chuqur Tahlil
- □RsaCtfTool — RSA hujumlar
- □IC hisoblash (Vigenere?)
- □ECB naqsh tekshirish
- □Padding oracle sinovi
- □CTR nonce reuse
- □Length extension (HMAC?)
Bilimni Sinash
1. Padding Oracle hujumidan himoya uchun qaysi usul eng samarali?
2. 128-bitli hash funksiyada Birthday Attack nechi urinishda 50% koliziya ehtimolini beradi?
3. Length Extension hujumidan himoya uchun qaysi konstruksiya ishlatiladi?
Kriptografiya Bo'limi Tugadi!
Siz modulli arifmetika, klassik shifrlar, AES, RSA, Diffie-Hellman, hashlash, xabar autentifikatsiyasi, raqamli imzolar, PKI/TLS va kripto hujumlarni o'rgandingiz. Endi CTF musobaqalarida kripto masalalarini yechishga tayyorsiz!