【上級者向け】Censysの高度な検索クエリ
same_service代替構文・JARM・独自フィンガープリントで隠れた資産とC2を追う
基本のCenQL構文を覚えた人向けに、証明書メタデータでのシャドーIT発見、JARM/ハッシュ値によるC2追跡、開発者のうっかり公開の検知まで、現行のCensys Platform仕様に対応した実践クエリをまとめました。
📋 目次
「Censysの使い方完全ガイド」で登録とCenQLの基礎を押さえた方向けに、一歩踏み込んだ検索テクニックを紹介します。上級者が見ているのはhost.services.port: 22のような単純一致ではなく、「複数条件を同じサービス内で掛け合わせ、あり得ない歪みを探す」視点です。自組織の資産確認、または許可された調査の範囲で活用してください。
2025年後半の全面移行にともない、旧Legacy Search構文のsame_service()関数はCenQLには存在しません。同等の処理は1章の「括弧によるネストフィールドのグルーピング」で行います。他記事でsame_service(...)を見かけたら旧仕様の情報です。
同様に、値の中に*を埋め込む部分一致(例:*example*)も現行CenQLでは機能しません。本記事のクエリ例はすべて、部分一致:と括弧グルーピングの組み合わせで書き換えています。
🧩 same_serviceは今どう書く?
「別々のポートの情報」を誤ってヒットさせないための必須テクニック
なぜグルーピングが必要なのか
host.services.port: 53とnot host.services.protocol: DNSを単純にANDでつなぐと、別々のホストがそれぞれ条件を満たすだけでヒットします。見たいのは「53番のサービスそのものがDNSではない」という、1つのサービス内で完結する矛盾——それを表すのが括弧グルーピングです。
📖 目的別・条件グルーピング構文
| 目的 | クエリ |
|---|---|
| ポート番号と実プロトコルの食い違いを検知 (バックドア・ハニーポット疑い) | host.services: (port = "53" and not protocol = "DNS") |
| 特定ソフトの特定バージョンだけを狙い撃ち (既知脆弱性の一斉棚卸し) | host.services.software: (product = "Jenkins" and version = "2.303.1") |
| レスポンスヘッダーの組み合わせで フレームワークやC2を特定 | host.services.endpoints.http.headers: (key = "Server" and value = "nginx") |
クエリの分解:same_serviceが消えた分、括弧の中身を正しく組む力が要る
括弧の中は「そのフィールド配下」の相対パスになる
host.services: (...)の括弧内では、portやprotocolのようにhost.services.を省略した相対パスで書きます。フルパスのままだと意図通りにグルーピングされません。
🕸️ 証明書メタデータでシャドーITを掘る
メインドメインは守られていても、証明書の名義は残っている
2つの証明書データセットを使い分ける
Censysには証明書の見方が2つあります。cert.データセットは「発行された証明書の全履歴」(CTログ由来)、host.services.certは「いま稼働中のホストが提示している証明書」です。前者は停止済みサーバーも追え、後者はリアルタイム確認向きです。
🗺️ 図解:cert. と host.services.cert. の視点の違い
📖 目的別・証明書ピボット構文
| 目的 | クエリ |
|---|---|
| 自社組織名義の証明書を洗い出す (生IP露出+CDNベンダー除外) | host.services.cert.parsed.subject.organization: "Example Corp" and not host.services.software.vendor: "Cloudflare" |
| AWSのデフォルトドメイン上に 社名入りのタイトルがないか | host.dns.names: "compute.amazonaws.com" and host.services.endpoints.http.html_title: "Example Corp" |
| バケット名・ステージング名っぽい 文字列を証明書名から探す | (cert.names: "example" and cert.names: "backup") or (cert.names: "example" and cert.names: "staging") |
クエリの分解:ここは括弧不要——別々のトップレベル条件をand notでつなぐだけ
開発環境ほど「証明書だけ」残っていることが多い
検証用に急いで発行した証明書ほど、CDNやWAFを経由させ忘れたまま生IPで放置されがちです。証明書の名義から逆引きすると、公表されていない検証環境や、M&Aで引き継いだまま放置された古い資産が見つかることがあります。
🎯 JARM・ハッシュ値でC2を辿る
ドメインやIPを変えても、サーバーの「応答の癖」までは隠せない
JARMは「TLSハンドシェイクの指紋」
JARMは、TLSハンドシェイクの手順や暗号スイートの提示順から算出する62byteのフィンガープリントです。同じ設定のサーバーはIPやドメインが違っても同じ値を返すため、攻撃者が量産するC2インフラの検知に広く使われています。
JARMフィンガープリントの検索(host.services.jarm.fingerprint等)は、Free・Starter・Searchのいずれのプランでも利用できません。Censys Core契約に加え、「Adversary Investigation module」という追加アドオンを契約した組織のみが使える機能です。考え方として理解しておく価値は大きいですが、実際に自分の無料アカウントで試すことはできない点にご注意ください。
🗺️ 図解:JARMは「同じ設定なら同じ指紋」
📖 目的別・JARM/ハッシュ検索構文
| 目的 | クエリ |
|---|---|
| 特定のJARM値を持つホストを横断検索 | host.services.jarm.fingerprint: "<62byteのJARM値>" |
| Webプロパティ側のJARMで検索 | web.jarm.fingerprint: "<JARM値>" |
| 同一のHTMLボディを返す別ドメインを特定 | host.services.endpoints.http.body_hash_sha256: "<SHA256値>" |
| 同じファビコンを使う管理画面を横断検索 | host.services.endpoints.http.favicons.hash_sha256: "<SHA256値>" |
JARMの鮮度は15日が目安
*.jarm.observed_atで取得時期を確認しましょう。サーバー構成は日々変わるため、古いJARM値のまま判断すると誤検知のもとになります。
ファビコンハッシュの計算方式はツールごとに違う
Censysはfavicons.hash_sha256というSHA256ハッシュを使います。姉妹記事「Shodan 上級検索クエリ」のfavicon検索はMurmurHash方式のため、同じ画像でもハッシュ値をツール間で使い回せません。
同じJARMやハッシュが出ても、即座に「同一の攻撃者」と断定するのは危険です。ASN・証明書・稼働ポートなど複数のシグナルで裏取りしましょう。見つけた情報をもとに許可なく相手のサーバーへアクセスを試みる行為は不正アクセス禁止法違反です。
🔓 開発者のうっかり公開を捕まえる
ステージング環境・監視ツール・DBが認証なしで転がっていないか
自社の棚卸し(ASM)として使う
ここからは「攻撃者に見つかる前に自分たちで見つける」視点です。開発中の緩い設定がそのまま本番公開される事故はよくあり、Censysでの定期セルフチェックに価値があります。
📖 目的別・情報漏えい検知構文
| 見つけたいもの | クエリ |
|---|---|
| Gitリポジトリのディレクトリ一覧が露出 | host.services.endpoints.http.html_title: "Index of /.git" |
| Kibanaの管理画面が認証なしで開いている | host.services.endpoints.http.html_title: "Kibana" |
| Prometheusの監視画面が公開されている | host.services.endpoints.http.html_title: "Prometheus Time Series Collection and Processing Server" |
| 認証なしで応答するRedis/Elasticsearch | host.services.protocol: "REDIS" や host.services.protocol: "ELASTICSEARCH" |
見つけたら自社の対応フローに乗せる
検知して終わりにせず、「Censysの使い方完全ガイド」の対策章と同じ優先順位(①ポートを閉じる→②情報の露出を減らす)で対応しましょう。認証なしDBは特に緊急度が高い項目です。
ポートを閉じてもCensys側のデータはすぐには更新されません。反映まで数日かかることがあり、緊急確認したい場合は結果を待たず自分でポートスキャンして直接確かめるのが確実です。
🧪 独自フィンガープリントの作り方
既知のハッシュを検索するだけでなく、自分で「指紋」を発見する
3ステップで固有の指紋を見つける
未知の攻撃インフラを見つける上級者は、公開済みのIOC(既知の悪性指標)を検索するだけでなく、自分で新しい指紋を作ります。手順はシンプルです。
正解ホストと未知のホストを見比べ、共通する不自然な特徴を探す
「正解」のホストを1つ見つける
自社の検証用サーバーや、既に判明している標的インフラなど、確実に条件に合うホストを1台特定します。
他にはない特徴を探す
ヘッダーの並び順・大文字小文字の癖・妙に几帳面な証明書の有効期間・ランダムな組織名など、標準的な設定ではまず出ない値を探します。
and/notで極限まで絞り込む
見つけた特徴だけを条件にして世界中を横断検索し、他に同じ特徴を持つホストがないか確認します。
急造インフラほど「不自然な几帳面さ」が出る
自己署名証明書の有効期間がぴったり10年、組織名がqwertyuiopのようなランダム文字列——量産インフラほど、人間の手癖や自動生成ツールの初期値が残っています。
継続監視に発展させるなら、前回と今回の検索結果を自動比較するのが実務的です。「Censysの使い方完全ガイド」で紹介したPAT・Python SDKのセットアップに、差分検知ロジックを足すだけで実現できます。
import json from censys_platform import SDK PAT = "YOUR_PERSONAL_ACCESS_TOKEN" query = 'host.dns.names: "example.co.jp"' def fetch_open_ports(): with SDK(personal_access_token=PAT) as sdk: res = sdk.global_data.search(search_query_input_body={ "query": query, "fields": ["host.ip", "host.services.port"], "page_size": 50, }) hits = res.result.hits if res.result else [] return {h.ip: sorted(s.port for s in (h.services or [])) for h in hits} today = fetch_open_ports() try: with open("last_scan.json") as f: previous = json.load(f) except FileNotFoundError: previous = {} for ip, ports in today.items(): old_ports = set(previous.get(ip, [])) new_ports = set(ports) - old_ports if new_ports: print(f"[NEW] {ip} で新しく開いたポート: {sorted(new_ports)}") with open("last_scan.json", "w") as f: json.dump(today, f)
防弾ホスティングの継続監視という応用
脅威インテリジェンス寄りの応用として、法執行の要請に応じにくい特定ホスティング事業者のASN(host.autonomous_system.name)を対象に差分監視を仕掛け、新しく開いたポートや証明書だけを追う使い方もあります。
📋 実務チートシート・FAQ・まとめ
目的から逆引きできる早見表と、上級者になるためのチェックリスト
ここまでのテクニックを、目的から逆引きできる早見表にまとめました。実務ではまずこの表から近いものを探し、自組織のドメインやASNに置き換えて使うのが近道です。
⚖️ Censys vs Shodan:上級テクニック対応表
| 項目 | Censys | Shodan |
|---|---|---|
| 複数条件のグルーピング | host.services: (...)で明示的にグルーピング | 結果が1バナー単位のため、同種の混同がそもそも起きにくい構造 |
| JARMフィンガープリント | host.services.jarm.fingerprint | ssl.jarm(双方とも対応) |
| Faviconハッシュ方式 | SHA256(favicons.hash_sha256) | MurmurHash3(http.favicon.hash)※値の使い回し不可 |
| 証明書の組織名ピボット | cert.parsed.subject.organization等が確立 | ssl.cert.subject.cnが中心、組織名専用フィールドは限定的 |
| 証明書の履歴追跡 | cert.データセットでCTログ由来の全履歴を横断 | スキャン時点のバナーに紐づく現在値が中心 |
どちらか一方を選ぶ話ではない
証明書ピボットや履歴追跡はCensysが強く、IoT/ICSの生バナー情報はShodanが強い、と役割が分かれています。上級者ほど両方を併用し、片方で見つけた手がかり(IPやJARM値)をもう片方で裏取りする使い方をしています。
🧾 目的別チートシート
| 目的 | クエリ |
|---|---|
| ポートと実プロトコルの食い違い検知 | host.services: (port = "53" and not protocol = "DNS") |
| 組織名義の証明書から生IPを洗う | host.services.cert.parsed.subject.organization: "Example Corp" and not host.services.software.vendor: "Cloudflare" |
| 既知のJARM値でC2インフラを追う | host.services.jarm.fingerprint: "<JARM値>" |
| Gitディレクトリの露出を検知 | host.services.endpoints.http.html_title: "Index of /.git" |
| 特定ASN内の管理ポート露出を棚卸し | host.autonomous_system.name: "EXAMPLE-AS" and host.services.port: 3389 |
| 日本国内×特定ポートの一括棚卸し | host.location.country = "Japan" and host.services.port: 3389 |
✅ 上級者になるためのチェックリスト
- same_service()ではなく括弧グルーピングで書けている
- cert.とhost.services.cert.を目的に応じて使い分けている
- JARM/ハッシュの一致を「断定」でなく「状況証拠」として扱っている
- 自分だけの固有フィンガープリントを1つ以上作ったことがある
- 継続監視をAPIで自動化し、差分だけを見る仕組みがある
📚 用語集(本記事で新しく登場した用語)
| JARM | TLSハンドシェイクの手順から算出する62byteのサーバーフィンガープリント。 |
| same_service(レガシー構文) | 旧Legacy Search特有の関数。現行CenQLでは括弧グルーピングに置き換わっている。 |
| ネストフィールドグルーピング | コロンの後に括弧で条件をまとめ、同一オブジェクト内での一致を強制するCenQLの記法。 |
| ボディハッシュ | HTTPレスポンス本文から算出するハッシュ値。同一のフィッシングキットや管理画面の使い回しを検出できる。 |
| 防弾ホスティング | 法執行機関の要請に応じず、悪用インフラを停止させないホスティング事業者。 |
❓ よくある質問(FAQ)
same_service()はもう使えないの?
現行のCensys Platform(CenQL)には存在しません。本記事1章で解説した括弧グルーピング構文に読み替えてください。
JARMだけで「これはCobalt Strikeサーバーだ」と断定していい?
いいえ。正規のミドルウェアでも偶然一致することがあります。ASN・証明書・開いているポートなど複数のシグナルで総合判断しましょう。
cert.とhost.services.cert.、結局どちらを使えばいい?
発行履歴を洗いたいならcert.、いま何が動いているかを見たいならhost.services.certです。目的で使い分けてください。
ハッシュ値やJARM値は自分でどう調べればいい?
ハッシュ値(favicons.hash_sha256等)は調査対象のホストをCensysで検索し、詳細ページの該当項目を確認すれば無料プランでも見られます。一方JARM値は前述の通りCensys Core+有料アドオンが必要な機能で、無料プランの画面には表示されません。既知の悪性インフラのハッシュやJARM値は、公開されている脅威インテリジェンスレポートやIOCリストから入手するのが実務的です。
独自フィンガープリントを作るのにプログラミングは必須?
必須ではありません。まずは検索画面でand/notを組み合わせるだけで十分始められます。継続監視を自動化する段階で初めてAPI・スクリプトが必要になります。
基本操作から復習したいのですが?
「Censysの使い方完全ガイド」で登録手順とCenQLの基礎、実践シミュレーションを解説しています。まずそちらをご覧ください。
🧭 次に読む
🔎 Censysの基本に戻る
🛰️ 併せて使いたいOSINTツール
🛡️ 見つけた後の対応・全体像
📚 主な参考・一次情報
- Censys公式ドキュメント(Censys Query Language / Query Converter / Platform JARM Fingerprints and Context Hashes)
- Censys Support「Censys Query Language in the Internet Intelligence Platform」
- Shodan公式Filter Reference・Shodan Help Center(ssl.jarm / http.favicon.hash / ssl.cert.*の各フィルター仕様)
- 「Censysの使い方完全ガイド」(当サイト姉妹記事)
- MITRE ATT&CK(偵察=Reconnaissance関連の技術分類)
- 総務省・警察庁 不正アクセス禁止法に関する解説ページ
※クエリのフィールド名・仕様は変更される場合があります。実行前に必ず公式ドキュメントで最新情報をご確認ください。


コメント