Proces zarządzania poprawkami

https://chacker.pl/

Każdy dostawca ma swój własny proces dystrybucji poprawek, w tym Oracle, Microsoft i Apple. Niektórzy dostawcy mają ustalony harmonogram, kiedy poprawki są wydawane, podczas gdy inni nie mają ustalonego harmonogramu. Posiadanie trwającego cyklu wydawania poprawek, takiego jak ten używany przez Microsoft, pozwala osobom odpowiedzialnym za zarządzanie dużą liczbą systemów na odpowiednie planowanie. Poprawki poza pasmem mogą być problematyczne dla organizacji, ponieważ mogą nie być łatwo dostępne zasoby do wdrażania aktualizacji. Skupimy się przede wszystkim na procesie zarządzania poprawkami Microsoft, ponieważ jest to dojrzały proces, który jest często ukierunkowany na cel różnicowania w celu odkrywania luk w zabezpieczeniach w celu osiągnięcia zysku.

Nasza pierwsza różnica

https://chacker.pl/

W tym laboratorium wykonasz prostą różnicę z kodem pokazanym wcześniej w sekcji „Różnice aplikacji”. Pliki binarne ELF name i name2 mają zostać porównane. Plik name jest plikiem bez poprawki, a name2 jest plikiem z poprawką. Najpierw musisz uruchomić bezpłatną aplikację IDA 5.0, którą wcześniej zainstalowałeś. Po jej uruchomieniu przejdź do Plik | Nowy, wybierz kartę Unix z wyskakującego okienka i kliknij opcję ELF po lewej stronie, jak pokazano tutaj, a następnie kliknij OK.

Przejdź do folderu C:\grayhat\app_diff\ i wybierz plik „name”. Zaakceptuj domyślne opcje, które się pojawią. IDA powinna szybko zakończyć swoją autoanalizę, domyślnie wybierając funkcję main() w oknie demontażu, jak pokazano poniżej.

Naciśnij CTRL-F11, aby wyświetlić wyskakujące okienko turbodiff. Jeśli się nie pojawi, wróć i upewnij się, że poprawnie skopiowałeś niezbędne pliki dla turbodiff. Gdy okno turbodiff jest na ekranie, wybierz opcję „pobierz informacje z tego idb” i kliknij OK, a następnie kliknij OK. Następnie przejdź do Plik | Nowy, a pojawi się wyskakujące okienko z pytaniem, czy chcesz zapisać bazę danych. Zaakceptuj ustawienia domyślne i kliknij OK. Powtórz kroki wybierania karty Unix | ELF Executable, a następnie kliknij OK. Otwórz plik binarny ELF name2 i zaakceptuj ustawienia domyślne. Powtórz kroki otwierania wyskakującego okienka turbodiff i wybierania opcji „pobierz informacje z tego idb”. Teraz, gdy wykonałeś to dla obu plików, naciśnij ponownie CTRL-F11, gdy plik name2 jest nadal otwarty w IDA. Wybierz opcję „porównaj z…” i kliknij OK. Wybierz plik name.idb i kliknij OK, a następnie kliknij OK. Powinno pojawić się poniższe pole (aby uzyskać dokładny obraz, konieczne może być sortowanie według kategorii).

Należy pamiętać, że funkcja getName() jest oznaczona jako „podejrzana ++”. Kliknij dwukrotnie funkcję getName(), aby wyświetlić następujące okno:

Na tym obrazku lewe okno pokazuje poprawioną funkcję, a prawe okno pokazuje niepoprawioną funkcję. Niepoprawiony blok używa funkcji gets(), która nie zapewnia sprawdzania granic. Poprawiony blok używa funkcji fgets(), która wymaga argumentu size, aby pomóc zapobiec przepełnieniom bufora. Poprawiona dezasemblacja jest pokazana tutaj:

W obu funkcjach było kilka dodatkowych bloków kodu, ale są one białe i nie zawierają żadnego zmienionego kodu. Są po prostu kodem ochronnym stack-smashing, który weryfikuje stack canaries, po którym następuje epilog funkcji. W tym momencie ukończyłeś laboratorium. Idąc dalej, przyjrzymy się różnicom w świecie rzeczywistym.

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.