CTF for BBA

ゲーム時々CTFやるBBAの日常。

setodaNote CTF Writeup

ご無沙汰してます。リハビリとして参加しました。
130位、3930点。
後半息切れしました… 体力低下を感じる。

Misc

Welcome

CTF登録時のユーザー名とパスワードでログインし、

cat welcome.txt

でフラグ。

flag{Enjoy_y0ur_time_here!}


morse_one

タイトル通り、モールス信号。
D=dot, B=bar, S=spaceとして変換すると、...- .. -... .-. --- .--. .-.. . -..-
文字に変換すると、VIBROPLEXとなる。

flag{VIBROPLEX}


Hash

全てのファイルのハッシュ値(sha256)が分かればよい。
Windowsならツールが分かり易そうだが、当方macなのでコマンドで。

% shasum -a 256 * | grep aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7
aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7  pass024.txt
% shasum -a 256 * | grep 8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb
8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb  pass034.txt
% shasum -a 256 * | grep e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962
e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962  pass079.txt
% cat pass024.txt pass034.txt pass079.txt


flag{hardest_logic_puzzle}

F

Brainfuckという言語らしい。

Brainfuck - Wikipedia


オンラインコンパイラがあったので実行すると、FLAG is flag{Don't_Use_the_F-Word!!}と出力される。

flag{Don't_Use_the_F-Word!!}


magic_number

拡張子ごとのマジックナンバーを問われる問題。
各ファイルをバイナリエディタで開き、最初の4 byteが該当するものを探せばよい。

flag{post_rar_light}


Stegano

真ん中に文字がうっすら見えてるので、おいおい大丈夫か?と思ったけど他の文字はちゃんと隠れていた。
Stegsolveで各planeを見ていくと、左上、真ん中、右下にそれぞれ文字が隠れている。
それぞれ、flag{Re4l17y_1s_cReA73d_by_7h3_m1nd_rA9}で、繋げればフラグ。

flag{Re4l17y_1s_cReA73d_by_7h3_m1nd_rA9}


morse_zero

unicodeで2種類のゼロ幅スペースが使われている。
E2808C-E2808B.5A(Z)とすると、--.. . .-. ----- ..--.- .-- .---- -.. - .... ..--.- ... .--. .- -.-. .となり、
変換すると、ZER0_W1DTH_SPACEとなる。

flag{ZER0_W1DTH_SPACE}


ransom_note

No More Ransom Projectは、復号可能なランサムウェアの復号ツールを配布している。
あとは今回のランサムウェアを特定するだけ…と思ったところで、アンチウィルスソフトが働いて、検知名は「GandCrab」とのこと。
ランサムノートを見るまでもなく、復号ツールをゲット。あとはツールにお任せ。

flag{unlock1ng_y0ur_d1gital_life_with0ut_paying;)}


Nothing

こ、これは進研ゼミ(ksnctf)でやったやつだ…!
というわけでWhitespace言語。オンラインIDEで実行すると、Flag is flag{And_Then_There_Were_None}と出てくる。

flag{And_Then_There_Were_None}


Redacted

PDFファイル上で黒塗りを行っても、元のデータは残っている。
今回の場合は黒塗りにされた部分は画像のようなので、コピー&ペーストで適当な画像ソフトに貼り付ける。
f:id:boxwolf:20210831112435p:plain
flag{weather_balloon}


Network

Host

pcapファイルをwiresharkで開けばよい。

flag{ctf.setodanote.net}


tkys_never_die

wiresharkで開くと、/flag.htmlの後に/flag.pngにアクセスしていることがわかる。
pcapは通信の全てのデータを含んでいるので、PNGデータの復元も可能。
File > Export Objects > flag.pngを選び、ファイルをエクスポートする。

flag{a_treasure_trove}


echo_request

問題文にechoとあるので、ICMP通信を見てみると、各々の通信にdata部が存在することがわかる。
一つひとつ見ていくと、No29から1文字ずつf, l, a, g...といったように一文字ずつフラグ文字列が送信されているので、抽出すればよい。

flag{ICMP_Tunneling_T1095}


stay_in_touch

メールのやり取りの模様。
一つひとつFollow TCP Streamで中身を確認していく(メール件名はUTF-8エンコードされているので、オンラインサービスなどでデコード)と、
Stream 12に添付ファイルがあることがわかる。 f:id:boxwolf:20210830192244p:plain

さらに、Stream 14には「パスワード通知」という件名でYatagarasu-Takama-Kamuyamato2という文字列が。

% echo -n "UEsDBBQAAQAAADBq8FK0Nz5zSgAAAD4AAAATAAAAUmVwb3J0LUFWLVQwMDk3LnR4dAzRMzm6s5vAM3huF0n2GEKFrarxVD3WvzurjKz9sjA7iD6nWis0GBRcIdcyrQkqliocBi2lCUB6J0hRUgHzDVCnVx6LnLS5LenqUEsBAj8AFAABAAAAMGrwUrQ3PnNKAAAAPgAAABMAJAAAAAAAAAAgAAAAAAAAAFJlcG9ydC1BVi1UMDA5Ny50eHQKACAAAAAAAAEAGADNWpx++XnXARJtllL6edcB0TOVfvl51wFQSwUGAAAAAAEAAQBlAAAAewAAAAAA" | base64 -d > decoded.zip


できたzipファイルを、先ほどのパスワードで解凍するとテキストファイルが出てくる。

flag{SoNtOkIhAmOuKaTaHoUmOtSuMuRuNoSa;)}


yes_you_can

車載組み込みで使われるCAN通信のログらしい。正直、全然よくわかっていないのだが、
flagに使われているっぽい文字列を検索していたところ、ID=244#に送っている通信に含まれていることがわかった。

あとは力技で、uniqで抜き出して、ASCIIコードを一つひとつ拾っていった。。。

% grep "244#" dump.log | awk '{print $3}' | uniq


f:id:boxwolf:20210830202903p:plain

carハッキングについてはこのへん

flag{can_bus_hacking}


Web

Body

問題ページのソース内に書いてある。

flag{Section_9}


Webページから返されるレスポンスにx-setodanotectf-flagという独自ヘッダーが含まれており、その値がフラグ。

flag{Just_a_whisper}


puni_puni

punycodeを変換する問題。こちらで変換した。
フラグは、さん、さん、ピー、ユー、エヌ、ワイ、シー、オー、ディー、イー、よん、よん、です.
カタカナ表記は半角英小文字に、ひらがな表記は半角数字にしたものがフラグですなお、読点は区切り文字なので取り除いてください

flag{33punycode44}


Mistake

https://ctf.setodanote.net/web003/images/ディレクトリが見られるようになっており、pic_flag_is_here.txtというファイルが置いてあるのがわかる。

flag{You_are_the_Laughing_Man,_aren't_you?}


tkys_royale

テストユーザーでのログインアカウントはソースに書いてあるが、adminでログインせよと言われてしまう。
雑にSQLiっぽい入力をすると、エラーが出てMySQLであることと、クエリが明らかになる。
Query: SELECT * From basic_accounts where username='admin'/*' and password=''

あとはMySQLでのコメントアウトを利用してpasswordをバイパスすればOK。

flag{SQLi_with_b1rds_in_a_b34utiful_landscape}


Estimated

サイトを眺めていると、6/2の投稿画像に関するお詫び文が掲載されている。
一方、画像は、images/20210710001b.jpgのような規則的な命名がなされていることから、images/20210602001b.jpgにアクセスすると該当の画像にアクセスできてしまう。

f:id:boxwolf:20210901105625j:plain

flag{The_flag_wouldn't_like_to_end_up_in_other_peoples_photos}


Osint

tkys_with_love

"C6DF6"でググると出てくる。客船らしい。

flag{Symphony_of_the_Seas}


Dorks

googleハッキングの問題。
特定のURLを含むページを検索するには、inurlを使えばよい。

flag{inurl:login.php}


filters_op

@cas_nisc 2017 May 15とかで雑に検索した。

flag{#WannaCrypt}


MAC

MACアドレスの接頭辞として見た時の、ベンダ名の頭文字に変換すればよい。

flag{O_U_I_Y_A}


MITRE

(後で)

flag{MITRE_ATTACK_MATLIX_THX}


Ropeway

ロープウェイから撮った写真なんてどれも大体似たような感じになるやろ!
ということで、画像でgoogle検索すると、「浜名湖オルゴールミュージアム」が引っかかる。
そこにかかっているのは「かんざんじロープウェイ」なので、

flag{kanzanji}


identify_the_source

まず、マルウェア配布サイトに置かれていたとのことなので、any.runあたりであろうと当たりをつける。
hash値で検索すると、any.runのPublic Tasksに7/15(CTF開催前)にアップロードされていた形跡がある。
f:id:boxwolf:20210901194417p:plain
そこにはURL情報もあり、切れているがサブドメインは見える(全体が見える方法を知らない…)
サブドメインyrsuccessesareunheraldedyrfailuresaretrumpetedググると、まずyrsuccessesareunheraldedyrfailuresaretrumpeted.setodanote.netというサイトが出てくるが、そのページにアクセスしてみても、フラグはもう無いと言われる。

次に魚拓サイトが引っかかってくる。
見てみると7/15に魚拓が取られており、前述の日付と一致するので、見てみるとフラグが書いてある。

flag{No_one_cares_the_bomb_that_didn't_go_off}


Crypto

base64

base64デコードするだけ。

flag{It's_called_base64!}


ROT13

rot13するだけ。

flag{Even_you_Brutus?}


pui_pui

Unicodeをデコードするだけ。

A:Do you know Molcar?

B:Of course! I love the scene where he sinks into the blast furnace while giving the thumbs up.

A:... What?

B:btw, the flag is flag{Have_you_ever_heard_of_Hexdump?}.


flag{Have_you_ever_heard_of_Hexdump?}

私の知ってるモルカーと違う…

tkys_secret_service

https://quipqiup.com/

換字式暗号。こちらを利用したが、完全には戻らなかった。
しかしflagは読めたのでOK。

flag{puipui_car_of_mol}


vul_rsa_01

eは正常なのでnに当たりをつけ、いつもお世話になってるFactorDBにお願いしたら素因数分解してくれた。
30585170131460023817639628829647907157365194372642466716249946441875327733923056149624303

from Crypto.Util.number import inverse, long_to_bytes
n = 13373801376856352919495636794117610920860037770702465464324474778341963699665011787021257
e = 65537
c = 39119617768257067256541748412833564043113729163757164299687579984124653789492591457335

p = 3058517013146002381763962882964790715736519
q = 4372642466716249946441875327733923056149624303
phi = (p-1) * (q-1)
d = inverse(e, phi)

m = pow(c, d, n)
print(long_to_bytes(m))


flag{weak_rsa_can_be_decrypted!}


vul_rsa_02

eが大きすぎる。このような時、dが小さいと考えられ、Wiener's Attackが成立する。
コードはももテクさんのものを使わせて頂きました。

import sys
import gmpy
from Crypto.Util.number import long_to_bytes

def continued_fraction(n, d):
    """
    415/93 = 4 + 1/(2 + 1/(6 + 1/7))

    >>> continued_fraction(415, 93)
    [4, 2, 6, 7]
    """
    cf = []
    while d:
        q = n // d
        cf.append(q)
        n, d = d, n-d*q
    return cf

def convergents_of_contfrac(cf):
    """
    4 + 1/(2 + 1/(6 + 1/7)) is approximately 4/1, 9/2, 58/13 and 415/93

    >>> list(convergents_of_contfrac([4, 2, 6, 7]))
    [(4, 1), (9, 2), (58, 13), (415, 93)]
    """
    n0, n1 = cf[0], cf[0]*cf[1]+1
    d0, d1 = 1, cf[1]
    yield (n0, d0)
    yield (n1, d1)

    for i in range(2, len(cf)):
        n2, d2 = cf[i]*n1+n0, cf[i]*d1+d0
        yield (n2, d2)
        n0, n1 = n1, n2
        d0, d1 = d1, d2

def wieners_attack(e, n):
    cf = continued_fraction(e, n)
    convergents = convergents_of_contfrac(cf)

    for k, d in convergents:
        if k == 0:
            continue
        phi, rem = divmod(e*d-1, k)
        if rem != 0:
            continue
        s = n - phi + 1
        # check if x^2 - s*x + n = 0 has integer roots
        D = s*s - 4*n
        if D > 0 and gmpy.is_square(D):
            return d

if __name__ == '__main__':
    n = 314346410651148884346780415550080886403387714336281086088147022485674797846237037974025946383115524274834695323732173639559408484919557273975110018517586435379414584423
    e = 66936921908603214280018123951718024245768729741801173248810116559480507532472797061229726239246069153844944427944092809221289396952390359710880636835981794334459051137
    c = 227982950403746746755552239763357058548502617805036635512868420433061892121830106966643649614593055827188324989309580260616202575703840597661315505385258421941843741681

    d = wieners_attack(e, n)
    print("found d: %d" % d)
    m = pow(c, d, n)
    print(long_to_bytes(m))


flag{197_Michael_J_Wiener_673}


Rev

Helloworld

普通に実行すると、Nice try, please set some word when you run me.と言われてしまう。

% strings helloworld.exe | less
(snip)
Nice try, please set some word when you run me.
flag
Good job, but please set 'flag' when you run me.
hint
Nice try ;)
(snip)

stringsの出力結果から、flagというキーを与えて実行すればよさそうなので、helloworld.exe flagとするとフラグ。

flag{free_fair_and_secure_cyberspace}


ELF

elfの実行ファイルのようだヘッダーが潰されていて動かない。
最初4バイトを7f 45 4c 46に直してやると実行できフラグが得られる。

flag{run_makiba}


Passscode

ここでチェックしている、ので実行して20150109を入れればいいのだが、
f:id:boxwolf:20210904175716p:plain 引数にとっている%sは結局20150109なので、実行しなくてもよい。

flag{20150109}


Passcode2

f:id:boxwolf:20210904181930p:plain
f:id:boxwolf:20210904182004p:plain
最初に怪しいバイト列181F0479 4F5A0418 1A1B1Eがあり、長さを11と比較した後、0x2aとxorしている。

flag{25.Sep.2014}

Forensics

paint_flag

docxファイルの実体はzipファイルである。
拡張子をzipにして解凍すると、media内に加工前の画像も保存されている。

f:id:boxwolf:20210904020241p:plain

flag{What_m4tters_is_inside;)}


Mail

.msfファイルを含むディレクトリ。Thunderbirdのデータフォルダらしい。
正攻法でThunderbirdで開こうとしたがうまくいかなかった。
Sent-1ファイルが送信済みメールのデータらしきことがわかったので、base64エンコードされた添付ファイル部分をバイナリエディタで切り出し、デコード・解凍し画像ファイルを得た。
f:id:boxwolf:20210904120341p:plain

flag{You've_clearly_done_a_good_job_there!!}


Programing

ZZZIPPP

ZIPを解凍し続けるスクリプトを書く問題…のはずなのだが、macデフォルトのアーカイブユーティリティはなんと
自動的に可能な限り解凍し続けてくれるのだった。

flag{loop-zip-1989-zip-loop}


echo_me

出てくる数字を送り返せばよい。色々調整した結果が下記。

import re, socket
from time import sleep

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("10.1.1.10", 12020))
r = sock.recv(1024)
while(True):
    r = sock.recv(1024)
    print(r)
    s = re.sub(r"\D", "", r)
    print(s)
    sock.send(s + '\n')
    sleep(1)


flag{Hellow_yamabiko_Yoo-hoo!}