KOSENセキュリティコンテスト2017 Write-Up
2017/10/21から10/22までのKOSENセキュリティコンテスト2017に即席チーム074m4K053nで参加してきました。
チームは経験者2人+未経験者2人のつもりだったですが、前者の1人が休日開講の必合格科目に出るために3人になってしまいました。
結果は2600点で全体7位/会場1位でした。忙しい中先生に時間を割いていただき残念な結果で終わらせることはできない状況だったので、なんとかなったかなと安心してます。
01 フラグを答えろ - Binary 100
a.outが与えられます。
stringsで見てもSCKOSEN{Hとしか出てこないので、ltraceで実行して共有ライブラリの関数呼び出しを探します。
入力した文字列とフラグをstrcmpで比較していました。そのまま取り出してSCKOSEN{h1dden_f1ag}です。
03 ボスを倒せ - Binary 200
ncするとゲームが始まります。
自分の名前を入力するときに0x10文字を超えて入れるとボスと自分の体力を書き換えられるみたいなのでボスの体力が負になるように
$ python -c 'print("A"*0x10 + "z"*4 + chr(0x1ff)*4)'
を入力してフラグが与えられました。
ボスの体力をchr(0x1ff)に決めたのには意味はないです。値が大きければいいかなと。
06 解凍して回答せよ - Crypto 100
zipが与えられるので解凍して2枚の画像をxorして回答しました。
うさみみハリケーンについてるソフトでxorしました。
gimpでできるって聞いたんですけど、どうやればgimpでできるのかワカラナイデス。
07 簡単な符号化 - Crypto 100
問題を忘れたのですが、確かbase64でエンコードされたデータが与えられるのででコードすればフラグが得られます。
発想力がないので思いつくのにとても時間を要しました。
11 君(脆弱性)の名は - Misc 100
CVE-2017-13088で調べたら出てきたKRACK AttacksとKRACKsをとりあえず入力しました。
最近話題だったらしいですけど全然知りませんでした。
WPA2のお話で、影響は「暗号化されたデータの盗聴」と「通信内容の改ざん」だそうです。暗号化アルゴリズムではなく管理プロトコルの問題のようです。
ArchLinuxはwpa_supplicantとhostapdに影響アリ。
12 便利なプロトコル - Misc 100
「便利なプロトコル 1998 dhcp」で検索したら「洗濯バサミ DHCP による IP アドレスの管理手法」がでてきました。とても画期的なアイディアです。フラグは英語のManagement of IP numbers by peg-dhcpのスペースをアンダーバーに置き換えたものだったと記憶しています。
相変わらず発想力がないので、今回解くのに最も時間がかかった問題になってしまいました。
15 寝坊気味のコンピュータ - Network 100
pcap-ngファイルが与えられるのでwiresharkで開きました。
Wake On LANのMACのところにフラグが分割されて入っているので、Follow UDP Streamで見ながらフラグを繋げました。
stringsコマンドで見たほうが圧倒的に早かったようです。
16 ログインしたいんだ! - Network 100
こちらもpcap-ngファイルが与えられるのでwiresharkで開きます。
httpでフィルタをかけると、401 Unauthorizedで跳ね返されてるのにめげずにGETし続けてるパケットたちが出てきます。
最後には200 OKになっているので、それに対応するGETパケットのAuthorizationを見ると、admin:SCKOSEN{basic_is_unsecure}と書いてあるのでこれをサブミット。
17 ファイル送信pcap - Network 200
与えられたpcapファイルをwiresharkで開きます。
httpでフィルタするとLenna.pngとlock.zipを送信していることがわかります。
File -> Export Objects -> HTTPでやり取りされているデータを保存します。
保存したデータをzipinfoで確認するとLenna.pngとflag.txtがパスワード付きZIPで圧縮されていることがわかります。
パスワードはわかりませんが、ZIPの中にあるデータの片方のデータが手元にあれば既知平文攻撃でパスワードを解除できます。
今回の場合はLenna.pngを既知の平文としてpkcrackします。
$ zip Lenna.png
$ pkcrack -C lock.zip -c Lenna.png -p Lenna.png -P Lenna.zip -d target.zip
$ unzip target.zip
出てきたflag.txtに書かれているフラグをサブミット。
20 Web1 - Web 200
サイトにアクセスしてソースコードからjsを見るとアンダーバーばっかの読みづらそうなjavascriptが与えられます。
読みやすいように一晩かけて変数名を置き換えました。
数字の大群を文字にして、アンダーバーに変換してることがわかりました。
アンダーバーに変換してるとこを削除して、ページを読み込みなおして、開発者ツールのコンソールから文字列が保存されているであろう変数名__をたたくとフラグらしき文字列が登場してサブミット。
K2 通信を解析しろ - KoH 30
最後まで解けてはないです。
pcapファイルが与えられるので、wiresharkで開いて何も考えずにhttpでフィルタをかけると80番ポートにアクセスしたら443へリダイレクトさせられてるのがわかります。
443にアクセスしたパケットを見ると、Webページのbodyにフラグが書いてあったようです。それをサブミット。ボーナスフラグなようです。
よくわかんないのでポートスキャンして(何回かやってるとポートノックしたことになるのかな?)空いてたポート(443)にアクセスしてバイナリファイルを落としてきました。
自分のローカル環境で実行してみると、8081番ポートで待ち受けて何かしているようです。
ltraceを使って実行して子プロセスの動作を追いかけます。
$ ltrace -f ./a.out
するとKSCという文字列と送られてきた文字列の冒頭を比較していることがわかりました。そしてshという文字列も見えたのでKSCの後にコマンドを続ければ実行できるのでは?と予測しました。
実際にncでつないでKSC pwdと送ると/rootと返ってきました。
/home/ubuntu/をlsします。
KSC ls /home/ubuntu -l
total 864
-rw-rw-r-- 1 ubuntu ubuntu 631 Oct 22 09:37 aaa
-rw-rw-r-- 1 ubuntu ubuntu 2586 Oct 21 17:40 a.c
-rwxrwxr-x 1 ubuntu ubuntu 14280 Oct 22 08:51 a.out
-rw-rw-r-- 1 ubuntu ubuntu 252 Oct 21 14:17 id
-rw-rw-r-- 1 ubuntu ubuntu 766354 Oct 22 09:12 index.html
-rw-rw-r-- 1 ubuntu ubuntu 581 Oct 21 16:52 map
-rw------- 1 ubuntu ubuntu 62954 Oct 21 17:12 nohup.out
-rw-rw-r-- 1 ubuntu ubuntu 101 Oct 21 17:59 out
drwxrwxr-x 2 ubuntu ubuntu 4096 Oct 20 20:34 stage-1
-rwxrwxr-x 1 ubuntu ubuntu 116 Oct 21 17:22 startup.sh
なんかいっぱいあって訳が分かりません。
/home/ubuntu/stage-1/instは
KSC cat /home/ubuntu/stage-1/inst
sudo iptables -N KNOCKING
sudo iptables -N GATE1
sudo iptables -N GATE2
sudo iptables -N PASSED
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8081 -j ACCEPT
sudo iptables -A INPUT -j KNOCKING
sudo iptables -A GATE1 -p tcp --dport 1111 -m recent --name AUTH1 --set -j DROP
sudo iptables -A GATE1 -j DROP
sudo iptables -A GATE2 -m recent --name AUTH1 --remove
sudo iptables -A GATE2 -p tcp --dport 2222 -m recent --name AUTH2 --set -j DROP
sudo iptables -A GATE2 -j GATE1
sudo iptables -A PASSED -m recent --name AUTH2 --remove
sudo iptables -A PASSED -p tcp --dport 443 -j ACCEPT
sudo iptables -A PASSED -j GATE1
sudo iptables -A KNOCKING -m recent --rcheck --seconds 30 --name AUTH2 -j PASSED
sudo iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH2 -j GATE3
sudo iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH1 -j GATE2
sudo iptables -A KNOCKING -j GATE1
iptablesわかりません。
/home/ubuntu/idにはチーム名がいっぱい書いてありました。
/home/ubuntu/nohup.outには21日の16時から17時12分までのログっぽいのがありました。
ちなみに、insecureの方々がフラグに成功したのは17時14分でした。何か関係があるんですかね。
という感じで訳の分からないままタイムアップで終了しました。
ログ
チームのログです。
10/22 9:26:12 074m4K053n tokunn tokunnが便利なプロトコルを攻略 100
10/22 9:00:50 074m4K053n tokunn tokunnがWeb1を攻略 200
10/22 9:00:26 074m4K053n tokunn tokunnが通信を解析しろのボーナス0を攻略 100
10/21 17:51:10 074m4K053n rainmaker rainmakerがWeak RSA2を攻略 300
10/21 17:07:18 074m4K053n nebula nebulaがWeb2を攻略 200
10/21 16:16:10 074m4K053n tokunn tokunnがファイル送信pcapを攻略 200
10/21 15:46:17 074m4K053n tokunn tokunnがボスを倒せを攻略 200
10/21 14:50:12 074m4K053n rainmaker rainmakerがWeak RSA1を攻略 200
10/21 14:47:28 074m4K053n tokunn tokunnが簡単な符号化を攻略 100
10/21 14:08:00 074m4K053n tokunn tokunnが解凍して解答せよを攻略 100
10/21 13:48:53 074m4K053n rainmaker rainmakerがファイル名を探せを攻略 100
10/21 13:31:13 074m4K053n tokunn tokunnがログインしたいんだ!を攻略 100
10/21 13:24:38 074m4K053n tokunn tokunnが君(脆弱性)の名はを攻略 100
10/21 13:19:12 074m4K053n tokunn tokunnが寝坊気味のコンピュータを攻略 100
10/21 13:10:32 074m4K053n rainmaker rainmakerが諜報機関は基本?を攻略 100
10/21 13:09:41 074m4K053n rainmaker rainmakerが素数を数えろを攻略 100
10/21 13:07:14 074m4K053n nebula nebulaがフラグを答えろを攻略 100
10/21 13:01:38 074m4K053n nebula nebulaがログインせよを攻略 100
10/21 13:00:22 074m4K053n rainmaker rainmakerがサンプルを攻略 100
さいごに
昨年が同率最下位みたいな感じで今年こそは抜けだそうと思ってたのですが、1年間である程度は解けるようになっていたのでよかったです。
CTFはじめてのお二方もそうともは思わせないくらいに問題を解いてくれたりアドバイスをくれたので高専生のベースの強さも感じました。まともにチームでやるのは初めてだったのですが、チーム戦はとてもいいですね。
自分たちの苦手なジャンルというものも分かったので、対策しながらSECCON 2017 オンライン予選に備えます。
ありがとうございました。