LinPAの日記

主にプログラミング関連についてのブログ記事を上げたいと考えています。特に競技プログラミング関連の話題について触れていくつもりです。

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-1

sha-2(亜種がいっぱいある)

sha-3

sha-4

3つのモード

single

ユーザ名をもとにパスワードを推測(弱いパスに効果抜群)

これがデフォルト

wordlist

リストを指定して辞書攻撃

手がかりがなかったらLinuxディレクトリにあるリストを使うのがいいかも

Incremental

みんな大好きブルートフォース

11111...やaaaaa...などから探っている。

Hydraについて

サーバーの外から攻撃

認証に対してパスワードの解読を試みる

Johnのwordlistみたいに辞書が使える

攻撃対象のIPアドレスを用意