# frozen_string_literal: true ## # This file is part of WhatWeb and may be subject to # redistribution and commercial restrictions. Please see the WhatWeb # web site for more information on licensing and terms of use. # http://www.morningstarsecurity.com/research/whatweb ## # Plugin to detect tomcat # Comment from Andrew Horton - this plugin includes code for a 404 page probe which should be incorporated into whatweb itself ## # v0.3 by Andrew Horton # renamed plugin from Tomcat to Apache-Tomcat, added aggressive /RELEASE-NOTES.txt to get version, added footer version, added /manager/status tests # to-do, an invalid HTTP verb to a .JSP will reveal Tomcat if nothing else does, e.g. XXX /foobar/.jsp HTTP/1.0 ## WhatWeb::Plugin.define "Apache-Tomcat" do @author = "Louis Nyffenegger" @description = "Apache Tomcat Web Server" @website = "http://tomcat.apache.org/" @version = "0.3" @matches = [ # # Apache tomcat in title from default page { name: "tomcat in title", regexp: /Apache Tomcat<\/title>/ }, # CATALINA_HOME/webapps/ROOT/index.html # by default tomcat homepage contains this file name { name: "catalina home", regexp: /CATALINA_HOME\/webapps\/ROOT\/index\.html/ }, { name: "/RELEASE-NOTES.txt", url: "/RELEASE-NOTES.txt", version: /Apache Tomcat Version ([0-9\.]+)/ }, { name: "/RELEASE-NOTES.txt", url: "/RELEASE-NOTES.txt", string: /(\$Id: RELEASE-NOTES[^\$]+)/ }, { name: "Java Stack Trace Error", regexp: /org\.apache\.tomcat\..*java\.lang\.Thread\.run/ }, { name: "Tomcat admin /manager/status", url: "/manager/status", text: "tomcat" }, { name: "Footer", version: /Apache Tomcat\/([0-9\.]+)<\/h3><\/body><\/html>/ } ] ## # get a random page to check for default 404 tomcat page ## def version_from_404(target) new_url = "#{target.uri.scheme}://#{target.uri.host}:#{target.uri.port}/#{randstr}" info = [] new_target = WhatWeb::Target.new(new_url) if new_target.status == 404 v = new_target.body.scan(/Apache Tomcat\/([456]\.\d+\.\d+)/)[0] unless v.nil? info << { name: "Tomcat version", certainty: 100, version: v } end end info end def aggressive(target) begin info = version_from_404(target) rescue StandardError => e p e [] end info # TODO version can also be retrieve from 500 error page end end