forked from p15670423/monkey
commit
fd8ea53e8b
|
@ -115,6 +115,8 @@ Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
- "/api/island-configuration" endpoint. #2003
|
- "/api/island-configuration" endpoint. #2003
|
||||||
- "-t/--tunnel" from agent command line arguments. #2216
|
- "-t/--tunnel" from agent command line arguments. #2216
|
||||||
- "/api/monkey-control/neets-to-stop". #2261
|
- "/api/monkey-control/neets-to-stop". #2261
|
||||||
|
- "GET /api/test/monkey" endpoint. #2269
|
||||||
|
- "GET /api/test/log" endpoint. #2269
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- A bug in network map page that caused delay of telemetry log loading. #1545
|
- A bug in network map page that caused delay of telemetry log loading. #1545
|
||||||
|
|
|
@ -15,7 +15,6 @@ SLEEP_BETWEEN_REQUESTS_SECONDS = 0.5
|
||||||
GET_AGENTS_ENDPOINT = "api/agents"
|
GET_AGENTS_ENDPOINT = "api/agents"
|
||||||
GET_LOG_ENDPOINT = "api/agent-logs"
|
GET_LOG_ENDPOINT = "api/agent-logs"
|
||||||
GET_MACHINES_ENDPOINT = "api/machines"
|
GET_MACHINES_ENDPOINT = "api/machines"
|
||||||
MONKEY_TEST_ENDPOINT = "api/test/monkey"
|
|
||||||
TELEMETRY_TEST_ENDPOINT = "api/test/telemetry"
|
TELEMETRY_TEST_ENDPOINT = "api/test/telemetry"
|
||||||
LOGGER = logging.getLogger(__name__)
|
LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -139,14 +138,6 @@ class MonkeyIslandClient(object):
|
||||||
LOGGER.error("Failed to reset island mode")
|
LOGGER.error("Failed to reset island mode")
|
||||||
assert False
|
assert False
|
||||||
|
|
||||||
def find_monkeys_in_db(self, query):
|
|
||||||
if query is None:
|
|
||||||
raise TypeError
|
|
||||||
response = self.requests.get(
|
|
||||||
MONKEY_TEST_ENDPOINT, MonkeyIslandClient.form_find_query_for_request(query)
|
|
||||||
)
|
|
||||||
return MonkeyIslandClient.get_test_query_results(response)
|
|
||||||
|
|
||||||
def find_telems_in_db(self, query: dict):
|
def find_telems_in_db(self, query: dict):
|
||||||
if query is None:
|
if query is None:
|
||||||
raise TypeError
|
raise TypeError
|
||||||
|
@ -155,12 +146,6 @@ class MonkeyIslandClient(object):
|
||||||
)
|
)
|
||||||
return MonkeyIslandClient.get_test_query_results(response)
|
return MonkeyIslandClient.get_test_query_results(response)
|
||||||
|
|
||||||
def get_all_monkeys_from_db(self):
|
|
||||||
response = self.requests.get(
|
|
||||||
MONKEY_TEST_ENDPOINT, MonkeyIslandClient.form_find_query_for_request(None)
|
|
||||||
)
|
|
||||||
return MonkeyIslandClient.get_test_query_results(response)
|
|
||||||
|
|
||||||
def get_agents(self) -> Sequence[Agent]:
|
def get_agents(self) -> Sequence[Agent]:
|
||||||
response = self.requests.get(GET_AGENTS_ENDPOINT)
|
response = self.requests.get(GET_AGENTS_ENDPOINT)
|
||||||
|
|
||||||
|
@ -186,5 +171,5 @@ class MonkeyIslandClient(object):
|
||||||
return json.loads(response.content)["results"]
|
return json.loads(response.content)["results"]
|
||||||
|
|
||||||
def is_all_monkeys_dead(self):
|
def is_all_monkeys_dead(self):
|
||||||
query = {"dead": False}
|
agents = self.get_agents()
|
||||||
return len(self.find_monkeys_in_db(query)) == 0
|
return all((a.stop_time is not None for a in agents))
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
from ipaddress import IPv4Address
|
||||||
|
from typing import Collection
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from envs.monkey_zoo.blackbox.island_client.monkey_island_client import MonkeyIslandClient
|
from envs.monkey_zoo.blackbox.island_client.monkey_island_client import MonkeyIslandClient
|
||||||
|
@ -40,18 +43,17 @@ def island_client(island):
|
||||||
@pytest.mark.usefixtures("island_client")
|
@pytest.mark.usefixtures("island_client")
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
class TestOSCompatibility(object):
|
class TestOSCompatibility(object):
|
||||||
def test_os_compat(self, island_client):
|
def test_os_compat(self, island_client: MonkeyIslandClient):
|
||||||
print()
|
print()
|
||||||
all_monkeys = island_client.get_all_monkeys_from_db()
|
ips_that_communicated = self._get_agent_ips(island_client)
|
||||||
ips_that_communicated = []
|
|
||||||
for monkey in all_monkeys:
|
|
||||||
for ip in monkey["ip_addresses"]:
|
|
||||||
if ip in machine_list:
|
|
||||||
ips_that_communicated.append(ip)
|
|
||||||
break
|
|
||||||
for ip, os in machine_list.items():
|
for ip, os in machine_list.items():
|
||||||
if ip not in ips_that_communicated:
|
if IPv4Address(ip) not in ips_that_communicated:
|
||||||
print("{} didn't communicate to island".format(os))
|
print("{} didn't communicate to island".format(os))
|
||||||
|
|
||||||
if len(ips_that_communicated) < len(machine_list):
|
if len(ips_that_communicated) < len(machine_list):
|
||||||
assert False
|
assert False
|
||||||
|
|
||||||
|
def _get_agent_ips(self, island_client: MonkeyIslandClient) -> Collection[IPv4Address]:
|
||||||
|
agents = island_client.get_agents()
|
||||||
|
machines = island_client.get_machines()
|
||||||
|
return {i.ip for a in agents for i in machines[a.machine_id].network_interfaces}
|
||||||
|
|
|
@ -31,8 +31,6 @@ from monkey_island.cc.resources import (
|
||||||
from monkey_island.cc.resources.AbstractResource import AbstractResource
|
from monkey_island.cc.resources.AbstractResource import AbstractResource
|
||||||
from monkey_island.cc.resources.attack.attack_report import AttackReport
|
from monkey_island.cc.resources.attack.attack_report import AttackReport
|
||||||
from monkey_island.cc.resources.auth import Authenticate, Register, RegistrationStatus, init_jwt
|
from monkey_island.cc.resources.auth import Authenticate, Register, RegistrationStatus, init_jwt
|
||||||
from monkey_island.cc.resources.blackbox.log_blackbox_endpoint import LogBlackboxEndpoint
|
|
||||||
from monkey_island.cc.resources.blackbox.monkey_blackbox_endpoint import MonkeyBlackboxEndpoint
|
|
||||||
from monkey_island.cc.resources.blackbox.telemetry_blackbox_endpoint import (
|
from monkey_island.cc.resources.blackbox.telemetry_blackbox_endpoint import (
|
||||||
TelemetryBlackboxEndpoint,
|
TelemetryBlackboxEndpoint,
|
||||||
)
|
)
|
||||||
|
@ -207,8 +205,6 @@ def init_restful_endpoints(api: FlaskDIWrapper):
|
||||||
# API Spec: Fix all the following endpoints, see comments in the resource classes
|
# API Spec: Fix all the following endpoints, see comments in the resource classes
|
||||||
# Note: Preferably, the API will provide a rich feature set and allow access to all of the
|
# Note: Preferably, the API will provide a rich feature set and allow access to all of the
|
||||||
# necessary data. This would make these endpoints obsolete.
|
# necessary data. This would make these endpoints obsolete.
|
||||||
api.add_resource(MonkeyBlackboxEndpoint)
|
|
||||||
api.add_resource(LogBlackboxEndpoint)
|
|
||||||
api.add_resource(TelemetryBlackboxEndpoint)
|
api.add_resource(TelemetryBlackboxEndpoint)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
from bson import json_util
|
|
||||||
from flask import request
|
|
||||||
|
|
||||||
from monkey_island.cc.database import database, mongo
|
|
||||||
from monkey_island.cc.resources.AbstractResource import AbstractResource
|
|
||||||
from monkey_island.cc.resources.request_authentication import jwt_required
|
|
||||||
|
|
||||||
|
|
||||||
class LogBlackboxEndpoint(AbstractResource):
|
|
||||||
# API Spec: Rename to noun, BlackboxTestsLogs or something
|
|
||||||
urls = ["/api/test/log"]
|
|
||||||
|
|
||||||
@jwt_required
|
|
||||||
def get(self):
|
|
||||||
find_query = json_util.loads(request.args.get("find_query"))
|
|
||||||
log = mongo.db.log.find_one(find_query)
|
|
||||||
if not log:
|
|
||||||
return {"results": None}
|
|
||||||
log_file = database.gridfs.get(log["file_id"])
|
|
||||||
return {"results": log_file.read().decode()}
|
|
|
@ -1,16 +0,0 @@
|
||||||
from bson import json_util
|
|
||||||
from flask import request
|
|
||||||
|
|
||||||
from monkey_island.cc.database import mongo
|
|
||||||
from monkey_island.cc.resources.AbstractResource import AbstractResource
|
|
||||||
from monkey_island.cc.resources.request_authentication import jwt_required
|
|
||||||
|
|
||||||
|
|
||||||
class MonkeyBlackboxEndpoint(AbstractResource):
|
|
||||||
# API Spec: Rename to noun, BlackboxTestsMonkeys or something
|
|
||||||
urls = ["/api/test/monkey"]
|
|
||||||
|
|
||||||
@jwt_required
|
|
||||||
def get(self, **kw):
|
|
||||||
find_query = json_util.loads(request.args.get("find_query"))
|
|
||||||
return {"results": list(mongo.db.monkey.find(find_query))}
|
|
Loading…
Reference in New Issue