ハッキングがテーマのノベルゲーム「CyberRebeat」に触発されて、CTFの練習問題「Basic is secure?」を解くためにパケットキャプチャを使ってみた【CTF入門】
CyberRebeatとは
ハッキングを題材したノベルゲーム。
CyberRebeat -The Fifth Domain of Warfare-
作中、とあるハッカーはこう言います。
"僕らにとって、世界は不安なほどに穴だらけだ"、と。
ボタン一つでネットに繋がっているOA機器が検索でき、
10ドル出せばハッキングツールが説明書付きで手に入るこの時代。
本作では"CTF"と呼ばれる、現実に存在しているハッキング競技を皮切りに、
彼らの世界、その一端を描き出します。
CTFとは
コンピュータ・セキュリティ技術を用いた競技。
すごく簡単に言うと、ハッキング大会。
最近少し興味が湧いてきた。
CTF競技内容
主に2つある。
- attack/defense style
攻防戦形式(英語:attack/defense style)では、 各チームに守るべきコンピュータ(または小規模なネットワーク)が割り当てられ、 自チームのコンピュータに対する相手からの攻撃の防御成功、 及び相手のコンピュータに対する攻撃の成功に対し得点が与えられる。 個々のCTFのルールによって、 相手のコンピュータに侵入して情報を奪う(相手の旗を奪う)又は情報を書き込む(自分の旗を立てる)ことを企図する。
- jeopardy style
クイズ形式。出題された問題に隠されたFlagを手に入れ、
提出してポイントを貰う。
※「Capture The Flag」の略がCTF
入門として
以下のサイトに練習用の問題がある。
今回チャレンジした問題
手順
リンクからq8.pcapをダウンロード
wiresharkで読み込む
パケットがいっぱい出てきた(小並感)
気になるところを読む
この問題はBasic認証。
レスポンスヘッダに200 OKとでていることから、
Basic認証が成功したことがわかる。
4(レスポンス)をみてみる
実際のパケットのHTTPレイヤを見てみるとこんな感じ。
成功してるっぽい。
「The flag is q8's password.」とある。
3(リクエスト)を見てみる
あ。。あった。
感想
パケットキャプチャとBasic認証の知識があれば何となくいける問題だった。
この調子で他の問題も解いていこうと思う(networkとかwebを中心に)
Dockerで動かしているubuntuにて、apt-getが動かない
以下の手順で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ができないのだろう。
ここらへんの仕組みが未だよく分かっていない。。。
追記
しらべたらわかったので整理しました。
DockerでMySQLコンテナを起動し、Sequel Proで接続してみる
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の設定
これでOKです。
vagrantを使ってcoreosを立ち上げている場合、
ホストには、CoreOSのprivate ipを記述すれば大丈夫です。
まとめ
手軽に環境が作れるので、Dockerは本当に便利。
劇的ビフォ◯アフターで学ぶデザインパターン〜facade pattern〜
カレーを作るクラスを考える
玉ねぎきって、
じゃがいもをむいて切って、
カレールーをとかす。
そんな料理を実現するクラス群を作って考えてみます。
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();
クラス図
これを見ると、
使う側のクラス(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();
クラス図
なんということでしょう。
先ほどMainクラスは3つのクラスのことを知っている必要がありましたが、
今は1つ(Chefクラス)だけ知っていればOKとなりました。
匠(facade)のお陰で随分疎結合な設計となりました。
PotatoやCurryBase等のクラスのメソッド名などを修正しても、
使う側のクラス(Main)は修正する必要はありません。
すばらしいですね。
まとめ
facade patternは、
使う側と
使われる側を疎結合にする
デザインパターンでした。
そうすることにより、
クラス修正による影響を使う側がうけないので、
修正に対して強くなります。
最後の平成を迎えるにあたり、今年の抱負を書いてみる(平成関係ありません)
原則
- たーのしー!と思ったことをやる
以上。
何をやるのか
- LTでウケを狙いに行く
ウケたとき楽しかったから。
- ブログ記事でウケを狙いに行く
読まれると楽しいから。
こういうのをどんどん書きたい。
- インフラ〜セキュリティエンジニア方面へ進む準備をする
linuxの勉強してたら楽しくなってきたから。
なんでこんなIQ低そうな原則なの?
楽しいことをやっているときが最もパフォーマンスが高くなると思っている。
成長スピードも速そう。
そういうもんでしょ。
もう少し真面目に書くと
- なんでウケを狙うの?
「教育というものは教える側も教えられる側も楽しくあるべき」という持論がある。
楽しければ、双方記憶に残る。
そういうもんでしょ。
- なんでインフラ〜セキュリティやるの?
システム全般に必要とされているのと、
アプリケーションエンジニアはインフラ&セキュリティ弱い人多いから
差別化できると思って。。。安直ですね。
なにはともあれ
楽しく成果出します。
今年もよろしくお願いいたします。
httpとtcpの違いが(ちょっとだけ)わかった
はじめの認識
httpプロトコルとtcpプロトコルは全然別物だと思ってた。
今の認識
実際別ものだった。
しかも使われるレイヤが違った。
httpにとってtcpはインフラみたいなもの。
httpが上位のレイヤ(アプリケーション層)
ネットワークのカプセル化とオブジェクト指向のカプセル化
データ送信元にて、
アプリケーションレイヤからトランスポートレイヤにデータを渡す際、
オブジェクト指向のカプセル化
カプセル化されたものは、中身を気にしなくて良い。
インターネットのカプセル化
tcpヘッダにカプセル化されたhttpパケットのペイロード(いわゆる中身)を、
tcpレイヤは気にしなくて良い。
カプセル化のメリット
tcpレイヤの責務が少なくなる。上位のレイヤのことを気にしなくて良い。
そうすると、tcpレイヤとhttpレイヤの依存性が少なくなり(殆ど無い?)、
汎用性が高まる。
汎用性が高い、といえそう。
まとめ
ネットワーク覚えること多いけど面白い。