#はじめに
Shodanのレファレンスの抄訳です。
ちょうどいい感じのまとめ具合を心掛けます。
(レファレンスの最終更新2016年12月26日)
#導入
Shodanはインターネットに繋がった機器を対象にした検索エンジンです。
##Shodanが返すデータ
Shodanが返す検索結果の単位はバナー情報で、あるIPが複数のサービスを持っていればそれらは別々の検索結果として扱われます。
バナーの他に、位置情報やホスト名、OSなどのメタ情報も表示します。詳しくは付録Aを参照してください。
IPv6にも対応しています。
##SSL
SSLは重要なので、SSLが利用可能なサービスについてはSSL証明以外の情報も含めて収集しています。
あるサービスが、Heartbleed、FREAK、Lgojamのような脆弱性の影響を受けるかどうかも判ります。影響を受ける場合、opts.vulnの値が"CVE-2014-0160"のようになり、受けない場合"!CVE-2014-0160"のようになります。
クローラーはSSLv2、SSLv3、TLSv1.0、TLSv1.1、TLSv1.2で接続を試行し、対応しているバージョンを特定します。非対応のバージョンには"-"記号が付きます。
ssl.chainプロパティには証明チェーンの情報が含まれます。
##データ収集
クローラーは常時情報を収集しており、地理的な偏りを避けるためにアメリカ、中国、アイスランド、フランス、台湾、ベトナム、ルーマニア、チェコに分散しています。
ある時点の偏りを避けるためにクローラーは以下のアルゴリズムに従って情報を収集します。
- 無作為なIPv4アドレスを生成
- リストの中から無作為にポート番号を選択
- バナー情報を収集
- 1に戻る
#Webインターフェース
WebからShodanの情報を検索できます。
##検索クエリ
後述のフィルタ機能を使わない場合、クエリはバナー情報を対象に検索を実行し、メタ情報は参照しません。検索語をスペースで区切るとAND検索として扱われます。
フィルタ機能を用いてメタデータを検索できます。
##フィルタ機能
下の記法でメタデータを検索できます。
フィルタ名:値 ※コロンの後にはスペース不要
スペースを含む文字列は、"San Diego"のようにして検索します。port: 23,1023のようにカンマ区切りで複数の値を取れるフィルタもあります。
-city:"San Diego"のようにすれば検索結果から除外することができます。
下記はよく使うフィルタの例です:
フィルタ名 | 説明 | 例 |
---|---|---|
category | ics, malwareなど | |
city | 都市 | |
country | 国 | |
net | 指定されたIP範囲、CIDR記法 | net: 190.30.40.0/ |
org | IPを所有する組織 | org:” Verizon Wireless” |
全てのフィルタは付録Bを参照してください。 |
##Shodan検索エンジン
Shodan検索はhttps:// www.shodan.ioで利用可能です。
デフォルトでは過去30日間に収集したデータが検索対象です。
JSON、CSV、XML形式で検索結果をダウンロードできます。
JSONにはメタデータも含めてShodanが集めた情報がすべて含まれます。CSVには基本的な情報のみ含まれます。XMLの利用はお薦めしません。
検索結果のダウンロードには購入したポイントを消費する必要があります。
表や図で概要をまとめたレポートは無料で作成できます。このレポートはその時点でのスナップショットで、新たな情報が加わっても変更されません。定期的にレポートを作成し、あとから閲覧することが可能です。
他のユーザとの間でクエリを共有できます。公開したくないクエリは共有しないように注意してください。
##Shodan Maps
最大1,000件の検索結果を地図に表示することができます。全ての検索フィルタは地図上で利用可能です。
##Shodan Exploits
Shodan Exploitsでは脆弱性を検索できます。脆弱性情報はCVE、Exploit DB、Metasploit元にしています。
Shodanとは異なり、デフォルトでメタデータも対象にした検索を行います。
下記フィルタが利用可能です。
フィルタ名 | 説明 |
---|---|
author | 脆弱性の著者 |
description | 説明 |
platform | 標的のプラットフォーム(OS、プログラミング言語、等) |
type | 脆弱性攻撃のタイプ(遠隔操作、DoS、等) |
##Shodan Images
Shodan Imagesは、Shodanが収集したスクリーンショットを閲覧することができます。
スクリーンショットは下記の4パターンで収集します。
- VNC
- RTSP
- Webcam
- X Windows
それぞれのポートからスクリーンショットを収集しているため、例えばWebcamの情報を見たい場合HTTPで、VNCならauthentication disabledで、RTSPならそのままRTSPで検索してください。
スクリーンショットはメインのShodan検索でhas_screenshot:trueフィルタを用いて検索することもできます。
##練習問題: Website
省略
#外部ツール
##Shodan Command-Line Interface
Shodanコマンドラインインターフェース(CLI)はShodanのためのPythonライブラリです。
easy_install shodanでインストール
shodan init YOUR_API_KEYで初期化
###alert
APIを使って作成したアラートを一覧表示、クリア、削除するコマンド
###convert
Shodanが作成したJSON形式のデータを様々な形式に変換するコマンド
###count
検索結果のレコード数を返すコマンド
例:shodan count microsoft iis
###download
検索結果をJSON形式で返すコマンド、デフォルトでは1,000件、それ以上必要な場合は--limit flagを使用。
###host
ホストの位置情報、開放しているポート、IPを保有している組織などの情報を取得するコマンド
例:shodan host 189.201.128.250
###info
クレジットの残りなど、APIアカウントの情報を取得するコマンド
例:shodan info
###myip
自分のIPを返すコマンド
例:shodan myip
###parse
downloadコマンドでダウンロードしたファイルをパースし、必要な情報をフィルタリングするコマンド
下の例は以前ダウンロードしたMicrosoft-IISのデータからIP、ポート、組織を抽出してCSV形式で出力するコマンド。
例:shodan parse --fields ip_str,posr,org --separator ,microsoft-data.json.gz
###scan
Shodanを使ってネットワークスキャンを実行するコマンド
例:shodan scan submit 202.69.165.20
###search
Shodan検索を実行し、結果を表示するコマンド
例:shodan search --fields ip_str,port,org,hostnames microsoft iis 6.0
###stats
フィルタ条件について上位10の値とレコード数を表示するコマンド
例:shodan stats --facets country apache
###stream
Shodanのクローラーが収集する情報をリアルタイムで返すコマンド。多くのフラグがあるが、-datadirと-limitが主。
-datadirはストリームデータを保存するディレクトリ。
例:shodan stream --datadir /var/lib/shodan/
-limitはダウンロードするレコード数。
例:shodan stream --limit 100
-portsはカンマ区切りで収集対象のポートを指定。
例:shodan stream --ports 80,8080
##Maltegoアドオン
Maltegoはオープンソースの情報分析アプリケーションです。様々な情報の関連を可視化することができます。
ShodanのMaltegoアドオンには2つのエンティティ(ServiceとExploit)と5つのトランスフォームがあります。
- searchShodan
- searchShodanByDomain
- searchShodanByNetblock
- toShodanHost
- searchExploits
##ブラウザプラグイン
ChromeとFirefoxにプラグインが提供されています。
##練習問題
省略
#開発者向けAPI
Shodanは開発者向けにAPI(https://developer.shodan.io/api )を提供しています。
APIはREST APIとStreaming APIに分かれています。
REST APIはShodan検索、ホストの検索、サマリ情報取得および様々なユティリティメソッドを提供します。
Streaming APIはShodanが収集しているリアルタイムの生データを提供します。ストリーミングデータにはいくつかの購読可能なフィードがありますが、検索はできません。
##使用制限
プランによってAPIが制限を受けるパターンが3通りあります。
- 検索クレジット制限/月
- オンデマンドのスキャンクレジットの制限/月
- APIのプランに応じたネットワークアラートのIP数の制限
検索クレジットおよびスキャンクレジットは毎月リセットされます。
##ファセット
ファセット機能はバナー情報の特定のフィールドのファセット情報を提供します。
利用可能なファセットは付録Cを参照してください。
##利用開始
ここで紹介する例はPythonコードですが、ほかの言語でも利用可能です。
Shodanライブラリをインストールするには下記コマンドを実行してください。
easy_install shodan
既にインストールしてあり、アップデートしたい場合は、
easy_install -U shodan
##初期化
まずはShodanオブジェクトを初期化する必要があります。
import shodan
api = shodan.Shodan('YOUR API KEY')
##検索
まずapiオブジェクトでShodan.search()を呼びます。
results = api.search('apache')
以下省略
##Hostの検索
shodan.host()関数を使って特定のIPで利用可能なShodanのデータを見ることができます。
host = api.host('217.140.75.46')
以下省略
##スキャン
Shodanは少なくとも月1回インターネットをクロールしますが、すぐにクロールさせたい場合オンデマンドでクロールさせることができます。
scan = api.scan('198.20.69.0/24')
##リアルタイムストリーム
Streaming APIはリアルタイムでShodanが収集した情報を返すHTTPベースのサービスです。
以下省略
##ネットワークアラート
ネットワークアラートはShodanが収集したデータのリアルタイムフィードです。ネットワークアラートは2つのステップで実行できます。
ネットワークアラートの作成
alert = api.create_alert('Production network', '198.20.69.0/24')
サブスクライブ
以下省略
##例:パブリックなMongoDBの情報
省略
#産業制御システム(Industrial Control System、ICS)
産業制御システムはオフィスの冷房や発電所のタービン、劇場の電灯、工場のロボットなどを制御するシステムです。
##略語
ICS関連の略語を知っておくと便利でしょう。
略語 | 説明 |
---|---|
BMS | ビル管理システム |
DCS | 分散制御システム |
HMI | ヒューマンマシンインターフェイス |
ICS | 産業制御システム |
PLC | プログラマブルロジックコントローラ |
RTU | リモートターミナルユニット |
SCADA | 監視制御システム |
VNC | ヴァーチャルネットワークコンピューティング |
##プロトコル
インターネット上でICSを検索するには2つの方法があります。
1つはICS環境で使用される非ICSプロトコルです。Shodanに含まれるICSの情報の大部分は、ウェブサーバやその他の一般的なプロトコルから収集された、直接ICSとは関連していないけれどICSネットワークで確認される情報です。例えば、HMI上で実行されるウェブサーバや、ICSへの接続中に非認証のリモートデスクトップを実行するWindowsマシンです。
もう1つはICSのプロトコルです。これは制御システムが使用する生のプロトコルです。固有のバナー以外に認証不要という共通点があります。
##ネットに接続したICSのセキュリティ
大多数のICSのバナーには位置情報や所有者の情報は含まれず、それ故セキュアに保つのが困難で、何年もインターネットに露出したままになっています。もし危険な制御システムを見つけたらICS-CERTに報告してください。
##ユースケース
アメリカのICSにアクセスしてみましょう。
以下のクエリはインターネット上でICSプロトコルを実行している機器を返します。
https:// www.shodan.io/ search? query = category% 3Aics +-http +-html +-ssh +-ident + country% 3Aus
以下省略
#付録 A: バナー情報の仕様
##一般的なプロパティ
名称 | 説明 | 例 |
---|---|---|
asn | 自律システム番号 | AS4837 |
data | メインのバナー情報 | HTTP/1.1 200.. |
ip | IP(整数) | 493427495 |
ip_str | IP(文字列) | 199.30.15.20 |
ipv6 | IPv6(文字列) | 2001:4860:486 |
port | サービスのポート番号 | 80 |
timestamp | 情報収集した日付 | 2014-01-15T05: 49: 56.283713 |
hostnames | IPのホスト一覧 | [“ shodan.io”, “www.shodan.io”] |
domains | IPのドメイン一覧 | ["shodan.io"] |
link | ネットワークリンクタイプ | Ethernet or modem |
location | 機器の位置情報 | |
opts | メインのバナー情報に含まれない補足情報 | |
org | IPを保有する組織 | Google Inc. |
isp | IPを管理するISP | Verison Wireless |
os | OS | Linux |
uptime | アップタイム(分) | 50 |
transport | バナー情報収集に使用したプロトコル(udp/tcp) | tcp |
##HTTP(S)プロパティ
名称 | 説明 |
---|---|
html | ウェブサイトのHTMLコンテンツ |
title | ウェブサイトのtitle |
##位置情報のプロパティ
以下はlocationプロパティのサブプロパティ
名称 | 説明 |
---|---|
area_code | 機器の位置のエリアコード |
city | 都市の名称 |
country_code | 2文字の国コード |
country_code3 | 3文字の国コード |
country_name | 国名 |
dma_code | Designated market area code(アメリカのみ) |
latitude | 緯度 |
longitude | 経度 |
postal_code | 郵便番号 |
region_code | リージョンコード |
##SSLプロパティ
サービスがSSLを利用している場合、Shodanは下記プロパティの情報を収集します。
名称 | 説明 |
---|---|
ssl.cert | パースしたSSL証明書 |
ssl.cipher | SSL接続の暗号スイート |
ssl.chain | ユーザ証明書からルート証明書までの一連の証明書 |
ssl.dhparams | ディフィーヘルマンパラメータ |
ssl.versions | サポートしているバージョン |
##特別なプロパティ
_shodanプロパティにはどのように情報が収集されたのかという情報が含まれています。
##例
省略
#付録 B: 検索フィルタ一覧
##一般的なフィルタ
名称 | 説明 | 型 |
---|---|---|
after | dd/mm/yyyyより後の結果を返す | string |
asn | 自律システム番号 | string |
before | dd/mm/yyyyより前の結果を返す | string |
category | ics, malware | string |
city | 都市の名前 | string |
country | 2文字の国コード | string |
geo | 2~4個のパラメータを取る、2:緯度、経度 3:緯度、経度、範囲 4:左上の緯度、左上の経度、右下の緯度、右下の経度 | string |
has_ipv6 | True/False | boolean |
has_screenshot | True/False | boolean |
hostname | 機器のホスト名 | string |
html | ウェブバナーのHTML | string |
ip | netのエイリアス | string |
isp | ネットブロックを管理するISP | string |
net | CIDR記法のネットワーク範囲 | string |
org | ネットブロックを保有する組織 | string |
os | OS | string |
port | ポート番号 | string |
postal | 郵便番号(アメリカのみ) | string |
product | 製品名 | string |
region | 地域/州の名前 | string |
state | regionのエイリアス | string |
title | ウェブバナーのtitle | string |
version | 製品のバージョン | string |
vuln | 脆弱性のCVE ID | string |
##NTPフィルタ
名称 | 説明 | 型 |
---|---|---|
ntp.ip | monlistが返すIP | string |
ntp.ip_count | monlistが返すIPの数 | string |
ntp.more | True/False、monlistで収集するIPが更にあるかどうか | string |
ntp.port | monlistのIPが使用しているポート | string |
##SSLフィルタ
名称 | 説明 | 型 |
---|---|---|
has_ssl | True/False | boolean |
ssl | 全てのSSLデータ | string |
ssl.alpn | HTTP/2のようなプロトコル | string |
ssl.chain_count | チェーンに含まれる証明書の数 | integer |
ssl.version | SSLv2/SSLv3/TLSv1.1/TLSv1.2 | string |
ssl.cert.alg | 証明書のアルゴリズム | string |
ssl.cert.expired | True/False | boolean |
ssl.cert.extension | 証明書の拡張子 | string |
ssl.cert.serial | 整数/16新数のシリアル番号 | integer/string |
ssl.cert.pubkey.bits | パブリックキーのビット数 | integer |
ssl.cert.pubkey.type | パブリックキーのタイプ | string |
ssl.cipher.version | 暗号スイートのSSLバージョン | string |
ssl.cipher.bits | 暗号スイートのビット数 | integer |
ssl.cipher.name | 暗号スイートの名称 | string |
##Telnetフィルタ
名称 | 説明 | 型 |
---|---|---|
telnet.option | 全てのオプションを検索 | string |
telnet.do | クライアントにサポートを要求するオプション | string |
telnet.dont | クライアントに非サポートを要求するオプション | string |
telnet.will | サーバがサポートするオプション | string |
telnet.wont | サーバがサポートしないオプション | string |
#付録 C: 検索ファセット
説明は検索フィルタと一緒なので省略
##一般的なファセット
名称 | 説明 |
---|---|
asn | |
city | |
country | |
domain | |
as_screenshot | |
isp | |
link | |
org | |
os | |
port | |
postal | |
product | |
region | |
state | |
uptime | |
version | |
vuln |
##NTPファセット
名称 | 説明 |
---|---|
ntp.ip | |
ntp.ip_count | |
ntp.more | |
ntp.port |
##SSHファセット
名称 | 説明 |
---|---|
ssh.cipher | |
ssh.fingerprint | 機器のフィンガープリント |
ssh.mac | MACアルゴリズムの名称 |
ssh.type | 認証キーのタイプ |
##SSLファセット
名称 | 説明 |
---|---|
ssl.version | |
ssl.alpn | |
ssl.chain_count | |
ssl.cert.alg | |
ssl.cert.expired | |
ssl.cert.serial | |
ssl.cert.extension | |
ssl.cert.pubkey.bits | |
ssl.cert.pubkey | |
ssl.cipher.bits | |
ssl.cipher.name | |
ssl.cipher.version |
##Telnetファセット
名称 | 説明 |
---|---|
telnet.option | |
telnet.do | |
telnet.dont | |
telnet.will | |
te.net.wont |
#付録 D: ポート一覧
ポート | サービス |
---|---|
7 | Echo |
11 | Systat |
13 | Daytime |
15 | Netstat |
17 | 今日の一言 |
19 | 文字列生成(CHARGEN) |
21 | FTP |
22 | SSH |
23 | Telnet |
25 | SMTP |
26 | SSH |
37 | rdate |
49 | TACAS+ |
53 | DNS |
67 | DHCP |
69 | TFTP, BitTorrent |
79 | Finger |
80 | HTTP, マルウェア |
81 | HTTP, マルウェア |
82 | HTTP, マルウェア |
83 | HTTP |
84 | HTTP |
88 | Kerberos |
102 | Siemens S7 |
110 | POP3 |
111 | Portmapper |
119 | NNTP |
123 | NTP |
129 | Password generator protocol |
137 | NetBIOS |
143 | IMAP |
161 | SNMP |
175 | IBM Network Job Entry |
179 | BGP |
195 | TA14-353a |
311 | OS X Server Manager |
389 | LDAP |
443 | HTTPS |
444 | TA14-353a, Dell SonicWALL |
445 | SMB |
465 | SMTPS |
500 | IKE (VPN) |
502 | Modbus |
503 | Modbus |
515 | Line Printer Daemon |
520 | RIP |
523 | IBM DB2 |
554 | RTSP |
587 | SMTP mail submission |
623 | IPMI |
626 | OS X serialnumbered |
666 | Telnet |
771 | Realport |
789 | Redlion Crimson3 |
873 | rsync |
902 | VMWare authentication |
992 | Telnet (secure) |
993 | IMAP with SSL |
995 | POP3 with SSL |
1010 | malware |
1023 | Telnet |
1025 | Kamstrup |
1099 | Java RMI |
1177 | malware |
1200 | Codesys |
1234 | udpxy |
1434 | MS-SQL monitor |
1604 | Citrix, malware |
1723 | PPTP |
1833 | MQTT |
1900 | UPnP |
1911 | Niagara Fox |
1962 | PCworx |
1991 | malware |
2000 | iKettle, MikroTik bandwidth test |
2082 | cPanel |
2083 | cPanel |
2086 | WHM |
2087 | WHM |
2123 | GTPv1 |
2152 | GTPv1 |
2181 | Apache Zookeeper |
2222 | SSH, PLC5, EtherNet/ IP |
2323 | Telnet |
2332 | Sierra wireless (Telnet) |
2375 | Docker |
2376 | Docker |
2404 | IEC-104 |
2455 | CoDeSys |
2480 | OrientDB |
2628 | Dictionary |
3000 | ntop |
3306 | MySQL |
3386 | GTPv1 |
3388 | RDP |
3389 | RDP |
3460 | malware |
3541 | PBX GUI |
3542 | PBX GUI |
3689 | DACP |
3780 | Metasploit |
3787 | Ventrilo |
4000 | malware |
4022 | udpxy |
4040 | Deprecated Chef web interface |
4063 | ZeroC Glacier2 |
4064 | ZeroC Glacier2 with SSL |
4369 | EPMD |
4443 | Symantec Data Center Security |
4444 | malware |
4500 | IKE NAT-T (VPN) |
4567 | Modem web interface |
4911 | Niagara Fox with SSL |
4949 | Munin |
5006 | MELSEC-Q |
5007 | MELSEC-Q |
5008 | NetMobility |
5009 | Apple Airport Administration |
5060 | SIP |
5094 | HART-IP |
5222 | XMPP |
5269 | XMPP Server-to-Server |
5353 | mDNS |
5357 | Microsoft-HTTPAPI/2.0 |
5432 | PostgreSQL |
5577 | Flux LED |
5632 | PCAnywhere |
5672 | RabbitMQ |
5900 | VNC |
5901 | VNC |
5984 | CouchDB |
6000 | X11 |
6379 | Redis |
6666 | Voldemort database, malware |
6667 | IRC |
6881 | BitTorrent DHT |
6969 | TFTP, BitTorrent |
7218 | Sierra wireless (Telnet) |
7474 | Neo4j database |
7548 | CWMP (HTTPS) |
7777 | Oracle |
7779 | Dell Service Tag API |
8010 | Intelbras DVR |
8060 | Roku web interface |
8069 | OpenERP |
8087 | Riak |
8090 | Insteon HUB |
8099 | Yahoo SmartTV |
8112 | Deluge (HTTP) |
8139 | Puppet agent |
8140 | Puppet master |
8181 | GlassFish Server (HTTPS) |
8333 | Bitcoin |
8334 | Bitcoin node |
8334 | Bitcoin node dashboard (HTTP) |
8443 | HTTPS |
8554 | RTSP |
8880 | Websphere SOAP |
8888 | HTTP, Andromouse |
8889 | SmartThings Remote Access |
9001 | Tor OR |
9002 | Tor OR |
9051 | Tor Control |
9100 | Printer Job Language |
9151 | Tor Control |
9160 | Apache Cassandra |
9191 | Sierra wireless (HTTP) |
9443 | Sierra wireless (HTTPS) |
9595 | LANDesk Management Agent |
9600 | OMRON |
10001 | Automated Tank Gauge |
10243 | Microsoft-HTTPAPI/2.0 |
11211 | Memcache |
17185 | VxWorks WDBRPC |
12345 | Sierra wireless (Telnet) |
13579 | Media player classic web interface |
14147 | Filezilla FTP |
16010 | Apache Hbase |
18245 | General Electric SRTP |
20000 | DNP3 |
20547 | ProconOS |
21025 | Starbound |
21379 | Matrikon OPC |
23023 | Telnet |
23424 | Serviio |
25105 | Insteon Hub |
25565 | Minecraft |
27015 | Steam A2S server query, Steam RCon |
27017 | MongoDB |
28017 | MongoDB (HTTP) |
30718 | Lantronix Setup |
32400 | Plex |
37777 | Dahuva DVR |
44818 | EtherNet/ IP |
47808 | Bacnet |
49152 | Supermicro (HTTP) |
49153 | WeMo Link |
50070 | HDFS Namenode |
51106 | Deluge (HTTP) |
54138 | Toshiba PoS |
55553 | Metasploit |
55554 | Metasploit |
62078 | Apple iDevice |
64738 | Mumble |
#付録 E: SSLバナーのサンプル | |
省略 | |
#練習問題の解答 | |
省略 |