# Forensics ## VBS - Đây là một file zip chứa password, cách làm đơn giản nhất khi không có gợi ý về password là sử dụng 'fcrackzip' để brute force `fcrackzip code.zip` - Sau đó ta sẽ được file code.vbs và mở lên phân tích nhận url: https://pastebin.pl/view/a60d3da5 chứa flag: > Base64: S0NTQ3tWYjRfaDAxX2xvciIiX2FlX3RoMG5nX2M0bV89KCgofQ== > -> KCSC{Vb4_h01_lor""_ae_th0ng_c4m_=(((} # Crypto ## Ez_Ceasar Đề bài: ``` import string import random alphabet = string.ascii_letters + string.digits + "!{_}?" flag = 'ldtdMdEQ8F7NC8Nd1F88CSF1NF3TNdBB1O' assert all(i in alphabet for i in flag) key = random.randint(0, 2**256) ct = "" for j in range (26): for i in flag: ct += (alphabet[(alphabet.index(i) + j) % len(alphabet)]) print(f"{ct=}") ct ='' # ct='ldtdMdEQ8F7NC8Nd1F88CSF1NF3TNdBB1O' ``` Có thể nhìn ra được đây là một phép dịch vòng cơ bản, ta chỉ cần dịch một khoảng cách `space = (alphabet.index(flag[0])-alphabet.index('K'))%len(alphabet)` là từ flag đã enc đến "K" (format flag). Solve: ``` import string import random alphabet = string.ascii_letters + string.digits + "!{_}?" flag = 'ldtdMdEQ8F7NC8Nd1F88CSF1NF3TNdBB1O' assert all(i in alphabet for i in flag) key = random.randint(0, 2**256) ct = "" space = (alphabet.index('K')-alphabet.index(flag[0]))%len(alphabet) print(space) for i in range(len(flag)): ct += alphabet[(alphabet.index(flag[i]) + space) % len(alphabet)] print(ct) # -> KCSC{C3as4r_1s_Cl4ss1c4l_4nd_C00l} ``` ## Ceasar_but_Harder!!!! Đề: ``` import string import random flag = "KCSC{s0m3_r3ad4ble_5tr1ng_like_7his}" alphabet = string.ascii_letters + string.digits + "!{_}?" assert all(i in alphabet for i in flag) for i in range(3): k = random.randint(0, len(alphabet)) alphabet = alphabet[:k] + alphabet[k+1:] key = random.randint(0, 2**512) ct = "" for i in flag: ct += (alphabet[(alphabet.index(i) + key) % len(alphabet)]) print(f"{ct=}") # ct='2V9VnRcNosvgMo4RoVfThg8osNjo0G}mmqmp' ``` Bài này cũng là dạng dịch vòng như để ý thì có 3 ký tự random đã bị xóa khỏi alphabet vậy nên ta sẽ phải tạo ra 'Case' trường hợp của alphabet mới. ``` a = len(alphabet) Case = a*(a-1)*(a-2) #trường hợp ``` Ta sẽ phải thử tất cả trường hợp của bảng alphabet bị khuyết Với mỗi trường hợp ta dịch với khoảng cách sẽ là khoảng cách `space = (alphabet3.index(flag[0])-alphabet3.index('K'))%len(alphabet3)` là khoảng cách từ ký từ đầu của flag đã enc với "K" (format flag) , với mỗi khả năng ta sẽ check xem từng ký tự trong flag có mặt trong alphabet không và 5 ký tự đầu khi đã dịch có phải là "KCSC{" không Solve: ``` import string import random flag = "2V9VnRcNosvgMo4RoVfThg8osNjo0G}mmqmp" #Hàm kiểm tra xem ký tự có mặt trong alphabet không và trả về vị trí nếu có và -1 nếu không def check(alphabet,char_search): for char in alphabet: if char == char_search: return alphabet.index(char_search) return -1 alphabet_root = string.ascii_letters + string.digits + "!{_}?" assert all(i in alphabet_root for i in flag) alphabet = alphabet_root m=0 for i in range(0,len(alphabet)-2): alphabet1 = alphabet[:i] + alphabet[i+1:] for j in range(i+1,len(alphabet1)-1): alphabet2 = alphabet1[:j] + alphabet1[j+1:] for k in range(j+1,len(alphabet2)): alphabet3 = alphabet2[:k] + alphabet2[k+1:] position=[0]*50 position[0]=(check(alphabet3,flag[0])) if position[0] == -1 or check(alphabet3,'K')==-1: continue ct="" #đơn vị dịch vòng space = (alphabet3.index(flag[0])-alphabet3.index('K'))%len(alphabet3) ct+=(alphabet3[(alphabet3.index(flag[0])-space)%len(alphabet3)]) for index in range (1,len(flag)): position[index] = check(alphabet3,flag[index]) if position[index] == -1: break ct+=(alphabet3[(alphabet3.index(flag[index])-space)%len(alphabet3)]) if position[-1] == -1: continue if ct[:5]=="KCSC{" and ct[-1]=="}": print(ct) ``` Khi chạy xong ta được khá nhiều kết quả nhưng ta cũng có thể nhìn và đoán ra đâu là flag đúng: > KCSC{y0u_be4t_My_C3A54R_bu7_HoW!!?!} ## A3S_C1R > AES Encryption (CTR Block Mode) > Đề bài: ``` from Crypto.Cipher import AES from Crypto.Util import Counter from Crypto import Random flag = b'KCSC{s0m3_r3ad4ble_5tr1ng_like_7his}' nonce = Random.get_random_bytes(8) countf = Counter.new(64, nonce) key = Random.get_random_bytes(32) encrypto = AES.new(key, AES.MODE_CTR, counter=countf) encrypted = encrypto.encrypt(b"TODO:\n - ADD HARDER CHALLENGE IN CRYPTO\n - ADD FLAG TO THE CHALLENGE\n") encrypto = AES.new(key, AES.MODE_CTR, counter=countf) encrypted2 = encrypto.encrypt(flag) print(f"encrypted: {encrypted.hex()}") print(f"encrypted2: {encrypted2.hex()}") # encrypted: 5e07dfa19e2b256c205df16b349c0863a15839d056ada1fb425449f2f9af9563eccca6d15cb01aabbe338c851f7b163982127033787fff49e74e3e09f0aee048a1d5b29f5a # encrypted2: 410bc8addf6036125f5fe17d4bb61c00ba565a9e71d1bf846f625eeac5bfa972f9e7c4fd60800ac9aa689f9b280f5a09fd3768674401ac60 ``` Solve: ``` import binascii encrypted= b'5e07dfa19e2b256c205df16b349c0863a15839d056ada1fb425449f2f9af9563eccca6d15cb01aabbe338c851f7b163982127033787fff49e74e3e09f0aee048a1d5b29f5a' encrypted2= b'410bc8addf6036125f5fe17d4bb61c00ba565a9e71d1bf846f625eeac5bfa972f9e7c4fd60800ac9aa689f9b280f5a09fd3768674401ac60' encrypted_test = binascii.unhexlify(encrypted) encrypted_flag = binascii.unhexlify(encrypted2) # XOR operation on bytes blob = bytes([a ^ b for a, b in zip(encrypted_test, encrypted_flag)]) test = b"TODO:\n - ADD HARDER CHALLENGE IN CRYPTO\n - ADD FLAG TO THE CHALLENGE\n" # XOR operation on bytes flag = bytes([a ^ b for a, b in zip(blob, test[: len(encrypted_flag)])])[: len(encrypted_flag)] print(f"{flag=}") # encrypted: 5e07dfa19e2b256c205df16b349c0863a15839d056ada1fb425449f2f9af9563eccca6d15cb01aabbe338c851f7b163982127033787fff49e74e3e09f0aee048a1d5b29f5a # encrypted2: 410bc8addf6036125f5fe17d4bb61c00ba565a9e71d1bf846f625eeac5bfa972f9e7c4fd60800ac9aa689f9b280f5a09fd3768674401ac60 ``` Có đầy đủ thông tin và chỉ cần áp dụng theo thuật toán AES Encryption (CTR Block Mode) là xong # Reverse ## Real Warmup Cho file vào ida phân tích ![image](https://hackmd.io/_uploads/B1Asg3h8p.png) Được flag dạng Base64: > S0NTQ3tDaDQwYF9NfF98bjlgX0QzTidfVjAxJ183N1wvX0tDU0N9 -> flag: `KCSC{Ch40`_M|_|n9`_D3N'_V01'_77\/_KCSC}` # Web ## Pokemon Hof Panel Level Trông qua bài này ta nhận ra ta phải truy cập với quyền của 'Champion' thì mới có thể nhận được dữ liệu Ta truy cập cookie ![image](https://hackmd.io/_uploads/SJprQ33Lp.png) Base64 được một đoạn PHP với thông tin "name" "starter" "Charmander" "isChampion" ![image](https://hackmd.io/_uploads/Sy2SEnnI6.png) ![image](https://hackmd.io/_uploads/HJT8E2286.png) Muốn là champion chỉ cần đổi giá trị "0" -> "1" Sau đó gửi Cookie đã base64 này đến server thông qua burp suite và ta được kết quả ![image](https://hackmd.io/_uploads/HJm9EnhLp.png) ![image](https://hackmd.io/_uploads/r1sdR2hUa.png) ->`KCSC{n0w_y0u_kn0w_s3r1al1z3_f0m4rt}`