大学院に行くということ

卒業式は迎えてないのですが、卒業式参加者のリストに自分の名前があったので、私が大学院に進んだモチベーション、およびそれを達成できたのかどうかということを書き連ねたいと思います。

要はポエム記事、長いです。基本的に文句っぽいものがでたとしても文句ではないです。

私の院に行ったモチベーション

院に行く理由は人によって違うと思います。研究したいとかモラトリアム延長とかみんなが行くからとかあると思いますが私は

  • 自分の実力不足を強く感じていたから
  • 研究をするのに1年は少ないかなぁと思っていたから

という理由でした。

実力不足を感じた理由はCTFとセキュキャンに関する話ですね。国公立に行ってたから上位クラスだろとか思ってたんですが、情報系に関してはただの雑魚だということを思い知らされたので社会に出るのが怖い印象を持ってました。

なので実力不足に関しては院進含めた3年間あれば多少は補えるかなぁと思っていました。実力不足感は今もありますが社会に対する不安は今は全然ないです。

研究に関しては先輩の卒論発表見てこれよりももうちょっと進めていきたいなとか思っていました。

この2つを院に入ってどのような感じで解消したのかとか結果どうだったのかというのを書いていこうかなと

実力不足について

学部3年の時にセキュリティミニキャンプに参加しました。思い返せばこれが私の初めての学業方面での学外の活動です。誘ってくれた大学同期の実力が高いのは知っていたのですが、それ以外にもやばい人がいっぱいいた(あのミニキャンプ私のテーブルにやばい人が集中してた可能性あるんだけど)。ということで普段の授業を受けてただけの人間としては実力不足かつ社会に対する怖さ(このレベルの人間がいっぱいいるのが社会なのかという思い)を受けてもっと勉強しなきゃという思いに駆られました。

そのあとまじめに勉強したのかというと勉強はしていきました。ただ某氏とか某氏に比べたら成長速度とか遅いかったのでそこは自分のやる気不足でもあるなぁとお思うこともありました。またそういった存在がいることを知って同年代の人たちに追いつきたいという思いもでてきたので、個人的にはがんばったつもりです。

ただ同期がセキュリティばりばりの人間ではなかったので、外部からの刺激を得るためにセキュリティ勉強会やらに参加して、勉強する意識が低下しないようには心掛けていました。

社会に対する怖さってのはインターンに行ってなくなりました。院1年でインターンに行って、その当時の実力で2weekのインターンを難なくやっていけたので社会に出ても問題なさそうっていう判断ができました。

結論として実力不足は今も感じていますが社会に対しての恐怖心はないので社会人がんばれます。

研究期間と研究について

研究期間

まぁ研究を進めていきたい人にとってはやっぱり短いかなと思います。まぁ研究室にもよると思います。うちの研究室は遅めのスタートだったのでそれを考えると3年間研究してていいと思いました。ただ私は結構興味が移りやすい部分はあるので1年なら1年でまとまってはいたので後悔はしなかっただろうなぁとも思いますね。

研究

私の研究内容を知りたい人は調べてください。自分としては納得いかない部分(主にコーディング技術)がありました。ただ研究内容に関してはあんまり詰まることがなかったので研究としてはある程度の満足はあります。 あとは研究を進めていくにあたって、研究内容を論文にする際に私の文章力がひどいことがわかりました(多分このポエムもそうとう読みにくいし誤字もあると思います)。まぁそんな感じで自分の苦手な部分を知ることができました。何気に研究って調査力、文章力、実装力等多方面の能力を鍛えていく必要があります。

結論、研究期間として1年でも3年でも私は問題なかった。3年あった分いろいろ同期や後輩の研究を見てきたので知識は増えたのでそういう意味でとてもよかった。 研究内容が自由に決めれて研究内容は有意義だった、自分の苦手な点はわかったのでよかったかなと。

マイナス面

だらけた....いやもっとできただろっ的な感覚はある、実務をいきなりやった方が実力はつきそう。やっぱ世の中お金、お金を稼ぎつつ実力つけれるのが便利、ただ自由な時間はあるのか...ここらへんはわからん

総じて

院進自体に後悔はないです。これは研究室の雰囲気、院進するための目的そこらへんが自分に合っていたと思います。むしろ私にとってはプラスだったと思います。

プラスの要素として、下の感じかなと思います。

  • 外部の勉強会に行っても特に問題なかった(コアタイムがなかったので)
    • ミーティングにかぶってても進捗さえ書いておけば許されたと思う(多分なかったけど)
  • 研究でやりたいことをやらせてもらえた
  • 研究室で好き放題にいろいろやれた(ラズパイ使ったり,学内CTFもどきやれたり)

院進して増えた2年を有益に使えたと感じます。

院進にあたって

最後にいろいろと、院進するかどうか悩む人はこの時期はもう就活始まってるのでないと思いますが今後考えていく人向けとかもう卒業して院行ったならどうだったんだろうとか考える人向けに少し書きます。

正直学んでいきたい人は院進して後悔するのは少ないと思います。研究は学びつつ新たなところを開拓していくのでそういう意味で公開しないと思います。しかし研究室の相性はすごく重要です。研究室と合わないのであれば研究したい・学びたい人でも後悔すると思います。同期にも精神をすり減らしていた人がいました。

研究室を選ぶ優先度として研究室の雰囲気>研究内容だと思います。それで問題なく研究したい・学びたい人は院進してもいい感じに学べていけると思います。なんだかんだ今はいろんな人が技術ブログ書いてたりするので学ぶ部分に関してはやる気さえあれば学ことはできます(私の場合ももいろテクノロジー様には大変感謝しております)ので、そういうことを考えて院進や研究室選びするといいんではないかと思います。

おわり

春から新社会人です。まぁ社会人として仕事もがんばりつつ、セキュリティに関しても勉強していく感じで私はがんばっていきます。ここまでお読みいただきありがとうございます。

換字式暗号(弊研究室の某課題について考える24日目)

はじめに

この記事は弊研究室の某課題について考えるの24日目の記事になります

今日は換字式暗号についてです。シーザー暗号とかヴィジュネルとかですね

シーザー暗号

シーザー暗号はローマ皇帝ガイウス・ユリウス・カエサル使用した暗号で、辞書順の文字列を-3文字ずらした暗号となります。下の図のようなことである

ADになるといった感じになります

f:id:kataware8136:20180307204316p:plain

よくあるのはROT13という13文字シフトする暗号が有名です

シーザー暗号は鍵として何文字シフトするか(ROT13なら鍵は13)、それと辞書を必要とします。

普通の辞書はABCDEFGHIJKLMNOPQRSTUVWXYZですが、ほかの文字を付け加えた辞書で暗号化することも可能です。

シーザー暗号のアルゴリズム

辞書をABCDEFGHIJKLMNOPQRSTUVWXYZとしてA=0Z=26とする

文字xとして鍵nでシーザー暗号すると、下のようになる

暗号化:C_n[x] = (x + n) mod 26

復号:P_n[x] = (x - n ) mod 26

ヴィジュネル暗号

ヴィジュネル暗号は下の画像に示すヴィジュネル方陣と任意の鍵を用いて暗号化と復号を行う換字式暗号です

https://upload.wikimedia.org/wikipedia/commons/c/c7/Vigenere-square.png

画像の最上段が平文、一番左の列が鍵として交差する部分が暗号化された新たな文字となります。

たとえば平文がhelloworldで鍵がkeyだった場合hkが重なるrが生み出される暗号となります。

平文が鍵の長さより長い場合は鍵を繰り返して暗号化を行います。

helloworld

keykeykeyk

こんな感じで対応して暗号化されます。

ヴィジュネル暗号は鍵が分からない&鍵の長さがわからないことで復号を困難としています。なのでCTFの問題的には鍵が求められるor鍵の周期がわかるといったことで解けるようになります。

SECCONのヴィジュネル

k: ????????????

p: SECCON{???????????????????????????????????}

c: LMIG}RPEDOEEWKJIQIWKJWMNDTSR}TFVUFWYOCBAJBQ

k=key, p=plain, c=cipher, md5(p)=f528a6ab914c1ecf856a1d93103948fe

 |ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
-+----------------------------
A|ABCDEFGHIJKLMNOPQRSTUVWXYZ{}
B|BCDEFGHIJKLMNOPQRSTUVWXYZ{}A
C|CDEFGHIJKLMNOPQRSTUVWXYZ{}AB
D|DEFGHIJKLMNOPQRSTUVWXYZ{}ABC
E|EFGHIJKLMNOPQRSTUVWXYZ{}ABCD
F|FGHIJKLMNOPQRSTUVWXYZ{}ABCDE
G|GHIJKLMNOPQRSTUVWXYZ{}ABCDEF
H|HIJKLMNOPQRSTUVWXYZ{}ABCDEFG
I|IJKLMNOPQRSTUVWXYZ{}ABCDEFGH
J|JKLMNOPQRSTUVWXYZ{}ABCDEFGHI
K|KLMNOPQRSTUVWXYZ{}ABCDEFGHIJ
L|LMNOPQRSTUVWXYZ{}ABCDEFGHIJK
M|MNOPQRSTUVWXYZ{}ABCDEFGHIJKL
N|NOPQRSTUVWXYZ{}ABCDEFGHIJKLM
O|OPQRSTUVWXYZ{}ABCDEFGHIJKLMN
P|PQRSTUVWXYZ{}ABCDEFGHIJKLMNO
Q|QRSTUVWXYZ{}ABCDEFGHIJKLMNOP
R|RSTUVWXYZ{}ABCDEFGHIJKLMNOPQ
S|STUVWXYZ{}ABCDEFGHIJKLMNOPQR
T|TUVWXYZ{}ABCDEFGHIJKLMNOPQRS
U|UVWXYZ{}ABCDEFGHIJKLMNOPQRST
V|VWXYZ{}ABCDEFGHIJKLMNOPQRSTU
W|WXYZ{}ABCDEFGHIJKLMNOPQRSTUV
X|XYZ{}ABCDEFGHIJKLMNOPQRSTUVW
Y|YZ{}ABCDEFGHIJKLMNOPQRSTUVWX
Z|Z{}ABCDEFGHIJKLMNOPQRSTUVWXY
{|{}ABCDEFGHIJKLMNOPQRSTUVWXYZ
}|}ABCDEFGHIJKLMNOPQRSTUVWXYZ{

練習問題としていい感じです

上杉暗号

下の図を見れば察するのではないでしょうか....

例えばうえすぎなら四三 五六 七五 六三って感じになります

f:id:kataware8136:20180307232146p:plain

CSRF(弊研究室の某課題について考える19日目)

はじめに

この記事は弊研究室の某課題について考える19日目の記事です

今日はCSRFの話、正直言葉は知ってる人多いと思うけど内容知らない人が多そうだと思ったので記事にします。CSRF自体の解説は他のサイトでもいっぱいされているのでそっちを見てもよし!

CSRFとは

CSRFとはクロスサイトリクエストフォージェリ(cross-site request forgeries)の略称でありWebアプリケーションの脆弱性の一つ、もしくはそれを利用した攻撃を指します。

具体的な被害としては以下のものが挙げられます

  • データ漏洩
  • 意図しないコードの実行
  • 権限の取得
  • なりすまし
  • アプリケーションデータの読み取り

こんな感じでしっかりと対策を行うべき脆弱性です。

CSRFは以下の状況で発生します

  • クッキーのみでセッション管理が行われているサイト
  • HTTP認証、SSLクライアント証明書、携帯電話の携帯IDのみで利用者の識別が行われているサイト

CSRFの例

docker-composeで手元でも確認できる環境を用意しました!やったね!!手元確認しない人用に重要な部分のソースコードは載せます。

Docker環境

先に書きます。徳丸本を参考にしてます

パスワード変更のサンプル(passwd.php)

<?php
        function h($str){
                return htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8');
        }
        session_start();
        // ログイン確認---省略
        $id = $_SESSION['id'];
?>
<!DOCTYPE HTML>
<html>
        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
                <meta http-equiv="Content-Security-Policy" contents="default-src 'self'; script-src 'self';">
                <title>Login form</title>
                <link rel="stylesheet" type="text/css" href="report.css">
        </head>
<body>
<div class="top19">
        <div class="box19">
        <h1>Password Change</h1>
        <form action="passchange.php" method="POST">
                新パスワード : <input name="pwd" type="password"><br>
                <input type="submit" value="パスワード変更">
        </form>
        </div>  <!-- box19 -->
</div>
</body>
</html>

POST送信の先(passchange.php)

<?php
        function h($str){
                return htmlspecialchars($str, ENT_NOQUOTES, 'UTF-8');
        }
        session_start();
        $id = $_SESSION['id'];
        // ログイン確認---省略
        $pwd = $_POST['pwd'];
        // パスワード変更処理
?>
<!DOCTYPE HTML>
<html>
        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
                <meta http-equiv="Content-Security-Policy" contents="default-src 'self'; script-src 'self';">
                <title>Login form</title>
                <link rel="stylesheet" type="text/css" href="report.css">
        </head>
<body>
<div class="top19">
        <div class="box19">
        <h1>Password Change</h1>
        <?php echo h($id); ?>さんのパスワードを<?php echo h($pwd); ?>に変更しました!
        </div>  <!-- box19 -->
</div>
</body>
</html>

この一連のページはパスワードの変更を行うものである。パスワード変更の流れは

  1. POSTメソッドでpasschange.phpがリクエストされる
  2. ログインを確認する
  3. POSTパラメータのpwdのパスワードに変更する

となっているが、2つめのログインを確認する場面を正しく行わないとCSRFが発生する。

対策方法は後で述べるとして攻撃方法を示す。

上のページにアクセスした後にcrack.htmlにアクセスするとpasswordがcrackedに変更されたメッセージが確認できると思います

<body onload="document.forms[0].submit()" >
<form action="http://[hostname]:4455/passchange.php" method="POST">
<input type="hidden" name="pwd" value="cracked">
</form>
</body>

上記例においてCSRFが発生する状況

ログイン確認の部分を記述していませんがここをしっかりすれば上の状況でもCSRFは発生しません。

ログイン確認の部分に固定の値ではなく乱数を含めたセッションidを用いればよいのです(セッションidは一定時間で変更するとなおよし)

<input type="hidden" name="sessionid" value="セッションidのもの">

送信されてきたセッションidと通信しているセッションidが同じであれば本人の通信であるという保証が得られます。

CSRFの対策

基本的には利用者の操作とアクセスが一致しているかどうかを確認することに尽きると思います。

もっと知りたい方は徳丸本を買いましょう。そして徳丸本は6月に改訂されるらしいです