トップ «前の日記(2021-09-05) 最新 次の日記(2021-09-22)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2021-09-20

_ ネットワークプロトコルハッカーズガイド

アスキーの鈴木さんからもらったネットワークプロトコルハッカーズガイドを読了。途中間が空いたが久々に技術書を完読した。えらくおもしろかった。

本書は、題名からはネットワークプロトコルをハックするためのガイドに見える。が、実際のところカバーしている分野はネットワークプロトコルには限定されない。どうも筆者は各種脆弱性ハンターでIEや.NET Frameworkの脆弱性をばんばん見つけていた人らしい。筆者の偉業については「まえがき」でマイクロソフトセキュリティ部隊のメンバーだったらしいキャティ・ムースリ(良くわからないからフランス語読みしてみた)という人が書いていて、これも興味深い。

カバーしている分野が広範なのは、ネットワークプロトコルをハック(解析したり介入したり)するには、パケットの構造を調べ、個々のパートをぶつ切りし、送るデータを変えてみて、中間者を入れて暗号を復号して解析して再暗号化する必要があり、そのためには送り元のプログラムが何をしているか調べ、その動作に介入し、送り先のプログラムが何をしているか調べ、その動作に介入する必要があるからだ。

早い話がコンピュータソフトウェアのバイナリーレベルでのデバッグ技術が必要なのだ。

というわけで、本書はバイナリーハックの本なのだった。しかもガイドなので、これこれするにはこういう技術が必要で、そのためのツールはこれこれで、こんな使い方をする、という内容をすごい勢いで紹介していく。そのため完全に理解するには、常に本書には書かれていない「その先」が必要となる。

とはいえガイドなので、「こんな使い方をする」を実際に試してみて自分向きではないと思えば、後回しにすれば良い。最終的には、何か不可思議な障害が発生したときに当たりをつけたり、当たりをつけるための調査をするために必要な見取り図が頭の中にできるだろう。

Binary Hacks ―ハッカー秘伝のテクニック100選(高林 哲)

(バイナリーハックという点ではオライリーのバイナリーハックも抜群だが、こちらは15年前の本なのか。とはいえELFはELFだしバイナリーはバイナリーだが、DEPやメモリカナリなどの普及は現在ならではの気がする)

本書は付録を除くと10章を約300ページにまとめている。

各章は以下の内容を持つ。

第1章は、「ネットワーキングの基礎」という題で、レイヤ構造(さすがにOSIは出てこない(物理は層ではなく切り離しているし、セッションとプレゼンテーションは捨てているので4階層)のはTCP/IP時代では正しい)とパケットのカプセル化とルーティング(重要)について解説。

第2章は「アプリケーショントラフィックのキャプチャ」で、Wiresharkを使って、までは本書のタイトルからは当然だが、続いてstrace、DTraceを使ったシステムコールのキャプチャに移る。ここまでは受動的なキャプチャだが、さらに能動的なキャプチャとしてプロクシを使った介入に進む。おれが驚いたのは現在でもSOCKS(というプロクシのためのプロトコル)が生きていることだった。知らなかった。

2章では、DTrace用に.dスクリプトの例(動く)や、C#を使った簡単なプロクシのサンプル(動く)が出てくる。いずれも断片だったりするのだが、動作させるために必要な情報は含まれている。DNSサーバー(ターゲットをブラックボックスのままにして接続先を無理やり変えるために必要)についてはC#の動作するリストもある(たかだか15行)。

第3章は「ネットワープロトコルの構造」と脱字がある(誤字脱字などについては、本日記の最後にまとめる)のはともかくとしてパケットを構成するデータ型についての解説などになる。この章はすごくおもしろい。可変長にするための方法としてWASMと同様なMSB待ちのデータは、おれにとっては今年になって(WASMが先だったが)初めて知った方法だった(JavaのUCS-2エンコードがこれに近かったかな)。さらにテキスト系としてMIMEやBase64なども本章で説明される。

第4章は「アプリケーショントラフィックの高度なキャプチャ」で、冒頭の「本書の使い方」ではスキップして読むことになっている(ということは、本書は構造的に書かれているので、位置は第4章であるべきだが、内容の詳細度では別格ということになる)。2章の深堀りなので、DHCPをだましてDNSサーバーを入れ替えたりARPに毒を入れてキャプチャを仕掛けたノードをルータに見せかけたりする方法を説明する。

第5章は「ネットワークからのプロトコルの解析」。実験台用のC#で作ったチャットアプリケーションを素材として、パケットを受動キャプチャしてプロトコルを解釈したり(そのために、Wireshark用のクラックスクリプトをLuaで記述する例が出ている)仮説を検証するために、キャプチャしたバイナリデータをPythonスクリプトで検証する(ちょうど低レベルのユニットテストコードのように目検アサートさせる)。チェックサムらしきものが本当にチェックサムか計算させたりするところは抜群。最終的にC#でリアルタイムプロトコル解析用のプロクシを開発する。この章も抜群におもしろい。

第6章「アプリケーションのリバースエンジニアリング」では、一転、実際に動作しているクライアント、サーバーをハックするために、アセンブリの基礎(なぜかx86だが元の出版年代の2017だとわかりやすさ優先でおかしくもない)、ソースコードがどうバイナリとなるかの説明(そもそもインタプリタとはコンパイラとは、のような議論は当然しない)、実行ファイルの形式の簡単な説明(PEとELF。さすがにCOFFは無い)、介在するためにソケットの基礎、IDA Freewareを使った逆アセンブルの速習(操作方法や画面の読み方解説つき)などが続く。アセンブリが終わると、今度は.NETとJavaのVM言語のリバースエンジニアリングについての簡単な解説(ただしツールの使い方の説明は画面つきである)。そして参考資料へのポインタとなる。
これ以上くだくだしく書いてもしょうがないし、この先へ進みたい人間には必要十分な取っ掛かりとなる。

第7章が「ネットワークプロトコルのセキュリティ」として機密性、整合性、偽装耐性(サーバ、クライアントそれぞれ)についてPKIに至るまでの要素技術を解説する。内容に対してえらく説明が短いので、とにかく読んでいて頭を使う必要があって、これもまたおもしろい。あまりにおもしろいので、自分でパディングオラクル攻撃の実装をしてみた。要は、データ復元処理は次のように書けということだ(自分で書くのであれば)。

data_is_valid?(data)
  start = Time.now.to_f
  valid = false
  begin
    encrypted = decrypt(data)
    if encrypted
      valid = validate(encrypted)
    end
  rescue => e
  end
  waiting = 1.0 - (Time.now.to_f - start)
  if waiting > 0
    sleep(waiting)
  end
  valid # どこで失敗したかは応答には含めない。経過時間も常に一定以上(ここでは1秒)となるようにする。
end

第8章「ネットワークプロトコルの実装」では、ターゲットとなるトラフィックへの介在方法について解説する。キャプチャした実データをプロクシを使って改竄して送信したり、元のプログラムを再利用したりする。再利用といってもバイナリーハックの世界なので、.NETやJavaではリフレクションを駆使し、アンマネージドではPython+ctypesを使って元プログラムの関数呼び出しを再構成する(Rubyならばfiddleを使う)。この章も普通におもしろい。さらにTLSをごまかすための中間者攻撃の方法についても解説する。

第9章「脆弱性の根本原因」は白眉かも知れない。たった24ページだが、要はそういうことですな、という脆弱性のパターンを解説してある。アンマネージドでのスタックオーバーフローに始まりディレクトリトラバーサル(びっくりすることに2021年でも出てくる)、ユーザーの列挙(これはイントラネットとインターネットで作法を変えるべきやつだ。でイントラ流儀しか知らない人がちゃちゃを入れたりする)、SQLインジェクションまでの主な脆弱性のパターンについて疑似C言語(直接メモリをいじることができるのでCのはずだが、型や関数定義が微妙に簡略化されている)のコード片で説明している。

第10章「セキュリティの脆弱性の検知とエクスプロイト」は、9章の対となる章で、9章のようなバグを見つけるためのテスト方法、クラッシュしたプログラムの原因を探る方法と、プログラムのクラッシュを防ぐための最近のCPUとOSの仕組みについて解説する。ここで利用されるのは、GDB、CDB、LLDBの各バイナリデバッガー(主にGDB)。特に主眼となるのは、スタックとヒープ破壊によるエクスプロイトの解析で、デバッガの使い方とあわせて実に参考になる。そして、具体的にエクスプロイトがどう悪用されるのかの例として、送り込まれたアセンブリの断片を実行するためのCコードと各種システムコールを行う例をexit(DoS用)write(データ破壊)execve(Unixらしく自分で作らずにコマンドを組み合わせる)を呼び出すx64アセンブリ(ここではnasmを使う)の書き方(相対アドレスの求め方を含む)が解説される。で、DEPやメモリカナリ、ASLR(スタック上の変数位置を実行の都度変更する)といったCPUやOSが行う対抗措置について解説する。痺れるなぁ。

というわけで、網羅性、簡潔性、奥が深い(解説は広過ぎて浅いが、こればかりはどうしようもなく、よくも300ページでまとめたと感動すらする)の3拍子が揃ったすごい本だった。

ネットワークプロトコルハッカーズガイド キャプチャ、解析、エクスプロイトの理論と実践(James Forshaw)

_ ネットワークプロトコルハッカーズガイド(正誤)

おれが気づいた点。

P.25「もう少し創造力」→「もう少し想像力」

目次,P.41「ネットワープロトコルの構造」→「ネットワークプロトコルの構造」

P.47 3Fの「?」のフォントが妙過ぎる気が……

P.53 7ビットの可変長とされた16ビット分「0x80, 0x00」→「0x80, 0x01」(P.44ではそうなっている)

P.61 MIMEエンコードされたデータ。間違っているのではないが、text/plainのHello World!に対してHTML片とは考えなかったので長すぎるのでバグかと思った。(メールらしいのでOKなんだけど)

P.131 リスト5行目「inet_pton("0.0.0.0", ...)」→「inet_pton(AF_INET, "0.0.0.0", ...)」

P.187 「PFS(Perfect Forward Secrecy)」間違っているのではないがさすがにぶっきらぼうに過ぎるのでは……(本書の性格上、自分で調べられないなら読んでも意味ないだろ、という感じなのかも知れないが自分にとって初耳系はやはり気になる)

P.206 「.NETの型はJavaのクラスであり」→(これは一般語ではなく構文要素なので)「.NETのTypeに相当するのはJavaではClassであり」

P.213「中間者攻撃を積極的に仕掛けて」→(どうも気になる日本語。というのは対語となる「消極的に仕掛ける」というのがあり得ないからだ。activeの訳なのかな)「中間者攻撃を仕掛けて」で良いような。もしかすると2章の受動的/能動的キャプチャに類する能動的中間者のような用語なのかも知れない(原文みないとわからん)。

P.222 「ファジング」→ ボルドにするなら「ファジングについては10章で解説する」という脚注を入れたほうが良いのでは? ここでは何も説明されていない。

P.224 「をを」→「を」

p.242 「疑問符(?)は英数字に置き換えられる」→ うーん、ワイルドカードの意味なのだろうけど、意味が不明過ぎる。次ページに主な指定子が表で示されているから「?の部分はデータに合わせて置き換える(表 9.2参照)」かなぁ。

P.280 「最後のNUL」→「最後のNULL」

P.289 図10.11の← → は4バイト分のはずなのに右端2バイト分のみを指している。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|

ジェズイットを見習え