Windows/TestHarnesses/T1059.001_PowerShell/OutPowerShellCommandLineParameter.Tests.ps1
Set-StrictMode -Version Latest $TestScriptRoot = Split-Path $MyInvocation.MyCommand.Path -Parent $ModuleRoot = Resolve-Path "$TestScriptRoot\..\..\..\" $ModuleManifest = "$ModuleRoot\AtomicTestHarnesses.psd1" Remove-Module [A]tomicTestHarnesses Import-Module $ModuleManifest -Force -ErrorAction Stop Describe 'Out-ATHPowerShellCommandLineParameter' { BeforeAll { $Help = Get-Help -Name Out-ATHPowerShellCommandLineParameter -Full $ExpectedTechniqueID = $null if ($Help.Synopsis.Split("`r`n")[-1] -match '^(?-i:Technique ID: )(?<TechniqueID>\S+) (?<TechniqueDescription>\(.+\))$') { $ExpectedTechniqueID = $Matches['TechniqueID'] } $FixedTestGuid = 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa' } BeforeEach { if ($CommandLineSwitchType) { switch($CommandLineSwitchType) { 'Hyphen' { $SwitchChar = [Char] '-' } 'EnDash' { $SwitchChar = [Char] 0x2013 } 'EmDash' { $SwitchChar = [Char] 0x2014 } 'HorizontalBar' { $SwitchChar = [Char] 0x2015 } 'ForwardSlash' { $SwitchChar = [Char] '/' } } } } Context 'Validating error conditions' -Tag 'Unit', 'T1059.001' { It 'should indicate that the PowerShell runner process failed to start' -Tag 'Unit', 'T1059.001' { Mock Invoke-CimMethod { return @{ ReturnValue = 1 } } { Out-ATHPowerShellCommandLineParameter -Execute -ErrorAction Stop } | Should -Throw } } Context 'Expected artifacts and behaviors when exercising the attack technique' -Tag 'Technique', 'T1059.001' { It 'should execute -Command parameter variations (CommandLineSwitchType: <CommandLineSwitchType>, CommandParamVariation: <CommandParamVariation>)' -Tag 'Technique', 'T1059.001' { $Result = Out-ATHPowerShellCommandLineParameter -CommandLineSwitchType $CommandLineSwitchType -CommandParamVariation $CommandParamVariation -Execute -TestGuid $FixedTestGuid $Result | Should -Not -BeNullOrEmpty $Result.TechniqueID | Should -BeExactly $ExpectedTechniqueID $Result.TestSuccess | Should -BeTrue $Result.TestGuid | Should -BeExactly $FixedTestGuid $Result.ProcessId | Should -Not -BeNullOrEmpty $Result.CommandLine | Should -MatchExactly " $($SwitchChar)$($CommandParamVariation) .*$($FixedTestGuid)`$" $Result } -TestCases @( @{ CommandLineSwitchType = 'Hyphen'; CommandParamVariation = 'C' }, @{ CommandLineSwitchType = 'Hyphen'; CommandParamVariation = 'Command' }, @{ CommandLineSwitchType = 'EmDash'; CommandParamVariation = 'C' }, @{ CommandLineSwitchType = 'EmDash'; CommandParamVariation = 'Command' }, @{ CommandLineSwitchType = 'EnDash'; CommandParamVariation = 'C' }, @{ CommandLineSwitchType = 'EnDash'; CommandParamVariation = 'Command' }, @{ CommandLineSwitchType = 'HorizontalBar'; CommandParamVariation = 'C' }, @{ CommandLineSwitchType = 'HorizontalBar'; CommandParamVariation = 'Command' }, @{ CommandLineSwitchType = 'ForwardSlash'; CommandParamVariation = 'C' }, @{ CommandLineSwitchType = 'ForwardSlash'; CommandParamVariation = 'Command' } ) It 'should execute -Command and -EncodedArguments parameter variations (CommandLineSwitchType: <CommandLineSwitchType>, CommandParamVariation: <CommandParamVariation>, EncodedArgumentsParamVariation: <EncodedArgumentsParamVariation>)' -Tag 'Technique', 'T1059.001' { $Result = Out-ATHPowerShellCommandLineParameter -CommandLineSwitchType $CommandLineSwitchType -CommandParamVariation $CommandParamVariation -UseEncodedArguments -EncodedArgumentsParamVariation $EncodedArgumentsParamVariation -Execute -TestGuid $FixedTestGuid $Result | Should -Not -BeNullOrEmpty $Result.TechniqueID | Should -BeExactly $ExpectedTechniqueID $Result.TestSuccess | Should -BeTrue $Result.TestGuid | Should -BeExactly $FixedTestGuid $Result.ProcessId | Should -Not -BeNullOrEmpty $Result.CommandLine | Should -MatchExactly " $($SwitchChar)$($EncodedArgumentsParamVariation) .* $($SwitchChar)$($CommandParamVariation) " $Result } -TestCases @( @{ CommandLineSwitchType = 'Hyphen'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'Hyphen'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'Hyphen'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'Hyphen'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'Hyphen'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'Hyphen'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'EmDash'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'EmDash'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'EmDash'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'EmDash'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'EmDash'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'EmDash'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'EnDash'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'EnDash'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'EnDash'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'EnDash'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'EnDash'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'EnDash'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'HorizontalBar'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'HorizontalBar'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'HorizontalBar'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'HorizontalBar'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'HorizontalBar'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'HorizontalBar'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'ForwardSlash'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'ForwardSlash'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'ForwardSlash'; CommandParamVariation = 'C'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'ForwardSlash'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'ForwardSlash'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'ForwardSlash'; CommandParamVariation = 'Command'; EncodedArgumentsParamVariation = 'EncodedArguments' } ) It 'should execute -EncodedCommand parameter variations (CommandLineSwitchType: <CommandLineSwitchType>, EncodedCommandParamVariation: <EncodedCommandParamVariation>)' -Tag 'Technique', 'T1059.001' { $Result = Out-ATHPowerShellCommandLineParameter -CommandLineSwitchType $CommandLineSwitchType -EncodedCommandParamVariation $EncodedCommandParamVariation -Execute -TestGuid $FixedTestGuid $Result | Should -Not -BeNullOrEmpty $Result.TechniqueID | Should -BeExactly $ExpectedTechniqueID $Result.TestSuccess | Should -BeTrue $Result.TestGuid | Should -BeExactly $FixedTestGuid $Result.ProcessId | Should -Not -BeNullOrEmpty $Result.CommandLine | Should -MatchExactly " $($SwitchChar)$($EncodedCommandParamVariation) " $Result } -TestCases @( @{ CommandLineSwitchType = 'Hyphen'; EncodedCommandParamVariation = 'E' }, @{ CommandLineSwitchType = 'Hyphen'; EncodedCommandParamVariation = 'EC' }, @{ CommandLineSwitchType = 'Hyphen'; EncodedCommandParamVariation = 'EncodedCommand' }, @{ CommandLineSwitchType = 'EmDash'; EncodedCommandParamVariation = 'E' }, @{ CommandLineSwitchType = 'EmDash'; EncodedCommandParamVariation = 'EC' }, @{ CommandLineSwitchType = 'EmDash'; EncodedCommandParamVariation = 'EncodedCommand' }, @{ CommandLineSwitchType = 'EnDash'; EncodedCommandParamVariation = 'E' }, @{ CommandLineSwitchType = 'EnDash'; EncodedCommandParamVariation = 'EC' }, @{ CommandLineSwitchType = 'EnDash'; EncodedCommandParamVariation = 'EncodedCommand' }, @{ CommandLineSwitchType = 'HorizontalBar'; EncodedCommandParamVariation = 'E' }, @{ CommandLineSwitchType = 'HorizontalBar'; EncodedCommandParamVariation = 'EC' }, @{ CommandLineSwitchType = 'HorizontalBar'; EncodedCommandParamVariation = 'EncodedCommand' }, @{ CommandLineSwitchType = 'ForwardSlash'; EncodedCommandParamVariation = 'E' }, @{ CommandLineSwitchType = 'ForwardSlash'; EncodedCommandParamVariation = 'EC' }, @{ CommandLineSwitchType = 'ForwardSlash'; EncodedCommandParamVariation = 'EncodedCommand' } ) It 'should execute -EncodedCommand and -EncodedArguments parameter variations' -Tag 'Technique', 'T1059.001' { $Result = Out-ATHPowerShellCommandLineParameter -CommandLineSwitchType $CommandLineSwitchType -EncodedCommandParamVariation $EncodedCommandParamVariation -UseEncodedArguments -EncodedArgumentsParamVariation $EncodedArgumentsParamVariation -Execute -TestGuid $FixedTestGuid $Result | Should -Not -BeNullOrEmpty $Result.TechniqueID | Should -BeExactly $ExpectedTechniqueID $Result.TestSuccess | Should -BeTrue $Result.TestGuid | Should -BeExactly $FixedTestGuid $Result.ProcessId | Should -Not -BeNullOrEmpty $Result.CommandLine | Should -MatchExactly " $($SwitchChar)$($EncodedArgumentsParamVariation) .* $($SwitchChar)$($EncodedCommandParamVariation) " $Result } -TestCases @( @{ CommandLineSwitchType = 'Hyphen'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'Hyphen'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'Hyphen'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'Hyphen'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'Hyphen'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'Hyphen'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'Hyphen'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'Hyphen'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'Hyphen'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'EmDash'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'EmDash'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'EmDash'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'EmDash'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'EmDash'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'EmDash'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'EmDash'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'EmDash'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'EmDash'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'EnDash'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'EnDash'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'EnDash'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'EnDash'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'EnDash'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'EnDash'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'EnDash'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'EnDash'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'EnDash'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'HorizontalBar'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'HorizontalBar'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'HorizontalBar'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'HorizontalBar'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'HorizontalBar'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'HorizontalBar'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'HorizontalBar'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'HorizontalBar'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'HorizontalBar'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'ForwardSlash'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'ForwardSlash'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'ForwardSlash'; EncodedCommandParamVariation = 'E'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'ForwardSlash'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'ForwardSlash'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'ForwardSlash'; EncodedCommandParamVariation = 'EC'; EncodedArgumentsParamVariation = 'EncodedArguments' }, @{ CommandLineSwitchType = 'ForwardSlash'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EA' }, @{ CommandLineSwitchType = 'ForwardSlash'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EncodedA' }, @{ CommandLineSwitchType = 'ForwardSlash'; EncodedCommandParamVariation = 'EncodedCommand'; EncodedArgumentsParamVariation = 'EncodedArguments' } ) } } |