W tym artykule opiszemy kolejny i ciekawy sposób na przechwycenie bieżącego hasła użytkownika w postaci jawnego tekstu w systemie Windows.

Hasła użytkowników, w szczególności administratorów są jak klucze do królestwa, a po ich zdobyciu zawsze jest co robić :). O metodach pozyskania takich haseł pisaliśmy wcześniej tutaj oraz tutaj (DPAPI). Tym razem odkrywcą nowego sposobu i twórcą kodu w języku C jest Grzegorz Tworek. Cały kod możecie znaleźć na profilu GitHub Grzegorza.


Na czym polega problem?

Ciężko opisywany przypadek nazwać problemem. Raczej nazwalibyśmy go „możliwością”, która udostępnia nam niskopoziomowe API Windows. Znajduje się w nim opisana w zarysie funkcja NPLogonNotify(), która jest odpowiedzialna w Windows za zwracanie konkretnych informacji podczas logowania użytkownika do systemu, w tym haseł wpisywanych jawnym tekstem. Szczegóły na jej temat znajdziecie tutaj.

Dla nas jest interesująca zwłaszcza ta ostatnia cecha funkcji – hasła – z wiadomych względów. Grzegorz napisał kod w języku C (bibliotekę dll), który możecie skompilować lub pobrać gotową DLL’ke i wgrać do folderu „C:\Windows\system32”. Oprócz tego, potrzebne będzie jeszcze dodanie odpowiednich wpisów w rejestrze systemowym. To wszystko!

UWAGA! W celu wykonania opisanych operacji potrzebna będą uprawnienia lokalnego administratora na Windows.

Ale kto w dzisiejszych czasach ich nie posiada? Żartujemy oczywiście, bo nie powinniśmy używać konta z tak wysokimi uprawnieniami w trakcie normalnej pracy na komputerze. Jeśli z jakiś względów takie uprawnienia posiadamy albo zdobędzie je cyberprzestępca (patrz kampania CYBER KILL CHAIN) to mamy gotowy sposób, na to, aby poznać hasła logujących się do naszego systemu użytkowników!


Co musimy zrobić, aby poznać hasła użytkowników?

Nasze testy wykonaliśmy na najnowszym Windows 10 buid 2004. Testy powiodły się też na starszej wersji 1909 i 1903. Zakładamy, że inne wersje tez będą umożliwiały użycie tego sposobu, ponieważ funkcja NPLogonNotify(), jest dostępna praktycznie od wersji Windows XP oraz Windows 2003.

Kroki jakie musimy wykonać, aby metoda zadziałała:


Krok 1. Skompilować kod do biblioteki DLL

Pierwsze co musimy zrobić, to pobrać kod w C i skompilować go. Dla tych, którzy nie maja takiej możliwości mogą pobrać gotową, skompilowaną bibliotekę DLL z profilu Grzegorza na GitHub tutaj.
Poniżej prezentujemy fragment kodu z zaznaczoną funkcją NPLogonNotify():

Na dole kodu, widzimy kolejną funkcję SavePassword pobierającą nazwę użytkownika i hasło i przekazująca wartości do 2 zmiennych. Wykorzystywana jest tutaj struktura MSV1_0_INTERACTIVE_LOGON odpowiadająca za logowanie interaktywne do komputera. Te zmienne później zostaną wykorzystane do zapisania ich w pliku tekstowym o nazwie „NPPSpy.txt” znajdującym się w katalogu głównym na dysku C:\.


Krok 2. Wgrać bibliotekę do katalogu systemowego

Skopiować bibliotekę ważącą 91KB do katalogu „c:\windows\system32”:


Krok 3. Wpisać w rejestrze odpowiednie wpisy i odwołanie do wgranej biblioteki dll

Uruchamiamy rejestr systemu poleceniem regedit.exe
W gałęzi “HKLM\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order” należy dodać na końcu parametru ProviderOrder nazwę biblioteki. W naszym przypadku jest to „NPPSPy”:

Utworzyć wpisy w ścieżce:
„HKLM\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider”
o podanych wartościach:

Poniżej przygotowaliśmy gotową komendę, która zrobi to automatycznie za Was. Wystarczy odpalić ją w wierszu linii poleceń (cmd.exe) lub w oknie Run, jak kto woli:

reg add “HKLM\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order” /v “ProviderOrder” /d “vmhgfs,RDPNP,LanmanWorkstation,webclient,NPPSpy” /t REG_SZ /f && reg add “HKLM\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider” /v “Class” /d 2 /t REG_DWORD && reg add “HKLM\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider” /v “Name” /d “NPPSpy” /t REG_SZ && reg add “HKLM\SYSTEM\CurrentControlSet\Services\NPPSpy\NetworkProvider” /v “ProviderPath” /d “%SystemRoot%\System32\NPPSpy.dll” /t REG_EXPAND_SZ


Krok 4. Zalogować się ponownie do systemu i odczytać zapisane hasło.

Po ponownym zalogowaniu do systemu możemy w pliku „C:\NPPSpy.txt” znajdziesz wpisane wartości: nazwa użytkownika -> hasło.


Jak się chronić?

Poniżej zamieszczamy kilka porad.

  • Monitorować powyższe wpisy w rejestrze.
  • Sprawdzać i ufać tylko podpisanym bibliotekom w systemie.
  • Monitorować aktywność na folderze C:\Windows\System32 zwłaszcza pod względem wgrywanych nowych DLL.
  • Użyć dodatkowych mechanizmów zabezpieczania logowania MFA (choć je też można obejść patrz tutaj).
  • Użyć specjalistycznych narzędzi do monitorowania.
  • Monitorować proces lsass.exe pod kątem wszelkich nowych, podejrzanych bibliotek DLL.

Pozdrawiamy Grzegorza Tworka i gratulujemy kolejnego odkrycia!