All Articles

corCTF 2024 Writeup

2024 年 7 月 27 日から開催されていた corCTF 2024 に参加しました。

今回は Rev が高難度すぎて全く解ける気がしなかったため、Forensic を 2 問だけ解いて早々にリタイアしました。

解いた問題だけ簡単に Writeup を書いたのでまとめておきます。

もくじ

the-conspiracy(Forensics)

Our intelligence team created a chat app, and secretly distributed it to the lemonthinker gang. We’ve given you the application source and a capture taken by one of our agents - can you uncover their plans?

問題バイナリとして与えられた pcp ファイルを解析すると、以下の通り意味不明なペイロードの送受信が発生していることがわかります。

image-20240727150531143

同じく問題バイナリとして提供されたスクリプトを確認したところ、encrypt 関数で暗号化されたキーとメッセージを TCP パケットにして送り合っているとみられることを確認できます。

import random
from scapy.all import *
import csv

sources, destinations, messages = [], [], []

with open('chatlogs.csv', mode='r') as file:
    csv_reader = csv.reader(file)
    for row in csv_reader:
        sources.append(row[0])
        destinations.append(row[1])
        messages.append(row[2])

def encrypt(message):
    messagenums = []
    for character in message:
        messagenums.append(ord(character))
    keys = []
    for i in range(len(messagenums)):
        keys.append(random.randint(10, 100))

    finalmessage = []
    for i in range(len(messagenums)):
        finalmessage.append(messagenums[i] * keys[i])

    return keys, finalmessage

for i in range(len(messages)):
    finalmessage, keys = encrypt(messages[i])
    print(finalmessage, keys)
    packet1 = IP(src=sources[i], dst=destinations[i])/TCP(dport=80)/Raw(load=str(finalmessage))
    send(packet1)
    packet2 = IP(src=sources[i], dst=destinations[i])/TCP(dport=80)/Raw(load=str(keys))
    send(packet2)

そこで、以下のスクリプトを作成して各メッセージの暗号化を解くことで Flag を取得しました。

import ast
from scapy.all import *

def print_decrypted(p,k):
    for i in range(len(p)):
        print(chr(p[i]//k[i]), end="")
    print()
    return


def extract_tcp_payload(pcap_file, src_ip=None, dst_ip=None, src_port=None, dst_port=None):
    packets = rdpcap(pcap_file)
    payloads = []

    for packet in packets:
        if packet.haslayer('TCP'):
            if src_ip and packet['IP'].src != src_ip:
                continue
            if dst_ip and packet['IP'].dst != dst_ip:
                continue
            # if src_port and packet['TCP'].sport != src_port:
            #     continue
            if dst_port and packet['TCP'].dport != dst_port:
                continue
            
            tcp_payload = bytes(packet['TCP'].payload)
            if tcp_payload:
                payloads.append(tcp_payload)
    
    return payloads


pcap_file = "challenge.pcap"
src_ip = "192.168.134.8"
dst_ip = "192.168.87.251"
src_port = 0
dst_port = 80

payloads = extract_tcp_payload(pcap_file, src_ip, dst_ip, src_port, dst_port)

for i, payload in enumerate(payloads):
    if i % 2 == 0:
        p = ast.literal_eval(payload.decode())
    else:
        k = ast.literal_eval(payload.decode())
        print_decrypted(p,k)

image-20240727150738333

scapy で pcap の解析を行えるのがかなり便利でした。tcpdump 使うより楽そう。

infiltration(Forensic)

After successfully infiltrating the lemonthinker gang, we’ve obtained their current location - the UK. We’ve attained some security logs from a gang member’s PC, but need some help in answering information relating to these.

問題バイナリとして与えられた Windows のセキュリティイベントログを解析して 6 つの質問に答える問題でした。

Q1

Hello agent. Thanks for your hard work in the field researching. We’ll now ask you 6 questions on the information you’ve gathered. I’d like to take this opportunity to remind you that our targets are located in the United Kingdom, so their timezone is BST (UTC +1). We’d like to confirm what the username of the main user on the target’s computer is. Can you provide this information?

最初に追加されている管理者ユーザがそれっぽい感じで、 slice1 が正解でした。

Q2

Now, we’d like the name of the computer, after it was renamed. Ensure that it is entered in exactly how it is in the logs.

コンピューター名は 2 回変更されており、攻撃者と思われるユーザの変更後は lemon-squeezer になっていることがわかります。

Q3

I wonder if they’ll make any lemonade with that lemon-squeezer… Great work! In order to prevent their lemons from moulding, the lemonthinkers changed the maximum password age. What is this value? Please enter it as an integer number in days.

パスワードポリシーの変更の監査から、83 日に延長されたことがわかります。

Q4

It seems that our targets are incredibly smart, and turned off the antivirus. At what time did this happen? Give your answer as a UNIX timestamp.

Defender が停止した時刻を UNIX 時間に変更した結果 1721946160 が回答になります。

Q5

The main lemonthinker, slice1, hasn’t learnt from the-conspiracy and has (again) downloaded some malware on the system. What is the name of the user created by this malware?

最後に作成されていたユーザ notabackdoor が回答になります。

Q6

Finally, we’d like to know the name of the privilege level of the user created by the malware. What is this?

これは普通に Administrator が正解になります。

最終的な回答は以下の通りでした。

slice1
lemon-squeezer
83
1721946160
notabackdoor
Administrator

これを回答すると Flag を取得できます。

image-20240727154821481

解析メモ

とりあえず Hayabusa でイベントログを解析する。

.\hayabusa-2.5.1-win-x64.exe csv-timeline -d "C:\Users\kash1064\Downloads"

最初に SID S-1-5-21-2883796447-3563202477-3898649884-1000 のユーザがローカル Admin グループに追加されたっぽい。

このユーザ名は slice1

2024-07-25 22:03:56.012 +00:00 ‖ DESKTOP-MALD9OV ‖ Sec ‖ 4616 ‖ low ‖ 201 ‖ Unauthorized System Time Modification ‖ PrevTime: 2024-07-25T22:03:56.012867Z ¦ NewTime: 2024-07-25T22:03:56.012000Z ¦ User: WIN-MB9TIUK70HK$ ¦ Proc: C:\Windows\System32\rundll32.exe ¦ PID: 0x4a0 ¦ LID: 0x3e7
2024-07-25 22:03:56.016 +00:00 ‖ DESKTOP-MALD9OV ‖ Sec ‖ 4728 ‖ low ‖ 202 ‖ A Member Was Added to a Security-Enabled Global Group ‖ SrcSID: S-1-5-21-2883796447-3563202477-3898649884-1000 ¦ TgtGrp: None ¦ LID: 0x3e7
2024-07-25 22:03:56.020 +00:00 ‖ DESKTOP-MALD9OV ‖ Sec ‖ 4720 ‖ low ‖ 203 ‖ Local User Account Created ‖ TgtUser: slice1 ¦ TgtSID: S-1-5-21-2883796447-3563202477-3898649884-1000
2024-07-25 22:03:56.049 +00:00 ‖ DESKTOP-MALD9OV ‖ Sec ‖ 4732 ‖ high ‖ 212 ‖ User Added To Local Admin Grp ‖ SrcSID: S-1-5-21-2883796447-3563202477-3898649884-1000 ¦ TgtGrp: Administrators ¦ LID: 0x3e7
2024-07-25 22:05:18.412 +00:00 ‖ DESKTOP-MALD9OV ‖ Sec ‖ 4648 ‖ info ‖ 414 ‖ Explicit Logon ‖ TgtUser: slice1 ¦ SrcUser: WIN-MB9TIUK70HK$ ¦ SrcIP: 127.0.0.1 ¦ Proc: C:\Windows\System32\svchost.exe ¦ TgtSvr: localhost
2024-07-25 22:05:18.412 +00:00 ‖ DESKTOP-MALD9OV ‖ Sec ‖ 4624 ‖ info ‖ 415 ‖ Logon (Interactive) *Creds in memory* ‖ Type: 2 ¦ TgtUser: slice1 ¦ SrcComp: WIN-MB9TIUK70HK ¦ SrcIP: 127.0.0.1 ¦ LID: 0xb6b25
2024-07-25 22:05:18.412 +00:00 ‖ DESKTOP-MALD9OV ‖ Sec ‖ 4624 ‖ info ‖ 416 ‖ Logon (Interactive) *Creds in memory* ‖ Type: 2 ¦ TgtUser: slice1 ¦ SrcComp: WIN-MB9TIUK70HK ¦ SrcIP: 127.0.0.1 ¦ LID: 0xb6b55
2024-07-25 22:05:18.412 +00:00 ‖ DESKTOP-MALD9OV ‖ Sec ‖ 4672 ‖ info ‖ 417 ‖ Admin Logon ‖ TgtUser: slice1 ¦ LID: 0xb6b25
2024-07-25 22:05:19.785 +00:00 ‖ DESKTOP-MALD9OV ‖ Sec ‖ 5379 ‖ low ‖ 427 ‖ Credential Manager Accessed ‖ PID: 1484 ¦ SrcUser: slice1 ¦ Tgt: MicrosoftAccount:user=02yzspbvdvzrqxqh ¦ CredsReturned: 1 ¦ ReturnCode: 3221226021 ¦ LID: 0xb6b55 ¦ SrcSID: S-1-5-21-2883796447-3563202477-3898649884-1000

image-20240727151652663

コンピュータ名の列を見ると、何度か名前が変更されていることがわかる。

image-20240727152944708

その後 LEMON-SQUEEZER$ というコンピューターアカウントが暗躍しているので、このリネームあたりから攻撃が始まっていそう。

パスワードポリシーが変更され、Max. Password Age が 83 に設定されている。

image-20240727153707760

Defender も停止させられている。

image-20240727154125365

最後には notabackdoor というユーザも追加され、ローカル Admin グループに追加されてるっぽい。

2024-07-25 22:31:26.470 +00:00 ‖ lemon-squeezer ‖ Sec ‖ 4728 ‖ low ‖ 4857 ‖ A Member Was Added to a Security-Enabled Global Group ‖ SrcSID: S-1-5-21-2883796447-3563202477-3898649884-1001 ¦ TgtGrp: None ¦ LID: 0x44e1d
2024-07-25 22:31:26.472 +00:00 ‖ lemon-squeezer ‖ Sec ‖ 4720 ‖ low ‖ 4858 ‖ Local User Account Created ‖ TgtUser: notabackdoor ¦ TgtSID: S-1-5-21-2883796447-3563202477-3898649884-1001
2024-07-25 22:31:26.570 +00:00 ‖ lemon-squeezer ‖ Sec ‖ 4732 ‖ high ‖ 4871 ‖ User Added To Local Admin Grp ‖ SrcSID: S-1-5-21-2883796447-3563202477-3898649884-1001 ¦ TgtGrp: Administrators ¦ LID: 0x44e1d

image-20240727151931748

まとめ

ログ解析系の Forensic 問題とても楽しい。