Jak zadomowić się w cudzej sieci cz. 4 – LNK

Ostatni artykuł poświęcony był technice COM Hijackingu, dziś chciałbym poruszyć temat persistence z wykorzystaniem skrótów LNK. Dowiemy się czym są skróty w systemie Windows, w jaki sposób możemy modyfikować skróty na pulpicie, w jaki sposób działają skróty na tzw. Task Barze (pasku zadań, tym na dole, gdzie można sobie przypinać programy 😉 i jak to wszystko ma się do taktyki persistence.

Wstęp

Okej, ale czym tak naprawdę jest skrót? Skrót (pliki z rozszerzeniem .lnk) to specjalne pliki, które służą jako wskaźnik do innych plików, programów, katalogów czy aplikacji. Jest to zwyczajny plik binarny, z magic byte równym 0x0000004C i określoną strukturą danych przechowującą:

  • Ścieżkę docelową do pliku, folderu, aplikacji itp.
  • Katalog roboczy
  • Lokalizację ikony
  • Argumenty
  • Opis
  • Klawisz skrótu
  • Styl okna

Jak widać, nie jest to zbyt rozbudowana struktura. Nie należy również mylić Windowsowego shortcutu z symbolicznym dowiązaniem (symlinkiem), który działa na poziomie systemu plików. Shortcuty LNK działają na poziomie systemu operacyjnego.

Gdzie mogą występować skróty? Co do zasady – na Pulpicie. Coraz częściej korzystamy jednak ze skrótów np. na Task Barze, czyli pasku zadań. O ile lokalizacja skrótów na Pulpicie wynika z połączenia dwóch ścieżek:

  • %USERPROFILE%\Desktop
  • C:\Users\Public\Desktop

o tyle pochodzenie skrótów na pasku zadań nie jest oczywiste.

Programy, które są przypięte do paska zadań mieszczą się w katalogu: %USERPROFILE%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar

Jak uzyskać persistence?

W sieci istnieje wiele poradników jak uzyskać persistence, ale większość z nich dotyczy elementów, które łatwo zbadać Autorunem (z pakietu SysInternals), wymaga uprawnień Administratora lub zwyczajnie jest mocno inwazyjna (wpisy w rejestrze). Całkiem niezłe persistence można (moim zdaniem) uzyskać modyfikując istniejące skróty i dodając do nich wykonywanie naszego, złośliwego programu, z zachowaniem ich oryginalnej funkcji. Ostatni fragment jest bardzo ważny – cóż to za persistence, kiedy potencjalna ofiara widzi, że jej ulubiony skrót nie działa tak jak powinien? Prawdopodobnie skończyłoby się to przeinstalowaniem programu lub wyrzuceniem skrótu i utworzeniem nowego.

Za wykonywany program odpowiadają dwa parametry skrótu:

  • target path
  • arguments

Możemy się do nich bardzo łatwo odwołać, powołując nowy obiekt klasy IWshShortcut w C# i odczytując atrybuty „Arguments” oraz „TargetPath”. Do tego dodajmy „IconLocation”, aby znać lokalizację ikony:

W jaki sposób możemy „dołożyć” naszą komendę do programu wykonywanego przez skrót? Nie ukrywam, że najchętniej widziałbym to tak:

Niestety, tak się nie da. A przynajmniej ja nie wpadłem na podobny sposób. Jeżeli ktoś twierdzi, że jest inaczej i można połączyć wykonanie dwóch niezależnych programów w ramach jednego LNK (nie licząć lolbinsów) – chętnie się dowiem! Na ten moment przyszedł mi do głowy tylko jeden pomysł:

Praktyczna implementacja

Wykonanie powyższej komendy spowoduje, że wykona się oryginalny program wraz z argumentami, ponadto wykonana zostanie komenda na persistence. Świetnie! Problem jednak w tym, że podczas wykonywania powyższego polecenia, na ekranie pulpitu pojawia się duże okno Powershella. Mało stealthy. Dorzućmy kilka przełączników.

Dzięki powyższym możemy wykonywać skrypt powershellowy bez obawy o prawidłowe ustawienie Execution Policy. Ponadto, okno Powershella będzie zminimalizowane. Niestety, powyższa kombinacja powoduje, że okno Powershella wprawdzie nie pojawia się przez cały czas wykonywania skryptu, ale miga na ułamek sekundy. Raczej nie umknie to uwadze większości użytkowników, nawet tych mniej świadomych. Na szczeście, mamy jeszcze klasyczny cmd, który obsługuje przełącznik /min wraz z poleceniem start. Cała komenda będzie więc brzemieć następująco:

Zobaczmy w takim razie jak wygląda to w kodzie:

Przetestujmy program:

Program przyjmuje dwa argumenty:

  • Ikona którą ma zmodyfikować
  • Polecenie, które ma wykonać jako persistence (w tym przypadku jest to stworzenie katalogu „testpersistence” na pulpicie”

Program z powodzeniem zmodyfikował skrót. Po dwukrotnym kliknięciu na ikonkę 7z, włącza się GUI z narzędziem, a na pulpicie pojawia się katalog „testpersistence”. Świetnie, wygląda na to, że działa.

Bardziej stealthy – czyli limit znaków w plikach LNK

Teoretycznie, poprzez GUI nie możemy ustawić targetpath jako dłuższego niż 256 znaków. W praktyce, z technicznego punktu widzenia (patrz dokumentacja LNK), skróty przyjmą dane o długości do 4000 znaków, a w GUI po prostu utną resztę. Spróbujmy w takim razie dodać padding, który spowoduje, że w polu „Target” będziemy widzieć białe znaki, przy zachowaniu działania persistence.

A efekty działania jak na zdjęciu poniżej:

  • Zachowano funkcjonalność oryginalnego shortcutu
  • Zachowano ikonkę oryginalnego shortcutu (co wcale nie jest takie oczywiste – patrz kod!)
  • Wykonano „złośliwe” polecenie
  • Zawartość pola Target jest „pusta” – lepsze to niż base64

Podsumowanie

Pełny kod jest dostępny na moim Githubie: https://github.com/OppressionBreedsResistance/SharpStubborn/

Jakie programy będą brali na celownik hakerzy? Przede wszystkim takie, które rzadko aktualizujemy lub przeinstalowujemy. Z reguły są to małe, administracyjne programy, takie jak np. Putty. Aktualizacja oprogramowania może podmienić shortcut, a tego potencjalny cyberprzestępca na pewno by nie chciał.

Sam program SharpStubborn jest napisany w .NET Framework, więc z powodzeniem możecie korzystać z niego jako z Assembly do ładowania z wykorzystaniem dowolnego C2 czy innych metod. Poniżej wykorzystanie programu wraz z Cobalt Strike:

Wcześniejsze artykuły:

  • https://how2hax.pl/jak-zadomowic-sie-w-cudzej-sieci-cz-3-com-hijacking/
  • https://how2hax.pl/kilka-slow-o-persistence-w-systemie-windows-cz-2/
  • https://how2hax.pl/techniki-persistence-red-teaming/

Dodaj komentarz


The reCAPTCHA verification period has expired. Please reload the page.