---
# System prepended metadata

title: 'KMACTF 2023_2 '
tags: ['@write_up']

---

# Challenges 

| Category  | Challenge Name    | Difficulty |
| --------- | ----------------- | ---------- |
|           |                   |            |
| Forensics | Time chaos        | Hard       |
| Forensics | Sit               | Hard       |

## Time chaos

### Des : 

![](https://hackmd.io/_uploads/Sygo4rkl6.png)

```
Time chaos của KMACTF lần 1 đã quay trở lại. Không còn dễ như lần trước nữa đâu mặc dù lần này có thêm source

Flag format: KMACTF{}
```

### Sol : 

+ Phân tích file 1 lúc thì mình tìm được source của nó.
+ Đọc source của nó ở `/home/debian` 
+ Ở đây mình chú ý đến 2 file chính : 
+ 1. `.bash_history`
+ 2. `pcapgen.py`

+ Trong `.bash_history` có nói đến quy trình cụ thể mà author đã tạo ra file chaos.pcap




![](https://hackmd.io/_uploads/ry6kLHklT.png)

+ Ở đây mình thấy author sử dụng lệnh `ls` và thư mục chứa 1 file tên là `remina` 
+ Mình tìm được nó ở trong thư mục `bin` 
+ Nó là 1 file binary => mở bằng ida để phân tích

+ Sau khi decompile hàm main của nó thì mình nhận được những thông tin sau : 

+ 1. `gethostname(name, 0x100uLL);` nó lấy host name của máy để gắn vào biến name
+ 2. Dữ liệu trong bộ nhớ được xử lý thông qua hai vòng lặp for. Trong vòng lặp đầu tiên, mỗi byte của dữ liệu được XOR với một ký tự trong chuỗi `name`. Trong vòng lặp thứ hai, mỗi byte của dữ liệu được XOR với một số ngẫu nhiên `v5 % 256`
+ 3. Cuối cùng là ghi toàn bộ vào file `fl.kma`

![](https://hackmd.io/_uploads/r1sn8H1e6.png)

![](https://hackmd.io/_uploads/SkbaLBklT.png)


+ Đối với file `pcapgen.py` : 

+ Ở đây nó sử dụng thư viện scapy đọc dữ liệu từ một tệp có tên `fl.kma`, đóng gói nó vào các gói ICMP theo thứ tự ngẫu nhiên, sau đó ghi các gói đã sửa đổi vào hai tệp pcap khác nhau. Nó cũng ngủ trong một khoảng thời gian ngắn giữa các gói ghi.

+ Oke dựa vào tất cả những gì đã thu thập được thì bây giờ việc cần làm của mình là lấy được file `fl.kma` sau đó xor nó với `hostname` và 1 bytes ngẫu nhiên nào đó, thì ở đây ban đầu file đầu tiên để xor và tạo ra `fl.kma` là `fl.png` => chúng ta cần lấy lại file đó nên bytes ngầu nhiên ở đây sẽ là bytes đầu tiên của file PNG là `0x89`
+ Thì cũng tương tự như cách làm ở bài time chaos giải `KMACTF lần 1`, dựa vào thời  gian đến gói tin của từng gói packet để sắp xếp lại dữ liệu và in ra file `fl.kma`  


+ Lấy dữ liệu data và time theo trường dữ liệu là `data.data` && `frame.time`

`tshark -nr chaos.pcap -T fields -e frame.time -e data.data > test.txt` => xóa `Date và Time(giờ và phút)` để dễ làm hơn.

+ file [test.txt](https://github.com/KMANVK/KMA_CTF_2_2023/blob/main/test.txt) 

=> Viết script để sắp xếp lại data dựa theo thời gian tương ứng để lấy file fl.kma. 

```
with open('test.txt', 'r') as file:
    lines = file.readlines()
    values = [(float(line.split()[0]), line.split()[1]) for line in lines]

sorted_values = sorted(values, key=lambda x: x[0])

for value in sorted_values:
    print(f"{value[1]}")

```

+ Ném lên cyberchef decode hex và mình có được file `fl.kma` 

+ Ở đây có 2 cách : 1 là code giải mã nó, 2 là dùng cyberchef nhưng về cách vận hành thì chúng cũng tương tự như nhau là xor với hostname  là debian, sau đó xor tiếp với 1 bytes ngẫu nhiên nhưng ở đây chúng ta muốn lấy lại  file `fl.png` nên mình sẽ xor với bytes đầu tiên của nó là `0x89`. 

+ C1 : `Script`

```
from pwn import xor

fr = open('fl.kma', 'rb').read()

for i in range(256):
    tmp = xor(fr,i)
    res = xor(tmp, 'debian')
    if b'PNG' in res:
        fw = open('fl.png', 'wb').write(res)
        break 
print('End !!')
```

![](https://hackmd.io/_uploads/BkQWD5ge6.png)



+ C2 : Dùng [Cyberchef](https://gchq.github.io/CyberChef/#recipe=From_Hex('Auto')XOR(%7B'option':'UTF8','string':'debian'%7D,'Standard',false)XOR(%7B'option':'Hex','string':'89'%7D,'Standard',false)Parse_QR_Code(false)&input=NjQKYmMKYTUKYTcKZTUKZWQKZjcKZTYKZWIKZTAKZTgKZWEKYTQKYTQKYWYKYjIKZTgKZTcKZWQKOTgKZWIKZTAKZTgKOTMKZTUKZWMKZWIKZTAKZTgKOTYKMWMKYTUKMTAKZTAKZTgKZTYKOWUKYTUKYWYKYTEKYmMKOWYKMzcKMDEKMzEKMjEKOWEKMjQKY2QKZTAKZWYKYjAKMTcKMTgKYTIKZDcKZDIKM2EKNjYKYjEKNTYKMmUKZTMKOTIKYjAKYjgKM2YKOTgKZGIKNmYKMjYKNGYKY2QKZmMKMmMKNzEKZDQKMDAKMWEKNTUKMTUKMWMKOTQKNDUKOWIKM2QKMWMKMzIKOGIKOTMKZTcKNjYKZDEKNWMKOTYKYzUKZTkKZTEKNjcKZWQKM2MKOGYKZDIKZjYKZWUKYTIKM2MKZTYKNjcKNmIKMGMKOWIKZGMKMjcKNjEKODIKYTgKZjEKNDYKZTMKN2EKM2QKMTQKYTQKYjkKZDcKNzAKMDgKZGEKNWEKZjcKYTIKYzIKNGQKZTIKYzEKZjIKNzMKZGYKZGMKNDgKOGIKYjgKNzEKNzUKNjEKOTUKNWUKMjIKZTEKNjAKZTIKNDgKMmEKZDcKZGUKMDcKZTQKNWUKNDEKOTUKZmQKODAKYTkKNTgKMDQKZDEKYWMKNTUKNWYKMmUKZmUKYzUKZjcKMDQKMDIKMjcKMDgKOWMKZDMKMzYKMTAKOGYKMGQKNmUKOTAKMzIKYWEKMzAKYjAKN2UKYmYKNWMKNGMKMjMKOWUKNjcKNjUKMjYKMDQKZjEKOTQKMGMKODcKNmUKYTIKZWIKODgKODkKZDAKMzcKNjYKNTkKNmQKYzYKYTUKMzUKMmQKZWMKMGQKMjcKOGYKZjYKNzYKZWUKNmYKOWEKYWYKYjQKYTUKMjUKODgKOGUKODcKOTkKZTYKYjEKNzkKY2MKMzMKYTgKY2MKYjAKZjQKNjQKMTEKNGUKYzAKYWIKY2EKYWQKZTIKZmIKYjQKNWMKYTUKMzQKMGYKZmYKYjgKOTIKNjkKZTUKZWIKZjgKNmEKODUKMWQKZjEKYmEKNmYKOGEKMmEKMjEKNjIKOTAKODEKM2UKMTMKZjkKNTAKMzYKYmIKYjgKYTIKNTYKYzIKMWMKYjQKNDkKNDMKOGIKNWMKZjAKYjgKZGEKMjgKNGMKYjAKMjcKZmIKMTIKMzkKMjkKNjIKMzYKYzQKNDQKOTEKYTkKYWUKY2EKMDEKNWUKZDQKMzAKODAKZDgKNDcKYzAKMjEKMGMKYzgKZTQKZTgKOGIKMzMKMzYKODAKY2MKNDcKZmEKMTMKNzQKZWIKYzkKNDgKMGMKY2MKYWYKZjQKYTEKYjIKNGQKMDEKMDUKZTAKMDIKZWYKZjcKYTAKM2EKMGMKM2MKOTkKYWEKYjQKNDMKY2IKNzAKY2EKMzgKZTIKZmYKY2UKM2MKYWIKNWIKNGIKZWMKNDIKY2IKZTkKOWMKMGMKODYKOWMKZWMKYjcKYzEKMGQKNTEKZWIKZjMKNGUKMTEKNDMKMTIKNmEKMzUKYTMKNTEKYmIKODUKNWMKZjAKNDAKZGEKYmYKZWYKYzQKODYKY2MKMzIKODMKYzcKMTIKZTYKN2EKNGUKN2QKMzcKMDEKYjIKN2IKN2UKZWIKZTAKZTgKZTcKYTQKYTkKYTUKYTQKNDYKYTUKOGQKNmUK)



![](https://hackmd.io/_uploads/rykgQBJla.png)



=> Quét QR và nhận flag

#flag : `KMACTF{Dun9_leak_de_nhe_anh_em_:((}`

## Sit 

### Des : 

![](https://hackmd.io/_uploads/BJgBgbllp.png)

```
When I have started my computer, my secret document is encrypted. I think I am a victim of a targeted attack

Download

Password: 2w#_4w|e{Jh<2)};3by<{>}G3$h;2vuF3>'D4Jga|s|a}

Flag format: KMACTF{}
```



### Sol : 

+ Đọc mô tả của đề bài là `When I have started my computer, my secret document is encrypted. I think I am a victim of a targeted attack` thì bài này 90% có liên quan đến 1 malware nào đó. Cộng thêm cái tên bài là sit thì guessing là Malware `Persistence` nhỉ =)). 
+ Oke bắt đầu phân tích file thôi, mình sẽ tìm những đường dẫn mà kẻ tấn công hay đưa vào virus vào máy tính nạn nhân : 
+ Đầu tiền là `Registry keys` : thì những đường dẫn liên quan đến nó như ở run hay runonce đều không có gì.
+ Tiếp theo là `Scheduled Tasks` nhưng mình vẫn không thấy gì đặc biệt. 
+ Nó cũng tương tự với Windows Services vì thế bài này lúc đầu mình đã bỏ nó và sang làm bài `time chaos`. Sau giải thì mình biết rằng đã bỏ quên 1 thứ đó là `Startup Folders` 
+ Malware có thể được sao chép vào thư mục Startup của người dùng, dẫn đến việc thực thi mỗi khi người dùng đăng nhập.
+ Đối với cách thực hiện này malware thường không sao chép trực tiếp chính nó vào thư mục Startup của người dùng. Thay vào đó, chúng thường tạo các tập tin ngắn gọn (shortcut) đến tập tin thực thi của chúng và đặt các tập tin ngắn gọn này vào thư mục Startup. Khi người dùng đăng nhập vào hệ thống, các tập tin ngắn gọn này được thực thi, và do đó, malware cũng được khởi động.

+ Và theo đường dẫn là `[root]\Users\admin\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup` mình tìm được các file đáng nghi ngờ : 

![](https://hackmd.io/_uploads/BJgPGLelp.png)

+ FIle `UnikeyNT.lnk` : 
 
![](https://hackmd.io/_uploads/S1p5GLxgT.png)

+ Trong shortcut có 2 đường dẫn đáng nghi nghờ ở target 

![](https://hackmd.io/_uploads/ry85H8lea.png)

+ 1. `C:\Users\admin\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content\datahost.exe`
+ 2. `C:\Program Files\Common Files\Microsoft Shared\TextConv\tailieu`
 
+ Rất có thể mục tiêu của kẻ tấn công là đưa file `datahost.exe` (file có dính virus) để tấn công vào máy người dùng.

+ Oke và mình đi theo đường dẫn `1` để phân tích tiếp.


+ Và mình đã lấy được file `datahost.exe`

![](https://hackmd.io/_uploads/ry-ICUleT.png)

+ Nó là 1 file PE => ném lên virustotal để phân tích thì nó chính xác là 1 file có dính virus. 


+ Thấy nó được tạo bằng python nhưng để chắc hơn thì dùng `Detect_It_Easy-3.08-x86_64.AppImage` để phân tích nó thì thấy file đã bị `Packer: PyInstaller`(nó bị pack) => dùng pyintxtractor.py và uncompyle6 để unpack. 


![](https://hackmd.io/_uploads/BJphhZeea.png)



![](https://hackmd.io/_uploads/ry5Mg-lep.png)


![](https://hackmd.io/_uploads/Bk2QlZegp.png)


+ Và sau khi decompile nó mình nhận được đoạn code python3 như sau : 

```
# uncompyle6 version 3.9.0
# Python bytecode version base 3.7.0 (3394)
# Decompiled from: Python 3.10.6 (main, Mar 10 2023, 10:55:28) [GCC 11.3.0]
# Embedded file name: datahost.py
import os, sys, random, platform
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Hash import SHA256, MD5

def encryption(file, key, iv):
    with open(file, 'rb') as (enc):
        data = enc.read()
        cipher = AES.new(key, AES.MODE_CBC, iv)
        ciphertext = cipher.encrypt(pad(data, AES.block_size))
        write = ciphertext
    enc.close()
    with open(file + '.huhu', 'wb') as (data):
        data.write(write)
    data.close()


while True:
    filename = sys.argv[1]
    sed_ = int(os.path.getctime(filename))
    random.seed(sed_)
    key = SHA256.new(str(random.randint(1, 13374953)).encode('utf-8')).digest()
    iv = MD5.new((platform.node() + '-' + os.path.dirname(os.path.abspath(filename))).encode('utf8')).digest()
    encryption(filename, key, iv)
    os.remove(filename)
    break
# okay decompiling datahost.pyc
```

+ Phân tích đoạn mã thì nó đang đọc file nào đó có thể là file `tailieu`, sau đó encrypt AES với mode là CBC.
+ Sed lấy kiểu int của time create file `tailieu`(đó là )
+ Key là sha256 với random 1 ký tự nào đó ngẫu nhiên với biến `sed`.
+ Iv được dùng MD5 với hostname + đường dẫn của filename 
+ Sau đó encrypt và ghi tất cả vào  file nào đó có đuôi `.huhu` 
+ Và ở đường dẫn thứ `2` thì mình tìm được file `tailieu.huhu` 

![](https://hackmd.io/_uploads/Bkit0LllT.png)



+ => file name tên `tailieu` => mình có được đường dẫn của nó luôn là đường dẫn thứ 2(`C:\Program Files\Common Files\Microsoft Shared\TextConv`) 
+ Bây giờ dữ liệu còn thiếu là time mà author đã tạo ra file `tailieu` 

+ Theo đường dẫn `SYSTEM\CurrentControlSet\Control\ComputerName\` => computer name là `KTMM` 

![](https://hackmd.io/_uploads/rk5esKxga.png)

+ Và chúng ta còn 1 file `$MFT` chưa sử dụng, nó dùng để quản lý hệ thống các tệp tin. 

+ Dùng tool [MFTECmd](https://github.com/EricZimmerman/MFTECmd) để parse $MFT file ra và tìm thời gian tạo ra file `tailieu` (dùng Command Prompt)
![](https://hackmd.io/_uploads/SyQYZ9ega.png)

![](https://hackmd.io/_uploads/Bkd4Ncgep.png)


+ => `8/24/2023 5:08:53 PM` mình dùng [web on này](https://bfotool.com/vi/timestamp-converter) để chuyển sang `timestamp` là `1692896933`

![](https://hackmd.io/_uploads/H1wklgexa.png) 

+ Oke bây giờ mình đã đủ dữ liệu rồi, dựa vào file python3 đã decompile từ `datahost.exe` để viết script decrypt AES CBC. 

```
import os, sys, random, platform
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
from Crypto.Hash import SHA256, MD5

def decryption(file, key, iv):
    with open(file, 'rb') as (enc):
        data = enc.read()
    cipher = AES.new(key, AES.MODE_CBC, iv)
    text = cipher.decrypt(data)
    text = unpad(text, AES.block_size)        
    with open('out','wb') as f :
        f.write(text)

filename = "tailieu.huhu"
sed_ = 1692896933
random.seed(sed_)
key = SHA256.new(str(random.randint(1, 13374953)).encode('utf-8')).digest()
iv = MD5.new(("KTMM" + '-' + "C:\Program Files\Common Files\Microsoft Shared\TextConv").encode('utf8')).digest()
decryption(filename, key, iv)
```
=> Đến đây mở file out lên xem thì nhận thấy nó là 1 file PDF => mở file ra và quét QR nhận flag.

![](https://hackmd.io/_uploads/BJDGI9xlT.png)

#flag : `KMACTF{Wh3n_Pl4y1n9_CTF,_pl@Y_w1tH_4ll_Ur_h34r7}`

