mirror of
https://github.com/Ekultek/Zeus-Scanner.git
synced 2026-03-11 08:55:51 +00:00
fixes a bunch of connection bugs including issue #191, also fixes some issues with WAF identification
This commit is contained in:
parent
daa83ffee6
commit
5de72f5d33
7 changed files with 29 additions and 21 deletions
|
|
@ -61,23 +61,23 @@ bbd8b4c6100070d420d48dc7dfc297eb ./lib/firewall/webknight.py
|
||||||
81a29a14d72980a306fbaec0dc772048 ./lib/firewall/fortigate.py
|
81a29a14d72980a306fbaec0dc772048 ./lib/firewall/fortigate.py
|
||||||
6ea65a0160c21e144e92334acc2e3667 ./lib/firewall/anquanbao.py
|
6ea65a0160c21e144e92334acc2e3667 ./lib/firewall/anquanbao.py
|
||||||
22a0ad8f2fa1a16b651cb5ae37ca9b0d ./lib/firewall/generic.py
|
22a0ad8f2fa1a16b651cb5ae37ca9b0d ./lib/firewall/generic.py
|
||||||
cf236a16c7869282f55dd4c5ad6347a5 ./lib/attacks/gist_lookup/__init__.py
|
963e24d4b8a0fb94464389ddb60cc65f ./lib/attacks/gist_lookup/__init__.py
|
||||||
7183dbd7106ecb436176cebcca4e499f ./lib/attacks/clickjacking_scan/__init__.py
|
7183dbd7106ecb436176cebcca4e499f ./lib/attacks/clickjacking_scan/__init__.py
|
||||||
d41d8cd98f00b204e9800998ecf8427e ./lib/attacks/__init__.py
|
d41d8cd98f00b204e9800998ecf8427e ./lib/attacks/__init__.py
|
||||||
4c644b0e3a62b6c1528d34a04837aa35 ./lib/attacks/sqlmap_scan/__init__.py
|
4c644b0e3a62b6c1528d34a04837aa35 ./lib/attacks/sqlmap_scan/__init__.py
|
||||||
5e5bb575014ebe613db6bf671d008cf8 ./lib/attacks/sqlmap_scan/sqlmap_opts.py
|
5e5bb575014ebe613db6bf671d008cf8 ./lib/attacks/sqlmap_scan/sqlmap_opts.py
|
||||||
7bc7a6f3e85651aab3588f087563eded ./lib/attacks/whois_lookup/__init__.py
|
7bc7a6f3e85651aab3588f087563eded ./lib/attacks/whois_lookup/__init__.py
|
||||||
d2846e039fefee741db24dd64f7bd50e ./lib/attacks/whois_lookup/whois.py
|
8ec72bb33df998e32b925e3060d9d17a ./lib/attacks/whois_lookup/whois.py
|
||||||
2d7686f1b9b93c3989bc5f279a1a064a ./lib/attacks/admin_panel_finder/__init__.py
|
2d7686f1b9b93c3989bc5f279a1a064a ./lib/attacks/admin_panel_finder/__init__.py
|
||||||
b5cd5e913cc62112776153bdf0f60fa4 ./lib/attacks/xss_scan/__init__.py
|
cc5e5838893eba60cf4bd33d38007e32 ./lib/attacks/xss_scan/__init__.py
|
||||||
e9915cc0bc3de60aaf2accfaea77d059 ./lib/attacks/nmap_scan/__init__.py
|
e9915cc0bc3de60aaf2accfaea77d059 ./lib/attacks/nmap_scan/__init__.py
|
||||||
216999fa0e84866d5c1d96d5676034e4 ./lib/attacks/nmap_scan/nmap_opts.py
|
216999fa0e84866d5c1d96d5676034e4 ./lib/attacks/nmap_scan/nmap_opts.py
|
||||||
3252422e2934d26987ab9b0eb00c5f9d ./lib/header_check/__init__.py
|
e2af52e2cb4d2f192c4678b7439366b2 ./lib/header_check/__init__.py
|
||||||
39221756c132732dbdc2b14772dcab11 ./lib/core/common.py
|
39221756c132732dbdc2b14772dcab11 ./lib/core/common.py
|
||||||
4433353fb5c55578391d8b4006191ee8 ./lib/core/errors.py
|
4433353fb5c55578391d8b4006191ee8 ./lib/core/errors.py
|
||||||
d41d8cd98f00b204e9800998ecf8427e ./lib/core/__init__.py
|
d41d8cd98f00b204e9800998ecf8427e ./lib/core/__init__.py
|
||||||
3cef89f6f302418b323ba257b9ccc25c ./lib/core/settings.py
|
c10aa86b519d43bd142de46453527f51 ./lib/core/settings.py
|
||||||
d3c1663ff908e10dfb2425bf84d80759 ./lib/core/decorators.py
|
801a4f7ac892b74676c649bd4844ccdb ./lib/core/decorators.py
|
||||||
9a02e5b913d210350545ac26510a63c9 ./var/search/__init__.py
|
9a02e5b913d210350545ac26510a63c9 ./var/search/__init__.py
|
||||||
0545ee54ade186681b25d157fb32f350 ./var/search/selenium_search.py
|
0545ee54ade186681b25d157fb32f350 ./var/search/selenium_search.py
|
||||||
8f8a7e791f91f0ef3544f2ed8364ab56 ./var/search/pgp_search.py
|
8f8a7e791f91f0ef3544f2ed8364ab56 ./var/search/pgp_search.py
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,9 @@ def check_files_for_information(found_url, data_to_search):
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
data = requests.get(found_url)
|
data = requests.get(found_url)
|
||||||
for data_regex in data_regex_schema:
|
for data_regex in data_regex_schema:
|
||||||
|
lib.core.settings.logger.info(lib.core.settings.set_color(
|
||||||
|
"running with regex '{}'...".format(data_regex.pattern), level=25
|
||||||
|
))
|
||||||
if data_regex.search(data.content) is not None:
|
if data_regex.search(data.content) is not None:
|
||||||
lib.core.settings.logger.info(lib.core.settings.set_color(
|
lib.core.settings.logger.info(lib.core.settings.set_color(
|
||||||
"found a match with given specifics, saving full Gist to log file...", level=25
|
"found a match with given specifics, saving full Gist to log file...", level=25
|
||||||
|
|
|
||||||
|
|
@ -80,8 +80,7 @@ def whois_lookup_main(domain, **kwargs):
|
||||||
time.sleep(timeout)
|
time.sleep(timeout)
|
||||||
try:
|
try:
|
||||||
raw_information = gather_raw_whois_info(domain)
|
raw_information = gather_raw_whois_info(domain)
|
||||||
except Exception as e:
|
except Exception:
|
||||||
lib.core.settings.logger.exception(str(e))
|
|
||||||
lib.core.settings.logger.error(lib.core.settings.set_color(
|
lib.core.settings.logger.error(lib.core.settings.set_color(
|
||||||
"unable to produce information from WhoIs lookup...", level=40
|
"unable to produce information from WhoIs lookup...", level=40
|
||||||
))
|
))
|
||||||
|
|
|
||||||
|
|
@ -168,8 +168,13 @@ def main_xss(start_url, proxy=None, agent=None, **kwargs):
|
||||||
with open(filename) as urls:
|
with open(filename) as urls:
|
||||||
for i, url in enumerate(urls.readlines(), start=1):
|
for i, url in enumerate(urls.readlines(), start=1):
|
||||||
url = url.strip()
|
url = url.strip()
|
||||||
result = scan_xss(url, proxy=proxy, agent=agent)
|
|
||||||
payload = find_xss_script(url)
|
payload = find_xss_script(url)
|
||||||
|
try:
|
||||||
|
result = scan_xss(url, proxy=proxy, agent=agent)
|
||||||
|
except requests.exceptions.ConnectionError:
|
||||||
|
lib.core.settings.logger.error(lib.core.settings.set_color(
|
||||||
|
"payload '{}' caused a connection error, assuming no good and continuing...".format(payload), level=40
|
||||||
|
))
|
||||||
if verbose:
|
if verbose:
|
||||||
lib.core.settings.logger.info(lib.core.settings.set_color(
|
lib.core.settings.logger.info(lib.core.settings.set_color(
|
||||||
"trying payload '{}'...".format(payload)
|
"trying payload '{}'...".format(payload)
|
||||||
|
|
|
||||||
|
|
@ -31,11 +31,6 @@ def cache(func):
|
||||||
@wraps(func)
|
@wraps(func)
|
||||||
def func_wrapper(*args, **kwargs):
|
def func_wrapper(*args, **kwargs):
|
||||||
if args in __cache:
|
if args in __cache:
|
||||||
lib.core.settings.logger.warning(lib.core.settings.set_color(
|
|
||||||
"cached detection has shown that the target URL WAF/IPS/IDS is '{}'...".format(
|
|
||||||
__cache[args]
|
|
||||||
), level=35
|
|
||||||
))
|
|
||||||
return __cache[args]
|
return __cache[args]
|
||||||
else:
|
else:
|
||||||
__to_cache = func(*args, **kwargs)
|
__to_cache = func(*args, **kwargs)
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ CLONE = "https://github.com/ekultek/zeus-scanner.git"
|
||||||
ISSUE_LINK = "https://github.com/ekultek/zeus-scanner/issues"
|
ISSUE_LINK = "https://github.com/ekultek/zeus-scanner/issues"
|
||||||
|
|
||||||
# current version <major.minor.commit.patch ID>
|
# current version <major.minor.commit.patch ID>
|
||||||
VERSION = "1.3.9.{}".format(PATCH_ID)
|
VERSION = "1.3.10.{}".format(PATCH_ID)
|
||||||
|
|
||||||
# colors to output depending on the version
|
# colors to output depending on the version
|
||||||
VERSION_TYPE_COLORS = {"dev": 33, "stable": 92, "other": 30}
|
VERSION_TYPE_COLORS = {"dev": 33, "stable": 92, "other": 30}
|
||||||
|
|
@ -337,14 +337,16 @@ DBMS_ERRORS = {
|
||||||
|
|
||||||
|
|
||||||
# this has to be the first function so that I can use it in the logger settings below
|
# this has to be the first function so that I can use it in the logger settings below
|
||||||
def create_log_name(log_path="{}/log", filename="zeus-log-{}.log", matcher="zeus-log"):
|
def create_log_name(log_path="{}/log", filename="zeus-log-{}.log", matcher="zeus"):
|
||||||
"""
|
"""
|
||||||
create the current log file name by figuring out how many files are there
|
create the current log file name by figuring out how many files are there
|
||||||
"""
|
"""
|
||||||
if not os.path.exists(log_path.format(os.getcwd())):
|
if not os.path.exists(log_path.format(os.getcwd())):
|
||||||
os.mkdir(log_path.format(os.getcwd()))
|
os.mkdir(log_path.format(os.getcwd()))
|
||||||
find_file_amount = len([f for f in os.listdir(log_path.format(os.getcwd())) if matcher in f])
|
find_file_amount = len(
|
||||||
full_log_path = "{}/{}".format(log_path.format(os.getcwd()), filename.format(find_file_amount + 1))
|
[f for f in os.listdir(log_path.format(os.getcwd())) if matcher in f and not os.path.isdir(f)]
|
||||||
|
) + 1
|
||||||
|
full_log_path = "{}/{}".format(log_path.format(os.getcwd()), filename.format(find_file_amount))
|
||||||
return full_log_path
|
return full_log_path
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -105,10 +105,12 @@ def detect_protection(url, **kwargs):
|
||||||
except (Exception, IndexError):
|
except (Exception, IndexError):
|
||||||
logger.warning(set_color(
|
logger.warning(set_color(
|
||||||
"multiple firewalls identified ({}), displaying most likely...".format(
|
"multiple firewalls identified ({}), displaying most likely...".format(
|
||||||
", ".join(retval)
|
", ".join([item.split("(")[0] for item in retval])
|
||||||
), level=30
|
), level=30
|
||||||
))
|
))
|
||||||
del retval[retval.index(retval[1])]
|
del retval[retval.index(retval[1])]
|
||||||
|
if len(retval) >= 2:
|
||||||
|
del retval[retval.index(retval[1])]
|
||||||
if retval[0] == "Generic (Unknown)":
|
if retval[0] == "Generic (Unknown)":
|
||||||
logger.warning(set_color(
|
logger.warning(set_color(
|
||||||
"discovered firewall is unknown to Zeus, saving fingerprint to file. "
|
"discovered firewall is unknown to Zeus, saving fingerprint to file. "
|
||||||
|
|
@ -159,7 +161,7 @@ def load_headers(url, **kwargs):
|
||||||
proxy = kwargs.get("proxy", None)
|
proxy = kwargs.get("proxy", None)
|
||||||
xforward = kwargs.get("xforward", False)
|
xforward = kwargs.get("xforward", False)
|
||||||
|
|
||||||
literal_match = re.compile(r"\\(\X(\d+)?\w+)?", re.I)
|
# literal_match = re.compile(r"\\(\X(\d+)?\w+)?", re.I)
|
||||||
|
|
||||||
if proxy is not None:
|
if proxy is not None:
|
||||||
proxy = proxy_string_to_dict(proxy)
|
proxy = proxy_string_to_dict(proxy)
|
||||||
|
|
@ -203,13 +205,15 @@ def load_headers(url, **kwargs):
|
||||||
retval[header] = unicodedata.normalize("NFKD", u"{}".format(http_headers[header])).encode("ascii", errors="ignore")
|
retval[header] = unicodedata.normalize("NFKD", u"{}".format(http_headers[header])).encode("ascii", errors="ignore")
|
||||||
# just to be safe, we're going to put all the possible Unicode errors into a tuple
|
# just to be safe, we're going to put all the possible Unicode errors into a tuple
|
||||||
except (UnicodeEncodeError, UnicodeDecodeError, UnicodeError, UnicodeTranslateError, UnicodeWarning):
|
except (UnicodeEncodeError, UnicodeDecodeError, UnicodeError, UnicodeTranslateError, UnicodeWarning):
|
||||||
# if there are, we're going to append them to a `do_not_use` list
|
# if there are any errors, we're going to append them to a `do_not_use` list
|
||||||
do_not_use.append(header)
|
do_not_use.append(header)
|
||||||
|
# clear the dict so we can re-add to it
|
||||||
retval.clear()
|
retval.clear()
|
||||||
for head in http_headers:
|
for head in http_headers:
|
||||||
# if the header is in the list, we skip it
|
# if the header is in the list, we skip it
|
||||||
if head not in do_not_use:
|
if head not in do_not_use:
|
||||||
retval[head] = http_headers[head]
|
retval[head] = http_headers[head]
|
||||||
|
# return a dict of safe unicodeless HTTP headers
|
||||||
return retval
|
return retval
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue