好奇心の足跡

飽きっぽくすぐ他のことをしてしまうので、忘れないため・形にして頭に残すための備忘録。

setodaNote CTF writeup [Misc]

これは、2021/8/21~2021/9/4の期間で開催された、setodaNote CTFの Misc 分野のwriteupです。全体writeupはこちら

tech.kusuwada.com

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・実行してもらいました。

f:id:kusuwada:20210904223327p:plain

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)

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

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

添付ファイルは一枚の画像。

f:id:kusuwada:20210904223350p:plain

めっちゃ目を凝らすと、背景に文字が書かれている気がする。Steganoツールで、色ごとの輝度を調節して行けば、flagが出そう。
今回は GitHub - DominicBreuker/stego-toolkit: Collection of steganography tools - helps with CTF challengesstegoveritas を使って各色のビットごとの数値で2値化した画像を作ってもらい、その中でflagが書かれていそうなものをピックアップしました。

f:id:kusuwada:20210904223447p:plain:w300 f:id:kusuwada:20210904223458p:plain:w300 f:id:kusuwada:20210904223505p:plain:w300

これらをつなげて、flag{Re4l17y_1s_cReA73d_by_7h3_m1nd_rA9}
最初のブロックのl1が区別しにくかったですが、leetcodeを読んで意味が通るようにしたらあってました👍

morse_zero (100)

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

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

添付ファイルを解凍してテキストエディタで開いてみると

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

えー、Zしかない。
バイナリエディタで開いてみると

f:id:kusuwada:20210904223611p:plain

お、これならモールス信号に変換できそう。バイナリ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というのを知らなかったのでググると、下記サイトを発見。

www.nomoreransom.org

ここから"GANDCRAB"のDecryptorを落とせた。exeなのでwindowsのVMを立ち上げ、先程のテキストとnpiewiファイルを配置したフォルダを指定してdecryptしたところ、secret.txtが出てきました!

f:id:kusuwada:20210904223807p:plain

Nothing (120)

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

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

添付されたファイルを解凍すると、nothing.txtという真っ白のテキストが。が、よく見るとタブ、スペース、改行があるっぽいので whitespace言語 を疑ってみる。
こちらのサイトでコンパイル・実行できるので、貼り付けてRunすると、stdoutにflagが出てきました!

f:id:kusuwada:20210904223824p:plain

i_knew_it (120)

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

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

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

添付ファイルはこちらのpng。

f:id:kusuwada:20210904223841p:plain:w400

IDAツールの画面っぽいです。このアセンブリと処理の流れを眺めて、暗号方式を当てる問題。
そんなに複雑なやつじゃないだろうと、当てずっぽうでまずは RC4 を入れてみたら当たってしまった。ほとんどアセンブリ読んでいません、ごめんなさい…。

Redacted (150)

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

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

配布されたPDF。確かに黒塗りされています。

f:id:kusuwada:20210904223916p:plain:w200

pdfのメタ情報を見てみると "Note: Never extruct images..." と書いてあります。なるほど。
その他、作成者情報などを見てみると、Microsoft PowerPoint とあります。

Officeツールで開いたら黒塗りが取れそうな予感がしたので、Macでそのまま開けるWordで該当PDFを開いてみると、案の定黒塗りを選択して動かせました👍

f:id:kusuwada:20210904223946p:plain:w400

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日かかったので、日付とかでもう少し絞れたのかもしれないが、出たからヨシ(๑•̀ㅂ•́)و✧