
smbcrawlerは、資格情報とホストのリストを受け取り、それらの共有を「クロール」(または「スパイダー」)する実用的なツールです。
SmbCrawlerは、認証情報とホストリストを受け取り、それらの共有を「クロール」(または「スパイダリング」)する、余計な機能のないツールです。機能:
Pythonパッケージのインストール方法についての説明が必要な場合は、pipxがインストールされていることを確認し、pipx install smbcrawlerを実行することをお勧めします。
SmbCrawlerは、MarkItDownを使用して、PDF、XLSX、DOCX、ZIPなどの一部のバイナリファイルを自動的にプレーンテキストに変換できます。このパッケージは多くの依存関係を引き込むため、エクストラとしてマークされています。ただし、最良の結果を得るためには強く推奨されます。バイナリを自動変換したい場合は、次のようにSmbCrawlerをインストールしてください:
pipx install 'smbcrawler[binary-conversion]'
シェル補完の追加は強く推奨されます。clickライブラリを使用するPythonアプリとして、通常の仕組みを使用してbash、zsh、fishにタブ補完を追加できます。
次のように実行します(10スレッド、最大深さ5):
$ smbcrawler crawl -i hosts.txt -u pen.tester -p iluvb0b -d contoso.local -t 10 -D 5
SmbCrawlerは大幅な見直しが行われました。最も重要な変更点は次のとおりです:
「興味深いファイル」、「退屈な共有」などに関する古いCLI引数は扱いにくく混乱を招いていました。代わりに「プロファイル」を使用するようになりました。詳細は以下を参照してください。
また、基本的に関係データベースを再発明していたことに気づきましたが、非常に貧弱な方法だったため、sqliteを直接使用しない手はありません。sqliteアプローチにより、優れたパフォーマンスでインタラクティブなHTMLレポートを生成できます。ツールパイプラインでデータを使用する必要がある場合は、さまざまな形式で結果をエクスポートすることもできます。
以前のSmbCrawlerのパーミッション報告方法は、あまり役に立たない場合がありました。たとえば、共有のルートディレクトリへの読み取り権限はあるが、ユーザープロファイルなどのサブディレクトリはすべて保護されているということは珍しくありません。SmbCrawlerは、共有のディレクトリツリーをどこまで読み取れたか、また、最大深さ引数に高い値を指定すればさらに深く読み取れた可能性があるかどうかを報告するようになりました。
以前のバージョンを好む場合は、PyPIで引き続き利用可能であり、たとえばpipx install smbcrawler==0.2.0でインストールできます。
実行中は、次のキーを使用できます:
p: クローラーを一時停止し、個々のホストや共有をスキップ<space>: 現在の進行状況を表示s: より詳細なステータス更新を表示詳細については、smbcrawler -hを実行してください。
中規模のネットワークであっても、SmbCrawlerは大量のデータを見つけます。課題は誤検出を減らすことです。
パーミッションはサービスレベルとファイルシステムレベルの両方で適用される可能性があることを認識することが重要です。リモートSMBサービスが認証を許可し、ユーザーアカウントが原則的に読み取り権限を持っていても、ファイルシステム上でそれらの権限が不足している可能性があります。
SmbCrawlerは、次の権限があるかどうかを報告します:
--depth引数によって制限される)SMB共有のパーミッションをチェックするには、該当するアクションを試行せずに行うのは簡単ではないため、SmbCrawlerは各共有にディレクトリを作成しようとします。その名前はsmbcrawler_DELETEME_<8ランダム文字>であり、すぐに削除されますが、注意してください。
[!WARNING] ディレクトリを作成する権限はあるが、削除する権限がない場合があり、空のディレクトリが残る可能性があります。
特定の共有、ファイル、ディレクトリに対して何を行うかを決定するために、SmbCrawlerには「プロファイル」という機能があります。デフォルトプロファイルをご覧ください。
プロファイルは、次の場所から拡張子*.ymlまたは*.yamlのファイルから読み込まれます:
$XDG_DATA_HOME/smbcrawler/(デフォルトでは~/.local/share/smbcrawler)--extra-profile-directoryで定義された追加ディレクトリ--extra-profile-fileで定義された追加ファイル各場所からのプロファイルは、以前の定義を上書きします。
regex値はプロファイルが一致するかどうかを定義し、最後に一致したプロファイルが使用されます。すべての正規表現は大文字と小文字を区別せず、Windows世界で最も一般的な動作を反映しています。
異なるソースからのプロファイルがどのように連携するか混乱する可能性があるため、--dry-runパラメータを必ず使用してください。これにより、有効な構成が表示され、それ以外のことは行われません。
各セクションを見てみましょう。これは常に辞書のリストです。辞書の各キーは任意のラベルであり、各値は再び異なるプロパティを持つ辞書です。
comment: このプロファイルを説明する役立つ文字列regex: このプロファイルが適用されるファイルを定義する正規表現。一致する最後の正規表現が優先されます。regex_flags: regex match関数に渡されるフラグの配列high_value(デフォルト: false): ファイルが「高価値」の場合、その存在が報告されますが、必ずしもダウンロードされるわけではありません(仮想ハードドライブなど、重要だが自動ダウンロードするには大きすぎるファイルを想定)。download(デフォルト: true): trueの場合、最初の200KiBがダウンロードされ(high_value=trueの場合はファイル全体)、シークレットが解析されます。comment, regex, regex_flags: 上記と同じhigh_value: 存在が報告され、クロール深度が無限に変更されますcrawl_depth: この共有またはディレクトリを--depth引数で定義された深さとは異なる深さまでクロールします。comment, regex_flags: 上記と同じregex: シークレットに一致する正規表現。シークレット自体は、名前secretの名前付きグループにすることができます。まず、クロール深度1でSmbCrawlerを実行して、何を扱っているのか把握するのが理にかなっています。この最初の実行では、-wで書き込みチェックを有効にできます:
$ smbcrawler -C permissions_check.crwl crawl -D1 -t10 -w \
-i <入力ファイル> -u <ユーザー> -d <ドメイン> -p <パスワード>
これは各共有のルートディレクトリのみの書き込み権限と読み取り権限をチェックすることに注意してください。読み取り権限がどこまで及ぶかについては、フルランでのみ詳しくわかります。
初期パーミッションチェックの後、次の実行または複数の実行のために、興味深い共有と退屈な共有を特定できます。SYSVOLやNETLOGONなどの一部の共有は何度も出現するため、次の実行ではクロール深度をゼロに設定し、3回目の実行で1台のホストを選択してこれらの重複共有をスキャンする必要があります。次に例を示します:
$ smbcrawler -C dc_only.crwl crawl -D -1 <DC IP> \
-u <ユーザー> -d <ドメイン> -p <パスワード>
$ smbcrawler -C full.crwl crawl -D5 -t10 -i <新しい入力ファイル> \
-u <ユーザー> -d <ドメイン> -p <パスワード> \
--extra-profile-file skip_sysvol.yml
ここで、skip_sysvol.ymlは次のようになります:
shares:
sysvol:
comment: "SYSVOLとNETLOGON共有をスキップ"
regex: 'SYSVOL|NETLOGON'
crawl_depth: 0
クロールする価値がないと思われる他の共有をここに自由に含めてください。
生データはSQLiteデータベースとディレクトリ(デフォルトではoutput.crwlとoutput.crwl.d)に含まれています。ディレクトリにはさらに2つのディレクトリがあります。1つはハッシュコンテンツによって一意化されたダウンロードファイル用で、もう1つはすべての共有をミラーリングし、コンテンツファイルへのシンボリックリンクを含むディレクトリです。後者は、ダウンロードしたすべてのファイルをgrepするのに適しています。
データはさまざまな形式に変換できます。たとえば、sqlitebrowserを使用してデータベースに直接アクセスすることもできます。いくつかの便利なビューが事前定義されています。または、JSONを出力し、jqを使用してデータを加工することもできます。
たとえば、ルートディレクトリを超えて読み取ることができたすべての共有をLaTeXテーブルに表示したい場合は、次のクエリを使用します:
SELECT target_id || " & " || name || " & " || remark || " \\"
FROM share
WHERE read_level > 0
ORDER BY target_id, name
実験的なHTML出力機能もあります。大量のデータに対してはまだ完全に有用ではないかもしれません。
報告されたシークレットに多くの誤検出または誤検出漏れがあることに気付いた場合は、ぜひお知らせください。自動検出を改善しようとする際には、コミュニティからのインプットが重要です。最良のシナリオは、デフォルトプロファイルファイルへの変更を含むプルリクエストを提供することです。
Adrian Vollmer, SySS GmbH
MITライセンス。詳細はLICENSEを参照してください。