From 4347051769d731b207f3b55b652b693e881befa4 Mon Sep 17 00:00:00 2001 From: admingit Date: Sun, 27 Apr 2025 22:15:36 +0200 Subject: [PATCH] app_windows --- apps/stealthbits_ad_ldap/README.txt | 107 +++ .../README/addon_builder.conf.spec | 4 + apps/stealthbits_ad_ldap/app.manifest | 53 ++ .../default/addon_builder.conf | 7 + apps/stealthbits_ad_ldap/default/app.conf | 30 + .../default/data/ui/nav/default.xml | 6 + .../default/data/ui/views/README | 1 + .../default/data/ui/views/page_ad_changes.xml | 623 ++++++++++++++++ .../data/ui/views/page_gpo_changes.xml | 620 ++++++++++++++++ .../data/ui/views/page_ldap_monitoring.xml | 619 ++++++++++++++++ .../default/data/ui/views/page_overview.xml | 689 ++++++++++++++++++ .../default/eventtypes.conf | 11 + apps/stealthbits_ad_ldap/default/macros.conf | 3 + apps/stealthbits_ad_ldap/default/props.conf | 21 + apps/stealthbits_ad_ldap/default/tags.conf | 9 + .../stealthbits_ad_ldap/metadata/default.meta | 8 + apps/stealthbits_ad_ldap/static/appIcon.png | Bin 0 -> 1339 bytes .../stealthbits_ad_ldap/static/appIconAlt.png | Bin 0 -> 1456 bytes .../static/appIconAlt_2x.png | Bin 0 -> 1741 bytes .../stealthbits_ad_ldap/static/appIcon_2x.png | Bin 0 -> 1697 bytes .../static/appLogo_2x_red.png | Bin 0 -> 12606 bytes .../static/appLogo_red.png | Bin 0 -> 5471 bytes .../stealthbits_ad_ldap/static/screenshot.png | Bin 0 -> 41342 bytes .../stealthbits_ad_ldap.aob_meta | 1 + 24 files changed, 2812 insertions(+) create mode 100644 apps/stealthbits_ad_ldap/README.txt create mode 100644 apps/stealthbits_ad_ldap/README/addon_builder.conf.spec create mode 100644 apps/stealthbits_ad_ldap/app.manifest create mode 100644 apps/stealthbits_ad_ldap/default/addon_builder.conf create mode 100644 apps/stealthbits_ad_ldap/default/app.conf create mode 100644 apps/stealthbits_ad_ldap/default/data/ui/nav/default.xml create mode 100644 apps/stealthbits_ad_ldap/default/data/ui/views/README create mode 100644 apps/stealthbits_ad_ldap/default/data/ui/views/page_ad_changes.xml create mode 100644 apps/stealthbits_ad_ldap/default/data/ui/views/page_gpo_changes.xml create mode 100644 apps/stealthbits_ad_ldap/default/data/ui/views/page_ldap_monitoring.xml create mode 100644 apps/stealthbits_ad_ldap/default/data/ui/views/page_overview.xml create mode 100644 apps/stealthbits_ad_ldap/default/eventtypes.conf create mode 100644 apps/stealthbits_ad_ldap/default/macros.conf create mode 100644 apps/stealthbits_ad_ldap/default/props.conf create mode 100644 apps/stealthbits_ad_ldap/default/tags.conf create mode 100644 apps/stealthbits_ad_ldap/metadata/default.meta create mode 100644 apps/stealthbits_ad_ldap/static/appIcon.png create mode 100644 apps/stealthbits_ad_ldap/static/appIconAlt.png create mode 100644 apps/stealthbits_ad_ldap/static/appIconAlt_2x.png create mode 100644 apps/stealthbits_ad_ldap/static/appIcon_2x.png create mode 100644 apps/stealthbits_ad_ldap/static/appLogo_2x_red.png create mode 100644 apps/stealthbits_ad_ldap/static/appLogo_red.png create mode 100644 apps/stealthbits_ad_ldap/static/screenshot.png create mode 100644 apps/stealthbits_ad_ldap/stealthbits_ad_ldap.aob_meta diff --git a/apps/stealthbits_ad_ldap/README.txt b/apps/stealthbits_ad_ldap/README.txt new file mode 100644 index 00000000..60c23d1e --- /dev/null +++ b/apps/stealthbits_ad_ldap/README.txt @@ -0,0 +1,107 @@ +Netwrix (STEALTHbits) Active Directory Monitoring App for Splunk + +Netwrix (STEALTHbits')Threat Manager provides many valuable controls for your +IT infrastructure, and has many ways to utilize that data including real-time +blocking and alerting. But holistic data reporting requires a more broad +reaching platform such as Splunk. This app helps provide insight into the most +common activities happening around your Active Directory. + +-------------------------------------------------------------------------------- +Version Support +-------------------------------------------------------------------------------- + + v.2.0.0 + - Add app compatibility with Splunk Cloud environments + - Netwrix rebranding + - Add usage of Splunk "stealthData" macro + - Modify eventtype names to remove ':' character usage, and replaced + spaces with "_" + - Removed the "StealthINTERCEPT File System Activity" eventtype + - Update extractions to handle both "StealthINTERCEPT" and "STEALTHbits" + source types + - Added extra CIM compliance fields + - Changed the mapping of "Windows File System Access Rights Change" from + "modified" to "acl_modified" in the "action" field + - Removed "success" and "failure" as possible values in "action" field. + These are now part of the "status" field + - Changed the AD active users panel on the overview dashboard, to + break down the count by AD type + + v.1.1.1 + - Improved support for analytics on authentication attacks page + + v.1.1.0 + - Improved query efficiency + - Added CIM compliance + - Added LDAP monitoring page + + v.1.0.0 + - Initial Release of App + +-------------------------------------------------------------------------------- +System Requirements +-------------------------------------------------------------------------------- + + Splunk Console + StealthINTERCEPT + Machine Learning Toolkit for Splunk + +-------------------------------------------------------------------------------- +Installation +-------------------------------------------------------------------------------- + + 1. Log in to Splunk Web and navigate to Apps > Manage Apps. + 2. Click Install App from file. + 3. Upload the file and click Upload. + 4. Restart Splunk Web. + +-------------------------------------------------------------------------------- +Collecting Data +-------------------------------------------------------------------------------- + + Configure the StealthINTERCEPT server to send data to Splunk via Syslog. + + You may choose to use SC4S, a Syslog server with a Universal Forwarder or + direct Heavy Forwarder ingest. + + In all cases, you should configure your favoured approach to ingest the data + with the sourcetype "StealhINTERCEPT" + + You may also choose to create a dedicated index. You should recall the + specified index name for the next step + +-------------------------------------------------------------------------------- +Configuration +-------------------------------------------------------------------------------- + + To expedite search performance configure the "stalthData" macro. + + This can be configured by going to + Settings -> Advanced Search -> Search macros: + - stealthData. + + This is used to improve search performance and should be appropriately + modified to specify the index(es) you defined in the previous step. + + E.g. + index=[yourStealDataIndex] (sourcetype=STEALTHbits OR sourcetype= + StealthINTERCEPT) + + If left unmodified, this defaults to searching across all indexes in the + Splunk environment. + +-------------------------------------------------------------------------------- +Troubleshooting +-------------------------------------------------------------------------------- + + Data does not show up in the dashboard pages. + - Make sure that StealthINTERCEPT is configured to send data to Splunk. + - Make sure that StealthINTERCEPT as a UDP log source in Splunk and has + the correct sourcetype and index definition. + +-------------------------------------------------------------------------------- +Support +-------------------------------------------------------------------------------- + + Netwrix (STEALTHbits) Support: + splunk@netwrix.com# Binary File Declaration diff --git a/apps/stealthbits_ad_ldap/README/addon_builder.conf.spec b/apps/stealthbits_ad_ldap/README/addon_builder.conf.spec new file mode 100644 index 00000000..80d47eb4 --- /dev/null +++ b/apps/stealthbits_ad_ldap/README/addon_builder.conf.spec @@ -0,0 +1,4 @@ +[base] +builder_version = +builder_build = +is_edited = diff --git a/apps/stealthbits_ad_ldap/app.manifest b/apps/stealthbits_ad_ldap/app.manifest new file mode 100644 index 00000000..90ddcb66 --- /dev/null +++ b/apps/stealthbits_ad_ldap/app.manifest @@ -0,0 +1,53 @@ +{ + "schemaVersion": "1.0.0", + "info": { + "title": "Netwrix Active Directory and LDAP Monitoring", + "id": { + "group": null, + "name": "stealthbits_ad_ldap", + "version": "2.0.0" + }, + "author": [ + { + "name": "Netwrix Corporation", + "email": null, + "company": null + } + ], + "releaseDate": null, + "description": "Netwrix Threat Manager provides many valuable controls for your IT infrastructure, and has many ways to utilize that data including real-time blocking and alerting. But holistic data reporting requires a more broad reaching platform such as Splunk. This app helps provide insight into the most common activities happening around your Active Directory Learn more about Netwrix at https://www.Netwrix.com/.", + "classification": { + "intendedAudience": null, + "categories": [], + "developmentStatus": null + }, + "commonInformationModels": null, + "license": { + "name": null, + "text": null, + "uri": null + }, + "privacyPolicy": { + "name": null, + "text": null, + "uri": null + }, + "releaseNotes": { + "name": null, + "text": null, + "uri": null + } + }, + "dependencies": { + }, + "tasks": [], + "inputGroups": { + }, + "incompatibleApps": { + }, + "platformRequirements": { + "splunk": { + "Enterprise": "*" + } + } +} \ No newline at end of file diff --git a/apps/stealthbits_ad_ldap/default/addon_builder.conf b/apps/stealthbits_ad_ldap/default/addon_builder.conf new file mode 100644 index 00000000..fb736045 --- /dev/null +++ b/apps/stealthbits_ad_ldap/default/addon_builder.conf @@ -0,0 +1,7 @@ +# this file is generated by add-on builder automatically +# please do not edit it +[base] +builder_version = 4.1.3 +builder_build = 0 +is_edited = 1 + diff --git a/apps/stealthbits_ad_ldap/default/app.conf b/apps/stealthbits_ad_ldap/default/app.conf new file mode 100644 index 00000000..786e18b1 --- /dev/null +++ b/apps/stealthbits_ad_ldap/default/app.conf @@ -0,0 +1,30 @@ +# this add-on is powered by splunk Add-on builder +[install] +state_change_requires_restart = false +is_configured = 0 +state = enabled +build = 105 + +[launcher] +author = Netwrix Corporation +version = 2.0.0 +description = Netwrix Threat Manager provides many valuable controls for your IT infrastructure, and has many ways to utilize that data including real-time blocking and alerting. But holistic data reporting requires a more broad reaching platform such as Splunk. This app helps provide insight into the most common activities happening around your Active Directory Learn more about Netwrix at https://www.Netwrix.com/. + +[ui] +is_visible = 1 +label = Netwrix Active Directory and LDAP Monitoring +docs_section_override = AddOns:released + +[package] +id = stealthbits_ad_ldap + +[triggers] +reload.addon_builder = simple +reload.stealthbits_ad_ldap_account = simple +reload.stealthbits_ad_ldap_settings = simple +reload.passwords = simple + +[author=Netwrix] +email = splunk@netwrix.com +company = Netwrix Corporation + diff --git a/apps/stealthbits_ad_ldap/default/data/ui/nav/default.xml b/apps/stealthbits_ad_ldap/default/data/ui/nav/default.xml new file mode 100644 index 00000000..4402969a --- /dev/null +++ b/apps/stealthbits_ad_ldap/default/data/ui/nav/default.xml @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/apps/stealthbits_ad_ldap/default/data/ui/views/README b/apps/stealthbits_ad_ldap/default/data/ui/views/README new file mode 100644 index 00000000..d518a88b --- /dev/null +++ b/apps/stealthbits_ad_ldap/default/data/ui/views/README @@ -0,0 +1 @@ +Add all the views that your app needs in this directory diff --git a/apps/stealthbits_ad_ldap/default/data/ui/views/page_ad_changes.xml b/apps/stealthbits_ad_ldap/default/data/ui/views/page_ad_changes.xml new file mode 100644 index 00000000..a67442ba --- /dev/null +++ b/apps/stealthbits_ad_ldap/default/data/ui/views/page_ad_changes.xml @@ -0,0 +1,623 @@ +
+ +
+ +
+ + + + + -7d@h + now + + + + + + + `stealthData` + | where not match(PolicyName, ".*%.*") + | stats sum(PolicyName) by PolicyName + | fields - sum(PolicyName) + | dedup PolicyName + + $eventTime.earliest$ + now + + PolicyName + PolicyName + All Policies + * + * + + + + * + + + `stealthData` + | where not match(event_id, ".*%.*") and like(event_id, "%Active Directory%") + | stats count by event_id + | eval eventID = replace(event_id, "Active Directory ", "") + | table eventID + + $eventTime.earliest$ + now + + eventID + eventID + All Actions + + + + * + + + `stealthData` + | where not match(SuccessfulChange, ".*%.*") and like(event_id, "%Active Directory%") + | stats count by SuccessfulChange + | eval newSuccessfulChange = case(SuccessfulChange="True", "Successful", SuccessfulChange="False", "Failed") + | table newSuccessfulChange, SuccessfulChange + + $eventTime.earliest$ + now + + newSuccessfulChange + SuccessfulChange + Successful & Failed + * + + + + * + + + `stealthData` + | where not match(BlockedEvent, ".*%.*") and like(event_id, "%Active Directory%") + | stats sum(BlockedEvent) as BlockedEvent_count by BlockedEvent + | eval translated_BlockedEvent=case(BlockedEvent="True", "Yes", BlockedEvent="False", "No") + | table translated_BlockedEvent, BlockedEvent + | dedup translated_BlockedEvent, BlockedEvent + | sort -translated_BlockedEvent, -BlockedEvent + + $eventTime.earliest$ + now + + translated_BlockedEvent + BlockedEvent + Yes or No + * + + +
+ + + + * + + + `stealthData` + | where not match(src_nt_domain, ".*%.*") and like(event_id, "%Active Directory%") + | stats sum(src_nt_domain) by src_nt_domain + | fields - sum(src_nt_domain) + | dedup src_nt_domain + + $eventTime.earliest$ + now + + src_nt_domain + src_nt_domain + All Domains + * + + + + * + + + `stealthData` + | where not match(Server, ".*%.*") and like(event_id, "%Active Directory%") + | stats sum(Server) by Server + | eval Server=case(!LIKE(Server, "%\\%"), Server, Server LIKE "%\\%", mvindex(split(Server, "\\"), 1)) + | fields - sum(Server) + | dedup Server + + $eventTime.earliest$ + now + + Server + Server + All Hosts + + + + * + + + `stealthData` + | where not match(Perpetrator, ".*%.*") and like(event_id, "%Active Directory%") + | stats sum(Perpetrator) as Perpetrator_count by Perpetrator + | eval Perpetrator=case(!LIKE(Perpetrator, "%\\%"), Perpetrator, Perpetrator LIKE "%\\%", mvindex(split(Perpetrator, "\\"), 1)) + | eval upper_Perpetrator=upper(substr(Perpetrator,1,1)).substr(Perpetrator,2) + | table upper_Perpetrator, Perpetrator + | dedup upper_Perpetrator, Perpetrator + + $eventTime.earliest$ + now + + upper_Perpetrator + Perpetrator + All Users + + + + * + + + `stealthData` + | where not match(Domain, ".*%.*") + | stats sum(Server) by Domain + | fields - sum(Server) + | dedup Domain + + $eventTime.earliest$ + now + + Domain + Domain + All Domains + + + + + + `stealthData` + | where not match(ObjectClass, ".*%.*") and like(event_id, "%Active Directory%") + | stats sum(ObjectClass) as ObjectClass_count by ObjectClass + | eval upper_ObjectClass=upper(substr(ObjectClass,1,1)).substr(ObjectClass,2) + | table upper_ObjectClass, ObjectClass + | dedup upper_ObjectClass, ObjectClass + + $eventTime.earliest$ + now + + upper_ObjectClass + ObjectClass + All Object Types + * + * + + + + * + + + `stealthData` + | where not match(ModifiedObject, ".*%.*") and like(event_id, "%Active Directory%") + | stats sum(Server) by ModifiedObject + | eval ModifiedObject=case(!LIKE(ModifiedObject, "%\\%"), ModifiedObject, ModifiedObject LIKE "%\\%", mvindex(split(ModifiedObject, "\\"), 1)) + | eval upper_ModifiedObject=upper(substr(ModifiedObject,1,1)).substr(ModifiedObject,2) + | table upper_ModifiedObject, ModifiedObject + | dedup upper_ModifiedObject, ModifiedObject + + $eventTime.earliest$ + now + + upper_ModifiedObject + ModifiedObject + All Objects + + + + +
+ + + + + + + + + + + + `stealthData` + | where like(event_id, "%Active Directory%") + | eval Time = strftime(_time,"%Y-%m-%d %H:%M%P") + | eval EventType = replace(event_id, "Active Directory ", "") + | eval InitiatedHost = case(!LIKE(Server, "%\\%"), Server, Server LIKE "%\\%", mvindex(split(Server, "\\"), 1)) + | eval InitiatedUser = case(!LIKE(Perpetrator, "%\\%"), Perpetrator, Perpetrator LIKE "%\\%", mvindex(split(Perpetrator, "\\"), 1)) + | eval TargetObject = case(!LIKE(ModifiedObject, "%\\%"), ModifiedObject, ModifiedObject LIKE "%\\%", mvindex(split(ModifiedObject, "\\"), 1)) + | eval ActionResult = case(SuccessfulChange == "True", "Success", SuccessfulChange == "False", "Failure") + | search + PolicyName = "$detectingPolicy$" + EventType = "$actionPerformed$" + SuccessfulChange = "$actionResult$" + BlockedEvent = "$actionBlocked$" + ```src_nt_domain = "$initiatedDomain$"``` + InitiatedHost = "$initiatedHost$" + InitiatedUser = "$initiatedUser$" + Domain="$targetDomain$" + ObjectClass = "$targetObjectType$" + TargetObject = "$targetObject$" + | rename + Time AS "Event Time" + PolicyName AS "Detecting Policy" + EventType AS "Action Performed" + ActionResult AS "Action Result" + BlockedEvent AS "Action Blocked" + src_nt_domain AS "Initiating (Domain)" + InitiatedHost AS "Initiating (Host)" + InitiatedUser AS "Initiating (User)" + Domain AS "Target Domain" + ObjectClass AS "Target Object Type" + TargetObject AS "Target Object" + AttributeName AS "Target Attribute" + Operation AS "Operation" + OldAttributeValue AS "Old Value" + NewAttributeValue AS "New Value" + | table + _time + "Event Time" + "Detecting Policy" + "Action Performed" + "Action Result" + "Action Blocked" + "Initiating (Domain)" + "Initiating (Host)" + "Initiating (User)" + "Target Domain" + "Target Object Type" + "Target Object" + "Target Attribute" + "Operation" + "Old Value" + "New Value" + + $eventTime.earliest$ + now + + + + + + + + $click.value$ + + +
+
+
+ + + + + Event Details + + + `stealthData` + | where _time=$timeValue$ + | eval EventTime=strftime(_time, "%Y-%m-%d %H:%M:%S") + | eval EventTimeUTC=strftime(_time + 18000, "%Y-%m-%d %H:%M:%S") + | eval ActionStatus = case(SuccessfulChange == "True", "Success", SuccessfulChange == "False", "Failure") + | eval ActionCategory = case(change_type == "AD", "Active Directory") + | eval ActionType = replace(event_id, "Active Directory ", "") + | rename + EventTime AS "Time Logged" + EventTimeUTC AS "Time Logged UTC" + BlockedEvent AS "Action Blocked" + ActionStatus AS "Action Status" + ActionCategory AS "Action Category" + ActionType AS "Message" + | table + "Time Logged" + "Action Type" + "Action Blocked" + "Action Status" + "Action Category" + "Message" + | transpose 1 + + $eventTime.earliest$ + now + + + +
+
+ + + Perpetrator Details + + + `stealthData` + | where _time=$timeValue$ + | rename + Perpetrator AS "Account Name" + change_type AS "Protocol" + Server AS "Host" + ServerAddress AS "IP Address" + | table + "Account Name" + "Protocol" + "Host" + "IP Address" + | transpose 1 + + + + +
+
+ + + Affected Object Details + + + `stealthData` + | where _time=$timeValue$ + | rename + DistinguishedName AS "Path" + ObjectClass AS "Type" + CN AS "Name" + TargetHost AS "Host" + TargetAddress AS "IP Address" + | table + "Path" + "Type" + "Name" + "Host" + "IP Address" + | transpose 1 + + + + +
+
+ + + Agent Details + + + `stealthData` + | where _time=$timeValue$ + | rename + ClientHost AS "Host" + ClientAddress AS "IP Address" + | table + "Host" + "IP Address" + | transpose 1 + + + + +
+
+
+ + + + + + `stealthData` + | where _time=$timeValue$ + | eval EventType = replace(event_id, "Active Directory ", "") + | eval EventName = upper(substr(AttributeName, 1, 1)).substr(AttributeName, 2) + | rename + EventName AS "Attribute Name" + EventType AS "Event Type" + OldAttributeValue AS "Old Value" + NewAttributeValue AS "New Value" + | table + "Attribute Name" + "Event Type" + "Old Value" + "New Value" + | dedup + "Attribute Name" + "Event Type" + "Old Value" + "New Value" + + + + +
+
+
+
\ No newline at end of file diff --git a/apps/stealthbits_ad_ldap/default/data/ui/views/page_gpo_changes.xml b/apps/stealthbits_ad_ldap/default/data/ui/views/page_gpo_changes.xml new file mode 100644 index 00000000..dff1e9b1 --- /dev/null +++ b/apps/stealthbits_ad_ldap/default/data/ui/views/page_gpo_changes.xml @@ -0,0 +1,620 @@ +
+ +
+ +
+ + + + + -7d@h + now + + + + + + + `stealthData` + | where not match(PolicyName, ".*%.*") + | stats sum(PolicyName) by PolicyName + | fields - sum(PolicyName) + | dedup PolicyName + + $eventTime.earliest$ + now + + PolicyName + PolicyName + All Policies + * + * + + + + * + + + `stealthData` + | where not match(event_id, ".*%.*") and like(event_id, "%GPO%") + | eval EventType = replace(event_id, "SI Events Log ", "") + | stats count by EventType + | table EventType + + $eventTime.earliest$ + now + + EventType + EventType + All Actions + + + + * + + + `stealthData` + | where not match(SuccessfulChange, ".*%.*") and like(event_id, "%GPO%") + | stats count by SuccessfulChange + | eval newSuccessfulChange = case(SuccessfulChange="True", "Successful", SuccessfulChange="False", "Failed") + | table newSuccessfulChange, SuccessfulChange + + $eventTime.earliest$ + now + + newSuccessfulChange + SuccessfulChange + Successful & Failed + * + + + + * + + + `stealthData` + | where not match(BlockedEvent, ".*%.*") and like(event_id, "%GPO%") + | stats sum(BlockedEvent) as BlockedEvent_count by BlockedEvent + | eval translated_BlockedEvent=case(BlockedEvent="True", "Yes", BlockedEvent="False", "No") + | table translated_BlockedEvent, BlockedEvent + | dedup translated_BlockedEvent, BlockedEvent + | sort -translated_BlockedEvent, -BlockedEvent + + $eventTime.earliest$ + now + + translated_BlockedEvent + BlockedEvent + Yes or No + * + + +
+ + + + * + + + `stealthData` + | where not match(src_nt_domain, ".*%.*") and like(event_id, "%GPO%") + | stats sum(src_nt_domain) by src_nt_domain + | fields - sum(src_nt_domain) + | dedup src_nt_domain + + $eventTime.earliest$ + now + + src_nt_domain + src_nt_domain + All Domains + * + + + + * + + + `stealthData` + | where not match(Server, ".*%.*") and like(event_id, "%GPO%") + | stats sum(Server) by Server + | eval Server=case(!LIKE(Server, "%\\%"), Server, Server LIKE "%\\%", mvindex(split(Server, "\\"), 1)) + | fields - sum(Server) + | dedup Server + + $eventTime.earliest$ + now + + Server + Server + All Hosts + + + + * + + + `stealthData` + | where not match(Perpetrator, ".*%.*") and like(event_id, "%GPO%") + | stats sum(Perpetrator) as Perpetrator_count by Perpetrator + | eval Perpetrator=case(!LIKE(Perpetrator, "%\\%"), Perpetrator, Perpetrator LIKE "%\\%", mvindex(split(Perpetrator, "\\"), 1)) + | eval upper_Perpetrator=upper(substr(Perpetrator,1,1)).substr(Perpetrator,2) + | table upper_Perpetrator, Perpetrator + | dedup upper_Perpetrator, Perpetrator + + $eventTime.earliest$ + now + + upper_Perpetrator + Perpetrator + All Users + + + + * + + + `stealthData` + | where not match(Domain, ".*%.*") + | stats sum(Server) by Domain + | fields - sum(Server) + | dedup Domain + + $eventTime.earliest$ + now + + Domain + Domain + All Domains + + + + + + `stealthData` + | where not match(object, ".*%.*") and like(event_id, "%GPO%") + | eval AffectedObject = mvindex(split(object, "\\"), -1) + | stats count by AffectedObject + | table AffectedObject + | dedup AffectedObject + + $eventTime.earliest$ + now + + AffectedObject + AffectedObject + All Object Types + * + * + + + + * + + + `stealthData` + | where not match(AttributeName, ".*%.*") and like(event_id, "%GPO%") + | stats count by AttributeName + | table AttributeName + | dedup AttributeName + + $eventTime.earliest$ + now + + AttributeName + AttributeName + All Objects + + + + +
+ + + + + + + + + + + + + `stealthData` + | where like(event_id, "%GPO%") + | eval Time = strftime(_time,"%Y-%m-%d %H:%M%P") + | eval EventType = replace(event_id, "SI Events Log ", "") + | eval InitiatedHost = case(!LIKE(Server, "%\\%"), Server, Server LIKE "%\\%", mvindex(split(Server, "\\"), 1)) + | eval InitiatedUser = case(!LIKE(Perpetrator, "%\\%"), Perpetrator, Perpetrator LIKE "%\\%", mvindex(split(Perpetrator, "\\"), 1)) + | eval ActionResult = case(SuccessfulChange == "True", "Success", SuccessfulChange == "False", "Failure") + | eval AffectedObject = mvindex(split(object, "\\"), -1) + | search + PolicyName = "$detectingPolicy$" + EventType = "$actionPerformed$" + SuccessfulChange = "$actionResult$" + BlockedEvent = "$actionBlocked$" + src_nt_domain = "$initiatedDomain$" + InitiatedHost = "$initiatedHost$" + InitiatedUser = "$initiatedUser$" + Domain = "$targetDomain$" + AffectedObject = "$targetObjectType$" + AttributeName = "$targetObject$" + | rename + Time AS "Event Time" + PolicyName AS "Detecting Policy" + EventType AS "Action Performed" + ActionResult AS "Action Result" + BlockedEvent AS "Action Blocked" + src_nt_domain AS "Initiating (Domain)" + InitiatedHost AS "Initiating (Host)" + InitiatedUser AS "Initiating (User)" + Domain AS "Target Domain" + AffectedObject AS "Target Object Type" + AttributeName AS "Target Object" + OldAttributeValue AS "Old Value" + NewAttributeValue AS "New Value" + | table + _time + "Event Time" + "Detecting Policy" + "Action Performed" + "Action Result" + "Action Blocked" + "Initiating (Domain)" + "Initiating (Host)" + "Initiating (User)" + "Target Domain" + "Target Object Type" + "Target Object" + "Old Value" + "New Value" + | dedup + _time + "Event Time" + "Detecting Policy" + "Action Performed" + "Action Result" + "Action Blocked" + "Initiating (Domain)" + "Initiating (Host)" + "Initiating (User)" + "Target Domain" + "Target Object Type" + "Target Object" + "Old Value" + "New Value" + + $eventTime.earliest$ + now + + + + + + + + $click.value$ + + +
+
+
+ + + + Event Details + + + `stealthData` + | where _time=$timeValue$ + | eval EventTime=strftime(_time, "%Y-%m-%d %H:%M:%S") + | eval EventTimeUTC=strftime(_time + 18000, "%Y-%m-%d %H:%M:%S") + | eval ActionStatus = case(SuccessfulChange == "True", "Success", SuccessfulChange == "False", "Failure") + | eval ActionCategory = case(event_id LIKE "%GPO%", "Group Policy") + | eval ActionType = replace(event_id, "SI Events Log ", "") + | rename + EventTime AS "Time Logged" + EventTimeUTC AS "Time Logged UTC" + BlockedEvent AS "Action Blocked" + ActionStatus AS "Action Status" + ActionCategory AS "Action Category" + ActionType AS "Message" + | table + "Time Logged" + "Time Logged UTC" + "Action Type" + "Action Blocked" + "Action Status" + "Action Category" + "Message" + | transpose 1 + + + + +
+
+ + + Perpetrator Details + + + `stealthData` + | where _time=$timeValue$ + | rename + Perpetrator AS "Account Name" + change_type AS "Protocol" + Server AS "Host" + ServerAddress AS "IP Address" + src AS "Access URL" + | table + "Account Name" + "Protocol", + "Host", + "IP Address", + "Access URL" + | transpose 1 + + + + +
+
+ + + Affected Object Details + + + `stealthData` + | where _time=$timeValue$ + | rename + ObjectClass AS "Type" + object AS "Object Path" + TargetHost AS "Host" + TargetAddress AS "IP Address" + | table + "Path" + "Type", + "Account Name", + "Object Path", + "Host", + "IP Address" + | transpose 1 + + + + +
+
+ + + Agent Details + + + `stealthData` + | where _time=$timeValue$ + | rename + Server AS "Host" + ServerAddress AS "IP Address" + | table + "Host", + "IP Address" + | transpose 1 + + + + +
+
+
+ + + + + + `stealthData` + | where _time=$timeValue$ + | eval EventType = replace(event_id, "SI Events Log ", "") + | rename + AttributeName AS "Attribute Name" + EventType AS "Event Type" + OldAttributeValue AS "Old Value" + NewAttributeValue AS "New Value" + | table + "Attribute Name" + "Event Type" + "Old Value" + "New Value" + | dedup + "Attribute Name" + "Event Type" + "Old Value" + "New Value" + + + + + +
+
+
+
\ No newline at end of file diff --git a/apps/stealthbits_ad_ldap/default/data/ui/views/page_ldap_monitoring.xml b/apps/stealthbits_ad_ldap/default/data/ui/views/page_ldap_monitoring.xml new file mode 100644 index 00000000..6ebb5bfd --- /dev/null +++ b/apps/stealthbits_ad_ldap/default/data/ui/views/page_ldap_monitoring.xml @@ -0,0 +1,619 @@ +
+ +
+ +
+ + + + + -7d@h + now + + + + + + + `stealthData` + Protocol = "LDAP" + | where not match(PolicyName, ".*%.*") + | stats sum(PolicyName) by PolicyName + | fields - sum(PolicyName) + | dedup PolicyName + + $eventTime.earliest$ + now + + PolicyName + PolicyName + All Policies + * + * + + + + * + + + `stealthData` + Protocol = "LDAP" + | where not match(EventName, ".*%.*") + | stats count by EventName + | table EventName + | dedup EventName + + $eventTime.earliest$ + now + + EventName + EventName + All Actions + + + + * + + + `stealthData` + Protocol = "LDAP" + | where not match(BlockedEvent, ".*%.*") + | stats count by BlockedEvent + | eval newBlockedEvent = case(BlockedEvent="True", "Failed", BlockedEvent="False", "Successful") + | table newBlockedEvent, BlockedEvent + | dedup newBlockedEvent, BlockedEvent + + $eventTime.earliest$ + now + + newBlockedEvent + BlockedEvent + Successful or Failed + * + + + + * + + + `stealthData` + Protocol = "LDAP" + | where not match(BlockedEvent, ".*%.*") + | stats count by BlockedEvent + | eval newBlockedEvent=case(BlockedEvent="True", "Yes", BlockedEvent="False", "No") + | table newBlockedEvent, BlockedEvent + | dedup newBlockedEvent, BlockedEvent + + $eventTime.earliest$ + now + + newBlockedEvent + BlockedEvent + Yes or No + * + + +
+ + + + * + + + `stealthData` + Protocol = "LDAP" + | where not match(DC, ".*%.*") + | stats count by DC + | fields - count + | dedup DC + + $eventTime.earliest$ + now + + src_nt_domain + src_nt_domain + All Domains + * + + + + * + + + `stealthData` + Protocol = "LDAP" + | where not match(Server, ".*%.*") + | eval Server = case(!LIKE(Server, "%\\%"), Server, Server LIKE "%\\%", mvindex(split(Server, "\\"), 1)) + | stats count by Server + | fields - count + | dedup Server + + $eventTime.earliest$ + now + + Server + Server + All Hosts + + + + * + + + `stealthData` + Protocol = "LDAP" + | where not match(Perpetrator, ".*%.*") + | stats sum(Perpetrator) as Perpetrator_count by Perpetrator + | eval Perpetrator=case(!LIKE(Perpetrator, "%\\%"), Perpetrator, Perpetrator LIKE "%\\%", mvindex(split(Perpetrator, "\\"), 1)) + | eval upper_Perpetrator=upper(substr(Perpetrator,1,1)).substr(Perpetrator,2) + | table upper_Perpetrator, Perpetrator + | dedup upper_Perpetrator, Perpetrator + + $eventTime.earliest$ + now + + upper_Perpetrator + Perpetrator + All Users + + + + * + + + `stealthData` + Protocol = "LDAP" + | where not match(AccessURL, ".*%.*") + | eval AccessURL = case(AccessURL LIKE "%LDAPS%", replace(AccessURL, "LDAPS:", ""), AccessURL LIKE "%LDAP%", replace(AccessURL, "LDAP:", "")) + | stats count by AccessURL + | fields - count + | dedup AccessURL + + $eventTime.earliest$ + now + + AccessURL + AccessURL + All Access URLs + * + + + + + + `stealthData` + Protocol = "LDAP" + | where not match(SecureQuery, ".*%.*") + | stats count by SecureQuery + | table SecureQuery + | dedup SecureQuery + + $eventTime.earliest$ + now + + SecureQuery + SecureQuery + Yes or No + * + + + + * + + + `stealthData` + Protocol = "LDAP" + | where not match(SecurityType, ".*%.*") + | stats count by SecurityType + | table SecurityType + | dedup SecurityType + + $eventTime.earliest$ + now + + SecurityType + SecurityType + All Types + * + + + + +
+ + + + + + + + + + + + + `stealthData` + Protocol = "LDAP" + | eval Time=strftime(_time,"%Y-%m-%d %H:%M%P") + | eval ActionResult = case(BlockedEvent="True", "Failed", BlockedEvent="False", "Successful") + | eval BlockedEvent=case(BlockedEvent="True", "Yes", BlockedEvent="False", "No") + | eval Server=case(Server LIKE "%\\%", mvindex(split(Server, "\\"), 1)) + | eval Perpetrator=case(Perpetrator LIKE "%\\%", mvindex(split(Perpetrator, "\\"), 1)) + | eval AccessURL = case(AccessURL LIKE "%LDAPS%", replace(AccessURL, "LDAPS:", ""), AccessURL LIKE "%LDAP%", replace(AccessURL, "LDAP:", "")) + | search + PolicyName = "$detectingPolicy$" + EventName = "$actionPerformed$" + ActionResult = "$actionResult$" + BlockedEvent = "$actionBlocked$" + DC = "$initiatedDomain$" + Server = "$initiatedHost$" + Perpetrator = "$initiatedUser$" + AccessURL = "$accessUrl$" + SecureQuery = "$searchSecure$" + SecurityType = "$searchSecurityType$" + | rename + Time AS "Event Time" + PolicyName AS "Detecting Policy" + EventName AS "Action Performed" + ActionResult AS "Action Result" + BlockedEvent AS "Action Blocked" + DC AS "Initiating (Domain)" + Server AS "Initiating (Host)" + Perpetrator AS "Initiating (User)" + AccessURL AS "Access URL" + SecureQuery AS "Secure Query" + SecurityType AS "Security Type" + QueryFilter AS "Query Filter" + | table + _time + "Event Time" + "Detecting Policy" + "Action Performed" + "Action Result" + "Action Blocked" + "Initiating (Domain)" + "Initiating (Host)" + "Initiating (User)" + "Access URL" + "Secure Query" + "Security Type" + "Query Filter" + | dedup + _time + "Event Time" + "Detecting Policy" + "Action Performed" + "Action Result" + "Action Blocked" + "Initiating (Domain)" + "Initiating (Host)" + "Initiating (User)" + "Access URL" + "Secure Query" + "Security Type" + "Query Filter" + + $eventTime.earliest$ + now + + + + + + + + $click.value$ + + +
+
+
+ + + + Event Details + + + `stealthData` + AND _time="$time_token$" + | eval EventTime=strftime(_time, "%Y-%m-%d %H:%M:%S") + | eval EventTimeUTC=strftime(_time+18000, "%Y-%m-%d %H:%M:%S") + | eval ActionStatus = case(BlockedEvent="True", "Failed", BlockedEvent="False", "Successful") + | rename + EventTime AS "Time Logged", + EventTimeUTC AS "Time Logged UTC", + EventName AS "Action Type", + BlockedEvent AS "Action Blocked", + actionStatus AS "Action Status", + event_id AS "Message" + | table + "Time Logged", + "Time Logged UTC" + "Action Type", + "Action Blocked", + "Action Status", + "Message" + | transpose 1 + + + + +
+
+ + + Perpetrator Details + + + `stealthData` + AND _time="$time_token$" + | rename + Perpetrator AS "Account Name" + PerpetratorSID AS "Account SID" + DistinguishedName AS "Account DN" + Server AS "Host" + ServerAddress AS "IP Address" + AccessURL AS "Access URL" + | table + "Account Name" + "Account SID", + "Account DN" + "Protocol", + "Client Host", + "Client IP Address", + "Access URL" + | transpose 1 + + + + +
+
+ + + Search Details + + + `stealthData` + AND _time="$time_token$" + | rename + QueryFilter AS "Query Filter" + QueryExecutionTimeAvg AS "Query Execute Time" + ObjectsReturned AS "Result Count" + SecurityQuery AS "Secure Query" + SecurityType AS "Security Type" + | table + "Query Filter" + "Query Execute Time" + "Result Count" + "Secure Query" + "Security Type" + | transpose 1 + + + + +
+
+ + + Agent Details + + + `stealthData` + AND _time="$time_token$" + | rename + ClientHost AS "Host" + ClientAddress AS "IP Address" + | table + "Host", + "IP Address" + | transpose 1 + + + + +
+
+
+
\ No newline at end of file diff --git a/apps/stealthbits_ad_ldap/default/data/ui/views/page_overview.xml b/apps/stealthbits_ad_ldap/default/data/ui/views/page_overview.xml new file mode 100644 index 00000000..6185f3b6 --- /dev/null +++ b/apps/stealthbits_ad_ldap/default/data/ui/views/page_overview.xml @@ -0,0 +1,689 @@ +
+ +
+ + + + -7d@h + now + + +
+ + + + + + + + + + +

+ Overview +

+ +
+
+ + + Active Directory Events + + + + `stealthData` + | where like(event_id, "Active Directory%") + | stats count + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + + + + + Group Policy Events + + + + `stealthData` + | where like(event_id, "%GPO%") + | stats count + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + + + + + LDAP Events + + + `stealthData` Protocol = "LDAP" + | stats count + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + + + + + + + + Active Users + + + + `stealthData` + | where !like(Perpetrator, '*\%*') + | stats dc(Perpetrator) as count + + $eventTime.earliest$ + $eventTime.latest$ + + + + + Monitored Domains + + + + `stealthData` + | where not match(Domain, ".*%.*") + | stats dc(Domain) as count + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + Events Over Time + + + `stealthData` +| where like(event_id, "%GPO%") OR like(event_id, "Active Directory%") OR like(Protocol, "%LDAP%") +| eval eventID = replace(event_id, "Active Directory ", "") +| timechart sum(linecount) as "Event Count" by eventID + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + + + + + + +

+ Active Directory Events +

+ +
+ + +

+ Group Policy Events +

+ +
+
+ + + AD Most Active Users + + + + `stealthData` + | where like(event_id, "Active Directory%") + | eval eventID = replace(event_id, "Active Directory ", "") + | chart count BY Perpetrator eventID + | addtotals + | sort -Total, +Perpetrator + | head 5 + | fields - Total + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + + + + mvindex(split($click.value$, "\\"), 0) + mvindex(split($click.value$, "\\"), 1) + + + + + + + + GPO Most Active Users + + + + `stealthData` + | where like(event_id, "%GPO%") + | stats count BY Perpetrator + | rename count as "Event Count" + | sort -"Event Count" + | head 5 + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + mvindex(split($click.value$, "\\"), 0) + mvindex(split($click.value$, "\\"), 1) + + + + + + + + + + AD Events By Type + + + + `stealthData` + | where not match(event_id, ".*%.*") and like(event_id, "%Active Directory%") + | eval eventID = replace(event_id, "Active Directory ", "") + | stats count by eventID + | eval percent=round(percent) + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + + + + + + + + AD Successful/Failed Changes + + + + `stealthData` + | where like(event_id, "Active Directory%") + | stats count BY SuccessfulChange + | replace False WITH "Failed", True WITH "Successful" IN SuccessfulChange + | eval percent=round(percent) + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + case($click.value$ == "Successful", "True", $click.value$ == "Failed", "False") + + + + + + + + AD Allowed/Blocked Changes + + + + `stealthData` + | where like(event_id, "Active Directory%") + | stats count BY BlockedEvent + | replace False WITH "Allowed", True WITH "Blocked" IN BlockedEvent + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + case($click.value$ == "Allowed", "False", $click.value$ != "Allowed", "True") + + + + + + + + GPO Events By Type + + + + `stealthData` + | where not match(event_id, ".*%.*") and like(event_id, "%GPO%") + | eval eventID = replace(event_id, "SI Events Log ", "") + | stats count by eventID + | eval percent=round(percent) + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + + + + + + + + GPO Successful/Failed Changes + + + + `stealthData` + | where like(event_id, "%GPO%") + | stats count BY SuccessfulChange + | replace False WITH "Failed", True WITH "Successful" IN SuccessfulChange + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + case($click.value$ == "Successful", "True", $click.value$ == "Failed", "False") + + + + + + + + GPO Allowed/Blocked Changes + + + + `stealthData` + | where like(event_id, "%GPO%") + | stats count BY BlockedEvent + | replace False WITH "Allowed", True WITH "Blocked" IN BlockedEvent + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + case($click.value$ == "Allowed", "False", $click.value$ != "Allowed", "True") + + + + + + + + + + +
+

+ LDAP Events +

+
+ +
+
+ + + LDAP Most Active Source Hosts + + + + `stealthData` + Protocol = "LDAP" + | stats count BY Server + | rename count as "Event Count" + | sort -"Event Count" + | head 5 + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + mvindex(split($click.value$, "\\"), 0) + mvindex(split($click.value$, "\\"), 1) + + + + + + + + LDAP Most Active Access URLs + + + + `stealthData` + Protocol = "LDAP" + | eval AccessURL = replace(AccessURL, "LDAP:", "") + | stats count BY AccessURL + | sort - count + | head 5 + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + + + + + + + + LDAP Most Active Users + + + + `stealthData` + Protocol = "LDAP" + | stats count BY Perpetrator + | sort - count + | head 5 + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + mvindex(split($click.value$, "\\"), 0) + mvindex(split($click.value$, "\\"), 1) + + + + + + + + + + LDAP Events By Type + + + + `stealthData` + Protocol = "LDAP" + | stats count BY EventName + | eval percent=round(percent) + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + + + + + + + + LDAP Allowed/Blocked Queries + + + + `stealthData` + Protocol = "LDAP" + | stats count BY BlockedEvent + | replace False WITH "Allowed", True WITH "Blocked" IN BlockedEvent + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + case($click.value$ == "Allowed", "No", $click.value$ != "Allowed", "Yes") + + + + + + + + LDAPS vs. LDAP + + + + `stealthData` + Protocol = "LDAP" + | stats count BY SecureQuery + | replace No WITH "LDAP", Yes WITH "LDAPS" IN SecureQuery + | eval percent=round(percent) + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + case($click.value$ == "LDAPS", "Yes", $click.value$ == "LDAP", "No") + + + + + + + + Signed and Sealed vs. LDAP + + + + `stealthData` + Protocol = "LDAP" + | stats count BY SecurityType + | replace None WITH "LDAP", "Add Random Data" WITH "LDAP" IN SecurityType + | eval percent=round(percent) + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + case($click.value$ == "LDAP", "None", $click.value$ != "LDAP", $click.value$) + + + + + + + + Secure vs. Insecure + + + + `stealthData` + Protocol = "LDAP" + | stats count BY SecureQuery + | replace No WITH "Unsecure", Yes WITH "Secure" IN SecureQuery + | eval percent=round(percent) + + $eventTime.earliest$ + $eventTime.latest$ + + + + + + + + case($click.value$ == "Secure", "Yes", $click.value$ == "Unsecure", "No") + + + + + + + +
\ No newline at end of file diff --git a/apps/stealthbits_ad_ldap/default/eventtypes.conf b/apps/stealthbits_ad_ldap/default/eventtypes.conf new file mode 100644 index 00000000..a012ccb3 --- /dev/null +++ b/apps/stealthbits_ad_ldap/default/eventtypes.conf @@ -0,0 +1,11 @@ +[StealthINTERCEPT_Authentication] +priority = 5 +search = `stealthData` event_id="Authentication Auth *" + +[StealthINTERCEPT_Active_Directory] +priority = 5 +search = `stealthData` event_id="Active Directory*" + +[StealthINTERCEPT_Group_Policy] +priority = 5 +search = `stealthData` event_id="*GPO*" diff --git a/apps/stealthbits_ad_ldap/default/macros.conf b/apps/stealthbits_ad_ldap/default/macros.conf new file mode 100644 index 00000000..a501f9a1 --- /dev/null +++ b/apps/stealthbits_ad_ldap/default/macros.conf @@ -0,0 +1,3 @@ +[stealthData] +definition = index=* (sourcetype=STEALTHbits OR sourcetype=StealthINTERCEPT) +iseval = 0 diff --git a/apps/stealthbits_ad_ldap/default/props.conf b/apps/stealthbits_ad_ldap/default/props.conf new file mode 100644 index 00000000..5004eb9c --- /dev/null +++ b/apps/stealthbits_ad_ldap/default/props.conf @@ -0,0 +1,21 @@ +[StealthINTERCEPT] +EVAL-action = case(like(event_id, "%Password _hanged"), "updated", like(event_id, "%Object _odified"), "modified", like(event_id, "%Object _dded"), "created", like(event_id, "%Group Members _dded"), "modified", like(event_id, "%Account _nabled"), "updated", like(event_id, "%Object _eleted"), "deleted", like(event_id, "%Group Members _emoved"), "modified", like(event_id, "%Account _nlocked"), "unlocked", like(event_id, "%Account _isabled"), "updated", like(event_id, "%_ock%"), "lockout") +EVAL-change_type = case(like(event_id, "Active Directory%"), "AD", like(event_id, "%File%"), "filesystem") +EVAL-dvc = coalesce(Server,ServerAddress) +EVAL-dest = coalesce(TargetHost, TargetHostIP, Server, ServerAddress) +EVAL-src = coalesce(ClientHost, ClientAddress) +EVAL-status = case(SuccessfulChange == "True", "success", SuccessfulChange == "False", "failure") +EVAL-vendor_product = "STEALTHbits StealthINTERCEPT" +EXTRACT-event_id = [STEALTHbits Activity Monitor|StealthINTERCEPT] - (?P[^\-]+)\s\- +FIELDALIAS-CIM: Authentication = AttributeName AS object_attrs DistinguishedName AS object Domain AS src_nt_domain ObjectClass AS object_category Perpetrator AS user _time AS file_access_time result AS status event_id AS EventName + +[STEALTHbits] +EVAL-action = case(like(event_id, "%Password _hanged"), "updated", like(event_id, "%Object _odified"), "modified", like(event_id, "%Object _dded"), "created", like(event_id, "%Group Members _dded"), "modified", like(event_id, "%Account _nabled"), "updated", like(event_id, "%Object _eleted"), "deleted", like(event_id, "%Group Members _emoved"), "modified", like(event_id, "%Account _nlocked"), "unlocked", like(event_id, "%Account _isabled"), "updated", like(event_id, "%_ock%"), "lockout") +EVAL-change_type = case(like(event_id, "Active Directory%"), "AD", like(event_id, "%File%"), "filesystem") +EVAL-dvc = coalesce(Server,ServerAddress) +EVAL-dest = coalesce(TargetHost, TargetHostIP, Server, ServerAddress) +EVAL-src = coalesce(ClientHost, ClientAddress) +EVAL-status = case(SuccessfulChange == "True", "success", SuccessfulChange == "False", "failure") +EVAL-vendor_product = "STEALTHbits StealthINTERCEPT" +EXTRACT-event_id = [STEALTHbits Activity Monitor|StealthINTERCEPT] - (?P[^\-]+)\s\- +FIELDALIAS-CIM: Authentication = AttributeName AS object_attrs DistinguishedName AS object Domain AS src_nt_domain ObjectClass AS object_category Perpetrator AS user _time AS file_access_time result AS status event_id AS EventName diff --git a/apps/stealthbits_ad_ldap/default/tags.conf b/apps/stealthbits_ad_ldap/default/tags.conf new file mode 100644 index 00000000..f822b8d0 --- /dev/null +++ b/apps/stealthbits_ad_ldap/default/tags.conf @@ -0,0 +1,9 @@ +[eventtype=StealthINTERCEPT%20Active%20Directory] +change = enabled + +[eventtype=StealthINTERCEPT%20Authentication] +change = enabled +authentication = enabled + +[eventtype=StealthINTERCEPT%20Group%20Policy] +change = enabled diff --git a/apps/stealthbits_ad_ldap/metadata/default.meta b/apps/stealthbits_ad_ldap/metadata/default.meta new file mode 100644 index 00000000..6b6b2983 --- /dev/null +++ b/apps/stealthbits_ad_ldap/metadata/default.meta @@ -0,0 +1,8 @@ + +[] +access = read : [ * ], write : [ admin ] +export = system + +[views] +access = read : [ * ], write : [ admin ] +export = none diff --git a/apps/stealthbits_ad_ldap/static/appIcon.png b/apps/stealthbits_ad_ldap/static/appIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..f813d9b9a3ba3a8c4d8b06b9ff137c7731005346 GIT binary patch literal 1339 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFl%OpM3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)D7Sfo`&afuVxArJkWl zYI2f^QJPV*j)IYak+Hskp}wK9uAz~Yk*Sr5i2@WT0c|WwNwW%aaf8|i1^l#~=$ z>Fbx5m+O@q>*W`v>l<2HTIw4Z=^Gj80#)c1SLT%@R_NvxE5l51Ni9w;$}A|!%+FH* znV6WAUs__T1avLL8@UB=WAlokK?Mvn{ffi_eM3D1khfq8eSPsO&CP|YE-nd5MYtEM z!Nnn!1*!T$sm1xFMajU(OH&3}Rbb^@l$uzQUlfv`p92fYfQO017kNcm|mCsATTyALtl;P~0NLHB1PYfIv)m>IHJ(=|43OnCOduskF!Z)WWGVs;cbR-FFM$0k6ziK{8pBU4?>%*?JmHQ`K2v&7 zLxP3*0rQ?F_Ya@q+fqJNZeU0|AR)oTSP|Yf>jB%GCgy_FDUNkUY=09tue8pLN)SI| z_;~|Q=z)zM%gk0V>aScFS)gCFJU5^tdj*fwqVKm@`c^8+&*}KGB`GT-bjfOVgQch6 zX7IU1o_d}zDR7Bw0q?vkJ5`>CImjpH@vbR6weM8KL-897mlf`tng^)vJKs^r*|qS_ zx^oxg1YZd22w&Cw{(w(#`C>7Vo$YQ1bOkfID^HxXy`++)+xC3tLVb&M-yE;Zi%gGW zDt|EHhi_!LV_CL@NT*6^^X!*R67v`E>~v|Ew##K_mGZIXISU&%*ra*>Ke7DXwp zs*g+}XHGIr;f-{@HUUg&N-yI1)%MXgX^(^L@hy&z`|XYe>aOwZSDv5R7oxu|`p(Vu xDhutqid>g+IB%-0?Ymr2_%!9M=lkdeMus2%R}1NAEcXHxXP&NpF6*2UngHJA*)IS9 literal 0 HcmV?d00001 diff --git a/apps/stealthbits_ad_ldap/static/appIconAlt.png b/apps/stealthbits_ad_ldap/static/appIconAlt.png new file mode 100644 index 0000000000000000000000000000000000000000..c7a352f1f9ac05f422f2431f773720ce2c6fed92 GIT binary patch literal 1456 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbBBuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFl%OpM3hAM`dB6B=jtVb)aX^@765fKFxc2v6eK2Rr0UTq__OB&@Hb09I0xZL0)vRD^GUf^&XRs)D7Sfo`&afuVxArJkWl zYI2f^QJPV*j)IYak+Hskp}wK9uAz~Yk*Sr5i2@WT0c|WwNwW%aaf8|i1^l#~=$ z>Fbx5m+O@q>*W`v>l<2HTIw4Z=^Gj80#)c1SLT%@R_NvxE5l51Ni9w;$}A|!%+FH* znV6WAUs__T1avLL8@UB=WAlokK?Mvn{ffi_eM3D1khfq8eSPsO&CP|YE-nd5MYtEM z!Nnn!1*!T$sm1xFMajU(OH&3}Rbb^@l$uzQUlfv`p92fYfQO017kNcm|mCs+N7Y{Zk7d8 zG+Kql7iy@RA8qY!=6>q&NQK>ViN@P`7Qc6FDBEECPoH1+>>2CL*@ZKf*KIZ3{Qh@! z`n=~e%a1M1l=|Iq{IGJ_&8ugZd@1=BK2hd)y=nl%CWiQf+!YMw5B_a$`SIlJ0$vja z{u6AH4`#Nka};>fs9P|NL(%*Nv+{yN59X*SG}l-iXJ2-ZZwB-4F#X*cKOW3ZIOuXr z<5GkCo2JMKLhA#Rd9MkjuluBJ!x#2K>zGOi-!+Gm{9=Lp5iEMUomM7rPElL1srulA z*oBT4rW`0U<~;R-Uw4gxsYsP`u*hAl$4hOp3KLl8G+Rf_X&18h{IK8Y0)Hdt`7veY+eSF6~aW zJLsS#!N&Z+#H%eZ`N`j9%xj`E)Z^+-+j(Dn9lD?UX`|Lbht(yiXC86(Tug46DdIO* zV`aAn|Cyq+dr5V%O}PgxpDHbsd9^NWa?Fht%aRX%Oqw`hMREHJ#Vpf#EXR$LDyO-+ zcePIXH&1<0Rp=fS?83{1ORHl9KZko literal 0 HcmV?d00001 diff --git a/apps/stealthbits_ad_ldap/static/appIconAlt_2x.png b/apps/stealthbits_ad_ldap/static/appIconAlt_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..10cf1c4c8b5ad3fad9cc24b6a8e8b3d33a4f12ab GIT binary patch literal 1741 zcmaJ?c~BEq7!S%dC<>J-A~I_f1xm6>2uA|JuGs)-8yW&aJh0?gB$8y;%|hZ?3Cba; zSW&5BsdB}$S`;seiH?GnQ=G9%?QrO*fS{$ecu>1R!2VIX^XN8yj#I2pRdAHl#o<7hflCr-5JCnRG-|DmYv55wc)8@>ss^dRhzXI( zqrMMHDiQ;H6h{CKok3GD7)&6TLuaxPg`CYwW-0su7K0T4GMFGUfW~BTS%F+O8yJ14 zq(@wt%$2|qqyESfkD5Xd7#9TfdOckqKu7V_Ad|!4fD9JMV$nzonr@wzkQr!N-TW~I z7||(k6-KB~EnsDo$NLL!3U5GGRqb3y_`Ac24r5X^@e z0TDrCSQu5LX%H=|P#f)4&ssC9;BjggZO) zFIj)to{Fa>nExVPgz-U#pVTEDI&S&+^yw{=n+%v!pTnkWRFkbI#lfO2Uek+;qVO}9T#V@%*IlEwdRKBM-TK`(#rqex!}qRw zwiJR;xA{BArcMtFe%H9&Qd^K856MH_`y?$aM(EWUy4_W+djVD8iVfzTZ41tpCN^C6 zxV!=j?s6D9@aHnHQ5`}%lW0@@HgSyst6MI<$ozp;Znu)L81XF~EV+_UWFzAi9Su9b z=U4Kc9!kAd4YT?q#dF;&q?W3rMHg&XC(qRz@6Et&_#dkGL>=4@V{bc?PF!SgRuq?n zn^p<)i~sOA?YOd;T6uhU=fRB?g2P^TlWtg@(>@SOhi-Gej5ihfmjoHE+*KPRLZwcp zeD737r@GCVu|WTXTAiVDdQ@ZAYmWRGSDKIB`6y1k?AyF#A^gemM)=;svab%7%`?S! zZavUoDxaNgo|QL@1j=)=fcDnjnHTzilHF)f|FV5CrSt03EyCKhL;XIMvvXVRw?Qq5 z*=<>M``#oB2@AW!`#eD<<(ex0_{WI ZW{Tu_R%quN8E*Z-2nEsbsU=Cqe*o@FnZN)5 literal 0 HcmV?d00001 diff --git a/apps/stealthbits_ad_ldap/static/appIcon_2x.png b/apps/stealthbits_ad_ldap/static/appIcon_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..19e85ae6cc0bd3b4e54c2af0b7bfcd861dc0e01c GIT binary patch literal 1697 zcmaJ?eNK@s%zPtc|r%(25U9NYP_p1)h^8%1O~e#7Ik{I|S^H=$_}^_kEx9{C>~p zd+vwHNh?B_uQF*gT8K)Crc$fY_Xhe?-#33fzJgljlL`%)M&ytMdIwIE8Hj8gP+9dx zJQdd)+-twZ<7u=xF{X44sZp;&Fv7~y`)qhFtDQpAXz|Njc0FdnNgx|Hnru?`$mv!# zU@}PAYhu-WwOx+qnv{hOJgqP(9V@h85(9hLQXt-iPy|+-)B`SSp3RB4r0hvvgxdSm zARCx8AuUq&)1Wl!WI#?ha6rQ2b1^<20^%e*NQh(ELO2J;H~`Ft1t1>+ApsYH5jYkR z3W2GIO?h+}a*$LsampWclCpD2(vE;&K|ukpK)@p$Mi7!nBp@FKVVFxx{LNOvRtY`=7+lbhjM`Q*kGe@4%?$H7Rez|oFFj{l|YaJm55`-GKE4S zh?ApyL853HixODA6}OSoSi>`{a8|5uBCK}GGm1M*>u^J&gRlaVStF*|V}WMno5C7q zj|H9;3sS*=zTW<;*V8I$fPCAT>7@=c^N-u8p?6TzZFwt_x@vPmRj4f8b>;4ERc@Fp z?1Mi2i}U>#^H8t%^-vy=P(4VmZjSV>tXS9sF%uV+W%gXCbn&|YR_5~WHpj`sq8W~4 zG;D24XVKh2k4(|UDBg8qA~@O$^sW19_&3i)d)GWTE$c}>_o%rL2|UwKGCERwkk0&~ zB(tNd^7-L*=B2>xMUtw(h@F3YIS0QNUeOlJr(Z2Tw%^Y$Xp8K8o2}smVP)%$4a&l~ zEYAYnWuvT@-B?_slkPm6`M2>NBh$ZWRsC2(GA*M$sA2IwEx^4^7YBS@yMyPc(1iSX z=D}c0e~oLYAopZdsGZrPcK1FCy69o?KiSCJ9$;)6-E!e#lk7ED<-sa?Gd%;|)e%n% zXul(5d|z}&_ukpDcvbNDfU=}gwRe1ZDf&`#;PA&`6fqdv`MRf@|21zq6S7f z-(H0vtFLZR)Nz&L7S{U*&ZQa}S~2ZVNz%mVggYmp48kh!cdUtMs%+b&3|Z3QIjnG} z!~|an0ldvRjz`3=BOk{!L=PSdPC2Ei@7-3O)q&~2W^h5!#Au6U@!t8XYd7s4JK`PL zQ(MXxA5E*R$lJ?;*NfKHFhYw?Gk+hbi&Y*K_SIN-GvdO}Jz^m3&A0@-zH*WaR9B57z@6!q_rnBzyzRr+=k2HrOyVsd_JkWK^mPTF6i*Mr8q{uHN zoL|`;7rJa=^gE4$40!}Y>TJ$)nI5@SiOxoknR9$-YpCD0aK@0;Z{Y5&Hzaqpt>+6^ zJVIOcpz7y_$H+CmmQoY*-16jkeksqS*t5htBQjYSIxU@50JC~Zz&oGzx%xPpnT%4f zDE_k>ArDz;rH_Tj2eZuE-UWZqFWLy*>^9znMA0ie`?cTHxta!5Pj346ISx33AI=qo g_ENMlXTj(EX-(YnfWPh!M)-ajDn$}{Bthr-2Tf#q2mk;8 literal 0 HcmV?d00001 diff --git a/apps/stealthbits_ad_ldap/static/appLogo_2x_red.png b/apps/stealthbits_ad_ldap/static/appLogo_2x_red.png new file mode 100644 index 0000000000000000000000000000000000000000..198a9932322194ba43cd2de0be806ad6ed2171e7 GIT binary patch literal 12606 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 KfNEvU!~YK!y#@~e literal 0 HcmV?d00001 diff --git a/apps/stealthbits_ad_ldap/static/appLogo_red.png b/apps/stealthbits_ad_ldap/static/appLogo_red.png new file mode 100644 index 0000000000000000000000000000000000000000..e579f06e21f5a65a076ccfacde2af9fa8e14f648 GIT binary patch literal 5471 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

_Wj{uX|$i&%A=3 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

xO8h$LVwhNO#i(2Bbk} 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