WebServerIdentifier (version 1.1.0)
index
webserveridentifier.py

This package identifies Web servers using an aggressive
technique based on the maximum size of the URI.
 
~# python3 WebServerIdentifier.py -d -v -m HEAD identify 127.0.0.1
 
PythonToolsKit  Copyright (C) 2022  Maurice Lambert
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions.
 
 
WebServerIdentifier  Copyright (C) 2022  Maurice Lambert
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions.
 
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:1133} Command line arguments parsed.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:1150} Identifier built.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:789} New connection built.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:798} URI size: 12276.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} Request 1 sent. Get response...
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:918} Request size: 12278, response status: 400.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:623} Trying to identify server from response hash (sha512).
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:634} Response hash does not match. (sha512: cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e)
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:638} Trying to identify server from response content.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:951} Servers size: 16.
[*] Response status: 400 for request size: 12278.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:789} New connection built.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:798} URI size: 6114.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} Request 2 sent. Get response...
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:918} Request size: 6116, response status: 404.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:951} Servers size: 8.
[*] Response status: 404 for request size: 6116.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:789} New connection built.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:798} URI size: 12218.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} Request 3 sent. Get response...
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:918} Request size: 12220, response status: 400.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:951} Servers size: 4.
[*] Response status: 400 for request size: 12220.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:789} New connection built.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:798} URI size: 9171.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} Request 4 sent. Get response...
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:918} Request size: 9173, response status: 404.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:951} Servers size: 2.
[*] Response status: 404 for request size: 9173.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:789} New connection built.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:798} URI size: 12211.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} Request 5 sent. Get response...
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:918} Request size: 12213, response status: 400.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:951} Servers size: 1.
[*] Response status: 400 for request size: 12213.
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:969} Identifying the Web Server...
[2016-06-22 02:11:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:980} Only one server (IIS) matching with max URI size: 12212
[*] Response status: 400 for request size: 12213.
[+] Server header: 'Microsoft-HTTPAPI/2.0', last request size: 12213, last error code: 400, server(s): 'IIS'.
 
~# python3 WebServerIdentifier.py -i 1 identify 127.0.0.1:8080
 
PythonToolsKit  Copyright (C) 2022  Maurice Lambert
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions.
 
 
WebServerIdentifier  Copyright (C) 2022  Maurice Lambert
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions.
 
[+] Server header: 'SimpleHTTP/0.6 Python/3.10.4', last request size: 61391, last error code: 414, server(s): 'Python'.
 
~# python3 WebServerIdentifier.py -d -v -m HEAD -i 1 getmaxuri 127.0.0.1
 
PythonToolsKit  Copyright (C) 2022  Maurice Lambert
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions.
 
 
WebServerIdentifier  Copyright (C) 2022  Maurice Lambert
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions.
 
[2016-06-22 02:15:36] DEBUG    (10) {__main__ - WebServerIdentifier.py:1138} Command line arguments parsed.
[2016-06-22 02:15:36] DEBUG    (10) {__main__ - WebServerIdentifier.py:1155} Identifier built.
[2016-06-22 02:15:36] DEBUG    (10) {__main__ - WebServerIdentifier.py:831} Get minimum and maximum server URI sizes.
[2016-06-22 02:15:36] DEBUG    (10) {__main__ - WebServerIdentifier.py:852} Start the search for maximum URI length...
[2016-06-22 02:15:36] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:36] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 395735.
[2016-06-22 02:15:36] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 1 sent. Get response...
[2016-06-22 02:15:36] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 395737, response status: 414
[*] Request size: 395737, response code: 414 'Request-URI Too Long'
[2016-06-22 02:15:37] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:37] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 198874.
[2016-06-22 02:15:37] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 2 sent. Get response...
[2016-06-22 02:15:37] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 198876, response status: 414
[*] Request size: 198876, response code: 414 'Request-URI Too Long'
[2016-06-22 02:15:38] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:38] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 100443.
[2016-06-22 02:15:38] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 3 sent. Get response...
[2016-06-22 02:15:38] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 100445, response status: 414
[*] Request size: 100445, response code: 414 'Request-URI Too Long'
[2016-06-22 02:15:39] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:39] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 51228.
[2016-06-22 02:15:39] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 4 sent. Get response...
[2016-06-22 02:15:39] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 51230, response status: 414
[*] Request size: 51230, response code: 414 'Request-URI Too Long'
[2016-06-22 02:15:40] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:40] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 26621.
[2016-06-22 02:15:40] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 5 sent. Get response...
[2016-06-22 02:15:40] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 26623, response status: 414
[*] Request size: 26623, response code: 414 'Request-URI Too Long'
[2016-06-22 02:15:41] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:41] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 14317.
[2016-06-22 02:15:41] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 6 sent. Get response...
[2016-06-22 02:15:41] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 14319, response status: 414
[*] Request size: 14319, response code: 414 'Request-URI Too Long'
[2016-06-22 02:15:42] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:42] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 8165.
[2016-06-22 02:15:42] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 7 sent. Get response...
[2016-06-22 02:15:42] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 8167, response status: 404
[*] Request size: 8167, response code: 404 'Not Found'
[2016-06-22 02:15:43] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:43] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 11241.
[2016-06-22 02:15:43] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 8 sent. Get response...
[2016-06-22 02:15:43] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 11243, response status: 404
[*] Request size: 11243, response code: 404 'Not Found'
[2016-06-22 02:15:44] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:44] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 12779.
[2016-06-22 02:15:44] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 9 sent. Get response...
[2016-06-22 02:15:44] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 12781, response status: 414
[*] Request size: 12781, response code: 414 'Request-URI Too Long'
[2016-06-22 02:15:45] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:45] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 12010.
[2016-06-22 02:15:45] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 10 sent. Get response...
[2016-06-22 02:15:45] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 12012, response status: 404
[*] Request size: 12012, response code: 404 'Not Found'
[2016-06-22 02:15:46] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:46] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 12394.
[2016-06-22 02:15:46] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 11 sent. Get response...
[2016-06-22 02:15:46] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 12396, response status: 414
[*] Request size: 12396, response code: 414 'Request-URI Too Long'
[2016-06-22 02:15:47] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:47] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 12202.
[2016-06-22 02:15:47] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 12 sent. Get response...
[2016-06-22 02:15:47] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 12204, response status: 404
[*] Request size: 12204, response code: 404 'Not Found'
[2016-06-22 02:15:48] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:48] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 12298.
[2016-06-22 02:15:48] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 13 sent. Get response...
[2016-06-22 02:15:48] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 12300, response status: 414
[*] Request size: 12300, response code: 414 'Request-URI Too Long'
[2016-06-22 02:15:49] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:49] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 12250.
[2016-06-22 02:15:49] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 14 sent. Get response...
[2016-06-22 02:15:49] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 12252, response status: 400
[*] Request size: 12252, response code: 400 'Bad Request'
[2016-06-22 02:15:50] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:50] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 12226.
[2016-06-22 02:15:50] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 15 sent. Get response...
[2016-06-22 02:15:50] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 12228, response status: 400
[*] Request size: 12228, response code: 400 'Bad Request'
[2016-06-22 02:15:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 12214.
[2016-06-22 02:15:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 16 sent. Get response...
[2016-06-22 02:15:51] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 12216, response status: 400
[*] Request size: 12216, response code: 400 'Bad Request'
[2016-06-22 02:15:52] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:52] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 12208.
[2016-06-22 02:15:52] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 17 sent. Get response...
[2016-06-22 02:15:52] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 12210, response status: 404
[*] Request size: 12210, response code: 404 'Not Found'
[2016-06-22 02:15:53] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:53] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 12211.
[2016-06-22 02:15:53] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 18 sent. Get response...
[2016-06-22 02:15:53] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 12213, response status: 400
[*] Request size: 12213, response code: 400 'Bad Request'
[2016-06-22 02:15:54] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:54] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 12210.
[2016-06-22 02:15:54] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 19 sent. Get response...
[2016-06-22 02:15:54] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 12212, response status: 404
[*] Request size: 12212, response code: 404 'Not Found'
[2016-06-22 02:15:55] DEBUG    (10) {__main__ - WebServerIdentifier.py:794} New connection built.
[2016-06-22 02:15:55] DEBUG    (10) {__main__ - WebServerIdentifier.py:803} URI size: 12211.
[2016-06-22 02:15:55] DEBUG    (10) {__main__ - WebServerIdentifier.py:808} Request 20 sent. Get response...
[2016-06-22 02:15:55] DEBUG    (10) {__main__ - WebServerIdentifier.py:871} Request size: 12213, response status: 400
[*] Request size: 12213, response code: 400 'Bad Request'
[2016-06-22 02:15:55] INFO     (20) {__main__ - WebServerIdentifier.py:882} Maximum URI length found: 12212, status: 400, reason: Bad Request.
[*] Request size: 12212, response code: 400 'Bad Request'
[+] Server header: 'Microsoft-HTTPAPI/2.0'
[+] Maximum URI length is: 12212, error code: 400 'Bad Request'
 
~#
 
>>> from WebServerIdentifier import WebServerIdentifier, _create_unverified_context
 
PythonToolsKit  Copyright (C) 2022  Maurice Lambert
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions.
 
 
WebServerIdentifier  Copyright (C) 2022  Maurice Lambert
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions.
 
>>> identifier = WebServerIdentifier("127.0.0.1", baseuri="/", ssl=True, context=_create_unverified_context(), port=8000, interval=0.5, timeout=2)
>>> identifier = WebServerIdentifier("127.0.0.1")
>>> response = identifier.request()
>>> response.status
404
>>> response.reason
'Not Found'
>>> r = identifier.request(method="HEAD", size=65535)
>>> r.status
414
>>> r.reason
'Request-URI Too Long'
>>> for size, r in identifier.get_max_URI_size(): pass
...
>>> size
16283
>>> for size, r in identifier.get_max_URI_size(method="HEAD"): pass
...
>>> for r, size, servers in identifier.identify_server(): pass
...
>>> for r, size, servers in identifier.identify_server(method="HEAD"): pass
...
>>> size
16283
>>> servers
{'IIS'}
>>> name = servers.pop()
>>> name
'IIS'
>>>
 
~# python3 -m doctest -v WebServerIdentifier.py
1 items passed all tests:
  19 tests in WebServerIdentifier
19 tests in 20 items.
19 passed and 0 failed.
Test passed.
~#

 
Modules
       
http.client

 
Classes
       
builtins.object
WebServerIdentifier

 
class WebServerIdentifier(builtins.object)
    WebServerIdentifier(target: str, baseuri: str = '/', ssl: bool = False, interval: float = 0, user_agent: str = 'WebServerIdentifier 1.1.0', *args, **kwargs)
 
This class implements the Web Server Identifier.
 
target: The target host (examples: "10.101.10.101:8000", "example.com")
ssl:    Use HTTPS (SSL, Encryption)
 
  Methods defined here:
__init__(self, target: str, baseuri: str = '/', ssl: bool = False, interval: float = 0, user_agent: str = 'WebServerIdentifier 1.1.0', *args, **kwargs)
Initialize self.  See help(type(self)) for accurate signature.
compare_matching_servers(self, maxsize: int, server: Set[str], status_responses: Set[int]) -> List[str]
This function compares Web servers matching
with the max URI size (using error codes).
get_max_URI_size(self, *args, **kwargs) -> collections.abc.Generator[typing.Tuple[int, http.client.HTTPResponse]]
This function detects the max URI length of the target.
identify_server(self, *args, **kwargs) -> collections.abc.Generator[http.client.HTTPResponse, int, typing.Dict[int, str], collections.abc.Iterable[str]]
This function identifies the target's web server.
request(self, method: str = 'GET', size: int = 0) -> http.client.HTTPResponse
This function requests the Web Server.
 
method: HTTP method to use
size:   Size of the Query String

Static methods defined here:
get_min_and_max() -> Tuple[int, int]
This function returns the minimum and maximum
size to get a "too long URI error".

Data descriptors defined here:
__dict__
dictionary for instance variables (if defined)
__weakref__
list of weak references to the object (if defined)

 
Data
        __all__ = ['WebServerIdentifier']
__annotations__ = {'APACHE_content': <class 'bytes'>, 'APACHE_hash': <class 'bytes'>, 'CADDY_content': <class 'bytes'>, 'CADDY_hash': <class 'bytes'>, 'CHEROKEE_content': <class 'bytes'>, 'CHEROKEE_hash': <class 'bytes'>, 'ERLANG_content': <class 'bytes'>, 'ERLANG_hash': <class 'bytes'>, 'H2O_content': <class 'bytes'>, 'H2O_hash': <class 'bytes'>, ...}
__author_email__ = 'mauricelambert434@gmail.com'
__copyright__ = '\nWebServerIdentifier Copyright (C) 2022 Mauric...ome to redistribute it\nunder certain conditions.\n'
__description__ = '\nThis package identifies Web servers using an ag...\ntechnique based on the maximum size of the URI.\n'
__license__ = 'GPL-3.0 License'
__maintainer__ = 'Maurice Lambert'
__maintainer_email__ = 'mauricelambert434@gmail.com'
__url__ = 'https://github.com/mauricelambert/WebServerIdentifier'

 
Author
        Maurice Lambert