
単純で簡単かつステルスな方法で、複数のクラスのセキュリティ製品をバイパスしたいと思ったことはありませんか? pstf^2(pstf-squareと発音)は、パッシブなブラウザフィンガープリンティングが可能なHTTPサーバーの実装です。そして、それはまさにあなたが探しているものかもしれません。 攻撃者がインターネット経由でペイロードを配信しようとする場合、受信リンクをスキャンできる複数のツールを克服する必要があります。メールフィルター、スキャンエンジン、さらにはURL経由のサンドボックスへの提出も、pstf^2がそれらを受動的に検出することでバイパス可能です。一度検出されると、このツールはセキュリティサービスと潜在的な被害者を区別し、悪意のあるレスポンスまたは良性のレスポンスを配信することができます。
このツールはBlackHat EU 2020でリリースされました: https://www.blackhat.com/eu-20/arsenal/schedule/#pstf2-link-scanners-evasion-made-easy-21763
研究の詳細はこちらのブログ記事でご覧いただけます: https://blogs.akamai.com/sitr/2020/12/evading-link-scanning-security-services-with-passive-fingerprinting.html
本当の疑問は – リンクスキャナーはどのように動作するのか? 悪意のあるリンクを検査する行為は、WebクライアントがHTTP GETリクエストを送信することを伴います。各ベンダーは異なる独自実装を使用しており、ほとんどが実際のユーザー操作をある程度模倣しようとしています。 pstf^2は、シンプルなPythonベースのHTTPサーバーで、既知のボット検出戦術を適用して、受信リクエストが自動化されたセキュリティツールからのものかどうかを判断します。 サーバーオペレーターはレスポンスをカスタマイズできます。例えば、スキャナーが検出された場合はGoogleにリダイレクトし、それ以外の場合は悪意のあるコンテンツを送信します。
以下は、pstf^2で実装された主な戦術です:
セキュリティツールは、正当なクライアントを装い、実際のブラウザを偽装しようとしますが、多くの場合そうではありません。 適切にメンテナンスされていないツールが、10年前のブラウザバージョン用の偽のUser-Agentヘッダーを使用するのはよく見られます。 pstf^2では、非旧式の本物のバージョンと見なす最小閾値を設定できます。
ツールが検出可能な、さまざまな種類の奇妙な実装があります。 BlackHatトークで紹介されたいくつかの例は以下の通りです:
via: ヘッダーを残してしまい、サンドボックスに使用された仮想ホストの性質が明らかになった。referer: ヘッダーが、リンクがGoogleから到達したことを示唆していた。例:referer: google.com/search?q=specific.site.com。
テストしたシナリオでは、これは全く意味をなしませんでした。なぜなら、この製品はメールをスキャンしており、誰かが(Webインターフェースではなく)メール内のリンクをクリックした場合、このヘッダーは存在しないからです。複数のTCPパラメータは、特定のOSバージョンや特定の種類を示唆する可能性があります。一部のクライアントはUser-Agentヘッダーを偽装していますが、宣言されたものとは異なるOS上で動作しています。
特定のクラウドプロバイダーのネットワーク上でホストされているクライアントは、標準の1500バイトとは異なるMTUを持っています。
場合によっては、リクエストは特定のセキュリティベンダーに明確に関連付けられたASNから送信されます。その他の場合、リクエストの発信元はクラウドホスティングプロバイダーであり、特定のベンダーを非難するものではありませんが、典型的なユーザーである可能性は低いです。
まれに、クライアントのIPアドレスにPTRレコードがあり、セキュリティベンダーに関連するURLと結びついていることがあります。
Dockerが既にインストールされていることを前提とすると、以下のように簡単です:
docker-compose up
Dockerを避けたい場合は、以下の手順に従ってください。
以下を実行:
pip install requirements.txt
これにより、必要な外部Pythonモジュールがインストールされます。
pstf^2をデプロイする前に、p0fをダウンロードしてインストールしてください。現在は以下から入手可能です:
https://lcamtuf.coredump.cx/p0f3/
次に、lib/servers/server_config.yml を適切に構成し、正しいパスを指定します。例:
p0f_config:
# 少なくともユーザー名は変更してください。両方のパスで変更することを忘れずに。
p0f_bin_path: '/Users/$your_user_name/$more_folders/web_fp/p0f-3.09b/p0f'
p0f_fp_path: '/Users/$your_user_name/$more_folders/web_fp/p0f-3.09b/p0f.fp'
iface: 'lo0'
p0f_named_socket: '/tmp/p0f_socket'
また、ifaceがPython HTTPサーバーを実行しているインターフェースと同じであることを確認してください。上記の例ではループバックインターフェースです。
要件が満たされたら、以下を実行:
python driver.py
以下のフラグのいずれかを使用できます:
--p0f_bin_path P0F_BIN_PATH
--p0f_fp_path P0F_FP_PATH
--p0f_iface P0F_IFACE
これらはすべて、p0fに関連するパラメータを調整するために使用されます:バイナリ自体、フィンガープリントファイル、およびデフォルトでeth0に設定されているインターフェースです。
次のような出力が表示されるはずです:
2020-04-15 17:37:06,896 - pstf2_logger - INFO - Starting p0f...
2020-04-15 17:37:06,896 - pstf2_logger - INFO - Running command:
/Users/gbitensk/work/web_fp/p0f-3.09b/p0f -i lo0 -s /tmp/p0f_socket -f /Users/gbitensk/work/web_fp/p0f-3.09b/p0f.fp
2020-04-15 17:37:06,898 - pstf2_logger - INFO - p0f started!
2020-04-15 17:37:06,898 - pstf2_logger - INFO - Starting HTTP server...
2020-04-15 17:37:06,898 - pstf2_logger - INFO - HTTP server started!
2020-04-15 17:37:06,899 - pstf2_logger - INFO - If you wish to terminate the server press CTRL+C
サーバーを終了するにはCtrl+Cを押します。これによりHTTPとp0fの両方のインスタンスが強制終了されます。 次のような出力が表示されるはずです:
2020-04-15 17:37:48,263 - pstf2_logger - INFO - HTTP server stopped!
2020-04-15 17:37:48,263 - pstf2_logger - INFO - Killing p0f...
2020-04-15 17:37:48,263 - pstf2_logger - INFO - p0f killed!
2020-04-15 17:37:48,263 - pstf2_logger - INFO - exiting...
DNSレコードを設定してURLをサーバーに向けることはpstf^2の範囲外であり、自己責任で行ってください。
pstf^2にはserver_config.yml内で定義されたデフォルトのペイロードがあり、簡単にカスタマイズできます。
rickroll_mode変数をYESまたはNOに変更することで切り替えられる2つのモードがあります。
有効にすると、セキュリティツールは有名なRickrolling動画のYouTubeページにリダイレクトされ、それ以外の場合は同じYAMLファイルで定義された文字列を提供します。
デフォルトでは、「悪意のある」レスポンスはEICAR標準テスト文字列に設定されています。
私はこのツールをオープンソースプロジェクトとして公開することを選択しました。理由は以下の通りです:
このツールの構築の一環として、15の異なる製品に対してテストが行われましたが、すべてが失敗しました。攻撃の詳細については責任を持って開示しましたが、まだ長い道のりがあり、このツールを公開することで、すでに「悪意のある関係者」によって悪用されているこれらの戦術に対する認識が高まることを期待しています。
@Den1al – このツールの構築全般、Pythonを適切に書くためのアドバイス、およびDockerイメージ作成の支援を提供してくれました。