
Sniffles: IDSと正規表現評価のためのパケットキャプチャジェネレーター
Snifflesは、不正行動検出のために固定パターンや正規表現を使用するIDSをテストするためのパケットキャプチャを作成するツールです。Snifflesは非常にシンプルに動作します。正規表現またはルールのセットを受け取り、ランダムに1つの正規表現またはルールを選択します。次に、そのルールまたは正規表現に基づいてコンテンツを生成します。固定文字列の場合、これはデータに直接文字列を追加することを意味します(Snortルールに従ってオフセットやその他のオプションを使用する可能性があります)。正規表現の場合、プロセスはより複雑です。正規表現はNFAに変換され、NFAを通るランダムな経路(開始から終了まで)が選択されます。結果のデータは正規表現に一致します。最後に、Snifflesは完全一致または部分一致に設定できます。完全一致の場合、パケットデータは少なくとも1つのルールまたは正規表現に絶対に一致します(ただし、一部のSnortオプションは完全には考慮されません)。部分一致の場合、一致する文字シーケンスから最後の文字を消去し、一致すべきでないシーケンスにします(ただし、別のルールに一致する可能性があります)。一致するルールはIDSに最大の負荷をかけるはずです。したがって、IDSが最悪のトラフィックをどの程度処理できるかを判断することが可能です。部分一致のトラフィックは、一致するトラフィックとほぼ同じ負荷をかけます。最後に、Snifflesは完全にランダムなデータを持つトラフィックも生成できます。そのようなランダムデータは、ランダムデータがルールに一致する可能性が非常に低いため、最良のシナリオを提供します。したがって、最大速度で処理できます。このように、SnifflesはIDSのディープパケットインスペクションの最良および最悪の動作に対するパケットキャプチャの作成を可能にします。
上記に加えて、Snifflesには評価用パケットキャプチャを作成する機能もあります。評価用パケットキャプチャには2つのタイプがあります。最初の評価用パケットキャプチャは、各ルールまたは正規表現に対して1つのパケットを順に作成します。したがって、各ルールが期待どおりに一致することをテストして確認することができます。完全評価はさらに一歩進んで、正規表現内のすべての可能な分岐に対してパケットを作成します。単一の正規表現には数千の可能な分岐がある可能性があります。これにより、正規表現のすべての可能な分岐が適切に処理されることをテストします。評価用パケットキャプチャはすべてのパケットに一致する必要があります。一致しないパケットは、ほとんどの場合IDSの障害を表し、さらなる調査が必要です。もちろん、Snifflesが特定のIDSに対して正しいパケットを作成していないか、ルールの特定のオプションを認識していない可能性も常にあります。サポートされているルール機能の詳細については、そちらを確認してください。
最後に、Snifflesはランダムなネットワークトラフィックを生成するために多くのことができます。デフォルトでは、ランダムトラフィックはTCP、UDP、またはICMPで、単方向です。ただし、ACK、ハンドシェイク、および各ストリームの終了処理を含むTCPトラフィックも生成できます。正しいシーケンス番号とチェックサムを生成します。さらに、MACアドレスは希望の分布に従って設定でき、IPネットワークアドレスはホームおよび外部アドレス空間で定義できます。また、トラフィックキャプチャ内にスキャンをシミュレートすることも可能です。
必要条件:Python 3.3以上およびSortedContainersモジュール
Snifflesは以下のファイルで構成されています:
インストールするには:
python3.x setup.py install と入力します。インストールノート:
python3.x setup.py build を使用し、ライブラリディレクトリに移動してlibを見つけ、python3.4 -c "from sniffles import sniffles; sniffles.main()" を使用してローカルで実行します。Snort:Snortアラートルール(ルールはAlertディレクティブで始まる必要があります)。コンテンツタグは認識され、正しく解析されます。PCREタグも同様に正しく解析されます。HTTPタグは連続して処理されるため、意図したパケットが作成されない可能性があります。コンテンツ(およびPCREまたはHTTPコンテンツ)は、distance、within、offsetによって変更できます。ルールはフロー制御オプションを使用できますが、データの方向のみがこれから派生します。nocaseオプションは無視され、提示された大文字小文字が使用されます。他のすべてのオプションは無視されます。ヘッダー値は解析され、これらの値に一致するパケットが生成されます。ホームおよび外部ネットワークアドレス空間が使用される場合、それぞれ$HOME_NETおよび$EXTERNAL_NET変数に正しい空間が使用されます。例:
alert tcp $EXTERNAL_NET any -> $HOME_NET 8080 (msg:"SERVER-APACHE Apache Tomcat UNIX platform directory traversal"; flow:to_server; content:"/..|5C|/"; content:"/..|5C|/"; http_raw_uri;
正規表現:生の正規表現を1行に1つ、abcまたは/abc/iとして記述します。現在、オプションi、s、mをサポートしています。その他のオプションは無視されます。例:
/ab*c(d|e)f/i
Snifflesルールフォーマット(後述)。
-a TCP Ack:送信されるデータパケットごとにTCP確認応答を送信します。デフォルトではオフです。確認応答パケットにはデフォルトでデータがありません。
-b 双方向データ:データはTCPストリームの両方向で生成されます。ACKがオンになります。この機能はデフォルトでオフです。
-B [バックグラウンドトラフィックプロトコル:パーセンテージ]:1から100の間の値を持つ少なくとも1つのプロトコルを設定して、バックグラウンドトラフィックを生成します。この値はトラフィック全体のパーセンテージを表します。利用可能なプロトコル:FTP、HTTP、IMAP、POP、SMTP。例:"http:20,ftp:30,smtp:10"。引数値として1つの数値のみを入力すると、ランダムにトラフィックが生成されます。例:"80"。
-c カウント:作成するストリームの数。各ストリームには最低1つのパケットが含まれます。パケットはルールによって定義されるか、ランダムに選択された2つのエンドポイント間で送信されます。tcp_handshake、tcp_teardown、packets_per_streamはストリームあたりのパケット数を増やします。現在、ストリーム内のデータは一方向のみに流れます。-bオプションを使用すると、データは両方向に流れるはずです。また、Snifflesルールはデータが両方向に流れるように指定できます。
-C 同時フロー:一度に開かれるフローの数。ベストエフォート方式で、指定された同時フロー数よりフローが少ない場合、現在のすべてのフローが使用されます。たとえば、残りフローが1000しかないが、同時フロー数が10000に設定されている場合、その時点では1000フローのみが書き出されます。デフォルト値は1000です。期間と一緒に使用すると、-Cフローは期間全体にわたって維持され、最終的に-cからの入力を無視します。この目的は、同じフローからのパケットが隣り合うのではなく分散された、多様なpcapを作成し、多数の同時フローの錯覚を作り出すことです。私たちのテストでは、メモリが問題になる前に最大200〜300万の同時フローを管理しました。また、ストリーム間のレイテンシの違いにより、一部のフローが他のフローより早く終了する可能性があることに言及しておきます。
-d ルールディレクトリ:ルールファイルを含むディレクトリへのパス。ディレクトリ内のすべてのルールファイルの有効なルールを読み取ります。すべてのルールは拡張子.rulesで終わると仮定します。このオプションまたは-fを使用しますが、両方は使用できません。#記号はルールを非アクティブ化(つまりコメントアウト)するために使用されます。
-D 期間:カウントではなく期間に基づいて生成します。期間は秒単位です。パケット間のデフォルトのレイテンシは平均1〜200マイクロ秒であることに注意してください。低レイテンシの場合、期間が長いと数百万のパケットが発生し、構築に長時間かかる可能性があります。また、期間はベストエフォートです。基本的に、期間が経過した後に新しいストリームは作成されませんが、まだ完了していないストリームがある可能性があります。これらは依然として書き出されるため、実際の期間は指定されたものより長くなる可能性がありますが、短くなることはありません。最後に、生成中に作成されるストリームを減らしたい場合は、より大きなレイテンシを設定してください。
-e eval:ルールセット内の各ルールに対して1つのパケットのみを作成します。-fを除く他のすべての入力を無視します。各パケットには選択されたルールに一致するコンテンツが含まれます。
-E 完全評価:ルールセット内のpcreルールの各実行可能なパスに対して1つのパケットを作成します。つまり、ab(c|d)eはabceとabdeの2つのパケットを作成します。-fを除く他のすべての入力を無視します。
-f ルールファイル:指定されたパスとファイル名に従って単一のルールファイルを読み取ります。
-F 設定:Snifflesオプションの設定ファイルを指定します。設定ファイルは、Snifflesの実行に使用されるパラメータを固定する方法です。
-g タイムスタンプ:pcapタイムスタンプの開始時刻を設定します。これは1969年12月31日からの秒数です。デフォルトは現在の時刻です。
-h IPホームプレフィックス:IPホームネットワークプレフィックスのリスト。内部アドレスからのIPアドレスはこれらのプレフィックスを使用します。プレフィックスは、xxx.xxx形式で4バイトIPv4アドレス全体を指定できます。例:"10.192.168,172.16"。
-H IPv6ホームプレフィックス:IPv4ホームプレフィックスと同じですが、IPv6用です。特記事項として、セパレータはコロンで、コロン間に2バイトが表されます。
-i IPv6パーセンテージ:この値を1から100の間に設定して、IPv6でパケットを生成します。これにより、IPv6になるストリームのパーセンテージが決まります。
-I スキャン攻撃の強度(パケット/秒)。
-l コンテンツ長:コンテンツの長さを指定されたバイト数に固定します。1未満の場合、長さはnfaによって生成されたコンテンツと等しいか、ヘッダーもランダムの場合は10〜1410の間のランダムな数になります。必要に応じてパケットを切り詰めたり埋めたりします。
-L レイテンシ:平均レイテンシ(マイクロ秒単位)。設定されていない場合、各ストリームに対して1〜200 usecの間のランダムな平均レイテンシが決定されます。したがって、特定のストリームのパケットは、フロー内の各パケット間に平均レイテンシの時間がかかります。
-M カスタムMACアドレスをトラフィックに使用するためにMAC分布を使用できるようにします。デフォルトでは、MACアドレスはランダムに生成されます。MAC定義ファイルの詳細については、examples/mac_definition_file.txtを参照してください。注意:ソースMACまたは宛先MACに応じて異なる値を設定するために、最大2つのMAC定義ファイルを指定できます。1つのファイルのみを指定した場合、どちらの方向にも使用されます。以下の表記を使用すると、特定の方向を指定できます。例:'path1:path2'。path1はソースMACのMAC定義ファイル、path2は宛先MACのMAC定義ファイルになります。疑問符(?)を使用して、一方をランダムに指定することもできます。例:'?:path2'はソースMACをランダムにし、ファイルを宛先MACに使用します。
-n 完全一致しない:ルールから生成されたコンテンツを完全に一致させないように設定します(つまり、自動的に最後の数文字を切り詰めます)。デフォルトの動作はルールコンテンツに完全に一致することです。
-o 出力ファイル:出力ファイルの名前を指定します。デフォルトでは、ファイル名はsniffles.pcapです。
-O オフセット:スキャン攻撃を開始する前のオフセット。また、トラフィックに複数のスキャンを挿入するときにも使用されます。これはスキャンが開始するまでの秒数です。-Rと一緒に使用すると、開始までの平均秒数になります。
-p ストリームあたりのパケット数:単一のストリームのコンテンツを含むパケットの数を指定します。引数として正の値が指定された場合、各ストリームに正確にx個(xは指定された整数)のコンテンツを含むパケットが表示されます。xが負の場合、各ストリームにランダムな数のパケット(1からabs(x)まで)が表示されます。デフォルトでは、この値は1です。
-P ターゲットポートリスト:スキャン攻撃用。カンマ区切りの可能なポートのリスト、または単一の開始ポートを指定します。それ以外の場合、ポートはランダムにスキャンされます。単一の開始ポートが指定された場合、ポートはそのポイントから65535まで順にスキャンされ、その後開始ポイントに戻ります。リストが指定された場合、リスト内のポートがラウンドロビンでスキャンされます。
-r ランダム:ルールからではなくランダムなコンテンツを生成します。それでもルールが提供されている場合、ルールはヘッダーの生成に使用されます。注意:ルール内の多くの機能がランダム生成の特定の側面を上書きする可能性があります。
-R ランダムスキャン攻撃:オフセットを使用してトラフィックにスキャン攻撃を作成しますが、オフセットは中央値としてのみ使用されます。オフセットは、スキャンが終了してから新しいスキャンが開始するまでの時間を決定するために使用されます。
-s スキャン攻撃:ターゲットとするIPv4アドレスのカンマ区切りリストが続きます。各IP範囲は1つのスキャン攻撃を作成します。範囲は192.168.1.1のように指定すると、その1つのIPアドレスを正確にターゲットにし、192.168.1のように指定すると、192.168.1.0から192.168.1.255の間のランダムなIPアドレスをターゲットにします。
-S スキャンタイプ:1==Synスキャン(デフォルト)、2==コネクションスキャン。
-t TCPハンドシェイク:すべてのTCPストリームにTCPハンドシェイクを含めます。デフォルトではオフです。
-T TCPティアダウン:すべてのTCPストリームにTCPティアダウンを含めます。デフォルトではオフです。
-v 冗長性:出力メッセージのレベルを上げます。
-w コンテンツ書き込み:コンテンツ文字列を'all.re'というファイルに書き込みます。
-W ウィンドウ:スキャン攻撃のウィンドウ(秒単位の期間)。
-Z 応答確率:スキャンが応答を持つ確率。つまり、ターゲットポートが開いている確率(デフォルト20%)。
注意:すべての例は、snifflesパッケージがインストールされていることを前提としています。
単一の正規表現ファイルから、すべてのパケットがルールに一致する10ストリームのpcapを生成するには