セキュリティチェックに「Censys」を使ったら便利だった件について

# はじめに
ネットワーク機器やサーバでは、様々なサービスが稼働をしていますが、時には利用者・運用者が意識していない（意図しない）サービスが稼働したままとなっており、脆弱性を利用され「侵入による情報漏洩」や「DDoSのBOTとして利用 ※」されることがあります。
※ 近年ではIoT機器がBOTとしてDDoSの攻撃元として利用される事例が非常に多い
<br>
FWや閉域網での利用により外部へ公開されていないものそこまでリスクはありませんが、グローバルIPアドレスを持ち、インターネット上からアクセスが可能な機器やサービスは、常にリスクに晒されている状態です。
<br>
とはいえ、日々の運用の中でそれらを定期的に確認する事は手間もかかり難しく、簡単にチェックが出来る方法が無いかと思い、以下のサービスを利用して確認をしてみました。


# サービス
自分で検索するタイプ　**←今回はこちらを紹介します**

- Censys
- Shodan


定期的にメール通知されるタイプ
* ShadowServer
<br>

:::note info
Censys／Shodan

ウェブサーバやIoT機器など、インターネットに接続している機器を調査できるウェブサービスとして、SHODANやCensysなどがある。SHODANはポートスキャンにより接続している機器を特定し、特定した機器に対してバナーチェックを行う事により、機器の情報を得ている。SHODANの利用者が例えば東京にあるApacheサーバの一覧を得たければ、SHODANに「apatch city:Tokyo」と打ち込んで検索する事ができる。また、SHODAN MAPSの機能により、検索した機器の位置を地図上に表示可能である。 バナー情報により、検索結果には製品名やバージョン等もわかるため、攻撃者はこれを利用して脆弱性が適用可能な機器を見つける事ができる。なお、SHODANを使うには事前にユーザ登録が必要であり、基本無料であるものの全機能を使うには低額の利用料を支払う必要がある。 CensysはZmapというネットワークスキャナでIPv4のインターネット空間をスキャンして情報を収集し、ZGrabというプロトコル解析ライブラリにより収集したデータを構造化データに加工する。なお、ZmapがIPv4のアドレス空間全てをスキャンするのにかかる時間は45分に過ぎない。 Censysは無料で利用でき、ユーザ登録は必須ではないが、登録していないユーザは1日4回までしか検索できない。Censysはミシガン大学の研究者らが公開したものである。
※Weblio 辞書（https://www.weblio.jp/content/SHODAN%E3%81%A8Censys）より引用
:::

# 実際にやってみよう
今回は例として、Cloudflareさんが提供しているOpenDNSで有名な「1.1.1.1」を検索してみました
<br>

Censys
![image2022-11-25_13-47-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428693/f22b6d40-bb74-835b-80a2-c959461c9eb1.png)

Shodan
![image2022-11-25_13-48-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428693/19cd1c9c-8158-3704-d2a8-8db80bf696ba.png)


このようにオープンとなっているポートの情報が見られます。
<br>
1個ずつIPアドレスを指定して検索も良いですが、利用しているIPアドレスが多い場合は検索が大変なので、検索方法をちょっと変えてみましょう。

Censys/Shodanでは、ネットワークアドレス単位やASNでの検索にも対応しています。
※Shodanは登録してLoginしないと「net」や「asn」での検索は出来ません

<table>
<tr><td><td>ネットワークアドレス単位<td>ASN
<tr><td>Censys
<td>

![image2022-11-25_14-13-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428693/f753303c-47a1-8b69-0b74-86d6d534ddb2.png)
<td>

![image2022-11-25_14-17-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428693/2194fced-6eda-cc2c-3ada-68bb5e3803ce.png)
<tr><td>Shodan
<td>

![image2022-11-25_14-13-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428693/aaf5982b-4e67-6c4a-83ce-c63873db0d6c.png)
<td>

![image2022-11-25_14-17-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428693/4217a580-aff2-1d44-617e-42ba1bd7facc.png)
</table>

<br>
<br>

また、APIにも対応しているため、例えばPythonでJSON抽出なんかも出来たりします。
※なお、ShodanはASN単位での検索には有償プランが必要となるため、今回はCensysで確認しています。

<br>
<br>

私の利用例だと、APIからJSONで抽出・CSV変換をし、Excelで自社のIPアドレス管理表と突き合わせて対象の確認を行っています。（数百、数千のアドレス一個一個を手動ではチェックは出来ない…:sweat_smile:）

<br>
<br>

公式でAPIリファレンスや、Pythonスクリプトが公開されているので調べてみてください。

:::note 
公式リファレンス
- https://developer.shodan.io/api
- https://support.censys.io/hc/en-us/articles/4409573673236-Search-2-0-API-Quick-Start

Python
- https://shodan.readthedocs.io/en/latest/
- https://github.com/censys/censys-python
- https://censys-python.readthedocs.io/en/stable/
:::

<br>
<br>

# 便利なサイト

超便利なサイトも併せて紹介しておきます。

https://www.convertcsv.com/json-to-csv.htm

私のように自分でJSONを処理出来ない人間は、CSVになってくれると使い慣れたExcelで扱えるため非常に便利です。

<br>
<br>

ただ、単純に変換すると、IPアドレス単位でServices要素に複数オブジェクトが抽出されるため、Excel比較する際にかなり不便ですが、 上記サイトで「 Pivot data down instead of flattening」にチェックして変換すると、Services要素ごとに複数IPアドレス＋Services要素の形に整形してくれます。


例えばこんなJSON

```
[
  {
    "ip": "1.1.1.1",
    "services": [
      {
        "port": 53,
        "service_name": "DNS",
        "transport_protocol": "UDP"
      },
      {
        "port": 80,
        "service_name": "HTTP",
        "transport_protocol": "TCP"
      },
      {
        "port": 443,
        "service_name": "HTTP",
        "certificate": "666773198478030c56fb23768e4819c2b75c322cd3bea4a8346bb03c228d4f18",
        "transport_protocol": "TCP"
      },
      {
        "port": 853,
        "service_name": "UNKNOWN",
        "certificate": "666773198478030c56fb23768e4819c2b75c322cd3bea4a8346bb03c228d4f18",
        "transport_protocol": "TCP"
      }
    ],
    "location": {
      "country_code": "",
      "postal_code": "",
      "timezone": "",
      "coordinates": {
        "latitude": 0.0,
        "longitude": 0.0
      },
      "registered_country": "Australia",
      "registered_country_code": "AU"
    },
    "autonomous_system": {
      "asn": 13335,
      "description": "CLOUDFLARENET",
      "bgp_prefix": "1.1.1.0/24",
      "name": "CLOUDFLARENET",
      "country_code": "US"
    },
    "last_updated_at": "2022-11-24T13:38:19.938Z",
    "dns": {
      "reverse_dns": {
        "names": [
          "one.one.one.one"
        ]
      }
    }
  }
]
```

普通にCSV変換するとこうなるが
```
ip,services/0/port,services/0/service_name,services/0/transport_protocol,services/1/port,services/1/service_name,services/1/transport_protocol,services/2/port,services/2/service_name,services/2/certificate,services/2/transport_protocol,services/3/port,services/3/service_name,services/3/certificate,services/3/transport_protocol,location/country_code,location/postal_code,location/timezone,location/coordinates/latitude,location/coordinates/longitude,location/registered_country,location/registered_country_code,autonomous_system/asn,autonomous_system/description,autonomous_system/bgp_prefix,autonomous_system/name,autonomous_system/country_code,last_updated_at,dns/reverse_dns/names/0
1.1.1.1,53,DNS,UDP,80,HTTP,TCP,443,HTTP,666773198478030c56fb23768e4819c2b75c322cd3bea4a8346bb03c228d4f18,TCP,853,UNKNOWN,666773198478030c56fb23768e4819c2b75c322cd3bea4a8346bb03c228d4f18,TCP,,,,0,0,Australia,AU,13335,CLOUDFLARENET,1.1.1.0/24,CLOUDFLARENET,US,2022-11-24T13:38:19.938Z,one.one.one.one
```

神サイトで変換時に「 Pivot data down instead of flattening」にチェックを付けて変換するとこうなる。
```
ip,services/0/port,services/0/service_name,services/0/transport_protocol,location/country_code,location/postal_code,location/timezone,location/coordinates/latitude,location/coordinates/longitude,location/registered_country,location/registered_country_code,autonomous_system/asn,autonomous_system/description,autonomous_system/bgp_prefix,autonomous_system/name,autonomous_system/country_code,last_updated_at,dns/reverse_dns/names/0
1.1.1.1,53,DNS,UDP,,,,0,0,Australia,AU,13335,CLOUDFLARENET,1.1.1.0/24,CLOUDFLARENET,US,2022-11-24T13:38:19.938Z,one.one.one.one
1.1.1.1,80,HTTP,TCP,,,,0,0,Australia,AU,13335,CLOUDFLARENET,1.1.1.0/24,CLOUDFLARENET,US,2022-11-24T13:38:19.938Z,
1.1.1.1,443,HTTP,TCP,,,,0,0,Australia,AU,13335,CLOUDFLARENET,1.1.1.0/24,CLOUDFLARENET,US,2022-11-24T13:38:19.938Z,
1.1.1.1,853,UNKNOWN,TCP,,,,0,0,Australia,AU,13335,CLOUDFLARENET,1.1.1.0/24,CLOUDFLARENET,US,2022-11-24T13:38:19.938Z,
```
超便利！:heart_eyes:

上記データを元に、不要なポートが空いていないかチェックをし、必要に応じて対策を行っています。

<br>
<br>

# 終わりに
日々のセキュリティチェックは非常に大変ですが、少しでも楽にチェックが出来ないかという事で、色々と組み合わせてやってみました。

<br>
<br>

少しでも参考になれば幸いです:smile: