365Inspect requires the administrative PowerShell modules for Microsoft Online, Azure AD (We recommend installing the AzureADPreview module), Exchange administration, Microsoft Graph, Microsoft Intune, Microsoft Teams, and Sharepoint administration.
The 365Inspect.ps1 PowerShell script will validate the installed modules.
If you do not have these modules installed, you will be prompted to install them, and with your approval, the script will attempt installation. Otherwise, you should be able to install them with the following commands in an administrative PowerShell prompt, or by following the instructions at the references below:
Install-Module -Name MSOnline
Install-Module -Name AzureADPreview
Install-Module -Name ExchangeOnlineManagement
Install-Module -Name Microsoft.Online.SharePoint.PowerShell
Install-Module -Name Microsoft.Graph
Install-Module -Name MicrosoftTeams
Install-Module -Name Microsoft.Graph.Intune
Once the above are installed, download the 365Inspect source code folder from Github using your browser or by using git clone.
As you will run 365Inspect with administrative privileges, you should place it in a logical location and make sure the contents of the folder are readable and writable only by the administrative user. This is especially important if you intend to install 365Inspect in a location where it will be executed frequently or used as part of an automated process.
To run 365Inspect, open a PowerShell console and navigate to the folder you downloaded 365Inspect into:
cd 365Inspect
You will interact with 365Inspect by executing the main script file, 365Inspect.ps1, from within the PowerShell command prompt.
All 365Inspect requires to inspect your O365 tenant is access via an O365 account with proper permissions, so most of the command line parameters relate to the organization being assessed and the method of authentication.
Execution of 365Inspect looks like this:
.\365Inspect.ps1 -OrgName -OutPath -Auth
For example, to log in by entering your credentials in a browser with MFA support:
.\365Inspect.ps1 -OrgName mycompany -OutPath ..\365_report -Auth MFA
365Inspect can be run with only specified Inspector modules, or conversely, by excluding specified modules.
For example, to log in by entering your credentials in a browser with MFA support:
.\365Inspect.ps1 -OrgName mycompany -OutPath ..\365_report -Auth MFA -SelectedInspectors inspector1, inspector2
or
.\365Inspect.ps1 -OrgName mycompany -OutPath ..\365_report -Auth MFA -ExcludedInspectors inspector1, inspector2, inspector3
To break down the parameters further:
When you execute 365Inspect with -Auth MFA, it may produce several graphical login prompts that you must sequentially log into. This is normal behavior as Exchange, SharePoint etc. have separate administration modules and each requires a different login session. If you simply log in the requested number of times, 365Inspect should begin to execute. This is the opposite of fun and we’re seeking a workaround, but needless to say we feel the results are worth the minute spent looking at MFA codes.
As 365Inspect executes, it will steadily print status updates indicating which inspection task is running.
365Inspect may take some time to execute. This time scales with the size and complexity of the environment under test. For example, some inspection tasks involve scanning the account configuration of all users. This may occur near-instantly for an organization with 50 users, or could take entire minutes (!) for an organization with 10000.
365Inspect creates the directory specified in the out_path parameter. This directory is the result of the entire 365Inspect inspection. It contains four items of note:
365Inspect can’t run properly unless the O365 account you authenticate with has appropriate privileges. 365Inspect requires, at minimum, the following:
We realize that these are extremely permissive roles, unfortunately due to the use of Microsoft Graph, we are restricted from using lesser prileges by Microsoft. Application and Cloud Application Administrator roles (used to grant delegated and application permissions) are restricted from granting permissions for Microsoft Graph or Azure AD PowerShell modules. https://docs.microsoft.com/en-us/azure/active-directory/roles/permissions-reference#application-administrator
365Inspect is designed to be easy to expand, with the hope that it enables individuals and organizations to either utilize their own 365Inspect modules internally, or publish those modules for the O365 community.
All of 365Inspect‘s inspector modules are stored in the .\inspectors folder.
It is simple to create an inspector module. Inspectors have two files:
The PowerShell and JSON file names must be identical for 365Inspect to recognize that the two belong together. There are numerous examples in 365Inspect‘s built-in suite of modules, but we’ll put an example here too.
Example .ps1 file, BypassingSafeAttachments.ps1:
Define a function that we will later invoke.
365Inspect’s built-in modules all follow this pattern.
function Inspect-BypassingSafeAttachments {
Query some element of the O365 environment to inspect. Note that we did not have to authenticate to Exchange
to fetch these transport rules within this module; assume main 365Inspect harness has logged us in already.
$safe_attachment_bypass_rules = (Get-TransportRule | Where { $_.SetHeaderName -eq “X-MS-Exchange-Organization-SkipSafeAttachmentProcessing” }).Identity
If some of the parsed O365 objects were found to have the security flaw this module is inspecting for,
return a list of strings representing those objects. This is what will end up as the “Affected Objects”
field in the report.
If ($safe_attachment_bypass_rules.Count -ne 0) {
return $safe_attachment_bypass_rules
}
If none of the parsed O365 objects were found to have the security flaw this module is inspecting for,
returning $null indicates to 365Inspect that there were no findings for this module.
return $null
}
Return the results of invoking the inspector function.
return Inspect-BypassingSafeAttachments
Example .json file, BypassingSafeAttachments.json:
{
“FindingName”: “Do Not Bypass the Safe Attachments Filter”,
“Description”: “In Exchange, it is possible to create mail transport rules that bypass the Safe Attachments detection capability. The rules listed above bypass the Safe Attachments capability. Consider revie1wing these rules, as bypassing the Safe Attachments capability even for a subset of senders could be considered insecure depending on the context or may be an indicator of compromise.”,
“Remediation”: “Navigate to the Mail Flow -> Rules screen in the Exchange Admin Center. Look for the offending rules and begin the process of assessing who created them and whether they are necessary to the continued function of your organization. If they are not, remove the rules.”,
“AffectedObjects”: “”,
“References”: [
{
“Url”: “https://docs.microsoft.com/en-us/exchange/security-and-compliance/mail-flow-rules/manage-mail-flow-rules”,
“Text”: “Manage Mail Flow Rules in Exchange Online”
},
{
“Url”: “https://www.undocumented-features.com/2018/05/10/atp-safe-attachments-safe-links-and-anti-phishing-policies-or-all-the-policies-you-can-shake-a-stick-at/#Bypass_Safe_Attachments_Processing”,
“Text”: “Undocumented Features: Safe Attachments, Safe Links, and Anti-Phishing Policies”
}
]
}
Once you drop these two files in the .\inspectors folder, they are considered part of 365Inspect‘s module inventory and will run the next time you execute 365Inspect.
You have just created the BypassingSafeAttachments Inspector module. That’s all!
365Inspect will throw a pretty loud and ugly error if something in your module doesn’t work or doesn’t follow 365Inspect conventions, so monitor the command line output.
Kali Linux 2024.4, the final release of 2024, brings a wide range of updates and…
This Go program applies a lifetime patch to PowerShell to disable ETW (Event Tracing for…
GPOHunter is a comprehensive tool designed to analyze and identify security misconfigurations in Active Directory…
Across small-to-medium enterprises (SMEs) and managed service providers (MSPs), the top priority for cybersecurity leaders…
The free and open-source security platform SecHub, provides a central API to test software with…
Don't worry if there are any bugs in the tool, we will try to fix…