KOSENセキュリティコンテストに参加した話
はじめまして、そんちょうです.
KOSENセキュリティコンテストにraspberryで参加してきました.
2300点で18位でした。目標としては半分以上の順位を目指していたのでまあまあの結果でした.
解答することのできた問題のいくつかのWriteUpを書いていきたいと思います.
01 Binary 100 フラグを答えろ
バイナリをダウンロードしたのでstrings打ったらフラグらしきものが出てきたのでいらないものを消したらフラグゲット.
02 Binary 100 ファイル名を探せ
ファイルをダウンロードしたのでstrings打ったら、ファイル名らしきものがたくさんでたのでgrepでSCKOSENを検索.
03 Binary 200 ボスを倒せ
ユーザー名を入力してボスと自動で戦うプログラムが動いてました.
適当な文字数でユーザー名を増やしてたらユーザーとボスのHPも増えたので,そこから入力する文字数を減らしたり文字を変えたらボスのHPが倒せる範囲になったのでフラグが取れました.
ちゃんとした解放は先人のを参考にします.
05 Crypto 100 簡単な符号化2
自分の解くことのできた問題で1番難しかったです.
ファイルにアクセスすると以下の文字列が
NGI1MDA0MDMwMDE0MDgwODAwMDgyYzU2NGI1MzAwMDAwMDAwMDAwMDAwMDAwMDAw MDAwMDAwMGIwMDAwNzI1ZjZjNjUyZjczNzIyZTZjNjVhZDczZGQ5MjAzNGEwYzQx ZWY4NTE0ZmJlZTQzZDliYjEwNTY5ZDkxOGRlZGJkMDhhOTEzMTAwZmIyNjY0M2Ji M2YzYjQ2NjQ2ZmFkMjBlZjJlOGE0NTk0Y2JjMTI3MjQ3Y2U3NzQ4NGIzYmJhOTNm OTYxNzYyZWNiMGQwNWE2OTFjNTBiNDRjOGMyZTllMWFmNzBlMWJlYmY1ZDhlZWFi NGY5MWFhNTQ0ZjI0NjUyZTc3NTVkNjQyOTUzMDZlOTJiMzExZDg5OTZlNTNlMjYy Mjc1MDE0NDNhNTRmMzI5NjIyNjJhNDczNzE5MWI2ZGIyOGQ3M2QzZjlmYTBhYTc5 ZDViZDdiMjAwMWJiNzg3NWZjNGJlZjFiMGMzOGIwY2VlNjhkNzNkOTE3MjhkMDIy MjE3Mzg1NGI0NGQwNzVlMTZhOTJjNTIyYWU3MTI0MTkxNzIzNzUwZGExZmJmM2I2 YTI4NzAxYTk5NzgwYjZiOWU1N2Y1YmJhZTJlMGUxNzNkOTYwMjMyZTRhNTE0NDRi ZmY1NzM0NDk3YzU3YmNjM2IxNDY3NWY4NGZlMjU1OWFiMzg3ZTg2ZjAxZGY0YjUw MDgwN2FkOTgwYWM1MDBkZDAwMDAwMjQ0MDAwMDRiNTAwNDAzMDAxNDA4MDgwMDA4 MmM1NjRiNTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMDAwMDZmNzc2NDcy NjQyZjYzNmY2ZDc1NmU2NTJlNzQ2ZDc4ZWQ2YzVkOThkYjZiMTQzMGVmODYyYmY3 以下略
とりあえずコピーして.txtファイルにしてbase64でデコードしてみた.
4b5004030014080800082c564b53000000000000000000000000000b0000725f6c652f73722e6c65ad73dd92034a0c41ef8514fbee43d9bb10569d918dedbd08a913100fb26643bb3f3b46646fad20ef2e8a4594cbc127247ce77484b3bba93f961762ecb0d05a691c50b44c8c2e9e1af70e1bebf5d8eeab4f91aa544f24652e7755d64295306e92b311d8996e53e26227501443a54f32962262a4737191b6db28d73d3f9fa0aa79d5bd7b2001bb7875fc4bef1b0c38b0cee68d73d91728d0222173854b44d075e16a92c522ae7124191723750da1fbf3b6a28701a99780b6b9e57f5bbae2e0e173d960232e4a51444bff5734497c57bcc3b14675f84fe2559ab387e86f01df4b500807ad980ac500dd0000024400004b5004030014080800082c564b53000000000000000000000000001100006f776472642f636f6d756e652e746d78ed6c5d98db6b1430ef862bf7ee82db1b086da999b6531ba65d654816bb0ab20bdb2dfa22524266e2ff63527d3b2c08fdacc3e86c10a2c8ace747cf3d9639a58cabcb4a073b0615242ce6d1010430c4039e325663e026f57e6ce90602434a439619c2c04a291e3570777dc759cf3914b63d310a30c54c013cc95b9562885575427146b92685e2cb3e8d3851790ce006b90f3880996b4a07117381721a988115b1525c4da89657e341733282b130f3071c11120da8aaaf50b0daad4fee77f1b494eae3513e2e6b217386793294a08589a4214b9d66144c48f6ead81e744fa25ce4fac2c85120a7c6b354782f543b24a18c70c13bd518a828bda67cacb740a0b54775f29f6adf25568a668db27d50a5b66e56c2984c9a278262fef5f8902a11bd1aea8ecd794efececf9a1fb7c5e325a6122cc42304b0346074d66aca42bdf3c56db2e18790a96604f7ea0d0778024936e6026b6b02cd913480747856bd0da62d9c44e8ce52b6374b48a50d5a364f38598075a220cc1035f5eb472c9877d66d70eb8d1da3c6dcf022fce617ac65512758ea974fa7b67b9bdc4d927f1f466b94507ff8bef2 以下略
出力された数列をバイナリエディタに突っ込んでみたらKPやowdrd/comune.tmxやらの文字列に注目すると,ZIP形式でwordのファイルかなと思ったけどこの状態では開けなかった.
ちょっと考えてたら1byteずつで入れ替わっていることに気づいたので元に戻すpythonコードを書いてみた.
#! /usr/bin/env python # -*- coding: utf-8 -*- import re buf='4b5004030014080800082c564b53000000000000000000000000000b0000725f6c652f73722e6c65ad73dd92034a0c41ef8514fbee43d9bb10569d918dedbd08a913100fb26643bb3f3b46646fad20ef2e8a4594cbc127247ce77484b3bba93f961762ecb0d05a691c50b44c8c2e9e1af70e1bebf5d8eeab4f91aa544f24652e7755d64295306e92b311d8996e53e26227501443a54f32962262a4737191b6db28d73d3f9fa0aa79d5bd7b2001bb7875fc4bef1b0c38b0cee68d73d91728d0222173854b44d075e16a92c522ae7124191723750da1fbf3b6a28701a99780b6b9e57f5bbae2e0e173d960232e4a51444bff5734497c57bcc3b14675f84fe2559ab387e86f01df4b500807ad980ac500dd0000024400004b5004030014080800082c564b53000000000000000000000000001100006f776472642f636f6d756e652e746d78ed6c5d98db6b1430ef862bf7ee82db1b086da999b6531ba65d654816bb0ab20bdb2dfa22524266e2ff63527d3b2c08fdacc3e86c10a2c8ace747cf3d9639a58cabcb4a073b0615242ce6d1010430c4039e325663e026f57e6ce90602434a439619c2c04a291e3570777dc759cf3914b63d310a30c54c013cc95b9562885575427146b92685e2cb3e8d3851790ce006b90f3880996b4a07117381721a988115b1525c4da89657e341733282b130f3071c11120da8aaaf50b0daa以下略' list = re.split('(..)',buf)[1::2] #print list ans = [] judge = 0 i=0 flag = "" for j in list: judge = i%2 print judge if judge==0: ans.append(list[i]) elif judge!=0: ans.insert(i-1,list[i]) i+=1 k=0 for h in ans: flag += str(ans[k]) k+=1 print flag
即席で書いたので汚いコードです.配列が偶数番目ならそのまま追加,奇数番目ならその前の位置に格納して出力する仕組みです.
元に戻ったバイナリが出力されたのでdocxファイルにして表示したらフラグが取れた.
100点問題のレベルじゃないと思いましたまる
15 Network 100 寝坊気味のコンピュータ
pacingのファイルが渡されたので中身を見てみたらフラグがいくつかのパケットに分割されていたのでくっつけたらフラグゲット.
16 Network 100 ログインしたいんだ!
これもpacingが渡されました.中身をみてみたら
basic YWRtaW46U0NLT1NFTntiYXNpY19pc191bnNlY3VyZX0=
があったのでbase64デコード
admin:SCKOSEN{フラグ}
フラグがとれた.
18 Web 100 ログインせよ
アクセスするとよくあるログインフォームが.
adminとしてログインしないといけないみたいなのでいつもの
user:admin pass:' or 1=1 --
フラグゲット
19 Web 100 灯台下暗し
アクセスするとログインフォームのしたにこんなものが
$try = false; $login = false; if( isset($_POST[‘name’]) && isset($_POST[‘password’])){ $name = htmlspecialchars($_POST[‘name’], ENT_QUOTES); $password = htmlspecialchars($_POST[‘password’], ENT_QUOTES); $db = new SQLite3(‘data.db’); $stmt = $db->prepare(“SELECT name FROM users WHERE name = ? AND password = ?“); $stmt->bindValue(1, $name, SQLITE3_TEXT); $stmt->bindValue(2, $password, SQLITE3_TEXT); $rows = $stmt->execute(); $row = $rows->fetchArray(); $try = true; $login = $rows && $row[‘name’]; $db->close(); }
適当にsqlインジェクションしようとしてもできなかった.
urlの末尾にindex.phpとか打ってた時にdata.dbも試してみたらダウンロードできたのでsqlite3を起動してアクセスしてみた.
$ sqlite3 data.db SQLite version 3.8.10.2 2015-05-20 18:17:19 Enter ".help" for usage hints. sqlite> .tables users sqlite> .schema users CREATE TABLE users(name, password); sqlite> select name, password from users; admin|SCKOSEN{フラグ}
これに気づけなくて解くことができたのがラスト5分でした.
自分が解いたのはこのくらいです.
感想
他のチームメイトがKoHやってる隙にといたので割と多く解けました.
200点問題の難しいものとかはチームメイトに投げていたので自力で解けるようになりたいと思いました。
こういうコンテスト系は初めてでしたが楽しかったです.
最後に
チームメイトと引率の先生方,お疲れ様でした.