Tahoo!!

自分の勉強していること(コンピュータ関連 / ネットワーク / セキュリティ / サーバ)や趣味について書いていきます

TDU CTF 2015 に参加してきた & Writeup #tductf

2015年8月30日、TDU CTF 2015に参加してきた。

connpass.com

TDU CTFは、外部向けに行われている前回から参加していて、2回目の参加だった。

前回

TDU CTF 2014 Satellite in ConoHa に参加してきた & Writeup - Tahoo!!

イベントの内容

イベントは、LT(1時間)とCTF (4時間)、CTFの表彰と答え合わせ(30分)の3部構成だった。

LTでは、CTFやり方や競技インフラの説明が行われていた。 特に、競技環境については、最近CTFの環境をクラウド上に構築したら面白そうじゃね?と思っていたこともあって、聞き入ってしまった。

LTの内容は、Slideshareに上がってるものもあるので、興味ある人はそこを見てみると良いかも。

CTFは、スコアサーバへのアクセスが従来のようにWebブラウザでアクセスするのではなく、ネイティブアプリが配布されてそこからアクセスする形式で、いろいろ隠し機能もあって面白かった。 (詳しくは、LT資料を参照)

f:id:takahoyo:20150830221828p:plain

問題自体は、比較的わかりやすく解きやすい良問が多く、それが36問もあって非常に充実してた。 前回のTDU CTFでは、明らかに初心者向けではなかったネットワーク問題(通称:柚子胡椒問題)に時間を取られてしまい、他のジャンル問題が出来なかった。 しかし、今回は気分転換に他のジャンルの問題も出来る時間はあったので、多少はやりやすくなったのかもしれない。 ただ、自分が(ネットワーク問題を)楽しんで解いてたことを考えると、(ネットワーク問題は)初心者向けではなかったかもしれない。

そんなこんなでCTFをやって、結果は全体で11位だった。解いた問題は10問くらい。

f:id:takahoyo:20150830213519p:plain

解法がわかってたのに何故かうまく行かなかった問題やあと少しで解けた問題も多かったので、それが取れてればもう少し順位が上だったかなと思う。

何はともあれ、やっぱりこういうCTFは楽しいですね!

Writeup

まあ、いつも通り?Networkジャンルの解けた問題と解法はわかってるけど解けなかった問題、そして他ジャンルの解けた数問のWriteup。 (このブログでNetworkジャンル以外のWriteup各の始めたかもしれない)

Example 39pt 「練習問題」

問題の通り入れるだけ。

FLAG : TDU{SAKURAInternet}

Misc 10pt 「ESPer」

問題は「Charlotte」と書いてあるだけ。 なるほど。これはエスパーだw

たぶん、Twitterや某界隈で盛り上げってるあのバズワードかなと思って入れてみたら、通った。 さすがエスパー笑

FLAG : TDU{友利奈緒}

Misc 150pt 「clock」

JPGファイルが与えられて、そこに記録されている写真が撮影されたが日時がFLAGですよという問題。 とりあえず、ファイルの情報を調べるためにexiftoolに突っ込む。

$ exiftool clock.jpg
ExifTool Version Number         : 10.00
…
Date/Time Original              : 2015:01:02 11:35:01
Create Date                     : 2015:01:02 11:35:01
…

最初は、記録されている時間をそのままFLAGを入れたけど、通らなかった。 そこで、写真を見たら日本ぽくなかったので、記録されているのは海外の時間かなと思った。 解答例に"JST"とついてたので、もしかしたら日本時間でFLAG入れないとダメかなと思い、この時間に +09:00 したものをFLAGとして入れたら通った。

FLAG : TDU{2015_01_02_20_35}

Misc 200pt 「14:50」

14:50頃に突然、競技用アプリケーションでさくらインターネットの動画の再生が始まった。 これが隠し機能だったらしいw

FLAGはこの動画にあって、動画を見てると流れてくるFLAGが一つ。 もう一つは、動画の画面周辺をいじっていると、YouTubeという文字が見えたのでそこをクリック。 すると、その動画がアップされているYouTubeのページをリンクされ、その動画の説明にもう一つのFLAGがあった。

FLAG1 : TDU{試される大地},
FLAG2 : 忘れた…

Web 100pt 「Lie」

アクセスすると、「クッキークリッカー」をプレイしている画像が表示された。 ジャンルがWebで、なおかつ「クッキー」ということで、サイトのCookieを見てみる。

すると、Cookieの値が"False"にとなっていたので、その値を"True"に変えたら、FLAGが表示された。 某bでもよく出るやつですね。

FLAG : 忘れた…

Network 200pt 「Lucky 7」

問題文には、問題サーバのIPアドレスとポート番号 (7777)が書いてあったので、とりあえずncでつないでみる。

$ nc IPアドレス 7777
Challenge!
771819334 != 77777777

何度か試行すると、数値がランダムに変わっているが、よくわからなかったので最初は放置。

すると、途中で作問者が「パケットキャプチャしながらアクセスして見てください」的なことを言ったので、アクセスする度にランダムかつパケットキャプチャするとわかる値って、TCPのシーケンス番号かなと。 そこで、Wiresharkでパケットキャプチャしながらアクセスしてシーケンス番号と見比べると、同じだったので、Scapyでシーケンス番号を細工してうまく3-way-handshakeする問題かなという方針は立った。 しかし、Scapy力が低かったため、うまく自作3-way-handshakeが出来ずにタイムアップとなってしまった。

もう一回環境が動いたら、検証したいなあ…

Network 500pt 「PortScan」

問題文に、「ポートスキャンのパケットに何かメッセージが」って書かれていて、UDPのポートスキャンぽい通信が記録されたパケットが渡された。

とりあえず、空いてるもしくはフィルタされているUDPポートの通信に何か隠されてるかもということで、ICMPの"Destination Unreachable"が帰ってきてないポートを探した。 なぜこれでUDPポートの開閉が確認できるかは下記のリンクを参照。

(参考)ポートスキャンのテクニック

その結果、123/udp, 137/udp, 138/udp, 500/udpが、開いているかフィルタされているかということがわかったので、このパケットを調べたが、特に収穫なし。

すると、これもまた途中で作問者が「UDPペイロード見ろ」とヒントを出してくれた。 UDPペイロードは各パケットに1byteしかなく、データに含まれる値は0x20 (空白) と0x23 (#) の2パターンしかないことに気づいた。

そこで、このペイロード部分を取り出して連結することで、#がアスキーアートのような感じでFLAGの文字列を作るんじゃないかなと考えた。

ペイロードを1文字ずつ取り出して連結する機能はWiresharkにはないので、Scapyを使ってペイロード部分を取り出すことにした。

from scapy.all import *

packets = rdpcap('secretmsg.pcap')

flag = ''
for p in packets:
    if p['IP'].proto == 17:
        try:
            flag += p['Raw'].load
        except:
            print 'Error'
print flag

途中で何故かエラーが出て止まってしまったので、適当に例外処理書いて、こんな感じになりました。

これを実行するとFLAGが出た。

f:id:takahoyo:20150831030239p:plain

FLAG : TDU{PORTSCAN_PAYLOAD}

Network 400pt 「運営からフラグを盗め」

「運営のメールが盗聴出来た」という問題文とpcapファイルが与えられた。 Wiresharkでパケットを開くと、SMTP(Simple Message Transfer Protocol) のトラフィックが記録されている。

SMTPの内容は、Network Minerを使うと簡単に見ることが出来るので、とりあえずWindowsを起動してNetwork Minerを開く。 すると、メールが3通とflag,zipという名前の添付ファイルが2つあることがわかった。 ちなみに、この2つのflag.zipは暗号化されており、パスワードを入力しないと読めない。

メールの内容は、Network MinerだとISO-2022-JPエンコードされててうまく読めなかったので、Wiresharkで開き"imf"でフィルタリングしてメールのテキスト部分だけWiresharkの"Export Selected Packet Byte"を使ってmail1.txtというファイル名で保存して、nkfを使って読んだ。

$ cat mail1.txt
B$N$`$1$s$5$s

B$*Hh$lMM$G$9!"$3$?$^$4$G$9!#
B$9$$$^$;$s!*!*!*%U%i%0$,2B$D$"$k$N$K!"0l$D$@$1$N%U%!%$%k$rAw$C$F$7$^$$$^$7$? ><
BDI2C$7$?%U%!%$%k$rE:IU$7$^$9$N$G!"9g$o$;$FEPO?$*4j$$$7$^$9!#
…(省略)…
$ nkf -w mail1.txt
のむけんさん

お疲れ様です、こたまごです。
すいません!!!フラグが2つあるのに、一つだけのファイルを送ってしまいました ><
追加したファイルを添付しますので、合わせて登録お願いします。

パスワードは別途ご連絡します。

よろしくお願いします。

…(省略)…

> さきほどのファイルのパスワードをお送りいたします。
>
> umHA7QEJwgCbkKh (半角にしてください)
>
> よろしくお願いします。
>
>
>
…(省略)…
>> おつかれさまです、こたまごです。
>> 先日相談した暗号の問題ですが、できたのでスコアサーバに答えを登録しておい
>> ていただけますか。
>>
>> 添付ファイルにして送付します。
>> パスワードは別途お送りいたします。
>>
>> よろしくお願いします。
>>
>> P.S.
>> 沖縄たのしかった♪
>>
…(省略)…

メールにファイルのパスワードが書かれているので、これを半角に直してNetwork Minerで抽出した一つ目のflag.zipを解凍すると、1つ目のflag.txtとchibiegg.jpgというファイルが入っていた。

FLAG1 : TDU{I_KNOW_CREAR_TEXT_IS_NOT_SECURE}

ここで途中点が100pt入った。 あとの300ptは他のフラグを入れることで入るらしい。

もう一つのFLAGはもう片方の"flag.zip"に入っていた。 このZIPファイルには、Windowsエクスプローラから一つ目のZIPファイルにも含まれていた2つのファイルとflag2.txtというFLAGが書かれそうなファイルが含まれていることがわかっていた。

暗号化されたZIPは、平文が一部わかっている場合、既知平文攻撃という手法を用いることで暗号化ZIPを解読することが出来る。

(参考)WEB系情報セキュリティ学習メモ: パスワード付きZipのセキュリティについて

ここで、2つのflag.zipに含まれている画像ファイルの名前が同じであるので、同じファイルであると推測出来る。 よって、この画像ファイルを用いて既知平文攻撃をすることを考えた。

と、ここまでは順調に来たものの、既知平文攻撃を行うことができるツールpkcrackを何度使ってもうまく解読出来ない。

CTF終了後に、作問者に聞いたらやっぱりこの攻撃を使うものだったらしいので、もしかしたら自分のやり方が間違っていたのかもしれない…

今後いろいろ検証して、出来たら追記したいと思う。

8/31 追記

これまでMacのzipコマンドで圧縮したもの、Windowsアーカイバを使って圧縮したものを-Pに指定して、次のようなコマンドを実行していたが、うまく行かなかった。

$ ./pkcrack-1.2.2/src/pkcrack -C flag2.zip -c chibiegg.jpg -P flag3.zip -p chibiegg.jpg
Warning! Plaintext is longer than Ciphertext!
Files read. Starting stage 1 on Mon Aug 31 19:58:47 2015
Generating 1st generation of possible key2_69698 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Lowest number: 987 values at offset 66956
Lowest number: 954 values at offset 66953
…
Done. Left with 88 possible Values. bestOffset is 63636.
Stage 1 completed. Starting stage 2 on Mon Aug 31 19:58:56 2015
Stage 2 completed. Starting password search on Mon Aug 31 19:58:58 2015
No solutions found. You must have chosen the wrong plaintext.
Finished on Mon Aug 31 19:58:58 2015

Twitterを見ていると、こんなつぶやきが。

どうやら、平文に使うファイルが含まれる暗号化されていないZIPファイルが必要で、平文と暗号文が同じ圧縮率で圧縮されたZIPファイルが必要だったらしい。 (”Warning! Plaintext is longer than Ciphertext!”と出ていたのは、圧縮率の違うZIPファイルで解析しようとしていたからだろうか…)

OSを変えてLinuxのzipコマンドで、圧縮したzipファイルを-Pに指定したら出来たとのことだったので、試してみたらうまく出来た。 MacLinuxのzipコマンドって圧縮率違うですかね。

$ ./pkcrack-1.2.2/src/pkcrack -C flag2.zip -c chibiegg.jpg -P flag3.zip -p chibiegg.jpg -d ex.zip
Files read. Starting stage 1 on Mon Aug 31 20:08:17 2015
Generating 1st generation of possible key2_69662 values...done.
Found 4194304 possible key2-values.
Now we're trying to reduce these...
Lowest number: 997 values at offset 55869
…
Lowest number: 97 values at offset 17235
Done. Left with 97 possible Values. bestOffset is 17235.
Stage 1 completed. Starting stage 2 on Mon Aug 31 20:08:48 2015
Ta-daaaaa! key0=cf5ee14e, key1=2eca0110, key2=f5719a10
Probabilistic test succeeded for 52432 bytes.
Stage 2 completed. Starting zipdecrypt on Mon Aug 31 20:08:51 2015
Decrypting chibiegg.jpg (4c7ca89e06e53da966c50c16)... OK!
Decrypting flag.txt (62dca5b4976eac7fdcddaa19)... OK!
Decrypting flag2.txt (c9e8836fe0dbcc2cb9f7bd19)... OK!
Finished on Mon Aug 31 20:08:51 2015
$ unzip ex.zip
Archive:  ex.zip
  inflating: chibiegg.jpg
 extracting: flag.txt          
 extracting: flag2.txt 
FLAG2 : TDU{きちひらぶんこうげき}

Network 150pt 「文章漏洩」

問題として「ポスターにFlagが」という問題文と何かのパケットが与えられる。 Wiresharkでパケットを見てみると、ネットワークを経由してプリンタと印刷データをやり取りするプロトコルであるIPP(Internet Printing Protocol)を使っているパケットであった。

IPPでポスターもやり取りされていると考えたので、"ipp"でDisplay Filterをかける。 IPPについては詳しく知らなかったが、印刷するデータをやり取りするパケットはLengthが長くなると考え、Lengthが長いところ選んでパケットの詳細を見た。 すると、"Data (563330 byte)"とあったので、こいつを右クリックから"Export Selected Packet Byte"を使用して、この部分をファイルとして保存。

f:id:takahoyo:20150830232128p:plain

ファイルに出力したら、さっきのパケットにgzipで圧縮してあることも書いてあったので、gzipとして展開。 そしてfileコマンドでファイルの種類を判別した。

$ gunzip -d data.gz
$ file data
data: PostScript document text conforming DSC level 3.0, Level 2

すると、印刷しているデータの種類はPostScriptであることがわかった。 PostScriptでの開き方を調べてら、拡張子を".ps"にすれば、Macで開けるということが書いてあったので、"data.ps"にして開いてみるとポスターが復元できた。

f:id:takahoyo:20150830233803p:plain

FLAG1 : TDU[Can_you_use_CUPS?}

ここまでで、150ptのうち20pt。 残り130ptは、もう一つのFLAGを入れると貰える。これは時間内に解けず、後の答え合わせでわかった。

実は、このFLAGの下段に白文字でもう一つFLAGが書かれていた。 よって、この文章を選択&コピーして、メモ帳等に貼り付けることでFLAGが見える。

FLAG2 : TDU[I_got_caught}

IPアドレスが競技用サーバがあるIPアドレスだったことやNetworkというジャンルだったことから、あとの130ptは実際のサーバにアクセスして探すのかと思ってたので拍子抜けな感じでした。 oO(Networkというよりは、Forensicsというジャンルが正しい気がする…なかったけど…)

Network 400pt 「プリンタを探せ」

これは、上記のNetwork 150ptの答えを探してたらたまたま見つけた。 f:id:takahoyo:20150830235903p:plain

"printer-uri : ipp://172.16.11.90:631/printers/PDF"とあるので、とりあえずnmap使ってポートスキャンをしてみたところ…

$ sudo nmap -sS -p 631 172.16.11.90
Starting Nmap 6.47 ( http://nmap.org ) at 2015-08-30 18:04 JST
Illegal character(s) in hostname -- replacing with '*'
Illegal character(s) in hostname -- replacing with '*'
Nmap scan report for TDU*I_am_a_printer*.sakura.tductf.org (172.16.11.90)
Host is up (0.0021s latency).
PORT    STATE    SERVICE
631/tcp filtered ipp

Nmap done: 1 IP address (1 host up) scanned in 0.34 seconds

nmapの結果としては、ippのポートはfilterされてますが、"report for"の部分を見ると、"TDUI_am_a_printer.sakura.tductf.org (172.16.11.90)"とあって、"Illegal character(s) in hostname -- replacing with '*'"とも書いてあるので、このホスト名がFLAGかな。

FLAG : TDU{I_am_a_printer}

後から作問者に正攻法を聞いたら、DHCPでプリンターサーバの情報が配布されていたらしく、そこを見る問題だったらしい。

さいごに

今回は、会場やノベルティ、懇親会のご提供、さらに競技インフラがさくらクラウドに構築されていたりと、さくらインターネットさんの多大なるご支援があったと思います。 さくらインターネットさん、本当に素晴らしい環境をありがとうございました。

また、多くの問題と素晴らしいインフラの提供、イベント運営をしてくれた運営スタッフの皆様、ありがとうございました。そして、本当にお疲れ様でした。