今回は常設ctfの中でかなり有名なksnctfのVillager Aに挑戦してみました。

通称村人Aと呼ばれるこの問題と、同じくksnctfのVillager B(村人B)はpwnのチュートリアルと言われています(とどこかのブログで読んだ)。

 

1. SSHでログイン

まずは問題文。SSH,ID,Passwordが書かれているので、まずSSHでログインしてみましょう。

 

SSH (secure shell)とは、リモートコンピュータとサーバーを通信するためのプロトコル。データやパスワードが暗号化されないtelnetと比べ、sshはそれらが暗号化されるのでより安全に通信できます。

linuxでは、

ssh [オプション] ホスト名 [コマンド]

でログインすることができます。今回の場合、ポート(10022)が指定されているので、-p コマンドを使ってログインします。なお初めて接続する場合は、「Are you sure ~~ connect?」(本当に接続して大丈夫ですか?)的なことを聞かれるので、Yesと答えればOK. あとはパスワードを入力すれば、↑のスクショの通り問題なく接続できていることがわかると思います。

 

2.中を覗いてみる

続いて、lsコマンドを使ってみると、flag.txt q4 readme.txtの3つのファイルがあることがわかります。

いかにも怪しいflag.txtを実行しようとすると、案の定許可がないといわれてしまいました。readme.txtも同様。

一方q4を起動すると、

「Do you want the flag?」と聞かれ、noと答えるまで同じ質問が繰り返されるプログラムになっていることがわかります。どうやらこのファイルがこの問題を解く鍵になりそうです。。

 

3. "q4"の脆弱性を見つける

ここからは脆弱性を見つけ、攻撃の準備を進めていきましょう。個人的にもこのあたりから難しく感じたので、できるだけ丁寧に解説していきたいと思います。

一見、このプログラム挙動をみるかぎり、「Do you want the flag?」の質問がループされている部分に目が行きがちだが、実は脆弱性はそこではありません。

先ほど載せたq4を実行したときのスクショを見てください。1~3行目の部分、「whats your name?」と聞かれ、文字列を入力すると、「Hi,○○」と自分が入力した文字列がそのまま出力されています。

実はこれは、フォーマットストリング攻撃(書式文字列攻撃)が可能な脆弱性で、printf()、sprintf()など関数のフォーマット文字列の部分にユーザーが入力したした文字列が出力されるときに有効です。

フォーマットストリング攻撃の仕組みについては、今後別で記事を書こうと思っていますが、猿でもわかるほどわかりやすく書かれている記事を見つけたので、ぜひ読んでみてはいかがでしょうか。

フォーマットストリング攻撃について知りたい方はこちら

というより、これ以降はフォーマットストリング攻撃がわかっている前提で書いていくので、もし知らない方は読んでおかないと厳しいかもしれません。

 

ちょっと疲れたので、とりあえずここまで。

次回は実際に攻撃とメモリの書き換え、そして最終的にflagゲットのプロセスまで解説したいと思います。