Konferencja Mega Sekurak Hacking Party w Krakowie – 26-27 października!

Anatomia ataku na Notepad++. Zobacz szczegóły ataku oraz metody detekcji i eliminacji

03 lutego 2026, 13:53 | Aktualności, Teksty | komentarzy 35

W dniu wczorajszym opublikowaliśmy artykuł nawiązujący do oficjalnego komunikatu Notepad++ dotyczącego poważnego i nietypowego ataku na łańcuch dostaw narzędzia. Pojawiły się już pierwsze, ale potwierdzone analizy.

TLDR:

  • Analiza ataku na Notepad++ potwierdza nieuprawniony dostęp przez ponad pół roku
  • Potencjalne wskaźniki naruszeń i techniki działania wskazują na chińską grupę APT – Lotus Blossom
  • W artykule publikujemy także techniki weryfikacji i usunięcia infekcji

Współczesny krajobraz cyberbezpieczeństwa przechodzi fundamentalną transformację, w której zaufanie do dostawców oprogramowania staje się jednym z najbardziej newralgicznych wektorów ataku. Incydent związany z naruszeniem infrastruktury Notepad++, stanowi podręcznikowy przykład operacji typu Advanced Persistent Threat (APT), ukierunkowanej na infiltrację środowisk technicznych poprzez zaufane kanały dystrybucji. 

Narzędzia takie jak Notepad++ są “świętym Graalem” dla grup szpiegowskich i hakerskich. Są one powszechnie używane przez administratorów systemów, programistów (w tym DevOps) oraz inżynierów bezpieczeństwa. Są to osoby posiadające podwyższone uprawnienia w infrastrukturze IT. W przeciwieństwie do masowych kampanii ransomware, operacja ta charakteryzowała się chirurgiczną precyzją, celując w konkretne ofiary poprzez manipulację ruchem sieciowym na poziomie serwera aktualizacji (zewnętrzny dostawca). Zrozumienie technicznego przebiegu ataku wymaga szczegółowej analizy osi czasu, która ujawnia nie tylko moment infekcji, ale także adaptacyjność grupy przestępczej w obliczu zmieniających się warunków w infrastrukturze ofiary. Atak nie polegał na wstrzyknięciu kodu do repozytorium projektu (typowo dla supply chain), lecz na przejęciu kontroli nad mechanizmem dystrybucji aktualizacji (tzw. update server hijacking).

I faza ataku (czerwiec – wrzesień 2025)

Początkowa faza ataku rozpoczęła się w czerwcu 2025 roku. Napastnicy uzyskali nieautoryzowany dostęp do serwera współdzielonego (a dokładnie shared hosting), na którym hostowana była domena notepad-plus-plus[.]org. Kluczowym celem był skrypt PHP odpowiedzialny za obsługę mechanizmu automatycznych aktualizacji – getDownloadUrl.php. W typowym scenariuszu, aplikacja Notepad++ (poprzez proces GUP.exe) wysyła zapytanie do tego skryptu, przekazując w parametrach obecną wersję oprogramowania. Skrypt w odpowiedzi zwraca adres URL do manifestu aktualizacji (czyli pliku XML) oraz instalatora. Napastnicy zmodyfikowali ten proces na poziomie skryptów uruchamianych przez serwer. Mechanizm ataku w tej fazie opierał się na warunkowym przekierowaniu. Skrypt, zamiast serwować oficjalne linki wszystkim użytkownikom, analizował adresy IP oraz nagłówki zapytań przychodzących. Jeśli cel znajdował się na liście “interesujących” ofiar (np. należał do sektora rządowego, telekomunikacyjnego lub zbrojeniowego), serwer zwracał spreparowany plik XML. Ten złośliwy manifest wskazywał na instalator hostowany na infrastrukturze kontrolowanej przez atakujących jako plik update.exe pod adresem IP 95[.]179.213.0, a nie na oficjalne repozytorium GitHub.

Rys. 1. Schemat działania złośliwego update.exe, źródło

Analiza update.exe wykazała, że to tak naprawdę instalator NSIS, co wskazuje potencjalnie na chińską grupę APT, która w ten sposób dostarcza początkowy payload ataku. 

Instalator po pobraniu i uruchomieniu tworzy ukryty katalog w lokalizacji %AppData%\Bluetooth\. Wybór nazwy “Bluetooth” w katalogu AppData jest celowym zabiegiem socjotechnicznym – użytkownicy i mniej doświadczeni administratorzy często ignorują foldery o nazwach systemowych. Do utworzonego katalogu wypakowywane są cztery pliki, które tworzą kompletny ekosystem startowy malware’u. Co ciekawe, pliki tam umieszczone mają zmieniony atrybut folderu na HIDDEN.

[NSIS].nsi

Opis: skrypt instalacyjny NSIS

SHA-256: 8ea8b83645fba6e23d48075a0d3fc73ad2ba515b4536710cda4f1f232718f53e

[BluetoothService.exe]

Opis: usługa Bitdefender Submission Wizard używana do DLL sideloading

SHA-256: 2da00de67720f5f13b17e9d985fe70f10f153da60c9ab1086fe58f069a156924

[BluetoothService]

Opis: zaszyfrowany shellcode

SHA-256: 77bfea78def679aa1117f569a35e8fd1542df21f7e00e27f192c907e61d63a2e

[log.dll]

Opis: złośliwy DLL załadowany przez BluetoothService.exe

SHA-256: 3bdc4c0637591533f1d4198a72a33426c01f69bd2e15ceee547866f65e26b7ad

DLL Side-loading

Najciekawszym elementem łańcucha infekcji jest wykorzystanie prawdziwego oprogramowania antywirusowego przeciwko samemu systemowi. Grupa Lotus Blossom wykorzystała plik wykonywalny opisany jako Bitdefender Submission Wizard, który został przemianowany na usługę BluetoothService.exe.

Dlaczego ta technika jest skuteczna? W systemie Windows, gdy aplikacja próbuje załadować bibliotekę DLL bez podania pełnej ścieżki (co jest częstą praktyką programistyczną), system przeszukuje lokalizacje w określonej kolejności (tzw. DLL Search Order). Dotychczas, zwykle pierwszym miejscem, w którym system szuka biblioteki, jest katalog, z którego uruchomiono aplikację. Aktualnie priorytet otwiera przekierowanie DLL. Legalna aplikacja Bitdefender wymaga do działania biblioteki o nazwie log.dll. Hakerzy zatem umieścili w katalogu %AppData%\Bluetooth\ zarówno legalny plik wykonywalny (BluetoothService.exe), jak i swoją złośliwą wersję biblioteki log.dll. Złośliwa biblioteka log.dll jest spreparowana, aby “pasować” do oczekiwań procesu ładującego. Eksportuje ona dwie kluczowe funkcje, które są wywoływane przez Bitdefender Submission Wizard

  • LogInit – funkcja inicjalizująca. W złośliwej wersji odpowiada ona za odczytanie zaszyfrowanego pliku z shellcodem (plik o nazwie BluetoothService) do pamięci operacyjnej.
  • LogWrite – w oryginale służyłaby do zapisu logów. W wersji od grupy Lotus Blossom funkcja ta zawiera logikę deszyfrującą (LCG) oraz instrukcję skoku (JMP/CALL) do odszyfrowanego kodu, przekazując mu sterowanie.
Rys. 2. Zawartość funkcji LogWrite, źródło

Takie podejście sprawia, że w menedżerze zadań widoczny jest proces podpisany cyfrowo certyfikatem Bitdefender, co usypia czujność wielu systemów monitorujących.

Algorytm deszyfrowania shellcode’u

Shellcode zawarty w pliku BluetoothService (czyli bez rozszerzenia) jest zaszyfrowany, aby uniknąć analizy statycznej (sygnaturowej). Deszyfrowanie odbywa się wewnątrz funkcji LogWrite przy użyciu niestandardowego generatora LCG. Parametry tego algorytmu zostały zidentyfikowane przez badaczy Rapid7:

Typ algorytmu: Linear Congruential Generator (LCG)

Stała Mnożenia (Multiplier): $0x19660D$

Stała Inkrementacji (Increment): $0x3C6EF35F$

Ponownie, zastosowanie niestandardowych stałych w algorytmie LCG jest charakterystyczne dla grup APT, które unikają standardowych implementacji kryptograficznych (jak np. AES w trybie ECB/CBC) na etapie loadera, aby zwiększyć entropię kodu i uniknąć heurystyk wykrywających funkcje kryptograficzne.

Backdoor Chrysalis i Reflective Loading

Po skutecznym załadowaniu i odszyfrowaniu, uruchamiany jest właściwy ładunek (payload) – backdoor o nazwie Chrysalis. Jest to zaawansowane, modułowe narzędzie szpiegowskie, które nie było wcześniej dokumentowane w publicznych repozytoriach, co potwierdza jego charakter jako narzędzia celowanego (bespoke malware) przez grupy APT. Chrysalis operuje całkowicie w pamięci operacyjnej jako moduł PE (ang. Portable Executable), ale bez zapisywania swojej struktury na dysku w formie jawnej. Po przejęciu kontroli przez shellcode, następuje drugi etap deszyfrowania samego modułu backdoora.

Identyfikatory Rapid7:

Klucz deszyfrujący: zahardkodowany ciąg znaków gQ2JR&9;.6

Operacje: sekwencja XOR, dodawania i odejmowania.

Po odszyfrowaniu, kod wykonuje ręczną inicjalizację środowiska C Runtime, co jest niezbędne do działania załadowanych bibliotek, z których korzysta malware. Jest to rzadka cecha, świadcząca o wysokim poziomie kompetencji programistycznych twórców – większość malware’u stara się unikać zależności od CRT, aby zmniejszyć rozmiar kodu, zwłaszcza po obfuskacji.

Obfuskacja kodu

Z tego co zaobserwowano, backdoor nie posiada standardowej tabeli IAT, którą można łatwo przeanalizować narzędziami typu PEStudio. Zamiast tego, funkcje systemowe są rozwiązywane dynamicznie w czasie rzeczywistym. Malware parsuje strukturę PEB (Process Environment Block), a konkretnie listę InMemoryOrderModuleList, aby znaleźć załadowane moduły systemowe takie jak kernel32.dll i ntdll.dll itp. Nazwy funkcji nie są przechowywane jako ciągi tekstowe. Zamiast tego, malware oblicza hash nazwy każdej eksportowanej funkcji w znalezionym module i porównuje go z zaszytą listą hashów. Większość malware’u używa prostego szyfrowania ciągów znaków (np. XOR jednym bajtem). Chrysalis idzie o krok dalej, stosując schemat zaciemniania zależny od pozycji znaku (ang. position-dependent character obfuscation). Oznacza to, że litera ‘A’ na początku stringa zostanie zaszyfrowana do innej wartości niż litera ‘A’ na jego końcu. Technika ta skutecznie uniemożliwia automatyczną ekstrakcję ciągów znaków (np. nazw DLL: oleaut32.dll, advapi32.dll, wininet.dll) za pomocą prostych skryptów w Pythonie czy narzędzia strings (pzdr Gynvael!)

Persystencja

Konfiguracja backdoora jest zaszyta w pliku BluetoothService (tym samym, który zawiera shellcode) pod offsetem 0x30808. Jest ona zaszyfrowana algorytmem RC4 z kluczem qwhvb^435h&*7. W celu zapewnienia persystencji, Chrysalis wykorzystuje dwie metody:

  • Usługa Windows (Service): jest to metoda preferowana. Malware instaluje się jako usługa systemowa, co pozwala na działanie w tle nawet bez zalogowanego użytkownika.
  • Rejestr (Registry Run Key): metoda zapasowa (ang. fallback), wykorzystywana gdy malware nie posiada uprawnień do utworzenia usługi.
Rys. 3. Funkcja hashująca, źródło

Dla zapewnienia, że w systemie działa tylko jedna instancja szkodnika, tworzony jest nazwany obiekt synchronizacji – mutex: Global\Jdhfv_1.0.1.6.

Komunikacja z serwerem C2

Analiza ruchu sieciowego generowanego przez Chrysalis ujawnia zaawansowane techniki ukrywania transmisji. Ruch został zaprojektowany tak, aby wyglądał na legitną komunikację z nowoczesnymi usługami chmurowymi lub API sztucznej inteligencji. Adresy URL wykorzystywane do komunikacji z serwerem C2 naśladują endpointy API popularnego chińskiego LLM – Deepseek, o którym pisaliśmy co najmniej kilka razy.

Przykładowy schemat URL: https://api[.]skycloudcenter.com/a/chat/s/{GUID}

Metoda HTTP: POST

Port: 443 (HTTPS)

Używana funkcja API: HttpSendRequestA (z biblioteki wininet.dll)

Rys. 4. Lista komend C2, źródło

Dzięki takiej strukturze, analityk bezpieczeństwa przeglądający logi proxy może uznać ten ruch za poprawną interakcję użytkownika z chatbotem AI, co jest obecnie powszechnym zjawiskiem… wszędzie. Jednak dane przesyłane wewnątrz tunelu HTTP są dodatkowo szyfrowane algorytmem RC4 ze stałym kluczem sieciowym vAuig34%^325hGV. Podczas pierwszego kontaktu z serwerem C2 malware wysyła pakiet identyfikacyjny zawierający szczegółowe informacje o zainfekowanej maszynie. Unikalny identyfikator (GUID) jest generowany przy użyciu hasha FNV-1A (reprezentowanego jako ASCII), obliczanego na podstawie nazwy komputera, nazwy użytkownika i wersji systemu operacyjnego. Struktura przesyłanego bufora danych (przed zaszyfrowaniem) wygląda następująco:

<UniqueID>.<ComputerName>.<UserName>.<OSVersion>.<127.0.0.1>.<AVs>.<DateAndTime>

Ta szczegółowość pozwala operatorom Lotus Blossom na szybką ocenę wartości celu (np. czy na komputerze zainstalowane są specyficzne systemy antywirusowe, co może sugerować środowisko o podwyższonym rygorze bezpieczeństwa).

II faza ataku (wrzesień – grudzień 2025)

Krytycznym momentem w przebiegu incydentu był dzień 2 września 2025 roku. Administratorzy hostingu przeprowadzili wtedy planową konserwację serwera, obejmującą aktualizację jądra systemu operacyjnego oraz firmware. Działanie to, choć nieświadomie wymierzone w napastników, odcięło im bezpośredni dostęp do shella lub backdoora zainstalowanego na poziomie systemu plików serwera Linux. Mimo utraty bezpośredniej kontroli nad maszyną, grupa Lotus Blossom utrzymała zdolność operacyjną. Przed utratą dostępu, hakerzy zdołali wyeksfiltrować poświadczenia do usług wewnętrznych działających w ramach tego samego konta hostingowego. Pozwoliło im to na dalszą manipulację skryptami i konfiguracją serwera WWW bez konieczności posiadania dostępu root/admin do samej maszyny. Stan ten trwał aż do 2 grudnia 2025 roku, kiedy to ostatecznie zmigrowano usługi do nowego dostawcy i zresetowano wszystkie klucze dostępowe, kończąc tym samym trwającą pół roku kampanię APT.

Zauważono także istnienie dwóch dodatkowych loaderów.

C:\ProgramData\USOShared\svchost.exe-nostdlib -run

C:\ProgramData\USOShared\conf.c

Rys. 5. Schemat dodatkowych loaderów, źródło

Atrybucja grupy APT Lotus Blossom

Atrybucja w cyberbezpieczeństwie jest procesem złożonym, jednak w przypadku tego incydentu dowody wskazują na grupę Lotus Blossom (znaną również pod nazwami Billbug, Thrip, Spring Dragon). Jest to grupa związana z interesami Chińskiej Republiki Ludowej, aktywna od co najmniej 2009 roku. Ich tradycyjne cele obejmują rządy, siły zbrojne i organizacje telekomunikacyjne w Azji Południowo-Wschodniej. Użycie customowego backdoora Chrysalis, technik DLL side-loadingu (ulubiona taktyka chińskich grup APT) oraz infrastruktury sieciowej powiązanej z wcześniejszymi kampaniami (domeny takie jak skycloudcenter[.]com) pozwala z wysokim prawdopodobieństwem przypisać ten atak właśnie im. Fakt, że celem stał się Notepad++ – narzędzie globalne – może sugerować rozszerzenie zakresu operacyjnego grupy lub próbę dotarcia do zachodnich podmiotów technologicznych poprzez ich łańcuch dostaw.

Wskaźniki naruszeń (IoC)

Tabela 1: Wskaźniki plikowe (SHA-256)

KomponentHash SHA-256Opis
update.exea511be5164dc1122fb5a7daa3eef9467e43d8458425b15a640235796006590c9Dropper / Fałszywy instalator
BluetoothService.exe2da00de67720f5f13b17e9d985fe70f10f153da60c9ab1086fe58f069a156924Legalny plik Bitdefender (użyty do ataku)
log.dll3bdc4c0637591533f1d4198a72a33426c01f69bd2e15ceee547866f65e26b7adZłośliwa biblioteka (Loader)
BluetoothService77bfea78def679aa1117f569a35e8fd1542df21f7e00e27f192c907e61d63a2eZaszyfrowany shellcode
ConsoleApplication2.exeb4169a831292e245ebdffedd5820584d73b129411546e7d3eccf4663d5fc5be3Narzędzie pomocnicze

Tabela 2: Wskaźniki sieciowe

TypWartośćKontekst
Domena C2api[.]skycloudcenter.comGłówny kanał sterowania
Domena C2api.wiresguard[.]comZapasowy kanał sterowania
IP (Dystrybucja)95[.]179.213.0Serwer pobierania payloadu
IP (C2)61[.]4.102.97Adres kontrolny
IP (Inne)59[.]110.7.32, 124[.]222.137.114Powiązane z infrastrukturą

Metodyka wykrywania na stacji roboczej

Aby wykryć “złośliwość na kompie”, należy przeprowadzić następujące kroki weryfikacyjne (nasza propozycja):

  1. Weryfikacja systemu plików:
    1. Sprawdź istnienie katalogu %AppData%\Bluetooth\. W systemie Windows ścieżka ta zazwyczaj rozwija się do C:\Users\[NazwaUżytkownika]\AppData\Roaming\Bluetooth\.
    2. Obecność plików wykonywalnych w tym katalogu (szczególnie BluetoothService.exe i log.dll) jest krytycznym wskaźnikiem
  2. Analiza procesów i Mutexów:
    1. Użyj narzędzia takiego jak Process Explorer lub Process Hacker (Np. SysInternals).
    2. Szukaj procesu BluetoothService.exe. Jeśli jest uruchomiony z katalogu AppData, to jest to złośliwe wykonanie.
    3. Sprawdź handlery pod kątem Mutexa o nazwie: Global\Jdhfv_1.0.1. Jego obecność potwierdza aktywną infekcję.
  3. Analiza logów aktualizatora (GUP):
    1. Należy przeanalizować zachowanie procesu GUP.exe (updater Notepad++).
    2. Alarmujące jest łączenie się tego procesu z domenami innymi niż notepad-plus-plus.org lub github.com.
    3. Podejrzanym zachowaniem jest uruchamianie przez GUP.exe plików z katalogu %TEMP% o nazwach update.exe lub AutoUpdater.exe

Przygotowaliśmy także skrypt PowerShell do automatycznej weryfikacji powyższego. Pobieramy i uruchamiamy z Internetu. To bezpieczne, prawda?

Skrypt dostępny jest tutaj: https://github.com/tturba/ioc-notepad/blob/main/poc-verify.ps1

Zapytania KQL

Dla organizacji korzystających z Microsoft Defender for Endpoint, poniższe zapytanie KQL pozwoli zidentyfikować maszyny, na których uruchomiono podatne wersje Notepad++ lub gdzie wystąpiła podejrzana aktywność aktualizacyjna:

// Wykrywanie uruchomienia Notepad++ w wersji podatnej na atak

let lookback = 30d;

let CleanVersion = dynamic(["8.8.9", "8.9.1", "8.9.2"]);

DeviceProcessEvents

| where TimeGenerated >= ago(lookback)

| where ActionType == "ProcessCreated"

| where InitiatingProcessVersionInfoInternalFileName == "notepad++.exe"

| summarize arg_max(TimeGenerated, *) by DeviceName

| where not (InitiatingProcessVersionInfoProductVersion has_any (CleanVersion))

| distinct DeviceName

| where TimeGenerated > ago(lookback)

//| where RemoteUrl has “notepad-plus-plus.org”

| where DeviceName has_any (VurnableNPPVersion)

| summarize arg_max(TimeGenerated, *) by DeviceName

Jak się bronić? Co zrobić gdy jednak jest infekcja?

Jeśli na komputerze zidentyfikowano folder %AppData%\Bluetooth\ lub powiązane z nim procesy, należy uznać maszynę za całkowicie zhackowaną. Backdoor Chrysalis umożliwia kradzież plików, haseł i instalację kolejnych narzędzi (np. Cobalt Strike). Zastosuj poniższe techniki od razu:

  1. Izolacja sieciowa: natychmiast odłącz komputer od sieci (wyjmij kabel RJ45, wyłącz Wi-Fi), aby przerwać komunikację z C2 i zapobiec eksfiltracji danych lub rozprzestrzenianiu się malware’u w sieci lokalnej (lateral movement).
  2. Brak zaufania do czyszczenia: próba “wyczyszczenia” antywirusowego jest ryzykowna. Ze względu na zaawansowane techniki persystencji (serwisy Windows, rejestr) i możliwość pobrania dodatkowych modułów, jedynym pewnym sposobem jest pełna reinstalacja systemu operacyjnego (formatowanie dysku).
  3. Rotacja poświadczeń: wszystkie hasła, które były wpisywane lub zapisane na zainfekowanym komputerze (przeglądarki, menedżery haseł, klienci VPN/SSH), muszą zostać zmienione z poziomu innego, bezpiecznego urządzenia.

Twórcy Notepad++ wprowadzili istotne zmiany w architekturze bezpieczeństwa, aby zapobiec podobnym atakom w przyszłości, więc należy bezwzględnie zaktualizować Notepad++ do wersji v8.9.1 lub nowszej. Wersje te posiadają poprawiony mechanizm WinGup. Jeśli musisz zainstalować Notepad++ w środowisku o podwyższonym ryzyku, nie polegaj na auto-updaterze. Pobierz instalator bezpośrednio z oficjalnego repozytorium GitHub. Sprawdź sumę kontrolną (SHA-256) pobranego pliku i porównaj ją z wartościami opublikowanymi przez autora na stronie projektu. Kliknij prawym przyciskiem na plik -> Właściwości -> Podpisy cyfrowe. Upewnij się, że plik jest podpisany ważnym certyfikatem wystawionym dla Notepad++ (zazwyczaj przez GlobalSign).

Źródła:

https://www.rapid7.com/blog/post/tr-chrysalis-backdoor-dive-into-lotus-blossoms-toolkit

https://github.com/CreamyG31337/chrysalis-ioc-triage

https://socradar.io/blog/notepad-infrastructure-hijacked

~Tomek Turba

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

  1. Marcepan

    Dla tych ktorym zapali sie na czerwono terminal podczas proby odpalenia skryptu:

    PowerShell.exe -ExecutionPolicy Bypass -File .\poc-verify.ps1

    Odpowiedz
  2. robert

    PS C:\> PowerShell.exe -ExecutionPolicy Bypass -File .\poc-verify.ps1
    At C:\poc-verify.ps1:69 char:45
    + Write-Host “`n— Skanowanie zakoĹ„czone —” -ForegroundColor Cyan
    + ~~~~~~~~~~~~~~~~~~~~~~~
    The string is missing the terminator: “.
    + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : TerminatorExpectedAtEndOfString

    Odpowiedz
    • Hej, chodzi o cudzysłowy z kopii bezpośredniej z przeglądarki. Zmieniłem na GH dla pewności wywołania ASCII plus ::

      Odpowiedz
      • Bartek

        Mi zwraca taki błąd:

        poc-verify.ps1:76 char:51
        + Write-Host ” [*] GUP.exe connected to: $remoteIP:$remotePo …
        + ~~~~~~~~~~
        Variable reference is not valid. ‘:’ was not followed by a valid variable name character. Consider using ${} to delimit
        the name.
        + CategoryInfo : ParserError: (:) [], ParseException
        + FullyQualifiedErrorId : InvalidVariableReferenceWithDrive

        Odpowiedz
      • Mirosław

        Hejka,

        .\poc-verify.ps1
        At C:\Users\[…]\Downloads\poc-verify.ps1:76 char:51
        + Write-Host ” [*] GUP.exe connected to: $remoteIP:$remotePo …
        + ~~~~~~~~~~
        Variable reference is not valid. ‘:’ was not followed by a valid variable name character. Consider using ${} to delimit
        the name.
        + CategoryInfo : ParserError: (:) [], ParseException
        + FullyQualifiedErrorId : InvalidVariableReferenceWithDrive

        Zmieniłem 76 linię na:
        Write-Host Write-Host ” [*] GUP.exe connected to: ${remoteIP}:${remotePort} (verify if this is an official endpoint)” -ForegroundColor Yellow

        i u mnie poszło.

        Odpowiedz
  3. F

    W skrypcie do automatycznej weryfikacji wyskakuje bląd w wierszu 76. Chodzi o zmienne: ‘$remoteIP:$remotePort‘. Po zmianie na ‘${remoteIP}:${remotePort}’ działa poprawnie.

    Odpowiedz
  4. Bolo

    Wam też nie wyświetla komunikatu po uruchomieniu skryptu czy folder bluetooth istnieje ? musiałem dodać do linjki [System.IO.Path] przed Combine

    $appDataPath = [System.IO.Path]::Combine($env:APPDATA, “Bluetooth”)

    Odpowiedz
  5. Tomasz popraw jeszcze ten kod, w pierwszej wersji trzeba było zamienić

    Write-Host “`n— Skanowanie zakoĹ„czone —” -ForegroundColor Cyan

    na

    Write-Host “— Skanowanie zakonczone —” -ForegroundColor Cyan

    teraz

    Write-Host ” [*] GUP.exe connected to: $remoteIP:$remotePort (verify if this is an official endpoint)” -ForegroundColor Yellow

    na

    Write-Host “GUP.exe connected to $remoteIP::$remotePort (verify if this is an official endpoint)” -ForegroundColor Yellow

    ale ogólnie działa super :)

    ostateczny wynik to:

    — Starting system scan for Notepad++ Hijack IoCs —
    [+] No %AppData%\Bluetooth directory found.
    [+] Mutex Global\Jdhfv_1.0.1 not detected.

    — Scan finished —

    Odpowiedz
  6. robert

    At C:\poc-verify.ps1:76 char:51
    + Write-Host ” [*] GUP.exe connected to: $remoteIP:$remotePo …
    + ~~~~~~~~~~
    Variable reference is not valid. ‘:’ was not followed by a valid variable name character. Consider using ${} to delimit
    the name.
    + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : InvalidVariableReferenceWithDrive

    Odpowiedz
  7. roberto

    Tak ma być:
    Write-Host ” [*] GUP.exe connected to: $($remoteIP):$($remotePort) (verify if this is an official endpoint)” -ForegroundColor Yellow

    Odpowiedz
  8. Jarek

    Linia 76 –> Write-Host ” [*] GUP.exe connected to: “+$remoteIP:$remotePort+” (verify if this is an official endpoint)” -ForegroundColor Yellow
    wywala mi błąd parsera. Nie znam się …
    Zmieniłem na –> Write-Host ” [*] GUP.exe connected to: $($remoteIP):$($remotePort) (verify if this is an official endpoint)” -ForegroundColor Yellow
    Działa lepiej

    Odpowiedz
  9. Filip

    Bardzo dobry art

    Odpowiedz
  10. Jakub W

    Jakby komuś wywalało błąd w 76 lini to poprawka niżej:

    Write-Host “[*] GUP.exe connected to: ${remoteIP}:${remotePort} (verify if this is an official endpoint)” -ForegroundColor Yellow

    Odpowiedz
  11. Marcepan

    Dokladniej to chodzi o to: Ĺ„ w stringu: zakoĹ„czone bo „ zapewne zamykal wczesniej otwarty “. Ja zamienilem string: zakoĹ„czone na string: zakonczone i bylo na zielono a nie na czerwono.

    Odpowiedz
  12. Marcin

    Co to za zmienna w KQL? : (VurnableNPPVersion)
    Nie jest wcześniej zdefiniowana.

    Odpowiedz
  13. markooff

    Post bardzo fajny (jako małe uzupełnienie /streszczenie pełnego Raportu Rapid7.

    Natomiast to, co nie zostało na razie poruszone – a co moim zdaniem jest naprawdę istotne – to pytanie jak można sprawdzić czy infekcja nie tyle trwa obecnie (bo tutaj mamy całą masę mechaizmów) ale – czy była kiedykolwiek wcześniej .

    Bo zauważmy że malware po otrzymaniu tokenu 4\\ – podejmuje próbe usunięcia się oraz wyczyszczenia pozostałości … I teraz – pytanie (bo nawet Rapid7 tego nie precyzuje w swoim bogatym raporcie) – CZEGO dokładnie tyczy się usuwanie ze środowiska (i jakich pozostałości …?) czy np. także wszystkich po kolei loaderów/dll_loaderów itp itd ?

    Sprawa jest o tyle ważna i ważka :) – że uwielu z nas mogą znajdowac się dane i credentiale – do wielu zewn systemów (np.klientów) choćby w plikach password menadzerów … I teraz dobrze byłoby móc się przekonać (jakoś) czy brak infekcji obecny – to gwarancja tego że takiej infekcji nie było .. .bo w przeciwnym razie – no, każdy przecież lubi – taką spontaniczną akcję wymiany paruset (jesli nie więcej) credentiali + uniewazniania certyfikatów, kluczy asymatrycznych etc etc etc … :)

    Pozdrawiam

    Odpowiedz
    • SeeM

      Badanie ruchu http sprzed paru miesięcy bardzo ułatwi posiadanie proxy, takiego jak e2guardian, czy czegoś podobnego. Można też próbować NetFlow, ale to musi być silna maszyna i kilka terabajtów miejsca na dane.

      Jedno i drugie jest koszmarnie trudne do wdrożenia. Jak miałbym dane klientów, to chciałbym wiedzieć, co się z nimi dzieje. Idzie zrobić.

      Odpowiedz
  14. Robert

    Kopiując text np. z GitHuba do notatnika i tak zapisując na swoim dysku plik *.ps1 upewnijcie się, iż macie ustawione kodowanie UTF16 ;) inaczej będą zawsze takie kwiatki jak tu z polskimi znakami – szczególnie dla PowerShell v5.x ;)

    Odpowiedz
  15. Jaku

    Zasadnicze pytanie, czy jeśli ktoś nie aktualizował Notepad++ w podanym okresie, to czy pozostaje bezpieczny?

    Jeśli ktoś miał ustawione automatyczne aktualizacje, to raczej większe szanse, że mógł coś złapać ale co w przypadku aktualizacji ręcznych?

    Czy samo odpytanie serwera o dostępność aktualizacji mogło doprowadził do infekcji?

    Notepad++ wyświetla komunikat o dostępności aktualizacji i pyta czy ją zainstalować, czy to już daje możliwość pobrania w tle instalatora i możliwość infekcji, czy dopiero zatwierdzenie przez użytkownika uruchamia cały proces infekcji?

    Odpowiedz
    • Wychodzi na to, że tak

      Odpowiedz
      • Paweł

        Tomku pytanie – do aktualizacji Notepad++ wymagane są uprawnienia Administratora, pytanie więc czy nawet jeśli ktoś wcisnął przycisk aktualizuj ale nie wykonał autoryzacji Administratora w celu aktualizacji, to do infekcji raczej nie mogło dojść czyż nie?

        Odpowiedz
  16. RoMan

    Poszukiwania folderu bluetooth należy rozszerzyć na wszystkie podkatalogi w \Users\ o ile uprawnienia nam na to pozwolą, inaczej sprawdzamy tylko folder konkretnego użytkownika.

    np: $homeList=Get-ChildItem “c:\Users” -directory -Exclude “public”
    #$a
    foreach ($Home in $HomeList) {
    $c=get-Childitem -Path “c:\Users\$($home.name)\Appdata\Roaming\” -Directory -filter “Bluetooth”
    … }

    Odpowiedz
  17. Paweł

    Cześć pytanie czy skrypt sprawdza wszystkie katalogi %AppData% dla każdego usera czy tylko dla konta Administratora?

    Odpowiedz
    • Paweł

      W związku z komentarzem od @RoMan mój jest zbędny więc można usunąć ;D

      Odpowiedz
  18. to_ja

    Wiek niby mamy XXI, a tam conajmniej do zeszłego roku nie wpadli na cyfrowe podpisywanie aktualizacji? Ja wiem, złośliwy jestem, ale takie kwiatki chyba tylko w najpopularniejszym środowisku graficznym się trafiają…

    Odpowiedz
  19. Marek

    Ciekawe czy komputery tworzące KSeF też zostały zainfekowane?

    Odpowiedz
  20. > Analiza update.exe wykazała, że to tak naprawdę instalator NSIS, co wskazuje potencjalnie na chińską grupę APT, która w ten sposób dostarcza początkowy payload ataku.

    Tego typu spekulacje nic nie wnoszą do artykułu. NSIS jest używany przez wiele poważnych programów, a także przez programy niepoważne, jak na przykład Notepad++.

    Odpowiedz
    • Jednak jest to IoC dla APT ChRL

      Odpowiedz
    • jedrek

      Program N++ niepoważny bo programisci/admini zaliczyli fakap? To w takim myśleniu jak poważny jest wgciebie taki windows, tyle wtop było.. Gratuluję chwalenia się głupotą.

      Odpowiedz
  21. Andrzej

    Pytanie, czy w tym zdaniu:
    “Ponownie, zastosowanie niestandardowych stałych w algorytmie LCG jest charakterystyczne dla grup APT, które unikają standardowych implementacji kryptograficznych (jak np. AES w trybie ECB/CBC) na etapie loadera, aby zmniejszyć entropię kodu i uniknąć heurystyk wykrywających funkcje kryptograficzne.”
    nie powinno być “… zwiększyć entropię kodu …” ?

    Odpowiedz
  22. Jacek
    Odpowiedz

Odpowiedz