これは、2021/8/21~2021/9/4の期間で開催された、setodaNote CTFの Misc 分野のwriteupです。全体writeupはこちら
Welcome (20)
ようこそ setodaNote CTF へ
これはチュートリアル用の設問です。本 CTF では Linux ターミナルが利用できます。以下の URL からログインし、ターミナル上に存在するファイル welcome.txt の内容を確認し、フラグを獲得してください。
https://ctf.setodanote.net/webshell ※ログインに必要なユーザ名とパスワードは、本 CTF にご登録いただいているものと同じです。 ※利用の必要がある設問の説明文には上記のリンクが記載されています。
なんとwebshellを用意していただいていいる!すごい!
リンクを踏んで、自分のid, passwordでログインします。言われたとおりのファイルがhome直下にあるので、表示させるとフラグが。
$ ls welcome.txt $ cat welcome.txt Welcome to the setodaNote CTF!! *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* * * * flag{Enjoy_y0ur_time_here!} * * * *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* This is the flag.
morse_one (30)
友人から「秘密のメッセージを送るね」とあるテキストファイルが送られてきました。どうやらそのままでは読めないようです。添付されたファイルを解析し、秘密のメッセージを見つけ出してください。
フラグは得られた文字列を flag{} で囲んで答えてください。フラグに英字が含まれている場合はすべて大文字で答えてください。例えば得られた文字列が Flag の場合は flag{FLAG} となります。
配布されたファイルを解凍すると、下記のテキストが。
DDDBSDDSBDDDSDBDSBBBSDBBDSDBDDSDSBDDB
モールス信号とのことなので、-
,.
,に変換して解読します。
S
が単語区切りっぽいので, D,Bはdecodeしてみてあってそうな方に変換。せっかくなので自前ライブラリを使ってみた。
GitHub - kusuwada/morse-code: Morse code encoder & decoder.
$ python morse.py input mode (d: decode, e: encode) > d input your message > ...- .. -... .-. --- .--. .-.. . -..- VIBROPLEX
これをflag{}
で囲って提出。
Hash (50)
ちくしょう、なんてことだ。知り合いから預かっていたファイルをゴミ箱に放り込みやがった。まだ中身の確認もしていなかったのにだ。問い詰める必要はあるだろうが、いまはとにかくファイルを取り戻すことが先決だ。優先順位を間違えてはいけない。とくにかくゴミ箱からファイルを取り戻さなくては。・・・なんだぁこいつは、ファイル名が書き換えられてしまっているじゃあないか。なんて野郎だクソっこれじゃほかのファイルと見分けがつかないじゃあないか。なんて日なんだ今日はよぉ。しかしまったくもって腹立たしいことは確かだが、まだ焦るのは早すぎるよなぁ。ぜんぜん焦る必要はねぇ。なぜならこっちにはファイルと共に受け取ったこのハッシュ値があるんだからよぉ・・・
添付ファイルを解析し、以下のハッシュ値を持つファイル見つけ出してください。フラグはそのファイルに記載されている文字列を組み合わせたものとなります。
aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7
8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb
e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962
添付ファイルを解凍すると、90個のpass###.txt
ファイルが。このファイルのhashを計算して、問題文と合うものを探します。
Hashアルゴリズムが特に指定されていない気がするけど、Hash長64桁なので、sha256あたりが使われてそう。(参考: hashアルゴリズムとハッシュ値の長さ一覧(+ハッシュ関数の基本と応用) - Qiita)
なんとなくコマンドワンラインでやりたくなったので、長いけど下記コマンドでやってみた。
$ shasum -a 256 hash/*.txt | grep -e aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7 -e 8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb -e e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962
実行結果
aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7 hash/pass024.txt 8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb hash/pass034.txt e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962 hash/pass079.txt
これらのファイルの中身をつなぎ合わせるとflag。
$ cat hash/pass024.txt >> flag.txt $ cat hash/pass034.txt >> flag.txt $ cat hash/pass079.txt >> flag.txt $ cat flag.txt | tr -d '\n' flag{hardest_logic_puzzle}
F (80)
友人のプログラマーからあるテキストデータを受け取りました。中身はあるプログラミング言語で書かれたプログラムだというのですが、、、
以下のテキストデータを解析し、フラグを得てください。
+++++++[->++++++++++>+++++++++++>+++++++++>++++++++++<<<<]>.>-.>++.>+.>++++++++[>++++<-]>.>+++++[->+++++++++++++++++++++>+++++++++++++++++++++++<<]>.>.>++++++++[>++++<-]>.>++++++++++[->++++++++++>++++++++++>++++++++++>++++++++++>++++++++++++<<<<<]>++.>++++++++.>---.>+++.>+++.>++++++++[>++++++++<-]>++++.>+++++++++++[>++++++++++>++++++++++<<-]>+.>.>++++[>++++++++++<-]>-.>+++[->+++++[->++++++++<]<]>>----.>++++++++++[->++++++++++>+++++++++>++++++++++++>++++++++++>+++++++++<<<<<]>-----.>-----.>-----.>+.>+++++.>++++++++++++++++++++[>++++++>+++++>+++++>+++++>+++>++<<<<<<-]>----.>++++.>+.>-----.>++++++++++.>+++++.>++++++++++[->+++++++++>+++++++++++>+++++++++++>++++++++++<<<<]>---.>+.>++++.>.>+++[->+++++++++++<]>..>+++++[->+++++[->+++++<]<]>>.
ググってみたところ、brainfuckという言語っぽい。こちらのサイトでDecode・実行してもらいました。
magic_number (80)
添付されたファイルから以下が示す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
添付ファイルを解凍すると、12個のファイルが。
$ unzip magic_number_3156a7f05faa4ff5e3ce0a9b7f381f21aeb16cfe.zip Archive: magic_number_3156a7f05faa4ff5e3ce0a9b7f381f21aeb16cfe.zip creating: magic_number/ extracting: magic_number/flag.txt inflating: magic_number/green.tif inflating: magic_number/light.jpg inflating: magic_number/moon.gif inflating: magic_number/mpmp.mp4 inflating: magic_number/post.pdf inflating: magic_number/post.png extracting: magic_number/rar.rar extracting: magic_number/sea.txt.bz2 inflating: magic_number/silent.bmp inflating: magic_number/undo.cab inflating: magic_number/victory.zip
マジックナンバーはファイルシグネチャのことを指していると思われるので、このシグネチャのリストから当てはまる拡張子のファイルを見つけてつなげます。
[89 50 4e 47] -> PNG [52 61 72 21] -> RAR [ff d8 ff e0] -> JPG
よってflagは、flag{post_rar_light}
Stegano (100)
友人からある画像が送られてきました。何かが写りこんでいるらしいのですが。
添付されたファイルを解析してフラグを入手してください。
添付ファイルは一枚の画像。
めっちゃ目を凝らすと、背景に文字が書かれている気がする。Steganoツールで、色ごとの輝度を調節して行けば、flagが出そう。
今回は GitHub - DominicBreuker/stego-toolkit: Collection of steganography tools - helps with CTF challenges で stegoveritas
を使って各色のビットごとの数値で2値化した画像を作ってもらい、その中でflagが書かれていそうなものをピックアップしました。
これらをつなげて、flag{Re4l17y_1s_cReA73d_by_7h3_m1nd_rA9}
。
最初のブロックのl
と1
が区別しにくかったですが、leetcodeを読んで意味が通るようにしたらあってました👍
morse_zero (100)
友人から「マジの秘密のメッセージを送るね」とあるテキストファイルが送られてきました。どうやらマジでそのままでは読めないようです。添付されたファイルを解析し、マジの秘密のメッセージを見つけ出してください。
フラグは得られた文字列を
flag{}
で囲んで答えてください。フラグに英字が含まれている場合はすべて大文字で答えてください。例えば得られた文字列がFlag
の場合は flag{FLAG} となります。
添付ファイルを解凍してテキストエディタで開いてみると
ZZZZZZZZZZZZZZZ
えー、Zしかない。
バイナリエディタで開いてみると
お、これならモールス信号に変換できそう。バイナリ16進をそのままテキストに起こして
E2808CE2808CE2808BE2808B5AE2808B5AE2808BE2808CE2808B5AE2808CE2808CE2808CE2808CE2808C5AE2808BE2808BE2808CE2808CE2808BE2808C5AE2808BE2808CE2808C5AE2808BE2808CE2808CE2808CE2808C5AE2808CE2808BE2808B5AE2808C5AE2808BE2808BE2808BE2808B5AE2808BE2808BE2808CE2808CE2808BE2808C5AE2808BE2808BE2808B5AE2808BE2808CE2808CE2808B5AE2808BE2808C5AE2808CE2808BE2808CE2808B5AE2808B
5A
-> ,
E2808B
-> .
, E2808C
-> -
に変換すると
--.. . .-. ----- ..--.- .-- .---- -.. - .... ..--.- ... .--. .- -.-. .
これをあとは先程のモールス信号解読ツールに突っ込むと、
$ python morse.py input mode (d: decode, e: encode) > d input your message > --.. . .-. ----- ..--.- .-- .---- -.. - .... ..--.- ... .--. .- -.-. . ZER0_W1DTH_SPACE
ransom_note (100)
あなたの元に緊急の対応依頼が飛び込んできました。重要なファイルがランサムウェアによって暗号化されてしまった。なんとか助けてほしい。電話越しに状況を聞き取りつつ、1枚の画像が送られてきました。端末のディスプレイを写したもののようです。「No More Ransom Project の出番だな。」その画像を見た上司がつぶやきます。今回のあなたの仕事はランサムウェアによって暗号化されてしまったファイルを復元することです。
添付されたファイルを解析し、フラグを得てください。
添付ファイルを解凍すると画像・テキストと、npiewi
という謎の拡張子のファイルが。画像を見てみると GANDCRAB というので暗号化されたようだ。
さらにテキストを読んでみると、お試しで1ファイルだけ無料で復号できるらしい。ここに書かれているinstructionに沿ってやってみると復号できそう。
| 0. Download Tor browser - https://www.torproject.org/ | 1. Install Tor browser | 2. Open Tor Browser | 3. Open link in TOR browser: http://xxxxxxxxxxxxxxxx.example.com/b9ba6918c4b4a232 | 4. Follow the instructions on this page
と思ったけど、URLはダミーなので特に何もできなかった。
次に、問題文にあったNo More Ransom Project
というのを知らなかったのでググると、下記サイトを発見。
ここから"GANDCRAB"のDecryptorを落とせた。exeなのでwindowsのVMを立ち上げ、先程のテキストとnpiewi
ファイルを配置したフォルダを指定してdecryptしたところ、secret.txt
が出てきました!
Nothing (120)
あなたは友人のプログラマーからあるテキストファイルを渡されました。中身を確認しますが画面には何も表示されません。何も書かれていないのか、いや、よく見ると、、、
添付されたファイルを解析してフラグを得てください。
添付されたファイルを解凍すると、nothing.txt
という真っ白のテキストが。が、よく見るとタブ、スペース、改行があるっぽいので whitespace言語 を疑ってみる。
こちらのサイトでコンパイル・実行できるので、貼り付けてRunすると、stdoutにflagが出てきました!
i_knew_it (120)
「このアセンブリ、見た瞬間あなただと分かりましたよ。」
ある暗号方式の名称がフラグになっています。添付ファイルからその暗号方式の名称を特定し、フラグ形式で回答してください。
フラグに英字が含まれている場合は、すべて大文字で答えてください。例えば This_is_FLAG が得られた場合は flag{THIS_IS_FLAG} となります。
添付ファイルはこちらのpng。
IDAツールの画面っぽいです。このアセンブリと処理の流れを眺めて、暗号方式を当てる問題。
そんなに複雑なやつじゃないだろうと、当てずっぽうでまずは RC4
を入れてみたら当たってしまった。ほとんどアセンブリ読んでいません、ごめんなさい…。
Redacted (150)
あなたの友人のジャーナリストは極秘ファイルの入手に成功しました。ですが重要な部分が黒塗りにされてしまっているようです。このままでは真実が闇に葬り去られてしまいます。あなたは極秘ファイルの解析を依頼されました。
添付されたファイルを解析し、真実を明らかにしてください。
配布されたPDF。確かに黒塗りされています。
pdfのメタ情報を見てみると "Note: Never extruct images..." と書いてあります。なるほど。
その他、作成者情報などを見てみると、Microsoft PowerPoint とあります。
Officeツールで開いたら黒塗りが取れそうな予感がしたので、Macでそのまま開けるWordで該当PDFを開いてみると、案の定黒塗りを選択して動かせました👍
strong_password (250)
あなたの同僚は部署内で利用されているパスワード規則に疑問を抱いているようです。脆弱なパスワードが生成されてしまうのではないかと。これを確かめるべく同僚は、過去実際にこの規則に従い作成されていたパスワード付きzipのコピーをあなたに送付し、その解析を依頼しました。
添付されたファイルを解析し、フラグを入手してください。なお、ファイルはコピーであり更新日時が実際にパスワード設定された日時とは異なる点に注意してください。
配布されたファイルを確認してみると、暗号つきzip TopSecret.zip
と、情報セキュリティガイドライン(別紙1).pdf
が。
ガイドラインを見てみると、パスワードのルールが書いてあります。13桁もあり、使用される文字数も多いのでクラックは難しいと思いきや、パスワード形式が決まっており、各桁に使用される文字種はかなり限定されています。これはbruteforceできるかも?
ということで、規則に則ったパスワードをbruteforceするプログラムを組んで回してみることに。
#!/usr/bin/env python3 # -*- coding:utf-8 -*- import string import itertools import datetime import zipfile codes = string.ascii_letters symbols = '@#$%!-' numbers = string.digits def unzip_with_password(password): with zipfile.ZipFile('TopSecret.zip', 'r') as zp: try: zp.extractall(path='./', pwd=password.encode("utf-8")) return True except Exception as e: return False # format # [codes:3][symbols:1]202[0|1][01-12][01-31][symbols:1] for code in itertools.product(codes, repeat=3): print('code progress: ' + ''.join(code)) for sym in itertools.product(symbols, repeat=2): start_date = datetime.date(2020, 4, 1) end_date = datetime.date(2021, 7, 14) delta = datetime.timedelta(days=1) while start_date <= end_date: date = str(start_date).replace('-','') candidate = ''.join(code) + sym[0] + date + sym[1] #print(candidate) ret = unzip_with_password(candidate) if ret: exit() start_date += delta
これを回しっぱなしにしたところ、3日目くらいで出た。解凍されたzipファイルには、TopSecret.txt
が入っていました。
このパスワードが安全なはずがない。 flag{And_n0w_h3re_is_my_s3cre7}
3日かかったので、日付とかでもう少し絞れたのかもしれないが、出たからヨシ(๑•̀ㅂ•́)و✧