君は心理学者なのか?

大学時代に心理学を専攻しなぜかプログラマになった、サイコ(心理学)プログラマかろてんの雑記。

ハッキングがテーマのノベルゲーム「CyberRebeat」に触発されて、CTFの練習問題「Basic is secure?」を解くためにパケットキャプチャを使ってみた【CTF入門】

CyberRebeatとは

ハッキングを題材したノベルゲーム。

f:id:karoten512:20180107195427p:plain

CyberRebeat -The Fifth Domain of Warfare-

作中、とあるハッカーはこう言います。
"僕らにとって、世界は不安なほどに穴だらけだ"、と。
ボタン一つでネットに繋がっているOA機器が検索でき、
10ドル出せばハッキングツールが説明書付きで手に入るこの時代。
本作では"CTF"と呼ばれる、現実に存在しているハッキング競技を皮切りに、
彼らの世界、その一端を描き出します。

CTFとは

コンピュータ・セキュリティ技術を用いた競技。

すごく簡単に言うと、ハッキング大会。

最近少し興味が湧いてきた。

CTF競技内容

主に2つある。

  • attack/defense style

攻防戦形式(英語:attack/defense style)では、 各チームに守るべきコンピュータ(または小規模なネットワーク)が割り当てられ、 自チームのコンピュータに対する相手からの攻撃の防御成功、 及び相手のコンピュータに対する攻撃の成功に対し得点が与えられる。 個々のCTFのルールによって、 相手のコンピュータに侵入して情報を奪う(相手の旗を奪う)又は情報を書き込む(自分の旗を立てる)ことを企図する。

  • jeopardy style

クイズ形式。出題された問題に隠されたFlagを手に入れ、

提出してポイントを貰う。

キャプチャー・ザ・フラッグ - Wikipedia

※「Capture The Flag」の略がCTF

入門として

以下のサイトに練習用の問題がある。

ksnctf.sweetduet.info

今回チャレンジした問題

ksnctf.sweetduet.info

手順

リンクからq8.pcapをダウンロード

wiresharkで読み込む

f:id:karoten512:20180107195955p:plain

パケットがいっぱい出てきた(小並感)

気になるところを読む

f:id:karoten512:20180107200818p:plain

この問題はBasic認証

レスポンスヘッダに200 OKとでていることから、

Basic認証が成功したことがわかる。

4(レスポンス)をみてみる

実際のパケットのHTTPレイヤを見てみるとこんな感じ。

f:id:karoten512:20180107200956p:plain

成功してるっぽい。

「The flag is q8's password.」とある。

3(リクエスト)を見てみる

f:id:karoten512:20180107201543p:plain

あ。。あった。

感想

パケットキャプチャとBasic認証の知識があれば何となくいける問題だった。

この調子で他の問題も解いていこうと思う(networkとかwebを中心に)

Dockerで動かしているubuntuにて、apt-getが動かない

f:id:karoten512:20180107135255p:plain

以下の手順でDockerでubuntuを動かした

イメージ取得&コンテナ起動

$ docker pull ubuntu
$ docker run -d -ti --name ubuntu ubuntu /bin/bash

コンテナにはいる(bashプロセスの立ち上げ)

docker exec -ti ubuntu /bin/bash

apt-getが動かない。。。

$ apt-get install vim
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim

他のパッケージについて試してみても、 同じように「Unable to locate package」が表示される。

解決方法

$ apt-get update

を実行。

これでパッケージのリストが更新される。

これでapt-getでパッケージがinstallできるようになる。

わからないこと

パッケージリストの更新ってのは具体的に何をしているのだろうか。。。

なぜ、これを行わないとパッケージのinstallができないのだろう。

ここらへんの仕組みが未だよく分かっていない。。。

追記

しらべたらわかったので整理しました。

karoten512.hatenablog.com

【メモ】linuxのアーキテクチャを確認する方法

linuxアーキテクチャを確認する方法

dockerで走らせているubuntuアーキテクチャがわかんなくなったので、

確認したい。

方法1:unameコマンド

$ uname -m
x86_64

方法2:環境変数で確認

$ getconf LONG_BIT
64

まとめ

64bitということがわかった。

DockerでMySQLコンテナを起動し、Sequel Proで接続してみる

f:id:karoten512:20180107101032j:plain

MySQL、ちょっとだけ試したい時がある

「indexってどうやって貼るんだっけ?」

「外部キー制約ってどういうふうに効いてくるんだっけ?」

「ちょっとSQLの練習がしてみたいなぁ」

というとき、

DBとして残すほどではないけどMySQLを試したいな〜と思います。

そんなときはDocker

Dockerなら、環境を本当に簡単につくることができます。

手順

MySQL公式イメージをpull

$ docker pull mysql

コンテナを走らせる

$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=mysql -d -p 3307:3306 mysql

e オプション

e オプションを使うことにより、コンテナに環境変数を渡すことが出来ます。

渡せる環境変数は公式サイトの「Environment Variables」で確認が可能です。

https://hub.docker.com/_/mysql/

p オプション

-p ホストマシンのポート番号:コンテナのポート番号

という書き方をすると、

コンテナのポートが公開され、

ホストマシンと通信ができるようになります。

今回は、コンテナの3306番を公開し、

ホストマシンの3307番と通信させています。

Sequel Proの設定

f:id:karoten512:20180107103444p:plain

これでOKです。

vagrantを使ってcoreosを立ち上げている場合、

ホストには、CoreOSのprivate ipを記述すれば大丈夫です。

まとめ

手軽に環境が作れるので、Dockerは本当に便利。

劇的ビフォ◯アフターで学ぶデザインパターン〜facade pattern〜

f:id:karoten512:20180107002115j:plain

カレーを作るクラスを考える

玉ねぎきって、

じゃがいもをむいて切って、

カレールーをとかす。

そんな料理を実現するクラス群を作って考えてみます。

before

まずはfacade patternを使わずに書いてみます。

ソースコード

class Onion {
    cut() {
        console.log('玉ねぎが刻まれました');
    }
}
class Potato {
    peel() {
        console.log('じゃがいもの皮をむきました');
    }
    cut() {
        console.log('じゃがいものをきりました');        
    }
}
class CurryBase {
    dissolve() {
        console.log('ルーを溶かしました');
    }
}

class Main {
    static cookingStart() {

        /** 玉ねぎ2個を刻む */
        const onion1 = new Onion();
        onion1.cut();
        const onion2 = new Onion();
        onion2.cut();

        /** じゃがいも2個を剥いて切る */
        const potato1 = new Potato();
        potato1.peel();
        potato1.cut();
        const potato2 = new Potato();
        potato2.peel();
        potato2.cut();

        /** カレーのルーを溶かす */
        const curryBase = new CurryBase();
        curryBase.dissolve();
    }
}
Main.cookingStart();

クラス図

f:id:karoten512:20180107001136p:plain

これを見ると、

使う側のクラス(Mainクラス)が

使われる側のクラスを3つも知っていることになります。

使う側と使われる側の依存性が高いといえます。

この場合、使われる側のクラスのメソッド名などを修正した際、

使う側のクラスも修正しなくてはいけません。

after

今度はfacade patternを使って書いてみます。

ソースコード

class Onion {
    cut() {
        console.log('玉ねぎが刻まれました');
    }
}
class Potato {
    peel() {
        console.log('じゃがいもの皮をむきました');
    }
    cut() {
        console.log('じゃがいものをきりました');        
    }
}
class CurryBase {
    dissolve() {
        console.log('ルーを溶かしました');
    }
}

class Chef {
    cook() {
        
        /** 玉ねぎ2個を刻む */
        const onion1 = new Onion();
        onion1.cut();
        const onion2 = new Onion();
        onion2.cut();

        /** じゃがいも2個を剥いて切る */
        const potato1 = new Potato();
        potato1.peel();
        potato1.cut();
        const potato2 = new Potato();
        potato2.peel();
        potato2.cut();

        /** カレーのルーを溶かす */
        const curryBase = new CurryBase();
        curryBase.dissolve();        
    }
}

class Main {
    static cookingStart() {
        const chef = new Chef();
        chef.cook();
    }
}

Main.cookingStart();

クラス図

f:id:karoten512:20180107003841p:plain

なんということでしょう。

先ほどMainクラスは3つのクラスのことを知っている必要がありましたが、

今は1つ(Chefクラス)だけ知っていればOKとなりました。

匠(facade)のお陰で随分疎結合な設計となりました。

PotatoやCurryBase等のクラスのメソッド名などを修正しても、

使う側のクラス(Main)は修正する必要はありません。

すばらしいですね。

まとめ

facade patternは、

使う側と

使われる側を疎結合にする

デザインパターンでした。

そうすることにより、

クラス修正による影響を使う側がうけないので、

修正に対して強くなります。

最後の平成を迎えるにあたり、今年の抱負を書いてみる(平成関係ありません)

原則

f:id:karoten512:20180105155621j:plain

  • たーのしー!と思ったことをやる

以上。

何をやるのか

  • LTでウケを狙いに行く

ウケたとき楽しかったから。

  • ブログ記事でウケを狙いに行く

読まれると楽しいから。

karoten512.hatenablog.com

karoten512.hatenablog.com

こういうのをどんどん書きたい。

  • インフラ〜セキュリティエンジニア方面へ進む準備をする

linuxの勉強してたら楽しくなってきたから。

なんでこんなIQ低そうな原則なの?

楽しいことをやっているときが最もパフォーマンスが高くなると思っている。

成長スピードも速そう。

そういうもんでしょ。

もう少し真面目に書くと

  • なんでウケを狙うの?

「教育というものは教える側も教えられる側も楽しくあるべき」という持論がある。

楽しければ、双方記憶に残る。

そういうもんでしょ。

  • なんでインフラ〜セキュリティやるの?

システム全般に必要とされているのと、

アプリケーションエンジニアはインフラ&セキュリティ弱い人多いから

差別化できると思って。。。安直ですね。

なにはともあれ

楽しく成果出します。

今年もよろしくお願いいたします。

httpとtcpの違いが(ちょっとだけ)わかった

はじめの認識

httpプロトコルtcpプロトコルは全然別物だと思ってた。

今の認識

実際別ものだった。

しかも使われるレイヤが違った。

httpにとってtcpはインフラみたいなもの。

httpが上位のレイヤ(アプリケーション層)

tcpが下位のレイヤ(トランスポート層

tcpプロトコルがないとhttpプロトコルは使えない。

ネットワークのカプセル化オブジェクト指向カプセル化

データ送信元にて、

アプリケーションレイヤからトランスポートレイヤにデータを渡す際、

tcpヘッダを付与することを「カプセル化」というらしい。

これは、オブジェクト指向カプセル化とにている。

オブジェクト指向カプセル化

カプセル化されたものは、中身を気にしなくて良い。

インターネットのカプセル化

tcpヘッダにカプセル化されたhttpパケットのペイロード(いわゆる中身)を、

tcpレイヤは気にしなくて良い。

カプセル化のメリット

tcpレイヤの責務が少なくなる。上位のレイヤのことを気にしなくて良い。

そうすると、tcpレイヤとhttpレイヤの依存性が少なくなり(殆ど無い?)、

汎用性が高まる。

事実、tcpレイヤはいろんなプロトコルで使われているので、

汎用性が高い、といえそう。

まとめ

ネットワーク覚えること多いけど面白い。