ペネトレーションしのべくん

さようなら、すべてのセキュリティエンジニア

【CTF】CyberRebeatCTF Write-Up

概要

先日CyberRebeatCTFに単騎で参加したので、そのWrite-Up。1480点で82位だった。

ennach.sakura.ne.jp

f:id:befs_anne:20180911222407j:plain

※問題が全部表示されなかったので開発者ツールでCSSをいじったら右側が変な感じに

Binary(0/3)

全滅。幸先悪し。

Crypto(1/3)

Rotation

「P4P6S{9RN4RUNPXR45}」と換字式暗号?で暗号化されたflagを解読する問題。「P4P6S」が「CRCTF」であることは(他の問題から)明白なので、あとは力技で解読した。結局どういう対応なのかよく分かってないので、他のWrite-Upを見てみることにする。

|平文 |abcdefghijklmnopqrstuvwxyz|
|暗号文| opqrstuvwxyz0123456789   |
|確定 |  *  *           * *      |

Excercise(1/1)

Excercise

flagを送信するエクササイズ。

Misc(1/2)

Reame

ElectroHarmonixというカタカナっぽいアルファベットフォントで書かれた文章を読む。

www.ebook5.net

Programming(1/3)

Calculation

ncで接続すると、四則演算の計算問題が降ってきて、20問解くとflagが降ってくる。 Pythonでncするライブラリが公開されていたので、これをちょっといじってスクリプトに組み込んだ。便利。

Python Netcat · GitHub

$ diff netcat.py netcat_modified.py 
24c24,25
<             self.buff += self.socket.recv(1024)
---
>             #self.buff += self.socket.recv(1024)
>             self.buff += self.socket.recv(1024).decode('utf-8')

計算にはeval関数を使った。便利。

from netcat import Netcat                                                                                                                 

nc = Netcat('59.106.212.75', 8080)

while True:
    q = nc.read_until('\n')
    print(q)
    ans = str(eval(q.strip('\ufeff').strip('\n')))
    print(ans)
    nc.write(str(ans + '\n').encode('utf-8'))

flagが降ってくると例外で止まるのがちょっとダサい。

Recon(2/3)

Tweet

公式がflagをツイートしている。

CyberRebeatScripts

ennach/CyberRebeatScriptsというGithubリポジトリがあり、ファイルから削除されたflagをhistoryから見つける。

github.com

Stegano(1/3)

Secret.pdf

flag部分が黒く塗りつぶされたPDFを解析する問題。 ちょっとググったら以下のページが出てきたので、サンプルコードそのまま使ってクリアした。

tech.bita.jp

Trivia(2/2)

Monero

ヒントからソフトウェアの名前を導き出す問題(ソフトウェアの名前がそのままflagになる)。「Coinhive」が出てこなくてちょっとググるなどした。

Crossword

クロスワード。ググッてクリア。

Web(2/3)

White page

事前情報としてIDとパスワードが提示されているが、URLを開くと真っ白な画面にログインボタンのみ。ソースを見るとinputタグがstyle属性で消されているので、どうにかしてこれを無効化してIDとパスワードを入力してログインボタンを押せばクリア。他のWrite-Upを見ると開発者ツールでやってる人が多かったけど、私はBurp Proxyでやった。

Let's Tweet!

「#CyberRebeatCTF」が含まれるツイートを促すサイトが舞台。同ハッシュタグを含むツイートのURLを送信すると以下の処理が上から行われ、全てをパスできたらflagがもらえて、その時に使ったURLはDBに格納される(コードは事前に提供されている)。

  • ツイートのURLの形式(後述)であることのチェック
  • 指定したハッシュタグが含まれているかのチェック
  • データベースに同一URLがないかのチェック

素直にツイートすればflagが手に入るわけだけど、「もしツイートしたくない、あるいはツイッターのアカウントを持っていないという場合でも、FLAGの取得は可能です。」の一文がある以上、ツイートするわけにはいかない。

ガチャガチャいじってたらあっけなく通ってしまった。ツイートのURLは「https://twitter.com/{{アカウント名}}/status/{{ツイートID}}」のような作りになっているが、どうやらツイートIDさえ正しければ(実在するものであれば)、アカウント名が誤っていても本来のURLにリダイレクトされるようになっているらしい。例えば、以下のリンクは上が本来のURLだが、下のURLでも同じツイートに辿り着ける。

https://twitter.com/befs_anne/status/1039361451050196992 https://twitter.com/shinobe/status/1039361451050196992

これを利用して、既に存在している「#CyberRebeatCTF」が含まれたツイートのURLのアカウント名を適当に変えたURLを送信してやれば、表層的なURLのチェックしか行われないため、(たとえ実際のツイートがDBに登録済みであっても)別のツイートと判断されてクリアできるという寸法。

感想

ctf4bと比べて易しく感じた。問題数も多いので満足。スキルはまだ乏しいものの、WebやProgrammingなどはctf4bから着実に前進できていると思う。Binaryは引き続き課題。