Skip to content

Commit ae6b659

Browse files
committed
Add Defender conf check
1 parent 76a0190 commit ae6b659

1 file changed

Lines changed: 88 additions & 3 deletions

File tree

nxc/modules/wcc.py

Lines changed: 88 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,16 @@ def init_checks(self):
194194
ConfigCheck("BitLocker configuration", "Checks the BitLocker configuration (based on https://www.stigviewer.com/stig/windows_10/2020-06-15/finding/V-94859)", checker_args=[[self, ("HKLM\\SOFTWARE\\Policies\\Microsoft\\FVE", "UseAdvancedStartup", 1), ("HKLM\\SOFTWARE\\Policies\\Microsoft\\FVE", "UseTPMPIN", 1)]]),
195195
ConfigCheck("Guest account disabled", "Checks if the guest account is disabled", checkers=[self.check_guest_account_disabled]),
196196
ConfigCheck("Automatic session lock enabled", "Checks if the session is automatically locked on after a period of inactivity", checker_args=[[self, ("HKCU\\Control Panel\\Desktop", "ScreenSaverIsSecure", 1), ("HKCU\\Control Panel\\Desktop", "ScreenSaveTimeOut", 300, le)]]),
197-
ConfigCheck('Powershell Execution Policy == "Restricted"', 'Checks if the Powershell execution policy is set to "Restricted"', checker_args=[[self, ("HKLM\\SOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\\Microsoft.Powershell", "ExecutionPolicy", "Restricted\x00"), ("HKCU\\SOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\\Microsoft.Powershell", "ExecutionPolicy", "Restricted\x00")]], checker_kwargs=[{"options": {"KOIfMissing": False, "lastWins": True}}])
197+
ConfigCheck('Powershell Execution Policy == "Restricted"', 'Checks if the Powershell execution policy is set to "Restricted"', checker_args=[[self, ("HKLM\\SOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\\Microsoft.Powershell", "ExecutionPolicy", "Restricted\x00"), ("HKCU\\SOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\\Microsoft.Powershell", "ExecutionPolicy", "Restricted\x00")]], checker_kwargs=[{"options": {"KOIfMissing": False, "lastWins": True}}]),
198+
ConfigCheck("Defender service running", "Checks if defender service is enabled", checkers=[self.check_defender_service]),
199+
ConfigCheck("Defender Tamper Protection enabled", "Check if Defender Tamper Protection is enabled", checker_args=[[self, ("HKLM\\Software\\Microsoft\\Windows Defender\\Features", "TamperProtection", 5)]]),
200+
ConfigCheck("Defender RealTime Monitoring enabled", "Check if Defender RealTime Monitoring is enabled", checker_args=[[self, ("HKLM\\Software\\Microsoft\\Windows Defender\\Real-Time Protection", "DisableRealtimeMonitoring", 0), ("HKLM\\Software\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection", "DisableRealtimeMonitoring", 0)]], checker_kwargs=[{"options": {"KOIfMissing": False, "lastWins": True}}]),
201+
ConfigCheck("Defender IOAV Protection enabled", "Check if Defender IOAV Protection is enabled", checker_args=[[self, ("HKLM\\Software\\Microsoft\\Windows Defender\\Real-Time Protection", "DisableIOAVProtection", 0), ("HKLM\\Software\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection", "DisableIOAVProtection", 0)]], checker_kwargs=[{"options": {"KOIfMissing": False, "lastWins": True}}]),
202+
ConfigCheck("Defender Behaviour Monitoring enabled", "Check if Defender Behaviour Monitoring is enabled", checker_args=[[self, ("HKLM\\Software\\Microsoft\\Windows Defender\\Real-Time Protection", "DisableBehaviourMonitoring", 0), ("HKLM\\Software\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection", "DisableBehaviourMonitoring", 0)]], checker_kwargs=[{"options": {"KOIfMissing": False, "lastWins": True}}]),
203+
ConfigCheck("Defender Script Scanning enabled", "Check if Defender Script Scanning is enabled", checker_args=[[self, ("HKLM\\Software\\Microsoft\\Windows Defender\\Real-Time Protection", "DisableScriptScanning", 0), ("HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Real-Time Protection", "DisableScriptScanning", 0)]], checker_kwargs=[{"options": {"KOIfMissing": False, "lastWins": True}}]),
204+
ConfigCheck("Defender path exlusion path", "Checks Defender path exlusion", checkers=[self.check_defender_exclusion_path]),
205+
ConfigCheck("Defender extension exlusion", "Checks Defender extension exlusion", checkers=[self.check_defender_exclusion_extension])
206+
198207
]
199208

200209
# Add check to conf_checks table if missing
@@ -483,6 +492,80 @@ def check_applocker(self):
483492

484493
return success, reasons
485494

495+
def check_defender_exclusion_path(self):
496+
key_name = "HKLM\\SOFTWARE\\Microsoft\\Windows Defender\\Exclusions\\Paths"
497+
values = self.reg_query_value(self.dce, self.connection, key_name, valueName=None, all=True)
498+
success = True
499+
reasons = []
500+
for value_type, value_name, value_data in values:
501+
reasons.append(value_name)
502+
key_name = "HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Exclusions\\Paths"
503+
try:
504+
values = self.reg_query_value(self.dce, self.connection, key_name, valueName=None, all=True)
505+
for value_type, value_name, value_data in values:
506+
reasons.append(value_name)
507+
except Exception:
508+
self.context.log.debug("No defender path exclusion policies")
509+
510+
if len(reasons) > 0:
511+
success = False
512+
513+
return success, reasons
514+
515+
def check_defender_exclusion_extension(self):
516+
key_name = "HKLM\\SOFTWARE\\Microsoft\\Windows Defender\\Exclusions\\Extensions"
517+
values = self.reg_query_value(self.dce, self.connection, key_name, valueName=None, all=True)
518+
success = True
519+
reasons = []
520+
for value_type, value_name, value_data in values:
521+
reasons.append(value_name)
522+
key_name = "HKLM\\SOFTWARE\\Policies\\Microsoft\\Windows Defender\\Exclusions\\Extensions"
523+
try:
524+
values = self.reg_query_value(self.dce, self.connection, key_name, valueName=None, all=True)
525+
for value_type, value_name, value_data in values:
526+
reasons.append(value_name)
527+
except Exception:
528+
self.context.log.debug("No defender extension exclusion policies")
529+
if len(reasons) > 0:
530+
success = False
531+
532+
return success, reasons
533+
534+
def check_defender_service(self):
535+
ok = True
536+
raised = False
537+
reasons = []
538+
try:
539+
service_config, service_status = self.get_service("windefend", self.connection)
540+
if service_status == scmr.SERVICE_RUNNING:
541+
reasons.append("windefend service running")
542+
elif service_status == scmr.SERVICE_STOPPED:
543+
ok = False
544+
reasons.append("windefend service not running")
545+
except DCERPCException as e:
546+
ok = True
547+
raised = True
548+
reasons = [f"windefend service check error({e})"]
549+
if ok is False or raised is True:
550+
try:
551+
service_config, service_status = self.get_service("sense", self.connection)
552+
if service_status == scmr.SERVICE_RUNNING:
553+
reasons.append("sense service running")
554+
elif service_status == scmr.SERVICE_STOPPED:
555+
ok = False
556+
reasons.append("sense service not running")
557+
except DCERPCException as e:
558+
ok = True
559+
raised = True
560+
reasons.append(f"sense service check error({e})")
561+
if raised is True:
562+
reasons_save = reasons
563+
args = ("HKLM\\SOFTWARE\\Microsoft\\Windows Defender", "IsServiceRunning", 1)
564+
ok, reasons = self.check_registry(args)
565+
reasons.extend(reasons_save)
566+
567+
return ok, reasons
568+
486569
# Methods for getting values from the remote registry #
487570
#######################################################
488571

@@ -534,7 +617,7 @@ def reg_get_subkeys(self, dce, connection, key_name):
534617
break
535618
return subkeys
536619

537-
def reg_query_value(self, dce, connection, keyName, valueName=None):
620+
def reg_query_value(self, dce, connection, keyName, valueName=None, all=False):
538621
"""Query remote registry data for a given registry value"""
539622

540623
def subkey_values(subkey_handle):
@@ -587,8 +670,10 @@ def get_value(subkey_handle, dwIndex=0):
587670

588671
subkey_handle = ans["phkResult"]
589672

590-
if valueName is None:
673+
if valueName is None and all is False:
591674
return get_value(subkey_handle)[2]
675+
elif valueName is None and all is True:
676+
return subkey_values(subkey_handle)
592677
else:
593678
for _, name, data in subkey_values(subkey_handle):
594679
if name.upper() == valueName.upper():

0 commit comments

Comments
 (0)