[CpawCTF] 第十一夜: リダイレクト
Q15.[Web] Redirect
以下、問題文
Q15.[Web] Redirect
100pt
このURLにアクセスすると、他のページにリダイレクトされてしまうらしい。
果たしてリダイレクトはどのようにされているのだろうか…
※この問題のサーバへの攻撃はお止め下さい
答案
cpawCTF Level 2
第二問目の挑戦です。
まずは問題文にある URL を踏んでみます。
すると、Level 1
の Q9
のページに飛ぶようです。
Q15
のリンクのはずが、Q9
に飛んでいるということで、
問題文に書かれているように「リダイレクト」がされているということでしょうか。
今回も今回とて、わかりませんね。
どこに Flag
が隠されているのか、全くもって見当がつきません。
先人の Write up を拝見します。
Developer tools
を開き (F12 key
) 、Elements
タブから、Network
タブに遷移します。
Network
タブが開かれた状態で、 問題文のリンクをクリックし
Developer tools
のq15.ctf.cpaw.site
という部分をさらに探ると、X-Flag
というところに Flag
があるようです。
こちらの方 はご丁寧に図を載せてくださっており、 わかりやすかったです。
submit
Level 2
... 急に難易度上がりすぎでは... という気持ちでいっぱいです。
余談
HTTP
ステータスコード の302 は、リダイレクトの中でも
「遷移先が一時的に移動しているので、サーバ側で追加処理しました」
みたいな状態らしいです。
[CpawCTF] 第十夜: 隠されたフラグ
Q13.[Stego]隠されたフラグ
以下、問題文
Q13.[Stego]隠されたフラグ
100pt
以下の画像には、実はフラグが隠されています。
目を凝らして画像を見てみると、すみっこに何かが…!!!!
フラグの形式はcpaw{***}です。フラグは小文字にしてください。
答案
さて、久しぶりの更新となりましたが、今回から cpawCTF Level 2
への挑戦となります。
問題をチラチラと見る限り、だいぶレベルが上がったな、という印象を受けました。
今回はその第一問目です。
それでは以下、回答を始めます。
まずは問題文に添付されている画像をダウンロードします。
問題文にもある通り、端っこに黒い「何か」が隠されていることが一目見てわかります。
「黒い点」と、それから「黒い棒」の集まりのようですが、 私にはこれが何を意味するのか、わかりませんでした。
仕方ないので、検索します。
これは言い訳なのですが、 「見て、考えて、わからなければ、人に聞くか調べる」という流れが大事だと考えます。
特に初めて出会ったものなどは、 解き方を知らなかったり、 自分の知っている範囲内のこととの繋がりが曖昧だったりして、 なかなか答えまでたどり着けない、という場合も少なくありません。
そういったときに、先人たちが解いたときの軌跡を辿ることで 自分の知見とする、ということも知的な営みの一つであると思います。
2回目、3回目で「またこれか」となるように 自分の中に確かな体験を持っておくことが重要なのです。 (自分に言い聞かせながら)
もちろん、「自分で考えること」もとても重要です! バランスの問題です。バランス。バランス...
さて、話がずれてしまいましたが、ご存知の方々からすると この「. (点)」と「- (棒)」 の集まりといえば、 ズバリ「モールス信号」だ、とのことです。
「.」 が「トン」、「-」 が 「ツー」ですね。
この「トン」と「ツー」の組み合わせで文字を表現し、 遠く離れた相手にメッセージを送るのがモールス信号だったはずです。
文字の表記が少しわかりにくいですが、こちらが参考になるかと思います。
いや、なるほどですね。 日常でモールス信号に出会うことなんてありませんし... あ、でもそういえば映画「崖の上のポニョ」で、出て来たような...
現在では、自然言語の文字列 (ひらがな or アルファベット?) とモールス信号を相互に変換するサイト、 なんて素晴らしいサービスがあるようなので、それを使ってみます。
文字列は問題画像の左上と、右下にある点と棒の集合の両方を合わせたものです。
以下の2点に注意してください。
- 途中区切り (スペース) があること。これで一文字の切れ目を判別します。
- 英語 (アルファベット) に対応させること。(日本語だと、意味不明な文字列になります...)
# 変換前: -.-. .--. .- .-- .... .. -.. -.. . -. ..--.- -- . ... ... .- --. . ---... -.--.- # --- decode --- # # 変換後: CPAWHIDDEN_MESSAGE:)
submit
ということで、Flag
である cpaw{hidden_message:)}
を得ることができました。
先頭の CPAW
は cpaw{}
部分に相当するらしいので、{}
内の文字列に含めないよう、注意が必要でした。
なんとか、 (先人の方々のお力を借りながら...) Level 2
初の問題を解くことができました。
write up
を書いてくださっていた方々、モールス信号の変換サービスを作ってくれた方、ありがとうございます...
余談
問題のタイトルに Stego
とありますが、これは Steganography
の意味のようです。
以下 ステガノグラフィー - wikipedia より引用
ステガノグラフィー(steganography)とは、データ隠蔽技術の一つであり、データを他のデータに埋め込む技術のこと、あるいはその研究を指す。クリプトグラフィー(cryptography)がメッセージの内容を読めなくする手段を提供するのに対して、ステガノグラフィーは存在自体を隠す点が異なる。
暗号技術の 1つで、情報を見える形で送るが読めない形に変換する暗号化とは異なり、 何かに埋め込んだり、何かに隠したりして、情報を伝達しようとする技術のようです。
なんだか、スパイみたいでドキドキしますね。
(このドキドキが最初だけであることを、私は知っています...)
[CpawCTF] 第九夜: ソート (バブルソート)
Q14.[PPC]並べ替えろ!
以下、問題文
Q14.[PPC]並べ替えろ!
10pt
下にある配列の中身を大きい順に並べ替えて、くっつけてcpaw{並べ替えた後の値}をフラグとして提出してください。
例:もし配列{1,5,3,2}っていう配列があったら、大きい順に並べ替えると{5,3,2,1}となります。
そして、フラグはcpaw{5321}となります。
同じようにやってみましょう(ただし量が多いので、ソートするプログラムを書いたほうがいいですよ!)
[15,1,93,52,66,31,87,0,42,77,46,24,99,10,19,36,27,4,58,76,2,81,50,102,33,94,20,14,80,82,49,41,12,143,121,7,111,100,60,55,108,34,150,103,109,130,25,54,57,159,136,110,3,167,119,72,18,151,105,171,160,144,85,201,193,188,190,146,210,211,63,207]
答案
今回は正整数がたくさん連なっている配列が与えられており、これを降順 (大きい順) に並べ、結合した文字列が Flag
になるらしいです。
ちょっと配列のサイズ的に力技で (紙の上とか、手作業で) 並べ替えるのは面倒なので、 問題文のヒントにしたがって、ソートをするプログラムを書いていこうと思います。
ソートに関しては、コンピュータを使っていく上で、様々議論がなされてきた分野です。
いくつかの方法があり、それぞれに特色があったりします。 これに関しては様々な方がすでに詳細な解説や、プログラムの例を掲載してくださっておりますので、 それぞれのソート方法に関する深堀はしません。
そもそも、先に書いておられる方々を凌駕できるほど、 明快で正しい説明ができる知識を持っている自信がありませんし...
いくつか参考を載せさせていただくことでご容赦ください。
今回は「記述が簡単で読みやすい」という点と、「実装しやすい(プログラムとして書きやすい)」ことから 「バブルソート」と呼ばれるアルゴリズムを使って、配列をソートしていこうと思います。
バブルソート
バブルソートは、配列内の各々の数字に着目して、その隣同士の大小関係をいちいち比較することで 最終的に配列全体を大小の順番に並べることを達成する、というソート方法です。
書き方や、仕組みが理解しやすいという利点の代わりに、 ソート完了までかかる時間が比較的長い、という欠点を被ることになります。
この辺はトレードオフの関係になっているので、仕方ないでしょう。
バブルソートの「バブル」とは、我々のよく知る「泡」のバブルのことで、 配列の要素を比較し、入れ替える際に、大小関係が入れ替わり、 泡のように底から表面にポワポワと浮いてくるイメージから名前がついているようです。
イメージとしては こちらの動画 がとてもわかりやすいかと思います。
プログラム
ソースコードに関しては、こちら を参考にさせていただきました。
前回 (第2夜?) 同様、C言語で テキトーに 書いてみます。
/* バブルソート */ #include <stdio.h> int main() { printf("program starts.\n"); int A[] = {15,1,93,52,66,31,87,0,42,77,46,24,99,10,19,36,27,4,58,76,2,81,50,102,33,94,20,14,80,82,49,41,12,143,121,7,111,100,60,55,108,34,150,103,109,130,25,54,57,159,136,110,3,167,119,72,18,151,105,171,160,144,85,201,193,188,190,146,210,211,63,207}; int mem_sz = sizeof(A); int mem_sz_one = sizeof(A[0]); int nelem = mem_sz / mem_sz_one; printf("memory size all:%d / one:%d\n", mem_sz, mem_sz_one); printf("array elements: %d\n", nelem); // ソート前の配列の確認 printf("before = {"); for (int i=0; i<nelem; i++) { printf("%d", A[i]); if (i!=nelem-1) { printf(", "); } } printf("}\n"); // バブルソートを実行 int tmp; for (int i=0; i<nelem; i++) { for (int j=i+1; j<nelem; j++) { if (A[i] > A[j]) { tmp = A[j]; A[j] = A[i]; A[i] = tmp; } } } // ソート後のリストを確認 printf("sorted list = {"); for (int i=0; i<nelem; i++) { printf("%d", A[i]); if (i!=nelem-1) { printf(", "); } } printf("}\n"); // flag の出力 // 大きい順で出力することに注意 printf("The flag is below:\n"); printf("cpaw{"); for (int i=nelem-1; i>=0; i--) { printf("%d", A[i]); } printf("}\n"); return 0; }
実行結果
少し余計な部分がありますが、
一番下に出力した cpaw{...}
の部分が Flag
です。
program starts. memory size all:288 / one:4 array elements: 72 before = {15, 1, 93, 52, 66, 31, 87, 0, 42, 77, 46, 24, 99, 10, 19, 36, 27, 4, 58, 76, 2, 81, 50, 102, 33, 94, 20, 14, 80, 82, 49, 41, 12, 143, 121, 7, 111, 100, 60, 55, 108, 34, 150, 103, 109, 130, 25, 54, 57, 159, 136, 110, 3, 167, 119, 72, 18, 151, 105, 171, 160, 144, 85, 201, 193, 188, 190, 146, 210, 211, 63, 207} sorted list = {0, 1, 2, 3, 4, 7, 10, 12, 14, 15, 18, 19, 20, 24, 25, 27, 31, 33, 34, 36, 41, 42, 46, 49, 50, 52, 54, 55, 57, 58, 60, 63, 66, 72, 76, 77, 80, 81, 82, 85, 87, 93, 94, 99, 100, 102, 103, 105, 108, 109, 110, 111, 119, 121, 130, 136, 143, 144, 146, 150, 151, 159, 160, 167, 171, 188, 190, 193, 201, 207, 210, 211} The flag is below: cpaw{2112102072011931901881711671601591511501461441431361301211191111101091081051031021009994938785828180777672666360585755545250494642413634333127252420191815141210743210}
submit
なんとなくソートといえば、昇順に並べるイメージがあり、
そのまま文字列として繋げて出力してしまったため、cpaw{昇順}
で提出してしまい、
一度 invalid answer
をくらってしまいました。問題文はよく読みましょう、ですね (自戒)。
ということで、今回も提出完了です。
ここまでで、Level 1
の問題をなんとか完答することができました。
僕は割とこういった、キリの良いところ、でやめてしまう性分があるので、
なんとか Level 2
以上の問題についても、そして Level 1
で後回しにした知識の部分に関しても、
今後とも、きちんとフォローしていけたらな、と思っています (気持ちだけはある...)。
続きがあることを信じて。それでは。
[CpawCTF] 第八夜: 簡単な Hash を戻す
Q12.[Crypto]HashHashHash!
以下、問題文
Q12.[Crypto]HashHashHash!
10pt
ハッシュ関数とは、値を入れたら絶対にもとに戻せないハッシュ値と呼ばれる値が返ってくる関数です。
ですが、レインボーテーブルなどでいくつかのハッシュ関数は元に戻せてしまう時代になってしまいました。
以下のSHA1というハッシュ関数で作られたハッシュ値を元に戻してみてください!(ヒント:googleで検索)
e4c6bced9edff99746401bd077afa92860f83de3
フラグは
cpaw{ハッシュを戻した値}
です。
答案
今回は hash値
を元に戻そう、という問題らしいです。
ところで hash値
もとい、これを作る hash関数
は簡単にいうと、
「入力に対して、一対一で対応する返事をする関数で、逆演算が『大変な』もの」
という関数になります。
逆演算とは「一旦 hash関数
にかけて暗号化したものを元の入力に戻す」ということです。(だいたい)
用途としては、 返事が入力と一対一で対応しているので (ここが割と大事) 、入力すべきものを何かしら隠したい、などという場合に使われます。
例えば、パスワードを平文のまま使ったり、保存したりすると危ないので、
hash関数
にかけたものを保存しておいたりする、という、いわゆる「暗号化」の一種として使われます。
前にやった問題いくつかの、「古典的」ではない方の暗号...
コンピュータの長く短い歴史の中で、 暗号は「解くのに時間や労力がかかる難しいもの」であること (数年計算しないと元に戻せない、など) を前提に作られ、 コンピュータの性能が上がったり、頭がめちゃくちゃ良い人が解析する方法を見つけてしまったりして、 より難しいものを採択し、アルゴリズムをアップデートしていく...
という、いわば「いたちごっこ」の上で進んできました。
なので、今のコンピュータの性能や、今までに培われてきた理論や技術を用いれば 昔の暗号の一部分は解くことができてしまいます。
今回も、簡単な hash関数
にかけられた値であるようなので、
今までに培われたなんらかの方法で元に戻す手段があるのでしょう。
検索していきます。
キーワードは、今回使われている hash関数
(hash値
を作る方法) がsha1
である、ということです。(問題文より)
sha1 戻す [検索]
sha1 解析 [検索]
などで探していきます。
方法
簡単な hash値
を元に戻す、というWebサービスがあるみたいです。怖いですね。
具体的な方法は、書いてあったり、書いてなかったり、参考サイトに書いてあるものをそのまま引用すれば
簡単な
hash関数
に対して、考えられる入力と、その出力をたくさんDB
に登録しておいて、 出力側で一致すれば、入力がDB
の関連により求められる。
ということらしいです。
一体いくつ登録されているのでしょう...
また、上記のような総当たり形式ではなくとも、 もしかしたら裏側で解析のための何かしらのアルゴリズムが動いている、などという可能性もあるかと考えられます。
とりあえず、今回は参考に上がっておりました Hash Toolkit というサイトを使わせていただきます。
サイトに載っている説明をみると
What is Hash Toolkit?
Decrypt password hashes super fast with Hash Toolkit. You can decode hashes into the original text. You also can generate hashes using different algorithms. Hashes are used for many applications like security, authentication and passwords.
「hash関数
により作られたパスワードをめっちゃ早くデクリプト (解析する, 元に戻す, みたいな意味) できるよ。
ハッシュを戻すこともできるし、もちろん hash値
を geneることもできるよ。」だそうです。
Is it possible to decode a hash?
Hash functions are built in a way that it's very easy to generate a hash / fingerprint for a text, but almost impossible to decode the hash back to the original text.
「hash値
を元に戻すことなんて、できるの?」という項目がありますが、これに対し
「hash関数
は超簡単に hash値
を作ることができるように設計されているが、だいたいに於いて、逆演算して元のオリジナルなテキストを得るのは難しいです (´・ω・`)」と、なんだか曖昧なことが書かれていますね。
きっと、「いくつか戻せるものもあって、そういったものは戻せる」(小泉進○郎構文??) ということなのでしょう。
いつも通り、前置きが長くなってきたところで、早速 Flag
をゲットしに行こうと思います。
ページの中間くらいに、hash
を生成するアルゴリズムが選べるので、問題文にある通り sha1
を選択します。
ちょっと見辛いですが、写真左上にあります。
実際のページでは、真ん中にあります... (スクショ撮ってしまうと、実際のページとずれるので、ご容赦ください)
ページ上部に、「ここに hash値
を入れてください」と言わんばかりの入力窓があるので、
問題文から hash値
をコピってここに入力し、虫眼鏡マークをクリックします。
すぐにデクリプトした、オリジナルな値が帰ってきました。
Shal
だそうです。
思ったより短いですが、問題文に従い cpaw{Shal}
で Flag
を提出してみます。
submit
一度、cpaw{shal}
と s
の大文字小文字を間違えて提出してしまったので、invalid answer
を食らってしまいました...
みなさまもお気をつけください...
無事、受理していただけました。
今回は何かプログラムを書いた訳でもないですし、
自分で何かを使って解析した訳でもなく、
web
サービスを使わせていただいただけなので...
「やった感」が小さいですが、クリアはクリアなので、この辺で失礼します。
次回はソートの問題らしいです。
[CpawCTF] 第七夜: パケット解析 (しません)
Q11.[Network]pcap
以下、問題文
Q11.[Network]pcap 10pt
ネットワークを流れているデータはパケットというデータの塊です。
それを保存したのがpcapファイルです。
pcapファイルを開いて、ネットワークにふれてみましょう!
答案
今回は問題に pcap
ファイルというのが添付されています。
説明によると、この pcap
ファイルはパケット (の一部) を保存したファイルのようです。
この中に Flag
が隠れているそうなので、早速見つけていきましょう。
解析スタート
いつも通り、ダウンロードした場所で、ファイルをダブルクリックすると 「このファイルを開けるアプリケーションが見つかりません」という警告をくらいます。
pcap
ファイルは、ネットワークを流れる「パケット」というデータのカケラ (分割) の一部を保存したファイルであり、
この中身を覗き見るには、それを解釈することのできるツールが必要なようです。
ちなみに、pcap
ファイルを作成するには、
tcpdump
というコマンドを使ったり、
scapy
という python
ライブラリなどを使うとできるみたいです。
このブログの主題は CTF
であり、本題から逸れるのでここでは詳しくは語りませんが、
pcap
ファイルを作ったり、それを解析したりすることで、ネットワークのパケット通信に関して理解が深まると共に、
これを定期的に目的を持って行えば、普段サーバがどのような相手と通信をしていたり、不正な通信を受けていないか
などを知ることができるのではないでしょうか? そんなことないのかな...?
いつかそんなことも行えるようになったらな、と思います。
その日までとにかく知識を少しでもつけなければ...
少々前置きが長くなりましたが、
pcap
ファイルを解析するのに、よく wireshark という (フリー) ツールが使われるようです。
以下、窓の杜より引用。
多くのプロトコルに対応した高機能なパケット取得・プロトコル解析ソフト。 ネットワークに流れるパケット情報をリアルタイムで調査できる。 有線・無線LANや“InfiniBand”などさまざまなインターフェイスに対応している。
本ソフトの画面は縦に3分割されており、画面上段のリストには[Capture]-[Interface]メニューで選択したネットワークインターフェイスを流れるパケットがリアルタイムでリスト表示される。また、プロトコルやポート、IPアドレスなどの条件を組み合わせてフィルタリングしたり、指定したルールに従って色分け表示することも可能。
画面上段のリストからパケットを選択すると、画面中段には選択されたパケットの詳細情報が表示され、画面下段にはパケットデータが16進数でダンプ表示される。ほかにも、ネットワークを流れるパケット情報の統計を表示する機能などが搭載されており、ネットワーク不調の原因調査などに役立つ。
さらに、wireshark
には CUI
で使える tshark
というコマンドがあるらしいです。
僕はなるべく CUI
で済ませたいマンなので、tshark
を選んでいきます。
のちにこの性格がトラブルを引き起こすことを今はまだ知らない...
tshark
のインストール
- in
ubuntu
$ tshark Command 'tshark' not found, but can be installed with: sudo apt install tshark $ sudo apt install tshark
- in
mac
$ brew install wireshark
ちなみに、$ brew install tshark
とすると、Error: No available formula with the name "tshark"
と言われてしまいます。
導入は こちら を参考にさせていただきました。
tshark
の基本的な使い方は こちらを。
use tshark
さて、インストールも済んだことなので、早速 pcap
ファイルの調査といきます。
tshark
の -r option
にファイルを指定すると、中身を覗き込むことができるようです。
$ tshark -r network10.pcap 1 0.000000 169.254.144.80 → 169.254.144.81 IPv4 60 IPv6 hop-by-hop options[Malformed Packet] 2 0.000080 169.254.144.81 → 169.254.144.80 ICMP 82 Destination unreachable (Protocol unreachable)
うーーん?? これは grep
などをしなくても、ここに Flag
がないことがわかります。
何か別の表示が必要なのかと思い、man tshark
を読んで、detail
とかで検索したり、tshark -h
をして、再び検索したりしましたが、
とにかく分量が多くて (あと、英語ですし) 何をすればいいのか、皆目見当つかないという状況になってしまいました。
前回参考にさせていただいた writeup に再び手を伸ばすと、
wireshark
では見れるが、tshark
では「答えが得られなかった」という文が書かれています...
そこで mac
内で wireshark
を探し起動しようとしますが、見つからない。
改めてダウンロードするのも癪なので (tshark
は動いてますし)
このままいけるとこまでゴリ押してやろう、という気持ちになりました。
ウチ、tshark
で Flag
見つけたる!
まずは tshark
で Flag
を見つけた先人がいないか、検索しますが、
writeup
を見れど見れど、 wireshark
しか出てこない。
とにかく手に入った情報です。wireshark
をお使いの方々がどう見えるのかだけ探ります。
ふむ。どうやら、2 Frame 目に Flag
に関する情報があるようです。
ここで、前回 writeup の方が、-V option
をつけているので、
この option をつけてみるも、長い出力が出てきていちいち探す気になれません。
$ tshark -r network10.pcap -V | grep -i 'flag' Flags: 0x0000 Flags: 0x0000 Flags: 0x0000 $ tshark -r network10.pcap -V | grep -i 'cpaw' (該当なし)
上記のように、検索は不発です。
もっと、tshark
の option を知らねばいかん、ということで、tshark option
で日本語の情報を検索 (本当は英語で読めるようにならねば...)
tshark オプションメモ というページを参考にさせていただきます。
オプションにはだいたい、以下の種別があるようです。(これは英語でもなんとなく...)
この中から線がありそうなものを片っ端から試していきます。 あたりをつける基準は「表示を追加」とか書いてある option です。
すると、出力関連の -x option
で無事ヒットしました。
-x
:hex, ACSII
ダンプ表示を追加。
$ tshark -r network10.pcap -x 0000 70 58 12 24 49 0d 58 55 ca 24 2e 08 08 00 45 00 pX.$I.XU.$....E. 0010 00 28 00 01 00 00 40 00 06 37 a9 fe 90 50 a9 fe .(....@..7...P.. 0020 90 51 63 70 61 77 7b 67 6f 63 68 69 5f 75 73 61 .Qcpaw{gochi_usa 0030 5f 6b 61 6d 69 7d 00 00 00 00 00 00 _kami}...... 0000 58 55 ca 24 2e 08 70 58 12 24 49 0d 08 00 45 c0 XU.$..pX.$I...E. 0010 00 44 73 16 00 00 40 01 92 44 a9 fe 90 51 a9 fe .Ds...@..D...Q.. 0020 90 50 03 02 e7 b4 00 00 00 00 45 00 00 28 00 01 .P........E..(.. 0030 00 00 40 00 06 37 a9 fe 90 50 a9 fe 90 51 63 70 ..@..7...P...Qcp 0040 61 77 7b 67 6f 63 68 69 5f 75 73 61 5f 6b 61 6d aw{gochi_usa_kam 0050 69 7d i}
なんだか、GUI で見覚えのある 16進数っぽい表示と、それから右に文章ですね。
-x option
は 窓の杜 さんの文章で言う所の
画面下段にはパケットデータが16進数でダンプ表示される。
という部分でしょうか。
-V option
は 「画面中段には選択されたパケットの詳細情報が表示され」に該当??
最初に見た 169.254.144.80 <-> 169.254.144.81
間の通信は、パケットデータとして、Flag
の内容 (+ アルファ) を送りあっていたのでしょうか?
残念ながら今の私の知識では、そこまではわかりません。 己の力不足をひしひしと感じております。
submit
さて、何はともあれ、cpaw{gochi_usa_kami}
という Flag
が見つかったので、提出します。
此度も一悶着ありましたが、無事 10pt 獲得です。
パケット通信は、一応情報系の研究室に所属する身として、一度きちんと勉強したんですが ( マスタリングTCP/IP とか使って...) 実のところ、試験を乗り越える程度の理解しかできておらず、実用に足りてないし、自分の身にはなっていないので、 これを気にまた勉強し直そうと思います。
CTF
をやっていなかったら、pcap
ファイルとか、パケット解析とか、
そういったことに対して全く無知のままだろうと思うので、
このタイミングでこういった知識に出会うことができて、早速 CTF
に参加したことへのありがたみと言いますか、
良さみみたいなものを感じております。(語彙力)
ということで、今回もこの辺で失礼いたします。
次回は hash! hash! hash!
だそうです。
別解
なんとなく、less
コマンドで「バイナリファイルだろうけど、それでも見る?」
という警告を無視して閲覧すると、Flag
が出てきました。
悲しい。
以上です。
[CpawCTF] 第六夜: JPEG に埋もれた個人情報
Q10.[Forensics] River
以下、問題文
Q10.[Forensics] River
10pt
JPEGという画像ファイルのフォーマットでは、撮影時の日時、使われたカメラ、位置情報など様々な情報(Exif情報)が付加されることがあるらしい。 この情報から、写真に写っている川の名前を特定して欲しい。
問題ファイル: river.jpg
FLAGの形式は、"cpaw{river_name}"
例:隅田川 → cpaw{sumidagawa}
答案
今回は問題文に jpeg
形式で保存された写真が添付されているようです。
この写真がどこで撮影されたものなのかがわかれば、それが直接 Flag
になるみたいですね。
何はともあれ、画像をダウンロードします。
見たことない場所ですね。 知っている人にとっては、一瞬でクリアな問題なのでしょうか
あ、いや、そういう問題ではないようです。 以下の文面に着目します。
JPEGという画像ファイルのフォーマットでは、... 位置情報など様々な情報(Exif情報)が付加されることがあるらしい。
jpeg
に付加される Exif
情報には、位置情報が含まれるらしいので、これがわかれば Flag
のヒントになりそうです。
ところで、Exif
情報とはなんでしょう...? 初耳です。
以下、wikipedia より引用。
Exchangeable image file format(エクスチェンジャブル・イメージ・ファイル・フォーマット)は、富士フイルムが開発し、当時の日本電子工業振興協会 (JEIDA)で規格化された、写真用のメタデータを含む画像ファイルフォーマット。デジタルカメラの画像の保存に使われる。略称はExifで「エグジフ」(もしくは「イグジフ」)。
直訳すると「画像に勝手に付け加えられる情報のフォーマット」というところでしょうか。
jpg
ってせっかく情報落として、圧縮効率高めているのに、余計な (?) 情報付与して大きくしないほうがいいのではないか...? という意見は考えなかったことにします。
プリントなどする際には「カメラがどんなものだったか」という情報や、画像処理の際に「ISO 感度, シャ速, 絞り」などがあると何かと応用が効くらしいです。 あまりやらないので、わからないすけど
ただ、写真に位置情報などの個人情報が残ってしまうって、個人的にはゾッとしますけど、SNS などにアップロードするときには、このうちのいくつかが削除されるなどの対策が取られているらしいです。
Exif
情報は、PNG
に対応してないので、写真を撮影したものを jpg
で保存されたものを、スクショ撮って png
にして...とかって書いてありますが、それもう (以下略)
とまあ、Exif
情報に関して、斜め読みしたところで、
これを見る (調べる) 方法を探していきましょう。
exif 情報 確認 [検索]
とすると、
EXIF確認君 - 画像情報解析ツール というのが出てきますね。
ここに、問題から入手した画像をアップロードしてみましょう。
右に、GPS, 地図というタブあるので、それぞれ選択してみます。
どうやら「甲突川」という場所だろう、ということが地図からわかります。
読みがわからないので、調べると「こうつきがわ」と読むらしいです。
問題文下部にある回答の例を見ると
隅田川 -> cpaw{sumidagawa}
なので
甲突川 -> cpaw{koutukigawa}
で Flag Get
でしょう。
submit
Flag
が見つかったので、提出します。
弾かれてしまいました?
おや? と思い他の方の writeup
を拝見すると、「甲突川」のスペルは「koutsukigawa」だそうです。
Flagはcpaw{koutsukigawa}
一悶着ありましたが、無事 10pt 獲得です。 ごちそうさまでした。
次回は、パケットの一部を保存したファイルを解析せよ、とのこと。
こういうことが知りたかったんだよ〜。ということで次回も張り切っていきます。
別解
exiftool
という Perl
製のライブラリ / コマンド使っても (こちらでは、緯度経度が) 求められるそうです。
私のメインPC は macbook なので、Homebrew
で入れるには
brew install exiftool
すれば良いそうです。
サーバは Ubuntu
派なので、Ubuntu
で呼び出してみたら「libimage-exiftool-perl
から取得してくれ」と言われました。
どっちでも使えるっぽいですね。
$ exiftool Command 'exiftool' not found, but can be installed with: sudo apt install libimage-exiftool-perl
使用方法はざっくりと以下の通り。
# man $ exiftool # exif 情報を表示する $ exiftool {ファイル名} # 日本語で表示 (タブがバラバラになるのでオススメしない...) $ exiftool -lang ja {ファイル名}
今回の問題に対する実行結果です。
$ exiftool ~/Downloads/river.jpg ExifTool Version Number : 11.85 File Name : river.jpg Directory : /Users/sudachi/Downloads File Size : 414 kB ...(中略) GPS Position : 31 deg 35' 2.76" N, 130 deg 32' 51.73" E
これで 緯度経度の位置がわかるので、Google map にでも渡せば、場所がわかるカモですね。
ちなみに、Google map で検索するには、緯度と経度それぞれの初めにある「XXX deg
」の部分を「XXX°
」に変える必要がありそうです。
元: 31 deg 35' 2.76" N, 130 deg 32' 51.73" E 検索用: 31° 35' 2.76" N, 130° 32' 51.73" E
以上です。
[CpawCTF] 第五夜: HTML から Flag を見つける
Q9.[Web] HTML Page
以下、問題文
Q9.[Web] HTML Page
10pt
HTML(Hyper Text Markup Language)は、Webサイトを記述するための言語です。 ページに表示されている部分以外にも、ページをより良くみせるためのデータが含まれています。 次のWebサイトからフラグを探して下さい。 http://q9.ctf.cpaw.site
※この問題のサーバへの攻撃はお止めください。
答案
今回は問題文に web
ページの URL
が提示されていますね。
どうやら、この中に Flag
が隠れているようです。
とりあえず、URL
を踏んで、所定のページにアクセスしてみますが、これは一般的なページのようです。
このページ自体は、第一夜にて取り上げましたが...
内容は CTF
のジャンルや、問題の種類、モチベーション、身につくスキル、関連ページへのリンクなど、
CTF
に関してよくまとまっていると思います。
ぱっと見、Flag
っぽい文字列はないですが、Cmd + f
でページを検索してみます。
検索キーワードは、トップページに、Flag
は全部 cpaw{hogehoge}
で書かれています、というヒントがあるので
cpaw
と入れてみます。
が、Flag
っぽいものはありませんでした。
さて、あと思い当たることとして、HTML
内にコメントなどで書かれているというケースです。
web
ページは HTML
で書かれているわけですが、
これは実際に表示されている文字が書かれている以外にも、
<> ~ </>
で書かれるタグがあったり、
見栄えをよくするため CSS
とか、(このページは) Bootstrap
などのフレームとかのあれこれが書かれており
一文字一文字、あるいは一行一行読んでいくには面倒です (面倒くさがりなだけ)。
そこで、困ったのでまた「検索」します。
HTML
と言えど、文字列の塊なので、この中から所望の文字列に一致する部分を探しましょう。
問題文にある URL
を curl
に渡して、Q9 に提示されているページの HTML
を拾います。
これをそのまま、パイプラインで grep
に渡してみます。
先ほどと同じく、キーワードは cpaw
で検索してみましょう。
$ curl http://q9.ctf.cpaw.site/ | grep -n cpaw
-n option
は 見つかった cpaw
を含む行が、Q9 の HTML
の何行目にあるのか出力して欲しいのでつけております。
10: <meta name="description" content="flag is cpaw{9216ddf84851f15a46662eb04759d2bebacac666}">
10行目にあるらしいです。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> <meta name="keyword" content="ctf,flag"> <meta name="description" content="flag is cpaw{9216ddf84851f15a46662eb04759d2bebacac666}"> <meta name="author" content="takahoyo">
ありました。
これ見るとむしろ、cpaw
というよりは、flag
で検索されることを想定している感じなのですかね...
ちなみに、大文字、小文字に鈍感にする option -i
をつけると、
Chrome
で検索した方も出てきますね。
$ curl http://q9.ctf.cpaw.site/ | grep -n -i "cpaw" 10: <meta name="description" content="flag is cpaw{9216ddf84851f15a46662eb04759d2bebacac666}"> 69: <p>クイズ形式(Jeopardy形式)は、数問のコンピュータやセキュリティに関する問題が与えられて、その問題を解く形式である。Cpaw CTFもこれに当てはまる。
余談でした。
submit
Flag
が見つかったので、提出して終了です。
次は、JEPG
ファイルの属性から、川の場所を特定する問題だそうです...。
そういうことをするのは初めてだ...