Recon-ng / modules / recon / hosts / enum / http / api / whatweb.py

import framework
# unique to module
import json

class Module(framework.module):

    def __init__(self, params):
        framework.module.__init__(self, params)
        self.register_option('source', 'db', 'yes', 'source of hosts for module input (see \'info\' for options)')
        self.info = {
                     'Name': 'WhatWeb Web Technologies scan',
                     'Author': 'thrapt (thrapt@gmail.com) and Tim Tomes (@LaNMaSteR53)',
                     'Description': 'Leverages WhatWeb.net to determine the web technologies in use on the given host(s).',
                     'Comments': [
                                  'Source options: [ db | <hostname> | ./path/to/file | query <sql> ]'
                                 ]
                     }

    def module_run(self):
        # handle sources
        hosts = self.get_source(self.options['source']['value'], 'SELECT DISTINCT host FROM hosts WHERE host IS NOT NULL ORDER BY host')
        
        url = 'http://whatweb.net/whatweb.php'
        for host in hosts:
            payload = {'target': host, 'format': 'json' }
            resp = self.request(url, method='POST', payload=payload)

            # parse returned json objects
            jsonobj = resp.json
            if jsonobj == None and resp.text:
                jsonobjs = [json.loads(x) for x in resp.text.strip().split('\n')]
            else:
                jsonobjs = [jsonobj]

            # output data
            for jsonobj in jsonobjs:
                tdata = [['Plugin', 'String'],['Target', jsonobj['target']]]
                for plugin in jsonobj['plugins']:
                    if 'string' in jsonobj['plugins'][plugin]:
                        value = ', '.join(jsonobj['plugins'][plugin]['string'])
                        tdata.append([plugin, value])
                if tdata: self.table(tdata, header=True)
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.