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という言語らしい。
オンラインコンパイラがあったので実行すると、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ファイル上で黒塗りを行っても、元のデータは残っている。
今回の場合は黒塗りにされた部分は画像のようなので、コピー&ペーストで適当な画像ソフトに貼り付ける。
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に添付ファイルがあることがわかる。
さらに、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
carハッキングについてはこのへん
flag{can_bus_hacking}
Web
Body
問題ページのソース内に書いてある。
flag{Section_9}
Header
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
にアクセスすると該当の画像にアクセスできてしまう。
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開催前)にアップロードされていた形跡がある。
そこには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
換字式暗号。こちらを利用したが、完全には戻らなかった。
しかしflagは読めたのでOK。
flag{puipui_car_of_mol}
vul_rsa_01
eは正常なのでnに当たりをつけ、いつもお世話になってるFactorDBにお願いしたら素因数分解してくれた。
3058517013146002381763962882964790715736519
、4372642466716249946441875327733923056149624303
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
を入れればいいのだが、
引数にとっている%s
は結局20150109
なので、実行しなくてもよい。
flag{20150109}
Passcode2
最初に怪しいバイト列181F0479 4F5A0418 1A1B1E
があり、長さを11と比較した後、0x2a
とxorしている。
flag{25.Sep.2014}
Forensics
paint_flag
docxファイルの実体はzipファイルである。
拡張子をzipにして解凍すると、media内に加工前の画像も保存されている。
flag{What_m4tters_is_inside;)}
Mail
.msfファイルを含むディレクトリ。Thunderbirdのデータフォルダらしい。
正攻法でThunderbirdで開こうとしたがうまくいかなかった。
Sent-1ファイルが送信済みメールのデータらしきことがわかったので、base64でエンコードされた添付ファイル部分をバイナリエディタで切り出し、デコード・解凍し画像ファイルを得た。
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!}