# Write Up HKCERT CTF 2024

---
## Misc
### 1. Get Flag Yourself

---
Bài cho file python có nội dung:
```python!
from base64 import b64decode
from secrets import token_hex
import subprocess
import os
import sys
import tempfile
FLAG = os.environ["FLAG"] if os.environ.get("FLAG") is not None else "hkcert24{test_flag}"
print("Encode your Go program in base64")
code = input(">> ")
with tempfile.TemporaryDirectory() as td:
fn = token_hex(16)
src = os.path.join(td, f"{fn}")
with open(src+".go", "w") as f:
f.write(b64decode(code).decode())
p = subprocess.run(["./fork", "build", "-o", td, src+".go"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) # renamed binary
if p.returncode != 0:
print(r"Fail to build ¯\_(ツ)_/¯")
sys.exit(1)
_ = subprocess.run([src], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if _.returncode == 0:
print(r"You can write Go programs with no bugs, but I cannot give you the flag ¯\_(ツ)_/¯")
sys.exit(1)
if b"panic" in _.stderr:
print("I am calm...")
sys.exit(1)
print(f"You are an experienced Go developer, here's your flag: {FLAG}")
sys.exit(1)
```
> Đoạn mã này cho phép nhập mã Go đã được mã hóa bằng base64, giải mã nó, biên dịch và chạy mã đó. Nếu mã chạy không có lỗi và không có panic, người dùng sẽ nhận được FLAG. Nếu có lỗi hoặc panic, chương trình sẽ thông báo cho người dùng mà không cung cấp FLAG.
Kết nối server và mình dùng script này:
```go!
package main
import "os"
func main() {
os.Exit(1) // Thoát với trạng thái khác 0 để gây lỗi mà không tạo panic
}
```
Decode base64:
>cGFja2FnZSBtYWluDQppbXBvcnQgIm9zIg0KZnVuYyBtYWluKCkgew0KICAgIG9zLkV4aXQoMSkgIC8vIFRob8OhdCB24bubaSB0cuG6oW5nIHRow6FpIGtow6FjIDAgxJHhu4MgZ8OieSBs4buXaSBtw6Aga2jDtG5nIHThuqFvIHBhbmljDQp9DQo=

> Flag: hkcert24{https://i.redd.it/bbic46fn5zp11.jpg}
---
### 2. My Lovely Cats

---
Bài cho mình folder có 2 file này:

Kiểm tra file lnk, mình thấy được điểm lạ:

File .lnk này có kích thước 41 kB và sử dụng MshtA.exe từ thư mục WINDOWS\system32. Dòng Command Line Arguments chứa mã độc dạng JavaScript, có thể thực thi lệnh đọc file và cố gắng lấy dữ liệu từ file .lnk.
Strings thì mình có được đoạn base64 khả nghi này:

Decode, mình có được:

Có được link, truy cập vào, mình thấy được flag:

> Flag: hkcert24{mEow-meOw-me0W-ma1ware}
---
## Forensics
### 1. Cook book

---
Bài cho folder chứa 2 file `e.py` và `flag.enc`:

Kiểm tra nội dung file python:
```python!
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from Crypto.Random import get_random_bytes
BLOCK_SIZE = 16 # Bytes
key = get_random_bytes(BLOCK_SIZE)
cipher = AES.new(key, AES.MODE_ECB)
with open("flag.bmp", "rb") as fp:
pt = fp.read()
ct = cipher.encrypt(pad(pt, BLOCK_SIZE))
with open("flag.enc","wb") as fp:
fp.write(ct)
```
> Đoạn mã trên mã hóa tệp hình ảnh flag.bmp bằng AES ở chế độ ECB và lưu trữ kết quả trong flag.enc. Đầu tiên, một khóa AES ngẫu nhiên dài 16 byte được tạo, sau đó dữ liệu từ flag.bmp được đọc và mã hóa sau khi được thêm đệm (padding) để phù hợp với kích thước khối của AES. Kết quả mã hóa cuối cùng được ghi vào tệp flag.enc
Sau 1 hồi tìm hiểu về `bmp-aes ecb`, mình đọc được ở [đây](https://doegox.github.io/ElectronicColoringBook/).
Thực hiện theo hướng dẫn:
```bash
openssl enc -e -aes-128-ecb -in flag.enc -out test.bin -k toto -pbkdf2 -nosalt
```
```bash!
python ElectronicColoringBook.py test.bin
```
Có được:


Mình thấy xuất hiện ảnh này, nhìn kĩ thì có vẻ như nó là flag bị lật ngược lại, chỉnh lại 1 chút, mình có:

> Flag: hkcert24{do_you_know_the_cool_penguin}
---
### 2. One Way Room

---
Bài cho mình file .vmdk, nhiệm vụ là điều tra các thông tin trong các file đó và trả lời các câu hỏi vào trang web để kiểm tra flag:

Để làm được bài này thì mình cho file vào ftk imager, bắt đầu với câu hỏi đầu tiên:
> UUID of /dev/sda1:
UUID (Universally Unique Identifier) của phân vùng /dev/sda1 có thể được tìm thấy trong thông tin phân vùng của ổ đĩa. Mình có thể sử dụng lệnh `blkid` trên Linux để tìm UUID của phân vùng này. do đang mở file vmdk trong ftk imager, mình tìm thông tin phân vùng trong các file hệ thống như `/etc/fstab` hoặc `/etc/mtab`.
Có được:

> b2bc2958-9c47-495a-8bab-3bae83cf9ca4
---
> Backdoor URL:
Tìm backdoor url, mình có tìm các file log thế nhưng sau một hồi tìm kiếm vẫn không có gì, mình cho vào kali để `strings | grep` thì nó ra:

> https://t.ly/backdoor.sh
---
> Password for user very-secure:
Tiếp tục đến việc tìm ra mật khẩu của người dùng, trong linux thì thường được lưu trữ trong các file hệ thống như `/etc/passwd`, `/etc/shadow`:
Tìm tiếp mình phát hiện được :

Có thể thấy được mật khẩu của user `very secure`, thế nhưng mật khẩu đó đã bị mã hóa và việc của ta bây giờ là phải crack được nó:

Tạo file passwd.txt có nội dung là hash của mật khẩu đó, sau đó sử dụng john để crack (sẽ hơi tốn thời gian 1 chút)
```bash!
john --wordlist=/usr/share/wordlists/rockyou.txt --format=md5crypt-long passwd.txt
```
Chạy lệnh và chờ, ta có được pass:

> nokiasummer1990
---
> Deleted file flag:
Để tìm được flag trong file bị xóa đó, ta có thể tìm trong `auth.log` hoặc trong thùng rác, mình tìm qua một lượt và thấy được flag đó ở:

> flag{th3_fi13_sh411_b3_d313t3d}
---
> IP of login attempt:
Câu hỏi cuối cùng là liên quan đến ip đăng nhập, mình kiểm tra trong folder `var`, file `auth.log` tuy nhiên thì không có gì, thế nhưng đọc các file còn lại thì mình phát hiện được địa chỉ ip cần tìm:

IP nằm trong fipe `btmp`:
> File `btmp` trên Linux/Unix lưu trữ thông tin về các lần đăng nhập không thành công, bao gồm tên người dùng, thời gian và địa chỉ IP (nếu có). File này thường nằm tại /var/log/btmp và ghi nhận mỗi khi có ai đó nhập sai tên đăng nhập hoặc mật khẩu. Do là file nhị phân, bạn cần dùng lệnh lastb để đọc nội dung. File này có thể trở nên rất lớn nếu hệ thống bị tấn công brute-force thường xuyên, vì vậy cần kiểm soát kích thước của nó định kỳ, chẳng hạn bằng lệnh sudo truncate -s 0 /var/log/btmp để làm trống file mà không xóa đi file gốc.
> 192.166.246.54
---
Submit tất cả các thông tin mình tìm được:


> Flag: hkcert24{h4v3_4_t4st3_0f_1inux_f0r3nsic_0r_b3ing_rickr011_4g4in}
---
### 3. Where's the APT Attack (1)

---
Bài này mình nghĩ author không chú ý nhiều nên để xuất hiện `unintended solution` này:

> Flag: hkcert24{4p7_4774ck_600d_d1r3c710n_0n_7h15_m3m0ry_f0r3n51c}
---