Path: blob/main/cyberbattle/samples/toyctf/tinytoy.py
597 views
# Copyright (c) Microsoft Corporation.1# Licensed under the MIT License.23"""A tiny toy environment"""45from cyberbattle.simulation import model as m6from cyberbattle.simulation.model import NodeID, NodeInfo, VulnerabilityID, VulnerabilityInfo7from typing import Dict, Iterator, cast, Tuple89default_allow_rules = [10m.FirewallRule("SSH", m.RulePermission.ALLOW),11]1213# Network nodes involved in the Capture the flag game14nodes = {15"Website": m.NodeInfo(16services=[m.ListeningService("SSH", allowedCredentials=["ReusedMySqlCred-web"])],17firewall=m.FirewallConfiguration(incoming=default_allow_rules, outgoing=default_allow_rules + [m.FirewallRule("su", m.RulePermission.ALLOW), m.FirewallRule("sudo", m.RulePermission.ALLOW)]),18value=1000,19properties=["MySql", "Ubuntu", "nginx/1.10.3"],20owned_string="FLAG: Login using insecure SSH user/password",21vulnerabilities=dict(22ScanPageSource=m.VulnerabilityInfo(23description="Website page source contains refrence to browseable " "relative web directory",24type=m.VulnerabilityType.REMOTE,25outcome=m.LeakedNodesId(["Website.Directory"]),26reward_string="Viewing the web page source reveals a URL to a .txt file and directory on the website",27cost=1.0,28),29),30),31"Website.Directory": m.NodeInfo(32services=[m.ListeningService("HTTPS")],33value=50,34properties=["Ubuntu", "nginx/1.10.3", "CTFFLAG:Readme.txt-Discover secret data"],35vulnerabilities=dict(36NavigateWebDirectoryFurther=m.VulnerabilityInfo(37description="Discover MYSQL credentials MySql for user " "'web' in (getting-started.txt)",38type=m.VulnerabilityType.REMOTE,39outcome=m.LeakedCredentials(credentials=[m.CachedCredential(node="Website", port="MySQL", credential="ReusedMySqlCred-web")]),40reward_string="Discover browseable web directory: Navigating to parent URL revealed file `readme.txt`" "with secret data (aflag); and `getting-started.txt` with MYSQL credentials",41cost=1.0,42),43),44),45"client": m.NodeInfo(46services=[],47properties=["CLIENT:Win10"],48value=0,49vulnerabilities=dict(50SearchEdgeHistory=m.VulnerabilityInfo(51description="Search web history for list of accessed websites",52type=m.VulnerabilityType.LOCAL,53outcome=m.LeakedNodesId(["Website"]),54reward_string="Web browser history revealed website URL of interest",55cost=1.0,56)57),58agent_installed=True,59reimagable=False,60),61}6263global_vulnerability_library: Dict[VulnerabilityID, VulnerabilityInfo] = dict([])6465# Environment constants66ENV_IDENTIFIERS = m.infer_constants_from_nodes(cast(Iterator[Tuple[NodeID, NodeInfo]], list(nodes.items())), global_vulnerability_library)676869def new_environment() -> m.Environment:70return m.Environment(network=m.create_network(nodes), vulnerability_library=global_vulnerability_library, identifiers=ENV_IDENTIFIERS)717273