TMCTF Writeup (Analysis Others 100, Analysis Offensive 300)

Trend Micro Inc.が主催するTrendMicroCTFにTokyoWesternsのお荷物担当として参加してきました.

このCTFは本来8月に開催される予定だったのですが,イベント用スコアサーバの設定に一部誤りがあり、一時的に競技で使われる問題、回答にアクセスが可能な状態となっていたため,不運にもISUCONと重なる日に延期されました.
問題のオープン形式はDEFCON同様得点の小さいものから順番に開くが,オープンする問題は選べるのではなくそのジャンルの次の問題,という仕組みでした.(事前に聞いていたのと違う…?)
また開始直後はスコアサーバが激重で僕以外のメンバーが繋がらず,Programming 100は早速サービスが落ちていました.

ちなみに僕が解いたのはAnalysis Others 100, Analysis Offensive 300 (partially)の二問だけという悲しい結果に終わりました.腹いせにWriteupを書きます.

Analysis Others 100

PDFが与えられ,fix meとか言われるのでとりあえずexiftoolにかける.

~$ exiftool fix_my_pdf.pdf
ExifTool Version Number         : 9.96
File Name                       : fix_my_pdf.pdf
Directory                       : .
File Size                       : 32 kB
File Modification Date/Time     : 2015:09:26 12:44:33+09:00
File Access Date/Time           : 2015:09:27 02:24:28+09:00
File Inode Change Date/Time     : 2015:09:27 02:18:29+09:00
File Permissions                : rw-r--r--
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.3
Linearized                      : No
Warning                         : Invalid xref table

Invalid xref tableとあるので,xrefがちゃんとリンクされてなくて表示されないコンテンツがあるんだろうな〜と思いつつpdfextractをかます.
いかにも怪しい<xmpGImg:image>というタグが見つかり,中は/9j/で始まるJPEGbase64 encodeしたような文字列なのでbase64で戻す.途中に&#xA(改行コード)が含まれているのでそれを置換するなり削除しておく. f:id:icchyr:20150928100452j:plain

TMCTF{There is always light behind the clouds.}

Analysis Offensive 300

脅威タイプ診断と称したWebアプリケーション.

f:id:icchyr:20150928102755p:plain

適当な名前を入れると

あふれる情熱が止まらないあなたは「バッファオーバーフロー」タイプです。

COOLな診断結果を返してくれる.  

下の方にコンタクトフォームへのリンク(contact.php)があって,名前とコメントを送信することができる.

意味わかんね〜って悩んでいると@ytokuさんがnameパラメータがvalidationされておらず,XSSできることを発見する.
ちなみにresult.php及びcontact.phpに対してGETパラメータとしてnameを渡すとあらかじめ名前が書き込まれた状態となる.(http://ctfquest.trendmicro.co.jp:40100/737c08b6f0ea477cb4ce3eb1b8e81a87/contact.php?name=hogehoge)

これはhttps://twitter.com/intent/tweet?text=text%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BFと同様の挙動である.

しかしこのページはvalidationがほとんどされていない(scriptが一回削除されるだけである)ため, http://ctfquest.trendmicro.co.jp:40100/737c08b6f0ea477cb4ce3eb1b8e81a87/contact.php?name="><scrscriptipt>alert(1);</scrscriptipt> とかやると簡単に発火する.

いろいろ試しているうちにPHPSESSIDでnameを保持していることがわかり,どうやらXSSで管理者のPHPSESSIDを奪う問題らしい.

想定されるシナリオは

  1. 適当なCookieを取得
  2. XSSを利用し,自分のCookieを使用してresult.phpnameパラメータに漏洩させる情報(Cookie)を入れて,GETさせる
  3. 先ほどのCookieを用いてresult.phpにアクセスすると,nameに漏洩した情報がある

という流れ.
ただし一つ罠があって,管理者に踏ませるリンクはlocalhost(or 127.0.0.1)じゃないとアクセスできない.(ネットワークの外に出られないようになっている?)
以上を踏まえて,
nameパラメータに

"><scrscriptipt>tmp=document.cookie;
document.cookie='PHPSESSID=0ufcvu21seft5sn3l2sllni896';
location.href='result.php?name='+tmp</scripscriptt>

をURLエンコードしたものを渡した http://localhost:40100/737c08b6f0ea477cb4ce3eb1b8e81a87/contact.php?name=%22%3E%3Cscrscriptipt%3Etmp%3Ddocument.cookie%3B%0D%0Adocument.cookie%3D%27PHPSESSID%3D0ufcvu21seft5sn3l2sllni896%27%3B%0D%0Alocation.href%3D%27result.php%3Fname%3D%27%2Btmp%3C%2Fscripscriptt%3E
というURLを用意し,contact.phpcommentに入力して送信した.

その後result.phpに再度アクセスするとname{Cookie};PHPSESSID={Cookie}に書き換わり(Cookie保存し忘れた),得られたCookieを用いてresult.phpにアクセスするとflagが得られる.

余談

漏洩させたCookieを使うとnameがflagになっているのだが,threat_typeはXSS(Cross Site Scripting)になっていた.
今思い返してみると,threat_typeで確認できたのは 標的型攻撃,水飲み場型攻撃,バッファオーバーフローランサムウェアSQLインジェクション だったのでXSSが現れない,というのは大きなヒントだったのかもしれない.


CTFではそもそも脆弱性はあまり関係なかったり,「こんな脆弱性ありえないでしょw」みたいな問題が割と多いと思いますが,TMCTFではセキュリティ企業ならではの現場に即した対応能力が求められる問題(def300とか,PEバイナリとか)が多かったように思います.どちらかというと実戦的かなと.

TokyoWesternsは @nomeaning さんがかなりの数の問題を解いてくださったので6位という好成績に終わり,無事決勝戦に進めそうです.
決勝のA&Dは4人までなので,戦力に数えてもらえたら是非参加したいです.

rncc夏期講習に参加してきました

id:kkrntと相談しながら日取りを決め,FMSのNCCさんと東京農工大のMCCとで夏期講習を開催しました.
本当はMCCから4人くらい話す予定だったのですが,なんと僕のみの参加となってしまいました
ちなみにrnccというのは"r"と"n"が並ぶと"m"っぽく見えるのが由来です.

話したこと

皆にシェルの楽しさを知ってもらいたく,「シェル芸初心者によるシェル芸入門」というタイトルで発表をしました.
僕は趣味でシェル遊びをしているので,シェル芸人ではありません.

www.slideshare.net

他の人が話した内容

詳しいことはNCCの記事を見て下さい.

ncc.hateblo.jp

個人的にはES2015(ES6)に触れたのが面白かったです.npm便利.
あとchainerちょっと遊んでみたいと思いました.とりあえずpip install chainerしたので適当にやってみます

~/.ssh/config をカスタマイズする

半年前くらいから~/.ssh/configを使い始めました.
今のところ使っていて便利だなと思った機能を紹介します.

ホスト情報

example.comにuserで秘密鍵~/.ssh/id_rsa_exampleを使って接続するとき,毎回

ssh user@example.com -p 22 -i ~/.ssh/id_rsa_example

と書くのは面倒です. ここで~/.ssh/config

Host example
    HostName example.com
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_example

と書くと

ssh example

で簡単に接続できるようになります.

多段ssh

ホスト情報が省略できるだけでも十分便利なのですが,例えば家の環境に接続したいときは外向けに解放しているゲートウェイサーバーを経由して接続しなければなりません.
しかしいちいちゲートウェイサーバーにsshしてからローカルマシンにsshするのは手間がかかります. そこで

Host home
    HostName 192.168.10.10
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home
    ProxyCommand ssh -W %h:%p gateway   # %h -> host, %p -> port

Host gateway
    HostName home.net
    User user
    Port 2222
    IdentityFile ~/.ssh/id_rsa_gateway

という風に書いてやると,ssh homegatewayホスト経由でローカルネットワークの192.168.10.10に接続してくれます.

2段以上のときも,

Host home_1
    HostName 192.168.10.11
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_1
    ProxyCommand ssh -W %h:%p gateway

Host home_2
    HostName 192.168.10.12
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_2
    ProxyCommand ssh -W %h:%p home_1

という具合に書けばremote -> gateway -> home_1 -> home_2のような接続が ssh home_2 を叩くだけで行えます.

ワイルドカード

家にマシンが増えてくると,各々のマシンに対してリモートから接続するための設定と家のネットワークから直接接続する設定を書く必要が出てきます.

Host home_1
    HostName 192.168.10.11
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_1
    ProxyCommand ssh -W %h:%p gateway

Host home_1_local
    HostName 192.168.10.11
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_1

Host home_2
    HostName 192.168.10.12
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_2
    ProxyCommand ssh -W %h:%p gateway

Host home_2_local
    HostName 192.168.10.12
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_2

.
.
.

という具合にリモート用とローカル用で分けても良いのですが,同じ記述が複数回出てくるのはちょっと不格好です.

~/.ssh/configのHostにはワイルドカードを指定することができて,これにマッチしたHostに適用されます. 例えば,

Host *_via_home
    ProxyCommand ssh -W %h:%p gateway

と書くとssh ~~~~_via_homeは必ずgateway経由で接続されます.
これを利用して,

Host home_1*                 # 末尾に*を付けないとマッチしません
    HostName 192.168.10.11
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_1

Host home_2*
    HostName 192.168.10.12
    User user
    Port 22
    IdentityFile ~/.ssh/id_rsa_home_2

Host *_via_home
    ProxyCommand ssh -W %h:%p gateway

と書いておくと
ローカル: ssh home_1
リモート: ssh home_1_via_home
とするだけで簡単に入れるようになります.(ただしsshコマンドのホスト補完が効かなくなります)

多段SSHの場合

どうやらうまく動かないようです.

Host *via_home_0*
    ProxyCommand ssh -W %h:%p gateway

Host *via_home_1*
    ProxyCommand ssh -W %h:%p home_1

と書いておいて

ssh home_2_via_home_1_via_home_0

remote -> gateway -> home_1 -> home_2な接続ができるかと思ったのですが,home_2_via_home_1までの時点でssh -W 192.168.10.12:22 home_1が実行されているためvia_home_0部分が完全に無視されています.
多段SSHの時はおとなしく書いたほうが良さそうです…(もしどなたか知見ありましたら教えて下さい)

3846ctf q4

知り合いが主催している#3846ctfというのがありまして,Amazonギフトコードがフラグになってるプチ賞金付きCTFとなっています. 今回は4回目の出題.幸運にも初めにフラグをとることができたようなので,備忘録ついでにwriteupを.

問題概要

問題ページをクリックするとquestions.htmlに飛び,以下のようなことが書かれています.

YUKI.N > This question was already given.

RYOKO.A > Right now, I have the control of the flow of the data in this space.
RYOKO.A > Nothing can enter.

これだけ.

writeup

※writeupというよりかは自分の思考過程を記したものです.適宜読み飛ばして下さい.

最初全く見当もつかず,ページのソースを眺めるも特に何かが隠されてるわけでもなし.

ChromeのWeb Inscpectorで通信を追っかけてみると,/questions/04で302が返ってきていて,49152ポートにリダイレクトされた後に/questions/04/question.htmlにリダイレクトされてることがわかりました.

ヘッダ部分を見ると X-Hint:YUKI.N > Access via terminal console.とあるので telnet ctf.mikumiku.moe 49152をしてみたところ,(curlではうまく動きませんでした)

YUKI.N > Can you see this?(yes)
You > yes<Enter>

YUKI.N > Bye.
Connection closed by foreign host.

すぐに閉じられてしまいました.

10分ほど頭をひねって,改行コードが悪さしてるのではと思いつく.

You > yes<Ctrl-d>

YUKI.N > 3846CTF CTF #004 : Ryoko Asakura 
 
- - - - - - - - - - - - - - - - - - - - -

何か出てきました.

しばらく観察してると,最後に以下の文が.

Mission 
  - Delete "Ryoko Asakura" from SQL until your connection is killed. 
  - DO NOT delete other data. 
  - Your connection will be killed after 3 minutes by Ryoko Asakura. 
  - SQL returns only 1 line per 1 query. 
  - SQL can use "SELECT" and "DELETE". 
  - SQL query cannot be included "WHERE" 

要は

  • DBから"Ryoko Asakura"を削除する
  • 他のデータを消してはいけない
  • SQL文ではSELECTとDELETEを使用することができるがWHEREは使えない
  • 実行されたSQL文は結果の1行目しか表示しない

を達成しろ,ということです.(はじめ太字の所を忘れててハマりました) 自分はSQLをほぼ使ったことがないので適当に調べながらやりました.
まずはデータベースの情報がほしいので適当にSQL文を打つ.

select * from

": syntax error SQLITE_ERROR: near "

sqliteということがわかったので,

select * from sqlite_master

|table|database|database|2|CREATE TABLE database (serial_code INTEGER PRIMARY KEY, personal_name TEXT)|

これでテーブル名とDB名もわかりました.


あとは1行ずつしか表示されないことを考慮して,group_concat()を使うのが良さそうです.

select group_concat(personal_name) from database

|Kouichi Yoshizaki,Kanae Yura,The Computer Research Society President,Ayano Narusaki,Mikuru Asahina,Mizuki
 Okajima,Mizuho Saeki,Nanaka Oonogi,Haruhi Suzumiya,Masaki Uematsu,Keiji Yamatsuchi,Arakawa,Mai Zenzai,Yoshimi
 Sakanaka,Keigo Matsushiro,John Smith,Kyon,Shoya Kakinouchi,Sumire Yanagimoto,Keichi Tamaru,Sakuha Hinata,Kyoko
 Tachibana,Sonou Mori,Ryoko Asakura,Tsuruya,Reiko Hayama,Kotone Kenmochi,Akihiro Nakajima,Itsuki Koizumi,Miyoko
 Yoshimura,Emiri Kimidori,Kennosuke Arakawa,Yui Nishijima,Ippei Tejima,Eijiro Oomori,Okamoto,Daichi Sakaki,Outa
 Hanaze,Kyosuke Gotou,Sasaki,Noboru Toyohara,Miyuki Enomoto,Yutaka Tamaru,Fujiwara,Miharu Suzuki,Yukihiro
 Yamane,Kiyosumi Morimura,Kunikida,Kuyou Suou,Kaori Senou,Yukina Takatou,Yusuke Suzuki,Takako Nakanishi,Yuki
 Nagato,Taniguchi|


問題はwhereが使えないので,手動でデータを選択する必要があります. 適当にググったら結果出力のオフセットをlimitとoffsetで指定できることがわかったので,これが利用できそうです.(limitがないとoffsetは働きません)

select personal_name from database limit 1 offset 20

|Sakuha Hinata|

目で"Ryoko Asakua"の位置を数えても大丈夫ですが,3分過ぎてしまうと接続を切られてしまうため適当なスクリプトを書いて計算させました.(再接続するのに時間がかかります)

先ほどのgroup_concat()の結果を用いて,

s.find(",", 0, s.find("Ryoko Asakura"))
>> 23

select personal_name from database limit 1 offset 23
|Ryoko Asakura|

23番目にあることが確認できたのでdeleteします.

delete from database limit 1 offset 23

そうするといろいろメッセージが出てきて,

** Congratulation! **
Please re-access with Header as above.
X-Key: GLASSES

X-KeyヘッダにGLASSESを指定してアクセスしろ,とのことなのでアクセスするとフラグが出てきます.

icchy@kali:~$ telnet ctf.mikumiku.moe 49152
Trying 157.7.234.216...
Connected to ctf.mikumiku.moe.
Escape character is '^]'.
GET /
X-Key: GLASSES

HTTP/1.1 307 Temporary Redirect
Location: http://ctf.mikumiku.moe/questions/04/question.html
Server: YUKI.N Server
Content-type: application/x-YUKI.N; charset=UTF-8
X-Hint: YUKI.N > Access via terminal console.

YUKI.N > AMZN{4PJP-3NR2B5-F5C9}
Connection closed by foreign host.

余談

本文を適当にググる涼宮ハルヒの憂鬱の一節の英訳ということがわかりました. (元の文)http://animetranscripts.wikispaces.com/Haruhi%3E04.+The+Melancholy+of+Haruhi+Suzumiya+%E2%85%A3と照らし合わせると

Asakura:
It's useless.
Right now, I have the control of the flow of the data in this space.
Nothing can enter, nothing can leave.

とあり,"nothing can leave"が抜けてるなーと思いながらいろいろ試してました.結果的に全く意味はなかったです.

ICPC 国内予選 2014

参加してきました.

一時期台風でどうなることかとヒヤヒヤさせられましたが,特に問題もありませんでした.僕のチームは

  • @osrehun
  • @xthexworldx
  • @icchyr

の3名でした.

~16:30

3限終了後に集合.特にすることもないので適当に時間をつぶしていると監督とコーチが到着する.
プリンターのセッティングをしてテンプレート等を印刷したがまだ時間が余っている.

僕,何を思ったかこれをやろうと言い出す.特に意味はない. そんなこんなで国内予選開始の時間となる.

本番開始

まずは僕(@icchyr)が初期設定をして,そのあとにA問を解いている間に二人がB問以降の方針を固めるという作戦.

16:30~17:00

A問を見る.

「何だ逆算するだけか」

コーディングが終わる.サンプルが通らない.

「ただの誤差っぽい」

修正する.通らない.まだ焦る時間じゃない.

17:00~17:30

さすがに危機感を感じたのか,@osrehunがペアプロに移る.
ただの全探索だった・・・

残りの問題に取り掛かる.B・Cは方針が立っていて,D問をとりあえず見る.
A問で「全探索」というワードが頭に染みついていたので一瞬で全探索であることを見破れた.デコード部分を書いておしまい.

17:30~18:00

@xthexworldxがB問でバグらせていた.ペアプロに移る.
少しずつコードを読み解いているうちにいつの間にかバグがいくつか直ってた.紙デバッグに移って@osrehunがD問のコードを書く.

通らない.ソートするのを忘れていたっぽい.
サンプルが通ったのでSubmitする.WA.

ここで一度体制を立て直す.

B問と交代しながらデバッグしていく.

18:00~18:30

D問のサンプルが通る.どうやらvectorにぶちこんでたら重複を許していたっぽい.
再度Submit.WA.さすがに焦る.

ここで僕が書いたデコーダが間違っていたことに気付く.
通す.実行時間が明らかにアウトだけど気にしない.出力さえ正しければよい.

18:30~19:00

D問は実行時間が長いのでこの間にB問を書いてもらう.バグもとれたっぽい.
D問の実行が終わる.Submit.AC.
続けてB問も通る.

ここまでで3AC.国内予選通過が危ぶまれる.
即座にC問のコーディングを@osrehunが開始.

19:00~19:30

バグが取れない.やばい.方針が良くないのかもしれない.

二分探索をすると太陽が通過した後の判定がうまくできていないことに@osrehunが気づく.
後は判定部分を適当に指摘する.サンプルが通る.
終了10分前.AC.

順位表を見る.東大が開始1時間ちょいで通しているところをみて戦慄する.

@osrehunがE問のコーディングを始めるも途中でタイムアップ.

終了後

順位表をみて気付いたが,コーディングに時間をかけすぎたこと,WAを結構な回数出したことから4完チームの中では最下位だった.
また,もう片方のチームは結構早い速度で4完していたため国内予選ほぼ確定.同時に僕のチームは敗退.
聞くところによると,ABCEをすべてC言語で通したらしい.おまけにコーダーは1人のみとのこと.是非アジア地区大会頑張ってきてほしい.

今回の反省点としては3人それぞれが泥沼にはまっていたこと,A問を通すのが非常に遅かったことが考えられる.
いくら簡単な問題とはいえ,解法から実装までを一人でやるのは良くない.万が一誤読したときのことを考えて2人以上で問題を読んでおくべきだと思う.チームで解くことを生かすならなるべく複数人で考えることが重要なのかもしれない.
E,F,Gに関しては方針すら全く浮かばなかったのでとにかく知識をつけてから問題を解いていきたいと思う.

蟻本読まねば・・・

Gitlab

といえば環境構築が非常に手間のかかる作業と思っていたのですが、どうやら最近はパッケージ一つで簡単に立てられるようです。

Gitlub omnibus

以下、CentOS6.4にて

https://www.gitlab.com/downloads/ から環境にあったパッケージをダウンロード

wget https://downloads-packages.s3.amazonaws.com/centos-6.5/gitlab-6.9.1_omnibus-1.el6.x86_64.rpm

openssh-serverとpostfixが必要になるので導入していない場合はインストールする

yum install openssh-server
yum install postfix

Gitlab omnibusインストール

rpm -i gitlab-6.9.1_omnibus-1.el6.x86_64.rpm

起動する

gitlab-ctl reconfigure
gitlab-ctl start

おしまい



しかしこのパッケージ、デフォルトで動かすといくつかの問題があります。

Apacheが死ぬ

Gitlab omnibusではnginxを80番で使用するため、既に80番で動いてるサービスがあると上書きされてしまいます。

リバースプロキシを設定することで回避できます。

/etc/gitlab/gitlab.rb

external_url "http://gitlab.icchy.net:8081"

virtual.conf

<VirtualHost *:80>
    ServerName gitlab.icchy.net

    DocumentRoot /opt/gitlab/embedded/service/gitlab-rails/public

    CustomLog /var/log/httpd/gitlab_access.log combined
    ErrorLog /var/log/httpd/gitlab_error.log

    ErrorDocument 502 /502.html

    <Directory "/opt/gitlab/embedded/service/gitlab-rails/public">
        Options FollowSymLinks
    </Directory>

    <Proxy *>
        AddDefaultCharset off
        Order deny,allow
        Allow from all
    </Proxy>

    ProxyVia On
    ProxyPreserveHost On

    ProxyRequests Off
    ProxyPass /assets/ !
    ProxyPass /Uploads/ !

    ProxyPass / http://gitlab.icchy.net:8081/ retry=1
    ProxyPassReverse / http://gitlab.icchy.net:8081/
</VirtualHost>

重い

貧弱なサーバだとつらいものがあるので、unicornのプロセスを減らしてpostgresのメモリ使用量も減らします。

/etc/gitlab/gitlab.rb

external_url "http://gitlab.icchy.net:8081"
unicorn["worker_processes"] = 1 
postgresql["shared_buffers"] = "128MB"
postgresql["effective_cache_size"] = "32MB"

dovecotが死ぬ

gitlab設定後、今まで使ってたメールが使えなくなりました。

f:id:icchyr:20140530111140p:plain:w200

原因を調べてみたところ、iptablesで塞がれていました。

/etc/sysconfig/iptables

-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited 

コメントアウトしてしまいましょう。

/etc/gitlab/gitlab.rbの中身を書き換えたあとはgitlab-ctl reconfigureまたはgitlab-ctl restartで設定を反映してください。

はてなブログはじめました

備忘録的なことをメインに書いていこうと思います