taskctfに参加しました
2022/12/03(Sat) 00:00(JST) ~ 2022/12/04(Sun) 00:00(JST) に開催された、task4233さん主催のtaskctf22に参加しました。
Twitterで流れてきたので、OSINTだけ解こうと思って気づいたら熱中してしまいました。
結果は、全問解いて2位でした🎉
taskctf22に参加してました
— hirocy (@hir0cy) December 3, 2022
全問解いて2位でした🎉#taskctf pic.twitter.com/p6LLo95FOi
tutorial
さすがにそろそろCTF初心者ではなくなってきたので、ちょっとずるしています。
submit_flag
Flagを提出してみましょう!
taskctf{th1s_1s_f14g}
提出しました。
just_google_it
分からないことがあれば、自分で調べてみましょう!
添付ファイルの文字列からFlagを取得してください!
見た目がbase64だったのでbase64 -d
しました。google itしてない :(
try_python
Pythonはインタプリタ型のプログラミング言語です。計算やファイルの読み書き、ネットワーク操作などを簡単に実行できるため、CTFではよく利用されます。
Pythonを使って配布ファイルに書かれた数字を全て足してみましょう! Flagは taskctf{ファイルに書かれた数の合計} です。
めんどくさくなっちゃったので、どこかのWebサイトで空白区切りの数字の合計ができるサイトを見つけて、そこで計算しちゃいました。
build_docker_environment
DockerとはOSレベルの仮想化技術です。簡単にいうと、どのPCでも同じ環境をコマンド1つで作成できるようになります。これにより、皆さんのPC上でもデバッグを行うことができます。
配布ファイルに含まれるapp/app.pyのコメントを外してDockerコンテナを起動し、Flagを取得してみましょう!
なんかファイル見たら書いてあったので提出しました。Dockerはいつも使ってるので大丈夫。
osint
チームではmiscとosintを担当しているので、ジャンルが自分向きでニッコリ。
welcome
2019年のtaskctfのwelcome問題のFlagは何でしたっけ?
ググりました。st98さんのブログに書いてあったので、提出します。
ramen
このラーメン屋の名前は何でしょう?
正式名称ではなく、漢字のみで taskctf{ラーメン屋の名前}の形式で回答してください。 ラーメン屋の名前がラーメン二郎であれば、 taskctf{二郎} がFlagになります。
Google Lens問なので、右クリックしてGoogle Lensで画像を検索します。ラーメン屋さんの名前が出てきました。僕の好きなラーメンは浜虎です。
kofun
作問者が訪れてSNSにもアップロードしたはずの古墳の名前を思い出せなくなってしまいました... もしご存知なら教えてくれませんか?
Flagの形式はtaskctf{この古墳の名前の漢字表記} です。 例えば、 造山古墳 が答えならば taskctf{造山古墳} がフラグになります。
Twitterでtask4233さんのツイートを見て参加したので、まずTwitterを見ます。画像欄を適当に見ていると、古墳のツイートが出てきます。
友達と古墳を20基程度回るなどした pic.twitter.com/ZqE77AKNlY
— task4233 (@task4233) August 14, 2022
この付近のツイートで場所が分かることが多々あるので、from:task4233 since:2022-08-10 until:2022-08-20
で検索します。しかし、付近のツイートはあまり関係なさそうです。
どちらもGoogle Lensにかけると、2枚目の場所が龍角寺古墳群であると分かります。提出しても通らないので、1枚目の場所を探します。(添付ファイルがあることに気づいていませんでした。-5000000000ポイント)
Google Mapで付近の古墳を眺めていると、上福田岩屋古墳であることが分かりました。
douro
この写真が撮られた場所の緯度と経度を教えてください!
フラグの形式は taskctf{緯度_経度} です。ただし、緯度経度は十進法で小数点以下四桁目を切り捨てたものとします。 例えば、 皇居の入口が答えなら taskctf{35.682_139.762}が答えになります。 ref: https://goo.gl/maps/q9iJRNaaFMnDYdbGA
※緯度経度の表示方法は調べれば分かるので調べてください。
写真を見ると、まずヤシの木が目につきます。それ以外の情報として、WITHERS Mary A???? MATHEIS
という看板が見えます。この内容をGoogle検索すると、こちらのFacebookが見つかります。
I'm committed to furthering the continued excellence if re-elected to the Irvine Ranch Water Distric
とあるので、the Irvine Ranch Water Distric
をGoogle Mapで検索すると、この場所であることが分かります。周りの景色も似ているように見てます。
ここで、時間を持て余していた自分は、特に考えもせずにひとつひとつ交差点を見ていく暴挙に出ます。当然見つかりません。素直にその地域で写真の右側に見えるCULVER
という単語を検索すると、カルバー・ドライブ
という道が見つかるので、そこを眺めていると、この交差点が写真の場所であるとわかりました。
misc
shellgeiは知っているけどやったことがなかったので、実際に手元で動かしたりして面白かったです。
ransomware
友人が誕生日祝いで送ってきたスクリプトを実行したら、お手製ランサムで手元のFlagを暗号化されてしまいました。どうにかして復元できないでしょうか?
hbd.sh
を開くと、base64をデコードしてからPythonとして実行していることが分かります。base64をデコードすると、Pythonのソースコードが得られます。どうやらkeyを外部のサイトから入手して、flagとkeyでxorしているようです。
まず、ソースコードを実行します。すると、どうやら接続周りでエラーが起きます。サイトが閉じてしまっているようです。
そこで、手元のencryptedのファイルに対して、taskctf{
のt
をxorしてあげると、先頭の値がkeyとなります。それをもとに全てをdecryptすると、flagを得ることができます。
anti_detection
Flagを取得するための実行ファイルとアップローダを用意しました。 ただし、この実行ファイルをそのままアップロードすると、防御システムに類似ファイルと検知されて実行されない仕組みになっています。
そこで、検知システムをすり抜ける実行ファイルを作ってFlagを取得してください!
サイトにアクセスして添付ファイルをアップロードすると、確かに類似ファイルと言われてしまいます。
flag.txt
がバイナリに含まれているのが悪いのかな?と思い、xorしてその文字列を生成してからファイルを開き、flagをprintするようなバイナリを作りますが、通りません。なんならInternal Server Errorが起きてしまいます。
破壊しちゃった?などと言っていると、サーバーに障害が起きているとアナウンスされました。自分が破壊したわけではなさそう。
復旧後、同じようなバイナリを渡すと、Invalid Output
と言われます。なんだこれは。
よくわからないですが、いろいろ試行してみます。その中で、元の添付ファイルではflag: taskctf{~~}
の形式で提出していたので、その形式にしたところ、flagが出力されました。
shellgei
記号のみのBashスクリプトでFlagを表示してください!
出た出た。
いろいろ検索すると、このようなサイトが見つかります。
このdate
をcat flag.txt
にすると、flagを得ることができました。
web
いつもはwebをそこまで触らないので、少し苦戦しました。
robots
Flagが漏洩してるって聞いたけど、本当ですか???
問題名からしてrobots.txt
なので、サイトのrobots.txt
にアクセスすると、以下のようになっています。
User-Agent: * Disallow: /admin/flag
どうやら/admin/flag
にflagがあるようです。アクセスしてみると、401 Unauthorizedと言われます。~~~ is not internal IP address :(
と言われるので、X-Forwarded-For
で127.0.0.1
からリクエストが来たように偽装します。すると、flagが表示されました。
first
運営している小さな掲示板が100ユーザを達成しました 🎉
そこで、メンテ明けの12/6に100番目ちょうどの登録をしたユーザをトップページで掲載したいので、ユーザ名を taskctf{ユーザ名} で教えてください!
サイトを開くと、ユーザー名と投稿内容が並んでいます。最初はPHP系の問題かと思ったのですが、とりあえず' OR 1 = 1 --
を入力すると、すべての投稿が出てきたので、SQLiの問題と分かります。
' OR 1 = 1 GROUP BY ~~~ ORDER BY ~~~ LIMIT 100 --
とするといいことはわかりますが、~~~
のカラム名の部分が分かりません。
実力不足で、カラム名を表示されるSQLiがわからなかったので、手動全探索します。すると、users.id
、users.name
があることがわかります。それぞれを入れて検索すると、100個の投稿の一番下のユーザーが100人目のユーザーとなります。
idにuuidなどが用いられていた場合はこの並べ替えでは正答できないので、カラム名を見る方法があったら知りたいです。
追記: え!これ添付ファイルでソースコード配られてたのか!(web問なのでそれはそう)
全てをguessしたのは私です...
アンケート
答えます。答えたあとにflagが出てきて、正答できるといいなと思いました🙄
感想
教育的な問題が多く、非常に初心者向けCTFとして素晴らしいものだと感じました。
自分もCPCTFで同じようなCTFを主催していたので、非常に参考になりました。
task4233さん、素敵なCTFをありがとうございました!