Compare commits

...

15 commits
v1.5 ... master

Author SHA1 Message Date
Ekultek
21b8756306
Merge pull request #739 from sylwit/master
Dockerize
2019-05-10 08:46:38 -05:00
sylwit
d75169e401 Dockerize 2019-04-08 00:58:22 -04:00
Ekultek
f6a3ada2f0
Merge pull request #552 from TimVerheul/patch-1
Fixed Issue #551
2019-02-26 11:59:21 -06:00
TimV01
ac83743b4d
Fixed Issue #551
I implemented the function so it won't shutdown the script when a dork gave 0 urls.
@Ekultek Please take a look at this, might add it to your next release ;)

FYI: I am interested in further contribution.
2018-10-19 20:07:46 +02:00
Ekultek
910c3e434a
Update README.md 2018-08-06 15:06:57 -05:00
Ekultek
f512423c4e
Update README.md 2018-08-06 15:06:17 -05:00
Ekultek
2ca5c5ac3f
Update README.md 2018-08-06 15:05:53 -05:00
ekultek
55ba7ca7fe quick little fix for an issue with the new animation message 2018-02-10 20:03:57 -06:00
ekultek
caa7a4a564 updated md5sums 2018-02-10 19:33:39 -06:00
ekultek
3d8cf0e9f8 added a output option in getting the browser version, also bumped version number 2018-02-10 19:31:58 -06:00
ekultek
9dae61919d leaving a to do not for myself 2018-02-10 19:30:39 -06:00
ekultek
fe9c0abb76 lots of updates to the installation method 2018-02-10 19:24:56 -06:00
ekultek
443c0d94d1 changed firefox compatibility from version 52-58 2018-02-10 18:37:40 -06:00
ekultek
cfc348f03f created a script for installing xvfb 2018-02-10 18:37:12 -06:00
ekultek
6cecf4f6d1 created a way to make sure the arguments that you pass are implemented into Zeus production and are not still in the testing phase 2018-02-07 11:55:38 -06:00
10 changed files with 154 additions and 67 deletions

34
Dockerfile Normal file
View file

@ -0,0 +1,34 @@
FROM ubuntu:18.10
WORKDIR /app
RUN apt update && \
apt install -y \
libxml2-dev \
libxslt1-dev \
libgtk-3-dev \
libdbus-glib-1-2 \
python-dev \
python-pip \
git \
curl \
nmap \
sqlmap \
xvfb \
&& rm -rf /var/lib/apt/lists/*
ARG GECKO_DRIVER_VERSION=0.23.0
ARG FIREFOX_VERSION=58.0.2
RUN git clone https://github.com/ekultek/zeus-scanner.git . && \
pip install -r requirements.txt
RUN curl -L https://github.com/mozilla/geckodriver/releases/download/v${GECKO_DRIVER_VERSION}/geckodriver-v${GECKO_DRIVER_VERSION}-linux64.tar.gz | tar xz -C /usr/bin
RUN curl -L https://ftp.mozilla.org/pub/firefox/releases/${FIREFOX_VERSION}/linux-$(uname -m)/en-US/firefox-${FIREFOX_VERSION}.tar.bz2 -o firefox.tar.bz2 && \
tar xjf firefox.tar.bz2 -C /opt && \
rm firefox.tar.bz2 && \
ln -s /opt/firefox/firefox /usr/bin/firefox
CMD ["python", "zeus.py"]

View file

@ -1,8 +1,12 @@
**_NOTE: due to dumbass people, automatic issue creation has been turned off until further notice_**
----
[![GitHub stars](https://img.shields.io/github/stars/ekultek/zeus-scanner.svg?style=flat-square)](https://github.com/ekultek/zeus-scanner/stargazers)
[![GitHub forks](https://img.shields.io/github/forks/ekultek/zeus-scanner.svg?style=flat-square)](https://github.com/ekultek/zeus-scanner/network)
[![GitHub issues](https://img.shields.io/github/issues/ekultek/zeus-scanner.svg?style=flat-square)](https://github.com/ekultek/zeus-scanner/issues)
[![GitHub license](https://img.shields.io/badge/license-GPL-blue.svg?style=flat-square)](https://raw.githubusercontent.com/Ekultek/Zeus-Scanner/master/.github/LICENSE.md)
[![Twitter](https://img.shields.io/twitter/url/https/github.com/ekultek/zeus-scanner.svg?style=social)](https://twitter.com/Zeus_Scanner)
[![Twitter](https://img.shields.io/twitter/url/https/github.com/ekultek/zeus-scanner.svg?style=social)](https://twitter.com/stay__salty)
[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://github.com/Ekultek/Zeus-Scanner#donations)
# Helpful links directory
@ -80,7 +84,7 @@ There are some requirements for this to be run successfully.
##### Basic requirements
- `libxml2-dev`, `libxslt1-dev`, `python-dev` are required for the installation process
- Firefox web browser is required as of now, you will need Firefox version `<=57 >=51` (between 51 and 57). Full functionality for other browsers will eventually be added.
- Firefox web browser is required as of now, you will need Firefox version `<=58 >=52` (between 52 and 58). Full functionality for other browsers will eventually be added.
- If you want to run sqlmap through the URL's you will need sqlmap somewhere on your system.
- If you want to run a port scan using nmap on the URL's IP addresses. You will need nmap on your system.
- [Geckodriver](https://github.com/mozilla/geckodriver) is required to run the firefox web browser and will be installed the first time you run. It will be added to your `/usr/bin` so that it can be run in your ENV PATH.

View file

@ -1,5 +1,9 @@
import os
import sys
import time
import shlex
import platform
import threading
import subprocess
import tarfile
try:
@ -13,6 +17,27 @@ import lib.core.common
import lib.core.settings
stop_animation = False
xvfb_path = "{}/etc/scripts/install_xvfb.sh".format(os.getcwd())
def animation(text):
global stop_animation
i = 0
while not stop_animation:
temp_text = list(text)
if i >= len(temp_text):
i = 0
temp_text[i] = temp_text[i].upper()
temp_text = ''.join(temp_text)
sys.stdout.write("\033[92m{}\r\033[0m".format(temp_text))
sys.stdout.flush()
i += 1
time.sleep(0.1)
else:
pass
def disclaimer():
question = raw_input(
"\033[91mAttacking targets without consent is not only illegal, but it "
@ -46,6 +71,8 @@ def parse_hosts(filepath="/etc/hosts"):
def find_tools(to_search=("sqlmap", "nmap"), directory="{}/bin/paths", filename="path_config.ini"):
global stop_animation
lib.core.settings.create_dir(directory.format(os.getcwd()))
full_path = "{}/{}".format(
directory.format(os.getcwd()),
@ -62,6 +89,8 @@ def find_tools(to_search=("sqlmap", "nmap"), directory="{}/bin/paths", filename=
path_schema[item] = None
for key, value in path_schema.iteritems():
if value is None:
stop_animation = True
print("\n")
provided_path = lib.core.common.prompt(
"what is the full path to {} on your system".format(key)
)
@ -78,9 +107,9 @@ def config_gecko_version(browser_version):
figure out which gecko version you need
"""
version_specs = {
(56, 57): 19,
(55, 54): 18,
(53, 52, 51): 17
(57, 58): 19,
(56, 55, 54): 18,
(53, 52): 17
}
if isinstance(browser_version, (tuple, list, set)):
major = browser_version[0]
@ -112,11 +141,13 @@ def check_xvfb(exc="Xvfb"):
"""
test for xvfb on the users system
"""
global xvfb_path
global stop_animation
if whichcraft.which(exc) is None:
lib.core.settings.logger.info(lib.core.settings.set_color(
"installing Xvfb, required by pyvirutaldisplay"
))
subprocess.call(["sudo", "apt-get", "install", "xvfb"])
cmd = shlex.split("sudo sh {}".format(xvfb_path))
subprocess.call(cmd)
stop_animation = True
else:
return True
@ -136,19 +167,23 @@ def check_if_run(file_check="{}/bin/executed.txt"):
return True
def untar_gecko(filename="{}/bin/drivers/geckodriver-v0.{}.0-linux{}.tar.gz", verbose=False):
def untar_gecko(filename="{}/bin/drivers/geckodriver-v0.{}.0-linux{}.tar.gz"):
"""
untar the correct gecko driver for your computer architecture
"""
global stop_animation
arch_info = {"64bit": "64", "32bit": "32"}
file_arch = arch_info[platform.architecture()[0]]
ff_version = lib.core.settings.get_browser_version()
ff_version = lib.core.settings.get_browser_version(output=False)
if isinstance(ff_version, str) or ff_version is None:
stop_animation = True
ff_version = lib.core.common.prompt(
"enter your firefox browser version (if you don't know it run firefox --version"
"enter your firefox browser version (if you don't know it run firefox --version)"
)
gecko_version = config_gecko_version(ff_version)
if gecko_version is None:
stop_animation = True
lib.core.settings.logger.fatal(lib.core.settings.set_color(
"your current firefox version is not supported by Zeus", level=50
))
@ -157,22 +192,10 @@ def untar_gecko(filename="{}/bin/drivers/geckodriver-v0.{}.0-linux{}.tar.gz", ve
with open(lib.core.settings.GECKO_VERSION_INFO_PATH, "a+") as log:
log.write(gecko_full_filename.split("/")[-1])
tar = tarfile.open(filename.format(os.getcwd(), gecko_version, file_arch), "r:gz")
if verbose:
lib.core.settings.logger.debug(lib.core.settings.set_color(
"extracting the correct driver for your architecture", level=10
))
try:
tar.extractall("/usr/bin")
if verbose:
lib.core.settings.logger.debug(lib.core.settings.set_color(
"driver extracted into /usr/bin (you may change this, but ensure that it "
"is in your PATH)", level=10
))
except IOError as e:
if "Text file busy" in str(e):
lib.core.settings.logger.info(lib.core.settings.set_color(
"the driver is already installed"
))
tar.close()
pass
except Exception as e:
@ -192,10 +215,6 @@ def ensure_placed(item="geckodriver", verbose=False):
"""
use whichcraft to ensure that the driver has been placed in your PATH variable
"""
if verbose:
lib.core.settings.logger.debug(lib.core.settings.set_color(
"ensuring that the driver exists in your system path", level=10
))
if not whichcraft.which(item):
lib.core.settings.logger.fatal(lib.core.settings.set_color(
"the executable '{}' does not appear to be in your /usr/bin PATH. "
@ -204,10 +223,6 @@ def ensure_placed(item="geckodriver", verbose=False):
))
exit(-1)
else:
if verbose:
lib.core.settings.logger.debug(lib.core.settings.set_color(
"driver exists, continuing", level=10
))
return True
@ -215,10 +230,6 @@ def main(rewrite="{}/bin/executed.txt", verbose=False):
"""
main method
"""
if verbose:
lib.core.settings.logger.debug(lib.core.settings.set_color(
"verifying operating system", level=10
))
if not check_os():
raise NotImplementedError(lib.core.settings.set_color(
"as of now, Zeus requires Linux to run successfully "
@ -228,17 +239,13 @@ def main(rewrite="{}/bin/executed.txt", verbose=False):
if check_if_run():
if not disclaimer():
exit(1)
lib.core.settings.logger.info(lib.core.settings.set_color(
"seems this is your first time running the application, "
"doing setup please wait"
))
if verbose:
lib.core.settings.logger.debug(lib.core.settings.set_color(
"checking if xvfb is on your system", level=10
))
t = threading.Thread(target=animation, args=(
"seems this is your first time running the application, doing setup please wait..",))
t.daemon = True
t.start()
find_tools()
check_xvfb()
untar_gecko(verbose=verbose)
untar_gecko()
parse_hosts()
if ensure_placed(verbose=verbose):
with open(rewrite.format(os.getcwd()), "w") as rw:
@ -247,7 +254,4 @@ def main(rewrite="{}/bin/executed.txt", verbose=False):
"done, continuing process"
))
else:
if verbose:
lib.core.settings.logger.debug(lib.core.settings.set_color(
"already ran, skipping", level=10
))
pass

View file

@ -1,9 +1,10 @@
e46c781638861a5651a51a5a71f5d997 ./zeus.py
685a20fa3fc7652b5c3e39821cdc6f25 ./zeus.py
4b32db388e8acda35570c734d27c950c ./etc/scripts/launch_sqlmap.sh
6ad5f22ec4a6f8324bfb1b01ab6d51ec ./etc/scripts/cleanup.sh
869025acb457dc881e53e440aa11dd7b ./etc/scripts/reinstall.sh
155c9482f690f1482f324a7ffd8b8098 ./etc/scripts/fix_pie.sh
0e435c641bc636ac0b3d54e032d9cf6a ./etc/scripts/install_nmap.sh
440431165b2db8a537c1a93cb2232f16 ./etc/scripts/install_xvfb.sh
66b11aa388ea909de7b212341259a318 ./etc/auths/git_auth
8f686b05c5c5dfc02f0fcaa7ebc8677c ./etc/auths/whois_auth
d3ad89703575a712a0aeead2b176d8c5 ./etc/html/clickjacking_test_page.html
@ -15,7 +16,7 @@ cf85d83da34d70720193d83950c31fdc ./etc/text_files/xss_payloads.txt
5250f0aa13b8af4775efa506e77de1ce ./etc/xml/headers.xml
d41d8cd98f00b204e9800998ecf8427e ./bin/__init__.py
3be7ee6f4267e0d0cf2143b58792527b ./bin/paths/path_config.ini
a0e18eb30258bbab246f983b6af95d5c ./bin/unzip_gecko.py
fa5084cc7ee56ff2df8631b76be5be4d ./bin/unzip_gecko.py
c0d83f0b82a6b30de8811e69e6d95c61 ./bin/executed.txt
dc1eb4ebe0f372af48b5a9c107ebc68d ./bin/drivers/geckodriver-v0.18.0-linux32.tar.gz
be18faeea6e7db9db6990d8667e2298f ./bin/drivers/geckodriver-v0.17.0-linux64.tar.gz
@ -105,10 +106,10 @@ c5b69617f040fef1d5930948905aa8d0 ./lib/attacks/whois_lookup/whois.py
0114ebe3d45612ef143f2777f027374c ./lib/header_check/__init__.py
2a8acb2191d80da75f0e4d09c00df9f6 ./lib/core/common.py
de4254c5e40f7aa4fb81e0608f758a2c ./lib/core/decorators.py
4433353fb5c55578391d8b4006191ee8 ./lib/core/errors.py
3f045c64ef155a517b7a3f3b66905325 ./lib/core/errors.py
d41d8cd98f00b204e9800998ecf8427e ./lib/core/__init__.py
993a8df2025cfed6c0fa96cc1107f76b ./lib/core/settings.py
1db34403d9eed871a5c39baab6fe1efd ./lib/core/parse.py
0faeed8eac30526f3751dd67fe5c9f7e ./lib/core/settings.py
27bce5d5d1e7d01788c5273016b19370 ./lib/core/parse.py
d41d8cd98f00b204e9800998ecf8427e ./var/__init__.py
d41d8cd98f00b204e9800998ecf8427e ./var/auto_issue/__init__.py
c58e73857e42a07fa6eb559433b32c1a ./var/auto_issue/github.py

View file

@ -0,0 +1,4 @@
#!/usr/bin/env bash
sudo apt-get install xvfb --yes > /dev/null 2>&1

View file

@ -19,4 +19,7 @@ class InvalidInputProvided(Exception): pass
class InvalidTamperProvided(Exception): pass
class PortScanTimeOutException(Exception): pass
class PortScanTimeOutException(Exception): pass
class ZeusArgumentException(Exception): pass

View file

@ -1,3 +1,4 @@
import sys
from optparse import (
OptionParser,
OptionGroup,
@ -6,6 +7,7 @@ from optparse import (
import lib.core.settings
import lib.core.common
import lib.core.errors
import lib.attacks.nmap_scan.nmap_opts
import lib.attacks.sqlmap_scan.sqlmap_opts
@ -269,3 +271,25 @@ class ZeusParser(OptionParser):
))
lib.core.settings.update_zeus()
lib.core.common.shutdown()
@staticmethod
def verify_args(args=sys.argv):
not_implemented_args = (
"-T", "--x-threads", "--force-ssl", "--thread",
"-g", "--github-search", "-u", "--url"
)
# check if any of the arguments are not implemented that have been passed
# via the command line
# TODO:/
# need to create a way to parse all arguments for compatibility with one another
for arg in args:
for nia in not_implemented_args:
if arg == nia:
raise lib.core.errors.ZeusArgumentException(
"\n\nit appears that one of the arguments you have passed ('{}'), "
"has not been implemented into Zeus production yet. This usually means "
"that the option is still in testing and is not ready for use. Arguments "
"that are still in testing are: {}\n".format(
nia, ", ".join(["'{}'".format(a) for a in not_implemented_args])
)
)

View file

@ -44,7 +44,7 @@ CLONE = "https://github.com/ekultek/zeus-scanner.git"
ISSUE_LINK = "https://github.com/ekultek/zeus-scanner/issues"
# current version <major.minor.commit.patch ID>
VERSION = "1.5".format(PATCH_ID)
VERSION = "1.5.2.{}".format(PATCH_ID)
# colors to output depending on the version
VERSION_TYPE_COLORS = {"dev": 33, "stable": 92, "other": 30}
@ -600,28 +600,34 @@ def search_for_process(name):
return False if not any(name in proc for proc in list(all_process_names)) else True
def get_browser_version():
def get_browser_version(output=True):
"""
obtain the firefox browser version, this is necessary because zeus can only handle certain versions.
"""
logger.info(set_color(
"attempting to get firefox browser version"
))
if output:
logger.info(set_color(
"attempting to get firefox browser version"
))
try:
firefox_version_command = shlex.split("firefox --version")
output = subprocess.check_output(firefox_version_command)
except (OSError, Exception):
except OSError:
logger.error(set_color(
"failed to run firefox", level=50
))
return "failed to start"
try:
major, minor = map(int, re.search(r"(\d+).(\d+)", output).groups())
except (ValueError, Exception):
except ValueError:
logger.error(set_color(
"failed to parse '{}' for version number".format(output), level=50
))
return "failed to gather"
return output
except Exception as e:
logger.error(set_color(
"received and exception from firefox '{}'".format(str(e), level=50)
))
return str(e)
return major, minor

View file

@ -410,15 +410,15 @@ def parse_search_results(query, url_to_search, verbose=False, **kwargs):
"provided query has a {} success rate".format(success_rate)
))
else:
logger.fatal(set_color(
logger.warning(set_color(
"did not find any URLs with given query '{}' writing query to blacklist".format(query), level=50
))
write_to_log_file(query, BLACKLIST_FILE_PATH, BLACKLIST_FILENAME, blacklist=True)
shutdown()
logger.info(set_color(
"found a total of {} URLs with given query '{}'".format(len(true_retval), query)
))
return list(true_retval) if len(true_retval) != 0 else None
def search_multiple_pages(query, link_amount, verbose=False, **kwargs):

View file

@ -15,7 +15,8 @@ from lib.header_check import main_header_check
from lib.core.parse import ZeusParser
from lib.core.errors import (
InvalidInputProvided,
InvalidProxyType
InvalidProxyType,
ZeusArgumentException
)
from lib.core.common import (
start_up,
@ -53,6 +54,10 @@ if __name__ == "__main__":
ZeusParser().single_show_args(opt)
# verify all the arguments passed before we continue
# with the process
ZeusParser().verify_args()
# run the setup on the program
setup(verbose=opt.runInVerbose)
@ -378,6 +383,8 @@ if __name__ == "__main__":
"do not interrupt the browser when selenium is running, "
"it will cause Zeus to crash", level=30
))
except ZeusArgumentException:
shutdown()
except Exception as e:
if "url did not match a true url" in str(e).lower():
logger.error(set_color(