CTF for ビギナーズ 2016 東京 自分がやった分 write-up

CTF for ビギナーズ

CTF for ビギナーズは、コンピュータセキュリティ技術を競う競技であるCTF (Capture The Flag) の初心者を対象とした勉強会です。本勉強会では、CTFに必要な知識を学ぶ専門講義と実際に問題に挑戦してCTFを体験してもらう演習を行います。

自分は東京の勉強会に参加してきました。

write-up

フラグは全て ctf4b{EXAMPLE} のような文字列でした。

Warmup

Welcome (10 pts)

問題文にあるフラグが答えでした。

Misc

CountUp Game (200 pts)

[Never say 21 game]
Rule:   1.Count up numbers alternately.
        2.Don't say 21(lose)
        3.When you win to me 10 times continuously, you can get a flag.

ncコマンドで繋げたサーバーと対話し、1,2,3のどれかを入力することができ、10回連続で勝つことができればフラグを取得することができます。

3つまで数字をカウントできるよくやったあのゲームです。

まず必勝法なのですが、今回は後攻でした。このルールの場合、後攻は全てのターンで4の倍数で数え終え続けることができれば必ず勝つことができます。
もっと単純に言うと、4 - 相手の出した数字の数 だけ数えあげれば勝つことができます。

[相手 : 1, 2, 3] [自分 : 4] [相手 : 5, 6] [自分 : 7, 8] [相手 : 9] [自分 : 10, 11, 12] [相手 : 13, 14, 15] [自分 : 16] [相手 : 17, 18] [自分 : 19, 20] [相手 : 21]

今回は10連続勝利ということで、必要な連続勝利回数もそんなに多くなく、自分は自分の手で10回勝ってしまいました。

自分の環境だけかもしれないけど外とネットで繋げなかったからncと繋ぐいい方法を調べられなかった。しっかり準備しておきたい。

You Win!

Congratz! flag is "ctf4b{7h3_51mpl3_numb3r_pl4y}"

てけいさん for ビギナーズ (200 pts)

1桁と1桁の四則演算を100回繰り返す問題でした。

最初はn + m、その後何問目かからn - m、さらに何問目かからはn * mというようになっていました。除算についてはしっかり確認してませんでした。ないかもしれないしあるかもしれない。

これはタイプミスのことを考えると、毎回手計算しているとどこかでミスりそうな気がしたので、Python3でスクリプトを組みました。

# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup

url = 'http://172.20.1.30/php_math/index.php'

s = requests.session()

req = s.get(url)
for i in range(103):
    soup = BeautifulSoup(req.text, "lxml")
    atags = soup.findAll("a")
    a0 = int(atags[0].text)
    a1 = int(atags[1].text)
    div = soup.find("div").text
    if "+" in div:
        ans = a0 + a1
    elif "-" in div:
        ans = a0 - a1
    elif "*" in div:
        ans = a0 * a1
    elif "/" in div:
        ans = a0 / a1
    else:
        print(soup)
    print(ans)
    req = s.post(url, data={"answer": ans})

何故100回以上回しているのかについては、100回回した後の挙動がわからなかった(意地悪なことをしてくるかもしれない)ため、-iをつけ実行後にインタラクティブモードに入り、その後の操作で柔軟に対応しようと考えたからです。

あまりよくないかもしれないし、もっといい方法があれば知りたい。

実行すると、100回回した後にエラーが吐き出され、インタラクティブモードに入りました。

>>> soup
<html><body><p>正解flag is ctf4b{85806158171ced5f3ccb7aca56a7a574f6dd8af8}</p></body></html>

Web

Fix it (100 pts)

問題文のURLにブラウザでアクセスすると、「どこかミスっててうまく動かない」みたいなことを言っていました。

chromeのdevtoolsを開き、リクエストに対するレスポンスを見てみると、Locatin:という値があり、そこにアクセスした後のページだったか、その値がフラグでした。

ctf4b{Locatin_is_typo_of_Location}

Can you login as admin? (200 pts)

adminとしてログインすることが目標の問題でした。

よく見かけるような簡単なSQLインジェクションのようでした。

クエリ文を直接.で繋げている?のかはわかりませんが、ID: adminPASS: ' or 1 = 1 'で通りました。

FLAG is ctf4b{SQLiNjec7ion_foR_beGInNer}

1M4G3 V13W3R (200 pts)

画像のアップローダーがあり、

  • 画像をアップロードすること
  • 画像を閲覧すること

ができるWebサービスが題材の、典型的なディレクトリトラバーサルの問題でした。

画像をクリックすると、http://172.20.1.60:31337/web200-2/view.php?file=b452a2840a43b8f3.jpgのような形のアドレスに飛び、画像が表示されます。

本日の勉強会で習ったように、とりあえずindex.phpを表示させようとしました。

http://172.20.1.60:31337/web200-2/view.php?file=../index.php

すると、思惑通りindex.phpの内容が表示された気がして、たしかフラグが表示されたと思います。

ctf4b{path_trav3rsal_1s_the_r3al_fun}

Binary

Plain (100 pts)

Plainという名前からして、stringsだろうなと思い、かけてみるとフラグが出てきました。

$ strings ./bin100

反省

f:id:naari_3:20161022225446p:plain

合計で1010点でした。

f:id:naari_3:20161022225345p:plain

順位表では21位で、18位の方まで1010点だったので、そんなかんじです。

Forensicsの分野を1問も解けませんでした。 Find key1に関しては、一番上と一番下のフラグが偽物っぽかったので、似ているhttpリクエスト全てを偽物だと判断してしまいました。 Find key2は、zipファイルの取り出しまではできたのですが、その後2.pcapの中での立ち振舞いがクソでした。

運営の方がくれたwrite-upが素敵でした。

また、binaryのPlainの解説をしたので本をもらいました。

デバッガによるx86プログラム解析入門【x64対応版】

デバッガによるx86プログラム解析入門【x64対応版】

最近CTFを初めた自分にとって、基礎固め的な意味でとてもいい勉強会でした。

次はSECCONのオンライン予選です。記念として参加しようと思っています。チームメンバーがいないので誰か一緒に出ましょう。

Androidアプリ開発処女膜を破る その1 環境を整える

動機

僕はたまに電車にのるのですが、毎回と言っていいほど頻繁に乗り過ごしてしまいます。

これが遊びに行く程度の用事なので乗り過ごしても何の損害もないのですが、もし将来自分がどこかの社員になっていたとして、そのまま乗り過ごして何かに遅刻するのはとても大変です。

余裕を持って出ればいいじゃないかと言われたこともありますが、生憎僕は先のことを考えずに今を大事にしてしまう人間なので、そんなことは「できたらいいな」程度にしか思えていません。

おそらくは僕が欠陥しているのだとは思いますが、そうだとしたらそれこそ何の打つ手もなくなってしまい困っています。

しかし、僕はパソコンを持っており、幸いスマートフォンも持っています。

つまり、自分で解決する手段を作ることが出来るわけです。

スマートフォンは本当に便利で、内蔵されたGPSを使えば地球上のどこにいるかが判別できるのです。
こんな便利なものだったら使わない他ないでしょう。

早速作っていこうと思います。

開発環境を整える

とは言っても何の準備もできていないので、まずは準備から始めます。

MacにAndroidStudioをインストール(update)する - Qiita

以上。

コードを書きはじめる一歩手前まで

Android Studioを起動し、New Projectをクリックしたところで、手が止まってしまった。

Application Nameは「GPS Notifier」でいいとして、Company Domainとは、、、?

パッケージ名

Javaのコードを書いた経験というのは、ほんの少ししかなく、既にこの時点で止まってしまいました。

調べてみると、どうやら

といった意味合いでCompany Domainの入力を求められていたようです。

しかし、僕は自分のドメインを持っていません。

が、ユニークになればいいので、それなりに適当な文字列を入れておくことにしましょう。

f:id:naari_3:20160923032546p:plain

Rendering Problems

次に進み、APIのレベルは自分の持っている全ての端末の最低条件であるAPI 19(4.4)にしてみます。
よくわかってないので、もしかしたら不都合が生まれるかもしれないです。

次に出てきた初期テンプレートみたいなものは一番シンプルそうなものを選びました。

これでようやくコードが書ける状態になりました。

と思いきや、何やらエラーが起きていました。

f:id:naari_3:20160923033221p:plain

Rendering Problems
Android N requires the IDE to be running with Java 1.8 or later
[Install a supported JDK](https://developer.android.com/preview/setup-sdk.html#java8)

要素?を配置する画面のレンダリングで失敗したらしいです。

Install a supported JDKをクリックすると、なんと404エラーのページに飛ばされました。

めんどくさくなったのでちょっと考えたのですが、今回は別にAndroid Nの事を考慮しなくてもいいのではないか?ということで、レンダリングを24(N向け)ではなく、22(多分M向け)まで下げてみました。

f:id:naari_3:20160923033732p:plain

どうやら上手くいったようで、それっぽい画面が描画されました。

次回からはコードを書いていきます。

寝られない時の

まず寝る前にレッドブルモンスターエナジーを飲むのは本当に辞めてくれ

 

寝てない場合、例外なく出発準備前に眠くなる

 

出発準備をしてしまえば動ける

 

風邪を引いた時、ほんとに寝てない時はやすめ

 

3連休で睡眠バランスを崩したら、24時間以上起きたりして無理やり寝る時間を整えろ

 

1時間だけの睡眠がすごくいい感じになる