Đề bài

Mình nhận được thông điệp để lại như sau: "ChristmasKid-2025"
Part 1
Với nội dung được để lại như này, mình sẽ đoán đây là nickname của account nào đó, nên mình sử dụng BlackBird để tìm kiếm

Thấy có một accout YouTube có id là @ChristmasKid-2025
Truy cập vào thử

Vào phần Playlist sẽ thấy có 2 video

Nhưng 1 video đã bị ẩn

Sau đó mình thử kiểm tra xem trên Web Archive có lưu thông tin của playlist này không

Nhận thấy trong phần Description của video có flag phần 1
Part 1: KCSC{cHuC_C4c_b4n
Backup video: aHR0cHM6Ly9jeWJlcnNoYXJpbmcubmV0L3MvZDIyZmRiZWNhOTQwYzk0ZA==
Phần 1: KCSC{cHuC_C4c_b4n
Part 2
Từ mã base64 nhận được trong Part 1, mình giải mã ra được một trang web

Mình lưu video về để tìm kiếm, mình nhận thấy đây là video quay ở KMA, nên mình sẽ lên Google Map để xem thử

Xem phần Reviews

Thấy flag phần 2: _614n6_51nh_Vu1
Part 3
Tiếp tục từ Part 2, mình sẽ tìm xem user "Kchristmas8386" còn xuất hiện ở nền tảng nào không

Thấy có một account GitHub, vào check xem sao

Thấy có một repo study, xem thử repo đấy

Đây là một repo bình thường, nhưng lại có 4 commits, mình sẽ check lịch sử commit

Thấy có sửa đổi ở file encrypt.py và encrypted.txt, file encrypt.py chứa flag phần 3: _v3_l3u_l3U_m4y_b4n
Part 4
Từ Part 3, mình sẽ tạo 1 script để decrypt file encrypted.txt
import binascii
def xor_bytes(data: bytes, key: bytes) -> bytes:
return bytes(b ^ key[i % len(key)] for i, b in enumerate(data))
KEY = b"Part 3: _v3_l3u_l3U_m4y_b4n"
with open("encrypted.txt", "r", encoding="utf-8") as f:
hex_str = f.read().strip()
cipher = bytes.fromhex(hex_str)
plain = xor_bytes(cipher, KEY)
out_name = "decrypted.bin"
if plain.startswith(b"PK\x03\x04"):
out_name = "decrypted.zip"
elif plain.startswith(b"\x89PNG\r\n\x1a\n"):
out_name = "decrypted.png"
elif plain.startswith(b"ID3") or plain[:2] == b"\xff\xfb":
out_name = "decrypted.mp3"
elif plain.startswith(b"%PDF"):
out_name = "decrypted.pdf"
with open(out_name, "wb") as f:
f.write(plain)
print("[+] Wrote:", out_name)
print("[+] First 16 bytes:", plain[:16])
Vậy là mình đã có file decrypt.zip, giải nén ra mình thu được file txt có nội dung như sau
Tôi có thói quen sử dụng tên <name>@gmail.com cho tài khoản MXH!!!!!!!!!!!!!
Sau đó mình quay lại GitHub và kiểm tra patch của commit và thấy email của người dùng
From: KChristmas8386 <lotusspeed2025@gmail.com>
Từ hint ở trên, mình xác nhận được nickname sẽ là: lotusspeed2025
Sau đó mình sẽ sử dụng BlackBird để tra cứu tiếp

Thấy có một account TikTok có id là @lotusspeed2025

Part 4: _kh0n6_c0_ny
Part 5
Mình sẽ xem video của người dùng này

Mình sẽ sử dụng Google Lens để tìm kiếm vị trí

Ra được VTC Building ở Tân Bình
Mình sẽ vào Google Map để tìm kiếm vị trí

Mình sẽ thả thử người xuống để xem

Sau đó mình sẽ quay lại để xác định điểm chụp

Mình sẽ thấy trường KMA trong Nam
Mình tiếp tục vào xem Reviews

Trong phần Reviews sẽ lại thấy một thông điệp như sau
Love the KMA Cyber Security Club
Myxqbkd! drsc gsvv lo dro vkcd zkbd yp dro pvkq: XL2RS4NDRSHC6JNCXP3QUVDRX5HGY3NPPJBG63TZWBJQC5DPP5DQ63NOWFJRQVJBX5PFE3DAXPNOIGMMTLQG64V2ZLMPUXUWRLWGA6VWYBGOYD2WYJND65VDYK6GS4DTYJCF63NTXJFA====
Mình sẽ giải mã thông điệp này

Ra được một đường dẫn là Google Drive chứa 2 file ảnh

Sau đó mình tải về và xem thử 2 file ảnh này


Cả 2 file đều bị hỏng, mình đoán là phải XOR 2 file này vào với nhau
from PIL import Image
import numpy as np
def solve_visual_crypto(image_path_1, image_path_2, output_path):
try:
# 1. Mở hai ảnh
img1 = Image.open(image_path_1).convert('RGB')
img2 = Image.open(image_path_2).convert('RGB')
# 2. Kiểm tra kích thước (chúng phải bằng nhau)
if img1.size != img2.size:
print(f"Cảnh báo: Kích thước không khớp! {img1.size} vs {img2.size}")
# Resize img2 theo img1 nếu cần thiết (tùy bài toán)
img2 = img2.resize(img1.size)
# 3. Chuyển đổi sang mảng Numpy để tính toán nhanh
arr1 = np.array(img1)
arr2 = np.array(img2)
# 4. Thực hiện phép XOR (Bitwise XOR)
# Tại mỗi pixel: Pixel_Mới = Pixel_1 ^ Pixel_2
result_arr = np.bitwise_xor(arr1, arr2)
# 5. Chuyển lại thành ảnh và lưu
result_img = Image.fromarray(result_arr)
result_img.save(output_path)
print(f"Đã xử lý xong! Kết quả lưu tại: {output_path}")
# Hiển thị ảnh (nếu chạy trên Jupyter/Local)
result_img.show()
except Exception as e:
print(f"Có lỗi xảy ra: {e}")
# Chạy hàm với tên file của bạn
if __name__ == "__main__":
solve_visual_crypto('decrypted_2/FB.png', 'decrypted_2/B.png', 'flag_result.png')
Sau đó ra được ảnh sau

Phần 5 sẽ là: d1_ch01_n031_:3}
Flag
Flag: KCSC{cHuC_C4c_b4n_614n6_51nh_Vu1_v3_l3u_l3U_m4y_b4n_kh0n6_c0_nyd1_ch01_n031_:3}
'WriteUp > OSINT' 카테고리의 다른 글
| Snowflake (0) | 2025.11.01 |
|---|---|
| Dusk Till Duck (0) | 2025.11.01 |
| The Forgotten Inventory (0) | 2025.11.01 |
| Duck Company (0) | 2025.10.31 |
| Among USniversity (0) | 2025.10.31 |
