
pcapファイルからTsharkを使用してマルウェアのHTTPリクエストのユニークなフィンガープリントを生成し、リクエスト構造、ヘッダー、ペイロード特性の分析を通じてマルウェアファミリーの識別とグループ化を可能にします。
マルウェアのHTTPリクエストをフィンガープリントするためのツール。TsharkベースでPython3で記述されています。動作するプロトタイプ段階 :-)
その主な目的は、マルウェアリクエストのユニークな表現(フィンガープリント)を提供し、それらの識別を支援することです。_ユニーク_とは、各フィンガープリントが特定のマルウェアファミリーにのみ見られるべきであり、しかし一つのファミリーが複数のフィンガープリントを持つことができることを意味します。Hfingerはリクエスト全体を出力するよりも短い形式でリクエストを表現しますが、それでも人間が解釈可能です。
Hfingerは手動のマルウェア分析だけでなく、サンドボックスシステムやSIEMでも使用できます。生成されたフィンガープリントは、リクエストのグループ化、特定のマルウェアファミリーへのリクエストの特定、一つのファミリーの異なる操作の識別、または他のセキュリティシステムが見逃したがフィンガープリントを共有する未知の悪意のあるリクエストの発見に役立ちます。
このツールの作業には学術論文が付随しており、例えば設計選択の動機や、p0f、FATT、Mercuryとの比較評価について説明しています。
このプロジェクトの基本的な前提は、異なるマルウェアファミリーのHTTPリクエストは多かれ少なかれユニークであり、何らかの識別を提供するためにフィンガープリントできるというものです。Hfingerはいくつかのヘッダーの構造と値を保持し、さらなる分析(例えば、類似したリクエストのグループ化)の手段を提供します。現時点ではまだ進行中です。
マルウェアのHTTPリクエストとヘッダーを分析した後、リクエストのいくつかの部分が最も特徴的であると特定しました。これらには以下が含まれます:
さらに、リクエストURLの標準的な特徴も考慮されました。 これらの部分はすべて一連の特徴に変換され、詳しくはこちらで説明されています。
上記の特徴は可変長の表現に変換され、それが実際のフィンガープリントとなります。レポートモードに応じて、異なる特徴がリクエストのフィンガープリントに使用されます。これらのモードの詳細については以下に示します。特徴選択プロセスは、今後発表される学術論文で説明される予定です。
インストール前に必要な最小要件:
Python >= 3.3、Tshark >= 2.2.0。PyPIからのインストールが可能です:
pip install hfinger
HfingerはXubuntu 22.04 LTSでtsharkパッケージバージョン3.6.2でテストされていますが、Xubuntu 18.04のバージョン2.6.10やXubuntu 20.04のバージョン3.2.3などの古いバージョンでも動作するはずです。
あらゆるPoCと同様に、Hfingerは分離された環境(少なくともPython仮想環境)で実行する必要があることに注意してください。その設定についてはここでは扱いませんが、このチュートリアルを試すことができます。
インストール後、コマンドラインから直接hfingerを呼び出すか、Pythonモジュールとしてpython -m hfingerで呼び出すことができます。
例:
foo@bar:~$ hfinger -f /tmp/test.pcap
[{"epoch_time": "1614098832.205385000", "ip_src": "127.0.0.1", "ip_dst": "127.0.0.1", "port_src": "53664", "port_dst": "8080", "fingerprint": "2|3|1|php|0.6|PO|1|us-ag,ac,ac-en,ho,co,co-ty,co-le|us-ag:f452d7a9/ac:as-as/ac-en:id/co:Ke-Al/co-ty:te-pl|A|4|1.4"}]
ヘルプは短い-hまたは長い--helpスイッチで表示できます:
usage: hfinger [-h] (-f FILE | -d DIR) [-o output_path] [-m {0,1,2,3,4}] [-v]
[-l LOGFILE]
Hfinger - pcapファイルに保存されたマルウェアHTTPリクエストのフィンガープリンティング
optional arguments:
-h, --help このヘルプメッセージを表示して終了
-f FILE, --file FILE 単一のpcapファイルを読み込む
-d DIR, --directory DIR
ディレクトリDIRからpcapファイルを読み込む
-o output_path, --output-path output_path
出力ディレクトリへのパス
-m {0,1,2,3,4}, --mode {0,1,2,3,4}
フィンガープリントレポートモード。
0 - モード2と同程度の衝突数とフィンガープリント数だが、使用する特徴が少ない。
1 - 設計された全特徴を表現するが、モード0、2、4よりも若干衝突が多い。
2 - 最適(デフォルトモード)。
3 - 生成されるフィンガープリント数が最も少ないが、衝突数が最も多い。
4 - フィンガープリントのエントロピーが最も高いが、モード0-2よりも若干多くのフィンガープリントを生成する。
-v, --verbose リクエスト内の非標準値(例:非ASCII文字、CRLFタグなし、設定リストにない値)に関する情報を報告する。
--logfile (-l) なしの場合は標準エラー出力に表示。
-l LOGFILE, --logfile LOGFILE
詳細モードでの出力ログファイル。 -v または --verbose スイッチを暗黙的に有効化。
pcapファイルへのパス(-f)、またはpcapファイルを含むディレクトリ(-d)を指定する必要があります。出力はJSON形式です。標準出力に表示されるか、指定した出力ディレクトリ(-o)にソースファイルの名前で保存されます。例えば、コマンド:
hfinger -f example.pcap -o /tmp/pcap
の出力は次の場所に保存されます:
/tmp/pcap/example.pcap.json
レポートモード -m/--mode を使用すると、デフォルトのレポートモードを変更できます。0〜4の整数を指定します。モードは表現されるリクエスト特徴や丸めモードが異なります。デフォルトモード(2)は、リクエスト分析で通常使用されるすべての特徴を表現するように選択されましたが、衝突数や生成されるフィンガープリント数も少なくなっています。他のモードでは異なる目標を達成できます。例えば、モード3では、生成されるフィンガープリント数は少なくなりますが、マルウェアファミリー間の衝突の可能性が高くなります。不明な場合は、何も変更する必要はありません。レポートモードの詳細はこちらを参照してください。
バージョン0.2.1以降、Hfingerの出力は控えめになりました。検出されたヘッダーの非標準値、リクエストの非ペイロード部分の非ASCII文字、CRLFタグ(\r\n\r\n)の欠如、分析されたリクエストに関するその他のアプリケーションエラーでない問題についての情報を受け取りたい場合は、-v/--verboseを使用してください。詳細モードでこれらの問題が発生した場合、標準エラー出力に表示されます。-l/--logスイッチを使用してログを指定した場所に保存することもできます(暗黙的に-v/--verboseを有効化)。ログデータはログファイルに追記されます。
バージョン0.2.0以降、Hfingerは他のPythonアプリケーションへのインポートをサポートしています。アプリケーションで使用するには、hfinger.analysisからhfinger_analyze関数をインポートし、pcapファイルのパスとレポートモードを指定して呼び出します。返される結果は、フィンガープリント結果を含むdictのリストです。
例:
from hfinger.analysis import hfinger_analyze
pcap_path = "ここにPCAPパスを指定"
reporting_mode = 4
print(hfinger_analyze(pcap_path, reporting_mode))
バージョン0.2.1以降、Hfingerは検出されたヘッダーの非標準値、リクエストの非ペイロード部分の非ASCII文字、CRLFタグ(\r\n\r\n)の欠如、分析されたリクエストに関するその他のアプリケーションエラーでない問題についての情報をログに記録するためにloggingモジュールを使用しています。Hfingerはhfingerという名前の独自のロガーを作成しますが、事前に設定しない限り、ログ情報は実質的に破棄されます。このログ情報を受け取りたい場合は、hfinger_analyzeを呼び出す前にhfingerロガーを設定し、ログレベルをlogging.INFOに設定し、必要に応じてログハンドラーを設定してロガーに追加してください。詳細はhfinger_analyze関数のdocstringにあります。
フィンガープリントはリクエストから抽出された特徴に基づいています。完全なリストからの特定の特徴の使用は、事前定義されたリストから選択されたレポートモードに依存します(レポートモードの詳細はこちら)。以下の図は、デフォルトのレポートモードにおける例示的なフィンガープリントの生成を示しています。

リクエストの3つの部分(URI、ヘッダー構造(メソッドとプロトコルバージョンを含む)、ペイロード)が分析され、情報が抽出されます。フィンガープリントの各特徴は|(パイプ)で区切られます。例のPOSTリクエストから生成された最終的なフィンガープリントは次のとおりです。
2|3|1|php|0.6|PO|1|us-ag,ac,ac-en,ho,co,co-ty,co-le|us-ag:f452d7a9/ac:as-as/ac-en:id/co:Ke-Al/co-ty:te-pl|A|4|1.4
特徴の生成について、フィンガープリントに出現する順に以下で説明します。
まず、URIの特徴が抽出されます:
log10(43)≈2)log10(20/3)≈1)hfinger/configs/extensions.txtの既知の拡張子リストにある場合のみ。log10(4)≈0.6)次に、ヘッダー構造の特徴が分析されます:
PO)1、バージョン1.0は0、バージョン0.9は9)リクエスト内のヘッダーの順序を表現するために、各ヘッダー名はhfinger/configs/headerslow.jsonのスキーマに従ってエンコードされます。例えば、User-Agentヘッダーはus-agとエンコードされます。エンコードされた名前は,で区切られます。ヘッダー名が大文字で始まらない場合(または複合ヘッダー(Accept-Encodingなど)の一部が大文字で始まらない場合)、エンコードされた表現の前に!が付加されます。ヘッダー名が既知のヘッダーのリストにない場合は、FNV1aハッシュを使用してハッシュ化され、そのハッシュがエンコードとして使用されます。
一般的なヘッダーを分析する際、リクエストにそれらが出現するかどうかがチェックされます。これらのヘッダーは以下のとおりです:
リクエスト内でヘッダーが見つかった場合、その値は典型的な値のテーブルと照合され、ヘッダー名表現:値表現のペアが作成されます。ヘッダー名は前述のhfinger/configs/headerslow.jsonのスキーマに従ってエンコードされ、値はヘッダーに応じてhfinger/configsディレクトリまたはconfigs.pyファイルに保存されたスキーマに従ってエンコードされます。上記の例では、Acceptはacとエンコードされ、その値*/*はas-as(asterisk-asterisk)とエンコードされ、ac:as-asとなります。ペアはリクエスト内の出現順にフィンガープリントに挿入され、/で区切られます。ヘッダー値がエンコードテーブルにない場合は、FNV1aハッシュを使用してハッシュ化されます。ヘッダー値が複数の値で構成されている場合、トークン化されて,で区切られた値のリストが提供されます。例えば、Accept: */*, text/*はac:as-as,te-asとなります。ただし、開発の現時点では、ヘッダー値に「品質値」タグ(q=)が含まれている場合、値全体がFNV1aハッシュでエンコードされます。最後に、およびヘッダーの値は、直接FNV1aハッシュでエンコードされます。
最後に、ペイロードの特徴:
Nで表され、それ以外の場合はAHfingerは5つのレポートモードで動作し、フィンガープリントに表現される特徴(つまりリクエストから抽出される情報)が異なります。これらは以下のとおりです(ツール設定で使用される番号とともに):
0 - モード2と同程度の衝突数とフィンガープリント数だが、使用する特徴が少ない。1 - 設計された全特徴を表現するが、モード0、2、4よりも若干衝突が多い。2 - 最適(デフォルトモード)。リクエスト分析で通常使用されるすべての特徴を表現するが、衝突数と生成されるフィンガープリント数も少ない。3 - 全モードの中で最も少ないフィンガープリント数を生成するが、最も多くの衝突を達成する。4 - 最も高いフィンガープリントエントロピーを提供するが、モード0-2よりも若干多くのフィンガープリントを生成する。これらのモードは、マルウェアファミリーを一意に識別するHfingerの能力と生成されるフィンガープリント数とのバランスを最適化するために選択されました。モード0、2、4はマルウェアファミリー間の衝突数が同程度ですが、モード4は他の2つよりも若干多くのフィンガープリントを生成します。モード2はモード0よりも多くのリクエスト特徴を表現し、生成されるフィンガープリント数と衝突数は同程度です。モード1は設計された全特徴を表現する唯一のモードですが、衝突数がモード0、1、4と比較して約2倍に増加します。モード3は他のモードよりも少なくとも2倍少ないフィンガープリントを生成しますが、約9倍多くの衝突を引き起こします。設計された全特徴の説明はこちらです。
モードは(フィンガープリントに出現する順に)以下の特徴で構成されます:
0:
1:
2:
3:
4:
