[CryptoHack] Parameter injection

MITM(Man-In-The-Middle) Attack을 내가 실제 Eve가 되어서 수행해보는 것이다.

강사님 ppt에서 가져온 그림

문제에 나온 곳에 접속해보면 Alice로부터 p, g, A를 얻어온다.

💡 {'p': '0xffffffffffffffffc90fdaa22168c234c4c6628b80dc1cd129024e088a67cc74020bbea63b139b22514a08798e3404ddef9519b3cd3a431b302b0a6df25f14374fe1356d6d51c245e485b576625e7ec6f44c42e9a637ed6b0bff5cb6f406b7edee386bfb5a899fa5ae9f24117c4b1fe649286651ece45b3dc2007cb8a163bf0598da48361c55d39a69163fa8fd24cf5f83655d23dca3ad961c62f356208552bb9ed529077096966d670c354e4abc9804f1746c08ca237327ffffffffffffffff', 'g': '0x02', 'A': '0x83e907190b6484aa982847f873111a28a3f1a0617a0973b24f8ed036d01d01009f050fa636cfe030cdd26f1309465cdea4ebc97d421fa5ebeedda63d948c8b00e81c8e8e63e720ad74bf867139ac2112883928d0441290f9f40e67a44e4447b7f8841f6f573b8b6a85d679bb611d7f026a4c2c904dd4a97a2d0048531f43b78e7c539d9e59149229ed32630506d11f13b42609bb4b8c4644e0f3ede537022ac7de96288c1794746f3f57b25a2668363a4314879c3834a9961ba3800f7de4798d'}

그 다음 Bob에게 E=g^e mod p를 보내주고 B를 얻어온다. 마지막으로 Alice에게 다시 E를 보내면 Alice와 Eve의 shared_secret인 g^ae mod p를 바탕으로 한 encrypted_flag와 iv를 얻을 수 있다.

 

그러므로 g^ae mod p를 계산해서 이전 문제에서 사용했던 decrypt 코드를 이용해 flag를 알아낼 수 있다.

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import hashlib
import pwn
import json


def is_pkcs7_padded(message):
    padding = message[-message[-1]:]
    return all(padding[i] == len(padding) for i in range(0, len(padding)))


def decrypt_flag(shared_secret: int, iv: str, ciphertext: str):
    # Derive AES key from shared secret
    sha1 = hashlib.sha1()
    sha1.update(str(shared_secret).encode('ascii'))
    key = sha1.digest()[:16]
    # Decrypt flag
    ciphertext = bytes.fromhex(ciphertext)
    iv = bytes.fromhex(iv)
    cipher = AES.new(key, AES.MODE_CBC, iv)
    plaintext = cipher.decrypt(ciphertext)

    if is_pkcs7_padded(plaintext):
        return unpad(plaintext, 16).decode('ascii')
    else:
        return plaintext.decode('ascii')


c = pwn.connect('socket.cryptohack.org', 13371)
e=197395083814907028991785772714920885908249341925650951555219049411298436217190605190824934787336279228785809783531814507661385111220639329358048196339626065676869119737979175531770768861808581110311903548567424039264485661330995221907803300824165469977099494284722831845653985392791480264712091293580274947132480402319812110462641143884577706335859190668240694680261160210609506891842793868297672619625924001403035676872189455767944077542198064499486164431451944

Alice=json.loads(c.readline().strip().decode()[24:])
#print(Alice)
A=int(Alice["A"][2:],16)
p=int(Alice["p"][2:],16)

E=pow(2,e,p)
E_Alice=pow(A,e,p)

Eve_to_Bob=Alice
Eve_to_Bob["A"]=hex(E)

c.sendline(json.dumps(Eve_to_Bob))

Bob=json.loads(c.readline().strip().decode()[35:])
#print(Bob)
B=int(Bob["B"][2:],16)

Eve_to_Alice=Bob
Eve_to_Alice["B"]=hex(E)

c.sendline(json.dumps(Eve_to_Alice))

key=json.loads(c.readline().strip().decode()[39:])
print(key)

shared_secret = pow(A,e,p)
iv = key["iv"]
ciphertext = key["encrypted_flag"]

print(decrypt_flag(shared_secret, iv, ciphertext))

 

코드는 다음과 같다. Eve로서 사용한 e는 이전 문제에서 사용된 수를 가져왔다.

실행 결과는 위와 같다. 성공적으로 flag를 얻어냈다!

🚩 crypto{n1c3_0n3_m4ll0ry!!!!!!!!}

 

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤