[ksnctf] KanGacha

ksnctfにチャレンジ 第31問目です。

※ksnctfは常駐型のCTFサイトです。 ※問題のページはコチラです。

KanGacha

どこかで聞いたことがあるような名前のガチャで Yamato を引き当てるとクリア…ですが $shipname[10] = Yamato にもかかわらず

乱数として得られるIDは 0〜9までで、何回やっても Yamatoを引くことはできません。

しかし、以前にドロップした艦はCookieに記録されるようになっているので ここを上手く改ざんすれば前に引き当てたことにできるはずです。 ただ、ドロップ艦の情報は  sha512( ID + salt(FLAG) ) したシグネチャ で改ざん防止 されているためそのまま書き換えることはできません。

しかし 既知文字列とそのhash化文字列、saltの長さが分かっている時 その文字列に 他の文字列を加えた文字列のhash化文字列 は計算することができます。

今回は  ship_id 1 のみドロップした時 シグネチャは 

24b8c89ea8f5f8854d60e253f23bb5b8856d8a135c19af423db354ac60a1a4c932cecd800a0550211e8cc6e28e73e1ac93e7b9c786adc24702e48701c5

ということがわかり、 saltは FLAG文字列なので FLAG_{16文字} の21文字ということがわかっています。

こういう改ざん手法を Length Extension Attack といい HashPump という優秀なツールで 簡単に計算できます。

↑ページの使い方に習って

 $ ./hashpump -s "24b7447578c89ea8f5f8854d60e253f23bb5b8856d8a135c19af423db354ac60a1a4c932cecd800a0550211e8cc6e28e73e1ac93e7b9c786adc24702e48701c5"  -d "1" -a ',10' -k 21

 c9ef7bfe7acb622ecda2d108392d190a1540949652c72be0d49fca0946c3b15cbbd4c877b69ac90a3ef04de1b890a0527070e26b317e42bc6e37738b5a2de02d

1\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb0,10

※id='1' から id='1,10' が作りたいのですが計算の都合上 \x00 というパディングが挿入されています この時の シグネチャが一行目の出力です。

これをCookieに仕込んでアクセスすればクリアですが、 パディングに使われている \x00 があるとPHPが 文字の末端と勘違いして肝心の .10 を拾ってくれなくなるのでURLエンコードしておきます。

ここまでできたらあとは

$ curl 'http://ctfq.sweetduet.info:10080/~q31/kangacha.php'  -H 'Cookie: ship=1%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%B0%2C10;signature=c9ef7bfe7acb622ecda2d108392d190a1540949652c72be0d49fca0946c3b15cbbd4c877b69ac90a3ef04de1b890a0527070e26b317e42bc6e37738b5a2de02d'

curl で送りつければクリアです。