freeCodeCampからpicoCTFのはじめの一歩!
はじめに
みなさまこんにちは。はてな45本目の記事になります。 この記事は、CTF Advent Calendar 2020 の14日目の記事になります。
前々から@kusuwadaさんのご紹介や記事 を拝見していて、「なんだか凄そうだなあ」と思っていたところを、ついつい「参加します!」と声を上げたのがきっかけです。 (あとでだいぶ「あああ、しまった手が全然出せない!」と後悔しましたが...)
CTFやったことがないのですがたとえば「入門してみた!」みたいなのでもよかったら😃 https://t.co/3z9dRrcWVp
— たかのあきこ@freeCodeCamp攻略中 (@akiko_pusu) 2020年11月12日
なんとなく、picoCTFをやってみるのが良さそうかな?と思っていましたが、事前の記事などを読んだだけであっというまに順番が回ってきてしまいました。 しかし、記事を書かずにいるのももったいないし、投稿が後からになってしまっても、なにかこの機会にやってみたい!
ということで、ほんとうに「はじめの一歩」の記録的な内容になってしまいますが、何をやったかもしご興味があれば、見ていただけたら嬉しいです。
- はじめに
- 日頃お世話になっているfreeCodeCampから!
- picoCTFとハンズオン動画
- Forensicsウォームアップの問題をやってみよう!
- Generalウォームアップの問題をやってみよう!
- Resourcesウォームアップの問題をやってみよう!
- Reversingウォームアップの問題をやってみよう!
- とりあえずここまで.....
- 20201214 夜追記
- 関連資料
日頃お世話になっているfreeCodeCampから!
ここからが記録です。なにかやらねばと思って、なかなか腰があがらない。
そうこうしているうちに、「まずはCTFの動画を探してみよう」と思い立ち、Youtubeを眺めたところ、見慣れたfreeCodeCampのロゴの入った動画が...。
freeCodeCampには、起点のWebサイトはWebサービスのプログラミングをメインにしたカリキュラムが提供されています。1 実は、ブログ記事や動画に至っては、もっと幅広くデータサイエンスやセキュリティのコンテンツもたくさんあります。有志の方やコースを終えて活躍している方々がコンテンツを提供してくれているためです。
freeCodeCamp上のコンテンツなら、今やっている学習に絡めて何か紹介の形で書けそうかなと思って、読んで紹介をしてみます。
取り上げるのは、こちらの記事です。
CTFでセキュリティについてのスキルを引き上げていくにはどうすればいいか? この記事では、picoCTFを通してこの流れを紹介するという内容になっています。
picoCTFとハンズオン動画
ここでは、John Hammondさんが作成した「Improve Cybersecurity Skills with CTFs - PicoCTF Walkthrough (2018)」という動画を紹介しています。
動画の時間は5時間近く...ではありますが、「本当にCTF未経験のわたしでも進められるのか?」と気になったので、動画を見ながらこのハンズオンをやってみることにしました。
題材は、2018年のpicoCTFになります。
過去のものになるので、同じpicoCTFでも開催年度ごとにアカウントが別に必要でした。 果たして動画のハンズオンに沿って、過去のコンテンツでも進めることができるでしょうか?
アカウントを作って画面を確認
どうやら同じ画面が見えているので、このまま進めていけそうです!
Forensicsウォームアップの問題をやってみよう!
warmup 1
まずは1問目から。この問題をやってみるところをこの記事のゴールにしてみます。
- Forensics ってなに?
- 犯罪に関連した物質の調査検証を行う作業のこと
- ここでは、データが妥当か、改竄されていないかをチェックするのが課題
Can you unzip this file for me and retreive the flag?
というメッセージがあるので、リンクからzipファイルをダウンロードし、作業用のディレクトリに配置します。
展開すると、画像が1つ出てきました。2
warmup 1は、この画像を開いて内容をWebの回答欄に記入するところまで。 うまくいきました。
warmup 2
次は圧縮されていない画像をダウンロードし、中身を確認してフォームに入力。 ただし、拡張子がPNGであるものの、どうやら画像のフォーマットはJPEGのようです。何かおかしい!
ひとまずMacのプレビューでは表示できるので、確認出来た文字を入力して、Solvedに。
picoCTF{extensions_are_a_a_lie}
という結果に。(拡張子がウソ言ってるよ!)
Generalウォームアップの問題をやってみよう!
warmup 1
If I told you your grade was 0x41 in hexadecimal, what would it be in ASCII?
この問題に対する答えをフォームに入力します。 「16進数でグレードが0x41です。ASCIIにしたらいくつですか?」
結果は16x4+1=64+1=65と行きたいところですが、ASCII と言われているので、文字列にしたらどうなるか?
$ echo 0x41 | xxd -r -p A # ちなみにxxdコマンドの確認 # 16進数へのダンプや、逆への変換をおこないます $man xxd NAME xxd - make a hexdump or do the reverse. SYNOPSIS xxd -h[elp] xxd [options] [infile [outfile]] xxd -r[evert] [options] [infile [outfile]] # ASCIIから16進数にしてみる $ echo AKIKO | xxd -p 414b494b4f0a
なので、"A" (picoCTF{A}) でした!3
動画での手順は以下の通り。いろんな解き方をしてもいいですし、検索もOK。
Python 3.7.4 (default, Aug 1 2019, 12:17:13) [Clang 10.0.1 (clang-1001.0.46.4)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> 0x41 65 # これでも👍
warmup 2
Can you convert the number 27 (base 10) to binary (base 2)?
- 27 -> 11011
- 27 / 2 = 13 .... 1
- 13 / 2 = 6 .... 1
- 6 / 2 = 3 .... 0
- 3 / 2 = 1 .... 1
- 1 / 2 = 0 .... 1
- 入力値は
picoCTF{11011}
# rubyでも確認 ruby -e "puts 27.to_s(2)" 11011
正解でした。良かった....!
warmup 3
What is 0x3D (base 16) in decimal (base 10).
Base16での0x3D
は Base10ではおいくら?
- 3 x 16 = 48
- D = 14
- 48 + (D) = 48 + 13
- 入力値は
picoCTF{61}
合いました!
Resourcesウォームアップの問題をやってみよう!
ここは1問だけです。
We put together a bunch of resources to help you out on our website! If you go over there, you might even find a flag! https://picoctf.com/resources (link)
「こまったら https://picoctf.com/resources を見てね!」とのこと。 ここの答えは、このリソースページの末尾にあります :)
# ちなみに動画ではブラウザではなくcurlで取得してflagを見つけていました :) # いまはリソースページはリダイレクトがかかるようになっているので、-L をつけて $ curl -L -s https://picoctf.com/resources | grep "picoCTF{.*}" <p><code>picoCTF{r3source_pag3_f1ag}</code> (2019 competition)</p> <p><code>picoCTF{xiexie_ni_lai_zheli}</code> (2018 competition)</p>
Reversingウォームアップの問題をやってみよう!
今度はリバーシング。(プログラムのソースコードを解析して、そこから答えを引き出す)
Warmup 1
Throughout your journey you will have to run many programs. Can you navigate to /problems/reversing-warmup-1_4_6b2499250c4624337a1948ac374c4934 on the shell server and run this program to retreive the flag? このコースを通してたくさんのプログラムに出会い、実行する必要があります。 シェルサーバー上で
/problems/reversing-warmup-1_4_6b2499250c4624337a1948ac374c4934
を実行して、結果を取得してみましょう!
...とのこと。
問題に指定されているリンクは、なにやらバイナリプログラムのようです。
reverse_warmup_1 $ pwd /Users/akiko/suama-pico/reverse_warmup_1 reverse_warmup_1 $ curl https://2018shell.picoctf.com/static/525cdd5f4b450c39695d047d47da60c9/run -o run # ダウンロードできたので、確認 reverse_warmup_1 $ file run run: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=61cbf2f4b656a244038775ad262ac1f0f143fda1, not stripped # 実行フラグをつけてみましたが... reverse_warmup_1 $ chmod +x run # どうやらダメのようです! reverse_warmup_1 $ ./run -bash: ./run: cannot execute binary file
なんと、実行できません!!!ELF 32-bit LSB executable
と書いてあるので...。
さて、ここでちょっと環境を変えないと動かない?? 32bitの環境が要るのね、というのが分かったので、とりあえずDockerのイメージでなんとかしてみます。
これが正しいやり方なのかは分かりませんが、動画では問題なく ./run
が実行できていたので、そこまでは!
# DockerHubから32bitの環境を探してみます。安直ですが、今回はubuntu reverse_warmup_1 $ docker pull i386/ubuntu Using default tag: latest latest: Pulling from i386/ubuntu 765ce7435927: Pull complete ... [ 略 ] ... Status: Downloaded newer image for i386/ubuntu:latest docker.io/i386/ubuntu:latest # 取ってこれました! reverse_warmup_1 $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mongo latest 3068f6bb852e 2 days ago 493MB i386/ubuntu latest 8f904350bdc1 8 months ago 64.8MB mysql latest c8ee894bd2bd 14 months ago 456MB node 12.6-buster-slim e6e2b19326d7 16 months ago 161MB # shellも操作できるといいなー、と思いながら起動... reverse_warmup_1 $ docker run -it -v $PWD:/tmp/picoCTF -it i386/ubuntu /bin/bash # 中に入れたようです! WARNING: The requested image's platform (linux/386) does not match the detected host platform (linux/amd64) and no specific platform was requested root@274c31ac5e05:/# cd /tmp/picoCTF/ # ファイルもマウントできました root@274c31ac5e05:/tmp/picoCTF# ls run # fileコマンドは入ってないみたい root@274c31ac5e05:/tmp/picoCTF# which file # とりあえず実行フラグをつけて動かしてみます root@274c31ac5e05:/tmp/picoCTF# chmod +x run # 動いた!!!! root@274c31ac5e05:/tmp/picoCTF# ./run picoCTF{welc0m3_t0_r3VeRs1nG}
やっとできました!うれしい!!! (ちなみに、他にあったmongodb用のイメージは64bitなので、32bitのプログラムを動かせるパッケージを追加しないとダメ....)
とりあえずここまで.....
なんとかウォームアップだけでも「picoCTFをやってみました!」と言えるところまで来たのですが、まずは記事の締め切りがあるので、いったんここまで。
Youtubeの解説動画でいくと、5時間ほどのうち、まだ17分弱のところまでです。
先は長いですね。 ただ、Warmupの段階でも、実際にやってみると楽しいので、なんとか問題を進めてみようと思います。
以上、だいぶお茶を濁してしまった感がありますが、はじめの一歩のご報告も兼ねて、わたしからの記事とさせていただきます。
20201214 夜追記
公開後に、引き続き進めていこうと思ってもう少し眺めていたところ、shell というメニューがあったのに気がつきました!
picoCTFの中でも仮想環境(Sandbox用)が利用できるのですね!
上記では手元のDockerコンテナで試したバイナリ実行ですが、うまくこの2018shell4.picoctf.com
でも実行することができました!
関連資料
freeCodeCampの記事・寄稿で、セキュリティのタグがついたコンテンツはこちら。