
ペネトレーションテスターがおいしいキャンディを見つけるためのツール、by @l0ss および @Sh3r4 ( Twitter: @/mikeloss および @/sh3r4_hax )

Snafflerはペネトレーションテスターやレッドチーム向けのツールで、膨大で退屈な干し草の山(巨大なWindows/AD環境)の中からおいしいキャンディの針(主に認証情報ですが、柔軟に使えます)を見つけるのに役立ちます。
他の目的で使う人にも便利かもしれませんが、これは明示的に「監査」ツールとして設計されたものではありません。
はあ、わかったよ。でも結果については責任取らないからな。俺たちはお前のためにこれら全部を書いたんだが、まあいい。怒ってないよ、ただがっかりしてるだけだ。
snaffler.exe -s -o snaffler.log
大雑把に言えば - Active DirectoryからWindowsコンピュータのリストを取得し、それらすべてにSnafflerの触手を伸ばして、どのコンピュータがファイル共有を持っていて、それを読み取れるかを調べます。
そしてさらに触手を伸ばして、それらの共有内の全ファイルを列挙し、機械のための学習された人工的知能(LEARNED ARTIFACTUAL INTELLIGENCE for MACHINES)を使って、あなたのような汚いハッカーが欲しがるファイルを特定します。
実際には機械学習なんて何もしていません。なぜなら、それを正しくやるには学習データが必要で、それには膨大な時間がかかるからです。その代わり、すべてのまともな「ML」プロジェクトと同様に、大量のif文と正規表現を使っているだけです。
こんな感じです!
もし「ドメイン参加済みのマシンで、ドメインユーザーのコンテキストでEXEをそのまま実行するだけ」(Grouper2で人々に指示された通りに、verbose/debugスイッチを全部オンにして実行し、何百メガバイトものスタックトレースを吐き出させた直後に)なら、基本的には何も起きません。これがREADMEを読まない人へのいたずらTMというわけです。なぜなら私たちはモンスターだからです。
でも…正しい呪文を追加すれば、前述のL.A.I.M.が有効になり、キャンディが見つかるファイルパスが出力されます。
重要な呪文は次のとおりです:
-o 結果をファイルに出力します。-sを使わない場合はこれが必要でしょう。例:-o C:\users\thing\snaffler.log
-s 結果が見つかり次第、標準出力に出力します。-oを使わない場合はこれが必要でしょう。
-v 詳細レベルを制御します。オプションはTrace(最も詳細)、Degub(やや詳細、gubs少なめ)、Info(やや詳細、デフォルト)、Data(結果のみ)です。例:-v debug
-m 検出したファイルをSnafflerが自動的にコピー(または「Snaffle」)するための出力ディレクトリを有効にして割り当てます。
-l Snaffleするファイルの最大サイズ(バイト単位)。デフォルトは10000000で、約10MBです。
-i コンピュータと共有の探索を無効にし、ファイル探索を実行するディレクトリへのパスを要求します。
-n コンピュータの探索を無効にし、共有とファイルの探索を行うホストのカンマ区切りリストまたは入力ファイルを受け取ります。ファイルを指定する場合、入力はパスである必要があるため、例としてC:\targets.txtまたは.\targets.txtを使用します。
-y 出力をTSV形式にします。
-b あまり興味深くないものを検出するLAIMルールをスキップし、0から3の数値で調整します。
-f DFS(分散ファイルシステム)を介したファイル共有のみを検出するようにSnafflerを制限します。これはデフォルトよりもかなりこっそりと動作し、多くの組織で最大のファイル共有をカバーします。
-a ファイルの列挙をスキップし、対象ホスト上のリスト可能な共有のリストのみを出力します。
-u ADからアカウント名のリストを取得し、最も興味深そうなものを選び、それらを検索ルールで使用するようにSnafflerに指示します。
-d ファイルを探すための共有を探すためのコンピュータを検索するドメイン。簡単ですね。
-c ドメインコンピュータのリストを照会するドメインコントローラ。
-r 内部で興味深い文字列を検索するファイルの最大サイズ(バイト単位)。デフォルトは500kです。
-j ファイル内で見つかった文字列の前後に表示するコンテキストのバイト数。例:-j 200
-z 上記のすべてとそれ以上を定義する設定ファイルへのパス。詳細は以下を参照。-z generateを指定すると、.\default.tomlというサンプル設定ファイルが生成されます。
-t 出力したいログのタイプ。現在サポートされているオプションはplainとJSONです。デフォルトはplainです。
-x 使用するスレッドの最大数。4未満に設定すると壊れます。
-p .toml形式のルールファイルが格納されたディレクトリへのパス。Snafflerはデフォルトのルールセットの代わりにこれらをすべて読み込みます。
以下の注釈付きの例が役立つでしょう:
このログエントリは左から右に大まかに解釈すると:
...そして行の残り(灰色部分)は、一致があったファイルのコンテキストの小さなスニペットです。
この例ではASP.NETのvalidationKeyとdecryptionKeyの値が見つかりました。これは、何らかのデシリアライゼーションのハッキングを介してWebアプリにRCEできる可能性があることを意味します。やったー!
注:このスクリーンショットを撮った後、Sh3r4が各行の先頭に現在のユーザーとホスト名を付加する機能を追加しました。でもスクリーンショットを作り直したくありません。
各L.A.I.M.の魔法のファイル発見方法は次のようなことを行います:
正確なファイル拡張子の一致による検索。つまり、関連するワードリストに一致する拡張子を持つファイルがすべて返されます。これは、ほとんどの場合キャンディを含むファイル拡張子を対象としています(例:.kdbx、.vmdk、.ppkなど)。
(大文字小文字を区別しない)正確なファイル名の一致による検索。これは、ほとんどの場合キャンディを含むファイル名を対象としています(例:id_rsa、shadow、NTDS.DITなど)。
正確なファイル拡張子の一致による検索(さらに別のワードリスト)の後に、一致したファイルの内容を特定のキーワード(さらに別のワードリスト)で「grep」する検索。これは、時々キャンディを含むが、ふるいにかけるべき大量の無駄がある可能性が高いファイル拡張子を対象としています。例えば、web.configは時々データベースの資格情報を含みますが、退屈なIIS設定のガラクタやパスワードを含まないこともよくあります。これは(例えば).configで終わるものを見つけ、その中をconnectionString、password、PRIVATE KEYなどの文字列でgrepします。
部分的なファイル名の一致による検索(またまたワードリスト)。これは主にJeff's Password File 2019 (Copy).docxやPrivileged Access Management System Design - As-Built.docxなどを見つけるためのもので、ファイル名にpassw、handover、secret、secure、as-builtなどの部分文字列が含まれるものを一致させます。
特定の拡張子を持つファイルや、パスに特定の文字列を含むファイルをすべてスキップするスキップリストもあります。
Snafflerは「分類器」のシステムを使用します。各分類器は共有、フォルダ、ファイル、ファイル内容を検査し、一部の項目を下流の次の分類器に渡し、その他を破棄します。各分類器はルールのセットを使用して、分類した項目をどうするかを決定します。
これらのルールは非常に単純なもの(例:「ファイルの拡張子が.kdbxなら報告する」や、「パスにwindows\sxsが含まれている場合は、そのパス内のサブディレクトリやファイルの調査を停止する」)から、正規表現を使用して比較的高度なパターンマッチングを可能にするものまであります。これはファイル内容の検査時に特に有用ですが、パフォーマンスに大きな影響を与える正規表現には注意が必要です。大規模な環境ではこれらのルールが文字通り数百万回チェックされる可能性があるため、小さなパフォーマンス問題が大幅に増幅される可能性があります。
本当の力は、Snafflerが複数のルールを連鎖させ、さらに分岐する連鎖を作成できる点にあります。これにより、「安価な」ルール(ファイル名や拡張子のチェックなど)を使用して、「高価な」ルール(ファイル内容に対する正規表現の実行、証明書の解析による秘密鍵の有無の確認など)を使用するタイミングを決定できます。これにより、Snafflerは必要な場合にファイルの深い検査を実現しつつ、C#のような高レベル言語で書かれたツールとしては驚くほど高速になります。
例えば、非常に単純なルールセットは次のものを含むかもしれません:
.dmpファイル拡張子を持つファイルを見つけてSnaffleするルール.ps1ファイル拡張子を持つファイルを探し、一致したファイルを2番目と3番目の両方のルールに送る。.batや.cmdファイルに見られるようなcmd.exeコマンド内のハードコードされた資格情報を見つけるために設計された正規表現を使用してファイル内部を調べる。これらはPowerShellスクリプト内でも一般的に使用されるため。このアプローチにより、比較的管理しやすく読みやすいルールセットを維持でき、エンドユーザー(あなた)がデフォルトをカスタマイズしたり、独自のルールセットを開発したりするのも簡単になります。
その通りです。確かに大変でした。
Snafflerにはデフォルトのルールセットが.exeに組み込まれています。./Snaffler/SnaffRules/DefaultRulesで確認できます。
問題ありません、変わり者のあなた。2つのオプションがあります。
DefaultRulesディレクトリ内のルールを編集または置き換え、新しいSnafflerをビルドします。そのディレクトリ内の.tomlファイルはリソースとして.exeに組み込まれ、他のルールを指定しない限り実行時に読み込まれます。-p .\path\to\rulesを指定してSnafflerを実行します。Snafflerはそのディレクトリ内のすべての.tomlファイルを解析し、結果のルールセットを使用します。これらをすべて1つの大きな.tomlファイルにまとめても動作します。以下に、理解を助けるための注釈付きの例を示します。これが非常に難しいと感じたら、私たちのルールを使用すれば、良いものを見つけられるでしょう。