俺的 Capture The Flag Writeup

Capture The Flag に挑戦したときの記録を自分用にドキュメント化して置いておくだけのブログ。

[CpawCTF] 第十一夜: リダイレクト

Q15.[Web] Redirect

以下、問題文

Q15.[Web] Redirect

100pt

このURLにアクセスすると、他のページにリダイレクトされてしまうらしい。

果たしてリダイレクトはどのようにされているのだろうか…

http://q15.ctf.cpaw.site

※この問題のサーバへの攻撃はお止め下さい

答案

cpawCTF Level 2 第二問目の挑戦です。

まずは問題文にある URL を踏んでみます。

すると、Level 1Q9 のページに飛ぶようです。 Q15 のリンクのはずが、Q9 に飛んでいるということで、 問題文に書かれているように「リダイレクト」がされているということでしょうか。

今回も今回とて、わかりませんね。

どこに Flag が隠されているのか、全くもって見当がつきません。

先人の Write up を拝見します。

Developer tools を開き (F12 key) 、Elements タブから、Networkタブに遷移します。

f:id:comeonknowhow:20200602015545p:plain
Developer tools

Network タブが開かれた状態で、 問題文のリンクをクリックし

f:id:comeonknowhow:20200602015650p:plain
q15 site link

Developer toolsq15.ctf.cpaw.site という部分をさらに探ると、X-Flagというところに Flag があるようです。

f:id:comeonknowhow:20200602015713p:plain
302 Redirect

f:id:comeonknowhow:20200602015805p:plain
XFlag

こちらの方 はご丁寧に図を載せてくださっており、 わかりやすかったです。

submit

f:id:comeonknowhow:20200602015835p:plain
submit

Level 2 ... 急に難易度上がりすぎでは... という気持ちでいっぱいです。

余談

HTTP ステータスコード の302 は、リダイレクトの中でも 「遷移先が一時的に移動しているので、サーバ側で追加処理しました」 みたいな状態らしいです。

HTTPステータスコード「302リダイレクト」とは

[CpawCTF] 第十夜: 隠されたフラグ

Q13.[Stego]隠されたフラグ

以下、問題文

Q13.[Stego]隠されたフラグ

100pt

以下の画像には、実はフラグが隠されています。

目を凝らして画像を見てみると、すみっこに何かが…!!!!

フラグの形式はcpaw{***}です。フラグは小文字にしてください。

stego100.jpg

答案

さて、久しぶりの更新となりましたが、今回から cpawCTF Level 2 への挑戦となります。

問題をチラチラと見る限り、だいぶレベルが上がったな、という印象を受けました。

今回はその第一問目です。

それでは以下、回答を始めます。

まずは問題文に添付されている画像をダウンロードします。

f:id:comeonknowhow:20200531011734j:plain
stego100.jpg

問題文にもある通り、端っこに黒い「何か」が隠されていることが一目見てわかります。

「黒い点」と、それから「黒い棒」の集まりのようですが、 私にはこれが何を意味するのか、わかりませんでした。

仕方ないので、検索します。

これは言い訳なのですが、 「見て、考えて、わからなければ、人に聞くか調べる」という流れが大事だと考えます。

特に初めて出会ったものなどは、 解き方を知らなかったり、 自分の知っている範囲内のこととの繋がりが曖昧だったりして、 なかなか答えまでたどり着けない、という場合も少なくありません。

そういったときに、先人たちが解いたときの軌跡を辿ることで 自分の知見とする、ということも知的な営みの一つであると思います。

2回目、3回目で「またこれか」となるように 自分の中に確かな体験を持っておくことが重要なのです。 (自分に言い聞かせながら)

もちろん、「自分で考えること」もとても重要です! バランスの問題です。バランス。バランス...

さて、話がずれてしまいましたが、ご存知の方々からすると この「. (点)」と「- (棒)」 の集まりといえば、 ズバリ「モールス信号」だ、とのことです。

「.」 が「トン」、「-」 が 「ツー」ですね。

この「トン」と「ツー」の組み合わせで文字を表現し、 遠く離れた相手にメッセージを送るのがモールス信号だったはずです。

文字の表記が少しわかりにくいですが、こちらが参考になるかと思います。

いや、なるほどですね。 日常でモールス信号に出会うことなんてありませんし... あ、でもそういえば映画「崖の上のポニョ」で、出て来たような...

現在では、自然言語の文字列 (ひらがな or アルファベット?) とモールス信号を相互に変換するサイト、 なんて素晴らしいサービスがあるようなので、それを使ってみます。

文字列は問題画像の左上と、右下にある点と棒の集合の両方を合わせたものです。

以下の2点に注意してください。

  • 途中区切り (スペース) があること。これで一文字の切れ目を判別します。
  • 英語 (アルファベット) に対応させること。(日本語だと、意味不明な文字列になります...)
# 変換前: 
-.-. .--. .- .-- .... .. -.. -.. . -. ..--.- -- . ... ... .- --. . ---... -.--.-

# --- decode --- #

# 変換後: 
CPAWHIDDEN_MESSAGE:)

submit

ということで、Flag である cpaw{hidden_message:)} を得ることができました。

先頭の CPAWcpaw{} 部分に相当するらしいので、{}内の文字列に含めないよう、注意が必要でした。

f:id:comeonknowhow:20200531014008p:plain
submit

f:id:comeonknowhow:20200531014022p:plain
accepted

なんとか、 (先人の方々のお力を借りながら...) 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

f:id:comeonknowhow:20200525222319p:plain
submit

なんとなくソートといえば、昇順に並べるイメージがあり、 そのまま文字列として繋げて出力してしまったため、cpaw{昇順} で提出してしまい、 一度 invalid answer をくらってしまいました。問題文はよく読みましょう、ですね (自戒)。

f:id:comeonknowhow:20200525222336p:plain
accepted

ということで、今回も提出完了です。

ここまでで、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 を選択します。

f:id:comeonknowhow:20200524190502p:plain
sha1

ちょっと見辛いですが、写真左上にあります。

実際のページでは、真ん中にあります... (スクショ撮ってしまうと、実際のページとずれるので、ご容赦ください)

ページ上部に、「ここに hash値 を入れてください」と言わんばかりの入力窓があるので、 問題文から hash値 をコピってここに入力し、虫眼鏡マークをクリックします。

f:id:comeonknowhow:20200524190729p:plain
decrypt

すぐにデクリプトした、オリジナルな値が帰ってきました。

f:id:comeonknowhow:20200524190812p:plain
original text

Shal だそうです。

思ったより短いですが、問題文に従い cpaw{Shal}Flag を提出してみます。

submit

f:id:comeonknowhow:20200524190910p:plain
submit

一度、cpaw{shal}s の大文字小文字を間違えて提出してしまったので、invalid answer を食らってしまいました... みなさまもお気をつけください...

f:id:comeonknowhow:20200524191029p:plain
accepted

無事、受理していただけました。

今回は何かプログラムを書いた訳でもないですし、 自分で何かを使って解析した訳でもなく、 web サービスを使わせていただいただけなので... 「やった感」が小さいですが、クリアはクリアなので、この辺で失礼します。

次回はソートの問題らしいです。

[CpawCTF] 第七夜: パケット解析 (しません)

Q11.[Network]pcap

以下、問題文

Q11.[Network]pcap 10pt

ネットワークを流れているデータはパケットというデータの塊です。

それを保存したのがpcapファイルです。

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 は動いてますし) このままいけるとこまでゴリ押してやろう、という気持ちになりました。

ウチ、tsharkFlag 見つけたる!

まずは tsharkFlag を見つけた先人がいないか、検索しますが、 writeup を見れど見れど、 wireshark しか出てこない。

例: CpawCTF Q11.[Network]pcap

とにかく手に入った情報です。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 が見つかったので、提出します。

f:id:comeonknowhow:20200522022048p:plain
submit

f:id:comeonknowhow:20200522022102p:plain
accepted

此度も一悶着ありましたが、無事 10pt 獲得です。

パケット通信は、一応情報系の研究室に所属する身として、一度きちんと勉強したんですが ( マスタリングTCP/IP とか使って...) 実のところ、試験を乗り越える程度の理解しかできておらず、実用に足りてないし、自分の身にはなっていないので、 これを気にまた勉強し直そうと思います。

CTF をやっていなかったら、pcap ファイルとか、パケット解析とか、 そういったことに対して全く無知のままだろうと思うので、 このタイミングでこういった知識に出会うことができて、早速 CTF に参加したことへのありがたみと言いますか、 良さみみたいなものを感じております。(語彙力)

ということで、今回もこの辺で失礼いたします。 次回は hash! hash! hash! だそうです。

別解

なんとなく、less コマンドで「バイナリファイルだろうけど、それでも見る?」 という警告を無視して閲覧すると、Flag が出てきました。

悲しい。

f:id:comeonknowhow:20200522022300p:plain
less

以上です。

[CpawCTF] 第六夜: JPEG に埋もれた個人情報

Q10.[Forensics] River

以下、問題文

Q10.[Forensics] River

10pt

JPEGという画像ファイルのフォーマットでは、撮影時の日時、使われたカメラ、位置情報など様々な情報(Exif情報)が付加されることがあるらしい。 この情報から、写真に写っている川の名前を特定して欲しい。

問題ファイル: river.jpg

FLAGの形式は、"cpaw{river_name}"

例:隅田川 → cpaw{sumidagawa}

答案

今回は問題文に jpeg 形式で保存された写真が添付されているようです。 この写真がどこで撮影されたものなのかがわかれば、それが直接 Flag になるみたいですね。

何はともあれ、画像をダウンロードします。

f:id:comeonknowhow:20200519182837j:plain
river.jpg

見たことない場所ですね。 知っている人にとっては、一瞬でクリアな問題なのでしょうか

あ、いや、そういう問題ではないようです。 以下の文面に着目します。

JPEGという画像ファイルのフォーマットでは、... 位置情報など様々な情報(Exif情報)が付加されることがあるらしい。

jpeg に付加される Exif 情報には、位置情報が含まれるらしいので、これがわかれば Flag のヒントになりそうです。

ところで、Exif 情報とはなんでしょう...? 初耳です。

以下、wikipedia より引用。

Exchangeable image file format(エクスチェンジャブル・イメージ・ファイル・フォーマット)は、富士フイルムが開発し、当時の日本電子工業振興協会 (JEIDA)で規格化された、写真用のメタデータを含む画像ファイルフォーマット。デジタルカメラの画像の保存に使われる。略称はExifで「エグジフ」(もしくは「イグジフ」)。

直訳すると「画像に勝手に付け加えられる情報のフォーマット」というところでしょうか。

jpg ってせっかく情報落として、圧縮効率高めているのに、余計な (?) 情報付与して大きくしないほうがいいのではないか...? という意見は考えなかったことにします。

プリントなどする際には「カメラがどんなものだったか」という情報や、画像処理の際に「ISO 感度, シャ速, 絞り」などがあると何かと応用が効くらしいです。 あまりやらないので、わからないすけど

ただ、写真に位置情報などの個人情報が残ってしまうって、個人的にはゾッとしますけど、SNS などにアップロードするときには、このうちのいくつかが削除されるなどの対策が取られているらしいです。

Exif 情報は、PNG に対応してないので、写真を撮影したものを jpg で保存されたものを、スクショ撮って png にして...とかって書いてありますが、それもう (以下略)

とまあ、Exif 情報に関して、斜め読みしたところで、 これを見る (調べる) 方法を探していきましょう。

exif 情報 確認 [検索] とすると、 EXIF確認君 - 画像情報解析ツール というのが出てきますね。

ここに、問題から入手した画像をアップロードしてみましょう。

f:id:comeonknowhow:20200519184319p:plain
EXIF情報確認君

右に、GPS, 地図というタブあるので、それぞれ選択してみます。

f:id:comeonknowhow:20200519184415p:plain
GPS

f:id:comeonknowhow:20200519232251p:plain
地図

どうやら「甲突川」という場所だろう、ということが地図からわかります。

読みがわからないので、調べると「こうつきがわ」と読むらしいです。

問題文下部にある回答の例を見ると 隅田川 -> cpaw{sumidagawa} なので
甲突川 -> cpaw{koutukigawa}Flag Get でしょう。

submit

Flag が見つかったので、提出します。

f:id:comeonknowhow:20200519184727p:plain
submit

弾かれてしまいました?

f:id:comeonknowhow:20200519184749p:plain
rejected

おや? と思い他の方の writeup を拝見すると、「甲突川」のスペルは「koutsukigawa」だそうです。

Flagはcpaw{koutsukigawa}

参考にさせていただいたサイト

f:id:comeonknowhow:20200519184929p:plain
re-submit

f:id:comeonknowhow:20200519184946p:plain
accepted

一悶着ありましたが、無事 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

使用方法はざっくりと以下の通り。

exiftool 使い方 参考

# 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 と入れてみます。

f:id:comeonknowhow:20200518030600p:plain
hint_in_toppage

が、Flag っぽいものはありませんでした。

f:id:comeonknowhow:20200518031225p:plain
result

さて、あと思い当たることとして、HTML 内にコメントなどで書かれているというケースです。

web ページは HTML で書かれているわけですが、 これは実際に表示されている文字が書かれている以外にも、 <> ~ </> で書かれるタグがあったり、 見栄えをよくするため CSS とか、(このページは) Bootstrap などのフレームとかのあれこれが書かれており 一文字一文字、あるいは一行一行読んでいくには面倒です (面倒くさがりなだけ)。

そこで、困ったのでまた「検索」します。 HTML と言えど、文字列の塊なので、この中から所望の文字列に一致する部分を探しましょう。

問題文にある URLcurl に渡して、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 が見つかったので、提出して終了です。

f:id:comeonknowhow:20200518030925p:plain
submit

f:id:comeonknowhow:20200518030944p:plain
accepted

次は、JEPG ファイルの属性から、川の場所を特定する問題だそうです...。 そういうことをするのは初めてだ...