turbodiff

https://chacker.pl/

Innym narzędziem, które omówimy jest turbodiff. Wybraliśmy je ze względu na możliwość działania z darmową wersją IDA 5.0. DarunGrim i Diaphora to również świetne narzędzia; jednak do ich używania wymagana jest licencjonowana kopia IDA, co uniemożliwia osobom czytającym ukończenie ćwiczeń w tym rozdziale bez posiadania lub zakupu licencjonowanej kopii. DarunGrim i Diaphora są przyjazne dla użytkownika i łatwe do skonfigurowania z IDA. Dostępna jest literatura pomocna w instalacji i użytkowaniu (zobacz sekcję „Dalsze informacje” na końcu tego rozdziału). Inną alternatywą są narzędzia różnicujące, które działają z innymi deasemblerami, takie jak Ghidra. Jak wspomniano wcześniej, wtyczkę turbodiff można pobrać ze strony internetowej http://corelabs.coresecurity.com/ i można ją bezpłatnie pobrać i używać na podstawie licencji GPLv2. Najnowsza stabilna wersja to wersja 1.01b_r2, wydana 19 grudnia 2011 r. Aby użyć turbodiff, musisz załadować dwa pliki do porównania jeden po drugim do IDA. Gdy IDA zakończy autoanalizę pierwszego pliku, naciśnij CTRL-F11, aby wyświetlić menu podręczne turbodiff. Z opcji dostępnych podczas pierwszej analizy pliku wybierz „pobierz informacje z tego idb” i kliknij OK. Powtórz te same kroki dla drugiego pliku, który ma zostać uwzględniony w diff. Gdy zostanie to wykonane dla obu plików do porównania, naciśnij ponownie CTRL-F11, wybierz opcję „porównaj z…”, a następnie wybierz inny plik IDB. Powinno pojawić się następujące okno.

W kolumnie kategorii możesz zobaczyć etykiety takie jak identyczne, podejrzane +, podejrzane ++ i zmienione. Każda etykieta ma znaczenie i może pomóc egzaminatorowi skupić się na najciekawszych funkcjach, przede wszystkim tych oznaczonych jako podejrzane + i podejrzane ++. Etykiety te wskazują, że sumy kontrolne w jednym lub większej liczbie bloków w wybranej funkcji są niezgodne, a także czy liczba instrukcji uległa zmianie. Po dwukrotnym kliknięciu żądanej nazwy funkcji wyświetlana jest wizualna różnica, przy czym każda funkcja pojawia się w osobnym oknie, jak pokazano tutaj:

BinDiff

https://chacker.pl/

Jak wspomniano wcześniej, na początku 2011 roku Google przejął niemiecką firmę programistyczną Zynamics, a znany badacz Thomas Dullien, znany również jako Halvar Flake, pełnił funkcję szefa badań. Zynamics był szeroko znany z narzędzi BinDiff i BinNavi, które pomagają w inżynierii wstecznej. Po przejęciu Google znacznie obniżyło cenę tych narzędzi do jednej dziesiątej pierwotnej ceny, dzięki czemu stały się znacznie bardziej dostępne. W marcu 2016 roku Google ogłosiło, że od tej pory BinDiff będzie darmowy. Projekt jest aktywnie utrzymywany przez Christiana Blichmanna, a BinDiff 7 jest najnowszą wersją w momencie pisania tego tekstu. BinDiff jest często chwalony jako jedno z najlepszych narzędzi tego typu, zapewniające dogłębną analizę zmian bloków i kodu. W połowie 2021 roku wsparcie BinDiff dla Ghidra i Binary Ninja, innego świetnego deasemblera, było w fazie beta. BinDiff 7 jest dostarczany jako pakiet instalacyjny Windows (.msi), plik pakietu oprogramowania Debian (.deb) lub plik obrazu dysku Mac OS X (.dmg). Instalacja wymaga jedynie kilku kliknięć, licencjonowanej kopii IDA Pro i wymaganej wersji Java Runtime Environment. Aby użyć BinDiff, musisz zezwolić IDA na przeprowadzenie automatycznej analizy dwóch plików, które chcesz porównać i zapisać pliki IDB. Po zakończeniu tej czynności i otwarciu jednego z plików w IDA naciśnij CTRL-6, aby wyświetlić interfejs graficzny BinDiff, jak pokazano tutaj:

Następnym krokiem jest kliknięcie przycisku Diff Database i wybranie innego pliku IDB dla diff. W zależności od rozmiaru plików, ukończenie diff może potrwać minutę lub dwie. Po zakończeniu diff w IDA pojawią się nowe zakładki, w tym Matched Functions, Primary Unmatched i Secondary Unmatched. Zakładka Matched Functions zawiera funkcje, które istnieją w obu plikach, które mogą lub nie zawierać zmian. Każda funkcja jest punktowana wartością od 0 do 1,0 w kolumnie Similarity, jak pokazano poniżej. Im niższa wartość, tym bardziej funkcja zmieniła się między dwoma plikami. Jak stwierdził Zynamics/Google w odniesieniu do zakładek Primary Unmatched i Secondary Unmatched, „Pierwsza wyświetla funkcje, które są zawarte w aktualnie otwartej bazie danych i nie były powiązane z żadną funkcją diffed database, podczas gdy podwidok Secondary Unmatched zawiera funkcje, które są w diffed database, ale nie były powiązane z żadną funkcją w pierwszej”.

Ważne jest, aby porównać poprawne wersje pliku, aby uzyskać najdokładniejsze wyniki. Gdy przejdziesz do Microsoft TechNet, aby uzyskać poprawki opublikowane przed kwietniem 2017 r., zobaczysz kolumnę po prawej stronie zatytułowaną „Zastąpione aktualizacje”. Proces pobierania poprawek rozpoczynający się w kwietniu 2017 r. zostanie wkrótce omówiony. Przejście do adresu URL w tej lokalizacji (Zastąpione aktualizacje) przeniesie Cię do poprzedniej najnowszej aktualizacji pliku, który jest łatany. Plik taki jak jscript9.dll jest łatany prawie co miesiąc. Jeśli porównasz wersję pliku z kilku miesięcy wcześniej z poprawką, która właśnie wyszła, liczba różnic między tymi dwoma plikami bardzo utrudni analizę. Inne pliki nie są łatane zbyt często, więc kliknięcie wspomnianego łącza Zastąpione aktualizacje przeniesie Cię do ostatniej aktualizacji danego pliku, dzięki czemu będziesz mógł porównać odpowiednie wersje. Po zidentyfikowaniu interesującej funkcji za pomocą BinDiff można wygenerować różnicę wizualną, klikając prawym przyciskiem myszy żądaną funkcję z zakładki Funkcje dopasowane i wybierając opcję Wyświetl wykresy przepływu lub klikając żądaną funkcję i naciskając CTRL-E. Poniżej znajduje się przykład różnicy wizualnej. Należy zauważyć, że nie oczekuje się, że będzie można odczytać deasemblację, ponieważ jest ona pomniejszona, aby zmieścić się na stronie.

Narzędzia do porównywania plików binarnych

https://chacker.pl/

Ręczna analiza skompilowanego kodu dużych plików binarnych za pomocą deasemblera, takiego jak Interactive Disassembler (IDA) Pro lub Ghidra, może być trudnym zadaniem nawet dla najbardziej doświadczonego badacza. Dzięki wykorzystaniu darmowych i dostępnych komercyjnie narzędzi do porównywania plików binarnych proces wyszukiwania interesującego kodu związanego z poprawioną luką może zostać uproszczony. Takie narzędzia mogą zaoszczędzić setki godzin spędzonych na odwracaniu kodu, który może nie mieć związku z poszukiwaną luką. Oto niektóre z najbardziej znanych narzędzi do porównywania plików binarnych:

  • Zynamics BinDiff (bezpłatny) Zynamics BinDiff, nabyty przez Google na początku 2011 r., jest dostępny pod adresem www.zynamics.com/bindiff.html. Wymaga licencjonowanej wersji IDA (lub Ghidra).
  • turbodiff (darmowy) Opracowany przez Nicolasa Economou z Core Security, turbodiff jest dostępny na stronie https://www.coresecurity.com/corelabs/

open-source-tools/turbodiff-cs. Można go używać z darmową wersją IDA 4.9 lub 5.0. Jeśli linki nie działają, spróbuj tutaj: https://github.com/nihilus/turbodiff.

  • DarunGrim/binkit (darmowy) Opracowany przez Jeong Wook Oh (Matt Oh), DarunGrim jest dostępny na stronie https://github.com/ohjeongwook/binkit. Wymaga aktualnej licencjonowanej wersji IDA.
  • Diaphora (darmowy) Opracowany przez Joxeana Koreta. Diaphora jest dostępna na stronie https://github.com/joxeankoret/diaphora. Oficjalnie obsługiwane są tylko najnowsze wersje IDA.

Każde z tych narzędzi działa jako wtyczka do IDA (lub Ghidra, jeśli zaznaczono inaczej), wykorzystując różne techniki i heurystyki do określania zmian kodu między dwiema wersjami tego samego pliku. Możesz uzyskać różne wyniki, używając każdego z narzędzi do tych samych plików wejściowych. Każde z narzędzi wymaga możliwości dostępu do plików bazy danych IDA (.idb), stąd wymóg licencjonowanej wersji IDA lub bezpłatnej wersji z turbodiff. W przykładach w tym rozdziale użyjemy komercyjnego narzędzia BinDiff, a także turbodiff, ponieważ działa ono z bezpłatną wersją IDA 5.0, którą nadal można znaleźć online w różnych witrynach, takich jak https://www.scummvm.org/news/20180331/. Pozwala to osobom bez komercyjnej wersji IDA na ukończenie ćwiczeń. Jedynymi narzędziami z listy, które są aktywnie utrzymywane, są Diaphora i BinDiff. Autorzy każdego z nich powinni być wysoko cenieni za dostarczanie tak wspaniałych narzędzi, które oszczędzają nam niezliczonych godzin prób znalezienia zmian w kodzie.

Różnicowanie poprawek

https://chacker.pl/

Poprawki zabezpieczeń, takie jak te od Microsoftu i Oracle, są jednymi z najbardziej dochodowych celów różnicowania plików binarnych. Microsoft historycznie miał dobrze zaplanowany proces zarządzania poprawkami, który odbywa się według miesięcznego harmonogramu, w którym poprawki są wydawane w drugi wtorek każdego miesiąca. Łatane pliki to najczęściej biblioteki DLL i pliki sterowników, chociaż wiele innych typów plików również otrzymuje aktualizacje, takie jak pliki .exe. Wiele organizacji nie łata swoich systemów szybko, pozostawiając atakującym i testerom penetracyjnym otwartą okazję do naruszenia tych systemów za pomocą publicznie ujawnionych lub prywatnie opracowanych exploitów za pomocą różnicowania poprawek. Począwszy od systemu Windows 10, Microsoft jest znacznie bardziej agresywny w zakresie wymagań dotyczących poprawek, co sprawia, że ​​odroczenie aktualizacji jest trudne. W zależności od złożoności łatanej luki w zabezpieczeniach i trudności w zlokalizowaniu odpowiedniego kodu, działający exploit może czasami zostać opracowany szybko w ciągu kilku dni lub tygodni po wydaniu poprawki. Exploity opracowane po inżynierii wstecznej poprawek bezpieczeństwa są powszechnie określane jako exploity 1-dniowe lub n-dniowe. Różnią się one od exploitów 0-dniowych, w których poprawka jest niedostępna w momencie jej odkrycia w środowisku naturalnym. W miarę przechodzenia przez ten rozdział szybko zobaczysz korzyści z różnicowania zmian kodu w sterownikach, bibliotekach i aplikacjach. Chociaż nie jest to nowa dyscyplina, różnicowanie binarne nadal przyciąga uwagę badaczy bezpieczeństwa, hakerów i dostawców jako realna technika odkrywania luk i czerpania zysków. Cena za exploit 1-dniowy nie jest zazwyczaj tak wysoka, jak za exploit 0-dniowy; jednak nie jest niczym niezwykłym, że można zobaczyć atrakcyjne wypłaty za bardzo pożądane exploity. Ponieważ większość luk jest ujawniana prywatnie bez publicznie dostępnego exploita, dostawcy ram eksploatacji chcą mieć więcej exploitów powiązanych z tymi prywatnie ujawnionymi lukami niż ich konkurenci

Różnicowanie aplikacji

https://chacker.pl/

Nowe wersje aplikacji są zazwyczaj wydawane w sposób ciągły. Powody wydania mogą obejmować wprowadzenie nowych funkcji, zmiany kodu w celu obsługi nowych platform lub wersji jądra, wykorzystanie nowych kontroli bezpieczeństwa w czasie kompilacji, takich jak kanarki lub Control Flow Guard (CFG), oraz naprawę luk w zabezpieczeniach. Często nowa wersja może zawierać kombinację wyżej wymienionych powodów. Im więcej zmian w kodzie aplikacji, tym trudniej zidentyfikować te związane z załataną luką w zabezpieczeniach. Duża część sukcesu w identyfikowaniu zmian kodu związanych z poprawkami luk w zabezpieczeniach zależy od ograniczonych ujawnień. Wiele organizacji decyduje się na ujawnienie minimalnych informacji na temat charakteru poprawki bezpieczeństwa. Im więcej wskazówek możemy uzyskać z tych informacji, tym większe prawdopodobieństwo, że odkryjemy lukę w zabezpieczeniach. Jeśli ogłoszenie o ujawnieniu stwierdza, że ​​istnieje luka w zabezpieczeniach obsługi i przetwarzania plików JPEG, a my zidentyfikujemy zmienioną funkcję o nazwie RenderJpegHeaderType, możemy wnioskować, że jest ona związana z poprawką. Tego typu wskazówki zostaną pokazane w rzeczywistych scenariuszach w

dalszej części. Prosty przykład fragmentu kodu C, który zawiera lukę w zabezpieczeniach, jest pokazany tutaj:

A oto poprawiony kod

Problem z pierwszym fragmentem kodu polega na użyciu funkcji gets(), która nie oferuje sprawdzania granic, co skutkuje możliwością przepełnienia bufora. W poprawionym kodzie użyto funkcji fgets(), która wymaga argumentu rozmiaru, co pomaga zapobiec przepełnieniu bufora. Funkcja fgets() jest uważana za przestarzałą i prawdopodobnie nie jest najlepszym wyborem ze względu na niezdolność do prawidłowego obsługiwania bajtów null, takich jak dane binarne; jednak jest lepszym wyborem niż gets(), jeśli jest używana prawidłowo. Przyjrzymy się temu prostemu przykładowi później, używając narzędzia do porównywania binarnego.

Wprowadzenie do różnicowania binarnego

https://chacker.pl/

Gdy zmiany są wprowadzane do skompilowanego kodu, takiego jak biblioteki, aplikacje i sterowniki, różnica między wersjami załatanymi i niezałatanymi może dać okazję do odkrycia luk w zabezpieczeniach. W swojej najprostszej postaci różnicowanie binarne to proces identyfikowania różnic między dwiema wersjami tego samego pliku, takimi jak wersja 1.2 i 1.3. Można by rzec, że najczęstszym celem binarnych różnic są poprawki Microsoftu; jednak można to stosować do wielu różnych typów skompilowanego kodu. Dostępne są różne narzędzia, które upraszczają proces binarnego różnicowania, umożliwiając w ten sposób szybkie identyfikowanie zmian w kodzie między wersjami zdeasemblowanego pliku.

Wykorzystanie poprawek nowej generacji

https://chacker.pl/

W odpowiedzi na lukratywny wzrost badań nad lukami w zabezpieczeniach, poziom zainteresowania binarnym różnicowaniem załatanych luk w zabezpieczeniach stale rośnie. Prywatnie ujawnione i wewnętrznie odkryte luki w zabezpieczeniach zazwyczaj oferują ograniczone szczegóły techniczne publicznie. Im więcej szczegółów zostanie ujawnionych, tym łatwiej będzie innym zlokalizować lukę w zabezpieczeniach. Bez tych szczegółów różnicowanie poprawek pozwala badaczowi szybko zidentyfikować zmiany ode związane z łagodzeniem luki w zabezpieczeniach, co czasami może prowadzić do skutecznego uzbrojenia. Niepowodzenie w szybkim łataniu w wielu organizacjach stanowi lukratywną okazję dla praktyków ds. bezpieczeństwa ofensywnego.

Podsumowanie

https://chacker.pl/

Eksploatacja po ataku jest krytycznym aspektem hakowania. Rzadko dostajemy się do systemu, który był naszym celem jako pierwszy; dlatego możliwość rozpoznania, eskalacji i uzyskania trwałości domeny jest krytyczna dla udanych ataków. Przyjrzeliśmy się różnym sposobom wykorzystania programu PowerShell i języka C# do określania informacji o użytkownikach, systemach i obiektach usługi Active Directory, a następnie wykorzystania tych informacji do identyfikacji ścieżek do eskalacji uprawnień. Po eskalacji uprawnień zarówno na hoście, jak i w domenie, dodaliśmy trwałość do usługi Active Directory, aby upewnić się, że możemy zachować nasz dostęp. Po wykonaniu tego możemy swobodnie poruszać się po domenie, aby uzyskać dostęp do wszelkich innych informacji, których szukamy w ramach naszego ataku.

Nadużywanie SIDHistory

https://chacker.pl/

SIDHistory to funkcja, która pomaga w migracji Active Directory. Gdy łączysz domeny lub lasy, podczas migracji, może być przydatna wiedza o tym, kim był użytkownik, aby zachować dostęp do poprzednich zasobów podczas migracji. Pole SIDHistory przechowuje identyfikatory SID poprzednich kont lub grup, do których należał użytkownik, aby mógł on nadal mieć dostęp jako poprzedni użytkownik w tych innych środowiskach. Niestety, dodawanie poprzednich identyfikatorów SID do użytkownika nie jest łatwym zadaniem. Jest to coś, co zwykle wykonuje się, gdy baza danych AD jest w trybie migracji. Z tego powodu PowerView nam nie pomoże. Zamiast tego będziemy musieli użyć naszych uprawnień, aby uzyskać bezpośredni dostęp do kontrolera domeny, a następnie możemy użyć modułu DSInternals PowerShell, aby dodać nasz identyfikator SID. Moduł wymaga od nas zatrzymania usługi NTDS, aby mogła ona uczynić usługę AD niedostępną, dopóki nie zostanie ona ponownie uruchomiona. Zacznijmy od końca  po wykonaniu Enter-PSSession w celu zalogowania się do DC. Teraz możemy uzyskać SID grupy Domain Admins:

Następnie instalujemy moduł dsinternals, jak pokazano poniżej. Pozwoli nam to na korzystanie z modułu po jego zainstalowaniu w systemie. Jeśli pojawią się jakieś monity o dodanie zależności, po prostu odpowiedz tak.

Po zaimportowaniu modułu musimy teraz zatrzymać usługę NTDS, a następnie użyć polecenia cmdlet ADD-ADDBSidHistory, aby dodać SID grupy Domain Admins do użytkownika docelowego. Musimy również określić lokalizację pliku bazy danych NTDS.dit. Usługa NTDS musi być offline, abyśmy mogli uzyskać dostęp do pliku; w przeciwnym razie zostanie on zablokowany.

Musimy odczekać kilka sekund, aż usługa zostanie ponownie uruchomiona; następnie możemy sprawdzić użytkownika docelowego i ustalić, czy ustawienia zostały wprowadzone:

Widzimy, że SIDHistory jest teraz obecne. Aby zastosować uprawnienia, użyjmy polecenia runas, aby uruchomić nowe okno poleceń i sprawdzić nasze uprawnienia:

Widzimy, że SIDHistory jest teraz obecne. Aby zastosować uprawnienia, użyjmy polecenia runas, aby uruchomić nowe okno poleceń i sprawdzić nasze uprawnienia:

Udało nam się nadać sobie uprawnienia Domain Admins bez bycia w grupie. Teraz mamy wiele sposobów, aby pozostać w domenie — albo korzystając z naszych uprawnień przyznanych przez SIDHistory, albo za pośrednictwem dostępu przyznanego przez nasze modyfikacje AdminSDHolder, które zostały rozpropagowane do uprzywilejowanych grup.

Nadużywanie AdminSDHolder

https://chacker.pl/

Na DerbyCon5 Sean Metcalf wygłosił wykład zatytułowany „Czerwony kontra niebieski: nowoczesne ataki i obrona usługi Active Directory”, w którym omówił specjalny obiekt w usłudze Active Directory, AdminSDHolder. Ten kontener jest wyjątkowy, ponieważ co godzinę uprawnienia, które się w nim znajdują, są propagowane do wszystkich elementów z admincount=1 w AD. Propagacja ta nazywa się SDProp, a gdy w kontenerze zostaną wprowadzone modyfikacje, w ciągu godziny zmiany będą obowiązywać we wszystkich obiektach administratora. I odwrotnie, jeśli zmienisz obiekt administratora, proces SDProp zastąpi Twoje zmiany w ciągu godziny. W laboratorium 17-12 wykonaliśmy DCSync, a następnie wstrzyknęliśmy bilet Kerberos do naszej sesji. W przypadku tego ataku potrzebujemy skrótów NTLM w naszej sesji. Aby to zrobić, ponownie załadujemy BetterSafetyKatz, wykonamy DCSync na koncie administratora, a następnie utworzymy nowy cmd.exe przy użyciu skrótów NTLM dla naszej sesji na naszym komputerze docelowym:

Powinno pojawić się nowe okno z wierszem poleceń. Teraz musimy załadować PowerView, abyśmy mogli łatwo sprawdzić, jakie są uprawnienia bieżącego obiektu AdminSDHolder, a następnie pracować nad dodaniem naszego backdoora:

Obecnie tylko konto Local System BUILTIN ma pełne uprawnienia do obiektu AdminSDHolder. Dodajmy użytkownika docelowego, aby móc wrócić. Aby to zrobić, użyjemy polecenia cmdlet Add-ObjectAcl w PowerView. Docelowo wybierzemy obiekt AdminSDHolder, a następnie dodamy uprawnienie GenericAll za pomocą opcji Rights:

Teraz, gdy sprawdzimy uprawnienia, powinniśmy zobaczyć użytkownika GHH\target na liście dostępu z uprawnieniami GenericAll:

Sukces! Uprawnienia są propagowane do innych grup co godzinę, więc musimy trochę poczekać, a następnie powinniśmy móc sprawdzić grupę Domain Admins i zobaczyć, że cel ma pełny dostęp do grupy:

Widzimy, że przy pierwszej próbie tylko System lokalny miał pełny dostęp, ale gdy odczekamy kilka minut, zobaczymy, że użytkownik docelowy jest również wymieniony. Jako nasz użytkownik docelowy możemy teraz dodawać członków do grupy według własnego uznania.