Island: Move URL definitions to resource classes

This commit is contained in:
vakarisz 2022-05-20 18:20:37 +03:00
parent ce12d46012
commit f0a613eb75
37 changed files with 187 additions and 89 deletions

View File

@ -143,65 +143,49 @@ class FlaskDIWrapper:
def init_api_resources(api: FlaskDIWrapper): def init_api_resources(api: FlaskDIWrapper):
api.add_resource(Root, "/api") api.add_resource(Root)
api.add_resource(Registration, "/api/registration") api.add_resource(Registration)
api.add_resource(Authenticate, "/api/auth") api.add_resource(Authenticate)
api.add_resource( api.add_resource(Monkey)
Monkey, api.add_resource(LocalRun)
"/api/agent", api.add_resource(Telemetry)
"/api/agent/<string:guid>",
"/api/agent/<string:guid>/<string:config_format>",
)
api.add_resource(LocalRun, "/api/local-monkey")
api.add_resource(Telemetry, "/api/telemetry", "/api/telemetry/<string:monkey_guid>")
api.add_resource(IslandMode, "/api/island-mode") api.add_resource(IslandMode)
api.add_resource(IslandConfiguration, "/api/configuration/island") api.add_resource(IslandConfiguration)
api.add_resource(ConfigurationExport, "/api/configuration/export") api.add_resource(ConfigurationExport)
api.add_resource(ConfigurationImport, "/api/configuration/import") api.add_resource(ConfigurationImport)
api.add_resource( api.add_resource(MonkeyDownload)
MonkeyDownload, api.add_resource(NetMap)
"/api/agent/download/<string:host_os>", api.add_resource(Edge)
) api.add_resource(Node)
api.add_resource(NetMap, "/api/netmap") api.add_resource(NodeStates)
api.add_resource(Edge, "/api/netmap/edge")
api.add_resource(Node, "/api/netmap/node")
api.add_resource(NodeStates, "/api/netmap/node-states")
api.add_resource(SecurityReport, "/api/report/security") api.add_resource(SecurityReport)
api.add_resource(ZeroTrustReport, "/api/report/zero-trust/<string:report_data>") api.add_resource(ZeroTrustReport)
api.add_resource(AttackReport, "/api/report/attack") api.add_resource(AttackReport)
api.add_resource(RansomwareReport, "/api/report/ransomware") api.add_resource(RansomwareReport)
api.add_resource(ManualExploitation, "/api/exploitations/manual") api.add_resource(ManualExploitation)
api.add_resource(MonkeyExploitation, "/api/exploitations/monkey") api.add_resource(MonkeyExploitation)
api.add_resource(ZeroTrustFindingEvent, "/api/zero-trust/finding-event/<string:finding_id>") api.add_resource(ZeroTrustFindingEvent)
api.add_resource(TelemetryFeed, "/api/telemetry-feed") api.add_resource(TelemetryFeed)
api.add_resource(Log, "/api/log") api.add_resource(Log)
api.add_resource(IslandLog, "/api/log/island/download") api.add_resource(IslandLog)
api.add_resource( api.add_resource(PBAFileDownload)
PBAFileDownload, api.add_resource(FileUpload)
"/api/pba/download/<string:filename>",
)
api.add_resource(
FileUpload,
"/api/file-upload/<string:target_os>",
"/api/file-upload/<string:target_os>?load=<string:filename>",
"/api/file-upload/<string:target_os>?restore=<string:filename>",
)
api.add_resource(PropagationCredentials, "/api/propagation-credentials/<string:guid>") api.add_resource(PropagationCredentials)
api.add_resource(RemoteRun, "/api/remote-monkey") api.add_resource(RemoteRun)
api.add_resource(VersionUpdate, "/api/version-update") api.add_resource(VersionUpdate)
api.add_resource(StopAgentCheck, "/api/monkey-control/needs-to-stop/<int:monkey_guid>") api.add_resource(StopAgentCheck)
api.add_resource(StopAllAgents, "/api/monkey-control/stop-all-agents") api.add_resource(StopAllAgents)
# Resources used by black box tests # Resources used by black box tests
api.add_resource(MonkeyBlackboxEndpoint, "/api/test/monkey") api.add_resource(MonkeyBlackboxEndpoint)
api.add_resource(ClearCaches, "/api/test/clear-caches") api.add_resource(ClearCaches)
api.add_resource(LogBlackboxEndpoint, "/api/test/log") api.add_resource(LogBlackboxEndpoint)
api.add_resource(TelemetryBlackboxEndpoint, "/api/test/telemetry") api.add_resource(TelemetryBlackboxEndpoint)
def init_app(mongo_url: str, container: DIContainer): def init_app(mongo_url: str, container: DIContainer):

View File

@ -1,8 +1,11 @@
import flask_restful import flask_restful
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.infection_lifecycle import should_agent_die from monkey_island.cc.services.infection_lifecycle import should_agent_die
class StopAgentCheck(flask_restful.Resource): class StopAgentCheck(flask_restful.Resource, IResource):
urls = ["/api/monkey-control/needs-to-stop/<int:monkey_guid>"]
def get(self, monkey_guid: int): def get(self, monkey_guid: int):
return {"stop_agent": should_agent_die(monkey_guid)} return {"stop_agent": should_agent_die(monkey_guid)}

View File

@ -4,11 +4,14 @@ import flask_restful
from flask import make_response, request from flask import make_response, request
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.resources.utils.semaphores import agent_killing_mutex from monkey_island.cc.resources.utils.semaphores import agent_killing_mutex
from monkey_island.cc.services.infection_lifecycle import set_stop_all, should_agent_die from monkey_island.cc.services.infection_lifecycle import set_stop_all, should_agent_die
class StopAllAgents(flask_restful.Resource): class StopAllAgents(flask_restful.Resource, IResource):
urls = ["/api/monkey-control/stop-all-agents"]
@jwt_required @jwt_required
def post(self): def post(self):
with agent_killing_mutex: with agent_killing_mutex:

View File

@ -2,11 +2,14 @@ import flask_restful
from flask import current_app, json from flask import current_app, json
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.attack.attack_report import AttackReportService from monkey_island.cc.services.attack.attack_report import AttackReportService
from monkey_island.cc.services.attack.attack_schema import SCHEMA from monkey_island.cc.services.attack.attack_schema import SCHEMA
class AttackReport(flask_restful.Resource): class AttackReport(flask_restful.Resource, IResource):
urls = ["/api/report/attack"]
@jwt_required @jwt_required
def get(self): def get(self):
response_content = { response_content = {

View File

@ -9,6 +9,7 @@ from jwt import PyJWTError
from common.utils.exceptions import IncorrectCredentialsError from common.utils.exceptions import IncorrectCredentialsError
from monkey_island.cc.resources.auth.credential_utils import get_username_password_from_request from monkey_island.cc.resources.auth.credential_utils import get_username_password_from_request
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services import AuthenticationService from monkey_island.cc.services import AuthenticationService
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -21,13 +22,15 @@ def init_jwt(app):
) )
class Authenticate(flask_restful.Resource): class Authenticate(flask_restful.Resource, IResource):
""" """
Resource for user authentication. The user provides the username and password and we Resource for user authentication. The user provides the username and password and we
give them a JWT. give them a JWT.
See `AuthService.js` file for the frontend counterpart for this code. See `AuthService.js` file for the frontend counterpart for this code.
""" """
urls = ["/api/auth"]
def post(self): def post(self):
""" """
Example request: Example request:

View File

@ -5,12 +5,16 @@ from flask import make_response, request
from common.utils.exceptions import AlreadyRegisteredError, InvalidRegistrationCredentialsError from common.utils.exceptions import AlreadyRegisteredError, InvalidRegistrationCredentialsError
from monkey_island.cc.resources.auth.credential_utils import get_username_password_from_request from monkey_island.cc.resources.auth.credential_utils import get_username_password_from_request
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services import AuthenticationService from monkey_island.cc.services import AuthenticationService
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class Registration(flask_restful.Resource): class Registration(flask_restful.Resource, IResource):
urls = ["/api/registration"]
def get(self): def get(self):
return {"needs_registration": AuthenticationService.needs_registration()} return {"needs_registration": AuthenticationService.needs_registration()}

View File

@ -3,6 +3,7 @@ import logging
import flask_restful import flask_restful
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.attack.attack_report import AttackReportService from monkey_island.cc.services.attack.attack_report import AttackReportService
from monkey_island.cc.services.reporting.report import ReportService from monkey_island.cc.services.reporting.report import ReportService
@ -11,7 +12,8 @@ NOT_ALL_REPORTS_DELETED = "Not all reports have been cleared from the DB!"
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class ClearCaches(flask_restful.Resource): class ClearCaches(flask_restful.Resource, IResource):
urls = ["/api/test/clear-caches"]
""" """
Used for timing tests - we want to get actual execution time of functions in BlackBox without Used for timing tests - we want to get actual execution time of functions in BlackBox without
caching - caching -

View File

@ -4,9 +4,12 @@ from flask import request
from monkey_island.cc.database import database, mongo from monkey_island.cc.database import database, mongo
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
class LogBlackboxEndpoint(flask_restful.Resource): class LogBlackboxEndpoint(flask_restful.Resource, IResource):
urls = ["/api/test/log"]
@jwt_required @jwt_required
def get(self): def get(self):
find_query = json_util.loads(request.args.get("find_query")) find_query = json_util.loads(request.args.get("find_query"))

View File

@ -4,9 +4,12 @@ from flask import request
from monkey_island.cc.database import mongo from monkey_island.cc.database import mongo
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
class MonkeyBlackboxEndpoint(flask_restful.Resource): class MonkeyBlackboxEndpoint(flask_restful.Resource, IResource):
urls = ["/api/test/monkey"]
@jwt_required @jwt_required
def get(self, **kw): def get(self, **kw):
find_query = json_util.loads(request.args.get("find_query")) find_query = json_util.loads(request.args.get("find_query"))

View File

@ -4,9 +4,12 @@ from flask import request
from monkey_island.cc.models.telemetries import get_telemetry_by_query from monkey_island.cc.models.telemetries import get_telemetry_by_query
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
class TelemetryBlackboxEndpoint(flask_restful.Resource): class TelemetryBlackboxEndpoint(flask_restful.Resource, IResource):
urls = ["/api/test/telemetry"]
@jwt_required @jwt_required
def get(self, **kw): def get(self, **kw):
find_query = json_util.loads(request.args.get("find_query")) find_query = json_util.loads(request.args.get("find_query"))

View File

@ -4,11 +4,14 @@ import flask_restful
from flask import request from flask import request
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.server_utils.encryption import PasswordBasedStringEncryptor from monkey_island.cc.server_utils.encryption import PasswordBasedStringEncryptor
from monkey_island.cc.services.config import ConfigService from monkey_island.cc.services.config import ConfigService
class ConfigurationExport(flask_restful.Resource): class ConfigurationExport(flask_restful.Resource, IResource):
urls = ["/api/configuration/export"]
@jwt_required @jwt_required
def post(self): def post(self):
data = json.loads(request.data) data = json.loads(request.data)

View File

@ -8,6 +8,7 @@ from flask import request
from common.utils.exceptions import InvalidConfigurationError from common.utils.exceptions import InvalidConfigurationError
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.server_utils.encryption import ( from monkey_island.cc.server_utils.encryption import (
InvalidCiphertextError, InvalidCiphertextError,
InvalidCredentialsError, InvalidCredentialsError,
@ -38,7 +39,8 @@ class ResponseContents:
return self.__dict__ return self.__dict__
class ConfigurationImport(flask_restful.Resource): class ConfigurationImport(flask_restful.Resource, IResource):
urls = ["/api/configuration/import"]
SUCCESS = False SUCCESS = False
@jwt_required @jwt_required

View File

@ -1,10 +1,13 @@
import flask_restful import flask_restful
from flask import request from flask import request
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.edge.displayed_edge import DisplayedEdgeService from monkey_island.cc.services.edge.displayed_edge import DisplayedEdgeService
class Edge(flask_restful.Resource): class Edge(flask_restful.Resource, IResource):
urls = ["/api/netmap/edge"]
def get(self): def get(self):
edge_id = request.args.get("id") edge_id = request.args.get("id")
displayed_edge = DisplayedEdgeService.get_displayed_edge_by_id(edge_id) displayed_edge = DisplayedEdgeService.get_displayed_edge_by_id(edge_id)

View File

@ -1,12 +1,15 @@
import flask_restful import flask_restful
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.reporting.exploitations.manual_exploitation import ( from monkey_island.cc.services.reporting.exploitations.manual_exploitation import (
get_manual_exploitations, get_manual_exploitations,
) )
class ManualExploitation(flask_restful.Resource): class ManualExploitation(flask_restful.Resource, IResource):
urls = ["/api/exploitations/manual"]
@jwt_required @jwt_required
def get(self): def get(self):
manual_exploitations = [ manual_exploitations = [

View File

@ -1,12 +1,15 @@
import flask_restful import flask_restful
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.reporting.exploitations.monkey_exploitation import ( from monkey_island.cc.services.reporting.exploitations.monkey_exploitation import (
get_monkey_exploited, get_monkey_exploited,
) )
class MonkeyExploitation(flask_restful.Resource): class MonkeyExploitation(flask_restful.Resource, IResource):
urls = ["/api/exploitations/monkey"]
@jwt_required @jwt_required
def get(self): def get(self):
monkey_exploitations = [exploitation.__dict__ for exploitation in get_monkey_exploited()] monkey_exploitations = [exploitation.__dict__ for exploitation in get_monkey_exploited()]

View File

@ -4,10 +4,14 @@ import flask_restful
from flask import abort, jsonify, request from flask import abort, jsonify, request
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.config import ConfigService from monkey_island.cc.services.config import ConfigService
class IslandConfiguration(flask_restful.Resource): class IslandConfiguration(flask_restful.Resource, IResource):
urls = ["/api/configuration/island"]
@jwt_required @jwt_required
def get(self): def get(self):
return jsonify( return jsonify(

View File

@ -3,12 +3,15 @@ import logging
import flask_restful import flask_restful
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.island_logs import IslandLogService from monkey_island.cc.services.island_logs import IslandLogService
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class IslandLog(flask_restful.Resource): class IslandLog(flask_restful.Resource, IResource):
urls = ["/api/log/island/download"]
@jwt_required @jwt_required
def get(self): def get(self):
try: try:

View File

@ -5,6 +5,7 @@ import flask_restful
from flask import make_response, request from flask import make_response, request
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.config_manipulator import update_config_on_mode_set from monkey_island.cc.services.config_manipulator import update_config_on_mode_set
from monkey_island.cc.services.mode.island_mode_service import ModeNotSetError, get_mode, set_mode from monkey_island.cc.services.mode.island_mode_service import ModeNotSetError, get_mode, set_mode
from monkey_island.cc.services.mode.mode_enum import IslandModeEnum from monkey_island.cc.services.mode.mode_enum import IslandModeEnum
@ -12,7 +13,9 @@ from monkey_island.cc.services.mode.mode_enum import IslandModeEnum
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class IslandMode(flask_restful.Resource): class IslandMode(flask_restful.Resource, IResource):
urls = ["/api/island-mode"]
@jwt_required @jwt_required
def post(self): def post(self):
try: try:

View File

@ -5,11 +5,15 @@ from flask import jsonify, make_response, request
from monkey_island.cc.models import Monkey from monkey_island.cc.models import Monkey
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.node import NodeService from monkey_island.cc.services.node import NodeService
from monkey_island.cc.services.run_local_monkey import LocalMonkeyRunService from monkey_island.cc.services.run_local_monkey import LocalMonkeyRunService
class LocalRun(flask_restful.Resource): class LocalRun(flask_restful.Resource, IResource):
urls = ["/api/local-monkey"]
@jwt_required @jwt_required
def get(self): def get(self):
island_monkey = NodeService.get_monkey_island_monkey() island_monkey = NodeService.get_monkey_island_monkey()

View File

@ -7,11 +7,14 @@ from flask import request
from monkey_island.cc.database import mongo from monkey_island.cc.database import mongo
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.blackbox.utils.telem_store import TestTelemStore from monkey_island.cc.resources.blackbox.utils.telem_store import TestTelemStore
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.log import LogService from monkey_island.cc.services.log import LogService
from monkey_island.cc.services.node import NodeService from monkey_island.cc.services.node import NodeService
class Log(flask_restful.Resource): class Log(flask_restful.Resource, IResource):
urls = ["/api/log"]
@jwt_required @jwt_required
def get(self): def get(self):
monkey_id = request.args.get("id") monkey_id = request.args.get("id")

View File

@ -7,6 +7,7 @@ from flask import request
from monkey_island.cc.database import mongo from monkey_island.cc.database import mongo
from monkey_island.cc.models.monkey_ttl import create_monkey_ttl_document from monkey_island.cc.models.monkey_ttl import create_monkey_ttl_document
from monkey_island.cc.resources.blackbox.utils.telem_store import TestTelemStore from monkey_island.cc.resources.blackbox.utils.telem_store import TestTelemStore
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.resources.utils.semaphores import agent_killing_mutex from monkey_island.cc.resources.utils.semaphores import agent_killing_mutex
from monkey_island.cc.server_utils.consts import DEFAULT_MONKEY_TTL_EXPIRY_DURATION_IN_SECONDS from monkey_island.cc.server_utils.consts import DEFAULT_MONKEY_TTL_EXPIRY_DURATION_IN_SECONDS
from monkey_island.cc.services.config import ConfigService from monkey_island.cc.services.config import ConfigService
@ -16,7 +17,12 @@ from monkey_island.cc.services.node import NodeService
# TODO: separate logic from interface # TODO: separate logic from interface
class Monkey(flask_restful.Resource): class Monkey(flask_restful.Resource, IResource):
urls = [
"/api/agent",
"/api/agent/<string:guid>",
"/api/agent/<string:guid>/<string:config_format>",
]
# Used by monkey. can't secure. # Used by monkey. can't secure.
def get(self, guid=None, config_format=None, **kw): def get(self, guid=None, config_format=None, **kw):

View File

@ -5,6 +5,7 @@ from pathlib import Path
import flask_restful import flask_restful
from flask import make_response, send_from_directory from flask import make_response, send_from_directory
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.server_utils.consts import MONKEY_ISLAND_ABS_PATH from monkey_island.cc.server_utils.consts import MONKEY_ISLAND_ABS_PATH
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -19,7 +20,8 @@ class UnsupportedOSError(Exception):
pass pass
class MonkeyDownload(flask_restful.Resource): class MonkeyDownload(flask_restful.Resource, IResource):
urls = ["/api/agent/download/<string:host_os>"]
# Used by monkey. can't secure. # Used by monkey. can't secure.
def get(self, host_os): def get(self, host_os):

View File

@ -1,11 +1,14 @@
import flask_restful import flask_restful
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.netmap.net_edge import NetEdgeService from monkey_island.cc.services.netmap.net_edge import NetEdgeService
from monkey_island.cc.services.netmap.net_node import NetNodeService from monkey_island.cc.services.netmap.net_node import NetNodeService
class NetMap(flask_restful.Resource): class NetMap(flask_restful.Resource, IResource):
urls = ["/api/netmap"]
@jwt_required @jwt_required
def get(self, **kw): def get(self, **kw):
net_nodes = NetNodeService.get_all_net_nodes() net_nodes = NetNodeService.get_all_net_nodes()

View File

@ -2,10 +2,13 @@ import flask_restful
from flask import request from flask import request
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.node import NodeService from monkey_island.cc.services.node import NodeService
class Node(flask_restful.Resource): class Node(flask_restful.Resource, IResource):
urls = ["/api/netmap/node"]
@jwt_required @jwt_required
def get(self): def get(self):
node_id = request.args.get("id") node_id = request.args.get("id")

View File

@ -1,10 +1,13 @@
import flask_restful import flask_restful
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.utils.node_states import NodeStates as NodeStateList from monkey_island.cc.services.utils.node_states import NodeStates as NodeStateList
class NodeStates(flask_restful.Resource): class NodeStates(flask_restful.Resource, IResource):
urls = ["/api/netmap/node-states"]
@jwt_required @jwt_required
def get(self): def get(self):
return {"node_states": [state.value for state in NodeStateList]} return {"node_states": [state.value for state in NodeStateList]}

View File

@ -3,12 +3,14 @@ import logging
import flask_restful import flask_restful
from flask import make_response, send_file from flask import make_response, send_file
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services import FileRetrievalError, IFileStorageService from monkey_island.cc.services import FileRetrievalError, IFileStorageService
logger = logging.getLogger(__file__) logger = logging.getLogger(__file__)
class PBAFileDownload(flask_restful.Resource): class PBAFileDownload(flask_restful.Resource, IResource):
urls = ["/api/pba/download/<string:filename>"]
""" """
File download endpoint used by monkey to download user's PBA file File download endpoint used by monkey to download user's PBA file
""" """

View File

@ -7,22 +7,28 @@ from werkzeug.utils import secure_filename as sanitize_filename
from common.config_value_paths import PBA_LINUX_FILENAME_PATH, PBA_WINDOWS_FILENAME_PATH from common.config_value_paths import PBA_LINUX_FILENAME_PATH, PBA_WINDOWS_FILENAME_PATH
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services import FileRetrievalError, IFileStorageService from monkey_island.cc.services import FileRetrievalError, IFileStorageService
from monkey_island.cc.services.config import ConfigService from monkey_island.cc.services.config import ConfigService
logger = logging.getLogger(__file__) logger = logging.getLogger(__file__)
# Front end uses these strings to identify which files to work with (linux or windows) # Front end uses these strings to identify which files to work with (linux or windows)
LINUX_PBA_TYPE = "PBAlinux" LINUX_PBA_TYPE = "PBAlinux"
WINDOWS_PBA_TYPE = "PBAwindows" WINDOWS_PBA_TYPE = "PBAwindows"
class FileUpload(flask_restful.Resource): class FileUpload(flask_restful.Resource, IResource):
""" """
File upload endpoint used to send/receive Custom PBA files File upload endpoint used to send/receive Custom PBA files
""" """
urls = [
"/api/file-upload/<string:target_os>",
"/api/file-upload/<string:target_os>?load=<string:filename>",
"/api/file-upload/<string:target_os>?restore=<string:filename>",
]
def __init__(self, file_storage_service: IFileStorageService): def __init__(self, file_storage_service: IFileStorageService):
self._file_storage_service = file_storage_service self._file_storage_service = file_storage_service

View File

@ -1,10 +1,13 @@
import flask_restful import flask_restful
from monkey_island.cc.database import mongo from monkey_island.cc.database import mongo
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.config import ConfigService from monkey_island.cc.services.config import ConfigService
class PropagationCredentials(flask_restful.Resource): class PropagationCredentials(flask_restful.Resource, IResource):
urls = ["/api/propagation-credentials/<string:guid>"]
def get(self, guid: str): def get(self, guid: str):
monkey_json = mongo.db.monkey.find_one_or_404({"guid": guid}) monkey_json = mongo.db.monkey.find_one_or_404({"guid": guid})
ConfigService.decrypt_flat_config(monkey_json["config"]) ConfigService.decrypt_flat_config(monkey_json["config"])

View File

@ -2,10 +2,13 @@ import flask_restful
from flask import jsonify from flask import jsonify
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.ransomware import ransomware_report from monkey_island.cc.services.ransomware import ransomware_report
class RansomwareReport(flask_restful.Resource): class RansomwareReport(flask_restful.Resource, IResource):
urls = ["/api/report/ransomware"]
@jwt_required @jwt_required
def get(self): def get(self):
return jsonify( return jsonify(

View File

@ -6,6 +6,7 @@ from botocore.exceptions import ClientError, NoCredentialsError
from flask import jsonify, make_response, request from flask import jsonify, make_response, request
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services import AWSService from monkey_island.cc.services import AWSService
from monkey_island.cc.services.aws import AWSCommandResults from monkey_island.cc.services.aws import AWSCommandResults
@ -19,7 +20,9 @@ NO_CREDS_ERROR_FORMAT = (
) )
class RemoteRun(flask_restful.Resource): class RemoteRun(flask_restful.Resource, IResource):
urls = ["/api/remote-monkey"]
def __init__(self, aws_service: AWSService): def __init__(self, aws_service: AWSService):
self._aws_service = aws_service self._aws_service = aws_service

View File

@ -5,6 +5,7 @@ from flask import jsonify, make_response, request
from monkey_island.cc.database import mongo from monkey_island.cc.database import mongo
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.database import Database from monkey_island.cc.services.database import Database
from monkey_island.cc.services.infection_lifecycle import get_completed_steps from monkey_island.cc.services.infection_lifecycle import get_completed_steps
from monkey_island.cc.services.utils.network_utils import local_ip_addresses from monkey_island.cc.services.utils.network_utils import local_ip_addresses
@ -12,7 +13,10 @@ from monkey_island.cc.services.utils.network_utils import local_ip_addresses
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class Root(flask_restful.Resource): class Root(IResource, flask_restful.Resource):
urls = ["/api"]
def get(self, action=None): def get(self, action=None):
if not action: if not action:
action = request.args.get("action") action = request.args.get("action")

View File

@ -1,10 +1,13 @@
import flask_restful import flask_restful
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.reporting.report import ReportService from monkey_island.cc.services.reporting.report import ReportService
class SecurityReport(flask_restful.Resource): class SecurityReport(flask_restful.Resource, IResource):
urls = ["/api/report/security"]
@jwt_required @jwt_required
def get(self): def get(self):
return ReportService.get_report() return ReportService.get_report()

View File

@ -11,13 +11,16 @@ from monkey_island.cc.models.monkey import Monkey
from monkey_island.cc.models.telemetries import get_telemetry_by_query from monkey_island.cc.models.telemetries import get_telemetry_by_query
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.blackbox.utils.telem_store import TestTelemStore from monkey_island.cc.resources.blackbox.utils.telem_store import TestTelemStore
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.node import NodeService from monkey_island.cc.services.node import NodeService
from monkey_island.cc.services.telemetry.processing.processing import process_telemetry from monkey_island.cc.services.telemetry.processing.processing import process_telemetry
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class Telemetry(flask_restful.Resource): class Telemetry(flask_restful.Resource, IResource):
urls = ["/api/telemetry", "/api/telemetry/<string:monkey_guid>"]
@jwt_required @jwt_required
def get(self, **kw): def get(self, **kw):
monkey_guid = request.args.get("monkey_guid") monkey_guid = request.args.get("monkey_guid")

View File

@ -9,12 +9,15 @@ from flask import request
from common.common_consts.telem_categories import TelemCategoryEnum from common.common_consts.telem_categories import TelemCategoryEnum
from monkey_island.cc.database import mongo from monkey_island.cc.database import mongo
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.node import NodeService from monkey_island.cc.services.node import NodeService
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class TelemetryFeed(flask_restful.Resource): class TelemetryFeed(flask_restful.Resource, IResource):
urls = ["/api/telemetry-feed"]
@jwt_required @jwt_required
def get(self, **kw): def get(self, **kw):
timestamp = request.args.get("timestamp") timestamp = request.args.get("timestamp")

View File

@ -3,12 +3,15 @@ import logging
import flask_restful import flask_restful
from common.version import get_version from common.version import get_version
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.version_update import VersionUpdateService from monkey_island.cc.services.version_update import VersionUpdateService
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class VersionUpdate(flask_restful.Resource): class VersionUpdate(flask_restful.Resource, IResource):
urls = ["/api/version-update"]
def __init__(self): def __init__(self):
super(VersionUpdate, self).__init__() super(VersionUpdate, self).__init__()

View File

@ -3,12 +3,15 @@ import json
import flask_restful import flask_restful
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.zero_trust.monkey_findings.monkey_zt_finding_service import ( from monkey_island.cc.services.zero_trust.monkey_findings.monkey_zt_finding_service import (
MonkeyZTFindingService, MonkeyZTFindingService,
) )
class ZeroTrustFindingEvent(flask_restful.Resource): class ZeroTrustFindingEvent(flask_restful.Resource, IResource):
urls = ["/api/zero-trust/finding-event/<string:finding_id>"]
@jwt_required @jwt_required
def get(self, finding_id: str): def get(self, finding_id: str):
return { return {

View File

@ -4,6 +4,7 @@ import flask_restful
from flask import jsonify from flask import jsonify
from monkey_island.cc.resources.auth.auth import jwt_required from monkey_island.cc.resources.auth.auth import jwt_required
from monkey_island.cc.resources.i_resource import IResource
from monkey_island.cc.services.zero_trust.zero_trust_report.finding_service import FindingService from monkey_island.cc.services.zero_trust.zero_trust_report.finding_service import FindingService
from monkey_island.cc.services.zero_trust.zero_trust_report.pillar_service import PillarService from monkey_island.cc.services.zero_trust.zero_trust_report.pillar_service import PillarService
from monkey_island.cc.services.zero_trust.zero_trust_report.principle_service import ( from monkey_island.cc.services.zero_trust.zero_trust_report.principle_service import (
@ -15,7 +16,9 @@ REPORT_DATA_FINDINGS = "findings"
REPORT_DATA_PRINCIPLES_STATUS = "principles" REPORT_DATA_PRINCIPLES_STATUS = "principles"
class ZeroTrustReport(flask_restful.Resource): class ZeroTrustReport(flask_restful.Resource, IResource):
urls = ["/api/report/zero-trust/<string:report_data>"]
@jwt_required @jwt_required
def get(self, report_data=None): def get(self, report_data=None):
if report_data == REPORT_DATA_PILLARS: if report_data == REPORT_DATA_PILLARS: