From a8762a4adabe30ae1983ba239b883d527b04229a Mon Sep 17 00:00:00 2001 From: oriagmon Date: Wed, 17 Oct 2018 11:32:50 +0300 Subject: [PATCH 01/12] Fixed PR: Used the same lock for each variable & changed locks names --- kube-hunter.py | 19 +++++++++---------- src/core/events/types/common.py | 13 +++++++------ src/modules/report/collector.py | 20 +++++++++++++++++--- src/modules/report/plain.py | 23 ++++++++++------------- src/modules/report/yaml.py | 20 ++++++++++---------- 5 files changed, 53 insertions(+), 42 deletions(-) diff --git a/kube-hunter.py b/kube-hunter.py index 77fa06c..90b7c99 100755 --- a/kube-hunter.py +++ b/kube-hunter.py @@ -82,7 +82,7 @@ def list_hunters(): print("\nPassive Hunters:\n----------------") for i, (hunter, docs) in enumerate(handler.passive_hunters.items()): name, docs = parse_docs(hunter, docs) - print("* {}\n {}\n".format( name, docs)) + print("* {}\n {}\n".format(name, docs)) if config.active: print("\n\nActive Hunters:\n---------------") @@ -91,10 +91,11 @@ def list_hunters(): print("* {}\n {}\n".format( name, docs)) -tlock3 = threading.Lock() -tlock3.acquire() +global hunt_started_lock +hunt_started_lock = threading.Lock() +hunt_started_lock.acquire() hunt_started = False -tlock3.release() +hunt_started_lock.release() def main(): @@ -112,10 +113,9 @@ def main(): if not any(scan_options): if not interactive_set_config(): return - tlock = threading.Lock() - tlock.acquire() + hunt_started_lock.acquire() hunt_started = True - tlock.release() + hunt_started_lock.release() handler.publish_event(HuntStarted()) handler.publish_event(HostScanEvent()) @@ -127,14 +127,13 @@ def main(): except EOFError: logging.error("\033[0;31mPlease run again with -it\033[0m") finally: - tlock2 = threading.Lock() - tlock2.acquire() + hunt_started_lock.acquire() if hunt_started: handler.publish_event(HuntFinished()) handler.join() handler.free() logging.debug("Cleaned Queue") - tlock2.release() + hunt_started_lock.release() if __name__ == '__main__': diff --git a/src/core/events/types/common.py b/src/core/events/types/common.py index d19dc2f..1822f12 100644 --- a/src/core/events/types/common.py +++ b/src/core/events/types/common.py @@ -65,10 +65,12 @@ class Vulnerability(object): def explain(self): return self.__doc__ -tlock1 = threading.Lock() -tlock1.acquire() + +global event_id_count_lock +event_id_count_lock = threading.Lock() +event_id_count_lock.acquire() event_id_count = 0 -tlock1.release() +event_id_count_lock.release() """ Discovery/Hunting Events """ @@ -78,11 +80,10 @@ class NewHostEvent(Event): global event_id_count self.host = host self.cloud = cloud - tlock = threading.Lock() - tlock.acquire() + event_id_count_lock.acquire() self.event_id = event_id_count event_id_count += 1 - tlock.release() + event_id_count_lock.release() def __str__(self): return str(self.host) diff --git a/src/modules/report/collector.py b/src/modules/report/collector.py index fa50cb0..5bf0a25 100644 --- a/src/modules/report/collector.py +++ b/src/modules/report/collector.py @@ -5,8 +5,21 @@ from src.core.events import handler from src.core.events.types import Event, Service, Vulnerability, HuntFinished, HuntStarted import threading + +global services_lock +services_lock = threading.Lock() +services_lock.acquire() services = list() +services_lock.release() + +global vulnerabilities_lock +vulnerabilities_lock = threading.Lock() +vulnerabilities_lock.acquire() vulnerabilities = list() +vulnerabilities_lock.release() + + + def console_trim(text, prefix=' '): @@ -38,12 +51,12 @@ class Collector(object): def execute(self): """function is called only when collecting data""" - tlock = threading.Lock() - tlock.acquire() global services, vulnerabilities bases = self.event.__class__.__mro__ if Service in bases: + services_lock.acquire() services.append(self.event) + services_lock.release() import datetime logging.info("|\n| {name}:\n| type: open service\n| service: {name}\n|_ host: {host}:{port}".format( host=self.event.host, @@ -53,7 +66,9 @@ class Collector(object): )) elif Vulnerability in bases: + vulnerabilities_lock.acquire() vulnerabilities.append(self.event) + vulnerabilities_lock.release() logging.info( "|\n| {name}:\n| type: vulnerability\n| host: {host}:{port}\n| description: \n{desc}".format( name=self.event.get_name(), @@ -61,7 +76,6 @@ class Collector(object): port=self.event.port, desc=wrap_last_line(console_trim(self.event.explain(), '| ')) )) - tlock.release() class TablesPrinted(Event): diff --git a/src/modules/report/plain.py b/src/modules/report/plain.py index 64d2dda..0464e6e 100644 --- a/src/modules/report/plain.py +++ b/src/modules/report/plain.py @@ -3,7 +3,7 @@ from __future__ import print_function from prettytable import ALL, PrettyTable from __main__ import config -from collector import services, vulnerabilities +from collector import services, vulnerabilities,services_lock, vulnerabilities_lock import threading EVIDENCE_PREVIEW = 40 @@ -15,8 +15,7 @@ class PlainReporter(object): def get_report(self): """generates report tables""" output = "" - tlock = threading.Lock - tlock.acquire() + services_lock.acquire() if len(services): output += self.nodes_table() if not config.mapping: @@ -27,7 +26,7 @@ class PlainReporter(object): output += "\nNo vulnerabilities were found" else: print("\nKube Hunter couldn't find any clusters") - tlock.release() + services_lock.release() # print("\nKube Hunter couldn't find any clusters. {}".format("Maybe try with --active?" if not config.active else "")) return output @@ -41,13 +40,12 @@ class PlainReporter(object): nodes_table.header_style = "upper" # TODO: replace with sets id_memory = list() - tlock = threading.Lock - tlock.acquire() + services_lock.acquire() for service in services: if service.event_id not in id_memory: nodes_table.add_row(["Node/Master", service.host]) id_memory.append(service.event_id) - tlock.release() + services_lock.acquire() return "\nNodes\n{}\n".format(nodes_table) def services_table(self): @@ -58,11 +56,10 @@ class PlainReporter(object): services_table.sortby = "Service" services_table.reversesort = True services_table.header_style = "upper" - tlock = threading.Lock - tlock.acquire() + services_lock.acquire() for service in services: services_table.add_row([service.get_name(), "{}:{}{}".format(service.host, service.port, service.get_path()), service.explain()]) - tlock.release() + services_lock.release() return "\nDetected Services\n{}\n".format(services_table) def vulns_table(self): @@ -74,12 +71,12 @@ class PlainReporter(object): vuln_table.reversesort = True vuln_table.padding_width = 1 vuln_table.header_style = "upper" - tlock = threading.Lock - tlock.acquire() + + vulnerabilities_lock.acquire() for vuln in vulnerabilities: row = ["{}:{}".format(vuln.host, vuln.port) if vuln.host else "", vuln.category.name, vuln.get_name(), vuln.explain()] evidence = str(vuln.evidence)[:EVIDENCE_PREVIEW] + "..." if len(str(vuln.evidence)) > EVIDENCE_PREVIEW else str(vuln.evidence) row.append(evidence) vuln_table.add_row(row) - tlock.release() + vulnerabilities_lock.release() return "\nVulnerabilities\n{}\n".format(vuln_table) diff --git a/src/modules/report/yaml.py b/src/modules/report/yaml.py index 2a0b372..80ae1fd 100644 --- a/src/modules/report/yaml.py +++ b/src/modules/report/yaml.py @@ -2,17 +2,20 @@ import StringIO from ruamel.yaml import YAML -from collector import services, vulnerabilities +from collector import services, vulnerabilities, services_lock, vulnerabilities_lock import threading + class YAMLReporter(object): def get_report(self): yaml = YAML() + vulnerabilities_lock.acquire() report = { "nodes": self.get_nodes(), "services": self.get_services(), "vulnerabilities": self.get_vulenrabilities() } + vulnerabilities_lock.release() output = StringIO.StringIO() yaml.dump(report, output) return output.getvalue() @@ -20,34 +23,31 @@ class YAMLReporter(object): def get_nodes(self): nodes = list() node_locations = set() - tlock = threading.Lock - tlock.acquire() + services_lock.acquire() for service in services: node_location = str(service.host) if node_location not in node_locations: nodes.append({"type": "Node/Master", "location": str(service.host)}) node_locations.add(node_location) - tlock.release() + services_lock.release() return nodes def get_services(self): - tlock = threading.Lock - tlock.acquire() + services_lock.acquire() services_data = [{"service": service.get_name(), "location": "{}:{}{}".format(service.host, service.port, service.get_path()), "description": service.explain()} for service in services] - tlock.release() + services_lock.release() return services_data def get_vulenrabilities(self): - tlock = threading.Lock - tlock.acquire() + vulnerabilities_lock.acquire() vulnerabilities_data = [{"location": "{}:{}".format(vuln.host, vuln.port) if vuln.host else "", "category": vuln.category.name, "vulnerability": vuln.get_name(), "description": vuln.explain(), "evidence": str(vuln.evidence)} for vuln in vulnerabilities] - tlock.release() + vulnerabilities_lock.release() return vulnerabilities_data From 87232a12cdbc2827e3a417750c1c785e794f3963 Mon Sep 17 00:00:00 2001 From: oriagmon Date: Wed, 17 Oct 2018 12:36:04 +0300 Subject: [PATCH 02/12] Fixed PR: Used the same lock for each variable & changed locks names --- kube-hunter.py | 6 ++++-- src/core/events/handler.py | 4 +++- src/modules/discovery/hosts.py | 2 +- src/modules/report/collector.py | 3 --- src/modules/report/plain.py | 13 ++++++++++--- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/kube-hunter.py b/kube-hunter.py index 90b7c99..afea10b 100755 --- a/kube-hunter.py +++ b/kube-hunter.py @@ -129,15 +129,17 @@ def main(): finally: hunt_started_lock.acquire() if hunt_started: + hunt_started_lock.release() handler.publish_event(HuntFinished()) handler.join() handler.free() logging.debug("Cleaned Queue") - hunt_started_lock.release() + else: + hunt_started_lock.release() if __name__ == '__main__': - for i in range(6): + for i in range(1): try: main() except: diff --git a/src/core/events/handler.py b/src/core/events/handler.py index 8e3b109..017cb0f 100644 --- a/src/core/events/handler.py +++ b/src/core/events/handler.py @@ -75,7 +75,9 @@ class EventQueue(Queue, object): hook = self.get() try: hook.execute() - except Exception as ex: + except Exception as ex: + import traceback + traceback.print_exc() logging.debug(ex.message) self.task_done() logging.debug("closing thread...") diff --git a/src/modules/discovery/hosts.py b/src/modules/discovery/hosts.py index bdc6b39..7e432ef 100644 --- a/src/modules/discovery/hosts.py +++ b/src/modules/discovery/hosts.py @@ -50,7 +50,7 @@ class HostDiscovery(Hunter): def __init__(self, event): self.event = event - def execute(self): + def execute(self): if config.cidr: try: ip, sn = config.cidr.split('/') diff --git a/src/modules/report/collector.py b/src/modules/report/collector.py index 5bf0a25..fd41bd2 100644 --- a/src/modules/report/collector.py +++ b/src/modules/report/collector.py @@ -19,9 +19,6 @@ vulnerabilities = list() vulnerabilities_lock.release() - - - def console_trim(text, prefix=' '): a = text.split(" ") b = a[:] diff --git a/src/modules/report/plain.py b/src/modules/report/plain.py index 0464e6e..e6cbf5e 100644 --- a/src/modules/report/plain.py +++ b/src/modules/report/plain.py @@ -17,14 +17,19 @@ class PlainReporter(object): output = "" services_lock.acquire() if len(services): + services_lock.release() output += self.nodes_table() if not config.mapping: output += self.services_table() + vulnerabilities_lock.acquire() if len(vulnerabilities): + vulnerabilities_lock.release() output += self.vulns_table() else: + vulnerabilities_lock.release() output += "\nNo vulnerabilities were found" else: + services_lock.release() print("\nKube Hunter couldn't find any clusters") services_lock.release() # print("\nKube Hunter couldn't find any clusters. {}".format("Maybe try with --active?" if not config.active else "")) @@ -45,8 +50,9 @@ class PlainReporter(object): if service.event_id not in id_memory: nodes_table.add_row(["Node/Master", service.host]) id_memory.append(service.event_id) - services_lock.acquire() - return "\nNodes\n{}\n".format(nodes_table) + nodes_ret = "\nNodes\n{}\n".format(nodes_table) + services_lock.release() + return nodes_ret def services_table(self): services_table = PrettyTable(["Service", "Location", "Description"], hrules=ALL) @@ -59,8 +65,9 @@ class PlainReporter(object): services_lock.acquire() for service in services: services_table.add_row([service.get_name(), "{}:{}{}".format(service.host, service.port, service.get_path()), service.explain()]) + detected_services_ret = "\nDetected Services\n{}\n".format(services_table) services_lock.release() - return "\nDetected Services\n{}\n".format(services_table) + return detected_services_ret def vulns_table(self): column_names = ["Location", "Category", "Vulnerability", "Description", "Evidence"] From 655467c27abdd34457b20f0186d906fe25411fac Mon Sep 17 00:00:00 2001 From: oriagmon Date: Wed, 17 Oct 2018 12:53:31 +0300 Subject: [PATCH 03/12] Solved hidden exception that stopped program normal run. --- src/core/events/handler.py | 2 -- src/modules/report/plain.py | 1 - 2 files changed, 3 deletions(-) diff --git a/src/core/events/handler.py b/src/core/events/handler.py index 017cb0f..476ea48 100644 --- a/src/core/events/handler.py +++ b/src/core/events/handler.py @@ -76,8 +76,6 @@ class EventQueue(Queue, object): try: hook.execute() except Exception as ex: - import traceback - traceback.print_exc() logging.debug(ex.message) self.task_done() logging.debug("closing thread...") diff --git a/src/modules/report/plain.py b/src/modules/report/plain.py index e6cbf5e..c474656 100644 --- a/src/modules/report/plain.py +++ b/src/modules/report/plain.py @@ -31,7 +31,6 @@ class PlainReporter(object): else: services_lock.release() print("\nKube Hunter couldn't find any clusters") - services_lock.release() # print("\nKube Hunter couldn't find any clusters. {}".format("Maybe try with --active?" if not config.active else "")) return output From 26f3878f7c18157ca139b28fe555af26268abc54 Mon Sep 17 00:00:00 2001 From: oriagmon Date: Wed, 17 Oct 2018 15:28:18 +0300 Subject: [PATCH 04/12] Using stricter locking "policy" --- kube-hunter.py | 4 +++- src/core/events/handler.py | 4 +++- src/core/events/types/common.py | 2 ++ src/modules/report/collector.py | 7 ++++++- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/kube-hunter.py b/kube-hunter.py index afea10b..6099921 100755 --- a/kube-hunter.py +++ b/kube-hunter.py @@ -99,7 +99,9 @@ hunt_started_lock.release() def main(): - global hunt_started + hunt_started_lock.acquire() + global hunt_started + hunt_started_lock.release() scan_options = [ config.pod, config.cidr, diff --git a/src/core/events/handler.py b/src/core/events/handler.py index 476ea48..012415a 100644 --- a/src/core/events/handler.py +++ b/src/core/events/handler.py @@ -91,5 +91,7 @@ class EventQueue(Queue, object): self.running = False with self.mutex: self.queue.clear() - + + handler = EventQueue(800) + diff --git a/src/core/events/types/common.py b/src/core/events/types/common.py index 1822f12..efb778c 100644 --- a/src/core/events/types/common.py +++ b/src/core/events/types/common.py @@ -77,7 +77,9 @@ event_id_count_lock.release() class NewHostEvent(Event): def __init__(self, host, cloud=None): + event_id_count_lock.acquire() global event_id_count + event_id_count_lock.release() self.host = host self.cloud = cloud event_id_count_lock.acquire() diff --git a/src/modules/report/collector.py b/src/modules/report/collector.py index fd41bd2..c816039 100644 --- a/src/modules/report/collector.py +++ b/src/modules/report/collector.py @@ -48,7 +48,12 @@ class Collector(object): def execute(self): """function is called only when collecting data""" - global services, vulnerabilities + services_lock.acquire() + global services + services_lock.release() + vulnerabilities_lock.acquire() + global vulnerabilities + vulnerabilities_lock.release() bases = self.event.__class__.__mro__ if Service in bases: services_lock.acquire() From a109dd956b3a6e3cd609f2990ca51c9cc261bdc3 Mon Sep 17 00:00:00 2001 From: oriagmon Date: Wed, 17 Oct 2018 17:54:11 +0300 Subject: [PATCH 05/12] found another variable I think should be locked --- src/core/events/handler.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/core/events/handler.py b/src/core/events/handler.py index 012415a..662b65e 100644 --- a/src/core/events/handler.py +++ b/src/core/events/handler.py @@ -10,9 +10,10 @@ from __main__ import config from ..types import ActiveHunter, Hunter from ...core.events.types import HuntFinished -import threading -working_count = 0 +global is_running_lock +is_running_lock = Lock() + # Inherits Queue object, handles events asynchronously class EventQueue(Queue, object): @@ -22,7 +23,9 @@ class EventQueue(Queue, object): self.active_hunters = dict() self.hooks = defaultdict(list) + is_running_lock.acquire() self.running = True + is_running_lock.release() self.workers = list() for i in range(num_worker): @@ -34,14 +37,14 @@ class EventQueue(Queue, object): t.daemon = True t.start() - # decorator wrapping for easy subscription def subscribe(self, event, hook=None, predicate=None): def wrapper(hook): self.subscribe_event(event, hook=hook, predicate=predicate) return hook + return wrapper - + # getting uninstantiated event object def subscribe_event(self, event, hook=None, predicate=None): if ActiveHunter in hook.__mro__: @@ -71,6 +74,7 @@ class EventQueue(Queue, object): # executes callbacks on dedicated thread as a daemon def worker(self): + is_running_lock.acquire() while self.running: hook = self.get() try: @@ -78,17 +82,20 @@ class EventQueue(Queue, object): except Exception as ex: logging.debug(ex.message) self.task_done() + is_running_lock.release() logging.debug("closing thread...") def notifier(self): - time.sleep(2) + time.sleep(2) while self.unfinished_tasks > 0: logging.debug("{} tasks left".format(self.unfinished_tasks)) time.sleep(3) # stops execution of all daemons def free(self): + is_running_lock.acquire() self.running = False + is_running_lock.release() with self.mutex: self.queue.clear() From 6602821a80e1842f9e581a48989a5b2bc176d58e Mon Sep 17 00:00:00 2001 From: oriagmon Date: Wed, 17 Oct 2018 20:21:27 +0300 Subject: [PATCH 06/12] DONE --- src/core/events/handler.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/core/events/handler.py b/src/core/events/handler.py index 662b65e..2ce090a 100644 --- a/src/core/events/handler.py +++ b/src/core/events/handler.py @@ -11,6 +11,9 @@ from ..types import ActiveHunter, Hunter from ...core.events.types import HuntFinished +global queue_lock +queue_lock = Lock() + global is_running_lock is_running_lock = Lock() @@ -23,9 +26,10 @@ class EventQueue(Queue, object): self.active_hunters = dict() self.hooks = defaultdict(list) - is_running_lock.acquire() + #is_running_lock.acquire() + self.running = True - is_running_lock.release() + #is_running_lock.release() self.workers = list() for i in range(num_worker): @@ -74,15 +78,15 @@ class EventQueue(Queue, object): # executes callbacks on dedicated thread as a daemon def worker(self): - is_running_lock.acquire() while self.running: + queue_lock.acquire() hook = self.get() + queue_lock.release() try: hook.execute() except Exception as ex: logging.debug(ex.message) self.task_done() - is_running_lock.release() logging.debug("closing thread...") def notifier(self): @@ -93,9 +97,9 @@ class EventQueue(Queue, object): # stops execution of all daemons def free(self): - is_running_lock.acquire() + #is_running_lock.acquire() self.running = False - is_running_lock.release() + #is_running_lock.release() with self.mutex: self.queue.clear() From 7e324c5374951fcb2838f628bdf79956598dbfc3 Mon Sep 17 00:00:00 2001 From: oriagmon Date: Sun, 21 Oct 2018 10:47:48 +0300 Subject: [PATCH 07/12] Fixed safe to change PR comments. the next fixes of these PR would need to be tested --- kube-hunter.py | 9 ++------- src/core/events/handler.py | 8 -------- src/modules/report/yaml.py | 1 - 3 files changed, 2 insertions(+), 16 deletions(-) diff --git a/kube-hunter.py b/kube-hunter.py index 6099921..2d8548c 100755 --- a/kube-hunter.py +++ b/kube-hunter.py @@ -141,10 +141,5 @@ def main(): if __name__ == '__main__': - for i in range(1): - try: - main() - except: - import traceback - print ('\n\n\n\n\n\n\n\n\n') - traceback.print_exc() + main() + diff --git a/src/core/events/handler.py b/src/core/events/handler.py index 2ce090a..af5ddb1 100644 --- a/src/core/events/handler.py +++ b/src/core/events/handler.py @@ -14,9 +14,6 @@ from ...core.events.types import HuntFinished global queue_lock queue_lock = Lock() -global is_running_lock -is_running_lock = Lock() - # Inherits Queue object, handles events asynchronously class EventQueue(Queue, object): @@ -26,10 +23,7 @@ class EventQueue(Queue, object): self.active_hunters = dict() self.hooks = defaultdict(list) - #is_running_lock.acquire() - self.running = True - #is_running_lock.release() self.workers = list() for i in range(num_worker): @@ -97,9 +91,7 @@ class EventQueue(Queue, object): # stops execution of all daemons def free(self): - #is_running_lock.acquire() self.running = False - #is_running_lock.release() with self.mutex: self.queue.clear() diff --git a/src/modules/report/yaml.py b/src/modules/report/yaml.py index 80ae1fd..fe96af9 100644 --- a/src/modules/report/yaml.py +++ b/src/modules/report/yaml.py @@ -3,7 +3,6 @@ import StringIO from ruamel.yaml import YAML from collector import services, vulnerabilities, services_lock, vulnerabilities_lock -import threading class YAMLReporter(object): From 76692a36d76fe1b085b4b9915744017090e2b37e Mon Sep 17 00:00:00 2001 From: oriagmon Date: Sun, 21 Oct 2018 10:53:50 +0300 Subject: [PATCH 08/12] Finished with the left of the PR comments. --- kube-hunter.py | 4 ---- src/core/events/types/common.py | 2 -- src/modules/report/collector.py | 4 ---- src/modules/report/plain.py | 1 - 4 files changed, 11 deletions(-) diff --git a/kube-hunter.py b/kube-hunter.py index 2d8548c..cd43b88 100755 --- a/kube-hunter.py +++ b/kube-hunter.py @@ -93,15 +93,11 @@ def list_hunters(): global hunt_started_lock hunt_started_lock = threading.Lock() -hunt_started_lock.acquire() hunt_started = False -hunt_started_lock.release() def main(): - hunt_started_lock.acquire() global hunt_started - hunt_started_lock.release() scan_options = [ config.pod, config.cidr, diff --git a/src/core/events/types/common.py b/src/core/events/types/common.py index efb778c..1822f12 100644 --- a/src/core/events/types/common.py +++ b/src/core/events/types/common.py @@ -77,9 +77,7 @@ event_id_count_lock.release() class NewHostEvent(Event): def __init__(self, host, cloud=None): - event_id_count_lock.acquire() global event_id_count - event_id_count_lock.release() self.host = host self.cloud = cloud event_id_count_lock.acquire() diff --git a/src/modules/report/collector.py b/src/modules/report/collector.py index c816039..a26ef6b 100644 --- a/src/modules/report/collector.py +++ b/src/modules/report/collector.py @@ -48,12 +48,8 @@ class Collector(object): def execute(self): """function is called only when collecting data""" - services_lock.acquire() global services - services_lock.release() - vulnerabilities_lock.acquire() global vulnerabilities - vulnerabilities_lock.release() bases = self.event.__class__.__mro__ if Service in bases: services_lock.acquire() diff --git a/src/modules/report/plain.py b/src/modules/report/plain.py index c474656..d9ff4cd 100644 --- a/src/modules/report/plain.py +++ b/src/modules/report/plain.py @@ -4,7 +4,6 @@ from prettytable import ALL, PrettyTable from __main__ import config from collector import services, vulnerabilities,services_lock, vulnerabilities_lock -import threading EVIDENCE_PREVIEW = 40 MAX_TABLE_WIDTH = 20 From a7e4ebf3693c315752c6b2be1413be9a9216387d Mon Sep 17 00:00:00 2001 From: oriagmon Date: Sun, 21 Oct 2018 11:47:15 +0300 Subject: [PATCH 09/12] Solved spacing conflict --- src/core/events/handler.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/events/handler.py b/src/core/events/handler.py index af5ddb1..6f22a0a 100644 --- a/src/core/events/handler.py +++ b/src/core/events/handler.py @@ -96,5 +96,7 @@ class EventQueue(Queue, object): self.queue.clear() -handler = EventQueue(800) + + +handler = EventQueue(800) From 3b0d2233fd0ec6930db17497ac6f48518dce4872 Mon Sep 17 00:00:00 2001 From: oriagmon Date: Sun, 21 Oct 2018 11:50:42 +0300 Subject: [PATCH 10/12] Solved spacing conflict --- src/core/events/handler.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/core/events/handler.py b/src/core/events/handler.py index 6f22a0a..13978e8 100644 --- a/src/core/events/handler.py +++ b/src/core/events/handler.py @@ -96,7 +96,4 @@ class EventQueue(Queue, object): self.queue.clear() - - - handler = EventQueue(800) From 812edafe80328ad2c6b1aafc63e235d496ce2fff Mon Sep 17 00:00:00 2001 From: oriagmon Date: Sun, 21 Oct 2018 11:51:44 +0300 Subject: [PATCH 11/12] Solved spacing conflict --- src/core/events/handler.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/events/handler.py b/src/core/events/handler.py index 13978e8..a3da29f 100644 --- a/src/core/events/handler.py +++ b/src/core/events/handler.py @@ -95,5 +95,4 @@ class EventQueue(Queue, object): with self.mutex: self.queue.clear() - handler = EventQueue(800) From 951efab5e05573de3e099042a750e34e5e741392 Mon Sep 17 00:00:00 2001 From: oriagmon Date: Mon, 22 Oct 2018 11:39:53 +0300 Subject: [PATCH 12/12] Fixed PR comments. --- src/core/events/types/common.py | 2 -- src/modules/report/collector.py | 4 ---- src/modules/report/plain.py | 17 ++++++++++------- src/modules/report/yaml.py | 2 -- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/core/events/types/common.py b/src/core/events/types/common.py index 1822f12..ffe60a4 100644 --- a/src/core/events/types/common.py +++ b/src/core/events/types/common.py @@ -68,9 +68,7 @@ class Vulnerability(object): global event_id_count_lock event_id_count_lock = threading.Lock() -event_id_count_lock.acquire() event_id_count = 0 -event_id_count_lock.release() """ Discovery/Hunting Events """ diff --git a/src/modules/report/collector.py b/src/modules/report/collector.py index a26ef6b..b23e454 100644 --- a/src/modules/report/collector.py +++ b/src/modules/report/collector.py @@ -8,15 +8,11 @@ import threading global services_lock services_lock = threading.Lock() -services_lock.acquire() services = list() -services_lock.release() global vulnerabilities_lock vulnerabilities_lock = threading.Lock() -vulnerabilities_lock.acquire() vulnerabilities = list() -vulnerabilities_lock.release() def console_trim(text, prefix=' '): diff --git a/src/modules/report/plain.py b/src/modules/report/plain.py index d9ff4cd..ca107f5 100644 --- a/src/modules/report/plain.py +++ b/src/modules/report/plain.py @@ -14,21 +14,24 @@ class PlainReporter(object): def get_report(self): """generates report tables""" output = "" + + vulnerabilities_lock.acquire() + vulnerabilities_len = len(services) + vulnerabilities_lock.release() + services_lock.acquire() - if len(services): - services_lock.release() + services_len = len(vulnerabilities) + services_lock.release() + + if services_len: output += self.nodes_table() if not config.mapping: output += self.services_table() - vulnerabilities_lock.acquire() - if len(vulnerabilities): - vulnerabilities_lock.release() + if vulnerabilities_len: output += self.vulns_table() else: - vulnerabilities_lock.release() output += "\nNo vulnerabilities were found" else: - services_lock.release() print("\nKube Hunter couldn't find any clusters") # print("\nKube Hunter couldn't find any clusters. {}".format("Maybe try with --active?" if not config.active else "")) return output diff --git a/src/modules/report/yaml.py b/src/modules/report/yaml.py index fe96af9..824f621 100644 --- a/src/modules/report/yaml.py +++ b/src/modules/report/yaml.py @@ -8,13 +8,11 @@ from collector import services, vulnerabilities, services_lock, vulnerabilities_ class YAMLReporter(object): def get_report(self): yaml = YAML() - vulnerabilities_lock.acquire() report = { "nodes": self.get_nodes(), "services": self.get_services(), "vulnerabilities": self.get_vulenrabilities() } - vulnerabilities_lock.release() output = StringIO.StringIO() yaml.dump(report, output) return output.getvalue()