The Last Dance — HackTheBox Challenge Writeup

Halo semuanya, pada kali ini gw akan membahas salah satu challenge crypto di hackthebox, yaitu the last dance.

Disini setelah kita mendownload challengenya, kita diberikan 2 buah file

/crypto_the_last_dance/ ls
out.txt source.py

dan di challenge ini clue yang kita dapatkan adalah “chacha” chiper

ketika kita lihat di dalam file out.txt, ini yang kita dapatkan

/crypto_the_last_dance/ cat out.txt
c4a66edfe80227b4fa24d431
7aa34395a258f5893e3db1822139b8c1f04cfab9d757b9b9cca57e1df33d093f07c7f06e06bb6293676f9060a838ea138b6bc9f20b08afeb73120506e2ce7b9b9dcd9e4a421584cfaba2481132dfbdf4216e98e3facec9ba199ca3a97641e9ca9782868d0222a1d7c0d3119b867edaf2e72e2a6f7d344df39a14edc39cb6f960944ddac2aaef324827c36cba67dcb76b22119b43881a3f1262752990
7d8273ceb459e4d4386df4e32e1aecc1aa7aaafda50cb982f6c62623cf6b29693d86b15457aa76ac7e2eef6cf814ae3a8d39c7#

dan source.py

/crypto_the_last_dance/ cat source.py
from Crypto.Cipher import ChaCha20
from secret import FLAG
import os


def encryptMessage(message, key, nonce):
cipher = ChaCha20.new(key=key, nonce=iv)
ciphertext = cipher.encrypt(message)
return ciphertext


def writeData(data):
with open("out.txt", "w") as f:
f.write(data)


if __name__ == "__main__":
message = b"Our counter agencies have intercepted your messages and a lot "
message += b"of your agent's identities have been exposed. In a matter of "
message += b"days all of them will be captured"

key, iv = os.urandom(32), os.urandom(12)

encrypted_message = encryptMessage(message, key, iv)
encrypted_flag = encryptMessage(FLAG, key, iv)

data = iv.hex() + "\n" + encrypted_message.hex() + "\n" + encrypted_flag.hex()
writeData(data)

setelah melihat file source.py kita bisa tau dibagian

def encryptMessage(message, key, nonce):
cipher = ChaCha20.new(key=key, nonce=iv)
ciphertext = cipher.encrypt(message)
return ciphertext

bahwa flag di encrypt dengan chacha20 dengan kuncinya “nonce” dibuat secara acak, yang sebenarnya metode ini sangat dihindari karena aspek keamanannya. Dan juga source.py memanggil file out.txt

def writeData(data):
with open("out.txt", "w") as f:
f.write(data)

dan ketika dilihat format dari out.txt adalah

baris 1= nonce (IV)
baris 2= ciphertext_message
baris 3= ciphertext_flag
  1. Karena encrypted_message dan encrypted_flag dienkripsi dengan nonce yang sama, kita bisa mengeksploitasi properti XOR untuk mendapatkan plaintext dari FLAG.
  2. Dengan mengetahui message, kita bisa mendapatkan keystream dan kemudian menggunakannya untuk mendekripsi FLAG.

Karena sudah mengetahuinya, disini kita akan langsung lakukan dekripsi dengan cara

  • Ubah hex dari out.txt ke bytes agar bisa digunakan untuk xor
  • Hitung Keystream dengan ciphertext_message dan message yang diketahui.
  • Gunakan Keystream untuk Mendekripsi FLAG

Berikut adalah script python yang bisa digunakan

import binascii

nonce_hex = "c4a66edfe80227b4fa24d431"
ciphertext_message_hex = "7aa34395a258f5893e3db1822139b8c1f04cfab9d757b9b9cca57e1df33d093f07c7f06e06bb6293676f9060a838ea138b6bc9f20b08afeb73120506e2ce7b9b9dcd9e4a421584cfaba2481132dfbdf4216e98e3facec9ba199ca3a97641e9ca9782868d0222a1d7c0d3119b867edaf2e72e2a6f7d344df39a14edc39cb6f960944ddac2aaef324827c36cba67dcb76b22119b43881a3f1262752990"
ciphertext_flag_hex = "7d8273ceb459e4d4386df4e32e1aecc1aa7aaafda50cb982f6c62623cf6b29693d86b15457aa76ac7e2eef6cf814ae3a8d39c7"

ciphertext_message = binascii.unhexlify(ciphertext_message_hex)
ciphertext_flag = binascii.unhexlify(ciphertext_flag_hex)
plaintext_message = b"Our counter agencies have intercepted your messages and a lot " \
b"of your agent's identities have been exposed. In a matter of " \
b"days all of them will be captured"

keystream = bytes([c ^ p for c, p in zip(ciphertext_message, plaintext_message)])

decrypted_flag = bytes([c ^ k for c, k in zip(ciphertext_flag, keystream)])
print("FLAG Disini:", decrypted_flag.decode(errors="ignore"))

kita dapatkan flagnya

/crypto_the_last_dance/ python3 flag.py
FLAG Disini: HTB{und3r57AnD1n9_57R3aM_<flag>

Leave a Reply

Your email address will not be published. Required fields are marked *