CTF

【Writeup】setodaNoteCTFなるべくていねいなまとめ

2021/8/21~2021/9/4の期間で開催された、setodaNote CTFに参加させていただきました。
もうすでにたくさんの方がWriteup書いてて何番煎じだって気持ちになるのですが、家に帰るまでが遠足!Writeup書くまでがCTF!の精神で書きます。なるべく丁寧に書きますのでどなたかの参考になれば幸いです。

カテゴリごとの得意不得意がはっきりわかるのがおもしろいなーと思いました。

Misc

Welcome

Linuxターミナルを操作する問題。

初めて挑戦する方向けの説明もあってやさしくて感動した。

user@5d997f7dc91a:~$ ls
welcome.txt
user@5d997f7dc91a:~$ cat welcome.txt

  Welcome to the setodaNote CTF!!

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

  This is the flag.

user@5d997f7dc91a:~$ 

morse_one

ファイルを開くと

DDDBSDDSBDDDSDBDSBBBSDBBDSDBDDSDSBDDB

morseってことなのでモールス信号だろうとアタリがつくので、D=Dot B=Bar S=Space って意味なんだろ〜な〜タブンネ〜ってことで勘でテキストエディタで置換

..._ .. _... ._. ___ .__. ._.. . _.._

それっぽくなったのでCyberChefに投げ込む

Hash

ダウンロードしたフォルダにたくさんファイルが入っていて、ハッシュに合うファイルを探す問題。まずハッシュの種類をしらべないと…ってことで(強者は桁数見れば即答みたいですね…)Hash Analyzerで検索するとSHA256だということがわかる。sha265sumでハッシュをまとめて計算して

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/hash]
└─$ sha256sum * > out.txt
┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/hash]
└─$ cat out.txt
69856ad49e93e3bb3c39f6ae827e1f571156a623450bb36941dc3beda593511b  pass001.txt
b0d93d4a6fc08bf9dc2ce0c0997f48893efb6adf1363db4b708c3f1d2d3b9670  pass002.txt
c3064493645fc6045f797eeef61919fdf8d74f48468f1a1992259c021e49db00  pass003.txt
7f426632e92a096d1829708e6e2744739bae9156e23debd587d50f9eb359a7f9  pass004.txt
0c9eae0b76e5bf83ec1c2292823af05495971c33701b75cd32becdcd7078397b  pass005.txt
16410a7dca71ecbe16f1cdf3be7c11a20a7f9703a80a8f019495a1ae34a765fc  pass006.txt
3f061e621d8ed25da731b8735a247a0ee6be398fa713d4ec6197c06de32ece3a  pass007.txt
(略)

普通にgrepで探した

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/hash]
└─$ grep "aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7" out.txt
aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7  pass024.txt

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/hash]
└─$ grep "8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb" out.txt
8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb  pass034.txt

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/hash]
└─$ grep "e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962" out.txt
e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962  pass079.txt

F

CTFのMiscでおなじみ難解プログラミング言語のBrainf*ck(つーかそれ以外で見たことない)

magic_number

これは何のファイルだよ〜ってわかるようにするためにファイルの先頭バイトについてる識別子のことをマジックナンバーと呼びます。覚えている人もいるのかもしれないけどぐぐれば↓であることがわかるので、普通にファイル探せばよき

89 50 4e 47 = pngファイル
52 61 72 21 = rarファイル
ff d8 ff e0 = jpgファイル

Stegano

あるデータを他のデータの中に埋め込んで存在を隠すことをステガノグラフィと呼ぶ。問題文から、普通に画像を加工して解くのだろうとアタリをつけてPhotoshopで開く(ツールは自分の使いやすいもので良いと思う)

中央のフラグの断片みたいなものはすぐ見つかったんだけど最初と最後がわからず試行錯誤した。最終的に画像のRGBのうちBだけを抽出したときにフラグが全部見えることを発見。

ransom_note

ファイルをダウンロードすると、アレ勢のみなさんにはおなじみ?のGANDCRABによって暗号化されてしまったと思われるファイルが出てくる。

問題文の通り、No More Ransom Projectのサイトに行き(サイトリニューアルした?以前と見た目が全然違ったので最初間違えたかと思った)復号ツール検索で「GANDCRAB」って検索してツールをダウンロードして実行するだけ。想像より簡単にできた。ランサムされたファイルを復号したことなかったからいい経験になった。

Network

Host

Wiresharkでファイルを開いてhttpリクエスト送ってる先をみる

protocolがHTTPってなってるところを右クリック Follow > HTTP Stream

GETリクエストの中にHost名がある

tkys_never_die

なぜか突然爆発に巻き込まれてるっぽい後輩が気になりつつ、Wiresharkでファイルを開く。flag.htmlとflag.pngが怪しい。

ファイルを取り出す
File > Export Objects > HTTP

Save Allをクリックしてファイルを適当な場所にエクスポートする

flag.pngファイルを開くとフラグがあった。

echo_request

Wiresharkで開く。問題タイトルより、多分pingの中にデータ仕込まれているやつだろうなーとアタリをつけてICMPパケットを上から見ていく。すると29行目からDataに値が入り始める。

Pythonとかでかっこよく抽出できればよいがそんな技量はないので1文字ずつ根性で書き取ってしまった(すごい長いフラグじゃなくてよかった〜)

66 6c 61 67 7b 49 43 4d 50 5f 54 75 6e 6e 65 6c 69 6e 67 5f 54 31 30 39 35 7d 

データが取り出せたらCyberChefに投げ込む

stay_in_touch

例によってWiresharkでファイルを開く。問題文より、連絡を取り合っているやりとりってことでIMAPにアタリをつけてみていく。データの容量が大きいほうが怪しいのでは?ってことで大きいIMAPをみる。

728行目を Follow > TCP Stream

そのままだと文字化けするので UTF-8に変換する。

ずーっとメールを読んでいくと気になるやり取りがある

アカリ課長補佐

 あ、試作機のレポートが
 届いておりましたので転送しておきます。
 なかなかの性能のようです。

 パスワードは別にお送りします。

セトダ

いわゆるPPAPを復号する問題だなーとわかる。添付ファイルは一番最後の方にbase64になってくっついてるのでコピペできる。

Base64をzipファイルに戻す

echo "UEsDBBQAAQAAADBq8FK0Nz5zSgAAAD4AAAATAAAAUmVwb3J0LUFWLVQwMDk3LnR4dAzRMzm6s5vAM3huF0n2GEKFrarxVD3WvzurjKz9sjA7iD6nWis0GBRcIdcyrQkqliocBi2lCUB6J0hRUgHzDVCnVx6LnLS5LenqUEsBAj8AFAABAAAAMGrwUrQ3PnNKAAAAPgAAABMAJAAAAAAAAAAgAAAAAAAAAFJlcG9ydC1BVi1UMDA5Ny50eHQKACAAAAAAAAEAGADNWpx++XnXARJtllL6edcB0TOVfvl51wFQSwUGAAAAAAEAAQBlAAAAewAAAAAA" | base64 -D > out.zip

このままだとパスワードがかかっているので、728行目よりあとのIMAPの通信を適当に探して(私は805行目でみつけました)もう一度 Follow > TCP Streamで流れをみる。前回と同様にUTF-8形式にするとパスワードが平文で流れてるのがわかる。

これで復号するとフラグが含まれたtxtファイルが出てくる。

Web

Body

問題サイトにアクセスして解くWebジャンル。Bodyってことでソースコードのどっかかなーと思って探したらあった。

Header

Bodyと同じ感じでHeadに入ってたらアレだなと思ったけど流石にそれはなかった。レスポンスヘッダの中で見つけた。

puni_puni

ぷにぷにこーど全然知らなかった。とりあえず 「 xn-- 」で検索したらWikipediaで日本語ドメインを表記するためのものだということがわかった。そういや日本語ドメインとかあったな。なんて読むんだろう、本当にプニイコードなのかなあ。かわいい。

JPRSが変換ツールを公開していたのでそれで逆変換してフラグを得ることができた。

Mistake

問題文の「サイトに不備がある」という表現から、なんかの脆弱性というよりもサーバの設定ミスとかそういうのを疑う。まあディレクトリリスティングかなーと思ってimagesフォルダの中を見に行ったらありました(ただの勘)

tkys_royale

音信不通になってたんかい後輩。ログインフォームで重大な脆弱性と言えばまず試すのはSQLインジェクションですよね。

Usernameに↓を入れて「Login」をクリックでSQLインジェクションが成立してフラグがでてくる

' or 1=1 -- 

Estimated

局長ってなんの局…と思いながらブログにアクセスする。なんか普通にキレイな写真で素敵。

気になるのは、下の方にあるお詫び記事。

昨日の記事の写真に公開すべきでない情報があった、とのこと。つまり昨日の記事の写真を見ることができれば良さそう。他の記事を順番にみていくと、記事の写真はすべて

という名前で保存されているということがわかる。見たい写真は2021年6月3日の昨日、つまり2021年6月2日のものなので、

https://ctf.setodanote.net/web006/images/20210602001b.jpg

に直接アクセスすると消されず残っていた画像が見える。こういううっかりミスは普段も結構ありそうだなあ。

Mx.Flag

問題文とタイトルから、てっきりDNSサーバのMXレコードの問題かと思ったら全然違って無駄に手こずってしまった。問題サイトにアクセスすると、faviconがわざわざ読み込まれているのに表示されてないことがわかる。

怪しいのでダウンロードしてくる

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/MxFlag]
└─$wget https://ctf.setodanote.net/web007/images/favicon.png

本当にpngファイルなのか調べたら実はテキストファイルだということがわかったので中を読んでフラグ

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/MxFlag]
└─$ file favicon.png
favicon.png: ASCII text, with CRLF line terminators

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/MxFlag]
└─$ cat favicon.png
// flag{Mr_Flag_hiding_in_the_favicon}
console.table({place: "favicon.png", png: "false", flag: "true", Look: "me"});

Redirect

組織って一体何なんだ…。サイトにアクセスしてソースをみると最後の方に怪しい記述が。

aHR0cHM6Ly9jdGYuc2V0b2Rhbm90ZS5uZXQvd2ViMDA0L2JXRnNhMmwwLmh0bWw=

Base64でデコードすると以下になるのでアクセスしてみる

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

なるほどここでRedirectなんですね

リダイレクトされないようにcurlおじさんをつかう

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/Redirect]
└─$ curl https://ctf.setodanote.net/web004/bWFsa2l0.html
<!DOCTYPE HTML>
<html>
  <head>
    <title>start</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !function() {
        var params = new URL(window.location.href).searchParams;
        if(Array.from(params).length > 0){
          location.href = 'https://ctf.setodanote.net/web004/bm9mbGFn/?'+params;
        }else{
          location.href = 'https://ctf.setodanote.net/web004/bWFsa2l0.html?callback=wantFlag&data1=2045&data2=0907&data3=BiancoRoja&data4=1704067200';
        }
      }();
    </script>
  </head>
  <body>
    <p>Find out the flag.</p>
  </body>
</html>

なんかリダイレクト先が分岐されているのでなんとなく上の方にいく

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/Redirect]
└─$ curl https://ctf.setodanote.net/web004/bm9mbGFn/
<html>
  <head>
    <title>Next</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !function() {
        var params = new URL(window.location.href).searchParams;
        location.href = 'https://ctf.setodanote.net/web004/bmV4dG5leHQ/?'+params
      }();
      </script>
  </head>
  <body>
  <p>No flag here. Go to next.</p>
  </body>
</html>

のーふらぐひあー。ごーとぅーねくすと!(英語苦手なのがばれる)ってことで次へ

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/Redirect]
└─$ curl https://ctf.setodanote.net/web004/bmV4dG5leHQ/
<html>
  <head>
    <title>Next-Next</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !function() {
        var params = new URL(window.location.href).searchParams;
        location.href = 'https://ctf.setodanote.net/web004/b25lLXR3by10aHJlZQ/?'+params
      }();
      </script>
  </head>
  <body>
  <p>No flag here too. Go to next.</p>
  </body>
</html>

のーふらぐひあーとぅー!ってことで次へ

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/Redirect]
└─$ curl https://ctf.setodanote.net/web004/b25lLXR3by10aHJlZQ/
<html>
  <head>
    <title>Branching point</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <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>
  </head>
  <body>
  <p>You need the correct parameters to get the flag.</p>
  </body>
</html>

正しいパラメータが必要そう?なんかわからんが無視して上の方にアクセスする。

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/Redirect]
└─$ curl https://ctf.setodanote.net/web004/dGFjaGlrb21hX2thd2FpaV95b25l/
<html>
  <head>
    <title>GO!GO!GO!</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !function() {
        var params = new URL(window.location.href).searchParams;
        var callback = params.get('callback');
        var data1    = params.get('data1');
        var data2    = params.get('data2');
        var data3    = params.get('data3');
        var data4    = params.get('data4');
        if (callback == 'getFlag' && data1 == "2045" && data2 =="0907" && data3 == "BiancoRoja" && data4 =="1704067200") {
          location.href = 'https://noisy-king-d0da.setodanote.net/?'+params;
	}else{
	  location.href = 'https://ctf.setodanote.net/web004/ZGFtbXlmbGFn/hint.html?'+params;
	}
      }();
      </script>
  </head>
  <body>
  <p>Yes! Go to next.</p>
  </body>
</html>

ヒントが気になったので先にヒントにアクセスしてみた

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/Redirect]
└─$ curl https://ctf.setodanote.net/web004/ZGFtbXlmbGFn/hint.html
<html>
  <head>
    <title>Wrong param, No flag</title>
  </head>
  <body>
    <h1>Nice try!</h1>
    <p>You need the correct data parameters to get the flag.</p>
  </body>
</html>

正しいパラメータをいれなさいとのこと。前ページの分岐の情報から

if (callback == ‘getFlag’ && data1 == “2045” && data2 ==”0907″ && data3 == “BiancoRoja” && data4 ==”1704067200″) {
location.href = ‘https://noisy-king-d0da.setodanote.net/?’+params;

このへんをパラメータとして入れたら良さそうなことがわかるので

https://noisy-king-d0da.setodanote.net/?callback=getFlag&data1=2045&data2=0907&data3=BiancoRoja&data4=1704067200

組み立てて、curlおじさんにわたす(パラメータが含まれているのでURLをカンマで囲むことを忘れずに)

┌──(nmz㉿kali)-[~/work/20210822_setodaNoteCTF/Redirect]
└─$ curl 'https://noisy-king-d0da.setodanote.net/?callback=getFlag&data1=2045&data2=0907&data3=BiancoRoja&data4=1704067200'
<!DOCTYPE html>
<body>
  <h1>Nice work!!</h1>
  <p>flag{Analyz1ng_Bad_Red1rects}</p>
</body>

長かった〜

OSINT

tkys_with_love

後輩元気そうでよかった。なんのこっちゃわからんかったので「C6DF6」でぐぐったら豪華客船のページがでてきたのでそれがフラグ。いいなあ。

Dorks

Google Dorkingとは、検索演算子と特殊文字列を使って、ハッキング候補をぐぐることです。login.php を URL に含むページを検索するための検索語句は「site:」なので

site:login.php

ってやると検索できます

filters_op

この問題、実は2017年5月半ばって聞いただけで「アレか…」ってピンときたので、エスパーいけそうだったけど一応検索してみる。

Twitterって普通に過去ツイートを遡るの大変だよね。ここの検索窓に演算子を入れると検索を絞り込むことができます。

from:cas_nisc since:2017-05-15 until:2017-05-16

なつかしいなーあの頃(遠い目)

MAC

MACといえばMacintoshでもMcDonaldでもなくMACアドレスですよ(そうか?)MACアドレスとはネットワーク機器やネットワークアダプターに付いている固有の識別番号でのことです。機器をつくったベンダーによって番号が決まっているので調べることができます。

MACアドレスを検索できるサイトがあるので、そこで調べたベンダー名の頭文字をとるとフラグになりました。

MITRE

MITREと聞けばアレ勢のかたならおなじみのMITRE ATT&CK。MITRE ATT&CKとは、サイバーセキュリティの攻撃者が利用する可能性のある手法を体系的に整理したフレームワークのことです。

それぞれの手法にテクニック番号という一意の番号がふられているので、T****というのはその識別子のことだとわかります。でも公式サイトにいっても識別子で検索できない…?正確に言うとできるのとできないのがあって混乱しました。なんでやねーん。

仕方ないので普通にGoogleで検索してでてきたテクニックの名前の頭文字を雰囲気で拾ってフラグにしました。本当は検索する良い方法があるのかもしれない。

Ropeway

ファイルをダウンロードすると風景写真がでてきます。多分普通に画像検索でもいいんですが、OSINT問題で風景っぽい写真が出てきたときの個人的なオススメはGoogle Lensです。

一発でわりとドンピシャな画像が出てくるので重宝してます。

N-th_prime

OSINT問題だというのにOSINTできなくて困っていたところ職場の強CTFerに計算プログラムを教えていただいたので計算して答えを求めてしまった。こちら↓をお借りしました

brew tap kimwalisch/primecount
brew install primecount
primecount -n 72057594037927936

時間かかるかなーと思ったんですが私の古めのMacBookでも10分くらいで計算終わりました。

Crypto

base64

base64って暗号なのかな。と思いつつCyberChefに投げる。(これくらいならコマンドでやったほうが早そう)

ROT13

タイトル見ただけで何も考えずにCyberChefに投げる。(便利だなー)

pui_pui

チャットで暗号文を送り合う組織なんかかわいいな。とかなんとか言いつつこれもCyberChefに投げる。(ほんとに便利だなー)

tkys_secret_service

雰囲気的にROT13みを感じたので一回CyberChefに投げる(またか)

The priteftoiu ic Ciutrilled Uuflazzocoed Iucirmatoiu (CUI) rezodeut ou uiucederal zyztemz aud irgauosatoiuz oz ic paraminut ompirtaufe ti cederal ageufoez aud fau doreftly ompaft the aboloty ic the cederal giverumeut ti znffezzcnlly fiudnft otz ezzeutoal mozzoiuz aud cnuftoiuz. Thoz pnblofatoiu privodez ageufoez woth refimmeuded zefnroty reqnoremeutz cir priteftoug the fiucodeutoaloty ic CUI wheu the oucirmatoiu oz rezodeut ou uiucederal zyztemz aud irgauosatoiuz; wheu the uiucederal irgauosatoiu oz uit filleftoug ir maoutaououg oucirmatoiu iu behalc ic a cederal ageufy ir nzoug ir iperatoug a zyztem iu behalc ic au ageufy; aud where there are ui zpefocof zacegnardoug reqnoremeutz cir priteftoug the fiucodeutoaloty ic Flag oz clag{pnopno_far_ic_mil} CUI prezfrobed by the anthirosoug law, regnlatoiu, ir giverumeutwode pilofy cir the CUI fategiry lozted ou the CUI Regoztry. The reqnoremeutz apply ti all fimpiueutz ic uiucederal zyztemz aud irgauosatoiuz that prifezz, ztire, aud/ir trauzmot CUI, ir that privode priteftoiu cir znfh fimpiueutz. The zefnroty reqnoremeutz are outeuded cir nze by cederal ageufoez ou fiutraftnal vehoflez ir ither agreemeutz eztablozhed betweeu thize ageufoez aud uiucederal irgauosatoiuz.

英語っぽいけど所々なんかヘン。読めるところもあるけどandっぽいところがaudってなってたり、ofっぽいところがicだったりする。一部の文字だけ換字式暗号になってると思われる。

昔超ヒマな現場にアサインされたとき、ヒマすぎて限られた環境の中でCTFを解くという遊びをやっていて何故かExcelVBAで換字式暗号解読ツールをつくったことを思い出して使ってみたら意外と使えた。多分世の中にはもっと便利なツールもあると思いますがもしよかったらどうぞ。うまく動かなかったらごめん。

試行錯誤しながら文章がそれっぽくなるように文字を当てはめていって解いただけなのでツールに頼らなくても解ける気がする。

lets_bake

ここへ来て今回散々使ってきたCyberChef先生の問題が。

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

どういうアレだか実はよくわかってないんだけど ]b2[s で切るとbase64になるぽいことに気づいたので結局CyberChefに投げる。(…)

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

レシピがでてきたのでCyberChefのLoad recipeをクリック

出てきたフォームにレシピを入力してLOAD

あとはInputに問題文のテキストを入力するだけでできあがり

CyberChefはサイバースイスアーミーナイフ(十徳ナイフみたいなやつ)と呼ばれたりしますが、個人的にはどっちかというと電子レンジっぽいと思ってます。便利すぎる。

Rev

Helloworld

ダウンロードしてきたらexeだったのでコマンドラインで実行した。
なにか引数をつけて欲しそうだったので試しにflagと入れたら通ってしまった…
完全に勘で解きました。ごめんなさい。

Forensics

paint_flag

ファイルをダウンロードするとWordファイルが出てくるが、フラグの部分が塗りつぶされている。

本文にもヒントが書いてあるけど、.docxファイルは実はzipファイルです(.xlsxとか.pptxも同様)なので拡張子を変更してzipファイルとして扱うことができます。

zipにしたうえで展開すると、画像系はmediaってフォルダに入ってることが多いです。開くと黒塗りされてない画像がおいてありました。

Mail

ファイルをダウンロードするとmsfファイル(メーラーThunderbirdのファイル?)が入っている。Thunderbird入れないとダメかなーちょっと面倒だなーと思ったらSent1ってファイルが読める状態だということを発見。

普通にVScodeで開くとBase64にエンコードされた添付ファイルがついていることがわかる。

Base64のところだけコピーして別のファイルに保存しておいて、zipファイルにデコードする。

base64 -d base64.txt > out.zip

出てきたzipファイルはパスワードもかかってないので普通に開くことができました。

Deletedfile

ディスクイメージってことなので、Autopsyを使う。インストールして実行して新規ケース。適当にケースに名前をつける

ディスクイメージを選択

データソースとしてダウンロードしてきたファイルを選んでNEXT

デフォルト設定でNEXT

ディスクイメージの解析がおわると、削除されたファイルのところに消したファイルデータが残っている。

browser_db

ファイルをダウンロードするとsqliteのファイルだった。コマンドでやってもいいけど必要な情報を探すのに手間取りそうだったのでGUIのツールを使う。

インストールして開くと圧倒的にみやすいーー!

データ構造のタブをぽちぽちいじってたら見つけました

MFT

MFT」とは、「Master File Table」(マスターファイルテーブル)の略で、どういう名前のファイルのファイルのデータがどこに入ってるんですよーって紐付けるためのインデックス情報が保存されている場所です。問題ファイルをダウンロードしてきましたが、このままだと読めないのでこちらのツールをお借りしました。

Mft2Csv64.exeを実行して「Choose $MFT」で問題ファイルを選び「Start Processing」をクリック。

ちょっと時間かかりますが、暫くするとMFTファイルの内容がCSVで出力されてきます。

今回は問題文に探したいファイルのサイズが書いてあるので、フォルダの中身をまとめてVScodeで検索しました。

極秘情報のファイル名わかったよー。

tkys_another_day

後輩に何があったんや…。気になりながらファイルを開くとpngファイルで断片的に情報が消えているような感じのやつ。

これを見たときに完全に勘なんですけど、gifアニメの途中みたいだなって印象になったんですよね。それでpngでもアニメーションするやつってあるのかな?と調べたらこのサイトに行き着きました。

ファイルをアップロードしたらコマが分割して確認できたのでこれをつなぎ合わせてフラグにしました。

Programing

echo_me

まず挙動を確認する。表示されてくる数字をそのまま返すと次に進めるやつ。

私はこういう問題解くときのお作法が全然わかってなかったのですが、1回ctrl+cでncコマンドの接続を切ります。

vi echo.rb

viとかでファイルをつくって以下のコードをコピペ(職場の強CTFerが書いておいてくれました…感謝…)

require 'socket'


if ARGV.size == 2 then
  $sockin = TCPSocket.open(ARGV[0], ARGV)
  $sockout = $sockin
  $interactive = false
else
  $sockin = STDIN
  $sockout = STDOUT
  $interactive = true
end

def print_if_int(str)
  if $interactive then
    print(str)
  end
end

def print_if_not_int(str)
  if !$interactive then
    print(str)
  end
end

print_if_int("Interactive mode\n")

while true
  response = $sockin.gets
  if response == nil
    break
  end
  print_if_not_int(response)

  if response =~ /^echo me: [0-9]+/ then
    answer = response[/echo me: ([0-9]+)/, 1]
    print_if_not_int(answer.to_s + "\n")
    $sockout.write(answer.to_s + "\n")
  end
end

$sockin.close

:wqで保存して、接続先のIPアドレスとポート番号を指定してruby実行。

user@7c0882d024b8:~$ ruby echo.rb 10.1.1.10 12020

なにもしてないのに解けた!(すいません…)

Pwn

tkys_let_die

招かれているのに門が開かないってどういうことですか。後輩の家はゾルディック家ですか。などとどうでもいいことを考えつつターミナルにつなぎます。

名前を尋ねられて答えると扉が閉まるらしい。理不尽。

ソースをみるとcloseの文字列とopenの文字列を比較して同じだったらprintFlagが実行できるらしい。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

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

int main(void) {
    char gate[6]="close";
    char name[16]="..";
(中略)
    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;
}

Pwnの最初だし多分BoF問題だろうという雑な想像をして長い名前を入れてみる

表示が壊れてGate is closeじゃなくなった。Gate id aaaaa ってなってるところを、Gate is openにできればよさそう。

どこにopenて入れればいいか探すために入力を変えてみる。

「123455678901234567890abcde」で表示があふれることがわかったので「123455678901234567890abcdeopen」ってやるとちょうどいい場所にopenが入って扉が開く。

まとめ

難易度の調整が絶妙で、解ける楽しみを味わいつつ、ちゃんと難しい問題では学びのある素晴らしいCTFだったと思います。運営の皆様ほんとうにありがとうございました!わからなかった問題はこれから復習します!