# 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

Đượ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

Base64 được một đoạn PHP với thông tin "name" "starter" "Charmander" "isChampion"


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ả


->`KCSC{n0w_y0u_kn0w_s3r1al1z3_f0m4rt}`