taskctf22 writeup

初投稿
書き方がわからぬ。
とりあえず思い出しながら先日参加したtaskctfのwriteupでも
初参加　2022/12/03(Sat)

# misc 
## ransomware
>　友人が誕生日祝いで送ってきたスクリプトを実行したら、お手製ランサムで手元のFlagを暗号化されてしまいました。どうにかして復元できないでしょうか？

添付ファイル
　hbd.sh
　　#!/bin/sh
　　echo "IyEvdXNyL2J(中略)o=" | base64 -d | python3
　taskctf_flag.txt.encrypted
　  E4 94 98 E4 94 8D E4 94 9F (中略) E4 94 91 E4 95 A6  
***
　使用ツール CyberChef
　crypt系の問題。とりあえずbase64を行うと、pythonの暗号化スクリプトが与えられる。
　taskctf_flag.txtを含む、自分自身以外の現フォルダ内のファイルをすべて暗号化するらしい。
　暗号処理としてはC2サーバから取得した鍵と、ファイルデータのXorだが、ファイルデータを一文字ずつ取り出しているので、あまり長い鍵ではないだろう。
　xor系は2度同じ鍵で暗号処理を行えば復号できるので、encryprtedファイルの名前を変えてpythonを実行してみるが失敗した。どうやらC2サーバには接続できないようだ。これは実際のランサムウェアなどでもありそう。
　encryptedファイルの先頭はtaskctf{}だと思うが、Asciiで考えると該当する鍵はなさそうだ。かといって、サーバへの接続は一度だけなので途中で鍵が変わることもない。暗号データがあまりにもきれいすぎるので３バイトで１文字だと判断、utf-8なら１文字３バイトになるが、半角英字は１バイト。全角文字と判断してｔａｓｋｃｔｆとencryptedの先頭をxorして鍵をとりだせた。あとはencryptedと鍵をxorしてFlagが手に入った。

## anti_detection
>　Flagを取得するための実行ファイルとアップローダを用意しました。 ただし、この実行ファイルをそのままアップロードすると、防御システムに類似ファイルと検知されて実行されない仕組みになっています。

　そこで、検知システムをすり抜ける実行ファイルを作ってFlagを取得してください！
 添付ファイル
　 detected
     ELFファイルのようだけどあまり見てないです。
***
　使用ツール　upx-4.0.1-win64
　アップロードサイトにいって、与えられたELFファイルを送ればよいらしい。
　そのまま送ると
>this file is similar to the file in blacklisted

　と表示されるので、何かを変更すればよいようだ。
　　ハッシュ値か特定のコードか何かをブラックリストに入れているのだろうと思い、とりあえずupxでパックしてから送信すればフラグが手に入った。upxって普段デコードにしか使わないので初めてエンコードに使った気がする。

## shellgei
>   記号のみのBashスクリプトでFlagを表示してください！
   添付ファイル
　　　files.zip
　　　　サーバのフォルダ構成がそのままあるようだけどあまり見てないです。
***
   使用ツール　wslのkalinux
　　指定されたサーバに接続すると
>記号!"#$%&'()*+,-./:;<=>?@[\]{}^ _\nのみでflag.txtの内容を出力するBashスクリプトを書いてください！

　との記述
　　私はshell芸人ではないけど黎明期からのファンなので理屈はある程度理解しています。シェル芸本を手放してしまったのでちょっと不安でしたが、ネットに記事がありました。
　　[記号だけでシェルは操れた](https://www.ryotosaito.com/blog/?p=194)
　linuxマシンで記事のコードの最終行を
　　`${______[$(($__+$___))]}`
　だけにして、
　　`echo ${______[$(($__+$___))]}`
  を後ろにつけるとdateのdが出力されます。
　引数である`($__+$___)`のところは`$__=1` ,`$__=2`なので、アルファベット配列の3番目=dということですね。これらを使ってアルファベット26文字は使えそうです。記号はそのまま使えるのでcat flag.txtを作って送ればFlagが手に入ります。

# web
## robots
> Flagが漏洩してるって聞いたけど、本当ですか？？？
***
　使用ツール curl(コマンドプロンプト)
  web問。pwnとwebは苦手で、今回のweb問は両方とも解けていません。とりあえず指定されたurlに飛ぶとロボットがtxtって言ってる絵があるので、robots.txtを確認しに行きます。
>User-Agent: * Disallow: /admin/flag

とりあえず/admin/flagにアクセスしますが

>401 Unauthorized
XXX.XXX.XXX.XXX is not internal IP address :(


となります。最後のXXX.XXX.XXX.XXXのアドレスは自分のグローバルip(確認くんで表示されるip)internalアドレスからアクセスしていると見せかければよいのでXrefあたりかな。Curl環境用意してなかったんですがwindowsのコマンドプロンプトでもできるらしい。
　ということで、10.X.X.X、172.16.x.x、192.168.x.xあたりを試しますが駄目。最後のipアドレスは変わるので通ってると思うんですけどね。

## first
>　運営している小さな掲示板が100ユーザを達成しました 🎉
>
>そこで、メンテ明けの12/6に100番目ちょうどの登録をしたユーザをトップページで掲載したいので、ユーザ名を taskctf{ユーザ名} で教えてください！
***
  日本語が苦手なのであまりわかりませんが、12月6日はあまり重要ではなくて100番目の登録者を探せばいいということですね。
　指定されたサイトに行くと、検索機能付きの掲示板という感じだったのでSQLiかなと思い色々試す。
　　`a' or 'a'='a';`
 などで実施すると
>error: You can only execute one statement at a time.

 と表示されるので右側は;ではだめらしい。
　　`a' or 'a'='a'　or 'a`
 は通るので左側は良さそう。とりあえずテーブル名が知りたい。いろいろやると
　　`あ' union select 1,"",group_concat(sql) from sqlite_master where not 'a'='b`
　でテーブル名と定義が抜けた。
　　あとは何をもって100番目を決めるかだけど、autoincrementされているものがpostsテーブルにしかない。(ユーザの投稿の順序が確定)なんか右側は/*でいけたためにorderが使えることがわかったので
`あ' union select posts.id,"",users.name from posts join  users on posts.user_name=users.name order by posts.id/*`
　　まあ、ほぼほぼ登録すればすぐ投稿するだろうってことで、投稿順にユーザ名を並べて100番の周りで入力して３ミス(100番目の投稿者を入れたり数え間違えをした)
　しばらくして、よくよく考えたら投稿順はインジェクションしなくても見れるじゃんってことで、今のところ使ってないuserテーブルのidを使うのかなと推測。ハッシュをつかうよく見るGUIDと比べて数字がきれいすぎる。調べてみたらguidにもバージョンがあって、バージョンによっては時系列でわかるらしい。
　で、user.idでソートして100番目を入力した人を入力したがミス。入力ミスかなと思ってスペルを入れなおしてミス。どうやらまた数え間違えをしていたらしい・・・・。

# osint
## welcome
>2019年のtaskctfのwelcome問題のFlagは何でしたっけ？

グーグル先生にお伺いを立ててフラグを手に入れた。

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

　添付ファイルを見るとラーメンの画像、とりあえずGoogleレンズで検索するかとかなり近い画像があったので解答できた
　間違えて商品名を入れたりした。

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

 とりあえずGoogleレンズで検索して入力してみるが当たらず。
　文中のSNSが重要だろうと思い、作者のtwitterのメディアを見るともう一枚の写真と同時に投稿されていた。もう一枚のほうはかなり特徴的だったので画像検索でヒット。千葉県の龍角寺古墳群というやつの101号古墳らしい。


>友達と古墳を20基程度回るなどした

　とのことなので、別の古墳かもしれない。
　竜角地古墳と入口で画像検索するとそれなりに後ろのほうに、似た場所があったので解答できた。

## douro
>この写真が撮られた場所の緯度と経度を教えてください！
>
>フラグの形式は taskctf{緯度_経度} です。ただし、緯度経度は十進法で小数点以下四桁目を切り捨てたものとします。 例えば、 皇居の入口が答えなら taskctf{35.682_139.762}が答えになります

　添付ファイル
　　douro.jpg

***
　後から追加された問題
　どこにでもありそうな道路なのでGoogleレンズでは厳しそう。道路標識と看板と「culver p」の３つ文字があったのでそこら辺からさぐっていくもんだいっぽい。
　道路標識ではオレゴン州が出てきて、オレゴン州にはculver　parkというのがあるのでその近くを探すが、オレゴン州には片側二車線の道路がかなり少ないので雰囲気違いそう。
　あとCulver cityというところにCulver city park があるのでその近辺も探してみたけれど、道路看板がめちゃくちゃ多いのでここも違いそうだなという印象
　困ってちょっと一息いれてたらこれCulver plat'zかもとなり、探してみたらそっくりな場所をみてくて解答できた。

# tutorial
## submit_flag
>Flagを提出してみましょう！
>
>taskctf{th1s_1s_f14g}
***
フラグ形式を教えてくれる問題。


## just_google_it
>分からないことがあれば、自分で調べてみましょう！
>
>添付ファイルの文字列からFlagを取得してください！
　添付ファイル
　　base64_encoded.txt
***
 添付ファイルの文字をbase64 -dするだけ。
　

## try_python
>Pythonはインタプリタ型のプログラミング言語です。計算やファイルの読み書き、ネットワーク操作などを簡単に実行できるため、CTFではよく利用されます。
>
>Pythonを使って配布ファイルに書かれた数字を全て足してみましょう！ Flagは taskctf{ファイルに書かれた数の合計} です。
　添付ファイル
　　number.txt
     1 3 5 7 (中略)　997 999
***
　添付ファイルの中身の等差数列の和は(初項+末項)×項数÷2で表せるので(1+999)×500÷2=250000
今気づいたけど前問の添付ファイルと本問配布ファイルは表記ゆれですね。

## build_docker_enviroment
>DockerとはOSレベルの仮想化技術です。簡単にいうと、どのPCでも同じ環境をコマンド1つで作成できるようになります。これにより、皆さんのPC上でもデバッグを行うことができます。
>
>配布ファイルに含まれるapp/app.pyのコメントを外してDockerコンテナを起動し、Flagを取得してみましょう！
***
　dockerわからんというか、パソコン修理中でメモリが少ない状態で動かしていたのでで仮想linuxマシン立ち上げるのが億劫だったので諦めてました。が途中10点を競る感じになったので真面目に取り組むことに。落としてきたファイルをgrepしてフラグゲット。

# 結果
　あとweb問だけって感じでした。pwnとwebは苦手意識が強いので克服したいなぁと思います。
　あとquitaの書き方もっと勉強した方が良さそう。![Screenshot_20221205_085808.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3014744/767bcd7a-9332-8d36-a007-5297fb015f14.jpeg)