Oh, nice packet

slankdevの報告

osc北海道参加記録

前回のオープンソースカンファレンス2016東京に続き、先日北海道で行われたオープンソース カンファレンス2016北海道にも参加させていただきました。 いつも通り「国立セキュリティ・キャンプ同窓会」というコミュニティで参加をさせていただき、 セキュリティキャンプ修了生の成果報告という形で展示とセミナーをさせていただきました。 前回はるくすさん(@rkx1209)に協力を仰ぎ、手伝っていただいたのですが、今回のセミナーは 私単身で心細いながらもパケット解析手法についてのお話をさせていただきました。 後述いたしますが、展示も前回と同じようにcpawctfの宣伝をさせていただいています。 今回は開発中の新フロントエンドの試作を展示させていただきました!

展示内容

前回に引き続き、みんなのぱろっく(@porisuteru)が代表となって運営をしている 初心者向け常設型ctfであるcpawctfの展示を行いました。今回は開発中の新フロントエンドを 展示させていただきました。とってもかっこよかったです! 新フロントエンドの詳細は乞うご期待ということで。。。!

ここですこし宣伝をさせていただきます。

cpawctf (https://ctf.cpaw.site)

cpawctfとはその名のとうり、cpawという団体が運営をしている初心者向けな常設型ctfです。 代表はあの有名なぱろっく(@porisuteru)です。picture of proのぱろっく(@porisuteru)です。 初心者向けの他の常設型ctfだとakictf(http://ctf.katsudon.org)やksnctf (http://ksnctf.sweetduet.info)などがありますが、cpawctfは丁寧に入門者向けのドキュメントが 揃っていて、とってもありがたいかんじになっています。 ctfをしていく上でどんなツールがあって、どういう風に使うのか。などといったところから 説明をしてくれるので、有効活用していきたいところです。

以下のように入門者向けドキュメントを公開しています。 http://sandbox.spica.bz/cpaw_ctf/about_ctf.html

僕自身まったくと言っていいほどctfができないので、そこまで生活に関わりがあるわけでは ありませんが、ぱろっくは大学が同じということもあって、たくさんいい影響を与えて もらっています。感謝。

セミナー内容

今回もセミナーをやらせていただきました。 前回(http://blog.slankdev.net/2016/03/09/osc2016tk)は「パケット解析ライブラリの実装」 というテーマでるくすさんとはんぶんこでセミナーをやらせていただいたのですが、 今回は私一人で約50分すべての時間をいただいて、お話をさせていただいてきました。 私なんかでなんとも申し訳ないような感じですが、キャンパーの皆様に恥じぬように ありがたみを感じながら、精一杯パケット解析のことを話してきました。

発表資料

セミナーで使用したスライドは、slideshareにあげてあります。下記を参照ください。

www.slideshare.net

また、今回のセミナーでは実際に新しいプロトコルの通信を解析していくデモを 行いました。デモで使用したプログラムなどのために事前にサポートページを用意して、 公開をしておいたので、一応ここにも載せておきます。 http://blog.slankdev.net/2016/06/17/osc2016do/

資料などを見ていただければ分かりますが、この記事でもかんたんに説明していこうと 思います。

テーマはいつも通りパケット解析

前回東京でセミナーをさせてもらった時は「こんなのつくったよ」といった感じのお話でしたので、 今回はがっつり手を動かしていくセミナーにしたいと事前に予定していて、なんとか間に合うことが できました。

今回のセミナーのアジェンダを示します。

  • パケット解析の課題
  • libpgenの紹介
  • 新たなプロトコルを解析しよう!!

まあざっとこんな感じです。プログラミング言語からパケット解析を可能にすることで、 既存の解析環境と比べ、より柔軟にパケット解析などが行えることを示していく内容です。

さらーっとlibpgenについて説明して、そこからすぐにデモに入りました。 既存の環境でパースできないプロトコルがほしかったので、それも自分で適当に考えて それ用のアプリケーションも実装しました。(ほんとにひどい出来ですが。。。) 今回使用したデモ専用でtmp(testmessageprotocol)という架空のプロトコルを自己定義して、 それをc++11で自由に解析出きるようにlibpgenを拡張していくことにしました。

libpgenで新たなプロトコルを解析するにはそのパケットを解析する'パケットクラス'というのを 実装すればよくしています。すべてのパケットクラスはpgen::packetという抽象クラスがあるので それを継承して実装をするのですが、仮想関数などをユーザに実装させるようにある程度の 束縛をして、作業の簡略化を図っています。

セミナーでは実際に拡張するコードの解説まで行うことができたので、私的には満足を しています。眠かった方、ごめんなさい(笑)

libpgenに関する今後の展望

もともとnw関連のプログラミングに本格的に興味を持ち始めたのが、昨年の3月ごろで libpgenの開発は同年5月ごろからゆったりと始めました。もともとは私の愛するarpのパケットを 送るためのスニペットだったのですが、そのうち、wiresharkのようにどのようなプロトコルも 同じように直感的に解析出きるようにしたくなり、新しいプロトコルにもかんたんに拡張が できるように改善しているところです。 サイボウズラボユースで開発を支援していただいたこともあり、我流のやり方ではなく、 少しずつ正しい(成功例に近い)設計実装に近づいて着ましたが、まだまだ欠点がたくさんあります。

  • 遅い
  • 拡張用のapiが揃っていない
  • もっとかんたんに拡張出来るのでは

まずとにかく、libpgenは遅いんです。一つのパケットを解析するのに最低でも一回はメモリ コピーを行うので、とても非効率かつ遅いです。この辺は今後工夫をしながら早くしていきたい ところです。 また、パケットクラスの拡張はまだまたかんたんにできるはずだと信じています。 libpgenではpacket-class has some header-classesのhas-a関係で2つのクラス(パケットクラス とヘッダクラス)をうまく使っているのですが、もう少しシンプルでわかりやすく 実装をできないかを見当中です。

3月のosc2016tokyo/springから今にかけて変わったこと

春に行われたoscの時と比べて、だいぶ自分の進む方向が見えてきた気がします。 前回のoscではるくすさん(@rkx1209)に開発系の楽しさをたくさん教えていただきました。 あのへんからだんだんと見ていくソフトウェアもos系の低いところ?にどんどん落ちていくように なってきました。 普段からよくしていただいている坂井さんや今岡さんも低いレイヤなせいか、 ぼくの興味のレイヤはどんどん落ちる一方です。 現在はパケット解析ではなく、osがパケットをやりとりする中身に興味を持って 生きているので、そちらでも何か成果物をつくって見たいと思います。

まとめ

毎度のことですが、セキュリティキャンプのおかげで、個人参加が難しいoscに 参加することができて、とてもありがたいです。 今回は憧れていた沖勝氏(@masaru0714)にお会いしてお話をしていただいたり、 キャンプ講師でnetbsdの怖い人である蛯原さんなどともおはなしをすることができて とっても楽しかったです。 夏のセキュリティキャンプ全国大会の準備など、すこし楽しく忙しくなれそうですが、 また成果が形として残ればぜひとも参加させていただきたいです。

最後に今回oscに参加するために支援をしてくださった、セキュリティキャンプ実施協議会 の皆様、協力をしてくださった北海道キャンパーの皆様、ありがとうございました。 得に、申し込みや事務仕事をたくさん行ってくださったあるねこさん(@aruneko99)には 頭が上がりません。

また今回発表させていただいたlibpgenの開発をサポートしてくださっているサイボウズラボ 株式会社様、得にメンターの光成滋生さん(@herumi)、ご協力ありがとうございました。 今後ともよろしくお願い致します。