WhatWeb – Website Technology Identifier


WhatWeb is an open-source reconnaissance tool capable of identifying the technology of a website. It recognises web technologies including content management systems (CMS), JavaScript libraries, web servers, statistic/analytics packages, blogging platforms and more. It has over a thousand plugins to recognise software versions, frameworks, email addresses, errors and etc. WhatWeb not only identifies the technology found but also describes it, which is great as not everyone understands the technology identified.

Here is the list of features WhatWeb contains:

  • Over 1700 plugins
  • Control the trade-off between speed/stealth and reliability
  • Plugins include example URLs
  • Performance tuning. Control how many websites to scan concurrently.
  • Multiple log formats: Brief (greppable), Verbose (human readable), XML, JSON, MagicTree, RubyObject, MongoDB, SQL, and ElasticSearch.
  • Proxy support including TOR
  • Custom HTTP headers
  • Basic HTTP authentication
  • Control over webpage redirection
  • Nmap-style IP ranges
  • Fuzzy matching
  • Result certainty awareness
  • Custom plugins defined on the command line

How to use WhatWeb

The command format for WhatWeb is

whatweb [options] <domain/URL> 

in the example below, the command used is

whatweb -v -a 3 https://tastyfix.com

To elaborate:

-v (is a verbose argument, to print out details of the scan)

-a (is the aggression level set for scanning)

The aggression levels are 1, 3 and 4. the higher the level the more aggressive. The more aggressive the more thorough the scan, but this would come at the cost of an increased duration to complete the scan.

Aggression Levels (more details in the help menu):

  • 1 (stealthy and fast duration)
  • 3 (aggressive with decent duration)
  • 4 (Very aggressive and slow duration)

As seen in the example, the website I scanned for was https://tastyfix.com/. The verbose argument prints the details of the scan in a nice structure for use to analyse the data and the aggression used was also set to level 3 for a thorough scan. The time taken to complete the scan is 47s, an acceptable duration in my opinion.

The scan found that the website is using HTML version 5 with its, HTTP server using the Nginx engine to power the website. It also found that the website allows javascript and is using Jquery. You can then use this information to attack the website. For example, you can research if there are any exploits available for the Nginx version 1.12.2 and attack it.

WhatWeb Help Menu

└─$ whatweb -h

WhatWeb - Next generation web scanner version 0.5.
Developed by Andrew Horton (urbanadventurer) and Brendan Coles (bcoles).
Homepage: https://www.morningstarsecurity.com/research/whatweb

Usage: whatweb [options] <URLs>

  <TARGETs>                     Enter URLs, hostnames, IP addresses, filenames or
                                IP ranges in CIDR, x.x.x-x, or x.x.x.x-x.x.x.x
  --input-file=FILE, -i         Read targets from a file. You can pipe
                                hostnames or URLs directly with -i /dev/stdin.

  --url-prefix                  Add a prefix to target URLs.
  --url-suffix                  Add a suffix to target URLs.
  --url-pattern                 Insert the targets into a URL.
                                e.g. example.com/%insert%/robots.txt

The aggression level controls the trade-off between speed/stealth and
  --aggression, -a=LEVEL        Set the aggression level. Default: 1.
  1. Stealthy                   Makes one HTTP request per target and also
                                follows redirects.
  3. Aggressive                 If a level 1 plugin is matched, additional
                                requests will be made.
  4. Heavy                      Makes a lot of HTTP requests per target. URLs
                                from all plugins are attempted.

  --user-agent, -U=AGENT        Identify as AGENT instead of WhatWeb/0.5.5.
  --header, -H                  Add an HTTP header. eg "Foo:Bar". Specifying a
                                default header will replace it. Specifying an
                                empty value, e.g. "User-Agent:" will remove it.
  --follow-redirect=WHEN        Control when to follow redirects. WHEN may be
                                `never', `http-only', `meta-only', `same-site',
                                or `always'. Default: always.
  --max-redirects=NUM           Maximum number of redirects. Default: 10.

  --user, -u=<user:password>    HTTP basic authentication.
  --cookie, -c=COOKIES          Use cookies, e.g. 'name=value; name2=value2'.
  --cookie-jar=FILE             Read cookies from a file.

  --proxy                       <hostname[:port]> Set proxy hostname and port.
                                Default: 8080.
  --proxy-user                  <username:password> Set proxy user and password.

  --list-plugins, -l            List all plugins.
  --info-plugins, -I=[SEARCH]   List all plugins with detailed information.
                                Optionally search with keywords in a comma
                                delimited list.
  --search-plugins=STRING       Search plugins for a keyword.
  --plugins, -p=LIST            Select plugins. LIST is a comma delimited set
                                of selected plugins. Default is all.
                                Each element can be a directory, file or plugin
                                name and can optionally have a modifier, +/-.
                                Examples: +/tmp/moo.rb,+/tmp/foo.rb
                                -p + is a shortcut for -p +plugins-disabled.
  --grep, -g=STRING|REGEXP      Search for STRING or a Regular Expression. Shows
                                only the results that match.
                                Examples: --grep "hello"
                                --grep "/he[l]*o/"
  --custom-plugin=DEFINITION    Define a custom plugin named Custom-Plugin,
                                Examples: ":text=>'powered by abc'"
                                ":version=>/powered[ ]?by ab[0-9]/"
                                ":ghdb=>'intitle:abc \"powered by abc\"'"
                                "{:text=>'powered by abc'}"
  --dorks=PLUGIN                List Google dorks for the selected plugin.

  --verbose, -v                 Verbose output includes plugin descriptions.
                                Use twice for debugging.
  --colour,--color=WHEN         control whether colour is used. WHEN may be
                                `never', `always', or `auto'.
  --quiet, -q                   Do not display brief logging to STDOUT.
  --no-errors                   Suppress error messages.

  --log-brief=FILE              Log brief, one-line output.
  --log-verbose=FILE            Log verbose output.
  --log-errors=FILE             Log errors.
  --log-xml=FILE                Log XML format.
  --log-json=FILE               Log JSON format.
  --log-sql=FILE                Log SQL INSERT statements.
  --log-sql-create=FILE         Create SQL database tables.
  --log-json-verbose=FILE       Log JSON Verbose format.
  --log-magictree=FILE          Log MagicTree XML format.
  --log-object=FILE             Log Ruby object inspection format.
  --log-mongo-database          Name of the MongoDB database.
  --log-mongo-collection        Name of the MongoDB collection.
                                Default: whatweb.
  --log-mongo-host              MongoDB hostname or IP address.
  --log-mongo-username          MongoDB username. Default: nil.
  --log-mongo-password          MongoDB password. Default: nil.
  --log-elastic-index           Name of the index to store results. Default: whatweb
  --log-elastic-host            Host:port of the elastic http interface. Default:

  --max-threads, -t             Number of simultaneous threads. Default: 25.
  --open-timeout                Time in seconds. Default: 15.
  --read-timeout                Time in seconds. Default: 30.
  --wait=SECONDS                Wait SECONDS between connections.
                                This is useful when using a single thread.

  --short-help                  Short usage help.
  --help, -h                    Complete usage help.
  --debug                       Raise errors in plugins.
  --version                     Display version information.

* Scan example.com.
  ./whatweb example.com

* Scan reddit.com slashdot.org with verbose plugin descriptions.
  ./whatweb -v reddit.com slashdot.org

* An aggressive scan of wired.com detects the exact version of WordPress.
  ./whatweb -a 3 www.wired.com

* Scan the local network quickly and suppress errors.
  whatweb --no-errors

* Scan the local network for https websites.
  whatweb --no-errors --url-prefix https://

* Scan for crossdomain policies in the Alexa Top 1000.
  ./whatweb -i plugin-development/alexa-top-100.txt \
  --url-suffix /crossdomain.xml -p crossdomain_xml


In conclusion, WhatWeb is a website technology identifier that is simple to use and generally fast, but it gathers very useful information for your reconnaissance for penetration testing. WhatWeb has much more plugins to use to further identify vulnerabilities within your target web application so I suggest you look deeper into what it has to offer.

WhatWeb resources

Homepage for WhatWeb: https://morningstarsecurity.com/research/whatweb

Kali Linux page for WhatWeb: https://www.kali.org/tools/whatweb/

Source Repository for WhatWeb: https://github.com/urbanadventurer/WhatWeb

Try WhatWeb Live: https://www.whatweb.net/

Alternatives to WhatWeb

Wappalyzer (Website and software-based): Wappalyzer – Website Technology Identifier for Pentesting

Netcraft (Website based): https://sitereport.netcraft.com/

Related Articles

5 Popular Open Source Tools for Reconnaissance

DNSrecon – DNS reconnaissance for Penetration Testing

theHarvester – Email Harvesting & Social Engineering

Ffuf – URL Directory Finder/Fuzzer

How to use OWASP ZAP – Open Source Vulnerability Scanner

Leave a Reply

Your email address will not be published. Required fields are marked *