|
|
Discovering Windows Default Password Using LsaRetrievePrivateData |
|
|
|
|
|
|
|
Windows provides Security Management
functions [ Reference
1] for managing various Windows
secrets. One such function is LsaRetrievePrivateData [ Reference
2] which
retrieves various secret data from system policy that has been
previously stored using the
function LsaStorePrivateData. One of the secret data stored by this
function is the 'DefaultPassword'.
All this secret information is
stored in the encrypted format at system location in the registry.
Normally these registry keys are not visible even if you run regedit
as administrator. You need to use any of the techniques as described
in this article [ Reference 3] to view these secret keys.
Here is the screenshot of Regedit.exe running under system account showing
the 'DefaultPassword' secret key.
|
There are lot of other Lsa secret strings which are present at
below registry location |
HKEY_LOCAL_MACHINE\Security\Policy\Secrets |
|
|
|
We don't have to manually decrypt this 'DefaultPassword' value
from the registry to
get the clear text password. The LsaRetrievePrivateData function does it
in style without much work.
Here is the code snippet which illustrates how to use
LsaRetrievePrivateData to retrieve the default logon password. |
|
Before we begin, we need to open a handle to LSA policy. |
|
//Open the handle to LSA Policy
if( LsaOpenPolicy(NULL, &ObjAttributes, POLICY_ALL_ACCESS, &hLsaPolicy)
!= STATUS_SUCCESS )
{
printf("\n LsaOpenPolicy failed");
return;
} |
|
Once the handle is opened, proceed to retrieve the default password
by directly invoking function LsaRetrievePrivateData
|
|
PLSA_UNICODE_STRING privateData = NULL;
WCHAR wstrKeyName[]=L"DefaultPassword";
LSA_UNICODE_STRING keyName;
keyName.Buffer = wstrKeyName;
keyName.Length = wcslen(wstrKeyName) * sizeof(WCHAR);
keyName.MaximumLength = (wcslen(wstrKeyName) + 1) * sizeof(WCHAR);
if( LsaRetrievePrivateData(hLsaPolicy, &keyName, &privateData) !=
STATUS_SUCCESS)
{
printf("LsaRetrievePrivateData failed");
return;
} |
|
On successful execution, display the retrieved default password and
close the handle
|
printf("\n Success : default password is %S (%d)",
privateData->Buffer, privateData->Length);
LsaClose(hLsaPolicy); |
|
This is straightforward code to get the 'defaultpassword'. Also note
that you need to have administrator privileges for this code to execute
successfully.
|
|
|
|
Though this method is deprecated since XP onwards it still works
even on Windows 7. However it is not necessarily have to be current logon
user password as there is only one 'DefaultPassword' setting for entire
system.
Also its not clear under what conditions this password get saved and
what password gets stored.
Though its not reliable method for applications to get the logon
password, it may get you the right password sometimes. |
|
|
|
1.
Windows Security Management Functions |
2. MSDN - LsaRetrievePrivateData API Function |
3. Discovering hidden registry keys in Windows |
|
|
|
|
|
|
|
|
|
|