Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

libpgenでパケット操作

3,069 views

Published on

libpgenというパケット操作のライブラリを作成した時の話です。
http://libpgen.org
で情報発信しています。

Published in: Software
  • Be the first to comment

libpgenでパケット操作

  1. 1. パケット操作の ライブラリを作った話 すらんく @slankdev
  2. 2. 自己紹介 すらんく (@slankdev) • http://slankdev.net • 城倉 弘樹(しろくら ひろき) • 2015 IPA セキュリティ・キャンプ全国大会卒業生 • 法政大学 理工学部 B2 takahoyoさんの後輩です • ネットワーク関係が趣味(初心者) CTF (NW問だけ) • 宗派は Vim Arch C/C++
  3. 3. 今日話すこと • 趣味でパケット操作のライブラリをC++で書いたん で その話をすることと、普及活動 • まさかり大歓迎です そもそもこのライブラリはまさかりで生きているよ うなものです
  4. 4. パケットを見たこと、ありますか?
  5. 5. パケットを作ったりいじったこと、ありますか?
  6. 6. パケットをつくる • ネットワークでパケットを理解する上でパケットを 見るだけではだめ • 作って試していろいろしたい • 自己環境ならなにやったって大丈夫
  7. 7. パケットを作ろう • パケットジェネレータとして一番優秀なのは多分 scapy(pythonのモジュール) イケメンパケリストが説明してくれるのでなにも説 明しません。 • python 便利だしよさそうだけどそれで作っても scapyあるし 誰も使ってくれない。。 • 普段C使うしCで書くかぁ
  8. 8. libpcap • http://tcpdump.org • tcpdump の開発者が開発しているマルチOSサポート の パケットキャプチャのライブラリ • Linux をはじめ様々なOSで簡単にパケットキャプ チャが作れるから 簡単だし入門にはいいかも • tcpdump のを開発しやすくするためにlibpcapを作っ た
  9. 9. tcpdumpの機能追加で作成
  10. 10. 超カッケーじゃんそういうの • 今回のライブラリはそんな厨二心で始まりました • 情報関係のとっかかりは厨二心でいいと考えていま す • このライブラリも一応簡単なプログラムの機能追加 のために作成 って建前で作り始めました
  11. 11. libpgen ってのを開発しました • http://libpgen.org • ソースコードはGitHubで管理しています • 現在はEthernet, ARP, IP, ICMP, TCP, UDP, DNS, DHCP, ar_droneに対応 • 開発は現在進行中です (協力してくれるひと募集して ます) • scapyに負けたくない
  12. 12. 自分でパケットを作って送る感動
  13. 13. Wiresharkとかで準備して
  14. 14. こんな感じに作って送って
  15. 15. 見れた時の感動
  16. 16. 想像を絶する感動 !!!
  17. 17. 巣立っていった我が子が帰ってくるような特別な気持ち
  18. 18. 巣立っていった我が子が帰ってくるような特別な気持ち 別に子供とかまだいません
  19. 19. 設計段階 その⓪ • 自由にパケットを作ることだけできればいい (ユーザはプロトコルの知識以外なにもなくてもで きれば最高) • エンディアンとか気にしないでパケット作れるよう にしたい • ソケット開いてオプションとか設定したりとか考え たくない • アドレスとかもいつも同じ作業だしめんどくさい • とりあえずARP好きだからEthernetとARPだけ実装 しよっと この辺は全然実用段階でないので説明をはしょります
  20. 20. 完成したもの その⓪ • ARP送れる。わー。。。終わり • まったく使えない。。機能すくなすぎ。 • まあこれでも初心者なので僕自身は勉強になりまし た • SocketのPF_PACKETでソケットを開いて実装 (Linuxのみ対応)
  21. 21. 設計段階① • いろんなプロトコルに対応させたいけどどうしたら 効率良いか 下位のプロトコルの操作をどうすればいいか ちょっとだけオブジェクトしこーにするか • 将来的に他のOSでもうごかしたい。。 OSごとに違う実装になるところだけ完全に切り離す • パケット編集のインターフェースを直感的にしたい
  22. 22. アーキテクチャ図 • こんな感じ設計しました • パケットクラス パケット操作を担当 • アドレスクラス IP,MACアドレス操作を担当 • Netutils OSごとの違いを吸収 OS Netutils パケットクラス アドレスクラス
  23. 23. アドレスクラス • IPアドレスとMACアドレスの操作を簡単にできるよ うにする • ネットワーク内をスキャンとかする時はIPアドレス の大小表現とかも必要だからそういう演算子も定義 しといた
  24. 24. パケットクラス • 直感的なインターフェースからパケットのバイナリ を生成 パケットインスタンス名.プロトコル.要素名 でパケットの各要素にアクセスできるようにした。 • 以下はARPの例 (これも普通じゃないパケットの状 態ですが。。。) 後ほどこのクラスの説明を少し
  25. 25. Netutils • ネットワークプログラミング関連の作業はすべてこ いつに任せよう。ネットワーク関連の処理以外はほ とんど高度(低レベル)なことしないのでこの部分だけ 完全にきりはなしました • 表面的には今のとこと出てこないので、ここの説明 は省略。 • 詳しくは http://libpgen.org/documentation/components/netut ils/ を参照 • もはや現在はネットワークユーティリティーな状態 でないので、近々名前変えよう
  26. 26. 完成したもの① • 機能を綺麗に分担できています。 • アドレスクラス、パケットクラス、Netutilsを 別々にインストールとかできたらいいかも
  27. 27. パケット送信はとりあえずできたし あとはたくさんのプロトコルに対応させていけばいい
  28. 28. パケット送信はとりあえずできたし あとはたくさんのプロトコルに対応させていけばいい それだけじゃ大して面白くないしつまらない よく考えたらscapyに勝る機能が何もない
  29. 29. 設計段階② • 既存のパケットのバイナリを読み込ませてパケット クラスにパース できるようにしよう • ならパケットの受信機能も簡単に実装するか • pcapファイル読み込みたい TDUCTFに参加させてもらった時に発案 pcapファイル読み込んで送ったり、受信した特定の パケットだけpcapファイルに保存したりとできたら かっちょいいかも • 送受信を行う上でやはりディスクリタみたいなのが あると便利
  30. 30. パケットをキャストする機能を 追加 • 以前までは パケットクラス-->バイナリ の一方向のみの変換だった • パケットクラスにcastメンバ 関数を追加して バイナリをパースして、パ ケットクラスの形に変換して、 解析を簡単にできるようにし た aabb ccdd eeff 0011 2233 4455 0806 0001 0800 0604 0001 0011 2233 4455 c0a8 0004 aabb ccdd eeff c0a8 0001 パケットクラス
  31. 31. cast関数の問題点 • 例えばARPパケットのバイナリをDHCPとしてcast しようとすると危険 → あらかじめパケットの種類を簡単に調べときたい • ついでにIPアドレスとかMACアドレスとかポート番 号とかで簡単に調べられる機能とかもあるといい
  32. 32. unknownパケット • unknown型のパケットって思ってください • isUDP とか isICMP とか L4までの基本情報をまとめて解析してくれる特別な パケットクラス • ポート番号とかでいろいろ絞り込めるようにしまし た。
  33. 33. unknownパケット • こんな感じにパケットがだいたいどんな感じのパケットか、 とか送信元とかが簡単に調べられる • ポート番号が53か? とかで調べたい時は bool res = インスタンス名.portis(53); とかで調べられる。
  34. 34. 簡易的なパケット受信機能 • sniff関数をNetutilsに追加 • void sniff(pgen_t*, (bool)(const u_char*, int)); • パケットを受信待機して受信し たら、コールバック関数を呼ぶ。 • まあこれはなにも工夫もないし デバッグしやすくするために追 加しただけ sniff 関数 recv packet!! コールバック関数 aabb ccdd eeff 0011 2233 4455 0806 0001 0800 0604 0001 0011 2233 4455 c0a8 0004 aabb ccdd eeff c0a8 0001 length is 42 bytes こっちでパケット解析とかをする
  35. 35. pcapファイルも読み込みたい • せっかくバイナリのパース機能 追加したならpcapファイルを読 み込んでそこからパケットを受 信したいってのが漢意気っても んよ • みんな大好きpcapファイル読め たらウケいいかも • pcapngにも今度対応させます ngに対応してるパケット解析 ツール 結構少ないから案外いいかも なんてことになるかもしれない….
  36. 36. pcapファイルも読み込みたい • ファイルポインタで基本どうり にファイル開いてパケットを書 き込む時はパケットの先頭に pcapパケットヘッダを追加する だけ • この機能が一番簡単に実装でき たからL2で送信する機能より先 に取りかかっとけば簡単だし作 業加速したかも magic  number major  version minor  version time  zorne sigfigs snaplen link  type pcap file header timestamp caplen len pcap packet header
  37. 37. pgenディスクリプタ使いたい • 今までのパケット送信部分はユーザがソケットを意識しなく てもいいようにうんこきもい実装になってた。 • 送受信を両方行うプログラムを書くならやっぱりを意識しな いといけない • pcapファイルに書き込んだり、ネットワークインター フェースから送信したりいろいろあるからまとめて管理でき るようにした
  38. 38. pgenディスクリプタ使いたい pgen ディスクリプタ pgen_open 関数 or pgen_open_offline関数 開きたい インタフェースや ファイル名など ディスクリプタの種類によって入出力先を指定できる 上の例ではtest.pcapへの書き込み専用モードで パケットはtest.pcapに書き込まれる
  39. 39. 完成したもの② • バイナリを解析して、パケットクラスで読み取れる ようになった • 受信したパケットを改変して別のインターフェース から送信することもできる • pcapファイルにパケットを書き込んだり、pcapファ イルひとつづつパケットを読み込んでcast関数で解 析できるようになった。 • pgen_tって感じでディスクリプタを使えるようにし た • この時点で簡単なルータとかブリッジなら即席で作 れます
  40. 40. libpgenで中間者攻撃 のツール作成 • せっかくある程度使える状態にしたので、取りあえ ず好きなARPで実験的なのしました。 • 超適当にはしょって作ったARPスプーフィングで MITMアタックするプログラムです • http://slankdev.net/blog/2015/08/30/libpgen-arp- mitm/ http://wp.me/p5YcBp-7N (短縮URL)
  41. 41. 設計段階④ 現在 • 他のOSに対応させたい • 拡張しやすくしたい • 全体が正しいい動作をするのか自動でチェックする 機能追加 • パケット解析ツールだしネットワーク以外のパケッ トも見たくね? 某鮫ツールはいろいろ読めるし
  42. 42. 他のOSに対応させたい • とりあえず一番の愛機がMBPなので、OSXに対応さ せました。 友達がMac使ってる人結構いるし、対応させたら 使ってもらえるし • OSXはBSD系なのでBSDに対応させるコードを追加 すればいいだけ • BSDはBPFってのでリンクレイヤープログラミング をすればいい • LinuxのPF_PACKETよりなんか分かりやすいから こっちの方が好きだったり
  43. 43. 他のOSに対応させたい • OS依存している関数のみを#ifdef __linuxとかで囲むだ け • あとはエンディアンに気をつけているかを全体的に チェックするだけ • 一番ひっかったのはインストール場所。(まだ調べて ない)OSXは/usr/local/includeとか/usr/includeにイン クルードパス張ってなくて(怒) xcode.appの中にあるヘッダとかからインクルードして る変態 • 知ってる人誰か教えて下さい ( > < )
  44. 44. 拡張しやすくしたい • 現在開発中です • ユーザが簡単にプロトコルの追加とかできるように したかった。 一人でこんな作業いつまでもやってらんない • プロトコル解析のコードはコアな部分から独立させ よう • チーム開発しやすいようにしたい
  45. 45. 全体が正しい動作をしてるか確 かめる • 対応させてるプロトコルが増えるとその分テストが大変に なるので、自動化したい • これも今実装中なんですけど、これがうまくいけばいろい ろ楽になる。 アドレスクラスは低機能だし、少ないからいいとして、 パケットクラスの動作チェックを自動化したい • 機能追加したり、リファクタリングしたりしたあと全体が うまく動くか 確かめていたけど、毎回やってたらきりがない。。 • どうやってうまく動いているか確認しよう。。 • 各コンポーネントごとにチェックしていった方が良さそう
  46. 46. 全体が正しい動作をしてるか確 かめる • パケットクラスでチェック が必要なのはバイナリ解析 部分と生成部分 • サンプルパケットを幾つか 読ませて、そこから再度バ イナリを生成して元のパ ケットとdiffをとる. • この処理はプロトコルごと に実装しなくていいので、 名案かな aabb ccdd eeff 0011 2233 4455 0806 0001 0800 0604 0001 0011 2233 4455 c0a8 0004 aabb ccdd eeff c0a8 0001 パケットクラス aabb ccdd eeff 0011 2233 4455 0806 0001 0800 0604 0001 0011 2533 4455 c0a8 0004 aabb ccdd eeff c0a8 0001 キャスト 再度バイナリ生成 ここが同じか 確かめる
  47. 47. ネットワーク以外のパケット • 開発初期と比べていろいろ拡張しやすくなってきた し、ネットワーク以外のパケットも操作できたらい いかも。 • USBとか、HDMIとかCTFの作問もできるかも • あくまで、いろいろな勉強のためにそういうことし てる段階なので、社会貢献できていない。 • USB機器とかのファジングツールとか将来的にでき たらタノシイカモネ
  48. 48. 完成したもの ④ (まだ途中で す) • 一応BSD用のコードを追加できた、うまく動いてい る? • 拡張しやすくする構造はwiresharkを参考にしました • まだ現在製作中です
  49. 49. まとめ、感想 ① • ソースを読経する力がすこーしだけついたかなって 感じです。 • 始めた時は/usr/include ? ナニソレオイシイノ だっ たので • デバッグ力も少し • プロトコルの知識もつきました • OSのプロトコル実装の手抜きとかも見れるのが楽し い BSDのARPとか、LinuxのICMPとか…
  50. 50. まとめ、感想 ② • だいたい日本一の学生でパケットに詳しい鮫アイコ ンの人がscapyの普及活動を行っている時点でこのま までは到底敵わないではないか! • scapyにない機能とかいろいろ追加したりいろいろ やっていつかscapyと比べられるくらいのパケット解 析ツールにしていきたいです • 開発に時間がかかりすぎてる。 • http://libpgen.org にドキュメントとかも書いておい ているので、一度見て文句などを言ってくれると元 気がでます。
  51. 51. まとめ、感想 ③ • チーム開発とかやったことないから友達見つけて ちょっとずつ協力してもらいたいと感じました • 社会貢献してない
  52. 52. libpgenについて • http://libpgen.org で詳細を説明してます。 各プロトコルのパケットクラスの資料がまだ完成し ていないのでもう少し待ってください。。
  53. 53. 最後に一言 • このライブラリは現在、一人で開発しているのです が、 セキュリティキャンプ講師の方、 2015年度全国大会 卒業生の方 をはじめ、 たくさんの方にアイディアや助言をいただいており ます。 本当にありがとうございます。 今後とも宜しくお願 いします。
  54. 54. aabb ccdd eeff 0011 2233 4455 0800 4500 2800 0001 0000 4006 b9a2 c0a8 b302 c0a8 6501 3039 3039 0000 0000 0000 0000 5001 2000 961c 0000
  55. 55. aabb ccdd eeff 0011 2233 4455 0800 4500 2800 0001 0000 4006 b9a2 c0a8 b302 c0a8 6501 3039 3039 0000 0000 0000 0000 5001 2000 961c 0000 ヒント
  56. 56. aabb ccdd eeff 0011 2233 4455 0800 4500 2800 0001 0000 4006 b9a2 c0a8 b302 c0a8 6501 3039 3039 0000 0000 0000 0000 5001 2000 961c 0000 TCP FIN パケットです. ありがとうございました

×