KOSENセキュリティコンテスト2017に参加した話

概要

昨日今日(10月21日, 22日)の2日間、KOSENセキュリティコンテスト2017が木更津高専主管で開催されていました。実は去年もKOSENセキュリティコンテストに参加していましたが、今回は前回大会と競技形式が変わり、Jeopardy(クイズ)形式とKoH(King of Hill)形式というラインナップでした(KoHなどの解説はこちらなどを参照ください)。
私はチームEAnbai(いつもの)のメンバーとして参加し、JeopardyのWeb問題などを解いたり、KoHを触ってみたりしていました。一日目を12位で折り返したチームの最終成績は35チーム中5位で、惜しくも表彰には届きませんでしたが、記憶に新しい内に解いた問題のwriteupや反省をしたいと思います。

EAnbaiは2800ptで5位でした

解いた問題のWriteup

ログインせよ(Web, 100pt)

問題のURLが渡されるのでアクセスをすると、ログインフォームが出てきます。すると「adminでログインしてね」(記憶違いかもしれない)と言われるので、ユーザー名に「admin' or 1=1 ---」を入力したらフラグが出ました。

灯台下暗し(Web, 100pt)

先程の問題と同じようなログインフォームが出てきて、その下の方にそのロジック部分風のソースコードが貼ってありました。adminのパスがフラグ、となっておりさっきよりは複雑なSQLi問なのかな?と思いながらソースを眺めていたらデータベースを読み込んでいる部分が目に入り、おもむろにURLに「/data.db」をつけたらデータベースが降ってきました()
それをsqlite3で開き、.taするとユーザーのテーブルが見えるのでselect * from usersするとフラグが見えました。灯台下暗し…。

Web1(Web, 200pt)

難読化されたJavaScriptのファイルが見えるページで「deobfuscate js and find the key」と言われるのでどのツールで難読化されたのか知ろうと思い「”___=window;”」みたいなキーワードで検索すると、jsrollerというのが出てきて「これかなぁ」と思って見たものの、「これ難読化解除機能ない説ある…?」となりました。仕方がないので難読化されたままのコードをBeautifyして夕食後に見直したらなんとなくやってることの雰囲気がわかったので、キーを計算していそうな所にconsole.logを挟み、DOMがloadするまで待つみたいな処理を消すなどの調整をいくつかして開発者コンソールで実行したらフラグが見えました(調整後のコードは以下)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
___ = window;
__ = document;
s = "shift";
m = ["length", "join", "forEach", "parseInt", "toString", "toUpperCase"];
__ = [18234125, 323835316891, 11523, 907531478812, 744387234, 44203240442235, 844002446169231, 4601, ];
____ = {
_: m[s](),
___: m[s]()
};
____.__ = `____` [
[____._]
];
__[m[s]()]((n, _) => {
__[_] = `${___[m[s|s]](n,_+1)[m[s^s^1]](0O22<<1)[m[-~-~s]]()}{${n}}`;
console.log(__[_])
});

他のフラグはleetっぽい雰囲気ある中でそうではなかった上、「フラグの文字列ハードコードされてるんかい!」という気持ちになり、submitするまで合っているか不安な問題ではありました。

Web2(Web, 200pt)

JavaScriptの穴埋め問題みたいな感じになっていて、10個あるピースを全て正しく配置してalert(1)されたときのコードの(?)ハッシュ値がフラグ、という問題でした。
「eval」「call」「(0o000101)」などがピースになっていて、「alert」という文字列を2進・8進・16進文字で表したやつを連結して小文字にして…という意図がわかってからは開発者コンソールでぽちぽちと試しながらやりました。

1
2
3
4
window["eval"]["call"]`${
[(0o000101), (0b1001100), (101), 0x52, 0x54]
["map"](x=>String["fromCodePoint"](x))["join"]("")["toLowerCase"]()+"(1)"
}`;

Weak RSA2(Crypto, 300pt)

Weak RSA1はチームメイトに任せてこっちをやっていました。公開鍵(N, e1)、(N, e2)とそれらを使って暗号化されたc1, c2が渡されました。また問題文中に「Same modulo, diffrent key.」とあったのでCommon Modulus Attack(こちらが参考になります)か~ということでpythonでdecryptして出てきた値をbinascii.a2b_hex(n[2:])したらフラグが出ました。

終わりに

この他にもいくつか分業的にJeopardyの問題を触ったりしましたが、KoHについてはほぼ手が出ず、辛かったです。
チームのバランス的には結構良く、比較的きれいに分業できていたのでその点は良かったと思いますが、KoHや難易度の高い問題に取り組んでいる時の自分含めた各位の進捗具合の把握などはまだまだ課題かなと感じました。
また個人的に、暗号も面白いな~と感じることが多くなってきたのでちゃんとできるようになるためにも数学を勉強し直そう…と思いました。

簡単ではありますが、以上です。
チームメイトの皆さん、担当教員の先生2日間ありがとうございました。