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でスクリプトを組みました。
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: admin
、PASS: ' 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
反省
合計で1010点でした。
順位表では21位で、18位の方まで1010点だったので、そんなかんじです。
Forensicsの分野を1問も解けませんでした。
Find key1に関しては、一番上と一番下のフラグが偽物っぽかったので、似ているhttpリクエスト全てを偽物だと判断してしまいました。
Find key2は、zipファイルの取り出しまではできたのですが、その後2.pcapの中での立ち振舞いがクソでした。
運営の方がくれたwrite-upが素敵でした。
また、binaryのPlainの解説をしたので本をもらいました。
最近CTFを初めた自分にとって、基礎固め的な意味でとてもいい勉強会でした。
次はSECCONのオンライン予選です。記念として参加しようと思っています。チームメンバーがいないので誰か一緒に出ましょう。