Path: blob/main/cyberbattle/samples/active_directory/tiny_ad.py
597 views
from cyberbattle.simulation.model import FirewallConfiguration, FirewallRule, RulePermission1from cyberbattle.simulation import model as m2from typing import Dict345firewall_conf = FirewallConfiguration(6[FirewallRule("SMB", RulePermission.ALLOW), FirewallRule("AD", RulePermission.ALLOW), FirewallRule("SHELL", RulePermission.ALLOW)],7[FirewallRule("SMB", RulePermission.ALLOW), FirewallRule("AD", RulePermission.ALLOW), FirewallRule("SHELL", RulePermission.ALLOW)],8)91011def default_vulnerabilities() -> m.VulnerabilityLibrary:12lib = {}13lib["FindDomainControllers"] = m.VulnerabilityInfo(14description="Search for valid domain controllers in the current machines environment.",15type=m.VulnerabilityType.LOCAL,16outcome=m.LeakedNodesId(nodes=["domain_controller_1"]),17reward_string="Found domain controllers",18)19lib["EnumerateFileShares"] = m.VulnerabilityInfo(20description="Find all SMB shares this machine knows about.", type=m.VulnerabilityType.LOCAL, outcome=m.ExploitFailed(), reward_string="Found shares"21)22lib["ProbeAdmin"] = m.VulnerabilityInfo(23description="Probe a workstation to see if you have admin creds on it", type=m.VulnerabilityType.LOCAL, outcome=m.ProbeFailed(), reward_string="No admin creds."24)25lib["ScanForCreds"] = m.VulnerabilityInfo(26description="Scan the local security managers for credentials. Need to be admin on the box.",27type=m.VulnerabilityType.LOCAL,28outcome=m.LeakedCredentials(credentials=[m.CachedCredential(node="domain_controller_1", port="AD", credential="dc_1")]),29precondition=m.Precondition("admin"),30reward_string="DA credentials found",31)32return lib333435def breach_vulnerabilities(lib: m.VulnerabilityLibrary) -> m.VulnerabilityLibrary:36lib["AuthorizationSpoofAndCrack"] = m.VulnerabilityInfo(37description="Spoof an authoritative source on the network to get a crackable hash, then try to crack it",38type=m.VulnerabilityType.LOCAL,39outcome=m.LeakedCredentials(credentials=[m.CachedCredential(node="workstation_1", port="SHELL", credential="user_1")]),40)41return lib424344def admin_vulnerabilities(lib: m.VulnerabilityLibrary) -> m.VulnerabilityLibrary:45lib["ProbeAdmin"] = m.VulnerabilityInfo(46description="Probe a workstation to see if you have admin creds on it",47type=m.VulnerabilityType.LOCAL,48outcome=m.ProbeSucceeded(discovered_properties=["admin"]),49reward_string="Admin creds verified.",50)51return lib525354def dc_vulnerabilities(lib: m.VulnerabilityLibrary) -> m.VulnerabilityLibrary:55lib["DumpNTDS"] = m.VulnerabilityInfo(56description="Dump the NTDS file from AD",57type=m.VulnerabilityType.LOCAL,58outcome=m.LeakedCredentials(credentials=[m.CachedCredential(node=f"workstation_{wid}", port="SHELL", credential=f"user_{uid}") for wid in range(0, 1) for uid in range(0, 20)]),59precondition=m.Precondition("domain_controller"),60reward_string="Dumped all user hashes. Get crackin'",61)62return lib636465nodes = {66"domain_controller_1": m.NodeInfo(67services=[m.ListeningService(name="AD", allowedCredentials=["dc_1"])],68properties=["domain_controller"],69value=100,70firewall=firewall_conf,71vulnerabilities=dc_vulnerabilities(default_vulnerabilities()),72),73"workstation_0": m.NodeInfo(74services=[m.ListeningService(name="SHELL", allowedCredentials=[f"user_{uid}" for uid in range(0, 20)])],75value=0,76properties=["breach_node"],77vulnerabilities=breach_vulnerabilities(default_vulnerabilities()),78agent_installed=True,79firewall=firewall_conf,80reimagable=False,81),82"workstation_1": m.NodeInfo(83services=[m.ListeningService(name="SHELL", allowedCredentials=[f"user_{uid}" for uid in range(0, 20)])],84properties=["admin"],85value=1,86firewall=firewall_conf,87vulnerabilities=admin_vulnerabilities(default_vulnerabilities()),88),89}9091global_vulnerability_library: Dict[m.VulnerabilityID, m.VulnerabilityInfo] = dict([])9293# Environment constants94ENV_IDENTIFIERS = m.Identifiers(95properties=[96"breach_node",97"domain_controller",98"admin", # whether or not the users of this machine are admins99],100ports=["SMB", "AD", "SHELL"],101local_vulnerabilities=["FindDomainControllers", "EnumerateFileShares", "AuthorizationSpoofAndCrack", "ScanForCreds", "DumpNTDS", "ProbeAdmin"],102remote_vulnerabilities=["PasswordSpray"],103)104105106def new_environment() -> m.Environment:107return m.Environment(network=m.create_network(nodes), vulnerability_library=global_vulnerability_library, identifiers=ENV_IDENTIFIERS)108109110