【第1回】セキュリティエンジニアを目指して「CTF」を解く!
IT技術
セキュリティエンジニアを目指して「CTF」を解いてく
パソコンだけでなく、多くの通信機器がインターネットにつながる時代となりました。
インターネット上では、情報だけでなく、お金や商品もやりとりされています。
そのような背景もあり、セキュリティに対する理解の重要性は、日々 高まっています。
最前線のセキュリティスペシャリストだけでなく、インターネットに関わる全てのエンジニアに、セキュリティに関する知識を身につける事が必要とされています。
「CTF(Capture The Flag)」とは?
CTF とは「Capture the flag」の略で、様々なセキュリティの知識、技術を用いて「フラグ」となる情報を探し、その速さを競います。
CTF には、時間や場所が決まって開催される「大会型 CTF」と、いつでも挑戦できる「常設型 CTF」があります。
問題には、以下のようなジャンルがあります。
バイナリ
破損または欠損しているファイルを復元する問題や、用途のわからないソフトウェアの中身を調べる「デバッグ」などがこれにあたります。
クリプト
主に、暗号の復号化について出題されます。
実際の現場で使われる暗号の他に、運営者が自分で作った独自の暗号方式を、プログラミングで解読することもあります。
ネットワーク
セキュリティ認証や、アクセスログ解析についての問題が出題されます。
ウェブ
サーバや、データの保存先であるデータベースに関する問題が出題されます。
ミスク
セキュリティやインターネットに関する豆知識、時事問題について出題されます。
出題者のユーモアあふれた問題が出題されるのも特徴です。
「CTF」に参加する上でのマナー
技術の進歩、変化が非常に速いのが CTF の世界です。
調べ物はしてよい
「ググる力」が非常に重要な要素の1つです!
ただ、大会型 CTF に参加する場合は、出場チームメンバー以外には頼らないようにしましょう。
書籍の持ち込み許可されているような大会もありますが、基本はルールに従ってください。
技術の共有をしよう
CTF 問題を解くことが出来たら、国や世界全体でのセキュリティ技術の向上、ホワイトハッカーの育成のために、「Writeup」という解法の解説をするのが定番です。
note や Qiita で公開するのが主流となっています。
大会型 CTF の場合、大会終了後に優勝者や運営者がその場で「Writeup」を行うこともあります。
「CTF」をはじめてみよう!
今回は、以下の常設 CTF「CpawCTF」を利用してみます。
【 CpawCTF 】
https://ctf.cpaw.site/
様々なジャンル、様々なレベルの問題があり、ユーザーも多いのでオススメです!
ページ左上の方にある「SignUP」をクリックして、登録をはじめてください。
登録情報は、どこかにメモして残しておきましょう!
仮想マシンからなど、別の端末からでも、同じユーザーでログインできます。
CpawCTF「Q6.[Crypto] Classical Cipher」にチャレンジ!
Q6 よりも前の問題は、チュートリアルのようなものなので割愛します。
Q6 は、以下のような問題になります。
Q6.[Crypto] Classical Cipher
暗号には大きく分けて、古典暗号と現代暗号の2種類があります。特に古典暗号では、古代ローマの軍事的指導者ガイウス・ユリウス・カエサル(英語読みでシーザー)が初めて使ったことから、名称がついたシーザー暗号が有名です。これは3文字分アルファベットをずらすという単一換字式暗号の一つです。次の暗号文は、このシーザー暗号を用いて暗号化しました。暗号文を解読してフラグを手にいれましょう。
暗号文: fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}
引用:CpawCTF
「シーザー暗号」は、ほとんどの CTF で出題される暗号化方式です。
文字数をずらすだけの簡単なものですが、他の暗号方式と組み合わせるだけで安全性が飛躍的に向上します。
C言語を使って解いてみる!
今回は、C言語を使って解いてみましょう。
1#include <stdio.h>
2#include <string.h>
3
4int main(void)
5{
6 char flag[] = "fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}";
7
8 int i;
9
10 for (i = 0;i < sizeof(flag) - 1; i++)
11 {
12 if (flag[i] == '}' | flag[i] == '{' | flag[i] == '_') // 英字以外を変換除外
13 {
14 continue;
15 }
16 flag[i] -= 3;
17 }
18 printf("%s", flag);
19}
実行結果
実行結果は、以下の通りです。
1cpaw{Caesar_cipher_is_classical_cipher}
フラグ入力欄に上記の結果を入力して、パスすればOKです。
C言語だと文字列なども操作できて、こういったところで便利です。
型指定をしなくても文字と数字の判断を分けてくれる言語は、楽ができる一方でエラーで困ることがあります。
また、C言語では、変数の中のメモリもいじることができ、うまく使わないとエラーは出ますが、反面、有効活用すると便利です!
今回は、プログラミングを用いて解きましたが、このような有名な暗号解読には便利なサイトがたくさんあります。!
よく出る「暗号化方式」
主に、以下のような暗号が出題されます。
- シーザー暗号
- 進数の変換
- base64
※ base64 は64種類(A~Z a~z 0~9 ?!)の印字可能な英数字を用いて、それ以外の文字形式が混じった文章を表す暗号化方式です。
他の暗号化方式と区別するために、ほとんどの暗号化ソフトウェアでは、暗号化したあとに「==」という文字列を付けます。
しかし最近では、暗号方式を相手に隠すために、取り除かれることも多くなっています。
CpawCTF「Q14.[PPC]並べ替えろ!」にチャレンジ!
Q14.[PPC]並べ替えろ!
下にある配列の中身を大きい順に並べ替えて、くっつけてcpaw{並べ替えた後の値}をフラグとして提出してください。
例:もし配列{1,5,3,2}っていう配列があったら、大きい順に並べ替えると{5,3,2,1}となります。
そして、フラグはcpaw{5321}となります。
同じようにやってみましょう(ただし量が多いので、ソートするプログラムを書いたほうがいいですよ!)[15,1,93,52,66,31,87,0,42,77,46,24,99,10,19,36,
27,4,58,76,2,81,50,102,33,94,20,14,80,82,49,41,
12,143,121,7,111,100,60,55,108,34,150,103,109,
130,25,54,57,159,136,110,3,167,119,72,18,151,105,
171,160,144,85,201,193,188,190,146,210,211,63,207]引用:CpawCTF
シンプルなソート問題です。
時間をかければ、いろいろな方法で解くことが出来ますが、大会型 CTF ではそうもいきません。
非常に大きなサイズのデータを扱う事もよくあります。
筆者が出場した CTF でも、10万件ほどのアクセスログを txt 形式で与えられたことがありました。
Python を使って解いてみる!
この問題についても、手打ちで回答を得るのは面倒なので、前の問題同様にプログラミング言語を用いて解を得たいと思います。
提示されている配列は、Python のスタイルと同じなので、今回は Python を使ってコードを作成してみます。
作成したコード
作成したコードは以下の通りです。
1list = [15, 1, 93, 52, 66, 31, 87, 0, 42, 77, 46, 24, 99, 10, 19, 36, 27, 4, 58, 76, 2, 81, 50, 102, 33, 94, 20, 14, 80, 82, 49, 41, 12, 143, 121, 7, 111, 100,
2 60, 55, 108, 34, 150, 103, 109, 130, 25, 54, 57, 159, 136, 110, 3, 167, 119, 72, 18, 151, 105, 171, 160, 144, 85, 201, 193, 188, 190, 146, 210, 211, 63, 207]
3
4for i in sorted(list, reverse=True):
5 print(i, end="")
ソートが命令一文で完結する、非常にシンプルなコードです。
実行結果
実行結果は、以下の通りとなります。
1cpaw{2112102072011931901881711671601591511501461441431361301211191111101091081051031021009994938785828180777672666360585755545250494642413634333127252420191815141210743210}
フラグ入力欄に上記の結果を入力して、結果を確認してみてください。
今回作成したソースコード
今回作成したソースコードは、以下のリポジトリにまとめてあります。
【 rightcode / ctf-trial 】
https://github.com/rightcode/ctf-trial
ソースコードや結果を確認する場合は、上記のリポジトリをクローンしてください。
結果の確認コマンド
以下のコマンドで、結果を確認できます。
1# Q6
2bach check-c.sh 6
3
4# Q14
5bash check-py.sh 14
※ 結果の確認には Docker と Docker Compose を使用しています。Docker をインストールしていない場合は、確認用のコードを環境に合わせて調整してください。
第2回へつづく!
今回は、C 言語と Python を使って CTF の問題を解いてみました!
CTF では、Python で解くことを想定した問題が多く出題されます。
これは、いろいろな環境で同じように動作することが主な理由です。
どんな端末でアクセスしても、確実にセキュリティが担保される必要があり、セキュリティ業界では、比較的いろいろな環境で動く Python が重宝されます。
また、CTF を解くのに便利なライブラリが多く公開されています。
備え付けのソートの機能はもちろん、先ほど紹介したような暗号・復号のライブラリや、パスワードの解析なども公開されています。
「Writeup」や「GitHub」に上がっているものもあるので、皆さんも探してみてください!
それでは、次回をお楽しみに!
第2回の記事はこちら
こちらの記事もオススメ!
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
2020.08.04エンジニアの働き方 特集社員としての働き方社員としてのエンジニアの働き方とは?ライトコードのエンジニアはどんな働き方をしてるのか、まとめたいと...
2020.07.27IT・コンピューターの歴史特集IT・コンピューターの歴史をまとめていきたいと思います!弊社ブログにある記事のみで構成しているため、まだ「未完成状態」...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit