coins+brew=神(?)
この記事はcoins Advent Calendar 2014の15日目の記事です。
0. 駄文
筑波大学の情報科学類(通称coins)では学内に100台を優に超すiMacが設置されていて、coins生ならば誰でも自由に使うことが出来ます。(例外)
しかし、大学が管理するMacなのでRubyやPythonのバージョンが古いなど、不満な点もいくつかあります。これを解決するためには自分でパッケージをビルドしてユーザーディレクトリ下に置くか、管理者の元へ突撃して宗教戦争を行うしかありません。
ただ、大体の場合、パッケージが「今すぐ」必要であったり、バージョンアップに追従しにくいことから、前者の手段を取ることになるでしょう。
MacではHomebrewというパッケージ管理アプリがよく利用されていますが、これはもともと管理者権限なしでも動くようにできているため、制限された環境で利用するのには最適です。
早速導入してみましょう。
1. 導入
% git clone https://github.com/Homebrew/homebrew.git ~/.brew % export PATH="$HOME/.brew/bin:$PATH"
これだけです。びっくり。
2. パッケージのインストール
coins環境のVimは古く、また当然Luaも使えないので非常に不便です。
さくっとLua付きのVimを入れてしまいましょう。
% brew install --with-lua --with-luajit vim
すごい。
% brew install tmux coreutils binutils
マシマシしていくぞ。
3. おわりのはじまり
brewの記事を書くつもりがなんと導入が簡単すぎて一瞬で終わってしまいました。
ですが重大なことをまだ話していません。
brewの導入はただのはじまりではなく、おわりのはじまりなのです。
というのも、一般的なcoins生のホームディレクトリというのは3GBの容量しかないため、ちょっと張り切ってパッケージを導入するとすぐに限界が来てしまいます。
Disk quotas for user s1411*** : Filesystem 1K blocks quota limit grace files quota limit grace /home 2728855 3072000 3584000 128501 0 0
ちょっと前にヤバいと思ってDownloadsの中身とかを消したのですが、それでも9割の領域を使ってしまっています。
coins+brew=神にはなれなかった。終わり。
4. 神への道
4.1 coins-admin
coinsのマシンはcoins-adminという教員と学生によって構成された組織が管理しています。coins-adminに入るとホームディレクトリの容量が実際無限になるそうですが、管理があまり得意でないので入るのはちょっと厳しい気がしています。
adminになっちゃえば普通に神になってるのと変わらないよね。
4.2 気合
coins生が利用するマシンには「計算機利用の手引き」なるものが設置されていて、「ディスクスペースが足りない場合は適当な場所にメールを送ること」という記述があります。
文脈から察するに、正当な理由であればホームディレクトリの容量を増やすことができるしれないということです。
また、VMを利用したいという理由で申請したら通ったという話も(噂みたいなものですが)聞いています。
自分の場合は適当に整理して2.7GB/3GB程度の使用量なので、もっと綺麗にしてかつ2.9GB/3GBくらいまでディスクをたっぷり使ってからメールを送ってみたいと思います。
5. coins Advent Calendar 2014
14日目
16日目(@Segmentation fault(core dumped)
[:embed]
Apacheのmod_mimeの挙動が危なっかしい
tkbctf#4のITF Point Systemの出題に使ったネタです。
知ったタイミングでブログ記事かなんかにしたかったのですが、問題に使うと決めてしまったので今の今まで書くことが出来ませんでした。
mod_mime - Apache HTTP Server Version 2.4
ファイルは複数の拡張子を持つことができ、拡張子の順番は通常は関係ありません。例えば、ファイル welcome.html.fr がコンテントタイプは text/html に、言語はフランス語にマップされる場合、welcome.fr.html もまったく同じ情報にマップされます。 同じメタ情報にマップされる拡張子が複数あるときには、言語と コンテントエンコーディングを除いて、 右側にあるものが使用されます。たとえば、.gif が MIME タイプ image/gif にマップされ、.html が MIME タイプ text/html にマップされる場合は、ファイル welcome.gif.html は MIME タイプ text/html に関連付けられます。
とApacheのドキュメントにありますが、要は存在する複数の拡張子の内、右から順番に見ていってApacheのMIMEに存在するものがあればそれを用いるという感じです。
これにより"abc.php.unknown"のような名前のファイルをApacheにphpとして認識させることが可能になります。tkbctf#4ではこの手法を用いて、ユーザー名をファイル名に含むSQLiteDBファイルにアクセスさせる問題を出題しました。
実際のところ、こんな話があるならいろいろな場所でPHP Remote Code Executionが発生して大事件になっている気がしますが、パッケージマネージャによってはその問題を回避するためか、下記のような設定が書かれています。
#... <FilesMatch "\.php$"> SetHandler application/x-httpd-php </FilesMatch> #...
この書き方であればファイル名の末尾にphp拡張子があるときだけPHPとして実行させるということができるので安全になります。
ちなみに自分のMac上で動いているApacheでは普通にAddHandlerしていたため、うっかり[username].datみたいな謎ファイルを吐き出すようなWebアプリがあると普通にこの挙動の影響を受けるところでした……
MacVimで日本語が文字化けする
set guifontwide=ヒラギノ角ゴ\ Pro\ W3:h15
KaoriYa MacVimだと何故かこの設定を読んでくれないのでbrew install macvimする。
CSAW 2014 Bin300(1) wololo
アセンブラをゴリゴリ読み続けてあれがこうなって…ってやって調べていくと解けます。
SECCON2014 横浜予選Web Writeup
競技開始 (14:20)
FLAG1 (14:24)
スクリーンショットを撮るWebアプリ
HTML内に背景色と同化したリンクがあることを見つける
しかしlocalhost onlyと表示されアクセスできない。
スクリーンショットで/privateを見るとFLAG1, AdminLogin, ls.txtが見つかる。
改めて/private/FLAG1のスクリーンショットを取るとフラグゲット
SECCON{screenshotFromLocalhost!}
FLAG2 (14:26)
スクリーンキャプチャで/private内を覗くとAdminLoginというフォルダがあるのでアクセスして見るとログイン画面が出てくる。
中身はstrcmpに配列を渡す問題。
山崎さん問題なのにMongoだったらどうしようと思って括弧を入れたらログインできた
?user=aaa&pass[$ne]=aaa
SECCON{strcmpBypass??}
FLAG3 (14:33)
簡単なSQLインジェクションで当然データベースはSQLite。
SQL文が select * from usertbl where (id LIKE '%[id]%');になっているので括弧に注意する。
SQL内の括弧の存在に気づけるかどうかという点で面白い問題でした。
SECCON{IamSqlInjM@ST3R}
FLAG4 (15:14)
スクリーンキャプチャで/private内を読むとls.txtというファイルが見つかるので、
これを更に読むと/***MySSHuserPass.txtがあることがわかる。
このファイルを手に入れるのに少し苦労しました。
Stage3→4へ繋がると思い込んでいたので、FLAG3のあとどこかにローカルファイルを読める脆弱性が存在すると思ってずっと探してました。
見逃しがあるかもしれないと最初のスクリーンショットのページへ行って、スクリーンショットの画像URLを確認してみたところ明らかに怪しい。
http://10.10.10.35/?image=../../../../***MySSHuserPass.txt%00
cedec / secconYkhm
% ssh cedec@10.10.10.35 cedec@10.10.10.35's password: Last login: Thu Sep 4 00:13:20 2014 from 10.10.10.15 [cedec@localhost ~]$ ls FLAG4 [cedec@localhost ~]$ cat FLAG4 SECCON{PathTraversalIsMyFriend}
FLAG5
********チームメンバーとのSSHのプロセスkill対決が1時間くらい行われる。
その後終了20分前くらいに@kazu1130_hがパスワードを変えて********以外全員死亡。
競技終了後に答え合わせをしたらこの問題を解いている人がいないらしいことが判明しました。
答えとしては、
/etc/crontabを読むとPATH=.:/bin/..みたいになっていて、
cronに登録されている/home/FLAG5/myBatch.sh内では
cd /tmp last -20 | grep pts | cut -b23-38 | sort | uniq -c | sort > tmp.tmp
となっているので/tmp以下でFLAG5権限のシェルスクリプトが動く(ということらしい)
cat /etc/crontabはしてPATH=.も見ていたのにコマンドをすりかえる発想がなかったのでだめでした。