You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
355 lines
9.7 KiB
355 lines
9.7 KiB
/*++
|
|
|
|
Copyright (c) 2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
owfs.cxx
|
|
|
|
Abstract:
|
|
|
|
Injectee
|
|
|
|
Author:
|
|
|
|
Larry Zhu (LZhu) December 1, 2001 Created
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "precomp.hxx"
|
|
#pragma hdrstop
|
|
|
|
#include <lmcons.h>
|
|
#include "owfs.hxx"
|
|
|
|
EXTERN_C
|
|
NTSTATUS
|
|
LsaICallPackageEx(
|
|
IN PUNICODE_STRING AuthenticationPackage,
|
|
IN PVOID ClientBufferBase,
|
|
IN PVOID ProtocolSubmitBuffer,
|
|
IN ULONG SubmitBufferLength,
|
|
OUT PVOID * ProtocolReturnBuffer,
|
|
OUT PULONG ReturnBufferLength,
|
|
OUT PNTSTATUS ProtocolStatus
|
|
);
|
|
|
|
PLSA_SECPKG_FUNCTION_TABLE LsaFunctions = NULL;
|
|
CHAR MyPassword[PWLEN + 1] = {0};
|
|
PLSA_CALL_PACKAGE SavedCallPackage = NULL;
|
|
|
|
BOOL
|
|
DllMain(
|
|
IN HANDLE hModule,
|
|
IN DWORD dwReason,
|
|
IN DWORD dwReserved
|
|
)
|
|
{
|
|
switch (dwReason)
|
|
{
|
|
case DLL_THREAD_ATTACH:
|
|
break;
|
|
|
|
case DLL_THREAD_DETACH:
|
|
break;
|
|
|
|
case DLL_PROCESS_DETACH:
|
|
if (SavedCallPackage && LsaFunctions)
|
|
{
|
|
DebugPrintf(SSPI_LOG, "DllMain DLL_PROCESS_DETACH retoring CallPackage from %p to %p\n", LsaFunctions->CallPackage, SavedCallPackage);
|
|
LsaFunctions->CallPackage = SavedCallPackage;
|
|
}
|
|
break;
|
|
|
|
case DLL_PROCESS_ATTACH:
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return DllMainDefaultHandler(hModule, dwReason, dwReserved);
|
|
}
|
|
|
|
int
|
|
RunIt(
|
|
IN ULONG cbParameters,
|
|
IN VOID* pvParameters
|
|
)
|
|
{
|
|
//
|
|
// RunItDefaultHandler calls Start() and adds try except
|
|
//
|
|
|
|
return RunItDefaultHandler(cbParameters, pvParameters);
|
|
}
|
|
|
|
typedef struct _TTempResp {
|
|
ENCRYPTED_CREDENTIALW returnCred;
|
|
MSV1_0_SUPPLEMENTAL_CREDENTIAL suppCred;
|
|
} TTempResp;
|
|
|
|
extern "C"
|
|
NTSTATUS
|
|
CustomCallPackage(
|
|
IN PUNICODE_STRING AuthenticationPackage,
|
|
IN PVOID ProtocolSubmitBuffer,
|
|
IN ULONG SubmitBufferLength,
|
|
OUT PVOID *ProtocolReturnBuffer,
|
|
OUT PULONG ReturnBufferLength,
|
|
OUT PNTSTATUS ProtocolStatus
|
|
)
|
|
{
|
|
NTSTATUS Status = STATUS_SUCCESS;
|
|
__try
|
|
{
|
|
if (KerbQuerySupplementalCredentialsMessage != *((ULONG*)ProtocolSubmitBuffer))
|
|
{
|
|
DebugPrintf(SSPI_LOG, "Calling LsaICallPackageEx\n");
|
|
|
|
Status = LsaICallPackageEx(
|
|
AuthenticationPackage,
|
|
ProtocolSubmitBuffer, // client buffer base is same as local buffer
|
|
ProtocolSubmitBuffer,
|
|
SubmitBufferLength,
|
|
ProtocolReturnBuffer,
|
|
ReturnBufferLength,
|
|
ProtocolStatus
|
|
);
|
|
}
|
|
else
|
|
{
|
|
KERB_QUERY_SUPPLEMENTAL_CREDS_REQUEST* pQuerySuppCred = (KERB_QUERY_SUPPLEMENTAL_CREDS_REQUEST*) ProtocolSubmitBuffer;
|
|
KERB_QUERY_SUPPLEMENTAL_CREDS_RESPONSE* pQuerySuppCredResp = NULL;
|
|
UNICODE_STRING KerberosPackageName = CONSTANT_UNICODE_STRING((MICROSOFT_KERBEROS_NAME_W));
|
|
UNICODE_STRING MsvPackageNam = CONSTANT_UNICODE_STRING((NTLMSP_NAME));
|
|
ULONG cbResponse = 0;
|
|
NTSTATUS SubStatus = STATUS_UNSUCCESSFUL;
|
|
PCREDENTIALW pCred = NULL;
|
|
MSV1_0_SUPPLEMENTAL_CREDENTIAL* pMsvSuppCred = NULL;
|
|
TTempResp* pTempResp = NULL;
|
|
|
|
DebugPrintf(SSPI_LOG, "Do it myself\n");
|
|
|
|
ASSERT(LsaFunctions);
|
|
|
|
pTempResp = (TTempResp*) LsaFunctions->AllocatePrivateHeap(sizeof(TTempResp));
|
|
pQuerySuppCredResp = (KERB_QUERY_SUPPLEMENTAL_CREDS_RESPONSE*) pTempResp;
|
|
|
|
if (!pQuerySuppCredResp)
|
|
{
|
|
Status = STATUS_NO_MEMORY;
|
|
}
|
|
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
ANSI_STRING Ansi;
|
|
UNICODE_STRING NtPass = {0};
|
|
RtlInitAnsiString(&Ansi, MyPassword);
|
|
RtlAnsiStringToUnicodeString(&NtPass, &Ansi, TRUE);
|
|
|
|
//
|
|
// make a copy of cert cred
|
|
//
|
|
|
|
pQuerySuppCredResp->ReturnedCreds = *(ENCRYPTED_CREDENTIALW*)pQuerySuppCred->MarshalledCreds;
|
|
|
|
//
|
|
// make a supplemental cred
|
|
//
|
|
|
|
pMsvSuppCred = &pTempResp->suppCred;
|
|
pMsvSuppCred->Flags = CRED_FLAGS_PASSWORD_FOR_CERT | CRED_FLAGS_OWF_CRED_BLOB;
|
|
pMsvSuppCred->Version = MSV1_0_CRED_VERSION;
|
|
RtlCalculateNtOwfPassword(&NtPass, (PNT_OWF_PASSWORD) pMsvSuppCred->NtPassword);
|
|
RtlCalculateLmOwfPassword(MyPassword, (PLM_OWF_PASSWORD) pMsvSuppCred->LmPassword);
|
|
pMsvSuppCred->Flags = MSV1_0_CRED_NT_PRESENT | MSV1_0_CRED_LM_PRESENT;
|
|
|
|
|
|
//
|
|
// encrypt it
|
|
//
|
|
|
|
pQuerySuppCredResp->ReturnedCreds.Cred.CredentialBlob = (BYTE*) pMsvSuppCred;
|
|
pQuerySuppCredResp->ReturnedCreds.Cred.CredentialBlobSize = sizeof(MSV1_0_SUPPLEMENTAL_CREDENTIAL);
|
|
LsaFunctions->LsaProtectMemory(
|
|
pQuerySuppCredResp->ReturnedCreds.Cred.CredentialBlob,
|
|
pQuerySuppCredResp->ReturnedCreds.Cred.CredentialBlobSize
|
|
);
|
|
pQuerySuppCredResp->ReturnedCreds.ClearCredentialBlobSize = sizeof(MSV1_0_SUPPLEMENTAL_CREDENTIAL);
|
|
|
|
//
|
|
// fill in the flags and types etc
|
|
//
|
|
|
|
pQuerySuppCredResp->ReturnedCreds.Cred.Flags = CRED_FLAGS_OWF_CRED_BLOB;
|
|
pQuerySuppCredResp->ReturnedCreds.Cred.Type = CRED_TYPE_DOMAIN_PASSWORD;
|
|
pQuerySuppCredResp->ReturnedCreds.Cred.UserName = L"ntdev\\lzhu";
|
|
|
|
if (0)
|
|
{
|
|
NTSTATUS TempStatus;
|
|
|
|
TempStatus = LsaFunctions->CrediWrite(
|
|
&pQuerySuppCred->LogonId,
|
|
0,
|
|
&pQuerySuppCredResp->ReturnedCreds,
|
|
0
|
|
);
|
|
|
|
if (!NT_SUCCESS(TempStatus))
|
|
{
|
|
DebugPrintf(SSPI_ERROR, "CrediWrite failed with %#x\n", TempStatus);
|
|
}
|
|
}
|
|
|
|
*ProtocolStatus = STATUS_SUCCESS;
|
|
*ProtocolReturnBuffer = pQuerySuppCredResp;
|
|
*ReturnBufferLength = sizeof(MSV1_0_SUPPLEMENTAL_CREDENTIAL) + sizeof(ENCRYPTED_CREDENTIALW);
|
|
}
|
|
}
|
|
}
|
|
__except (EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
Status = GetExceptionCode();
|
|
DebugPrintf(SSPI_ERROR, "CustomCallPackage hit exception %#x\n", Status);
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
#if 0
|
|
|
|
Return Values for Start():
|
|
|
|
ERROR_NO_MORE_USER_HANDLES unload repeatedly
|
|
ERROR_SERVER_HAS_OPEN_HANDLES no unload at all
|
|
others unload once
|
|
|
|
#endif 0
|
|
|
|
int
|
|
Start(
|
|
IN ULONG cbParameters,
|
|
IN VOID* pvParameters
|
|
)
|
|
{
|
|
DWORD dwErr = ERROR_SUCCESS;
|
|
|
|
DebugPrintf(SSPI_LOG, "Start: Hello world!\n");
|
|
DebugPrintHex(SSPI_LOG, "Parameters", cbParameters, pvParameters);
|
|
|
|
LsaFunctions = *((PLSA_SECPKG_FUNCTION_TABLE*)pvParameters);
|
|
|
|
if (!LsaFunctions)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
if (cbParameters > sizeof(ULONG_PTR))
|
|
{
|
|
memcpy(MyPassword, ((UCHAR*)pvParameters) + sizeof(ULONG_PTR), cbParameters - sizeof(ULONG_PTR));
|
|
|
|
if (strlen(MyPassword) == 1)
|
|
{
|
|
DebugPrintf(SSPI_WARN, "Start: trying to unload this dll repeately\n");
|
|
dwErr = ERROR_NO_MORE_USER_HANDLES;
|
|
goto Cleanup;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Sanity Check
|
|
//
|
|
|
|
{
|
|
VOID* pvMem = NULL;
|
|
pvMem = LsaFunctions->AllocatePrivateHeap(sizeof(WCHAR));
|
|
if (pvMem)
|
|
{
|
|
LsaFunctions->FreePrivateHeap(pvMem);
|
|
}
|
|
}
|
|
|
|
if (!SavedCallPackage)
|
|
{
|
|
DebugPrintf(SSPI_LOG, "Start: saving CallPackage %p, CustomCallPackage %p\n", LsaFunctions->CallPackage, CustomCallPackage);
|
|
SavedCallPackage = LsaFunctions->CallPackage;
|
|
LsaFunctions->CallPackage = CustomCallPackage;
|
|
}
|
|
|
|
//
|
|
// don't unload this dll
|
|
//
|
|
|
|
dwErr = ERROR_SERVER_HAS_OPEN_HANDLES;
|
|
|
|
Cleanup:
|
|
|
|
return dwErr;
|
|
}
|
|
|
|
int
|
|
Init(
|
|
IN ULONG argc,
|
|
IN PCSTR* argv,
|
|
OUT ULONG* pcbParameters,
|
|
OUT VOID** ppvParameters
|
|
)
|
|
{
|
|
DWORD dwErr = ERROR_SUCCESS;
|
|
CHAR Parameters[REMOTE_PACKET_SIZE] = {0};
|
|
ULONG cbBuffer = sizeof(Parameters);
|
|
ULONG cbParameter = 0;
|
|
|
|
DebugPrintf(SSPI_LOG, "Init: Hello world!\n");
|
|
|
|
*pcbParameters = 0;
|
|
*ppvParameters = NULL;
|
|
|
|
ULONG_PTR LsaFunctions = 0x745b5688;
|
|
|
|
DebugPrintf(SSPI_LOG, "LsaFunctions is %p\n", LsaFunctions);
|
|
|
|
memcpy(Parameters, &LsaFunctions, sizeof(LsaFunctions));
|
|
cbParameter = sizeof(LsaFunctions);
|
|
|
|
if (argc >= 1)
|
|
{
|
|
memcpy(Parameters + cbParameter, argv[0], strlen(argv[0]));
|
|
cbParameter += strlen(argv[0]);
|
|
cbParameter++; // add a NULL
|
|
|
|
dwErr = ERROR_SUCCESS;
|
|
}
|
|
else // return "Usage" in ppvParameters, must be a NULL terminated string
|
|
{
|
|
strcpy(Parameters, "<password>");
|
|
cbParameter = strlen(Parameters) + 1;
|
|
|
|
dwErr = ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
*ppvParameters = new CHAR[cbParameter];
|
|
if (*ppvParameters)
|
|
{
|
|
*pcbParameters = cbParameter;
|
|
memcpy(*ppvParameters, Parameters, *pcbParameters);
|
|
}
|
|
else
|
|
{
|
|
dwErr = ERROR_OUTOFMEMORY;
|
|
goto Cleanup;
|
|
}
|
|
|
|
Cleanup:
|
|
|
|
return dwErr;
|
|
}
|
|
|