みつのCTF精進記録

プログラム書いたりCTFやったりするゆるゆるなブログです。

CyberRebeatCTF に参加しました!

はじめに

タイトルの通り CyberRebeatCTF に参加しました! " CyberRebeat " というノベルゲームの英語版が Steam ででたようで、その祝いとして開催されたようです。

自分は「ソロリンピック」とかいうクソださチーム名でその名の通り一人で参加してました。一つのジャンルに集中できないので大変でした...。順位は 3338 点で全体 25 位で健闘はできたのかな~とは思っています。今度は複数人で参加したいですね。

あとゲーム作りたいです。

以下 Write-up です。

 

Exercise (Exercise 10)

f:id:mi__tsu:20180909154237p:plain

 

Rotation (Crypto 10)

P4P6S{} が CRCTF{} だろうなーって予想してエスパーしました。

 

FLAG.encrypted (Crypto 200)

普通の RSA で安心しました。公開鍵と暗号文が渡され、公開鍵を見てみると明らかに e の値が大きかったので Wiener's Attack でやりました。

f:id:mi__tsu:20180909160554p:plain

SimpleBinary (Binary 100)

起動しても何も起こらないので gdb でチラーって見てたらなんかでてきました。

 

Readme (Misc 100)

f:id:mi__tsu:20180909160008j:plain

恐らく一番下の行が CRCTF から始まっていて形が似ていることがわかるので読みます。

 

Calcuration (Programming 10)

netcat で接続すると "11 + 6 - 2 + 3" などの式が与えられるのでそれに答えるだけです。

from pwn import *

conn = remote("59.106.212.75", 8080)

while True:
	num = str(eval(conn.recvline()))
	print num
	conn.sendline(num)
	sleep(0.2)

途中で eval のエラーがでて見てみるとフラグだったのでこんな感じでいくかーって感じでした。よくないです。

あと普通に socket でいいです(pwntools にしたせいで逆に手間取ってしまいました)(練習したかったのです)

 

Prime Factor (Programming 100)

数字が与えられるのでそれの最大の素因数を一定時間内で求めよという問題でした。素数判定するのが面倒だったので力技で時間と勝負しました。楽しかったです。

Python だと素因数のリストを求めてくれるライブラリとかありそうですね。

 

Visual Novels (Programming 200)

Reading Power とノベルゲームのコストと満足度が与えられます。Reading Power 以内のコストで最大の満足度を得られるような組み合わせの時の満足度を求めよという問題でした。ノベルゲームの数がそこまで多くなかったので無理やり愚直な方法でとりあえず解きました。駄目ですね。

from pwn import *
import numpy as np
import cvxpy

conn = remote("59.106.212.75", 8082)
sleep(0.2)

size = []
satis = []
dp = {}
count = 0
def dfs(i, W):
    if i < 0:
        return 0
    if not(i, W) in dp:
        res = dfs(i-1, W)
        if W >=w[i]:
            res = max(res, dfs(i-1, W-w[i])+v[i])
        dp[i, W]  = res
    return dp[i, W]

while True:
    size = []
    satis = []
    dp = {}
    test = conn.recvuntil("=", 0.2)             # Reading Power =
    print "test:", test
    conn.recvuntil(" ")
    readingpow = int(conn.recvline())
    print "ReadingPower : "+str(readingpow)
    sleep(0.2)
    print conn.recvline()                 # Games([size, satisfaction]) =

    while True:
        a = conn.recv(1)
        if a != "[":
            print a
            break
        size.append(int(conn.recvuntil(",")[:-1]))
        conn.recv(1)        # space
        satis.append(int(conn.recvuntil("]")[:-1]))
        conn.recv(2)        # , \n

    print conn.recv(4096) # nswer = ?

    N = len(size)
    W = readingpow
    v = satis
    w = size
    result = dfs(N-1, W)

    conn.sendline(str(result))
    print "phase"
    count = count + 1
    if count == 5:
        print conn.recv(4096)
    sleep(0.3)

あとこの問題ではエラーでフラグを見るみたいなのができなかったので適当に数を指定してフラグとぶつかるようにしてました。これまたよくない。 後で綺麗にする予定です。

 

Tweet (Recon 10)

f:id:mi__tsu:20180909163241p:plain

 

CyberRebeatScripts (Recon 100)

GitHub でアカウントを検索するとでてきたのでリポジトリをとりあえず見ました。問題と同名のリポジトリがあったのでコミットを確認するとフラグを消しているのが見つかりました。はい。

 

ChangeHistory (Recon 100)

消した commit のハッシュが与えられるので ChangeHistory リポジトリの commit の URL にそのハッシュを追加すると見れます。ドクペ

 

Secret.pdf (Stegano 10)

pdf 開いたら黒塗りの後ろがコピーできたのでぺってやりました。

 

Alpha (Stegano 100)

名前が名前だったのでαチャンネル抽出したらでました。

f:id:mi__tsu:20180909164551p:plain

 

Monero (Trivia 10)

-----------------------------------------------------------------------------------------------------------------
ウェブ上からMoneroを発掘するソフトウェア。
日本で、自身のウェブサイト上にこのソフトを設置した何人かのユーザが逮捕されている。

-----------------------------------------------------------------------------------------------------------------

coinhive ですね。

 

Crossword (Trivia 100)

最初面倒そうだと思ってましたがやってみたら意外と簡単だったのでよかったです。

f:id:mi__tsu:20180909164920p:plain

CRCTF{SUBMARINE}

 

White page (Web 100)

サイトを開いても LOGIN ボタンしか出てきませんでした。

   <input type="text" name="id" style="visibility:hidden">
   <input type="text" name="password" style="visibility:hidden">

入力ボックスらしきものが visibility:hidden となっていたのでそれを消してあげて、元々与えられていた ID とパスワードで入るとフラグゲットです。

どうでもいいですが Whitespace が頭から離れませんでした。

 

Let's Tweet! (Web 100)

Twitter は得意です。

 

Uploader (Web 100)

アクセスすると複数個のファイルと下のような感じでした。

f:id:mi__tsu:20180909165736p:plain

検索ボックスに ' とか入れてあげるとなんかエラーがでてきました。

f:id:mi__tsu:20180909165846p:plain

SQL インジェクションだなーなんて思いながら検索ボックスに下のようなのをいれました。

1' or 1=1 --

すると下の画像のように、先ほどのページに secret.zip というのが現れました。

f:id:mi__tsu:20180909170140p:plain

それをダウンロードして解凍しようとするとパスワードが要求されたのでバカな自分はとりあえずブルートフォースを仕掛けようとしてましたがいつまでたっても終わりませんでした。元々与えられていた UserID と Password を試していなかったので guest, guest でログインすると、

f:id:mi__tsu:20180909170411p:plain

つまり secret.zip の持ち主の harada という ID にログインできればオッケーということです。自分はまだ User:harada のパスワードを知らないのでこれも SQL インジェクションかなーなんて思ってました。

' union select userid, password, 0, 0 from Users --";

こんな感じに入力したらユーザーの情報がとれたので harada のパスワードが seishin0129 だということがわかります。

f:id:mi__tsu:20180909170829p:plain

それでログインすれば secret.zip のパスワードもわかるのでフラグが入手できます!

 

感想

Binary 問を後回しにして最初は別のところからいっていたのですが、やっぱり最初にやるべきでした。結局やり始めたのは二日目からなのですが思っていた以上に時間がなくて解けそうだった問題も解けないままになってしまいました。個人的にフィボナッチ数の xor とるやつは解きたかったです。ただ、勉強したかいがあったのか苦手な SQL インジェクション問が解けたのはちょっぴり嬉しかったりします。

あと CTF とかは一人で参加するのは厳しいなーととても思いました。一人でやると全部に手を回さなければいけなくなるので得意なジャンルでゴーっと解くことができないのがきつかったです。CTF お友達がほしいです。