CTFを始めたい
0. はじめに
みなさんはセキュリティ関連のコンテストにCTF(Catch The Flag)と呼ばれるコンテストがあるのをご存じでしょうか。私は心理学部なのでなかなか耳にする機会がありませんでしたが、競技プログラミングをしているうちにセキュリティにもコンテストがあることを知りました。
競技プログラミングとは違い、CTFは初心者からはなかなか始めづらい印象がありますがどうなんでしょう。 CpawCTFはCTFを勉強するための常設コンテストではあるのですが、ここには全く解説も乗っておらず、どこから勉強を始めたらいいのかさまよってしまいます。
そこで、別のキャンパスのサークルに入り話を聞きに行くことにしました。以下の内容は、そこで学習した内容のログになります。
何もわかっていない自分がどれだけ成長することができるのか、またCTFを始めたいと思った方に一つでも参考になる点が出来たら幸いです。では、始めましょう。
目次
1. Linuxコマンド
1 ls
ディレクトリファイル/フォルダ一覧を出力する
2 ls -a
隠しファイルも一緒に表示することが出来る
※「secret.txt」を隠しファイルにしたかったら「.secret.txt」と前に"ドット" をつける
3 ./
今のディレクトリを表す
4 ../
一つ上のディレクトリを表す
5 pwd
./と同じく今のディレクトリ(カレントディレクトリ)を表す
6 cd
ディレクトリ移動に用いるコマンド
7 cp
ファイルのコピーをする
「cp コピーしたいファイル コピー先のファイル」
ex) cp sample.txt newSample.txt
このように書くと、sample.txtの内容をnewSample.txtというテキストファイルにコピーされる
※こんな書き方も出来る
ex) cp sample.txt ../newSample.txt
これはsampleファイルの入っているディレクトリの一個下のディレクトリにnewSampleファイルを作っている。
8 cp -r
さっきのcpはファイルしかコピー出来ないが、-rオプションをつけることによって ディレクトリのコピーが出来る。
9 mv
ディレクトリ/ファイルの移動が出来る。
ex) mv sample.txt ../ //sampleファイルを一個下のディレクトリに移動
ファイル名の変更も出来る
ex)mv sample.txt sample1.txt //sampleファイルの名前をsample1に変更
10 rm
ファイルを削除出来る
※大事なファイルでも削除すると復活しない
ex)rm sample.txt
11 rm -rf
ディレクトリの削除が出来る
特に大事なファイル(sbinやbinなど)は削除するとパソコンが起動しなくなったりするので注意
(aliasで-iをつける or ゴミ箱に飛ぶようにすることで対策可)
12 cat
ファイルの中身を表示出来る
13 touch
ファイルを作成出来る
.txtでも、.cppでも何でも作れる
14 open(macのみ)
様々な形式のファイルを適したソフトで開くコマンド
Ubuntuでも頑張れば設定出来るかも
15 clear
画面を一掃する(ショートカットはCtrl+L)
16 echo
入力した文字をそのまま出力する
17 >
A > B みたいに使う
左側の処理の結果を右側のファイルに渡す
ex) "abcdefg" > Sample.txt //左の文字列をSample.txtに代入している
※ただし、既にtxtに文字データが入っている場合、
"zsh: file exists: Sample.txt" と出てきてしまう
18 chmod
実行・編集・閲覧権限を付与する
サイトからダウンロードしたものの、中には見れない物があったりする。(読み取り専用のファイルなど)。それを開けるようにする
ex) chmod 777 sample.txt
ls -l sample.txt
>rwxrwxrwx ~~~~~~~~~~~~~~~
ここでのrwxは上の最初の数字の7に対応している
(read,write,x?)
19 strings
バイナリファイルの中の読める文字だけ表示する
20 grep
ファイルやコマンドの出力から特定の文字列を抽出するときに使うコマンド。
パイプ(バーティカルライン)と一緒によく使う。
ex) strings sample.s | grep "picoCTF"
>picoCTF{~~~~~~~~~~}
※ > は結果を右のファイルに渡すだけで、右のコマンドで使用はできない
2. 暗号(古典暗号)
古典暗号
・暗号は大きく分けて古典暗号と現代暗号の2つがある(明確な区別はない)
・鍵が少ない・アルゴリズムが単純(手動で解読出来たりする)
シーザー暗号(Caesar code)
・平文(相手に贈りたい文字)の各文字を辞書順に左に3文字シフトして暗号文を作る暗号
..復号はどんなコードが必要か ・平文から暗号文にするために左に3つシフトしているので 復号するには右に3つシフトする。
・コーナーケース x,y,zはそれぞれa,b,cになる(上手くシフトしないとASCIIコードでは別の文字になってしまう)
cixdfpklmoldobpp →右に3ビットずらしてみよう
flagisnoprogress
ROTn
平文の各文字を辞書順にn文字分シフトして暗号文を作る暗号
・ROTate by N placesの略
・アルファベット26文字分のシフトを全列挙するだけで解ける
単一換字式暗号
・平文の文字と暗号文の文字が常に1対1で変換される暗号。
解読には頻度分析が使われる。
..解読するには 文字の出現頻度を書く文字ごとに出していく。
暗号文が長い方が有利になっていく。
...頻度分析されにくくするための対策 ・冗字を利用する
・綴りをあえて間違える(the とか 分かりそうな単語をあえてthaとか間違えて書くと解析されづらくなる)
・頻出語句をわざと取り除く
・頻出語句を記号に置き換える
スキュタレー暗号
・特定の大きさの筒の周囲に紙を巻き付けて筒の伸びる方向に文字を書く
・手動で簡単に解読出来る
エニグマ暗号
結構難しいらしい。今はまだやらない。
3.John the ripper
Crypto 6.11
John the ripper
ハッシュ化されえたパスワード(Linuxのshadowファイルに格納されているものなど)をクラッキングするツール
3つのモードでパスワードの解読を試みる(single, wordlist, incremental)
2つのファイル
password
ファイルパス→/etc/passwd
(ユーザ名):x(pass):(ユーザID):(コメント):(ホームディレクトリ):(シェル)
一般ユーザが読み込み可能
shadow
ファイルパス→/etc/shadow
(ユーザ名):(暗号化パス):(パス変更日):(変更可能日数)~以下略
暗号化されたパスワードがある。
rootユーザが読み書き可能
ハッシュについて
ハッシュ関数はいろいろある(ハッシュ値から平文には戻せない)
md5 $1$
sha-2(亜種がいっぱいある)
sha-3
sha-4
3つのモード
single
ユーザ名をもとにパスワードを推測(弱いパスに効果抜群)
これがデフォルト
wordlist
リストを指定して辞書攻撃
手がかりがなかったらLinuxのディレクトリにあるリストを使うのがいいかも
Incremental
みんな大好きブルートフォース
11111...やaaaaa...などから探っている。
Hydraについて
サーバーの外から攻撃
認証に対してパスワードの解読を試みる
Johnのwordlistみたいに辞書が使える
攻撃対象のIPアドレスを用意