created a get_page function that does the requests for me, this way I'm not calling requests.get over and over again

This commit is contained in:
ekultek 2017-12-02 11:06:16 -06:00
parent ccd0f4920b
commit 30ffde95c3
8 changed files with 84 additions and 53 deletions

View file

@ -62,22 +62,22 @@ 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
ddf45537bdcea15d3b428495985bad09 ./lib/attacks/gist_lookup/__init__.py cf23d0f522b183bea9dc0fcf4aa64115 ./lib/attacks/gist_lookup/__init__.py
7183dbd7106ecb436176cebcca4e499f ./lib/attacks/clickjacking_scan/__init__.py 86224bd899c2a2438042cbdc077dc4cc ./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
8ec72bb33df998e32b925e3060d9d17a ./lib/attacks/whois_lookup/whois.py 8ec72bb33df998e32b925e3060d9d17a ./lib/attacks/whois_lookup/whois.py
67ac65be1b4394ad80ec0fd3472c5309 ./lib/attacks/admin_panel_finder/__init__.py 8c6f696f6a983e6309d7d09e409d97e6 ./lib/attacks/admin_panel_finder/__init__.py
acd30079085bd6be6e24fef80bdc669c ./lib/attacks/xss_scan/__init__.py 48ed675099dc8549a7d80bd2d9da7d17 ./lib/attacks/xss_scan/__init__.py
7642d078fe304a7ca8bfaaa070a0cb31 ./lib/attacks/nmap_scan/__init__.py 7642d078fe304a7ca8bfaaa070a0cb31 ./lib/attacks/nmap_scan/__init__.py
216999fa0e84866d5c1d96d5676034e4 ./lib/attacks/nmap_scan/nmap_opts.py 216999fa0e84866d5c1d96d5676034e4 ./lib/attacks/nmap_scan/nmap_opts.py
888686098a0850750f2435d0e1645944 ./lib/header_check/__init__.py 888686098a0850750f2435d0e1645944 ./lib/header_check/__init__.py
0721c655d433dbc170756f3e40a786cf ./lib/core/common.py 1c0535bf9fc6138d317bd1c31a2d7fe1 ./lib/core/common.py
4433353fb5c55578391d8b4006191ee8 ./lib/core/errors.py 4433353fb5c55578391d8b4006191ee8 ./lib/core/errors.py
d41d8cd98f00b204e9800998ecf8427e ./lib/core/__init__.py d41d8cd98f00b204e9800998ecf8427e ./lib/core/__init__.py
6057ea051ca9ed35fc5aa5811cdfca3d ./lib/core/settings.py c31e5ed269fe4ef888bf7eb4425539e4 ./lib/core/settings.py
801a4f7ac892b74676c649bd4844ccdb ./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
@ -85,4 +85,4 @@ cfcce04aac694eee7a6c73969861ce43 ./var/search/pgp_search.py
d41d8cd98f00b204e9800998ecf8427e ./var/__init__.py d41d8cd98f00b204e9800998ecf8427e ./var/__init__.py
d41d8cd98f00b204e9800998ecf8427e ./var/auto_issue/__init__.py d41d8cd98f00b204e9800998ecf8427e ./var/auto_issue/__init__.py
0c11c16126baf789388a661bbbefb149 ./var/auto_issue/github.py 0c11c16126baf789388a661bbbefb149 ./var/auto_issue/github.py
7608a7a8195d6d66ebae7664f25639fd ./var/blackwidow/__init__.py 222102e56b3f4b9facda7ed28690d3f7 ./var/blackwidow/__init__.py

View file

@ -7,7 +7,6 @@ try: # Python 2
except ImportError: # Python 3 except ImportError: # Python 3
from urllib2 import urlopen, HTTPError from urllib2 import urlopen, HTTPError
import requests
from requests.exceptions import ( from requests.exceptions import (
ConnectionError, ConnectionError,
TooManyRedirects TooManyRedirects
@ -41,9 +40,7 @@ def check_for_externals(url, data_sep="-" * 30, **kwargs):
try: try:
url = lib.core.settings.replace_http(url) url = lib.core.settings.replace_http(url)
full_url = "{}{}{}".format("http://", url, currently_searching) full_url = "{}{}{}".format("http://", url, currently_searching)
conn = requests.get(full_url) _, data, code, _ = lib.core.common.get_page(full_url)
data = conn.content
code = conn.status_code
except (TooManyRedirects, ConnectionError): except (TooManyRedirects, ConnectionError):
lib.core.settings.logger.error(lib.core.settings.set_color( lib.core.settings.logger.error(lib.core.settings.set_color(
"connection to '{}' failed, assuming does not exist and continuing...".format(full_url), level=40 "connection to '{}' failed, assuming does not exist and continuing...".format(full_url), level=40

View file

@ -1,5 +1,3 @@
import requests
import lib.core.common import lib.core.common
import lib.core.settings import lib.core.settings
import var.auto_issue.github import var.auto_issue.github
@ -41,7 +39,7 @@ class ClickJackingScanner(object):
lib.core.common.HTTP_HEADER.USER_AGENT: agent, lib.core.common.HTTP_HEADER.USER_AGENT: agent,
lib.core.common.HTTP_HEADER.CONNECTION: "close" lib.core.common.HTTP_HEADER.CONNECTION: "close"
} }
req = requests.get(self.url, headers=headers, proxies=lib.core.settings.proxy_string_to_dict(proxy)) req, _, _, headers = lib.core.common.get_page(self.url, headers=headers, proxy=proxy)
headers = req.headers headers = req.headers
if self.safe in headers: if self.safe in headers:
return False return False

View file

@ -12,10 +12,10 @@ def __check_remaining_rate_limit():
check how many requests you have left to run check how many requests you have left to run
""" """
url = lib.core.settings.GITHUB_GIST_SEARCH_URLS["check_rate"] url = lib.core.settings.GITHUB_GIST_SEARCH_URLS["check_rate"]
data = requests.get(url, params={lib.core.common.HTTP_HEADER.AUTHORIZATION: "token {}".format( _, _, data, headers = lib.core.common.get_page(url, auth="token {}".format(
lib.core.settings.get_token(lib.core.settings.GITHUB_AUTH_PATH) lib.core.settings.get_token(lib.core.settings.GITHUB_AUTH_PATH)
)}) ))
remaining = data.headers["X-RateLimit-Remaining"] remaining = headers["X-RateLimit-Remaining"]
if int(remaining) == 0: if int(remaining) == 0:
lib.core.settings.logger.error(lib.core.settings.set_color( lib.core.settings.logger.error(lib.core.settings.set_color(
"Github only allows 60 unauthenticated requests per hour, you have hit that limit " "Github only allows 60 unauthenticated requests per hour, you have hit that limit "
@ -45,7 +45,7 @@ def get_raw_data(page_set, proxy=None, agent=None, verbose=False):
if proxy is not None: if proxy is not None:
proxy = lib.core.settings.proxy_string_to_dict(proxy) proxy = lib.core.settings.proxy_string_to_dict(proxy)
for page in list(page_set): for page in list(page_set):
data = requests.get(url.format(page), params=headers, proxies=proxy) _, _, data, _ = lib.core.common.get_page(url.format(page), agent=agent, proxy=proxy)
# load the found info into JSON format # load the found info into JSON format
# so we can pull using keys # so we can pull using keys
data = json.loads(data.content) data = json.loads(data.content)
@ -94,13 +94,13 @@ def check_files_for_information(found_url, data_to_search):
) )
total_found = set() total_found = set()
try: try:
data = requests.get(found_url) _, _, data, _ = lib.core.common.get_page(found_url)
except requests.exceptions.ConnectionError: except requests.exceptions.ConnectionError:
lib.core.settings.logger.warning(lib.core.settings.set_color( lib.core.settings.logger.warning(lib.core.settings.set_color(
"to many requests are being sent to quickly, adding sleep time...", level=30 "to many requests are being sent to quickly, adding sleep time...", level=30
)) ))
time.sleep(3) time.sleep(3)
data = requests.get(found_url) _, _, data, _ = lib.core.common.get_page(found_url)
for data_regex in data_regex_schema: for data_regex in data_regex_schema:
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(

View file

@ -108,23 +108,15 @@ def scan_xss(url, agent=None, proxy=None):
chance that the URL is vulnerable to XSS attacks. Usually what will happen is the payload will chance that the URL is vulnerable to XSS attacks. Usually what will happen is the payload will
be tampered or encoded if the site is not vulnerable be tampered or encoded if the site is not vulnerable
""" """
user_agent = agent or lib.core.settings.DEFAULT_USER_AGENT
config_proxy = lib.core.settings.proxy_string_to_dict(proxy)
config_headers = {
lib.core.common.HTTP_HEADER.CONNECTION: "close",
lib.core.common.HTTP_HEADER.USER_AGENT: user_agent
}
try: try:
xss_request = requests.get(url, proxies=config_proxy, headers=config_headers) _, status, html_data, _ = lib.core.common.get_page(url, agent=agent, proxy=proxy)
except requests.exceptions.ChunkedEncodingError: except requests.exceptions.ChunkedEncodingError:
lib.core.settings.logger.warning(lib.core.settings.set_color( lib.core.settings.logger.warning(lib.core.settings.set_color(
"encoding seems to be messed up, trying the request again...", level=30 "encoding seems to be messed up, trying the request again...", level=30
)) ))
xss_request = requests.get(url, proxies=config_proxy, headers=config_headers) _, status, html_data, _ = lib.core.common.get_page(url, agent=agent, proxy=proxy)
status = xss_request.status_code
html_data = xss_request.content
query = find_xss_script(url) query = find_xss_script(url)
for db in lib.core.settings.DBMS_ERRORS.keys(): for db in lib.core.settings.DBMS_ERRORS.keys():
for item in lib.core.settings.DBMS_ERRORS[db]: for item in lib.core.settings.DBMS_ERRORS[db]:
@ -149,10 +141,9 @@ def main_xss(start_url, proxy=None, agent=None, **kwargs):
"candidate to perform XSS tests on, would you like to continue anyways" "candidate to perform XSS tests on, would you like to continue anyways"
) )
if not batch: if not batch:
if not lib.core.settings.URL_QUERY_REGEX.match(start_url): question = lib.core.common.prompt(
question = lib.core.common.prompt( question_msg, opts="yN"
question_msg, opts="yN" ) if not lib.core.settings.URL_QUERY_REGEX.match(start_url) else "y"
)
else: else:
question = lib.core.common.prompt( question = lib.core.common.prompt(
question_msg, opts="yN", default="y" question_msg, opts="yN", default="y"

View file

@ -13,6 +13,7 @@ except ImportError:
unquote unquote
) )
import requests
from lxml import etree from lxml import etree
import lib.core.settings import lib.core.settings
@ -281,3 +282,55 @@ def run_fix(message, command, fail_message, exit_process=False):
lib.core.settings.logger.fatal(lib.core.settings.set_color( lib.core.settings.logger.fatal(lib.core.settings.set_color(
fail_message, level=50 fail_message, level=50
)) ))
def get_page(url, **kwargs):
agent = kwargs.get("agent", None)
proxy = kwargs.get("proxy", None)
xforward = kwargs.get("xforward", False)
auth = kwargs.get("auth", None)
skip_verf = kwargs.get("skip_verf", False)
if agent is None:
agent = lib.core.settings.DEFAULT_USER_AGENT
if xforward:
ip_list = (
lib.core.settings.create_random_ip(),
lib.core.settings.create_random_ip(),
lib.core.settings.create_random_ip()
)
headers = {
HTTP_HEADER.CONNECTION: "close",
HTTP_HEADER.USER_AGENT: agent,
HTTP_HEADER.X_FORWARDED_FOR: "{}, {}, {}".format(
ip_list[0], ip_list[1], ip_list[2]
)
}
elif auth:
headers = {
HTTP_HEADER.CONNECTION: "close",
HTTP_HEADER.USER_AGENT: agent,
HTTP_HEADER.AUTHORIZATION: "{}".format(
auth
)
}
else:
headers = {
HTTP_HEADER.CONNECTION: "close",
HTTP_HEADER.USER_AGENT: agent
}
if proxy is not None:
proxies = {
"https": proxy,
"http": proxy
}
else:
proxies = {}
req = requests.get(url, params=headers, proxies=proxies, verify=False if skip_verf else True)
status = req.status_code
html = req.content
headers = req.headers
return req, status, html, headers

View file

@ -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.14.{}".format(PATCH_ID) VERSION = "1.3.15".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}

View file

@ -3,7 +3,6 @@ import sys
reload(sys) reload(sys)
sys.setdefaultencoding("utf-8") # this will take care of most of the Unicode errors. sys.setdefaultencoding("utf-8") # this will take care of most of the Unicode errors.
import requests
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
import lib.core.errors import lib.core.errors
@ -23,17 +22,6 @@ class Blackwidow(object):
self.forward = forward or None self.forward = forward or None
self.proxy = lib.core.settings.proxy_string_to_dict(proxy) or None self.proxy = lib.core.settings.proxy_string_to_dict(proxy) or None
self.user_agent = user_agent or lib.core.settings.DEFAULT_USER_AGENT self.user_agent = user_agent or lib.core.settings.DEFAULT_USER_AGENT
if self.forward is not None:
self.headers = {
"user-agent": self.user_agent,
"X-Forwarded-For": "{}, {}, {}".format(
self.forward[0], self.forward[1], self.forward[2]
)
}
else:
self.headers = {
"user-agent": self.user_agent
}
@staticmethod @staticmethod
def get_url_ext(url): def get_url_ext(url):
@ -52,10 +40,13 @@ class Blackwidow(object):
""" """
try: try:
# verify=False will take care of SSLErrors # verify=False will take care of SSLErrors
attempt = requests.get(self.url, params=self.headers, proxies=self.proxy, verify=False) attempt, status, _, _ = lib.core.common.get_page(
if attempt.status_code == 200: self.url, agent=self.user_agent, xforward=self.forward, skip_verf=True,
return ("ok", None) proxy=self.proxy
return ("fail", attempt.status_code) )
if status == 200:
return "ok", None
return "fail", attempt.status_code
except Exception as e: except Exception as e:
if "Max retries exceeded with url" in str(e): if "Max retries exceeded with url" in str(e):
info_msg = "" info_msg = ""
@ -84,8 +75,9 @@ class Blackwidow(object):
""" """
unique_links = set() unique_links = set()
true_url = lib.core.settings.replace_http(given_url) true_url = lib.core.settings.replace_http(given_url)
req = requests.get(given_url, params=self.headers, proxies=self.proxy) _, status, html_page, _ = lib.core.common.get_page(
html_page = req.content given_url, agent=self.user_agent, proxy=self.proxy
)
soup = BeautifulSoup(html_page, "html.parser") soup = BeautifulSoup(html_page, "html.parser")
for link in soup.findAll(attribute): for link in soup.findAll(attribute):
found_redirect = str(link.get(descriptor)).decode("unicode_escape") found_redirect = str(link.get(descriptor)).decode("unicode_escape")