---
# System prepended metadata

title: Forensics

---

# 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}`