SECCON CTF for Beginers 2020 readme Write Up(自分用)
おはようございます。こんにちは。おやすみなさい。
間違えたこんばんは。aki*famです。
自分用にCTF for Beginners 2020(長いから以下CTF)の内の一問であるreadmeのWriteUpを書きたいと思います。
(追記)一問しか取り上げてないのはこの問題しか競技中に希望を見いだせなかったからです。
問題
与えらえたもの
・readme(Zipファイル)
・ネットキャットのコマンド(URLとポート番号付き)
まずは自力でチャレンジ
何故か自分の環境ではZipファイルをダウンロードすると拡張子のZipの後になんか要らん文字列がくっついてきてPCにZipファイルとして認識されなかった。
そのためまずは「あれ?このファイルを分析するところから始めるのか?」と思い、拡張子の後ろの文字列を消せばよかっただけなのにうさみみハリケーンにかけてみたりバイナリファイルをのぞいてみたりLInuxでFileコマンドにかけてみたりと物凄い無駄な労力を費やした。
もうこの時点で戦意を30%ほど喪失
その後、ようやく「この後ろの文字列要らんくね?」と気づきようやくZIpファイルを入手。そのZipファイルの中にはServer.pyというPythonのファイルが入っていた。
また自分はncコマンドを知らなかった(無知)ので問題文で与えられたコマンドの意味が分からずこれを調べるのにも数十分を費やした。
ここで更に戦意を10%喪失。
与えられたncコマンドをうってみたが入力に対応して出力が変わるプログラムがアクセス先っぽい。
とりあえずPython読む自信ないけどPythonファイルを開いてみた。
うん!分からん!!!
とりあえず何かモジュールをインポートしてるのでosモジュールを調べて、どうやらosに依存している機能を利用するためのモジュールらしいという事が分かった。
あと、いかにもFlagが入っていそうなファイルが書いてある(/home/ctf/flag)
このPythonファイルは入力をpathという変数に代入し、内容によって出力が変化する。
つまりncコマンドで接続した先で動いているプログラムは恐らくこのPythonファイル。
この4つの条件文は上から
・入力されたパスが存在しなければFile not foundを返し
・入力されたパスの先がファイルではなかった場合Not a Fileを返し
・入力されたパスの最初が/から始まっていない場合Use absolute pathを返し
・入力されたパスの中にctfという単語があるとPath not allowedと返される
この上の条件をすべて回避すると読み込みモードで入力されたパスの先のファイルを開いて中身を見れるっぽい。
ここまでは競技中に理解できたが、自分の頭の中では「相対パス?でも条件の中に/から始まるっていう条件あるから絶対パスしか無理じゃん。でも絶対パスだとctfっていう文字列回避できないし・・・」となって詰んでました。
ここで戦意完全喪失。
そのまま競技終了。今年もダメだったよ・・・
競技後他の方のWriteUpを見て再チャレンジ
いろいろな方のWriteUpを見た結果、どうやら絶対パスのような書き方で相対パスを書く方法があったらしい。
まずはこのPythonファイルが動いているディレクトリを確認する。
/proc/プロセスIDにプロセスに関する情報が入っているらしく特に/proc/selfには今現在のプロセスの情報が入っているらしい。
/proc/self/environに環境変数が格納されており、/proc/self/cwdはこれ以降に記述されたパスをカレントディレクトリに結合する役割があるらしい。
つまりカレントディレクトリが/home/pythonだとすると/proc/self/cwd/server.pyは
/home/python/server.pyと同じ意味を持つ。
/proc/self/environの中のPWDにカレントディレクトリは記述されているらしい。
今回のカレントディレクトリは/home/ctf/serverなので/proc/self/cwdは/home/ctf/serverを意味する。
目的のファイルは/home/ctf/flagなので絶対パスを/proc/self/cwdを使って記述すると
/proc/self/cwd/../flagとなる。
そしてこのパスは/で始まっており、パスの中にctfという単語を含んでいないため条件文をすべて回避することができる。
この/proc/self/cwd/../flagが答えらしい。
/proc以下にはいろいろな情報があるようなのでこれから勉強します。
振り返り
今回のCTFも解法が浮かぶ問題がほとんどなく、ほぼ唯一解法が浮かびかけたこの問題も結局解くことができなかった。去年に比べると完全にお手上げにならなかったこととこうして一問でも解けなかったなりにWriteUpを書くことができるようになっている事は進歩かもしれない(超ポジティブシンキング)
今度のCTFはもっとWriteUpをかける問題が増えたらいいな~