Podatności od “drugiej” strony – Windows patch diffing

Deweloperzy systemu operacyjnego Windows w tym roku nie mają łatwego życia – sama “dziesiątka” od początku roku uzbierała ponad 150 CVE. Microsoft, swoim zwyczajem wydaje poprawki w drugi wtorek każdego miesiąca (słynne “patch tuesday”). Dzień ten wypadł akurat przedwczoraj – więc stąd wpis nieco odmienny od głównej tematyki bloga 😉

Biuletyny bezpieczeństwa często bardzo enigmatycznie opisują co było zepsute i co zostało naprawione – pozostaje liczyć na writeupy badaczy (głównie Google Project Zero) i czasami Microsoft (tutaj drugi post).

Wiedza ta może się przydać nie tylko do pisania exploitów i identyfikacji słabości softu, lecz również do patchowania starszych systemów (polecam zapoznać się z bardzo fajną inicjatywą o nazwie 0patch).

Od czego zacząć i co dalej?

Od czekania na patch tuesday 😉 Kiedy już pojawią się poprawki możemy wytypować interesujący nas błąd i pobrać do niego poprawkę (w przypadku Windows 10 nie jest to takie proste – zazwyczaj wydawane są tzw. Cumulative Update, które zawierają poprawki dla wielu różnych luk oraz nowe funkcjonalności).

Warto trzymać się zasady, że patche reversujemy na najstarszej możliwej wersji systemu – będzie po prostu łatwiej 🙂

Wszelkie kroki będę pokazywał z wykorzystaniem błędu CVE-2017-8463 (na Windows 10) poprawionego w ostatnim cyklu poprawek.

1. Pobieramy poprawkę z Windows Update Catalog. Możemy spróbować wypakować ją (format MSU / CAB) ręcznie za pomocą polecenia:

expand -F:* <msu/cab> <dest_folder>

2. Jest to bardzo niewygodne w przypadku Cumulative Update – w zamian polecam skrypt PatchExtact Grega Linaresa‏ (na wszelki wypadek: mój mirror).

Opdalenie jest bardzo proste i sprowadza się jedynie do podania ścieżek:

Powershell -ExecutionPolicy Bypass -File .\PatchExtract.ps1 -Patch .\windows10.0-kb4025338-x64_c99d7772ad0f6f3340a438d2e82eba7e5c3b2fca.msu -Path C:\Users\XYZ\Desktop\PATCH_TUESDAY_120717

3. Po około 15-20 minutach skrypt posprząta po sobie i uporządkuje nam pliki w strukturze katalogów jak na screenie:

Ze wszystkich folderów interesują nas tylko foldery: x86 oraz x64 – w nich będziemy poszukiwać swieżo poprawionych plików:

4. Wyszukujemy folder z interesującą binarką – w naszym wypadku poprawionym plikiem explorer.exe. Dla własnej wygody polecam zmienić nazwę pliku i przekopiować niezaktualizowany plik w inne miejsce.

5. Instalujemy Zynamic BinDiff (jeżeli jest za ciężki to polecam Diaphorę) i ładujemy obydwa pliki do IDA Pro, celem stworzenia baz IDB, potrzebnych do porównania binarnego.

W tym miejscu warto napisać o dwóch rzeczach:

  1. Polecam pobierać symbole za pomocą PDBDownloader (bardzo ułatwia pracę!)
  2. Należy przygotować się na pracę bez symboli i z dużą ilością “śmieci” które będa zaciemniać obraz sytuacji

6. Skrót klawiszowy CTRL+6 wyzwoli uruchomienie okienka BinDiffa z którego wybieramy opcje: Diff Database i wskazujemy bazę IDA niepatchowanej binarki

7. Po około kilkunastu sekundach pojawią się wyniki analizy – najbardziej interesującą zakładką z perspektywy analizy jest Matched Functions (zaznaczona na pomarańczowo). Najszybszym podejściem jest rozpoczęcie pracy od dwóch pierwszych kolumn pokazujących stopień podobieństwa funkcji oraz prawdopodobieństwo z jakim BinDiff jest w stanie stwierdzić, że jest to odpowiednik tej samej funkcji z drugiego pliku.

W moim przypadku najwygodniejsze jest posortowanie funkcji względem kolumny confidence (zaznaczona na pomarańczowo) i wyszukanie funkcji z jak najwyższym współczynnikiem confidence i oczywiście jak najniższym similarity.

8. Aby podejrzeć poczynione zmiany należy kliknąć prawym przyciskiem myszy na interesującej pozycji i wybrać opcję View Flowgraphs (lub CTRL+E).

Legenda grafu: kolor zielony – pozycje niezmienione; kolor czerwony – pozycje usunięte; kolor szary – pozycje dodane

To by było na tyle szybkiego wprowadzenia do tematu 🙂

Dla zainteresowanych czytelników polecam prezentację “Microsoft Patch Analysis for Exploitation” Stephena Simsa (slajdy).

Leave a Reply

Your email address will not be published. Required fields are marked *