diff --git a/src/primaite/game/game.py b/src/primaite/game/game.py index b2b35f26..431db5fb 100644 --- a/src/primaite/game/game.py +++ b/src/primaite/game/game.py @@ -33,12 +33,16 @@ from primaite.simulator.system.services.web_server.web_server import WebServer _LOGGER = getLogger(__name__) -APPLICATION_TYPES_MAPPING = {"WebBrowser": WebBrowser, "DataManipulationBot": DataManipulationBot, "DoSBot": DoSBot} +APPLICATION_TYPES_MAPPING = { + "WebBrowser": WebBrowser, + "DatabaseClient": DatabaseClient, + "DataManipulationBot": DataManipulationBot, + "DoSBot": DoSBot, +} SERVICE_TYPES_MAPPING = { "DNSClient": DNSClient, "DNSServer": DNSServer, - "DatabaseClient": DatabaseClient, "DatabaseService": DatabaseService, "WebServer": WebServer, "FTPClient": FTPClient, @@ -262,22 +266,21 @@ class PrimaiteGame: else: _LOGGER.warning(f"service type not found {service_type}") # service-dependent options - if service_type == "DatabaseClient": + if service_type == "DNSClient": if "options" in service_cfg: opt = service_cfg["options"] - if "db_server_ip" in opt: - new_service.configure(server_ip_address=IPv4Address(opt["db_server_ip"])) + if "dns_server" in opt: + new_service.dns_server = IPv4Address(opt["dns_server"]) if service_type == "DNSServer": if "options" in service_cfg: opt = service_cfg["options"] if "domain_mapping" in opt: for domain, ip in opt["domain_mapping"].items(): - new_service.dns_register(domain, ip) + new_service.dns_register(domain, IPv4Address(ip)) if service_type == "DatabaseService": if "options" in service_cfg: opt = service_cfg["options"] - if "backup_server_ip" in opt: - new_service.configure_backup(backup_server=IPv4Address(opt["backup_server_ip"])) + new_service.configure_backup(backup_server=IPv4Address(opt.get("backup_server_ip"))) new_service.start() if "applications" in node_cfg: @@ -303,6 +306,13 @@ class PrimaiteGame: port_scan_p_of_success=float(opt.get("port_scan_p_of_success", "0.1")), data_manipulation_p_of_success=float(opt.get("data_manipulation_p_of_success", "0.1")), ) + elif application_type == "DatabaseClient": + if "options" in application_cfg: + opt = application_cfg["options"] + new_application.configure( + server_ip_address=IPv4Address(opt.get("db_server_ip")), + server_password=opt.get("server_password"), + ) elif application_type == "WebBrowser": if "options" in application_cfg: opt = application_cfg["options"] diff --git a/tests/assets/configs/basic_switched_network.yaml b/tests/assets/configs/basic_switched_network.yaml index d86af779..0050a0cb 100644 --- a/tests/assets/configs/basic_switched_network.yaml +++ b/tests/assets/configs/basic_switched_network.yaml @@ -81,6 +81,10 @@ simulation: type: WebBrowser options: target_url: http://arcd.com/users/ + - ref: client_1_database_client + type: DatabaseClient + options: + db_server_ip: 192.168.1.10 - ref: data_manipulation_bot type: DataManipulationBot options: @@ -95,27 +99,25 @@ simulation: payload: SPOOF DATA port_scan_p_of_success: 0.8 services: + - ref: client_1_dns_client + type: DNSClient + options: + dns_server: 192.168.1.10 - ref: client_1_dns_server type: DNSServer options: domain_mapping: - arcd.com: 192.168.1.12 # web server - - ref: client_1_database_client - type: DatabaseClient - options: - db_server_ip: 192.168.10.21 - - ref: client_1_dosbot - type: DoSBot - options: - db_server_ip: 192.168.10.21 + arcd.com: 192.168.1.10 - ref: client_1_database_service type: DatabaseService options: - backup_server_ip: 192.168.10.21 + backup_server_ip: 192.168.1.10 - ref: client_1_web_service type: WebServer - ref: client_1_ftp_server type: FTPServer + - ref: client_1_ntp_client + type: NTPClient - ref: client_1_ntp_server type: NTPServer - ref: client_2 diff --git a/tests/integration_tests/game_configuration.py b/tests/integration_tests/game_configuration.py index 274e8bd6..9db894c5 100644 --- a/tests/integration_tests/game_configuration.py +++ b/tests/integration_tests/game_configuration.py @@ -10,12 +10,18 @@ from primaite.game.agent.interface import ProxyAgent, RandomAgent from primaite.game.game import APPLICATION_TYPES_MAPPING, PrimaiteGame, SERVICE_TYPES_MAPPING from primaite.simulator.network.container import Network from primaite.simulator.network.hardware.nodes.computer import Computer +from primaite.simulator.system.applications.database_client import DatabaseClient from primaite.simulator.system.applications.red_applications.data_manipulation_bot import DataManipulationBot from primaite.simulator.system.applications.red_applications.dos_bot import DoSBot from primaite.simulator.system.applications.web_browser import WebBrowser +from primaite.simulator.system.services.database.database_service import DatabaseService from primaite.simulator.system.services.dns.dns_client import DNSClient +from primaite.simulator.system.services.dns.dns_server import DNSServer from primaite.simulator.system.services.ftp.ftp_client import FTPClient +from primaite.simulator.system.services.ftp.ftp_server import FTPServer from primaite.simulator.system.services.ntp.ntp_client import NTPClient +from primaite.simulator.system.services.ntp.ntp_server import NTPServer +from primaite.simulator.system.services.web_server.web_server import WebServer from tests import TEST_ASSETS_ROOT BASIC_CONFIG = TEST_ASSETS_ROOT / "configs/basic_switched_network.yaml" @@ -33,19 +39,23 @@ def test_example_config(): """Test that the example config can be parsed properly.""" game = load_config(example_config_path()) - assert len(game.agents) == 3 # red, blue and green agent + assert len(game.agents) == 4 # red, blue and 2 green agents - # green agent + # green agent 1 assert game.agents[0].agent_name == "client_2_green_user" assert isinstance(game.agents[0], RandomAgent) + # green agent 2 + assert game.agents[1].agent_name == "client_1_green_user" + assert isinstance(game.agents[1], RandomAgent) + # red agent - assert game.agents[1].agent_name == "client_1_data_manipulation_red_bot" - assert isinstance(game.agents[1], DataManipulationAgent) + assert game.agents[2].agent_name == "client_1_data_manipulation_red_bot" + assert isinstance(game.agents[2], DataManipulationAgent) # blue agent - assert game.agents[2].agent_name == "defender" - assert isinstance(game.agents[2], ProxyAgent) + assert game.agents[3].agent_name == "defender" + assert isinstance(game.agents[3], ProxyAgent) network: Network = game.simulation.network @@ -91,6 +101,16 @@ def test_web_browser_install(): assert web_browser.target_url == "http://arcd.com/users/" +def test_database_client_install(): + """Test that the Database Client service can be configured via config.""" + game = load_config(BASIC_CONFIG) + client_1: Computer = game.simulation.network.get_node_by_hostname("client_1") + + database_client: DatabaseClient = client_1.software_manager.software.get("DatabaseClient") + + assert database_client.server_ip_address == IPv4Address("192.168.1.10") + + def test_data_manipulation_bot_install(): """Test that the data manipulation bot can be configured via config.""" game = load_config(BASIC_CONFIG) @@ -117,3 +137,70 @@ def test_dos_bot_install(): assert dos_bot.dos_intensity == 1.0 # default assert dos_bot.max_sessions == 1000 # default assert dos_bot.repeat is False # default + + +def test_dns_client_install(): + """Test that the DNS Client service can be configured via config.""" + game = load_config(BASIC_CONFIG) + client_1: Computer = game.simulation.network.get_node_by_hostname("client_1") + + dns_client: DNSClient = client_1.software_manager.software.get("DNSClient") + + assert dns_client.dns_server == IPv4Address("192.168.1.10") + + +def test_database_service_install(): + """Test that the Database Service can be configured via config.""" + game = load_config(BASIC_CONFIG) + client_1: Computer = game.simulation.network.get_node_by_hostname("client_1") + + database_service: DatabaseService = client_1.software_manager.software.get("DatabaseService") + + assert database_service.backup_server_ip == IPv4Address("192.168.1.10") + + +def test_web_server_install(): + """Test that the Web Server Service can be configured via config.""" + game = load_config(BASIC_CONFIG) + client_1: Computer = game.simulation.network.get_node_by_hostname("client_1") + + web_server_service: WebServer = client_1.software_manager.software.get("WebServer") + + # config should have also installed database client - web server service should be able to retrieve this + assert web_server_service.software_manager.software.get("DatabaseClient") is not None + + +def test_ftp_client_install(): + """Test that the FTP Client Service can be configured via config.""" + game = load_config(BASIC_CONFIG) + client_1: Computer = game.simulation.network.get_node_by_hostname("client_1") + + ftp_client_service: FTPClient = client_1.software_manager.software.get("FTPClient") + assert ftp_client_service is not None + + +def test_ftp_server_install(): + """Test that the FTP Server Service can be configured via config.""" + game = load_config(BASIC_CONFIG) + client_1: Computer = game.simulation.network.get_node_by_hostname("client_1") + + ftp_server_service: FTPServer = client_1.software_manager.software.get("FTPServer") + assert ftp_server_service is not None + + +def test_ntp_client_install(): + """Test that the NTP Client Service can be configured via config.""" + game = load_config(BASIC_CONFIG) + client_1: Computer = game.simulation.network.get_node_by_hostname("client_1") + + ntp_client_service: NTPClient = client_1.software_manager.software.get("NTPClient") + assert ntp_client_service is not None + + +def test_ntp_server_install(): + """Test that the NTP Server Service can be configured via config.""" + game = load_config(BASIC_CONFIG) + client_1: Computer = game.simulation.network.get_node_by_hostname("client_1") + + ntp_server_service: NTPServer = client_1.software_manager.software.get("NTPServer") + assert ntp_server_service is not None