日々是精進。(はてな館)

日々ネットで調べたり、付箋に書き留めたものをアップしています。子育てで中断しながらも、年に数回投稿しています。皆様の恩恵に感謝しつつ。

日々の記録を残しています。皆様の恩恵に感謝しつつ。

freeCodeCampからpicoCTFのはじめの一歩!

はじめに

みなさまこんにちは。はてな45本目の記事になります。 この記事は、CTF Advent Calendar 2020 の14日目の記事になります。

前々から@kusuwadaさんのご紹介や記事 を拝見していて、「なんだか凄そうだなあ」と思っていたところを、ついつい「参加します!」と声を上げたのがきっかけです。 (あとでだいぶ「あああ、しまった手が全然出せない!」と後悔しましたが...)

なんとなく、picoCTFをやってみるのが良さそうかな?と思っていましたが、事前の記事などを読んだだけであっというまに順番が回ってきてしまいました。 しかし、記事を書かずにいるのももったいないし、投稿が後からになってしまっても、なにかこの機会にやってみたい!

ということで、ほんとうに「はじめの一歩」の記録的な内容になってしまいますが、何をやったかもしご興味があれば、見ていただけたら嬉しいです。

日頃お世話になっているfreeCodeCampから!

ここからが記録です。なにかやらねばと思って、なかなか腰があがらない。

そうこうしているうちに、「まずはCTFの動画を探してみよう」と思い立ち、Youtubeを眺めたところ、見慣れたfreeCodeCampのロゴの入った動画が...。

freeCodeCampには、起点のWebサイトはWebサービスのプログラミングをメインにしたカリキュラムが提供されています。1 実は、ブログ記事や動画に至っては、もっと幅広くデータサイエンスやセキュリティのコンテンツもたくさんあります。有志の方やコースを終えて活躍している方々がコンテンツを提供してくれているためです。

freeCodeCamp上のコンテンツなら、今やっている学習に絡めて何か紹介の形で書けそうかなと思って、読んで紹介をしてみます。

取り上げるのは、こちらの記事です。

CTFでセキュリティについてのスキルを引き上げていくにはどうすればいいか? この記事では、picoCTFを通してこの流れを紹介するという内容になっています。

picoCTFとハンズオン動画

ここでは、John Hammondさんが作成した「Improve Cybersecurity Skills with CTFs - PicoCTF Walkthrough (2018)」という動画を紹介しています。

www.youtube.com

動画の時間は5時間近く...ではありますが、「本当にCTF未経験のわたしでも進められるのか?」と気になったので、動画を見ながらこのハンズオンをやってみることにしました。

題材は、2018年のpicoCTFになります。

過去のものになるので、同じpicoCTFでも開催年度ごとにアカウントが別に必要でした。 果たして動画のハンズオンに沿って、過去のコンテンツでも進めることができるでしょうか?

アカウントを作って画面を確認

どうやら同じ画面が見えているので、このまま進めていけそうです!

f:id:akiko-pusu:20201213235611p:plain

Forensicsウォームアップの問題をやってみよう!

warmup 1

まずは1問目から。この問題をやってみるところをこの記事のゴールにしてみます。

  • Forensics ってなに?
  • 犯罪に関連した物質の調査検証を行う作業のこと
  • ここでは、データが妥当か、改竄されていないかをチェックするのが課題

Can you unzip this file for me and retreive the flag? というメッセージがあるので、リンクからzipファイルをダウンロードし、作業用のディレクトリに配置します。 展開すると、画像が1つ出てきました。2

f:id:akiko-pusu:20201214000626p:plain

warmup 1は、この画像を開いて内容をWebの回答欄に記入するところまで。 うまくいきました。

f:id:akiko-pusu:20201214002629p:plain

warmup 2

次は圧縮されていない画像をダウンロードし、中身を確認してフォームに入力。 ただし、拡張子がPNGであるものの、どうやら画像のフォーマットはJPEGのようです。何かおかしい!

f:id:akiko-pusu:20201214002752p:plain

ひとまず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。

  • 16進数を検索してWikipediaを見る
  • ASCIIと言われているので、16進数のアスキーテーブルで0x41を探す(これでも良い!)
  • pythonで計算
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

f:id:akiko-pusu:20201214073837p:plain

正解でした。良かった....!

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のプログラムを動かせるパッケージを追加しないとダメ....)

f:id:akiko-pusu:20201214084040p:plain

とりあえずここまで.....

なんとかウォームアップだけでも「picoCTFをやってみました!」と言えるところまで来たのですが、まずは記事の締め切りがあるので、いったんここまで。

f:id:akiko-pusu:20201214084158p:plain

Youtubeの解説動画でいくと、5時間ほどのうち、まだ17分弱のところまでです。

先は長いですね。 ただ、Warmupの段階でも、実際にやってみると楽しいので、なんとか問題を進めてみようと思います。

以上、だいぶお茶を濁してしまった感がありますが、はじめの一歩のご報告も兼ねて、わたしからの記事とさせていただきます。

20201214 夜追記

公開後に、引き続き進めていこうと思ってもう少し眺めていたところ、shell というメニューがあったのに気がつきました!

picoCTFの中でも仮想環境(Sandbox用)が利用できるのですね! 上記では手元のDockerコンテナで試したバイナリ実行ですが、うまくこの2018shell4.picoctf.com でも実行することができました!

f:id:akiko-pusu:20201214235005p:plain
2018shell4.picoctf.com - shell

関連資料

freeCodeCampの記事・寄稿で、セキュリティのタグがついたコンテンツはこちら。

www.freecodecamp.org


  1. オンライン学習教材として、アカウントを作成すると各自学習の進捗管理や認定証の発行ができるようになります。

  2. 動画では、eog flag.jpg で画像を開いて表示していますが、Macでの操作なので、open flag.jpg で。

  3. 動画では xcopy を使ってクリップボードに載せていましたが、Macでの操作なので、pbcopy < result.txt で。