RISKENを用いてWebサイトで使われている技術を確認する

2021/11/28に公開

先日、RISKENを更新し、新しいスキャン機能を追加しました。
新規に追加したのは、WebサイトのURLをRISKENに登録することでそのサイトで動いているツール・ミドルウェアを調査する機能[1]です。
主な用途として、以下のようなケースを想定しています。

  • 複数サイトの面倒を見る方が使用している技術情報を横断で確認できる
  • 脆弱性が出た際の影響を判断しやすくする

この記事では、RISKENでURLを登録し結果が出るまでの流れと内部で使用しているwappalyzerというツールについて簡単にご紹介したいと思います。

RISKENとは

RISKENとは、OSSのセキュリティツールやパブリッククラウド(AWS,GCP等)が提供しているセキュリティサービスを活用してシステムのセキュリティ状態を可視化するツールです。
詳細に関してはドキュメントあるいは、ogapanさんが立ち上げ方スキャン機能の説明をしてくださっているので、そちらをご覧いただければと思います。

スキャンの実行

立ち上げが完了して、RISKENへアクセスできることを前提として、ご説明いたします。

スキャンの設定

メニューから OSINT -> OSINT にて、スキャン対象を設定する画面へ遷移します。
dashboard

OSINTの画面で右上のNewボタンを押して、リソースタイプ[2]と対象とするURLを登録します。
osint

URLを登録した際に追加された列をクリックすることで、OSINTのデータソース画面へ遷移します。
osint_registered
osint_data_source

データソース画面では列をクリックすると、登録されている内容の詳細を確認できます。
この画面で、スキャンボタンをクリックすることで、スキャンが開始されます。
ステータスConfiguredになっていない場合には、先に有効化を押す必要があります。
osint_scan

結果の確認

スキャンが完了するとステータスOKへと変わります。
scan_finished

スキャンの結果を見るために、メニューからFinding画面に遷移します。
下記の画像のリソースにツール名が、説明にもう少し細かい情報が記載されます。
結果の一覧より、RISKENのドキュメントサイトはAWS上で動いていて、mkdocsで作られているというのが分かりますね!
finding

それぞれの列をクリックすることで、スキャンを実行して得られた詳細な情報を確認できます。
Websiteにmkdocsへのリンク、Categoriesからはそのツールがどんな属性なのかを把握できます。
finding_detail

また、Finding画面ではリソースでフィルタリングをかけることが可能です。
もし、複数のサイトから特定のツールを使っているサイトのみを表示したい場合には以下のようなフィルタリングをかけます。
finding_filter

ここまで、対象のWebサイトの登録から結果の確認までを行ってきました。
今後はツール、ミドルウェアのバージョンから、そのバージョンに脆弱性が存在しないかどうかをチェックしてスコアを増減させる機能も実現させたいと考えています。

wappalyzerとは

wappalyzerとは、Webサイトの技術を識別するツールです。
各ブラウザでの拡張機能やAPIに加えて、ソースコード、Dockerfileが提供されています。[3]

個人的には、以下のような用途で複数の使い方をしています。

  • 今アクセスしているサイトが何で作られているかを確認するために拡張機能
  • 複数のサイトをまとめて調査するためのCLI/API

ここからは、以下の2つを説明しようと思います。

  • ソースコードをpullして、スキャンを行うまで
  • wappalyzerが何をやっているのかを簡単に

wappalyzerを実行する

GitHubに記載されているのREADMEの通りに行えば、簡単に実行できます。
以下の手順は記事作成当時のものになりますので、動作しない場合などにはそちらの手順をご確認ください。
下記の手順で、wappalyzerを使用できるようになります。

git clone https://github.com/AliasIO/wappalyzer.git
cd wappalyzer
yarn install
yarn run link

実行する際には、対象とするURLを引数とします。

node src/drivers/npm/cli.js https://docs.security-hub.jp/

上記の通りに実行した際には、以下のような結果を得ることができました。

{"urls":{"https://docs.security-hub.jp/":{"status":200}},"technologies":[{"slug":"mkdocs","name":"MkDocs","confidence":100,"version":"1.2.2","icon":"mkdocs.png","website":"http://www.mkdocs.org/","cpe":null,"categories":[{"id":4,"slug":"documentation","name":"Documentation"}]},{"slug":"mermaid","name":"Mermaid","confidence":100,"version":null,"icon":"default.svg","website":"https://mermaidjs.github.io/","cpe":null,"categories":[{"id":25,"slug":"javascript-graphics","name":"JavaScript graphics"}]},{"slug":"amazon-web-services","name":"Amazon Web Services","confidence":100,"version":null,"icon":"aws.svg","website":"https://aws.amazon.com/","cpe":null,"categories":[{"id":62,"slug":"paas","name":"PaaS"}]},{"slug":"nginx","name":"Nginx","confidence":100,"version":null,"icon":"Nginx.svg","website":"http://nginx.org/en","cpe":"cpe:/a:nginx:nginx","categories":[{"id":22,"slug":"web-servers","name":"Web servers"},{"id":64,"slug":"reverse-proxies","name":"Reverse proxies"}]},{"slug":"unpkg","name":"Unpkg","confidence":100,"version":null,"icon":"Unpkg.png","website":"https://unpkg.com","cpe":null,"categories":[{"id":31,"slug":"cdn","name":"CDN"}]},{"slug":"google-font-api","name":"Google Font API","confidence":100,"version":null,"icon":"Google Font API.png","website":"http://google.com/fonts","cpe":null,"categories":[{"id":17,"slug":"font-scripts","name":"Font scripts"}]},{"slug":"google-tag-manager","name":"Google Tag Manager","confidence":100,"version":null,"icon":"Google Tag Manager.svg","website":"http://www.google.com/tagmanager","cpe":null,"categories":[{"id":42,"slug":"tag-managers","name":"Tag managers"}]},{"slug":"google-remarketing-tag","name":"Google Remarketing Tag","confidence":100,"version":null,"icon":"Google Tag Manager.svg","website":"https://support.google.com/google-ads/answer/2476688","cpe":null,"categories":[{"id":77,"slug":"retargeting","name":"Retargeting"}]},{"slug":"google-analytics","name":"Google Analytics","confidence":100,"version":null,"icon":"Google Analytics.svg","website":"http://google.com/analytics","cpe":null,"categories":[{"id":10,"slug":"analytics","name":"Analytics"}]},{"slug":"aws-certificate-manager","name":"AWS Certificate Manager","confidence":100,"version":null,"icon":"aws.svg","website":"https://aws.amazon.com/certificate-manager/","cpe":null,"categories":[{"id":70,"slug":"ssl-tls-certificate-authorities","name":"SSL/TLS certificate authorities"}]}]}

jsonの文字列が返却され、technologiesにサイトで使用されている技術が含まれています。

今回は使用しませんでしたが、オプションは以下のコマンドで確認可能です。

node src/drivers/npm/cli.js -h

例としていくつか記載しますが、オプションを使用することでより便利な使い方ができます。

  • -P, --pretty: 出力結果のjsonを整形する
  • -r, --recursive: サイトのクローリングを行う

wappalyzerの動き

実際に、wappalyzerが行っている内容を3行で説明すると下記の通りです。

  1. ヘッドレスブラウザを使用して、対象のWebサイトにアクセス
  2. アクセスした結果を解析
  3. 解析した結果、技術ごとに特定の文字列が含まれている場合にそれを使用していると判定

wappalyzerで検出可能な技術もGitHub上で管理されており、その数およそ3000にも及びます。

まとめ

以下の2つについて、ご説明させていただきました。

  • RISKENの更新で、Webサイトの技術情報を調査することができるようになりました
  • wappalyzerというツールで、Webサイトの技術を調査できます

RISKENでは、他にも様々な機能を兼ね備えています。
ぜひ、ドキュメントなどをご確認いただき使ってみていただければ幸いです。

wappalyzerも使い方様々、導入も簡単で楽しいツールです。
こちらもぜひ試していただければと思います。

脚注
  1. 今回追加した機能では実際にWebサイトにアクセスして情報を取得します。
    そのため、外見えしていないツールに関しての情報まで取得してくることはできません。
    もし内部でツール・ミドルウェアの情報を収集し可能ならばより細かく管理することが可能でしょう。 ↩︎

  2. 記事執筆時点で、RISKENではWebsiteとDomainのリソースタイプが指定可能です。
    Domainのリソースタイプでは、サブドメインのセキュリティリスクを収集します。
    詳細は、こちらをご確認ください。 ↩︎

  3. RISKENでは、ソースコードからビルドして使用しています ↩︎

Discussion