WhatWeb ツール調査

1.はじめに

このブログは、株式会社Armorisアルバイトのsekkiが書いています。 あるもりすぶろぐの内容は個人の意見です。

今回は、whatwebというツールの調査・検証を行います。 検証を行う場合は自身の管理する環境を使用し、本情報を用いたツールの悪用は絶対に行わないでください。

2.whatwebの概要

[2-1]whatwebとは

・whatwebは、webサイトをスキャンして、そのサイトで使用されているアプリの種類やバージョン、プラグインIPアドレスなどの情報を解析するツールです。

・このツールはスキャン対象のサイトに対してHTTPリクエストを送ることで分析を行うため、今回はローカル環境のサーバを用いて検証を行いました。

githubリポジトリページ
https://github.com/urbanadventurer/WhatWeb

3.検証環境

[3-1]検証環境

・以下3つのサーバにて、ツールの検証を行いました。

[スキャン実行サーバ]
・OS:ubuntu server edition 20.04  
・Webサーバー:Apache/2.4.41 (Ubuntu)  
・DB:mysql Ver 8.0.42-0ubuntu0.20.04.1  
・PHP:7.4.3-4ubuntu2.29  
・Wordpress:6.8.2

[スキャン対象サーバ1]
・OS:ubuntu server edition 20.04  
・Webサーバー:Apache/2.4.41 (Ubuntu)  
・DB:mysql Ver 8.0.42-0ubuntu0.20.04.1  
・PHP:7.4.3-4ubuntu2.29  
・Wordpress:6.8.2  
・IPアドレス:192.168.56.201

[スキャン対象サーバ2]
・OS:ubuntu server edition v20.04  
・Webサーバー:Apache v2.4.41 (Ubuntu)  
・DB:mysql v8.0.42-0ubuntu0.20.04.1  
・PHP:php v7.4.3-4ubuntu2.29  
・CMS : なし  
・IPアドレス:192.168.56.203

4.インストール手順

[4-1]whatwebのインストール

・以下コマンドを実行

# ホームディレクトリに移動
cd /home/sekki/ 

# パッケージ更新
sudo apt update

# whatweb をgithubからクローン
git clone https://github.com/urbanadventurer/WhatWeb.git

# 必要なパッケージをインストール
sudo apt install -y git ruby ruby-dev build-essential libyaml-dev
# 動作にはRuby環境が必要なため、Ruby関連のパッケージをインストール

# bundler をインストール
sudo gem install bundler

# 必要なgemを一括インストール
bundle install

# 動作確認 
./whatweb --help
# ヘルプが表示されればインストール成功

5.機能

[5-1]機能一覧

①webサイトの情報をスキャン
・webサーバやCMSの種類,バージョン
javascriptライブラリやフレームワーク
・HTMLのバージョン
・HTTP ヘッダ情報やメタタグ情報

②スキャン強度の指定
 ・-a オプションを用いて、Stealthy / Agressive / Heavy の3段階でスキャン強度を指定可能

③詳細情報の表示
・-v オプションを用いて、各項目についての詳細な情報を表示する

④出力形式の指定
・--log-xxx オプションを用いて、指定の形式(xml,csv,json形式 など)でスキャン結果を出力する

・この他にも、指定した特定のプラグインだけを用いてスキャンを行う機能や、単純なホスト名に対してHTTPとHTTPSを両方でスキャンを行う2重プロトコルスキャン機能など たくさんの機能があります。

6.実際に動かしてみる、実行例(コードの実行と結果)

[6-1]デフォルト設定でのスキャン

基本的な使い方
・デフォルト設定(オプションなし)でのウェブサイトのスキャンを行う。

whatweb [スキャン対象URL]

使用例
・以下コマンドを実行

whatweb http://192.168.56.201

・結果

http://192.168.56.201 [200 OK] 
Apache[2.4.41]
# webサーバの種類,バージョン

Country[RESERVED][ZZ]
# どこの国のIPアドレスなのか

HTML5
# ページが何で書かれているか

HTTPServer[Ubuntu Linux]
[Apache/2.4.41 (Ubuntu)]
# OS,使用しているソフト

IP[192.168.56.201]
JQuery[3.7.1]
# 使用されているJavaScriptライブラリ

MetaGenerator[WooCommerce 10.1.2,WordPress 6.8.2]
# CMSに導入されているプラグイン

Script[importmap,module,speculationrules]
# スプリクトタグの属性や種類

Title[20250905]
# ページのタイトル

UncommonHeaders[link]
# 標準的ではないHTTPヘッダの情報

WordPress[6.8.2]
# 使用されているCMS

[6-2]詳細表示オプションを使用したスキャン

基本的な使い方
・-v(verbose)オプションを追加することで、スキャン結果について、より詳細な情報を表示することができる。

whatweb -v [スキャン対象URL]

使用例
・以下コマンドを実行

whatweb -v http://192.168.56.201

・結果(一部抜粋)

備考
・最初に表示されるsummaryセクションまでは、通常スキャン結果で得られる情報と違いが見られなかったが、それ以降のセクションにおいては、各検出項目のより詳細な情報が記載されていた。例えば、apachejqueryの公式サイトURL、google dorks(該当技術をgoogle検索するための構文) などの追加情報が含まれており、通常スキャンよりも多くの情報を確認することができた。

[6-3]複数サイトをまとめてスキャン

基本的な使い方
・サイトのURLを含んだテキストファイルを作成しそのファイルを読み込むことで、複数サイトをまとめてスキャンすることができる。

# URLリストを作成
echo "[スキャン対象URL1]" > urls.txt
# urls.txt を作成し、1行目にURL1を追加
echo "[スキャン対象URL2]" >> urls.txt
# urls.txt の末尾にURL2を追加

# スキャン実行
whatweb -i urls.txt

使用例 ・以下コマンドを実行

# URLリストを作成
echo "http://192.168.56.201" > urls.txt
# urls.txt を作成し、1行目にURLを追加
echo "http://192.168.56.203" >> urls.txt
# urls.txt の末尾にURLを追加

# スキャン実行<br>
whatweb -i urls.txt

・結果

http://192.168.56.203 [200 OK] Apache[2.4.41], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[192.168.56.203], Title[Apache2 Ubuntu Default Page: It works]
http://192.168.56.201 [200 OK] Apache[2.4.41], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[192.168.56.201], JQuery[3.7.1], MetaGenerator[WooCommerce 10.1.2,WordPress 6.8.3], Script[importmap,module,speculationrules], Title[20250905], UncommonHeaders[link], WordPress[6.8.3]

・リストに含まれている2つのURL(webサイト)へのスキャン結果を確認することができた。

[6-4]出力形式を指定してスキャン

基本的な使い方
・以下のように出力形式を指定して、スキャン結果を出力することができる。

whatweb --log-xxx=[ファイル名] [スキャン対象URL]
# xxx : ファイルの出力形式

使用例
・以下コマンドを実行

# 実行
whatweb --log-xml=result_xml.xml http://192.168.56.201
# --log-xml : xml形式でスキャン結果(ログ)をファイルに出力して(書き出して)保存

・結果

# 結果 出力されたログの中身(result_xml.xml)
<log>
<target>
    <uri>http://192.168.56.201</uri>
    <http-status>200</http-status>
    <request-config>
        <header>
            <header-name>User-Agent</header-name>
            <header-value>WhatWeb/0.5.0</header-value>
        </header>
    </request-config>
    <plugin>
        <name>JQuery</name>
        <version>3.7.1</version>
    </plugin>
    <plugin>
        <name>Script</name>
        <string>importmap</string>
        <string>module</string>
        <string>speculationrules</string>
    </plugin>
    <plugin>
        <name>Country</name>
        <string>RESERVED</string>
        <module>ZZ</module>
    </plugin>
    <plugin>
        <name>IP</name>
        <string>192.168.56.201</string>
    </plugin>
    <plugin>
        <name>Apache</name>
        <version>2.4.41</version>
    </plugin>
    <plugin>
        <name>Title</name>
        <string>20250905</string>
    </plugin>
    <plugin>
        <name>HTTPServer</name>
        <os>Ubuntu Linux</os>
        <string>Apache/2.4.41 (Ubuntu)</string>
    </plugin>
    <plugin>
        <name>WordPress</name>
        <version>6.8.3</version>
    </plugin>
    <plugin>
        <name>MetaGenerator</name>
        <string>WooCommerce 10.1.2</string>
        <string>WordPress 6.8.3</string>
    </plugin>
    <plugin>
        <name>HTML5</name>
    </plugin>
    <plugin>
        <name>UncommonHeaders</name>
        <string>link</string>
    </plugin>
</target>
</log>

・指定した形式(xml形式)でファイルが書き出されていることが確認できた。

使用例 ・以下コマンドを実行

# 実行
whatweb --log-json=result_json.json http://192.168.56.201
# json : javascriptと似たような情報の形式
# --log-json : json形式でスキャン結果(ログ)をファイルに書き出して保存

・結果

# 結果 出力されたログの中身(result_json.json)
[
{"target":"http://192.168.56.201","http_status":200,"request_config":{"headers":{"User-Agent":"WhatWeb/0.5.0"}},"plugins":{"JQuery":{"version":["3.7.1"]},"Script":{"string":["importmap","module","speculationrules"]},"Country":{"string":["RESERVED"],"module":["ZZ"]},"IP":{"string":["192.168.56.201"]},"Apache":{"version":["2.4.41"]},"Title":{"string":["20250905"]},"HTTPServer":{"os":["Ubuntu Linux"],"string":["Apache/2.4.41 (Ubuntu)"]},"WordPress":{"version":["6.8.3"]},"MetaGenerator":{"string":["WooCommerce 10.1.2","WordPress 6.8.3"]},"HTML5":{},"UncommonHeaders":{"string":["link"]}}},
{}
]

・指定した形式(json形式)でファイルが書き出されていることが確認できた。

[6-5]強度を変更してスキャン

基本的な使い方

・whatwebでは、aオプションを用いることでスキャンの強度を設定することができる。
・強度には、Stealthy ステルシー 1 / Aggressive アグレッシブ 3 / Heavy ヘビー 4 の3段階がある。
・これら3段階のスキャンを行い、どういった違いがでるのかを検証した。

whatweb -a 1 [スキャン対象URL]
whatweb -a 3 [スキャン対象URL]
whatweb -a 4 [スキャン対象URL]

使用例
・以下コマンドを実行

# 強度1スキャン
whatweb -a 1 http://192.168.56.201
# 強度3スキャン
whatweb -a 3 http://192.168.56.201
# 強度4スキャン
whatweb -a 4 http://192.168.56.201

# 強度1スキャン+詳細表示
whatweb -v -a 1 http://192.168.56.201
# 強度3スキャン+詳細表示
whatweb -v -a 3 http://192.168.56.201
# 強度4スキャン+詳細表示
whatweb -v -a 4 http://192.168.56.201

・結果
→それぞれの実行結果に全く違いが見られなかったため、強度1スキャン時の結果(一部抜粋)のみを示します。

備考
・スキャン強度を変えても結果には全く変化が無かった。おそらく、サーバ側にこれ以上追加で検出できる要素がなかったことが原因として考えられる。

・なので、次の章では異なる強度でスキャンしたときのサーバ側への負担を測ることで、各スキャン強度の違いについて確認してみる。

7.スキャン強度に関する検証

[7-1]強度を変更してスキャン、サーバへの負担を比較

概要
・ここでは、「スキャン強度が変化することでサーバ側の負担に違いが生じているのか」を以下の4つの観点から検証した。

1.スキャン実行サーバのスキャン実行時間
2.スキャン対象サーバのTCP同時接続数
3.スキャン対象サーバのアクセスログ増分
4.スキャン対象サーバの受信データ量

1.スキャン実行時間

・スキャン実行時にtimeコマンドを用いて、各スキャン強度によって実行時間にどの程度変化があるか を比較する

・以下コマンドを実行

# スキャン強度1のとき<br>
time whatweb -a 1 http://192.168.56.201

# スキャン強度3のとき<br>
time whatweb -a 3 http://192.168.56.201

# スキャン強度4のとき<br>
time whatweb -a 4 http://192.168.56.201

・結果

スキャン強度 実行時間 (秒)
1 21
3 40
4 426

備考 ・スキャン強度と実行時間は強く関係していることがわかった。特に、スキャン強度4については、スキャン強度1に比べて約20倍、スキャン強度2に比べて11倍と、実行時間に大きな違いが確認できた。

2.スキャン対象サーバのTCP同時接続数

概要 [スキャン実行サーバ]において、ssコマンドを用いて、スキャン中に確立されるTCP同時接続数 がどのように変化するか を比較する

1秒ごとにサンプリングを行い、TCP同時接続数をログに表示する

・以下コマンドを実行

# スキャン強度1のとき
[スキャン実行サーバにて]
whatweb -a 1 http://192.168.56.201
[スキャン対象サーバにて]
while true; do   ss -t state established | grep 192.168.56.201 | wc -l;   sleep 1; done

# スキャン強度3のとき
[スキャン実行サーバにて]
whatweb -a 3 http://192.168.56.201
[スキャン対象サーバにて]
while true; do   ss -t state established | grep 192.168.56.201 | wc -l;   sleep 1; done


# スキャン強度4のとき
[スキャン実行サーバにて]
whatweb -a 4 http://192.168.56.201
[スキャン対象サーバにて]
while true; do   ss -t state established | grep 192.168.56.201 | wc -l;   sleep 1; done

・結果

スキャン強度 総サンプル数 TCP接続数1 表示回数 TCP接続数2 表示回数 TCP接続数4 表示回数
1 21 20 0 1
3 53
50 2 1
4 436 420 9 7

備考 ・スキャン強度があがるにつれて、総サンプル数は急激に増加した。しかし、サンプルの9割以上で同時接続数は1であり、この傾向はどのスキャン強度でもあまり変わらなかった。なので、スキャン強度によって同時接続数が大きく変動することはないことがわかった。

3.スキャン対象サーバのアクセスログ増分

概要 ・[スキャン対象サーバ]において、スキャン前と後のアクセスログ行数で差分をとり、スキャン時のログ行数の増加量を比較した。サーバがHTTPリクエストを1回受け取るごとにアクセスログが1行増えるため、この比較を行うことで、スキャン時にサーバが受け取ったリクエスト数がわかる。

・以下コマンドを実行

# スキャン強度1のとき
[スキャン対象サーバにて]
wc -l /var/log/apache2/access.log
[スキャン実行サーバにて]
whatweb -a 1 http://192.168.56.201

# スキャン強度3のとき
[スキャン対象サーバにて]
wc -l /var/log/apache2/access.log
[スキャン実行サーバにて]
whatweb -a 3 http://192.168.56.201

# スキャン強度4のとき
[スキャン対象サーバにて]
wc -l /var/log/apache2/access.log
[スキャン実行サーバにて]
whatweb -a 4 http://192.168.56.201

・結果

スキャン強度 アクセスログの増分(行) 強度1を基準にしたときの相対値
1 2 1
3 44 22
4 682 341

備考 ・スキャン強度をあげるほどリクエスト数が増え、それに伴ってスキャン対象サーバ側の負担が大きくなることが確認できた。スキャン強度1→4にかけてアクセスログ増分は341倍となっていて、指数的にリクエスト数が増えていることがわかる。

4.スキャン対象サーバの受信データ量

概要 [スキャン対象サーバ]において、rx_bytes で起動時からシステムが受信した総バイト数を確認できる。 そこで、スキャン実行前後の差分をとることで、スキャン時にサーバが受信したデータ量を算出した。

・以下コマンドを実行

# スキャン強度1のとき
[スキャン対象サーバにて]
cat /sys/class/net/enp0s8/statistics/rx_bytes
whatweb -a 1 http://192.168.56.201
cat /sys/class/net/enp0s8/statistics/rx_bytes

# スキャン強度3のとき
[スキャン対象サーバにて]
cat /sys/class/net/enp0s8/statistics/rx_bytes
whatweb -a 3 http://192.168.56.201
cat /sys/class/net/enp0s8/statistics/rx_bytes

# スキャン強度4のとき
[スキャン対象サーバにて]
cat /sys/class/net/enp0s8/statistics/rx_bytes
whatweb -a 4 http://192.168.56.201
cat /sys/class/net/enp0s8/statistics/rx_bytes

結果

スキャン強度 バイト数の増分 (bytes) スキャン強度1を基準としたときの相対値
1 1,625 1.0
3 28,883 17.8
4 416,175 256.1

備考 ・スキャン強度を上げると、受信データ量はアクセスログの増加と似たように指数関数的に増加していくことが確認できた。

8.アクセスログの分析

[8-1]アクセスログの分析

概要

whatwebによる通常スキャンを行い、スキャン対象サーバ上のアクセスログを確認することで、whatwebによるスキャンは検知可能なのか について確認した。

手法

1.[スキャン対象サーバにて]アクセスログのリセット(削除→新規作成)を行う
2.[スキャン実行サーバにて]スキャンの実行
3.[スキャン対象サーバにて]スキャン後のアクセスログを確認

検証1(通常スキャン)

・以下コマンドを実行

[スキャン対象サーバにて]
sudo rm -rf /var/log/apache2/access.log
# アクセスログ削除
sudo systemctl reload apache2
# 再生成
[スキャン実行サーバにて]
whatweb http://192.168.56.201
# 通常スキャン実行


・結果
→スキャン対象サーバにてアクセスログを確認

検証2(user-agentの指定)

・以下コマンドを実行

[スキャン実行サーバにて]
whatweb -U "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:144.0) Gecko/20100101 Firefox/144.0" http://192.168.56.201
# -U : user-agentを指定
# user-agent文字列には、firefoxから通常アクセスした時のものを使用した


・結果
→スキャン対象サーバにてアクセスログを確認

備考

検証1において、user-agentフィールドを見ることでwhatwebによるスキャンの痕跡("WhatWeb/0.5.0")を確認することができた。しかし、検証2のように-Uオプションを用いることでuser-agentをカスタマイズすることが可能なため、その場合は通常アクセスとスキャンの見分けがつかなくなることが分かった。

[8-2]アクセスログを分析(各種スキャン実行時)

概要

・スキャン対象サーバがホストしているウェブサイトがスキャンされたとき、各強度においてどのような痕跡が残るのかについて、集中アクセスを行っているIPアドレスや404エラー発生件数などの観点から、3つのコマンドを用いて検証した。

手法

1.[スキャン対象サーバにて]アクセスログのリセット(削除→新規作成)を行う
2.[スキャン実行サーバにて]スキャンの実行
3.[スキャン対象サーバにて]スキャン後のアクセスログを分析

1.IP別アクセス数の分析

以下コマンドを実行

[スキャン対象サーバにて]

結果

ログからアクセス元のIPアドレスを取得し、アクセス数上位5位のIPアドレスを表示
tail -n 1000 /var/log/apache2/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -n 5
強度1
1 192.168.56.202
1 192.168.56.201
強度3
43 192.168.56.202<br>
1 192.168.56.201
強度4
674 192.168.56.202<br>
7 192.168.56.201

備考

・強度によって、[1→43→674]と大幅なアクセス増加が見られる。
・強度3,4では明らかに痕跡が残るが、1に関しては気づくことは難しい。

2.404エラーが多発しているIPの分析


以下コマンドを実行

[スキャン対象サーバにて]

ログから404エラーが発生するようなアクセスを行ったIPアドレスを集計し、発生数上位5件を表示
tail -n 1000 /var/log/apache2/access.log | awk '{print $1, $9}' | grep " 404$" | awk '{print $1}' | sort | uniq -c | sort -rn | head -n 5

結果

強度1
なし
強度3
16 192.168.56.202
強度4
613 192.168.56.202

備考

・強度によって、[0→16→613]と大幅な404エラー数増加が見られる。

・強度3,4で404エラーが増加していることから、存在しないパスを試すことでファイルやディレクトリの構成を調査している痕跡がはっきりと残っている。

3.分ごとのアクセス数の分析

以下コマンドを実行

[スキャン対象サーバにて]

ログから日時部分を抽出し、アクセスの集中している時間帯を分単位で表示
tail -n 1000 /var/log/apache2/access.log | sed -E 's/^[^[][([0-9A-Za-z:/]+)./\1/' | awk -F: '{print $1 ":" $2 ":" $3}' | sort | uniq -c | sort -rn | head -n 5

結果

強度1
2 30/Oct/2025:11:09
強度3
44 30/Oct/2025:11:14
強度4
101 30/Oct/2025:11:26
99 30/Oct/2025:11:25
97 30/Oct/2025:11:28 
96 30/Oct/2025:11:27 
96 30/Oct/2025:11:23

備考

・強度1でのスキャンは自然な範囲のアクセス数にとどまっており、ここからスキャンに気づくのは難しい。
・しかし、強度3,4に関してアクセス数が瞬間的に増加していることが分かりやすく確認できた。
・特に強度4においては、1分間にリクエストが最低でも90以上集中している上に、そのアクセス集中が数回発生しており、明確にスキャンの痕跡を確認できる。

9.おわりに

・今回の検証を通じて、whatwebはwebサイトの技術的な情報を簡単に取得することができる便利なツールであることが確認できた。

・一方で、スキャン強度を高く設定することで非常に多くのリクエストを対象サーバへと送信してしまうので、高強度スキャンについては十分に気をつけて使用する必要がある。

・また、攻撃者がこのツールを用いてスキャンを行ったとき、通常スキャンの場合はアクセスログ(user-agent)に痕跡が残るため非攻撃者側でスキャンを検知することができる。しかし、-Uオプションを用いたスキャンの場合、user-agentがカスタマイズされているため、単にアクセスログを確認するだけでは気づくことが難しいことが分かった。

・しかし、高強度スキャンの場合は、多くのリクエストや404エラーなどを伴うため、被攻撃者側のアクセスログに特徴的な痕跡(アクセスの集中など)が残ることがわかった。そのため、アクセスログの定期的な分析などを行うことで、攻撃者のスキャンを検知できる可能性がある。