attack_technique: T1047
display_name: Windows Management Instrumentation
atomic_tests:
- name: WMI Reconnaissance Users
  auto_generated_guid: c107778c-dcf5-47c5-af2e-1d058a3df3ea
  description: |
    An adversary might use WMI to list all local User Accounts. 
    When the test completes , there should be local user accounts information displayed on the command line.
  supported_platforms:
  - windows
  executor:
    command: |
      wmic useraccount get /ALL /format:csv
    name: command_prompt
- name: WMI Reconnaissance Processes
  auto_generated_guid: 5750aa16-0e59-4410-8b9a-8a47ca2788e2
  description: |
    An adversary might use WMI to list Processes running on the compromised host.
    When the test completes , there should be running processes listed on the command line.
  supported_platforms:
  - windows
  executor:
    command: |
      wmic process get caption,executablepath,commandline /format:csv
    name: command_prompt
- name: WMI Reconnaissance Software
  auto_generated_guid: 718aebaa-d0e0-471a-8241-c5afa69c7414
  description: |
    An adversary might use WMI to list installed Software hotfix and patches.
    When the test completes, there should be a list of installed patches and when they were installed.
  supported_platforms:
  - windows
  executor:
    command: |
      wmic qfe get description,installedOn /format:csv
    name: command_prompt
- name: WMI Reconnaissance List Remote Services
  auto_generated_guid: 0fd48ef7-d890-4e93-a533-f7dedd5191d3
  description: |
    An adversary might use WMI to check if a certain Remote Service is running on a remote device. 
    When the test completes, a service information will be displayed on the screen if it exists.
    A common feedback message is that "No instance(s) Available" if the service queried is not running.
    A common error message is "Node - (provided IP or default)  ERROR Description =The RPC server is unavailable" 
    if the provided remote host is unreacheable
  supported_platforms:
  - windows
  input_arguments:
    node:
      description: Ip Address
      type: String
      default: 127.0.0.1
    service_search_string:
      description: Name Of Service
      type: String
      default: Spooler
  executor:
    command: |
      wmic /node:"#{node}" service where (caption like "%#{service_search_string}%")
    name: command_prompt
- name: WMI Execute Local Process
  auto_generated_guid: b3bdfc91-b33e-4c6d-a5c8-d64bee0276b3
  description: |
    This test uses wmic.exe to execute a process on the local host.
    When the test completes , a new process will be started locally .A notepad application will be started when input is left on default.
  supported_platforms:
  - windows
  input_arguments:
    process_to_execute:
      description: Name or path of process to execute.
      type: String
      default: notepad.exe
  executor:
    command: |
      wmic process call create #{process_to_execute}
    cleanup_command: |
      wmic process where name='#{process_to_execute}' delete >nul 2>&1
    name: command_prompt
- name: WMI Execute Remote Process
  auto_generated_guid: 9c8ef159-c666-472f-9874-90c8d60d136b
  description: |
    This test uses wmic.exe to execute a process on a remote host. Specify a valid value for remote IP using the node parameter.
    To clean up, provide the same node input as the one provided to run the test
    A common error message is "Node - (provided IP or default)  ERROR Description =The RPC server is unavailable" if the default or provided IP is unreachable
  supported_platforms:
  - windows
  input_arguments:
    node:
      description: Ip Address
      type: String
      default: 127.0.0.1
    user_name:
      description: Username
      type: String
      default: DOMAIN\Administrator
    password:
      description: Password
      type: String
      default: P@ssw0rd1
    process_to_execute:
      description: Name or path of process to execute.
      type: String
      default: notepad.exe
  executor:
    command: |
      wmic /user:#{user_name} /password:#{password} /node:"#{node}" process call create #{process_to_execute}
    cleanup_command: |
      wmic /user:#{user_name} /password:#{password} /node:"#{node}" process where name='#{process_to_execute}' delete >nul 2>&1
    name: command_prompt
- name: Create a Process using WMI Query and an Encoded Command
  auto_generated_guid: 7db7a7f9-9531-4840-9b30-46220135441c
  description: |
    Solarigate persistence is achieved via backdoors deployed via various techniques including using PowerShell with an EncodedCommand
     Powershell -nop -exec bypass -EncodedCommand <encoded command>
    Where the –EncodedCommand, once decoded, would resemble:
      Invoke-WMIMethod win32_process -name create -argumentlist ‘rundll32 c:\windows\idmu\common\ypprop.dll _XInitImageFuncPtrs’ -ComputerName WORKSTATION
    The EncodedCommand in this atomic is the following: Invoke-WmiMethod -Path win32_process -Name create -ArgumentList notepad.exe
    You should expect to see notepad.exe running after execution of this test.
    [Solarigate Analysis from Microsoft](https://www.microsoft.com/security/blog/2020/12/18/analyzing-solorigate-the-compromised-dll-file-that-started-a-sophisticated-cyberattack-and-how-microsoft-defender-helps-protect/)
  supported_platforms:
  - windows
  executor:
    command: |
      powershell -exec bypass -e SQBuAHYAbwBrAGUALQBXAG0AaQBNAGUAdABoAG8AZAAgAC0AUABhAHQAaAAgAHcAaQBuADMAMgBfAHAAcgBvAGMAZQBzAHMAIAAtAE4AYQBtAGUAIABjAHIAZQBhAHQAZQAgAC0AQQByAGcAdQBtAGUAbgB0AEwAaQBzAHQAIABuAG8AdABlAHAAYQBkAC4AZQB4AGUA
    name: command_prompt
- name: Create a Process using obfuscated Win32_Process
  auto_generated_guid: 10447c83-fc38-462a-a936-5102363b1c43
  description: |
    This test tries to mask process creation by creating a new class that inherits from Win32_Process. Indirect call of suspicious method such as Win32_Process::Create can break detection logic.
    [Cybereason blog post No Win32_ProcessNeeded](https://www.cybereason.com/blog/wmi-lateral-movement-win32)
  supported_platforms:
  - windows
  input_arguments:
    new_class:
      description: Derived class name
      type: String
      default: Win32_Atomic
    process_to_execute:
      description: Name or path of process to execute.
      type: String
      default: notepad.exe
  executor:
    name: powershell
    elevation_required: true
    command: |
      $Class = New-Object Management.ManagementClass(New-Object Management.ManagementPath("Win32_Process"))
      $NewClass = $Class.Derive("#{new_class}")
      $NewClass.Put()
      Invoke-WmiMethod -Path #{new_class} -Name create -ArgumentList #{process_to_execute}
    cleanup_command: |
      $CleanupClass = New-Object Management.ManagementClass(New-Object Management.ManagementPath("#{new_class}"))
      try { $CleanupClass.Delete() } catch {}
- name: WMI Execute rundll32
  auto_generated_guid: 00738d2a-4651-4d76-adf2-c43a41dfb243
  description: |
    This test uses wmic.exe to execute a DLL function using rundll32. Specify a valid value for remote IP using the node parameter.
  supported_platforms:
  - windows
  input_arguments:
    node:
      description: Ip Address
      type: String
      default: 127.0.0.1
    dll_to_execute:
      description: Path to DLL.
      type: String
      default: $env:TEMP\calc.dll
    function_to_execute:
      description: Name of DLL function to call
      type: String
      default: StartW
  dependency_executor_name: powershell
  dependencies:
  - description: DLL with function to execute must exist on disk at specified location (#{dll_to_execute})
    prereq_command: 'if (Test-Path #{dll_to_execute}) {exit 0} else {exit 1}'
    get_prereq_command: |
      Invoke-WebRequest "https://github.com/redcanaryco/atomic-red-team/blob/master/atomics/T1047/bin/calc.dll?raw=true" -OutFile "#{dll_to_execute}"
  executor:
    command: |
      wmic /node:#{node} process call create "rundll32.exe #{dll_to_execute} #{function_to_execute}"
    cleanup_command: |-
      taskkill /f /im calculator.exe
    name: powershell
- name: Application uninstall using WMIC
  auto_generated_guid: c510d25b-1667-467d-8331-a56d3e9bc4ff
  description: Emulates uninstalling  applications using WMIC.  This method only works if the product was installed with an msi file.  APTs have been seen using this to uninstall security products.
  supported_platforms:
  - windows
  input_arguments:
    node:
      description: Computer the action is being executed against but defaults to the localhost.
      type: string
      default: 127.0.0.1
    product:
      description: Enter the product name being uninstalled.  This will default to TightVNC.
      type: String
      default: Tightvnc
  dependency_executor_name: powershell
  dependencies:
  - description: TightVNC must be installed.
    prereq_command: if ((Test-Path "C:\Program Files\TightVNC\tvnviewer.exe")-Or (Test-Path "C:\Program Files (x86)\TightVNC\tvnviewer.exe")) {exit 0} else {exit 1}
    get_prereq_command: |-
      Invoke-WebRequest 'https://www.tightvnc.com/download/2.8.63/tightvnc-2.8.63-gpl-setup-64bit.msi' -OutFile PathToAtomicsFolder\T1047\bin\tightvncinstaller.msi
      start-sleep -s 10
      msiexec /i PathToAtomicsFolder\T1047\bin\tightvncinstaller.msi /qn /norestart
      start-sleep -s 15
  executor:
    command: wmic /node:"#{node}" product where "name like '#{product}%%'" call uninstall
    cleanup_command: msiexec /i PathToAtomicsFolder\T1047\bin\tightvncinstaller.msi /qn /norestart
    name: command_prompt
    elevation_required: true
