PythonからShodanを使って情報を収集する


Shodanとはインターネット上に存在するデバイスの情報を収集する検索エンジンです。
通常の検索エンジンとは異なりwebコンテンツを収集するのではなくOSのバージョンやサーバの種類などを収集のターゲットとしています。

このShodanをPythonから使った者は無限の可能性をその手にすると言われています。



準備


PythonからShodanを使用する場合、APIKEYを取得するためにShodanアカウントが必要です。

アカウントと言ってもユーザー名とパスワードとメールアドレス入れて終わりでした。
少なくとも僕が作った時は。

そしてPython用のShodanライブラリーをインストールします。

pip install shodan


これで準備が整いました。

使い方


まずは簡単なサンプルを作ります。

import shodan

api = shodan.Shodan(APIKEY)
try:
  result = api.search('ssh')
  print(result['total'])
  #print(result['matches'][0])
except:
  print("error")


実行するとこのようになります。

20161107


sshで検索をかけた結果合計20161107件の情報が見つかりました。
情報自体はmatchesの中に配列で入っています。

またhostメソッドを使うことで指定したホストの情報を取得することができます。

import shodan

api = shodan.Shodan("APIKEY")
try:
  result = api.host("34.207.230.178")
  for key in result.keys():
    print("{}: {}".format(key,result[key]))
except:
  print("error")


実行するとこのようになりました。

region_code: VA
ip: 584050354
postal_code: 20149
country_code: US
city: Ashburn
dma_code: 511
last_update: 2019-07-25T12:05:26.715379
vulns: [u'CVE-2019-0708']
latitude: 39.0481
tags: [u'cloud']
area_code: 703
country_name: United States
hostnames: [u'ec2-34-207-230-178.compute-1.amazonaws.com']
org: Amazon.com
data: 省略
asn: AS14618
isp: Amazon.com
longitude: -77.4728
country_code3: USA
ip_str: 34.207.230.178
os: None
ports: [9008, 20000, 3389, 9002, 9009, 445]


今回は二つサンプルを作りましたが、他にもいろいろできるようです。
https://developer.shodan.io/api

とにかくShodanはネットワークに接続されているサーバーやIotデバイスなどのありとあらゆる情報を集めているみたいです。
これからインターネットに接続される機器はさらに増えていくと思うので、
Shodanの使い方を知っていれば何かの役に立ちそうです。