Shodanの検索クエリについて

セキュリティ

サーバ検索エンジン「Shodan」便利ですよね。いつも使う検索クエリはわかるのですが、このほかにどんなことができるのか調べてみました。
※絶対に悪用(不正アクセス、他人のサーバに対する有害行為等)しないでください。

shodanとは

shodanは、サーバ情報のデータベースです。サイトリンク(Shodan Search Engine
「日本国内にある、ポート80が開いているサーバ取得する」等の機能があり、一部では、脆弱性の検索にも使われています。
 APIを使用したり、検索結果のフィルタを外すためには有料プランに加入する必要がありますが、無料プランでも十分に使う価値のあるサイトだと思います。

shodanの使い方

基本的には検索フィールドに、検索クエリを入力するという使い方が一般的

検索フィールドに、「country:”jp” port:”443″」と入力すると、
 検索結果 2,304,340 件 の該当があり、その一覧が表示されます。
 ※無料プランでは検索結果は2ページ目までしか表示できませんが、使い方次第では十分な結果が得られます。

●統計に使用
 検索結果は、世界の分布まで表示してくれますので、統計資料の作成に便利です。
 例えば、80番ポートを使っているサーバ(httpサーバ)を検索すると、世界で約1億5533万台あり、国別でみるとインドが最も多いというデータが読み取れます。(日本は6位で260万台)

 ちなみに、ランキングの下の方を見ていくとEH(西サハラ)では、80番が開いているサーバが、
   1台
えっ本当?と思い、早速表示させたのですが、何も表示されませんでした。ザンネンネ

検索クエリの一覧

検索クエリを調べてみたところ、次のような検索ができそうでした。
スペースで区切って複数指定するとANDとなります。

●複数条件の指定方法
 AND検索 「条件A 条件B 条件C」
 OR検索 「(条件A OR 条件B)」
 入力例 (port:80 OR port:443) country:JP
  国内サーバの内、ポート80かポート443が解放しているもの

●all 指定方法[all]
 クエリに”ALL”を含むデータ
 入力例 country:”ja” all
 出力例 telnetd: All network ports in use.
    Telnet Server 2.00 All rights reserved.
    Note: all commands are case-sensitive.

●asn 指定方法[asn:”ASN CODE”]
 ネットワーク識別符号の指定検索(完全一致)
 入力例 asn:”AS15169″ ※googleのASN

●city 指定方法[city:”CITY NAME”]
 市名による検索(完全一致)
 入力例 city:”tokyo”

●country 指定方法[country:”COUNTRY NAME”]
 国名による検索(完全一致)
 入力例 country:”jp”

●cpe 指定方法[cpe:”CPE”]
 通信機器の名称や説明
 入力例 cpe:”apache”(部分一致)
 名称か、説明の中にapacheが含まれる行を抽出

●device 指定方法[device:デバイス名]
 デバイスの種類を指定
 入力例 device:firewall(完全一致)
 ファイヤーウォールを検索

●geo 指定方法[geo:GPS座標]
 GPSの座標からサーバを検索
 入力例 geo:40.7128,-74.0060 (完全一致)
  ニューヨークにあるデバイスを検索

●has_ipv6 指定方法[has_ipv6:true]
 IPv6デバイスによる絞込を有効にするか
 入力例 device:router has_ipv6:true
  IPV6が割り振られたルータを検索

●has_screenshot 指定方法[has_screenshot:true]
 スクリーンショットを取得可能
 入力例 device:firewall has_screenshot:true
  国内のサーバのうち、スクリーンショットを取得できたもの

●has_ssl 指定方法[has_ssl:true]
 SSL通信を行っているサーバの絞込
 入力例 has_ssl:true country:jp
  国内のサーバのうち、SSL通信を行っているもの

●has_vuln 指定方法[has_vuln:true]
 脆弱性があるサーバを検索
 入力例 has_vuln:true geo:40.7128,-74.0060
  ニューヨークにある、脆弱性のあるサーバを表示

●hash 指定方法[hash:”HASH値”]
 ソフトやバージョンにハッシュ値を含むサーバを検索(完全一致)
 入力例 hash:””(手頃なハッシュ値が見つかりませんでした)

●hostname 指定方法[hostname:”HOST NAME”]
 ホスト名による検索(部分一致)
入力例 hostname:”tokyo.ocn.ne.jp”
  tokyo.ocn.ne.jp をホスト名に含むサーバ

●ip 指定方法[ip:”IP ADDRESS”]
 IPアドレスによるサーバの指定(完全一致)※条件によって部分一致で返ってくることもある
 入力例 ip:”8.8.8.8″
  8.8.8.8が割り振られたサーバの情報を表示

●isp 指定方法[isp:”Service Provider Name”]
 ISPによるサーバの検索(完全一致)
 入力例 isp:”NTT”
  ISPがNTTであるサーバ

●link 指定方法[link:”リンク先URL”]
 リンクによるサーバの検索(完全一致?)
 入力例 link:”google.co.jp” 見つかりません…そんなことある?

●net 指定方法[net:”ネットワークアドレス”]
 対象のネットワークアドレス範囲のサーバ(完全一致)
 入力例 net:”153.142.0.0/18″
  OCNのネットワークに割り振られたサーバ

●org 指定方法[org:”組織名”]
 特定組織に属するサーバの検索(完全一致)
 入力例 device:router org:”Google LLC”
  Google LLC に属するルータを検索

●os 指定方法[os:”OS名”]
 OS名によるサーバの検索(完全一致)
 入力例 os:”Linux”
  Linuxサーバの検索

●port 指定方法[port:”ポート番号”]
 開放ポート番号によるサーバの検索
 入力例 port:”443″ country:jp
  国内で443ポートを開いているサーバ

●postal 指定方法[postal:”郵便番号”]
 特定郵便番号によるサーバの検索
 入力例 postal:10001
  ニューヨークのサーバを検索

●product 指定方法[product:”Apache HTTP Server”]
 特定の製品を使用しているサーバ
 入力例 product:”Apache HTTP Server”
  Apache HTTP Serverを使っているサーバ

●region , state  指定方法[region:”地域名”]
 特定地域にあるサーバを検索
 入力例 region:”” (適当な特定地域が見つかりませんでした)

●scan 指定方法[scan:スキャンID]
 スキャンIDで検索できるらしいですが、よくわかりませんでした

●shodan.module 指定方法[shodan.module:”モジュール名”]
 対象のモジュールが起動しているサーバを検索(完全一致)
 入力例 shodan.module:”ftp”
  FTPサーバが起動しているサーバ(他には”http”,”ssh”等を指定可能)

●version 指定方法[version:”バージョン”]
 バージョンで検索できるらしいですが、よくわかりませんでした

 ※調べながら書きましたが、違っていたらごめんなさい

 例えば、東京にあるサーバの内(geolocation のようなデータベースを使用していると、位置はおおよそです)、apacheサーバ、443ポートを開放、OSがwindowsで絞り込むには
  検索クエリ city:”tokyo” cpe:”apache” port:”443″ os:”Windows”
となります。
 この検索クエリを実行すると、
  11件
のサーバが該当し、出力結果が2ページ以内に収まりました。(無料で全ページ確認できます)

いろんな検索ができそうですね。
 ただ、shodanは、キャッシュデータを基にこれらの検索を実施しているようですので、最新の情報ではないということは覚えておいた方がよさそうです。

まとめ

 私は業務関係で、こういった統計資料を扱うことが多いので、shodanは重宝しています。
 サーバを運営している方は、自分のサイトの脆弱性がないかを確認するのにも使えると思いますが、こういった情報が誰でも手に入る状態であると認識していただきたいと思い、記事にさせていただきました。