Hello, (forgotten) world ☂

CSAW CTF 2014 Quals Trivia

CSAW CTF 2014 Qualsに参加してました。日本時間で20日07:00から22日07:00までの48時間。都内某所に泊まり込みでした。そんな感じでWrite-upでございます。この記事はTrivia。

Triviaは全て10点で全6問。うち私が解答したのは3問でした。

Shameless plug

問題文

This is the name of the new USENIX workshop that featured papers on CTFs being used for education.

SECCON 2014 オンライン予選 その他諸々

2014-07-19 09:00 - 21:00に行われたSECCON 2014 オンライン予選について、その他諸々。

個別に書いたのは次の2つ。

この2つとここで書かれていないのは問題見てすらいません˙꒳˙

decode me

ダウンロードしたencoded.txtを見ると盛大に文字化けしてるんだけど、FRPPBA 2014という文字を見た瞬間にここがSECCON 2014であることを確信。ということは換字式暗号か何かなんだろうけど、ebg13/47という文字が気になる。とここで@re_Ordが「rot13/47というのがあるらしい」。なんじゃそりゃと思って調べてみると、rot13を拡張したそういう暗号があるらしかった。

SECCON 2014 オンライン予選 【Print it!】

2014-07-19 09:00 - 21:00に行われたSECCON 2014 オンライン予選のWrite-upです。次は「Print it!」。

問題概要

謎のファイルが降ってきます。以上。

解法

降ってきたファイルの正体は"Standard Triangulated Language"というフォーマットのファイル(参考: Wikipedia)で、このフォーマットのバイナリ形式で記録された3Dモデルです。このファイルを適切なアプリケーションで開くと3Dモデルを見ることが出来て、そのモデルにフラグが書かれています。

ans: Bar1kaTaLab.

経緯

とりあえずファイルをバイナリエディタに突っ込んでビットマップで見てみると、かなり規則性の高いらしいということはわかったのですが、それ以上のことはさっぱりわからず。nullが14個くらい続いてたりとか、それが繰り返されてたりとか、その辺の規則性が高いわりに、先頭には普通にテキストが入っているし、テキストの間にはまたもnullが入っていてよくわかんないなぁと思ってました。

SECCON 2014 オンライン予選 【あみだくじ】

2014-07-19 09:00 - 21:00に行われたSECCON 2014 オンライン予選のWrite-upです。今回は「あみだくじ」。

問題概要

問題は64bit ELF形式の実行ファイルamida。これを実行すると「No.i」(i = 1, 2, …)と書かれた行に続けて1から順に番号が振られたあみだくじが表示され、いずれかの終端の1箇所に*印がついている。……が、後になると

miocatのその後、あるいはcoinsLT #0で発表した話

情報科学類1年が企画したcoinsLT #0(ATNDの方が情報量が多いのだが、一応Webページも存在している)で発表した。タイトルがクソ長いが要するにこのブログでいくつか投稿してきた、.NET FrameworkとMonoにおけるGetFullPathとかnew Uriの挙動の違いについてである。

coinsLT#0 tkbctf3 miocatができるまで from Mei Akizuru

実際の発表時の動画も公開されている。だいたい07:58あたりからが私の発表である。

Railsアプリ with Mina and OpenRC

目的とか

KONMAIが送る大人気リズムアクションゲーム"REFLEC BEAT groovin’!!“に向けてRefixativeの新バージョンを書いていた。今までは毎回毎回サーバーにsshしてはgit pullしてうんぬんかんぬん、とやっていたので、現代的な環境を構築したかった。

Different Behaviors of DownloadString and Uri between .NET and Mono

Note: This is the summary of my posts (they are written in Japanese):

I already reported this as a bug for Xamarin’s Bugzilla.

Introduction

I found the different behavior of WebClient.DownloadString(String) between Mono and .NET Framework when an invalid URI passed to it. In the Mono’s implementation, it may cause a security issue.

This causes by two different behaviors, in new Uri(String), and Path.GetFullPath(String).

DownloadString

DownloadString(String) and some methods (e.g. DownloadFile(String), OpenRead(String), etc.) calls CreateUri(String), a private method of WebClient. (-> source code on github)

CreateUri and GetUri

CreateUri(String) tries to make an instance of Uri with new Uri(String). If an invalid URI passed, the constructor raises an exception. For example, new Uri("http://../../../etc/passwd") will be failed because its hostname part (..) is invalid. However, the failure will be ignored, and CreateUri(String) returns new Uri(Path.GetFullPath(String)). It means the local file address with the full path will be returned.

結局Monoと.NETの挙動の違いはなんだったのか

続・アレな文字をWebClient.DownloadString(String)に渡すとローカルのファイルが読める

ここ2つの記事でMonoのWebClient.DownloadString(string)にアレな文字列渡すとローカルファイルを落としてきてしまうという挙動について調べてたわけですが、よくよくスタックトレースを見てみると、.NET FrameworkでもGetUriというメソッドを経由してPath.GetFullPathが呼ばれていたことがわかりました。

MonoのWebClientにおけるURI

発端

発端は前の記事にあるように、tkbctf3の問題としてmiocatなるものを出してみたのはいいものの、意図とは異なる脆弱性を作り込んで250点問題が超絶ボーナス問題になりましたよ、というお話しです。

調査

miocatはC#で書かれており、実際の運用ではMonoランタイムで動いていました。というわけでMonoのソースコードを読めば解決です。やったね。

そういうわけでまずはWebClientの実装を読んでみたのですが、怪しい箇所が一発で見つかりました。WebClient.cs#798、privateメソッドであるCreateUri(string)なるメソッドです。DownloadString(string)は、その引数をこのメソッドに渡してDownloadData(Uri)を呼び出します。

try-catchの中で渡されたアドレス(と、baseAddress)を元にUriのインスタンスを作ってCreateUri(Uri)に渡していますが、ここで例外が発生するとreturn new Uri(Path.GetFullPath(address))という恐怖のコードが走ります。

tkbctf3 miocat

miocat(みお・きゃっと)はとある伝説の脱ヲタエンジニアが書き上げた伝説のプログラムに着想を得てっていうのはどうでもいいとして、実際のところは.NET Frameworkのとある仕様に関する問題です。でした。以下本来の意図の説明です。

ソースコード

と、その前に。今回のソースコードはtkbctf/archiveに上げておきます。結構問題の核心以外の部分で苦労してたりしますがそれはそれということで。

追記: 上げました -> tkbctf/archive/tkbctf3/web250_miocat