
recog v3.1.30
ホスト、サービス、およびコンテンツのパターン認識
Recog: 認識フレームワーク
Recogは、さまざまなネットワークプローブから返されるデータに対してフィンガープリントをマッチングすることで、製品、サービス、オペレーティングシステム、ハードウェアを識別するためのフレームワークです。Recogを使用すると、Webサーバーのバナー、SNMPシステム記述フィールド、その他多数から有用な情報を簡単に抽出できます。
Recogはオープンソースです。詳細については、LICENSEファイルを参照してください。
目次
リポジトリの分割
2022年3月31日、Recogのコンテンツ(XMLフィンガープリントファイルとユーティリティ)は、Recogフレームワークライブラリの実装から分割されました。元のRecogリポジトリにはRecogのコンテンツが含まれ、Recog-RubyリポジトリにはRuby言語実装が含まれています。Recogのコンテンツは、gitサブモジュールとしてRecog-Rubyに含まれ、recogディレクトリの下に配置されています。分割後のRecog gemバージョン3.0.0以上では、1. recogディレクトリの下にXMLフィンガープリントディレクトリが含まれ、2. 他のツールはフィンガープリント管理に焦点を当てているため、recog_matchツールのみが含まれます。
デフォルトブランチの名称変更
リポジトリの分割に伴い、デフォルトブランチはmasterからmainに名称変更されました。これらの変更より前に作成されたクローンは、ローカル環境で手動で更新する必要があります。フォークを使用している場合は、フォークの設定に移動し、ブランチの名称変更の手順に従って、デフォルトブランチをmainに変更してください。
git branch -m master main
git fetch origin
git branch -u origin/main main
git remote set-head origin -a
必要に応じて、次のコマンドを実行して、以前のブランチ名への追跡参照を削除します。
# dry-run to confirm stale references that will be deleted before proceeding
git remote prune origin --dry-run
git remote prune origin
以前に上流追跡ブランチupstream-masterを使用していた場合は、次のコマンドを実行して古いブランチを削除し、新しい上流追跡ブランチを作成してください。
git branch -d upstream-master
git checkout -b upstream-main --track upstream/main
必要に応じて、次のコマンドを実行して、以前の上流ブランチ名への追跡参照を削除します。
# dry-run to confirm stale references that will be deleted before proceeding
git remote prune upstream --dry-run
git remote prune upstream
Recogライブラリの言語実装
- Ruby: rapid7/recog-ruby
- Java: rapid7/recog-java
- Go: runZeroInc/recog-go
機能の同等性
| 機能 ✨ | rapid7/recog-ruby | rapid7/recog-java | runZeroInc/recog-go |
|---|---|---|---|
| フィンガープリント検証CLIツール | ✅ | ✅ | ✅ |
| フィンガープリントマッチCLIツール | ✅ | ✅ | |
| base64エンコードされた例のサポート | ✅ | ✅ | ✅ |
| ファイルシステムベースの外部例のサポート | ✅ | ✅ | ✅ |
| フィンガープリントマッチCPEパラメータ補間 | ✅ | ✅ | ✅ |
インストール
Recogは、XMLフィンガープリントファイルと、主にRubyで書かれたさまざまなコードで構成されており、含まれているフィンガープリントの開発、テスト、使用を容易にします。含まれているRubyコードを使用するには、Rubyの最近のバージョン(2.31+)に加えて、Rubygemsとbundler gemが必要です。これらの依存関係が整ったら、次のコマンドを使用して最新のソースコードを取得し、追加の依存関係をインストールします。
$ git clone [email protected]:rapid7/recog.git
$ cd recog
$ bundle install
成熟度
XMLフィンガープリント自体は非常に安定しており十分にテストされていますが、Rubyコードベースはまだかなり新しく、急速に変更される可能性があることに注意してください。本番プロジェクトでRecogコードを利用する前に、私たち(research[at]rapid7.com)までご連絡ください。
フィンガープリント
Recog内のフィンガープリントはXMLファイルに格納されており、各ファイルは特定のプロトコル応答文字列またはフィールドにマッチするように設計されています。たとえば、ssh_banners.xmlファイルは、SSHデーモンの初期バナー文字列をマッチングすることで、OS、ベンダー、場合によってはハードウェア製品を特定できます。
フィンガープリントファイルは、次のようなXMLドキュメントで構成されています:
<fingerprints matches="ssh.banner">
<fingerprint pattern="^RomSShell_([\d\.]+)$">
<description>Allegro RomSShell SSH</description>
<example service.version="4.62">RomSShell_4.62</example>
<param pos="0" name="service.vendor" value="Allegro"/>
<param pos="0" name="service.product" value="RomSShell"/>
<param pos="1" name="service.version"/>
</fingerprint>
</fingerprints>
最初の行は常にXMLバージョン宣言で構成する必要があります。最初の要素は常にfingerprintsブロックであり、このフィンガープリントファイルがマッチすることを想定しているデータを示すmatches属性を持つ必要があります。matches属性は通常、protocol.fieldの形式です。
fingerprints要素の中には、1つ以上のfingerprint要素が必要です。各fingerprintには、データのマッチングに使用する正規表現を含むpattern属性が必須です。正規表現の解釈方法を制御するために、オプションのflags属性を指定できます。詳細については、FLAG_MAPに関するRecogのドキュメントを参照してください。
フィンガープリント内のdescription要素には、このフィンガープリントを説明する人間が読める文字列を含める必要があります。
少なくとも1つのexample要素が存在する必要がありますが、複数のexample要素が推奨されます。これらの要素は、提供されたデータが指定された正規表現にマッチすることを検証するrspecのテストカバレッジの一部として使用されます。さらに、フィンガープリントがparam要素を使用してデータからフィールド値を抽出する場合(次で説明)、これらの期待される抽出値をexample要素の属性として追加できます。上記の例では、これ:
<example service.version="4.62">RomSShell_4.62</example>
は、RomSShell_4.62が提供された正規表現にマッチし、service.versionの値が4.62であることをテストします。
example文字列は、印刷できない文字を使用できるようにbase64エンコードできます。これをRecogに通知するには、値がbase64の_encoding属性をexample要素に追加します。80文字を超えるBase64エンコードされたテキストは、読みやすくするために、下に示すように改行で折り返すことができます。
<example _encoding="base64">
dGllczGEAAAAlQQWMS4yLjg0MC4xMTM1NTYuMS40LjgwMAQuZGF0YS5yZW1vdmVkLjCEAAAAK
AQdZG9tYWluQ29udHJvbGxlckZ1bmN0aW9uYWxpdHkxhAAAAAMEATc=
</example>
さらに、例はXMLファイルと同じディレクトリ内の、XMLファイルと同名のディレクトリに配置できます:
xml/services.xml
xml/services/file1
xml/services/file2
...
その後、_filename属性を使用して読み込むことができます:
<example _filename="file1"/>
これは長い例に役立ちます。
param要素にはpos属性が含まれており、patternから抽出するキャプチャフィールド、または静的文字列の場合は0を示します。name属性は、マッチが成功した場合に報告されるキーであり、valueはposの値が0の場合は静的文字列、または欠落している場合はキャプチャされたフィールドから取得されます。
value属性は、他のフィールドからのデータの補間をサポートしています。これは、正規表現でhw.productの値をキャプチャし、その値をos.productで再利用する場合に役立ちます。
http_servers.xmlからの例では、hw.productがキャプチャされ再利用されています。
<fingerprint pattern="^Eltex (TAU-\d+[A-Z]*(?:\.IP)?)$">
<description>Eltex TAU model VoIP gateway</description>
<example hw.product="TAU-72">Eltex TAU-72</example>
<example hw.product="TAU-1.IP">Eltex TAU-1.IP</example>
<param pos="0" name="os.vendor" value="Eltex"/>
<param pos="0" name="os.product" value="{hw.product} Firmware"/>
<param pos="0" name="os.device" value="VoIP Gateway"/>
<param pos="0" name="hw.vendor" value="Eltex"/>
<param pos="1" name="hw.product"/>
<param pos="0" name="hw.device" value="VoIP Gateway"/>
</fingerprint>
_tmp.で始まる名前を持つ一時属性には特別な処理があります。これらの属性は補間に使用できますが、出力には出力されません。これは、特定の製品名がさまざまなバナー、ベンダーのマーケティング、またはCPEを生成しようとするときのNIST値と一貫性がない場合に役立ちます。これらの場合、バナーの有用な部分を抽出し、マッチによって出力されるデータを散らかすことなく新しい値を生成できます。
<fingerprint pattern="^foo baz switchThing-(\d{4})$">
<description>NetCorp NX series switches</description>
<example hw.product="NX8200">foo baz switchThing-8200</example>
<param pos="0" name="hw.vendor" value="NetCorp"/>
<param pos="0" name="hw.product" value="NX{_tmp.001}"/>
<param pos="2" name="_tmp.001"/>
</fingerprint>
これらの一時属性は、identifiers/fields.txtでは追跡されません。