taskctf22 writeup

## taskctfに参加しました
2022/12/03(Sat) 00:00(JST) ~ 2022/12/04(Sun) 00:00(JST) に開催された、[task4233](https://task4233.dev/)さん主催のtaskctf22に参加しました。
Twitterで流れてきたので、OSINTだけ解こうと思って気づいたら熱中してしまいました。
結果は、全問解いて2位でした🎉
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">taskctf22に参加してました<br>全問解いて2位でした🎉<a href="https://twitter.com/hashtag/taskctf?src=hash&amp;ref_src=twsrc%5Etfw">#taskctf</a> <a href="https://t.co/p6LLo95FOi">pic.twitter.com/p6LLo95FOi</a></p>&mdash; hirocy (@hir0cy) <a href="https://twitter.com/hir0cy/status/1599079820431749120?ref_src=twsrc%5Etfw">December 3, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 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さんのブログ](https://st98.github.io/diary/posts/2019-12-06-taskctf.html)に書いてあったので、提出します。

### ramen
> このラーメン屋の名前は何でしょう？
>
> 正式名称ではなく、漢字のみで taskctf{ラーメン屋の名前}の形式で回答してください。 ラーメン屋の名前がラーメン二郎であれば、 taskctf{二郎} がFlagになります。

Google Lens問なので、右クリックしてGoogle Lensで画像を検索します。ラーメン屋さんの名前が出てきました。僕の好きなラーメンは[浜虎](https://hamatora.co.jp/)です。

### kofun
> 作問者が訪れてSNSにもアップロードしたはずの古墳の名前を思い出せなくなってしまいました... もしご存知なら教えてくれませんか？
>
> Flagの形式はtaskctf{この古墳の名前の漢字表記} です。 例えば、 造山古墳 が答えならば taskctf{造山古墳} がフラグになります。

Twitterでtask4233さんのツイートを見て参加したので、まずTwitterを見ます。画像欄を適当に見ていると、古墳のツイートが出てきます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">友達と古墳を20基程度回るなどした <a href="https://t.co/ZqE77AKNlY">pic.twitter.com/ZqE77AKNlY</a></p>&mdash; task4233 (@task4233) <a href="https://twitter.com/task4233/status/1558826656151654400?ref_src=twsrc%5Etfw">August 14, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

この付近のツイートで場所が分かることが多々あるので、`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](https://www.facebook.com/jwithersIRWD/)が見つかります。
`I'm committed to furthering the continued excellence if re-elected to the Irvine Ranch Water Distric`とあるので、`the Irvine Ranch Water Distric`をGoogle Mapで検索すると、[この場所](https://www.google.com/maps/place/Irvine+Ranch+Water+District/@33.666676,-117.8259724,13.25z/data=!4m10!1m2!2m1!1sthe+Irvine+Ranch+Water+District!3m6!1s0x80dce9b155555555:0xd4b4756e1dd9557b!8m2!3d33.668001!4d-117.7669307!15sCh90aGUgSXJ2aW5lIFJhbmNoIFdhdGVyIERpc3RyaWN0WiEiH3RoZSBpcnZpbmUgcmFuY2ggd2F0ZXIgZGlzdHJpY3SSARV3YXRlcl91dGlsaXR5X2NvbXBhbnmaASRDaGREU1VoTk1HOW5TMFZKUTBGblNVTnpObVZUUlhOM1JSQULgAQA!16s%2Fg%2F1v1sljft)であることが分かります。周りの景色も似ているように見てます。
ここで、時間を持て余していた自分は、特に考えもせずにひとつひとつ交差点を見ていく暴挙に出ます。当然見つかりません。素直にその地域で写真の右側に見える`CULVER`という単語を検索すると、`カルバー・ドライブ`という道が見つかるので、そこを眺めていると、[この交差点](https://maps.app.goo.gl/qHfYfnmQnjgX6b338?g_st=ic)が写真の場所であるとわかりました。


## 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を表示してください！

出た出た。
いろいろ検索すると、[このようなサイト](https://www.ryotosaito.com/blog/?p=178)が見つかります。
この`date`を`cat flag.txt`にすると、flagを得ることができました。

## web
いつもはwebをそこまで触らないので、少し苦戦しました。

### robots
> Flagが漏洩してるって聞いたけど、本当ですか？？？

問題名からして`robots.txt`なので、サイトの`robots.txt`にアクセスすると、以下のようになっています。
```text
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](https://trap.jp/post/1578/)で同じようなCTFを主催していたので、非常に参考になりました。
task4233さん、素敵なCTFをありがとうございました！