はじめに
はじめに
AlpacaHackでCTFを始めてみましたが、私のようにCTFが何なのかもよく分かっていない場合は スタートラインに立つために他のサイトでも勉強したほうが良いみたいです。 ということで今回は韓国のCTFサイトである「Dreamhack」に挑戦してみようと思います。
DreamhackはCTFのコンテストを開催しているのはもちろんのこと、 幅広いジャンルの教育講座も充実しているため、 かなり初心者にも優しい気がしました。 また、サイト上では韓国語も使われていますが、 教育講座の説明文は私が確認した範囲では英語で書かれていたのである程度は読めると思います。

Dreamhack
AlpacaHack
AlpacaHackへのリンクはこちら
私のCTF環境
- Ubuntu 22.04 LTS
前回の記事
2024年8月13日の記事です。
Dreamhackの始め方
ログイン
まずはDreamhackへアクセスし、アカウントを作成してからログインします。 ログインしないと教育講座は受けられないっぽいです。
Dreamhackにログインした後のホーム画面↓

Dreamhack(再掲)
教育講座を受ける
画面上部にタブがいくつかありますが、今回は勉強したいので「Learn」をクリックします。 Learnタブのページには各ジャンルごとのロードマップが表示されます。
Learnタブのページ↓

Learnタブのページ
まずはその中から「Beginners」>「Dream Beginners」を選択します。 すると選択したロードマップのコンテンツが表示されるので 「Introduction」を選んで「Start」をクリックすれば教育講座を始められます。

Dream Beginnersのコンテンツ
Dreamhackの初心者講座
後は講座内容に従って進めていくだけです。 ここでは初心者講座のさわり部分だけ箇条書きします。
扱う主なジャンル
- Web:webサイトやwebアプリのサーバやクライアントのシステムに関する問題
- Pwnable:プログラムの脆弱性に関する問題
- Reversing:リバースエンジニアリングに関する問題
- Crypto:暗号に関する問題
- Forensics:情報セキュリティにおけるインシデントの調査方法や技術に関する問題
- Professional Programming and Coding(PPC):競技プログラミング
- Misc:その他
- より具体的な領域:Network、kernel、browser、blockchain、etc…
Wargameとは
- Wargame:意図的に脆弱性が存在するように設計された環境をハッキングするゲーム
- Wargameは実践環境を想定して行うものっぽい
- CTFは競技に特化して問題を設定して競うものっぽい
flagとは
- ハッキングが成功したことを証明するための文字列
- Dreamhackでは基本的にDH{…}の形式(例外あり)
便利なエンコードツール
Linux
- Linuxの基礎知識も大事(シェル、基本的なコマンド、パイプライン、権限など)
- ディレクトリ構成も大事(/bin、/boot、/dev、/etc、/lib、/opt、/root、/homeなど)
その他
- 問題によっては説明文や参考リンク、ヒントなどがあったりなかったりする
- ネイティブのUbuntuを用意、あるいはVirtual BoxやWSLなどでの仮想環境を作るとよい
- Dockerの知識は必須っぽい
- コンピュータサイエンスの基礎も大事(バイナリ、ビット演算、文字コード、OSなど)
- コーディングはVisual Studio Codeがおすすめ
- テキストエディタではVimもおすすめ
練習問題回答例
Welcome-Beginners
以下解き方
- やること:ncコマンドでサーバと通信してflagを取得する
- 「Request a VM」ボタンを押すと仮想環境のサーバが立つ
- 「Download」ボタンを押すと仮想環境で動いているプログラムが手に入る
- 下記のコマンドを実行してflagを取得
$ nc host3.dreamhack.games 23044
Enter "Dreamhack" : Dreamhack
Welcome Beginners!
DH{...flag...}
64se64
以下解き方
- やること:データ内のbase64の文字列をエンコードしてflagを取得する
- 「Download」ボタンを押してzipファイルを取得
- index.htmlを開くとbase64の文字列が見つかるのでエンコード
- Pythonスクリプトが取得できるので実行するとflagが手に入る

エンコードの様子
baby-linux
以下解き方
- やること:ブラウザでウェブサイトにアクセスしてflag.txtの中身を取得する
- 「Request a VM」ボタンを押すと仮想環境のサーバが立つ
- ブラウザでサーバにアクセス
- 下記のコマンドをウェブサイト上で実行してflagを取得
- ※app.pyを見るとコマンド内に「flag」という文字列があると弾かれるっぽいのでワイルドカードを使う
cat dream/hack/hello/f*g.txt
baby-linuxのウェブサイト↓

baby-linuxのウェブサイト
SSH
以下解き方
- やること:SSHでサーバにアクセスしてflagを取得
- 「Request a VM」ボタンを押すと仮想環境のサーバが立つ
- 下記コマンドを実行
$ ssh chall@host3.dreamhack.games -p 22929
$ cat flag
Docker
以下解き方
- やること:Dockerfileからイメージをビルドしてコンテナを作成する
- 「Download」ボタンを押してzipファイルを取得
- ファイルを展開してターミナルでそのディレクトリへ移動
- 下記コマンドを実行
$ sudo docker build .
$ sudo docker run -it de6557187714 /bin/bash
$ cat flag
blue-whale
以下解き方
- やること:diveを使ってDockerfileを解析する
- diveをインストール
- 「Download」ボタンを押してzipファイルを取得
- ファイルを展開してターミナルでそのディレクトリへ移動
- 下記コマンドを実行
- diveでflagが削除される前のレイヤーを表示すればflagが見つかる
- ※diveの使い方はREADMEに記載してある
インストール方法はdiveのREADMEを参照
$ sudo docker pull dreamhackofficial/blue-whale:1
$ sudo dive 87a96c7a8db0
# TABキーでレイヤーを移動
# 矢印キーで項目を移動
# ctrl+Fで検索ワードを指定

dive使用時の様子
おわりに
今日はDreamhackに挑戦してみました。 まだまだ教育講座は基礎的な内容ですが、勉強している感じがあって良いです。 この後も講座は結構な数がありそうなので、少しずつやってみます。 この調子でCTFに楽しく参加できるレベルまで知識や技術を身につけたいと思います。 それでは、また。
次回の記事
2024年8月19日の記事です。