CTF challenges focusing on OS command injection
README.md

Mark2 #

ヒント #

formatの変え方

formatにはpublic/index.htmlであらかじめ定義されたhtml、docx、latexのいずれかが入ります。ここに任意の文字列を入れる方法はいくつかありますが、ブラウザだけでやるのであれば

  1. 開発者ツールを開く
  2. 「要素」(Chrome)、「インスペクター」(Firefox)などでoption要素を探し、value属性を書き換える
  3. 「Convert & Download」ボタンを押す

という手順がお手軽だと思います。

出力の確認方法

index.jsはコマンド実行後の標準出力(stdout)を無視して、出力されたファイルだけを返すという実装になっています。よって、cat flag.txtなどを注入できてもフラグの中身は読めないでしょう。このような場合には、以下の手段を取ることができます。

通信が制限されていない場合 #

本問題はこちらに該当します。この場合は簡単で、読んだフラグの内容を標準出力ではなく外部のサーバーに飛ばせば良いです。自分でサーバーを用意しなくても、webhook.siteのようなサービスを使うことができます。

通信が制限されている場合 #

sleepコマンドで遅延を発生させることができる場合、条件付きでsleepコマンドを実行するようなスクリプトを書くことで、その条件が真か偽かを判別することができます。こういった、サーバーの応答時間によって情報を得る行為はtime-based攻撃などと呼ばれます。

例えば「フラグの1文字目がaならsleep 2を実行する」というような感じで、総当りすることでフラグを入手することができます。実際にはもっと効率を良くするため、二分探索などをする必要があるでしょう。

フラグが欠けている

curlコマンドを使った場合、{}が含まれないフラグが手に入るかもしれません。cURLにおいて波括弧は特別な意味を持つので、--globoff(または-g)オプションを付けると完全なフラグが得られます。

面倒くさければ、自分で波括弧を補完してしまっても本問題においては差し支えありません。